diff --git a/container/karaf/src/main/filtered-resources/etc/custom.properties b/container/karaf/src/main/filtered-resources/etc/custom.properties index b9c5f5636d72..3e057657f05b 100644 --- a/container/karaf/src/main/filtered-resources/etc/custom.properties +++ b/container/karaf/src/main/filtered-resources/etc/custom.properties @@ -64,7 +64,17 @@ org.osgi.framework.system.packages.extra=org.apache.karaf.branding,\ org.apache.commons.collections.list;version=${commonsCollectionsVersion},\ org.apache.commons.collections.map;version=${commonsCollectionsVersion},\ org.apache.commons.collections.set;version=${commonsCollectionsVersion},\ - org.apache.commons.io;version=${commonsIoVersion},\ + org.apache.commons.io;version="1.4.9999",\ + org.apache.commons.io.comparator;version="1.4.9999",\ + org.apache.commons.io.filefilter;version="1.4.9999",\ + org.apache.commons.io.input;version="1.4.9999",\ + org.apache.commons.io.output;version="1.4.9999",\ + org.apache.commons.io;version="2.4",\ + org.apache.commons.io.comparator;version="2.4",\ + org.apache.commons.io.filefilter;version="2.4",\ + org.apache.commons.io.input;version="2.4",\ + org.apache.commons.io.output;version="2.4",\ + org.apache.commons.io.monitor;version="2.4",\ org.apache.commons.lang;version=${commonsLangVersion},\ org.apache.commons.lang.builder;version=${commonsLangVersion},\ org.apache.commons.lang.enum;version=${commonsLangVersion},\ diff --git a/core/db/pom.xml b/core/db/pom.xml index 6fe8b9a62a1a..2af1e10cbae6 100644 --- a/core/db/pom.xml +++ b/core/db/pom.xml @@ -66,6 +66,11 @@ + + org.opennms.dependencies + atomikos-dependencies + pom + org.opennms.dependencies castor-dependencies @@ -75,6 +80,10 @@ org.opennms.core org.opennms.core.xml + + org.opennms + opennms-test + org.opennms opennms-util diff --git a/core/db/src/main/java/org/opennms/core/db/AtomikosDataSourceFactory.java b/core/db/src/main/java/org/opennms/core/db/AtomikosDataSourceFactory.java new file mode 100644 index 000000000000..6f1bd9c2156f --- /dev/null +++ b/core/db/src/main/java/org/opennms/core/db/AtomikosDataSourceFactory.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ + +package org.opennms.core.db; + +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.logging.Logger; + +import org.opennms.netmgt.config.opennmsDataSources.JdbcDataSource; + +import com.atomikos.jdbc.AtomikosDataSourceBean; + + +/** + + + + + + + + + +*/ + +public class AtomikosDataSourceFactory extends AtomikosDataSourceBean implements ClosableDataSource { + + private static final long serialVersionUID = -6411281260947841402L; + + public AtomikosDataSourceFactory(JdbcDataSource ds) { + this(); + } + + public AtomikosDataSourceFactory() { + super.setUniqueResourceName("opennms"); + super.setXaDataSource(XADataSourceFactory.getInstance()); + super.setPoolSize(30); + super.setTestQuery("SELECT 1"); + } + + // Uncomment when we require Java 7 + //@Override + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + throw new SQLFeatureNotSupportedException(); + } + + @Override + public T unwrap(Class iface) throws SQLException { + throw new SQLException(); + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return false; + } + + @Override + public void setIdleTimeout(int idleTimeout) { + super.setMaxIdleTime(idleTimeout); + } + + @Override + public void setMinPool(int minPool) { + super.setMinPoolSize(minPool); + } + + @Override + public void setMaxPool(int maxPool) { + super.setMaxPoolSize(maxPool); + } + + @Override + public void setMaxSize(int maxSize) { + super.setMaxPoolSize(maxSize); + } +} diff --git a/core/db/src/main/java/org/opennms/core/db/BaseConnectionFactory.java b/core/db/src/main/java/org/opennms/core/db/BaseConnectionFactory.java index c6e7b951daaa..92246122c05e 100644 --- a/core/db/src/main/java/org/opennms/core/db/BaseConnectionFactory.java +++ b/core/db/src/main/java/org/opennms/core/db/BaseConnectionFactory.java @@ -29,14 +29,11 @@ package org.opennms.core.db; import java.beans.PropertyVetoException; -import java.io.FileInputStream; -import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; import javax.sql.DataSource; -import org.apache.commons.io.IOUtils; import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.ValidationException; import org.opennms.netmgt.config.opennmsDataSources.JdbcDataSource; @@ -57,37 +54,10 @@ public abstract class BaseConnectionFactory implements ClosableDataSource { * @throws java.beans.PropertyVetoException if any. * @throws java.sql.SQLException if any. */ - protected BaseConnectionFactory(final InputStream stream, final String dsName) throws MarshalException, ValidationException, PropertyVetoException, SQLException { - LOG.info("Setting up data source {} from input stream.", dsName); - final JdbcDataSource ds = ConnectionFactoryUtil.marshalDataSourceFromConfig(stream, dsName); + protected BaseConnectionFactory(final JdbcDataSource ds) throws MarshalException, ValidationException, PropertyVetoException, SQLException { initializePool(ds); } - /** - * @param configFile A configuration file name. - * @param dsName The data source's name. - * @throws java.io.IOException if any. - * @throws org.exolab.castor.xml.MarshalException if any. - * @throws org.exolab.castor.xml.ValidationException if any. - * @throws java.beans.PropertyVetoException if any. - * @throws java.sql.SQLException if any. - */ - protected BaseConnectionFactory(final String configFile, final String dsName) throws IOException, MarshalException, ValidationException, PropertyVetoException, SQLException { - /* - * Set the system identifier for the source of the input stream. - * This is necessary so that any location information can - * positively identify the source of the error. - */ - final FileInputStream fileInputStream = new FileInputStream(configFile); - LOG.info("Setting up data sources from {}.", configFile); - try { - final JdbcDataSource ds = ConnectionFactoryUtil.marshalDataSourceFromConfig(fileInputStream, dsName); - initializePool(ds); - } finally { - IOUtils.closeQuietly(fileInputStream); - } - } - protected abstract void initializePool(final JdbcDataSource ds) throws SQLException; /** @@ -140,7 +110,7 @@ protected BaseConnectionFactory(final String configFile, final String dsName) th * @throws java.sql.SQLException if any. */ @Override - public void close() throws SQLException { + public void close() { } /** diff --git a/core/db/src/main/java/org/opennms/core/db/C3P0ConnectionFactory.java b/core/db/src/main/java/org/opennms/core/db/C3P0ConnectionFactory.java deleted file mode 100644 index 240a3b99d374..000000000000 --- a/core/db/src/main/java/org/opennms/core/db/C3P0ConnectionFactory.java +++ /dev/null @@ -1,177 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.core.db; - -import java.beans.PropertyVetoException; -import java.io.IOException; -import java.io.InputStream; -import java.io.PrintWriter; -import java.sql.Connection; -import java.sql.SQLException; -import java.sql.SQLFeatureNotSupportedException; -import java.util.Properties; - -import javax.sql.DataSource; - -import org.exolab.castor.xml.MarshalException; -import org.exolab.castor.xml.ValidationException; -import org.opennms.netmgt.config.opennmsDataSources.JdbcDataSource; -import org.opennms.netmgt.config.opennmsDataSources.Param; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.mchange.v2.c3p0.ComboPooledDataSource; - -/** - *

C3P0ConnectionFactory class.

- */ -public class C3P0ConnectionFactory extends BaseConnectionFactory { - - public static final Logger LOG = LoggerFactory.getLogger(C3P0ConnectionFactory.class); - - private ComboPooledDataSource m_pool; - - public C3P0ConnectionFactory(final InputStream stream, final String dsName) throws MarshalException, ValidationException, PropertyVetoException, SQLException { - super(stream, dsName); - } - - public C3P0ConnectionFactory(final String configFile, final String dsName) throws IOException, MarshalException, ValidationException, PropertyVetoException, SQLException { - super(configFile, dsName); - } - - @Override - protected void initializePool(final JdbcDataSource dataSource) throws SQLException { - m_pool = new ComboPooledDataSource(); - m_pool.setPassword(dataSource.getPassword()); - m_pool.setUser(dataSource.getUserName()); - m_pool.setJdbcUrl(dataSource.getUrl()); - try { - m_pool.setDriverClass(dataSource.getClassName()); - } catch (final PropertyVetoException e) { - throw new SQLException("Unable to set driver class.", e); - } - - final Properties properties = new Properties(); - for (final Param parameter : dataSource.getParamCollection()) { - properties.put(parameter.getName(), parameter.getValue()); - } - if (!properties.isEmpty()) { - m_pool.setProperties(properties); - } - } - - @Override - public Connection getConnection() throws SQLException { - return m_pool.getConnection(); - } - - @Override - public String getUrl() { - return m_pool.getJdbcUrl(); - } - - @Override - public void setUrl(final String url) { - validateJdbcUrl(url); - m_pool.setJdbcUrl(url); - } - - @Override - public String getUser() { - return m_pool.getUser(); - } - - @Override - public void setUser(final String user) { - m_pool.setUser(user); - } - - @Override - public DataSource getDataSource() { - return m_pool; - } - - @Override - public Connection getConnection(final String username, final String password) throws SQLException { - return m_pool.getConnection(username, password); - } - - @Override - public PrintWriter getLogWriter() throws SQLException { - return m_pool.getLogWriter(); - } - - @Override - public void setLogWriter(PrintWriter out) throws SQLException { - m_pool.setLogWriter(out); - } - - @Override - public void setLoginTimeout(int seconds) throws SQLException { - m_pool.setLoginTimeout(seconds); - } - - @Override - public int getLoginTimeout() throws SQLException { - return m_pool.getLoginTimeout(); - } - - /** {@inheritDoc} */ - public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException { - throw new SQLFeatureNotSupportedException("getParentLogger not supported"); - } - - @Override - public void close() throws SQLException { - super.close(); - LOG.info("Closing C3P0 pool."); - m_pool.close(); - } - - @Override - public void setIdleTimeout(final int idleTimeout) { - m_pool.setMaxIdleTime(idleTimeout); - } - - @Override - public void setMinPool(final int minPool) { - LOG.debug("Because of a bug in C3P0, minPool should equal maxPool. Ignoring."); - } - - @Override - public void setMaxPool(final int maxPool) { - m_pool.setMinPoolSize(maxPool); - m_pool.setMaxPoolSize(maxPool); - } - - @Override - public void setMaxSize(final int maxSize) { - LOG.debug("C3P0 has no equivalent to setMaxSize. Ignoring."); - } -} diff --git a/core/db/src/main/java/org/opennms/core/db/ClosableDataSource.java b/core/db/src/main/java/org/opennms/core/db/ClosableDataSource.java index 86823f3f3336..fb9c2d5a61bd 100644 --- a/core/db/src/main/java/org/opennms/core/db/ClosableDataSource.java +++ b/core/db/src/main/java/org/opennms/core/db/ClosableDataSource.java @@ -28,6 +28,7 @@ package org.opennms.core.db; +import java.io.Closeable; import java.sql.SQLException; import javax.sql.DataSource; @@ -35,14 +36,13 @@ /** *

ClosableDataSource interface.

*/ -public interface ClosableDataSource extends DataSource { +public interface ClosableDataSource extends DataSource, Closeable { /** * Close the datasource, if necessary. - * - * @throws java.sql.SQLException if any. */ - void close() throws SQLException; + @Override + void close(); /** * How long, in seconds, an idle connection is kept in the pool before it is removed. diff --git a/core/db/src/main/java/org/opennms/core/db/ConnectionFactoryUtil.java b/core/db/src/main/java/org/opennms/core/db/ConnectionFactoryUtil.java deleted file mode 100644 index 2359db776d16..000000000000 --- a/core/db/src/main/java/org/opennms/core/db/ConnectionFactoryUtil.java +++ /dev/null @@ -1,65 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.core.db; - -import java.io.InputStream; - -import org.exolab.castor.xml.MarshalException; -import org.exolab.castor.xml.ValidationException; -import org.opennms.core.xml.CastorUtils; -import org.opennms.netmgt.config.opennmsDataSources.DataSourceConfiguration; -import org.opennms.netmgt.config.opennmsDataSources.JdbcDataSource; - -public class ConnectionFactoryUtil { - - /** - *

marshalDataSourceFromConfig

- * - * @param stream a {@link java.io.InputStream} object. - * @param dsName a {@link java.lang.String} object. - * @return a {@link org.opennms.netmgt.config.opennmsDataSources.JdbcDataSource} object. - * @throws org.exolab.castor.xml.MarshalException if any. - * @throws org.exolab.castor.xml.ValidationException if any. - */ - public static JdbcDataSource marshalDataSourceFromConfig(final InputStream stream, final String dsName) throws MarshalException, ValidationException { - final DataSourceConfiguration dsc = CastorUtils.unmarshal(DataSourceConfiguration.class, stream); - return validateDataSourceConfiguration(dsName, dsc); - } - - private static JdbcDataSource validateDataSourceConfiguration(final String dsName, final DataSourceConfiguration dsc) { - for (final JdbcDataSource jdbcDs : dsc.getJdbcDataSourceCollection()) { - if (jdbcDs.getName().equals(dsName)) { - return jdbcDs; - } - } - - throw new IllegalArgumentException("ConnectionFactoryUtil: DataSource: "+dsName+" is not defined."); - } - -} diff --git a/core/db/src/main/java/org/opennms/core/db/DataSourceConfigurationFactory.java b/core/db/src/main/java/org/opennms/core/db/DataSourceConfigurationFactory.java new file mode 100644 index 000000000000..6f5a907aea3e --- /dev/null +++ b/core/db/src/main/java/org/opennms/core/db/DataSourceConfigurationFactory.java @@ -0,0 +1,101 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ + +package org.opennms.core.db; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; + +import org.apache.commons.io.IOUtils; +import org.exolab.castor.xml.MarshalException; +import org.exolab.castor.xml.ValidationException; +import org.opennms.core.xml.CastorUtils; +import org.opennms.netmgt.config.opennmsDataSources.ConnectionPool; +import org.opennms.netmgt.config.opennmsDataSources.DataSourceConfiguration; +import org.opennms.netmgt.config.opennmsDataSources.JdbcDataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + *

+ * This is the class used to load the OpenNMS database configuration + * from the opennms-datasources.xml.

+ * + * @author Brian Weaver + */ +public final class DataSourceConfigurationFactory { + + private static final Logger LOG = LoggerFactory.getLogger(DataSourceConfigurationFactory.class); + + private final DataSourceConfiguration m_dsc; + + public DataSourceConfigurationFactory(File fileName) { + InputStream is = null; + try { + is = new FileInputStream(fileName); + m_dsc = CastorUtils.unmarshal(DataSourceConfiguration.class, is); + } catch (MarshalException e) { + throw new IllegalArgumentException("Could not unmarshal " + DataSourceConfiguration.class.getName(), e); + } catch (ValidationException e) { + throw new IllegalArgumentException("Could not unmarshal " + DataSourceConfiguration.class.getName(), e); + } catch (FileNotFoundException e) { + throw new IllegalArgumentException("Could not unmarshal " + DataSourceConfiguration.class.getName(), e); + } finally { + IOUtils.closeQuietly(is); + } + } + + public DataSourceConfigurationFactory(String fileName) { + this(new File(fileName)); + } + + public DataSourceConfigurationFactory(InputStream fileInputStream) { + try { + m_dsc = CastorUtils.unmarshal(DataSourceConfiguration.class, fileInputStream); + } catch (MarshalException e) { + throw new IllegalArgumentException("Could not unmarshal " + DataSourceConfiguration.class.getName(), e); + } catch (ValidationException e) { + throw new IllegalArgumentException("Could not unmarshal " + DataSourceConfiguration.class.getName(), e); + } + } + + public ConnectionPool getConnectionPool() { + return m_dsc.getConnectionPool(); + } + + public JdbcDataSource getJdbcDataSource(String name) { + for (JdbcDataSource ds : m_dsc.getJdbcDataSource()) { + if (ds.getName().equals(name)) { + return ds; + } + } + return null; + } +} diff --git a/core/db/src/main/java/org/opennms/core/db/DataSourceFactory.java b/core/db/src/main/java/org/opennms/core/db/DataSourceFactory.java index ac34857b4a53..76d485251084 100644 --- a/core/db/src/main/java/org/opennms/core/db/DataSourceFactory.java +++ b/core/db/src/main/java/org/opennms/core/db/DataSourceFactory.java @@ -29,14 +29,9 @@ package org.opennms.core.db; import java.beans.PropertyVetoException; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.PrintWriter; import java.lang.reflect.Constructor; -import java.sql.Connection; import java.sql.SQLException; -import java.sql.SQLFeatureNotSupportedException; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -44,16 +39,13 @@ import javax.sql.DataSource; -import org.apache.commons.io.IOUtils; import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.ValidationException; import org.opennms.core.utils.ConfigFileConstants; -import org.opennms.core.xml.CastorUtils; import org.opennms.netmgt.config.opennmsDataSources.ConnectionPool; -import org.opennms.netmgt.config.opennmsDataSources.DataSourceConfiguration; +import org.opennms.netmgt.config.opennmsDataSources.JdbcDataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy; /** *

@@ -70,123 +62,107 @@ * * @author Brian Weaver */ -public final class DataSourceFactory implements DataSource { - +public abstract class DataSourceFactory { + private static final Logger LOG = LoggerFactory.getLogger(DataSourceFactory.class); - - private static final Class DEFAULT_FACTORY_CLASS = C3P0ConnectionFactory.class; - /** - * The singleton instance of this factory - */ - private static DataSource m_singleton = null; + private static final Class DEFAULT_FACTORY_CLASS = AtomikosDataSourceFactory.class; + private static DataSourceConfigurationFactory m_dataSourceConfigFactory; + private static final Map m_dataSources = new ConcurrentHashMap(); private static final List m_closers = new LinkedList(); + private static ClosableDataSource parseDataSource(final String dsName) { + String factoryClass = null; + + ConnectionPool connectionPool = m_dataSourceConfigFactory.getConnectionPool(); + factoryClass = connectionPool.getFactory(); + + ClosableDataSource dataSource = null; + final String defaultClassName = DEFAULT_FACTORY_CLASS.getName(); + try { + final Class clazz = Class.forName(factoryClass); + final Constructor constructor = clazz.getConstructor(new Class[] { JdbcDataSource.class }); + dataSource = (ClosableDataSource)constructor.newInstance(new Object[] { m_dataSourceConfigFactory.getJdbcDataSource(dsName) }); + } catch (final Throwable t) { + LOG.debug("Unable to load {}, falling back to the default dataSource ({})", factoryClass, defaultClassName, t); + try { + final Constructor constructor = ((Class) DEFAULT_FACTORY_CLASS).getConstructor(new Class[] { JdbcDataSource.class }); + dataSource = (ClosableDataSource)constructor.newInstance(new Object[] { m_dataSourceConfigFactory.getJdbcDataSource(dsName) }); + } catch (final Throwable cause) { + LOG.error("Unable to load {}.", DEFAULT_FACTORY_CLASS.getName(), cause); + throw new IllegalArgumentException("Unable to load " + defaultClassName + ".", cause); + } + } + + if (connectionPool != null) { + dataSource.setIdleTimeout(connectionPool.getIdleTimeout()); + try { + dataSource.setLoginTimeout(connectionPool.getLoginTimeout()); + } catch (SQLException e) { + LOG.warn("Exception thrown while trying to set login timeout on datasource", e); + } + dataSource.setMinPool(connectionPool.getMinPool()); + dataSource.setMaxPool(connectionPool.getMaxPool()); + dataSource.setMaxSize(connectionPool.getMaxSize()); + } + + return dataSource; + } + /** - * Load the config from the default config file and create the singleton - * instance of this factory. - * - * @exception java.io.IOException - * Thrown if the specified config file cannot be read - * @exception org.exolab.castor.xml.MarshalException - * Thrown if the file does not conform to the schema. - * @exception org.exolab.castor.xml.ValidationException - * Thrown if the contents do not match the required schema. - * @throws java.sql.SQLException if any. - * @throws java.beans.PropertyVetoException if any. - * @throws java.io.IOException if any. - * @throws org.exolab.castor.xml.MarshalException if any. - * @throws org.exolab.castor.xml.ValidationException if any. - * @throws java.lang.ClassNotFoundException if any. + * @deprecated This function is no longer necessary for DataSourceFactory initialization + * + * @throws IOException + * @throws MarshalException + * @throws ValidationException + * @throws ClassNotFoundException + * @throws PropertyVetoException + * @throws SQLException */ public static synchronized void init() throws IOException, MarshalException, ValidationException, ClassNotFoundException, PropertyVetoException, SQLException { - if (!isLoaded("opennms")) { - init("opennms"); - } } /** *

init

* * @param dsName a {@link java.lang.String} object. - * @throws java.io.IOException if any. - * @throws org.exolab.castor.xml.MarshalException if any. - * @throws org.exolab.castor.xml.ValidationException if any. - * @throws java.lang.ClassNotFoundException if any. - * @throws java.beans.PropertyVetoException if any. - * @throws java.sql.SQLException if any. */ - public static synchronized void init(final String dsName) throws IOException, MarshalException, ValidationException, ClassNotFoundException, PropertyVetoException, SQLException { + public static synchronized void init(final String dsName) { if (isLoaded(dsName)) { - // init already called - return - // to reload, reload() will need to be called + // init already called, return return; } - String factoryClass = null; - final File cfgFile = ConfigFileConstants.getFile(ConfigFileConstants.OPENNMS_DATASOURCE_CONFIG_FILE_NAME); - DataSourceConfiguration dsc = null; - ConnectionPool connectionPool = null; - FileInputStream fileInputStream = null; - try { - fileInputStream = new FileInputStream(cfgFile); - dsc = CastorUtils.unmarshal(DataSourceConfiguration.class, fileInputStream); - connectionPool = dsc.getConnectionPool(); - if (connectionPool != null) { - factoryClass = connectionPool.getFactory(); - } - } finally { - IOUtils.closeQuietly(fileInputStream); - } + // If a data source configuration factory wasn't set, try to load the default settings + if (m_dataSourceConfigFactory == null) { + try { + m_dataSourceConfigFactory = new DataSourceConfigurationFactory(ConfigFileConstants.getFile(ConfigFileConstants.OPENNMS_DATASOURCE_CONFIG_FILE_NAME)); + } catch (IOException e) { + LOG.warn("Could not parse default data source configuration", e); + m_dataSourceConfigFactory = null; + } + } - final String configPath = cfgFile.getPath(); - ClosableDataSource dataSource = null; - final String defaultClassName = DEFAULT_FACTORY_CLASS.getName(); - try { - final Class clazz = Class.forName(factoryClass); - final Constructor constructor = clazz.getConstructor(new Class[] { String.class, String.class }); - dataSource = (ClosableDataSource)constructor.newInstance(new Object[] { configPath, dsName }); - } catch (final Throwable t) { - LOG.debug("Unable to load {}, falling back to the default dataSource ({})", factoryClass, defaultClassName, t); - try { - final Constructor constructor = ((Class) DEFAULT_FACTORY_CLASS).getConstructor(new Class[] { String.class, String.class }); - dataSource = (ClosableDataSource)constructor.newInstance(new Object[] { configPath, dsName }); - } catch (final Throwable cause) { - LOG.error("Unable to load {}.", DEFAULT_FACTORY_CLASS.getName(), cause); - throw new SQLException("Unable to load " + defaultClassName + ".", cause); - } - } + final ClosableDataSource dataSource = parseDataSource(dsName); - final ClosableDataSource runnableDs = dataSource; m_closers.add(new Runnable() { @Override public void run() { try { - runnableDs.close(); + dataSource.close(); } catch (final Throwable cause) { LOG.info("Unable to close datasource {}.", dsName, cause); } } }); - - if (connectionPool != null) { - dataSource.setIdleTimeout(connectionPool.getIdleTimeout()); - dataSource.setLoginTimeout(connectionPool.getLoginTimeout()); - dataSource.setMinPool(connectionPool.getMinPool()); - dataSource.setMaxPool(connectionPool.getMaxPool()); - dataSource.setMaxSize(connectionPool.getMaxSize()); - } - // Springframework provided proxies that make working with transactions much easier - final LazyConnectionDataSourceProxy lazyProxy = new LazyConnectionDataSourceProxy(dataSource); - - setInstance(dsName, lazyProxy); + setInstance(dsName, dataSource); } - private static synchronized boolean isLoaded(final String dsName) { + private static boolean isLoaded(final String dsName) { return m_dataSources.containsKey(dsName); } @@ -214,60 +190,27 @@ public static DataSource getInstance() { * @return a {@link javax.sql.DataSource} object. */ public static DataSource getInstance(final String name) { - final DataSource dataSource = getDataSource(name); - if (dataSource == null) { - throw new IllegalArgumentException("Unable to locate data source named " + name + ". Does this need to be init'd?"); - } else { - return dataSource; - } - } - - /** - * Return a new database connection to the database configured in the - * opennms-database.xml. The database connection is not managed - * by the factory and must be release by the caller by using the - * close method. - * - * @return a new database connection to the database configured in the - * opennms-database.xml - * @throws java.sql.SQLException - * Thrown if there is an error opening the connection to the - * database. - */ - @Override - public Connection getConnection() throws SQLException { - return getConnection("opennms"); - } - - /** - *

getConnection

- * - * @param dsName a {@link java.lang.String} object. - * @return a {@link java.sql.Connection} object. - * @throws java.sql.SQLException if any. - */ - public Connection getConnection(final String dsName) throws SQLException { - return getDataSource(dsName).getConnection(); + init(name); + return getDataSource(name); } /** *

setInstance

* - * @param singleton a {@link javax.sql.DataSource} object. + * @param ds a {@link javax.sql.DataSource} object. */ - public static void setInstance(final DataSource singleton) { - m_singleton=singleton; - setInstance("opennms", singleton); + public static void setInstance(final DataSource ds) { + setInstance("opennms", ds); } /** *

setInstance

* * @param dsName a {@link java.lang.String} object. - * @param singleton a {@link javax.sql.DataSource} object. + * @param ds a {@link javax.sql.DataSource} object. */ - public static synchronized void setInstance(final String dsName, final DataSource singleton) { - m_dataSources.put(dsName,singleton); + public static synchronized void setInstance(final String dsName, final DataSource ds) { + m_dataSources.put(dsName, ds); } /** @@ -289,93 +232,12 @@ public static synchronized DataSource getDataSource(final String dsName) { return m_dataSources.get(dsName); } - /** {@inheritDoc} */ - @Override - public Connection getConnection(final String username, final String password) throws SQLException { - return getConnection(); - } - - /** - *

getLogWriter

- * - * @return a {@link java.io.PrintWriter} object. - * @throws java.sql.SQLException if any. - */ - @Override - public PrintWriter getLogWriter() throws SQLException { - return m_singleton.getLogWriter(); - } - - /** - *

getLogWriter

- * - * @param dsName a {@link java.lang.String} object. - * @return a {@link java.io.PrintWriter} object. - * @throws java.sql.SQLException if any. - */ - public PrintWriter getLogWriter(final String dsName) throws SQLException { - return getDataSource(dsName).getLogWriter(); - } - - /** {@inheritDoc} */ - @Override - public void setLogWriter(final PrintWriter out) throws SQLException { - setLogWriter("opennms", out); - } - - /** - *

setLogWriter

- * - * @param dsName a {@link java.lang.String} object. - * @param out a {@link java.io.PrintWriter} object. - * @throws java.sql.SQLException if any. - */ - public void setLogWriter(final String dsName, final PrintWriter out) throws SQLException { - getDataSource(dsName).setLogWriter(out); - } - - /** {@inheritDoc} */ - @Override - public void setLoginTimeout(final int seconds) throws SQLException { - setLoginTimeout("opennms", seconds); - } - - /** - *

setLoginTimeout

- * - * @param dsName a {@link java.lang.String} object. - * @param seconds a int. - * @throws java.sql.SQLException if any. - */ - public void setLoginTimeout(final String dsName, final int seconds) throws SQLException { - getDataSource(dsName).setLoginTimeout(seconds); - } - /** - *

getLoginTimeout

- * - * @return a int. - * @throws java.sql.SQLException if any. - */ - @Override - public int getLoginTimeout() throws SQLException { - return getLoginTimeout("opennms"); - } - - /** - *

getLoginTimeout

- * - * @param dsName a {@link java.lang.String} object. - * @return a int. - * @throws java.sql.SQLException if any. */ - public int getLoginTimeout(final String dsName) throws SQLException { - return getDataSource(dsName).getLoginTimeout(); - } - - /** {@inheritDoc} */ - public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException { - throw new SQLFeatureNotSupportedException("getParentLogger not supported"); + public static synchronized void setDataSourceConfigurationFactory(final DataSourceConfigurationFactory factory) { + // Close any existing datasources + close(); + m_dataSourceConfigFactory = factory; } /** @@ -383,7 +245,7 @@ public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedE * * @throws java.sql.SQLException if any. */ - public static synchronized void close() throws SQLException { + public static synchronized void close() { for(Runnable closer : m_closers) { closer.run(); @@ -391,31 +253,5 @@ public static synchronized void close() throws SQLException { m_closers.clear(); m_dataSources.clear(); - - } - - /** - *

unwrap

- * - * @param iface a {@link java.lang.Class} object. - * @param a T object. - * @return a T object. - * @throws java.sql.SQLException if any. - */ - @Override - public T unwrap(final Class iface) throws SQLException { - return null; //TODO - } - - /** - *

isWrapperFor

- * - * @param iface a {@link java.lang.Class} object. - * @return a boolean. - * @throws java.sql.SQLException if any. - */ - @Override - public boolean isWrapperFor(final Class iface) throws SQLException { - return false; //TODO } } diff --git a/core/db/src/main/java/org/opennms/core/db/DataSourceFactoryBean.java b/core/db/src/main/java/org/opennms/core/db/DataSourceFactoryBean.java index 81f761790938..b7e93139b879 100644 --- a/core/db/src/main/java/org/opennms/core/db/DataSourceFactoryBean.java +++ b/core/db/src/main/java/org/opennms/core/db/DataSourceFactoryBean.java @@ -83,7 +83,6 @@ public boolean isSingleton() { */ @Override public void afterPropertiesSet() throws Exception { - DataSourceFactory.init(); Vault.setDataSource(DataSourceFactory.getInstance()); // Fix for Bug 4117 } @@ -94,7 +93,7 @@ public void afterPropertiesSet() throws Exception { */ @Override public void destroy() throws Exception { - LOG.info("Closing DataSourceFactory!!!"); + LOG.info("Closing {}!!!", getClass().getSimpleName()); DataSourceFactory.close(); } diff --git a/core/db/src/main/java/org/opennms/core/db/XADataSourceFactory.java b/core/db/src/main/java/org/opennms/core/db/XADataSourceFactory.java index 664257b6aca0..f9c8c3d1d4af 100644 --- a/core/db/src/main/java/org/opennms/core/db/XADataSourceFactory.java +++ b/core/db/src/main/java/org/opennms/core/db/XADataSourceFactory.java @@ -28,23 +28,13 @@ package org.opennms.core.db; -import java.beans.PropertyVetoException; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.PrintWriter; -import java.net.URL; -import java.sql.SQLException; -import java.sql.SQLFeatureNotSupportedException; +import java.net.URI; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import javax.sql.XAConnection; import javax.sql.XADataSource; -import org.apache.commons.io.IOUtils; -import org.exolab.castor.xml.MarshalException; -import org.exolab.castor.xml.ValidationException; import org.opennms.core.utils.ConfigFileConstants; import org.opennms.netmgt.config.opennmsDataSources.JdbcDataSource; import org.postgresql.xa.PGXADataSource; @@ -66,73 +56,52 @@ * * @author Brian Weaver */ -public final class XADataSourceFactory implements XADataSource { +public abstract class XADataSourceFactory { private static final Logger LOG = LoggerFactory.getLogger(DataSourceFactory.class); - /** - * The singleton instance of this factory - */ - private static XADataSource m_singleton = null; - - private static final Map m_dataSources = new ConcurrentHashMap(); - - /** - * Load the config from the default config file and create the singleton - * instance of this factory. - * - * @exception java.io.IOException - * Thrown if the specified config file cannot be read - * @exception org.exolab.castor.xml.MarshalException - * Thrown if the file does not conform to the schema. - * @exception org.exolab.castor.xml.ValidationException - * Thrown if the contents do not match the required schema. - * @throws java.sql.SQLException if any. - * @throws java.beans.PropertyVetoException if any. - * @throws java.io.IOException if any. - * @throws org.exolab.castor.xml.MarshalException if any. - * @throws org.exolab.castor.xml.ValidationException if any. - * @throws java.lang.ClassNotFoundException if any. - */ - public static synchronized void init() throws IOException, MarshalException, ValidationException, ClassNotFoundException, PropertyVetoException, SQLException { - if (!isLoaded("opennms")) { - init("opennms"); + private static DataSourceConfigurationFactory m_dataSourceConfigFactory; + + static { + // Try to create a DataSourceConfigurationFactory from the default opennms-datasources.xml + try { + m_dataSourceConfigFactory = new DataSourceConfigurationFactory(ConfigFileConstants.getFile(ConfigFileConstants.OPENNMS_DATASOURCE_CONFIG_FILE_NAME)); + } catch (IOException e) { + LOG.warn("Could not parse default data source configuration", e); + m_dataSourceConfigFactory = null; } } + private static final Map m_dataSources = new ConcurrentHashMap(); + /** *

init

* * @param dsName a {@link java.lang.String} object. - * @throws java.io.IOException if any. - * @throws org.exolab.castor.xml.MarshalException if any. - * @throws org.exolab.castor.xml.ValidationException if any. - * @throws java.lang.ClassNotFoundException if any. - * @throws java.beans.PropertyVetoException if any. - * @throws java.sql.SQLException if any. */ - public static synchronized void init(final String dsName) throws IOException, MarshalException, ValidationException, ClassNotFoundException, PropertyVetoException, SQLException { + public static synchronized void init(final String dsName) { if (isLoaded(dsName)) { - // init already called - return - // to reload, reload() will need to be called + // init already called, return return; } - final File cfgFile = ConfigFileConstants.getFile(ConfigFileConstants.OPENNMS_DATASOURCE_CONFIG_FILE_NAME); - FileInputStream fileInputStream = null; - try { - fileInputStream = new FileInputStream(cfgFile); - final JdbcDataSource ds = ConnectionFactoryUtil.marshalDataSourceFromConfig(fileInputStream, dsName); + final JdbcDataSource ds = m_dataSourceConfigFactory.getJdbcDataSource(dsName); + String urlString = ds.getUrl(); + if (urlString.startsWith("jdbc:")) { + urlString = urlString.substring("jdbc:".length()); + } + URI url = URI.create(urlString); + // TODO: Add support for more XADataSources (hsqldb, derby) + if ("postgresql".equalsIgnoreCase(url.getScheme())) { PGXADataSource xaDataSource = new PGXADataSource(); - URL url = new URL(ds.getUrl()); xaDataSource.setServerName(url.getHost()); xaDataSource.setPortNumber(url.getPort()); xaDataSource.setDatabaseName(ds.getDatabaseName()); xaDataSource.setUser(ds.getUserName()); xaDataSource.setPassword(ds.getPassword()); - setInstance(xaDataSource); - } finally { - IOUtils.closeQuietly(fileInputStream); + setInstance(dsName, xaDataSource); + } else { + throw new UnsupportedOperationException("Data source scheme not supported: " + url.getScheme()); } } @@ -172,42 +141,13 @@ public static XADataSource getInstance(final String name) { } } - /** - * Return a new database connection to the database configured in the - * opennms-database.xml. The database connection is not managed - * by the factory and must be release by the caller by using the - * close method. - * - * @return a new database connection to the database configured in the - * opennms-database.xml - * @throws java.sql.SQLException - * Thrown if there is an error opening the connection to the - * database. - */ - @Override - public XAConnection getXAConnection() throws SQLException { - return getXAConnection("opennms"); - } - - /** - *

getConnection

- * - * @param dsName a {@link java.lang.String} object. - * @return a {@link java.sql.Connection} object. - * @throws java.sql.SQLException if any. - */ - public XAConnection getXAConnection(final String dsName) throws SQLException { - return getXADataSource(dsName).getXAConnection(); - } - /** *

setInstance

* - * @param singleton a {@link javax.sql.DataSource} object. + * @param ds a {@link javax.sql.DataSource} object. */ - public static void setInstance(final XADataSource singleton) { - m_singleton=singleton; - setInstance("opennms", singleton); + public static void setInstance(final XADataSource ds) { + setInstance("opennms", ds); } /** @@ -217,7 +157,7 @@ public static void setInstance(final XADataSource singleton) { * @param singleton a {@link javax.sql.DataSource} object. */ public static synchronized void setInstance(final String dsName, final XADataSource singleton) { - m_dataSources.put(dsName,singleton); + m_dataSources.put(dsName, singleton); } /** @@ -236,103 +176,23 @@ public static XADataSource getXADataSource() { * @return a {@link javax.sql.DataSource} object. */ public static synchronized XADataSource getXADataSource(final String dsName) { + init(dsName); return m_dataSources.get(dsName); } - /** {@inheritDoc} */ - @Override - public XAConnection getXAConnection(final String username, final String password) throws SQLException { - return getXAConnection(); - } - - /** - *

getLogWriter

- * - * @return a {@link java.io.PrintWriter} object. - * @throws java.sql.SQLException if any. - */ - @Override - public PrintWriter getLogWriter() throws SQLException { - return m_singleton.getLogWriter(); - } - - /** - *

getLogWriter

- * - * @param dsName a {@link java.lang.String} object. - * @return a {@link java.io.PrintWriter} object. - * @throws java.sql.SQLException if any. - */ - public PrintWriter getLogWriter(final String dsName) throws SQLException { - return getXADataSource(dsName).getLogWriter(); - } - - /** {@inheritDoc} */ - @Override - public void setLogWriter(final PrintWriter out) throws SQLException { - setLogWriter("opennms", out); - } - - /** - *

setLogWriter

- * - * @param dsName a {@link java.lang.String} object. - * @param out a {@link java.io.PrintWriter} object. - * @throws java.sql.SQLException if any. - */ - public void setLogWriter(final String dsName, final PrintWriter out) throws SQLException { - getXADataSource(dsName).setLogWriter(out); - } - - /** {@inheritDoc} */ - @Override - public void setLoginTimeout(final int seconds) throws SQLException { - setLoginTimeout("opennms", seconds); - } - - /** - *

setLoginTimeout

- * - * @param dsName a {@link java.lang.String} object. - * @param seconds a int. - * @throws java.sql.SQLException if any. - */ - public void setLoginTimeout(final String dsName, final int seconds) throws SQLException { - getXADataSource(dsName).setLoginTimeout(seconds); - } - - /** - *

getLoginTimeout

- * - * @return a int. - * @throws java.sql.SQLException if any. - */ - @Override - public int getLoginTimeout() throws SQLException { - return getLoginTimeout("opennms"); - } - - /** - *

getLoginTimeout

- * - * @param dsName a {@link java.lang.String} object. - * @return a int. - * @throws java.sql.SQLException if any. - */ - public int getLoginTimeout(final String dsName) throws SQLException { - return getXADataSource(dsName).getLoginTimeout(); - } - - /** {@inheritDoc} */ - public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException { - throw new SQLFeatureNotSupportedException("getParentLogger not supported"); - } + /** + */ + public static synchronized void setDataSourceConfigurationFactory(final DataSourceConfigurationFactory factory) { + // Close any existing datasources + close(); + m_dataSourceConfigFactory = factory; + } /** *

close

* * @throws java.sql.SQLException if any. */ - public static synchronized void close() throws SQLException { + public static synchronized void close() { } } diff --git a/core/db/src/main/java/org/opennms/core/db/XADataSourceFactoryBean.java b/core/db/src/main/java/org/opennms/core/db/XADataSourceFactoryBean.java index fe378e2c8b26..04ccc04f944d 100644 --- a/core/db/src/main/java/org/opennms/core/db/XADataSourceFactoryBean.java +++ b/core/db/src/main/java/org/opennms/core/db/XADataSourceFactoryBean.java @@ -40,7 +40,7 @@ /** *

XADataSourceFactoryBean class.

*/ -public class XADataSourceFactoryBean implements FactoryBean, InitializingBean, DisposableBean { +public class XADataSourceFactoryBean implements FactoryBean, DisposableBean { private static final Logger LOG = LoggerFactory.getLogger(XADataSourceFactoryBean.class); @@ -75,16 +75,6 @@ public boolean isSingleton() { return true; } - /** - *

afterPropertiesSet

- * - * @throws java.lang.Exception if any. - */ - @Override - public void afterPropertiesSet() throws Exception { - XADataSourceFactory.init(); - } - /** *

destroy

* @@ -92,7 +82,7 @@ public void afterPropertiesSet() throws Exception { */ @Override public void destroy() throws Exception { - LOG.info("Closing DataSourceFactory!!!"); + LOG.info("Closing {}!!!", getClass().getSimpleName()); XADataSourceFactory.close(); } diff --git a/core/db/src/test/java/org/opennms/core/db/C3P0ConnectionFactoryTest.java b/core/db/src/test/java/org/opennms/core/db/ConnectionFactoryTest.java similarity index 71% rename from core/db/src/test/java/org/opennms/core/db/C3P0ConnectionFactoryTest.java rename to core/db/src/test/java/org/opennms/core/db/ConnectionFactoryTest.java index d202040bae47..2cab7ec1ce29 100644 --- a/core/db/src/test/java/org/opennms/core/db/C3P0ConnectionFactoryTest.java +++ b/core/db/src/test/java/org/opennms/core/db/ConnectionFactoryTest.java @@ -29,6 +29,7 @@ package org.opennms.core.db; import java.beans.PropertyVetoException; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; @@ -40,16 +41,21 @@ import org.apache.commons.io.IOUtils; import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.ValidationException; +import org.opennms.core.test.ConfigurationTestUtils; import org.opennms.core.utils.ConfigFileConstants; +import org.opennms.test.DaoTestConfigBean; /** * * @author David Hustace */ -public class C3P0ConnectionFactoryTest extends TestCase { +public class ConnectionFactoryTest extends TestCase { public void testMarshalDataSourceFromConfig() throws Exception { - C3P0ConnectionFactory factory1 = null; - C3P0ConnectionFactory factory2 = null; + DaoTestConfigBean bean = new DaoTestConfigBean(); + bean.afterPropertiesSet(); + + AtomikosDataSourceFactory factory1 = null; + AtomikosDataSourceFactory factory2 = null; try { factory1 = makeFactory("opennms"); @@ -114,12 +120,16 @@ public void testMarshalDataSourceFromConfig() throws Exception { } } - private C3P0ConnectionFactory makeFactory(String database) throws MarshalException, ValidationException, PropertyVetoException, SQLException, IOException { - InputStream stream = this.getClass().getResourceAsStream(ConfigFileConstants.getFileName(ConfigFileConstants.OPENNMS_DATASOURCE_CONFIG_FILE_NAME)); + private AtomikosDataSourceFactory makeFactory(String database) throws MarshalException, ValidationException, PropertyVetoException, SQLException, IOException, ClassNotFoundException { + InputStream stream1 = new ByteArrayInputStream(ConfigurationTestUtils.getConfigForResourceWithReplacements(this, ConfigFileConstants.getFileName(ConfigFileConstants.OPENNMS_DATASOURCE_CONFIG_FILE_NAME)).getBytes()); + DataSourceFactory.setDataSourceConfigurationFactory(new DataSourceConfigurationFactory(stream1)); + InputStream stream2 = new ByteArrayInputStream(ConfigurationTestUtils.getConfigForResourceWithReplacements(this, ConfigFileConstants.getFileName(ConfigFileConstants.OPENNMS_DATASOURCE_CONFIG_FILE_NAME)).getBytes()); + XADataSourceFactory.setDataSourceConfigurationFactory(new DataSourceConfigurationFactory(stream2)); try { - return new C3P0ConnectionFactory(stream, database); + return new AtomikosDataSourceFactory(); } finally { - IOUtils.closeQuietly(stream); + IOUtils.closeQuietly(stream1); + IOUtils.closeQuietly(stream2); } } } diff --git a/core/lib/pom.xml b/core/lib/pom.xml index 83f60049eda8..61df39733e59 100644 --- a/core/lib/pom.xml +++ b/core/lib/pom.xml @@ -28,10 +28,6 @@ - - commons-io - commons-io - org.opennms.dependencies spring-dependencies diff --git a/core/lib/src/main/java/org/opennms/core/utils/ExecRunner.java b/core/lib/src/main/java/org/opennms/core/utils/ExecRunner.java index 4b199a8b52e1..c91db3227fa5 100644 --- a/core/lib/src/main/java/org/opennms/core/utils/ExecRunner.java +++ b/core/lib/src/main/java/org/opennms/core/utils/ExecRunner.java @@ -30,6 +30,7 @@ *******************************************************************************/ package org.opennms.core.utils; +import java.io.Closeable; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; @@ -39,7 +40,8 @@ import java.util.Date; import java.util.StringTokenizer; -import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** *

@@ -57,6 +59,7 @@ * @author Scott McCrory . */ public class ExecRunner { + private static final Logger LOG = LoggerFactory.getLogger(ExecRunner.class); /** Win NT/2K/MEPro require cmd.exe to run programs * */ private static final String WINDOWS_NT_2000_COMMAND_1 = "cmd.exe"; @@ -184,10 +187,10 @@ public int exec(final String command) throws IOException, InterruptedException { return rc; } finally { - IOUtils.closeQuietly(pwErr); - IOUtils.closeQuietly(swErr); - IOUtils.closeQuietly(pwOut); - IOUtils.closeQuietly(swOut); + closeQuietly(pwErr); + closeQuietly(swErr); + closeQuietly(pwOut); + closeQuietly(swOut); } } @@ -217,8 +220,8 @@ public int exec(final String command, final OutputStream stdoutStream, final Out return exec(command, pwOut, pwErr); } finally { - IOUtils.closeQuietly(pwErr); - IOUtils.closeQuietly(pwOut); + closeQuietly(pwErr); + closeQuietly(pwOut); } } @@ -459,4 +462,14 @@ private final void writeObject(final ObjectOutputStream out) throws IOException } + private void closeQuietly(final Closeable c) { + if (c != null) { + try { + c.close(); + } catch (final IOException closeE) { + LOG.debug("failed to close", closeE); + } + } + } + } diff --git a/core/lib/src/main/java/org/opennms/core/utils/StreamGobbler.java b/core/lib/src/main/java/org/opennms/core/utils/StreamGobbler.java index 3490b1ffd63b..eaeeafe91293 100644 --- a/core/lib/src/main/java/org/opennms/core/utils/StreamGobbler.java +++ b/core/lib/src/main/java/org/opennms/core/utils/StreamGobbler.java @@ -31,6 +31,7 @@ package org.opennms.core.utils; import java.io.BufferedReader; +import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -39,7 +40,6 @@ import java.io.OutputStream; import java.io.PrintWriter; -import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -186,8 +186,8 @@ public void run() { } catch (final Throwable e) { LOG.debug("Unable to read lines.", e); } finally { - IOUtils.closeQuietly(br); - IOUtils.closeQuietly(isr); + closeQuietly(br); + closeQuietly(isr); } } @@ -205,4 +205,14 @@ private final void writeObject(final ObjectOutputStream out) throws IOException throw new IOException("Object cannot be serialized"); } + private void closeQuietly(final Closeable c) { + if (c != null) { + try { + c.close(); + } catch (final IOException closeE) { + LOG.debug("failed to close", closeE); + } + } + } + } diff --git a/core/pom.xml b/core/pom.xml index 3c88f4973f82..7fe6c3eca2b0 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -38,6 +38,7 @@ soa tasks test-api + upgrade xml diff --git a/core/test-api/db/pom.xml b/core/test-api/db/pom.xml index 40d838854dbf..6a56d1dbf6b6 100644 --- a/core/test-api/db/pom.xml +++ b/core/test-api/db/pom.xml @@ -62,6 +62,11 @@ org.opennms.tests.mock-elements compile + + org.opennms.dependencies + atomikos-dependencies + pom + org.opennms.dependencies spring-test-dependencies @@ -76,7 +81,7 @@ org.hsqldb hsqldb - 2.2.9 + 2.3.1 --> diff --git a/core/test-api/db/src/main/java/org/opennms/core/test/db/TemporaryDatabaseExecutionListener.java b/core/test-api/db/src/main/java/org/opennms/core/test/db/TemporaryDatabaseExecutionListener.java index 4799d7e3bf35..237af37ae9d9 100644 --- a/core/test-api/db/src/main/java/org/opennms/core/test/db/TemporaryDatabaseExecutionListener.java +++ b/core/test-api/db/src/main/java/org/opennms/core/test/db/TemporaryDatabaseExecutionListener.java @@ -47,16 +47,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.datasource.DelegatingDataSource; -import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy; import org.springframework.test.context.TestContext; import org.springframework.test.context.TestExecutionListener; import org.springframework.test.context.support.AbstractTestExecutionListener; import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; import org.springframework.util.Assert; -import com.mchange.v2.c3p0.DataSources; -import com.mchange.v2.c3p0.PooledDataSource; - /** * This {@link TestExecutionListener} creates a temporary database and then * registers it as the default datasource inside {@link DataSourceFactory} by @@ -81,8 +77,9 @@ public void afterTestMethod(final TestContext testContext) throws Exception { final JUnitTemporaryDatabase jtd = findAnnotation(testContext); if (jtd == null) return; - final PooledDataSource pds = (PooledDataSource)testContext.getAttribute("org.opennms.netmgt.dao.db.TemporaryDatabaseExecutionListener.pooledDataSource"); - if (pds != null) pds.hardReset(); + // Close down the data sources that are referenced by the static DataSourceFactory helper classes + DataSourceFactory.close(); + XADataSourceFactory.close(); try { // DON'T REMOVE THE DATABASE, just rely on the ShutdownHook to remove them instead @@ -219,21 +216,10 @@ public void prepareTestInstance(final TestContext testContext) throws Exception } m_database = m_databases.remove(); - final PooledDataSource pooledDataSource = (PooledDataSource)DataSources.pooledDataSource(m_database); - - Runtime.getRuntime().addShutdownHook(new Thread() { - @Override - public void run() { - try { pooledDataSource.close(); } - catch (final Throwable t) { LOG.debug("failed to close pooled data source", t); } - } - }); - final LazyConnectionDataSourceProxy proxy = new LazyConnectionDataSourceProxy(pooledDataSource); - DataSourceFactory.setInstance(proxy); + DataSourceFactory.setInstance(m_database); XADataSourceFactory.setInstance(m_database); - testContext.setAttribute("org.opennms.netmgt.dao.db.TemporaryDatabaseExecutionListener.pooledDataSource", pooledDataSource); System.err.println(String.format("TemporaryDatabaseExecutionListener.prepareTestInstance(%s) prepared db %s", testContext, m_database.toString())); System.err.println("Temporary Database Name: " + m_database.getTestDatabase()); } diff --git a/core/test-api/db/src/main/resources/META-INF/opennms/applicationContext-testDao.xml b/core/test-api/db/src/main/resources/META-INF/opennms/applicationContext-testDao.xml index 1b6f509ff1b6..52af19efaee7 100644 --- a/core/test-api/db/src/main/resources/META-INF/opennms/applicationContext-testDao.xml +++ b/core/test-api/db/src/main/resources/META-INF/opennms/applicationContext-testDao.xml @@ -24,24 +24,48 @@ + + + + + + + + + + + - org.opennms.netmgt.dao + org.opennms.netmgt.dao.hibernate + org.opennms.netmgt.model + + + + + + org.opennms.netmgt.dao.hibernate org.opennms.netmgt.model + + hibernate.dialect=org.hibernate.dialect.HSQLDialect - hibernate.cache.use_second_level_cache=false - hibernate.cache=false + hibernate.cache.use_query_cache=false - hibernate.jdbc.batch_size=0 - hibernate.format_sql=false - hibernate.show_sql=false + hibernate.cache.use_second_level_cache=false + hibernate.hbm2ddl.auto=create + hibernate.jdbc.batch_size=0 + diff --git a/core/upgrade/pom.xml b/core/upgrade/pom.xml new file mode 100644 index 000000000000..2ef382d8ae8b --- /dev/null +++ b/core/upgrade/pom.xml @@ -0,0 +1,57 @@ + + + + org.opennms + org.opennms.core + 1.13.0-SNAPSHOT + + 4.0.0 + org.opennms.core + org.opennms.core.upgrade + OpenNMS Core Upgrade Library + jar + + + + org.opennms.dependencies + spring-dependencies + pom + + + org.opennms.core + org.opennms.core.daemon + + + org.opennms + opennms-rrd-model + + + + commons-io + commons-io + + + org.opennms + opennms-config + + + org.opennms + opennms-provision-persistence + + + org.opennms.dependencies + jrobin-dependencies + pom + + + org.opennms + opennms-rrd-jrobin + + + + junit + junit + test + + + diff --git a/core/upgrade/src/main/java/org/opennms/netmgt/vmmgr/ControllerUtils.java b/core/upgrade/src/main/java/org/opennms/netmgt/vmmgr/ControllerUtils.java new file mode 100644 index 000000000000..aeceeecb5847 --- /dev/null +++ b/core/upgrade/src/main/java/org/opennms/netmgt/vmmgr/ControllerUtils.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.vmmgr; + +/** + * The Class ControllerUtils. + * + * @author Alejandro Galue + */ +public class ControllerUtils { + + /** The controller. */ + private static Controller controller; + + /** + * Gets the controller. + * + * @return the controller + */ + public static Controller getController() { + if (controller == null) { + controller = new Controller(); + controller.setInvokeUrl("http://127.0.0.1:8181/invoke?objectname=OpenNMS:Name=Manager"); + controller.setAuthenticator(controller.createAuthenticatorUsingConfigCredentials()); + } + return controller; + } + +} diff --git a/core/upgrade/src/main/java/org/opennms/upgrade/api/AbstractOnmsUpgrade.java b/core/upgrade/src/main/java/org/opennms/upgrade/api/AbstractOnmsUpgrade.java new file mode 100644 index 000000000000..ef735fba0d4b --- /dev/null +++ b/core/upgrade/src/main/java/org/opennms/upgrade/api/AbstractOnmsUpgrade.java @@ -0,0 +1,468 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.api; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Properties; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; +import java.util.zip.ZipOutputStream; + +import org.apache.commons.io.IOUtils; +import org.opennms.core.utils.ConfigFileConstants; +import org.opennms.core.xml.CastorUtils; +import org.opennms.netmgt.config.opennmsDataSources.DataSourceConfiguration; +import org.opennms.netmgt.config.opennmsDataSources.JdbcDataSource; +import org.opennms.netmgt.rrd.RrdUtils; + +/** + * The Abstract class for OpenNMS Upgrade Implementations. + *

This contains the basic methods that may be required for several implementations.

+ * + * @author Alejandro Galue + */ +public abstract class AbstractOnmsUpgrade implements OnmsUpgrade { + + /** The Constant ZIP_EXT. */ + public static final String ZIP_EXT = ".zip"; + + /** The main properties. */ + private Properties mainProperties; + + /** The RRD properties. */ + private Properties rrdProperties; + + /** The OpenNMS version. */ + private String onmsVersion; + + /** + * Instantiates a new abstract OpenNMS upgrade. + * + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + public AbstractOnmsUpgrade() throws OnmsUpgradeException { + registerProperties(getMainProperties()); + registerProperties(getRrdProperties()); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getId() + */ + @Override + public String getId() { + return getClass().getSimpleName(); + } + + /** + * Gets the home directory. + * + * @return the home directory + */ + protected String getHomeDirectory() { + return ConfigFileConstants.getHome(); + } + + /** + * Gets the files. + * + * @param resourceDir the resource directory + * @param ext the file extension + * @return the files + */ + protected File[] getFiles(final File resourceDir, final String ext) { + return resourceDir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.toLowerCase().endsWith(ext); + } + }); + } + + /** + * Register properties. + * + * @param properties the properties + */ + protected void registerProperties(Properties properties) { + if (properties == null) { + return; + } + for (Object o : properties.keySet()) { + String key = (String) o; + System.setProperty(key, properties.getProperty(key)); + } + } + + /** + * Load properties. + * + * @param properties the properties + * @param fileName the file name + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected void loadProperties(Properties properties, String fileName) throws OnmsUpgradeException { + try { + File propertiesFile = ConfigFileConstants.getConfigFileByName(fileName); + properties.load(new FileInputStream(propertiesFile)); + } catch (Exception e) { + throw new OnmsUpgradeException("Can't load " + fileName); + } + } + + /** + * Gets the main properties. + * + * @return the main properties + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected Properties getMainProperties() throws OnmsUpgradeException { + if (mainProperties == null) { + mainProperties = new Properties(); + loadProperties(mainProperties, "opennms.properties"); + } + return mainProperties; + } + + /** + * Gets the RRD properties. + * + * @return the RRD properties + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected Properties getRrdProperties() throws OnmsUpgradeException { + if (rrdProperties == null) { + rrdProperties = new Properties(); + loadProperties(rrdProperties, "rrd-configuration.properties"); + } + return rrdProperties; + } + + /** + * Checks if storeByGroup is enabled. + * + * @return true, if storeByGroup is enabled + */ + protected boolean isStoreByGroupEnabled() { + try { + return Boolean.parseBoolean(getMainProperties().getProperty("org.opennms.rrd.storeByGroup", "false")); + } catch (Exception e) { + return false; + } + } + + /** + * Checks if storeByForeignSource is enabled. + * + * @return true, if storeByForeignSource is enabled + */ + protected boolean isStoreByForeignSourceEnabled() { + try { + return Boolean.parseBoolean(getMainProperties().getProperty("org.opennms.rrd.storeByForeignSource", "false")); + } catch (Exception e) { + return false; + } + } + + /** + * Checks if is RRDtool enabled. + * + * @return true, if is RRDtool enabled + */ + protected boolean isRrdToolEnabled() { + try { + RrdUtils.getStrategy().getClass().getSimpleName().equals("JniRrdStrategy"); + String strategy = getRrdProperties().getProperty("org.opennms.rrd.strategyClass", "org.opennms.netmgt.rrd.jrobin.JRobinRrdStrategy"); + return !strategy.endsWith(".JRobinRrdStrategy"); + } catch (Exception e) { + return false; + } + } + + /** + * Gets the RRD extension. + * + * @return the RRD extension + */ + protected String getRrdExtension() { + try { + return RrdUtils.getExtension(); + } catch (Exception e) { + return null; + } + } + + /** + * Gets the DB connection. + * + * @return the DB connection + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected Connection getDbConnection() throws OnmsUpgradeException { + try { + final File cfgFile = ConfigFileConstants.getFile(ConfigFileConstants.OPENNMS_DATASOURCE_CONFIG_FILE_NAME); + DataSourceConfiguration dsc = null; + FileInputStream fileInputStream = null; + try { + fileInputStream = new FileInputStream(cfgFile); + dsc = CastorUtils.unmarshal(DataSourceConfiguration.class, fileInputStream); + } finally { + IOUtils.closeQuietly(fileInputStream); + } + for (JdbcDataSource ds : dsc.getJdbcDataSourceCollection()) { + if (ds.getName().equals("opennms")) { + return DriverManager.getConnection(ds.getUrl(), ds.getUserName(), ds.getPassword()); + } + } + } catch (Exception e) { + throw new OnmsUpgradeException("Can't connect to OpenNMS Database"); + } + throw new OnmsUpgradeException("Databaseconnection cannot be null"); + } + + /** + * Populate files list. + * + * @param dir the source directory + * @param filesListInDir the list of files to populate + * @throws IOException Signals that an I/O exception has occurred. + */ + private void populateFilesList(File dir, List filesListInDir) throws IOException { + File[] files = dir.listFiles(); + for (File file : files) { + if (file.isFile()) filesListInDir.add(file); + else populateFilesList(file, filesListInDir); + } + } + + /** + * ZIP a list of files. + * + * @param zipFile the output ZIP file + * @param sourceFolder the source folder + * @param filesToCompress the list of files to compress + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + private void zipFiles(File zipFile, File sourceFolder, List filesToCompress) throws OnmsUpgradeException { + try { + FileOutputStream fos = new FileOutputStream(zipFile); + ZipOutputStream zos = new ZipOutputStream(fos); + for(File file : filesToCompress){ + String filePath = file.getAbsolutePath(); + log(" Zipping %s\n", filePath); + ZipEntry ze = new ZipEntry(filePath.substring(sourceFolder.getAbsolutePath().length() + 1, filePath.length())); + zos.putNextEntry(ze); + FileInputStream fis = new FileInputStream(file); + byte[] buffer = new byte[1024]; + int len; + while ((len = fis.read(buffer)) > 0) { + zos.write(buffer, 0, len); + } + zos.closeEntry(); + fis.close(); + } + zos.flush(); + zos.close(); + fos.close(); + } catch (Exception e) { + throw new OnmsUpgradeException("Cannot ZIP files because " + e.getMessage(), e); + } + } + + /** + * ZIP a directory. + * + * @param zipFile the output ZIP file + * @param sourceFolder the source folder + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected void zipDir(File zipFile, File sourceFolder) throws OnmsUpgradeException { + List filesToCompress = new ArrayList(); + try { + populateFilesList(sourceFolder, filesToCompress); + } catch (IOException e) { + throw new OnmsUpgradeException("Cannot ZIP files because " + e.getMessage(), e); + } + zipFiles(zipFile, sourceFolder, filesToCompress); + } + + /** + * ZIP a file. + * + *

The name of the ZIP file will be the name of the source file plus ".zip"

+ * @param sourceFile the source file + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected void zipFile(File sourceFile) throws OnmsUpgradeException { + zipFiles(new File(sourceFile.getAbsolutePath() + ZIP_EXT), sourceFile.getParentFile(), Collections.singletonList(sourceFile)); + } + + /** + * UNZIP a file. + * + * @param zipFile the input ZIP file + * @param outputFolder the output folder + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected void unzipFile(File zipFile, File outputFolder) throws OnmsUpgradeException { + try { + if (!outputFolder.exists()) outputFolder.mkdirs(); + FileInputStream fis; + byte[] buffer = new byte[1024]; + fis = new FileInputStream(zipFile); + ZipInputStream zis = new ZipInputStream(fis); + ZipEntry ze = zis.getNextEntry(); + while(ze != null){ + String fileName = ze.getName(); + File newFile = new File(outputFolder, fileName); + log(" Unzipping to %s\n", newFile.getAbsolutePath()); + new File(newFile.getParent()).mkdirs(); + FileOutputStream fos = new FileOutputStream(newFile); + int len; + while ((len = zis.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + fos.close(); + zis.closeEntry(); + ze = zis.getNextEntry(); + } + zis.closeEntry(); + zis.close(); + fis.close(); + } catch (Exception e) { + throw new OnmsUpgradeException("Cannot UNZIP file because " + e.getMessage(), e); + } + } + + /** + * Gets the currently installed OpenNMS version. + * + * @return the OpenNMS version + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected String getOpennmsVersion() throws OnmsUpgradeException { + if (onmsVersion == null) { + File versionFile = new File(getHomeDirectory(), "jetty-webapps/opennms/WEB-INF/version.properties"); + Properties properties = new Properties(); + try { + properties.load(new FileInputStream(versionFile)); + } catch (Exception e) { + throw new OnmsUpgradeException("Can't load " + versionFile); + } + final String version = properties.getProperty("version.display"); + if (version == null) { + throw new OnmsUpgradeException("Can't retrive OpenNMS version"); + } + onmsVersion = version; + } + return onmsVersion; + } + + /** + * Checks if the installed version of OpenNMS is greater or equals than the supplied version. + * + * @param mayor the mayor + * @param minor the minor + * @param release the release + * @return true, if the current installed version is greater or equals than $major.$minor.$release

+ * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected boolean isInstalledVersionGreaterOrEqual(int mayor, int minor, int release) throws OnmsUpgradeException { + String version = getOpennmsVersion(); + String[] a = version.split("\\."); + try { + int supplied = mayor * 100 + minor * 10 + release; + int installed = Integer.parseInt(a[0]) * 100 + Integer.parseInt(a[1]) * 10 + Integer.parseInt(a[2].replaceFirst("[^\\d].+", "")); + return installed >= supplied; + } catch (Exception e) { + throw new OnmsUpgradeException("Can't process the OpenNMS version"); + } + } + + /** + * Prints the settings. + * + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected void printMainSettings() throws OnmsUpgradeException { + log("OpenNMS Home: %s\n", getHomeDirectory()); + log("OpenNMS Version: %s\n", getOpennmsVersion()); + log("Is RRDtool enabled? %s\n", isRrdToolEnabled()); + log("Is storeByGroup enabled? %s\n", isStoreByGroupEnabled()); + log("RRD Extension: %s\n", getRrdExtension()); + log("RRD Strategy: %s\n", RrdUtils.getStrategy().getClass().getName()); + } + + /** + * Prints the full settings. + * + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected void printFullSettings() throws OnmsUpgradeException { + printMainSettings(); + printProperties("Main Properties", getMainProperties()); + printProperties("RRD Properties", getRrdProperties()); + } + + /** + * Prints the properties. + * + * @param title the title + * @param properties the properties + */ + private void printProperties(String title, Properties properties) { + List keys = new ArrayList(); + for (Object k : properties.keySet()) { + keys.add((String) k); + } + Collections.sort(keys); + log("%s\n", title); + for (String key : keys) { + log(" %s = %s\n", key, properties.getProperty(key)); + } + } + + /** + * Log. + * + * @param msgFormat the message format + * @param args the message's arguments + */ + protected void log(String msgFormat, Object... args) { + System.out.printf(" " + msgFormat, args); + } + +} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/AbstractImportOperation.java b/core/upgrade/src/main/java/org/opennms/upgrade/api/Ignore.java similarity index 76% rename from opennms-import/src/main/java/org/opennms/netmgt/importer/operations/AbstractImportOperation.java rename to core/upgrade/src/main/java/org/opennms/upgrade/api/Ignore.java index b37d2a0bd2b1..f5914262b61f 100644 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/AbstractImportOperation.java +++ b/core/upgrade/src/main/java/org/opennms/upgrade/api/Ignore.java @@ -25,17 +25,18 @@ * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ +package org.opennms.upgrade.api; -package org.opennms.netmgt.importer.operations; - +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** - *

Abstract AbstractImportOperation class.

- * - * @author ranger - * @version $Id: $ + * The Interface Ignore. + *

Add this annotation to any OnmsUpgrade implementation that is not supposed to be executed (or ignored).

+ * + * @author Alejandro Galue */ -public abstract class AbstractImportOperation implements ImportOperation { - +@Retention(RetentionPolicy.RUNTIME) +public @interface Ignore { } diff --git a/core/upgrade/src/main/java/org/opennms/upgrade/api/OnmsUpgrade.java b/core/upgrade/src/main/java/org/opennms/upgrade/api/OnmsUpgrade.java new file mode 100644 index 000000000000..9042adbd848a --- /dev/null +++ b/core/upgrade/src/main/java/org/opennms/upgrade/api/OnmsUpgrade.java @@ -0,0 +1,110 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ + +package org.opennms.upgrade.api; + +/** + * The Interface OnmsUpgrade. + *

All the post-processing scripts must implement this class.

+ * + * @author Alejandro Galue + */ +public interface OnmsUpgrade { + + /** + * Gets the order. + *

In order to execute all the implementations of this interface on a specify order, + * each implementation must return an integer for this purpose.

+ * + * @return the order + */ + int getOrder(); + + /** + * Gets the id. + *

This is for informational purposes, and will be used to store the execution status.

+ *

It is recommended to use the class-name, but any other text can be used.

+ * + * @return the id + */ + String getId(); + + /** + * Gets the description. + *

This is for informational purposes, and should contain a brief description about + * what is the purpose of this upgrade class.

+ * + * @return the description + */ + String getDescription(); + + /** + * Pre-execute + *

Runs some checks to ensure that what it would execute() would work. + * If something is missing, an exception will be thrown

+ *

Execute backups of the JRBs/RRDs if they are going to be modified.

+ * + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + void preExecute() throws OnmsUpgradeException; + + /** + * Post execute. + *

Runs some clean up tasks after executing the execute() method. + * If something is wrong, an exception will be thrown

+ * + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + void postExecute() throws OnmsUpgradeException; + + /** + * Rollback. + *

Restore the initial state of the OpenNMS files if something went wrong while running the execute() method.

+ *

Must restore the backups of the files if necessary.

+ */ + void rollback() throws OnmsUpgradeException; + + /** + * Execute. + *

This is the main method, and this is the one where all the upgrade code + * must be placed.

+ * + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + void execute() throws OnmsUpgradeException; + + /** + * Requires OpenNMS running. + * + * @return true, if OpenNMS must be running to execute this upgrade or false + * if OpenNMS must be stopped. + */ + boolean requiresOnmsRunning(); +} + + diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/ImportOperation.java b/core/upgrade/src/main/java/org/opennms/upgrade/api/OnmsUpgradeComparator.java similarity index 69% rename from opennms-import/src/main/java/org/opennms/netmgt/importer/operations/ImportOperation.java rename to core/upgrade/src/main/java/org/opennms/upgrade/api/OnmsUpgradeComparator.java index b456fd32e2fa..8b6cb1cbbcc0 100644 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/ImportOperation.java +++ b/core/upgrade/src/main/java/org/opennms/upgrade/api/OnmsUpgradeComparator.java @@ -25,31 +25,24 @@ * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ +package org.opennms.upgrade.api; -package org.opennms.netmgt.importer.operations; - -import java.util.List; - -import org.opennms.netmgt.xml.event.Event; +import java.util.Comparator; /** - *

ImportOperation interface.

- * - * @author ranger - * @version $Id: $ + * The Class OnmsUpgradeComparator. + *

By default, the implementations are going to be ordered according with the order integer.

+ * + * @author Alejandro Galue */ -public interface ImportOperation { +public class OnmsUpgradeComparator implements Comparator { - /** - *

gatherAdditionalData

- */ - void gatherAdditionalData(); - - /** - *

persist

- * - * @return a {@link java.util.List} object. + /* (non-Javadoc) + * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ - List persist(); + @Override + public int compare(OnmsUpgrade a, OnmsUpgrade b) { + return a.getOrder() - b.getOrder(); + } } diff --git a/core/upgrade/src/main/java/org/opennms/upgrade/api/OnmsUpgradeException.java b/core/upgrade/src/main/java/org/opennms/upgrade/api/OnmsUpgradeException.java new file mode 100644 index 000000000000..5bab0ec8e1a9 --- /dev/null +++ b/core/upgrade/src/main/java/org/opennms/upgrade/api/OnmsUpgradeException.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ + +package org.opennms.upgrade.api; + +/** + * The Class OnmsUpgradeException. + * + * @author Alejandro Galue + */ +@SuppressWarnings("serial") +public class OnmsUpgradeException extends Exception { + + /** + * Instantiates a new OpenNMS upgrade exception. + */ + public OnmsUpgradeException() { + super(); + } + + /** + * Instantiates a new OpenNMS upgrade exception. + * + * @param msg the message + * @param t the exception causing the problem. + */ + public OnmsUpgradeException(String msg, Throwable t) { + super(msg, t); + } + + /** + * Instantiates a new OpenNMS upgrade exception. + * + * @param msg the message + */ + public OnmsUpgradeException(String msg) { + super(msg); + } + + /** + * Instantiates a new OpenNMS upgrade exception. + * + * @param t the exception causing the problem. + */ + public OnmsUpgradeException(Throwable t) { + super(t); + } + +} \ No newline at end of file diff --git a/core/upgrade/src/main/java/org/opennms/upgrade/implementations/JmxRrdMigratorOffline.java b/core/upgrade/src/main/java/org/opennms/upgrade/implementations/JmxRrdMigratorOffline.java new file mode 100644 index 000000000000..64791ef4f2e9 --- /dev/null +++ b/core/upgrade/src/main/java/org/opennms/upgrade/implementations/JmxRrdMigratorOffline.java @@ -0,0 +1,640 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.implementations; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.FilenameFilter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.LineIterator; +import org.jrobin.core.RrdDb; +import org.opennms.core.utils.AlphaNumeric; +import org.opennms.core.utils.ConfigFileConstants; +import org.opennms.netmgt.config.CollectdConfigFactory; +import org.opennms.netmgt.config.JMXDataCollectionConfigFactory; +import org.opennms.netmgt.config.collectd.CollectdConfiguration; +import org.opennms.netmgt.config.collectd.Collector; +import org.opennms.netmgt.config.collectd.Package; +import org.opennms.netmgt.config.collectd.Service; +import org.opennms.upgrade.api.AbstractOnmsUpgrade; +import org.opennms.upgrade.api.OnmsUpgradeException; + +/** + * The Class RRD/JRB Migrator for JMX Collector. + * + *

The fix for the following issues is going to break existing collected data specially for JRBs. + * For this reason, these files must be updated too.

+ * + *

Issues fixed:

+ *
    + *
  • NMS-1539
  • + *
  • NMS-3485
  • + *
  • NMS-4592
  • + *
  • NMS-4612
  • + *
  • NMS-5247
  • + *
  • NMS-5279
  • + *
  • NMS-5824
  • + *
+ * + * @author Alejandro Galue + */ +public class JmxRrdMigratorOffline extends AbstractOnmsUpgrade { + + /** The JMX resource directories. */ + private List jmxResourceDirectories; + + /** The list of bad metrics. */ + protected List badMetrics = new ArrayList(); + + /** Backup files. */ + protected List backupFiles = new ArrayList(); + + /** + * Instantiates a new JMX RRD migrator offline. + * + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + public JmxRrdMigratorOffline() throws OnmsUpgradeException { + super(); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getOrder() + */ + @Override + public int getOrder() { + return 4; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getDescription() + */ + @Override + public String getDescription() { + return "Fix the JRB names for the new JMX Collector: NMS-1539, NMS-3485, NMS-4592, NMS-4612, NMS-5247, NMS-5279, NMS-5824"; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#requiresOnmsRunning() + */ + @Override + public boolean requiresOnmsRunning() { + return false; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#preExecute() + */ + @Override + public void preExecute() throws OnmsUpgradeException { + printMainSettings(); + if (isInstalledVersionGreaterOrEqual(1, 12, 2)) { + try { + CollectdConfigFactory.init(); + } catch (Exception e) { + throw new OnmsUpgradeException("Can't initialize collectd-configuration.xml because " + e.getMessage()); + } + try { + JMXDataCollectionConfigFactory.init(); + } catch (Exception e) { + throw new OnmsUpgradeException("Can't initialize jmx-datacollection-config.xml because " + e.getMessage()); + } + for (File jmxResourceDir : getJmxResourceDirectories()) { + log("Backing up %s\n", jmxResourceDir); + zipDir(new File(jmxResourceDir.getAbsolutePath() + ZIP_EXT), jmxResourceDir); + } + } else { + throw new OnmsUpgradeException("This upgrade procedure requires at least OpenNMS 1.12.2, the current version is " + getOpennmsVersion()); + } + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#postExecute() + */ + @Override + public void postExecute() throws OnmsUpgradeException { + for (File jmxResourceDir : getJmxResourceDirectories()) { + File zip = new File(jmxResourceDir.getAbsolutePath() + ZIP_EXT); + if (zip.exists()) { + log("Removing backup %s\n", zip); + FileUtils.deleteQuietly(zip); + } + } + for (File backupFile : backupFiles) { + log("Removing backup %s\n", backupFile); + FileUtils.deleteQuietly(backupFile); + FileUtils.deleteQuietly(new File(backupFile.getAbsolutePath().replaceFirst(ZIP_EXT, ".temp"))); + } + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#rollback() + */ + @Override + public void rollback() throws OnmsUpgradeException { + try { + for (File jmxResourceDir : getJmxResourceDirectories()) { + File zip = new File(jmxResourceDir.getAbsolutePath() + ZIP_EXT); + FileUtils.deleteDirectory(jmxResourceDir); + jmxResourceDir.mkdirs(); + unzipFile(zip, jmxResourceDir); + zip.delete(); + } + File configDir = new File(ConfigFileConstants.getFilePathString()); + for (File backupFile : backupFiles) { + unzipFile(backupFile, configDir); + } + } catch (IOException e) { + throw new OnmsUpgradeException("Can't restore the backup files because " + e.getMessage()); + } + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#execute() + */ + @Override + public void execute() throws OnmsUpgradeException { + try { + // Fixing JRB/RRD files + final boolean isRrdtool = isRrdToolEnabled(); + final boolean storeByGroup = isStoreByGroupEnabled(); + for (File jmxResourceDir : getJmxResourceDirectories()) { + if (storeByGroup) { + processGroupFiles(jmxResourceDir, isRrdtool); + } else { + processSingleFiles(jmxResourceDir, isRrdtool); + } + } + // Fixing JMX Configuration File + File jmxConfigFile = null; + try { + jmxConfigFile = ConfigFileConstants.getFile(ConfigFileConstants.JMX_DATA_COLLECTION_CONF_FILE_NAME); + } catch (IOException e) { + throw new OnmsUpgradeException("Can't find JMX Configuration file (ignoring processing)"); + } + fixJmxConfigurationFile(jmxConfigFile); + // List Bad Metrics: + log("Found %s Bad Metrics: %s\n", badMetrics.size(), badMetrics); + // Fixing Graph Templates + File jmxGraphsFile = new File(ConfigFileConstants.getFilePathString(), "snmp-graph.properties"); + fixJmxGraphTemplateFile(jmxGraphsFile); + } catch (Exception e) { + throw new OnmsUpgradeException("Can't upgrade the JRBs because " + e.getMessage(), e); + } + } + + /** + * Fixes a JMX configuration file. + * + * @param jmxConfigFile the JMX configuration file + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + private void fixJmxConfigurationFile(File jmxConfigFile) throws OnmsUpgradeException { + try { + log("Updating JMX metric definitions on %s\n", jmxConfigFile); + zipFile(jmxConfigFile); + backupFiles.add(new File(jmxConfigFile.getAbsolutePath() + ZIP_EXT)); + File outputFile = new File(jmxConfigFile.getCanonicalFile() + ".temp"); + FileWriter w = new FileWriter(outputFile); + Pattern extRegex = Pattern.compile("import-mbeans[>](.+)[<]"); + Pattern aliasRegex = Pattern.compile("alias=\"([^\"]+\\.[^\"]+)\""); + List externalFiles = new ArrayList(); + for (LineIterator it = FileUtils.lineIterator(jmxConfigFile); it.hasNext();) { + String line = it.next(); + Matcher m = extRegex.matcher(line); + if (m.find()) { + externalFiles.add(new File(jmxConfigFile.getParentFile(), m.group(1))); + } + m = aliasRegex.matcher(line); + if (m.find()) { + String badDs = m.group(1); + String fixedDs = getFixedDsName(badDs); + log(" Replacing bad alias %s with %s on %s\n", badDs, fixedDs, line.trim()); + line = line.replaceAll(badDs, fixedDs); + if (badMetrics.contains(badDs) == false) { + badMetrics.add(badDs); + } + } + w.write(line + "\n"); + } + w.close(); + FileUtils.deleteQuietly(jmxConfigFile); + FileUtils.moveFile(outputFile, jmxConfigFile); + if (!externalFiles.isEmpty()) { + for (File configFile : externalFiles) { + fixJmxConfigurationFile(configFile); + } + } + } catch (Exception e) { + throw new OnmsUpgradeException("Can't fix " + jmxConfigFile + " because " + e.getMessage(), e); + } + } + + /** + * Fixes a JMX graph template file. + * + * @param jmxTemplateFile the JMX template file + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + private void fixJmxGraphTemplateFile(File jmxTemplateFile) throws OnmsUpgradeException { + try { + log("Updating JMX graph templates on %s\n", jmxTemplateFile); + zipFile(jmxTemplateFile); + backupFiles.add(new File(jmxTemplateFile.getAbsolutePath() + ZIP_EXT)); + File outputFile = new File(jmxTemplateFile.getCanonicalFile() + ".temp"); + FileWriter w = new FileWriter(outputFile); + Pattern defRegex = Pattern.compile("DEF:.+:(.+\\..+):"); + Pattern colRegex = Pattern.compile("\\.columns=(.+)$"); + Pattern incRegex = Pattern.compile("^include.directory=(.+)$"); + List externalFiles = new ArrayList(); + boolean override = false; + for (LineIterator it = FileUtils.lineIterator(jmxTemplateFile); it.hasNext();) { + String line = it.next(); + Matcher m = incRegex.matcher(line); + if (m.find()) { + File includeDirectory = new File(jmxTemplateFile.getParentFile(), m.group(1)); + if (includeDirectory.isDirectory()) { + FilenameFilter propertyFilesFilter = new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return (name.endsWith(".properties")); + } + }; + for (File file : includeDirectory.listFiles(propertyFilesFilter)) { + externalFiles.add(file); + } + } + } + m = colRegex.matcher(line); + if (m.find()) { + String[] badColumns = m.group(1).split(",(\\s)?"); + for (String badDs : badColumns) { + String fixedDs = getFixedDsName(badDs); + if (fixedDs.equals(badDs)) { + continue; + } + if (badMetrics.contains(badDs)) { + override = true; + log(" Replacing bad data source %s with %s on %s\n", badDs, fixedDs, line); + line = line.replaceAll(badDs, fixedDs); + } else { + log(" Warning: a bad data source not related with JMX has been found: %s (this won't be updated)\n", badDs); + } + } + } + m = defRegex.matcher(line); + if (m.find()) { + String badDs = m.group(1); + if (badMetrics.contains(badDs)) { + override = true; + String fixedDs = getFixedDsName(badDs); + log(" Replacing bad data source %s with %s on %s\n", badDs, fixedDs, line); + line = line.replaceAll(badDs, fixedDs); + } else { + log(" Warning: a bad data source not related with JMX has been found: %s (this won't be updated)\n", badDs); + } + } + w.write(line + "\n"); + } + w.close(); + if (override) { + FileUtils.deleteQuietly(jmxTemplateFile); + FileUtils.moveFile(outputFile, jmxTemplateFile); + } else { + FileUtils.deleteQuietly(outputFile); + } + if (!externalFiles.isEmpty()) { + for (File configFile : externalFiles) { + fixJmxGraphTemplateFile(configFile); + } + } + } catch (Exception e) { + throw new OnmsUpgradeException("Can't fix " + jmxTemplateFile + " because " + e.getMessage(), e); + } + } + + /** + * Gets the JMX resource directories. + * + * @return the JMX resource directories + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + private List getJmxResourceDirectories() throws OnmsUpgradeException { + if (jmxResourceDirectories == null) { + jmxResourceDirectories = new ArrayList(); + CollectdConfiguration config; + try { + config = CollectdConfigFactory.getInstance().getCollectdConfig().getConfig(); + } catch (Exception e) { + throw new OnmsUpgradeException("Can't upgrade the JRBs because " + e.getMessage(), e); + } + List services = getJmxServices(config); + log("JMX services found: %s\n", services); + List jmxFriendlyNames = new ArrayList(); + for (String service : services) { + Service svc = getServiceObject(config, service); + String friendlyName = getSvcPropertyValue(svc, "friendly-name"); + jmxFriendlyNames.add(friendlyName); + } + log("JMX friendly names found: %s\n", jmxFriendlyNames); + File rrdDir = new File(JMXDataCollectionConfigFactory.getInstance().getRrdPath()); + findJmxDirectories(rrdDir, jmxFriendlyNames, jmxResourceDirectories); + if (jmxResourceDirectories.isEmpty()) { + log("Warning: no JMX directories found on %s\n", rrdDir); + } + } + return jmxResourceDirectories; + } + + /** + * Find JMX directories. + * + * @param rrdDir the RRD directory + * @param jmxfriendlyNames the JMX friendly names + * @param jmxDirectories the target list for JMX directories + */ + private void findJmxDirectories(final File rrdDir, final List jmxfriendlyNames, final List jmxDirectories) { + File[] files = rrdDir.listFiles(); + if (files == null) { + return; + } + for (File file : files) { + if (file.isDirectory()) { + boolean valid = false; + for (String friendlyName : jmxfriendlyNames) { + if (file.getAbsolutePath().endsWith(friendlyName)) { + valid = true; + } + } + if (valid) { + jmxDirectories.add(file); + } + findJmxDirectories(file, jmxfriendlyNames, jmxDirectories); + } + } + } + + /** + * Process single files. + * + * @param resourceDir the resource directory + * @param isRrdtool the is RRDtool enabled + * @throws Exception the exception + */ + private void processSingleFiles(File resourceDir, boolean isRrdtool) throws Exception { + // META + final String metaExt = ".meta"; + File[] metaFiles = getFiles(resourceDir, metaExt); + if (metaFiles == null) { + log("Warning: there are no %s files on %s\n", metaExt, resourceDir); + } else { + for (final File metaFile : metaFiles) { + log("Processing META %s\n", metaFile); + String dsName = metaFile.getName().replaceFirst(metaExt, ""); + String newName = getFixedDsName(dsName); + if (!dsName.equals(newName)) { + Properties meta = new Properties(); + Properties newMeta = new Properties(); + meta.load(new FileInputStream(metaFile)); + for (Object k : meta.keySet()) { + String key = (String) k; + String newKey = key.replaceAll(dsName, newName); + newMeta.put(newKey, newName); + } + File newFile = new File(metaFile.getParentFile(), newName + metaExt); + log("Re-creating META into %s\n", newFile); + newMeta.store(new FileWriter(newFile), null); + if (!metaFile.equals(newFile)) + metaFile.delete(); + } + } + } + // JRBs + final String rrdExt = getRrdExtension(); + File[] jrbFiles = getFiles(resourceDir, rrdExt); + if (jrbFiles == null) { + log("Warning: there are no %s files on %s\n", rrdExt, resourceDir); + } else { + for (final File jrbFile : jrbFiles) { + log("Processing %s %s\n", rrdExt.toUpperCase(), jrbFile); + String dsName = jrbFile.getName().replaceFirst(rrdExt, ""); + String newName = getFixedDsName(dsName); + File newFile = new File(jrbFile.getParentFile(), newName + rrdExt); + if (!dsName.equals(newName)) { + try { + log("Renaming %s to %s\n", rrdExt.toUpperCase(), newFile); + FileUtils.moveFile(jrbFile, newFile); + } catch (Exception e) { + log("Warning: Can't move file because: %s", e.getMessage()); + continue; + } + } + if (!isRrdtool) { // Only the JRBs may contain invalid DS inside + updateJrb(newFile); + } + } + } + } + + /** + * Process group files. + * + * @param resourceDir the resource directory + * @param isRrdtool the is RRDtool enabled + * @throws Exception the exception + */ + private void processGroupFiles(File resourceDir, boolean isRrdtool) throws Exception { + // DS + File dsFile = new File(resourceDir, "ds.properties"); + log("Processing DS %s\n", dsFile); + if (dsFile.exists()) { + Properties dsProperties = new Properties(); + Properties newDsProperties = new Properties(); + dsProperties.load(new FileInputStream(dsFile)); + for (Object key : dsProperties.keySet()) { + String oldName = (String) key; + String newName = getFixedDsName(oldName); + String oldFile = dsProperties.getProperty(oldName); + String newFile = getFixedFileName(oldFile); + newDsProperties.put(newName, newFile); + } + newDsProperties.store(new FileWriter(dsFile), null); + } + // META + final String metaExt = ".meta"; + File[] metaFiles = getFiles(resourceDir, metaExt); + if (metaFiles == null) { + log("Warning: there are no %s files on %s\n", metaExt, resourceDir); + } else { + for (final File metaFile : metaFiles) { + log("Processing META %s\n", metaFile); + Properties meta = new Properties(); + Properties newMeta = new Properties(); + meta.load(new FileInputStream(metaFile)); + for (Object k : meta.keySet()) { + String key = (String) k; + String dsName = meta.getProperty(key); + String newName = getFixedDsName(dsName); + String newKey = key.replaceAll(dsName, newName); + newMeta.put(newKey, newName); + } + File newFile = new File(metaFile.getParentFile(), getFixedFileName(metaFile.getName().replaceFirst(metaExt, "")) + metaExt); + log("Recreating META into %s\n", newFile); + newMeta.store(new FileWriter(newFile), null); + if (!metaFile.equals(newFile)) + metaFile.delete(); + } + } + // JRBs + final String rrdExt = getRrdExtension(); + File[] jrbFiles = getFiles(resourceDir, rrdExt); + if (jrbFiles == null) { + log("Warning: there are no %s files on %s\n", rrdExt, resourceDir); + } else { + for (final File jrbFile : jrbFiles) { + log("Processing %s %s\n", rrdExt.toUpperCase(), jrbFile); + File newFile = new File(jrbFile.getParentFile(), getFixedFileName(jrbFile.getName().replaceFirst(rrdExt, "")) + rrdExt); + if (!jrbFile.equals(newFile)) { + try { + log("Renaming %s to %s\n", rrdExt.toUpperCase(), newFile); + FileUtils.moveFile(jrbFile, newFile); + } catch (Exception e) { + log("Warning: Can't move file because: %s", e.getMessage()); + continue; + } + } + if (!isRrdtool) { // Only the JRBs may contain invalid DS inside + updateJrb(newFile); + } + } + } + } + + /** + * Update JRB. + * + * @param jrbFile the JRB file + * @throws Exception the exception + */ + private void updateJrb(File jrbFile) throws Exception { + RrdDb rrdDb = new RrdDb(jrbFile); + for (String ds : rrdDb.getDsNames()) { + String newDs = getFixedDsName(ds); + if (!ds.equals(newDs)) { + log("Updating internal DS name from %s to %s\n", ds, newDs); + rrdDb.getDatasource(ds).setDsName(newDs); + } + } + rrdDb.close(); + } + + /** + * Gets the JMX services. + * + * @param config the Collectd's configuration + * @return the list of JMX services + */ + private List getJmxServices(CollectdConfiguration config) { + List services = new ArrayList(); + for (Collector c : config.getCollectorCollection()) { + // The following code has been made that way to avoid a dependency with opennms-services + // TODO Depends on opennms-services is not that bad, considering that some customers could have different implementations. + if (c.getClassName().matches(".*(JBoss|JMXSecure|Jsr160|MX4J)Collector$")) { + services.add(c.getService()); + } + } + return services; + } + + /** + * Gets the service object. + * + * @param config the Collectd's configuration + * @param service the service's name + * @return the service object + */ + private Service getServiceObject(CollectdConfiguration config, String service) { + for (Package pkg : config.getPackageCollection()) { + for (Service svc : pkg.getServiceCollection()) { + if (svc.getName().equals(service)) { + return svc; + } + } + } + return null; + } + + /** + * Gets the value of a service property. + * + * @param svc the service's name + * @param propertyName the property name + * @return the service property value + */ + private String getSvcPropertyValue(Service svc, String propertyName) { + for (org.opennms.netmgt.config.collectd.Parameter p : svc.getParameterCollection()) { + if (p.getKey().equals(propertyName)) { + return p.getValue(); + } + } + return null; + } + + /** + * Gets the fixed DS name. + * + * @param dsName the DS name + * @return the fixed DS name + */ + protected String getFixedDsName(String dsName) { + if (dsName.contains(".")) { + String parts[] = dsName.split("\\."); + return parts[0] + parts[1].substring(0, 1).toUpperCase() + parts[1].substring(1); + } + return dsName; + } + + /** + * Gets the fixed file name. + * + * @param oldFile the old file + * @return the fixed file name + */ + protected String getFixedFileName(String oldFile) { + return AlphaNumeric.parseAndReplace(oldFile, '_'); + } + +} diff --git a/core/upgrade/src/main/java/org/opennms/upgrade/implementations/RequisitionsMigratorOffline.java b/core/upgrade/src/main/java/org/opennms/upgrade/implementations/RequisitionsMigratorOffline.java new file mode 100644 index 000000000000..d12d28a99a3d --- /dev/null +++ b/core/upgrade/src/main/java/org/opennms/upgrade/implementations/RequisitionsMigratorOffline.java @@ -0,0 +1,169 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.implementations; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.opennms.core.utils.ConfigFileConstants; +import org.opennms.core.xml.JaxbUtils; +import org.opennms.netmgt.provision.persist.requisition.Requisition; +import org.opennms.upgrade.api.AbstractOnmsUpgrade; +import org.opennms.upgrade.api.OnmsUpgradeException; + +/** + * The Class Requisitions Migrator. + * + *

The attributes non-ip-snmp-primary and non-ip-interfaces which are valid in 1.10 have been removed in 1.12.

+ *

This tool will parse the raw requisitions XML and remove those tags.

+ * + *

Issues fixed:

+ *
    + *
  • NMS-5630
  • + *
  • NMS-5571
  • + *
+ * + * @author Alejandro Galue + */ +public class RequisitionsMigratorOffline extends AbstractOnmsUpgrade { + + /** The requisition directory. */ + private File requisitionDir; + + /** + * Instantiates a new requisitions migrator offline. + * + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + public RequisitionsMigratorOffline() throws OnmsUpgradeException { + super(); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getOrder() + */ + @Override + public int getOrder() { + return 1; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getDescription() + */ + @Override + public String getDescription() { + return "Remove non-ip-snmp-primary and non-ip-interfaces from requisitions: NMS-5630, NMS-5571"; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#requiresOnmsRunning() + */ + @Override + public boolean requiresOnmsRunning() { + return false; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#preExecute() + */ + @Override + public void preExecute() throws OnmsUpgradeException { + log("Backing up: %s\n", getRequisitionDir()); + zipDir(getBackupFile(), getRequisitionDir()); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#postExecute() + */ + @Override + public void postExecute() throws OnmsUpgradeException { + File zip = getBackupFile(); + if (zip.exists()) { + log("Removing backup %s\n", zip); + zip.delete(); + } + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#rollback() + */ + @Override + public void rollback() throws OnmsUpgradeException { + File zip = getBackupFile(); + unzipFile(zip, getRequisitionDir()); + zip.delete(); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#execute() + */ + @Override + public void execute() throws OnmsUpgradeException { + try { + for (File req : FileUtils.listFiles(getRequisitionDir(), new String[]{"xml"}, true)) { + log("Processing %s\n", req); + String content = IOUtils.toString(new FileInputStream(req), "UTF-8"); + String output = content.replaceAll(" non-ip-(snmp-primary|interfaces)=\"[^\"]+\"", ""); + if (content.length() != output.length()) { + log(" Updating and parsing the requisition\n", req); + IOUtils.write(output, new FileOutputStream(req), "UTF-8"); + Requisition requisition = JaxbUtils.unmarshal(Requisition.class, req, true); + if (requisition == null) { + throw new OnmsUpgradeException("Can't parse requisition " + req); + } + } + } + } catch (Exception e) { + throw new OnmsUpgradeException("Can't upgrade requisitions because " + e.getMessage(), e); + } + } + + /** + * Gets the requisition directory. + * + * @return the requisition directory + */ + private File getRequisitionDir() { + if (requisitionDir == null) { + requisitionDir = new File(ConfigFileConstants.getFilePathString() + "imports"); + } + return requisitionDir; + } + + /** + * Gets the backup file. + * + * @return the backup file + */ + private File getBackupFile() { + return new File(getRequisitionDir().getAbsoluteFile() + ZIP_EXT); + } +} diff --git a/core/upgrade/src/main/java/org/opennms/upgrade/implementations/SnmpInterfaceRrdMigratorOnline.java b/core/upgrade/src/main/java/org/opennms/upgrade/implementations/SnmpInterfaceRrdMigratorOnline.java new file mode 100644 index 000000000000..ff5caf9ba3f0 --- /dev/null +++ b/core/upgrade/src/main/java/org/opennms/upgrade/implementations/SnmpInterfaceRrdMigratorOnline.java @@ -0,0 +1,354 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.implementations; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.io.FileUtils; +import org.opennms.core.utils.DBUtils; +import org.opennms.netmgt.config.DataCollectionConfigFactory; +import org.opennms.netmgt.config.KSC_PerformanceReportFactory; +import org.opennms.netmgt.config.kscReports.Graph; +import org.opennms.netmgt.config.kscReports.Report; +import org.opennms.netmgt.rrd.model.RrdConvertUtils; +import org.opennms.netmgt.rrd.model.v1.RRDv1; +import org.opennms.netmgt.rrd.model.v3.RRDv3; +import org.opennms.upgrade.api.AbstractOnmsUpgrade; +import org.opennms.upgrade.api.OnmsUpgradeException; + +/** + * The Class RRD/JRB Migrator for SNMP Interfaces Data (Online Version) + * + *

1.12 always add the MAC Address to the snmpinterface table if exist, which + * is different from the 1.10 behavior. For this reason, some interfaces are going + * to appear twice, and the data must be merged.

+ * + *

This tool requires that OpenNMS 1.12 is running for a while to be sure that + * all the MAC addresses have been updated, and the directories already exist.

+ * + *

Issues fixed:

+ *
    + *
  • NMS-6056
  • + *
+ * + * @author Alejandro Galue + */ +public class SnmpInterfaceRrdMigratorOnline extends AbstractOnmsUpgrade { + + /** The interfaces to merge. */ + private List interfacesToMerge; + + /** + * Instantiates a new SNMP interface RRD migrator online. + * + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + public SnmpInterfaceRrdMigratorOnline() throws OnmsUpgradeException { + super(); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getOrder() + */ + public int getOrder() { + return 2; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getDescription() + */ + public String getDescription() { + return "Merge SNMP Interface directories (Online Version): NMS-6056"; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#requiresOnmsRunning() + */ + public boolean requiresOnmsRunning() { + return true; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#preExecute() + */ + public void preExecute() throws OnmsUpgradeException { + printMainSettings(); + if (getRrdExtension() == null) { + throw new OnmsUpgradeException("Can't find the configured extension for JRB/RRD."); + } + try { + DataCollectionConfigFactory.init(); + } catch (Exception e) { + throw new OnmsUpgradeException("Can't initialize datacollection-config.xml because " + e.getMessage()); + } + try { + KSC_PerformanceReportFactory.init(); + } catch (Exception e) { + throw new OnmsUpgradeException("Can't initialize ksc-performance-reports.xml because " + e.getMessage()); + } + interfacesToMerge = getInterfacesToMerge(); + for (SnmpInterfaceUpgrade intf : interfacesToMerge) { + File[] targets = { intf.getOldInterfaceDir(), intf.getNewInterfaceDir() }; + for (File target : targets) { + if (target.exists()) { + log("Backing up: %s\n", target); + zipDir(new File(target.getAbsolutePath() + ZIP_EXT), target); + } + } + } + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#postExecute() + */ + public void postExecute() throws OnmsUpgradeException { + for (SnmpInterfaceUpgrade intf : interfacesToMerge) { + File[] targets = { intf.getOldInterfaceDir(), intf.getNewInterfaceDir() }; + for (File target : targets) { + File zip = new File(target.getAbsolutePath() + ZIP_EXT); + if (zip.exists()) { + log("Removing backup: %s\n", zip); + zip.delete(); + } + } + } + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#rollback() + */ + @Override + public void rollback() throws OnmsUpgradeException { + // The idea is to roll back only the interfaces that weren't updated. A global roll back is not necessary. + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#execute() + */ + @Override + public void execute() throws OnmsUpgradeException { + for (SnmpInterfaceUpgrade intf : interfacesToMerge) { + try { + merge(intf.getOldInterfaceDir(), intf.getNewInterfaceDir()); + } catch (Exception e) { + StringWriter w = new StringWriter(); + PrintWriter p = new PrintWriter(w); + e.printStackTrace(p); + log("Error: Can't upgrade %s because %s: %s. Rolling back changes\n", intf, e.getMessage(), w.toString()); + File[] targets = { intf.getOldInterfaceDir(), intf.getNewInterfaceDir() }; + for (File target : targets) { + File zip = new File(target.getAbsolutePath() + ZIP_EXT); + try { + FileUtils.deleteDirectory(target); + } catch (IOException e1) { + log("Warning: can't delete directory %s\n", target); + } + target.mkdirs(); + unzipFile(zip, target); + zip.delete(); + } + } + } + fixKscReports(); + } + + /** + * Fix KSC reports. + */ + protected void fixKscReports() throws OnmsUpgradeException { + log("Fixing KSC Reports.\n"); + boolean changed = false; + for (Integer reportId : KSC_PerformanceReportFactory.getInstance().getReportList().keySet()) { + Report report = KSC_PerformanceReportFactory.getInstance().getReportByIndex(reportId); + log(" Checking report %s\n", report.getTitle()); + for (Graph graph : report.getGraphCollection()) { + for (SnmpInterfaceUpgrade intf : interfacesToMerge) { + if (intf.shouldUpdate(graph.getResourceId())) { + changed = true; + graph.setResourceId(intf.getNewResourceId()); + } + } + } + } + if (changed) { + log("Updating KSC reports."); + try { + KSC_PerformanceReportFactory.getInstance().saveCurrent(); + } catch (Exception e) { + log("Warning: can't save KSC Reports because %s\n", e.getMessage()); + } + } + } + + /** + * Gets the interfaces to merge. + * + * @return the list of interfaces to merge + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected List getInterfacesToMerge() throws OnmsUpgradeException { + List interfacesToMerge = new ArrayList(); + Connection conn = getDbConnection(); + final DBUtils db = new DBUtils(getClass()); + db.watch(conn); + try { + Statement st = conn.createStatement(); + db.watch(st); + String query = "SELECT n.nodeid, n.foreignsource, n.foreignid, i.snmpifdescr, i.snmpifname, i.snmpphysaddr from node n, snmpinterface i where n.nodeid = i.nodeid and i.snmpcollect in ('C','UC') and i.snmpphysaddr is not null"; + ResultSet rs = st.executeQuery(query); + db.watch(rs); + while (rs.next()) { + SnmpInterfaceUpgrade intf = new SnmpInterfaceUpgrade(rs, isStoreByForeignSourceEnabled()); + if (intf.shouldMerge()) { + interfacesToMerge.add(intf); + } + } + } catch (Exception e) { + log("Error: can't retrieve data from the OpenNMS Database because " + e.getMessage()); + } finally { + db.cleanUp(); + } + return interfacesToMerge; + } + + /** + * Merge. + * + * @param oldDir the old directory + * @param newDir the new directory + * @throws Exception the exception + */ + protected void merge(File oldDir, File newDir) throws Exception { + log("Merging data from %s to %s\n", oldDir, newDir); + if (newDir.exists()) { + File[] rrdFiles = getFiles(oldDir, getRrdExtension()); + if (rrdFiles == null) { + log("Warning: there are no %s files on %s\n", getRrdExtension(), oldDir); + } else { + for (File source : rrdFiles) { + File dest = new File(newDir, source.getName()); + if (dest.exists()) { + if (isRrdToolEnabled()) { + mergeRrd(source, dest); + } else { + mergeJrb(source, dest); + } + } else { + log(" Warning: %s doesn't exist\n", dest); + } + } + } + try { + log(" removing old directory %s\n", oldDir.getName()); + FileUtils.deleteDirectory(oldDir); + } catch (Exception e) { + log(" Warning: can't delete old directory because %s", e.getMessage()); + } + } else { + try { + log(" moving %s to %s\n", oldDir.getName(), newDir.getName()); + FileUtils.moveDirectory(oldDir, newDir); + } catch (Exception e) { + log(" Warning: can't rename directory because %s", e.getMessage()); + } + } + } + + /** + * Merge RRDs. + * + * @param source the source RRD + * @param dest the destination RRD + * @throws Exception the exception + */ + protected void mergeRrd(File source, File dest) throws Exception { + log(" merging RRD %s into %s\n", source, dest); + RRDv3 rrdSrc = RrdConvertUtils.dumpRrd(source); + RRDv3 rrdDst = RrdConvertUtils.dumpRrd(dest); + if (rrdSrc == null || rrdDst == null) { + log(" Warning: can't load RRDs (ingoring merge).\n"); + return; + } + rrdDst.merge(rrdSrc); + final File outputFile = new File(dest.getCanonicalPath() + ".merged"); + RrdConvertUtils.restoreRrd(rrdDst, outputFile); + if (dest.exists()) { + FileUtils.deleteQuietly(dest); + } + FileUtils.moveFile(outputFile, dest); + } + + /** + * Merge JRBs. + * + * @param source the source JRB + * @param dest the destination JRB + */ + protected void mergeJrb(File source, File dest) throws Exception { + log(" merging JRB %s into %s\n", source, dest); + RRDv1 rrdSrc = RrdConvertUtils.dumpJrb(source); + RRDv1 rrdDst = RrdConvertUtils.dumpJrb(dest); + if (rrdSrc == null || rrdDst == null) { + log(" Warning: can't load JRBs (ingoring merge).\n"); + return; + } + rrdDst.merge(rrdSrc); + final File outputFile = new File(dest.getCanonicalPath() + ".merged"); + RrdConvertUtils.restoreJrb(rrdDst, outputFile); + if (dest.exists()) { + FileUtils.deleteQuietly(dest); + } + FileUtils.moveFile(outputFile, dest); + } + + /** + * Gets the node directory. + * + * @param nodeId the node id + * @param foreignSource the foreign source + * @param foreignId the foreign id + * @return the node directory + */ + protected File getNodeDirectory(int nodeId, String foreignSource, String foreignId) { + File dir = new File(DataCollectionConfigFactory.getInstance().getRrdPath(), String.valueOf(nodeId)); + if (Boolean.getBoolean("org.opennms.rrd.storeByForeignSource") && !(foreignSource == null) && !(foreignId == null)) { + File fsDir = new File(DataCollectionConfigFactory.getInstance().getRrdPath(), "fs" + File.separatorChar + foreignSource); + dir = new File(fsDir, foreignId); + } + return dir; + } + +} diff --git a/core/upgrade/src/main/java/org/opennms/upgrade/implementations/SnmpInterfaceUpgrade.java b/core/upgrade/src/main/java/org/opennms/upgrade/implementations/SnmpInterfaceUpgrade.java new file mode 100644 index 000000000000..5ab36b56bf52 --- /dev/null +++ b/core/upgrade/src/main/java/org/opennms/upgrade/implementations/SnmpInterfaceUpgrade.java @@ -0,0 +1,302 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.implementations; + +import java.io.File; +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.opennms.core.utils.RrdLabelUtils; +import org.opennms.netmgt.config.DataCollectionConfigFactory; +import org.opennms.netmgt.model.OnmsResource; + +/** + * The Class SnmpInterfaceUpgrade. + * + * @author Alejandro Galue + */ +public class SnmpInterfaceUpgrade { + + /** The node's directory. */ + private File nodeDir; + + /** The node's id. */ + private int nodeId; + + /** The node's foreign id. */ + private String foreignId; + + /** The node's foreign source. */ + private String foreignSource; + + /** The SNMP interface name. */ + private String ifName; + + /** The SNMP interface description. */ + private String ifDescr; + + /** The SNMP physical address. */ + private String physAddr; + + /** The old RRD label. */ + private String oldRrdLabel; + + /** The new RRD label. */ + private String newRrdLabel; + + /** The store by foreign source. */ + private boolean storeByForeignSource; + + /** + * Instantiates a new SNMP interface upgrade. + * + * @param rs the ResultSet + * @param storeByForeignSource true, if the store by foreign source is enabled + * @throws SQLException the sQL exception + */ + public SnmpInterfaceUpgrade(ResultSet rs, boolean storeByForeignSource) throws SQLException { + nodeId = rs.getInt("nodeid"); + foreignSource = rs.getString("foreignsource"); + foreignId = rs.getString("foreignid"); + ifDescr = rs.getString("snmpifdescr"); + ifName = rs.getString("snmpifname"); + physAddr = rs.getString("snmpphysaddr"); + this.storeByForeignSource = storeByForeignSource; + initialize(); + } + + /** + * Instantiates a new SNMP interface upgrade. + * + * @param nodeId the node id + * @param foreignSource the foreign source + * @param foreignId the foreign id + * @param ifDescr the SNMP interface description + * @param ifName the SNMP interface name + * @param physAddr the SNMP physical address + * @param storeByForeignSource true, if store by foreign source is enabled + */ + public SnmpInterfaceUpgrade(int nodeId, String foreignSource, + String foreignId, String ifDescr, String ifName, + String physAddr, boolean storeByForeignSource) { + this.nodeId = nodeId; + this.foreignSource = foreignSource; + this.foreignId = foreignId; + this.ifDescr = ifDescr; + this.ifName = ifName; + this.physAddr = physAddr; + this.storeByForeignSource = storeByForeignSource; + initialize(); + } + + /** + * Initialize. + */ + private void initialize() { + oldRrdLabel = RrdLabelUtils.computeLabelForRRD(ifName, ifDescr, null); + newRrdLabel = RrdLabelUtils.computeLabelForRRD(ifName, ifDescr, physAddr); + nodeDir = getNodeDirectory(nodeId, foreignSource, foreignId); + } + + /** + * Gets the node directory. + * + * @return the node directory + */ + public File getNodeDir() { + return nodeDir; + } + + /** + * Gets the old interface directory. + * + * @return the old interface directory + */ + public File getOldInterfaceDir() { + return new File(getNodeDir(), getOldRrdLabel()); + } + + /** + * Gets the new interface directory. + * + * @return the new interface directory + */ + public File getNewInterfaceDir() { + return new File(getNodeDir(), getNewRrdLabel()); + } + + /** + * Gets the node id. + * + * @return the node id + */ + public int getNodeId() { + return nodeId; + } + + /** + * Gets the foreign id. + * + * @return the foreign id + */ + public String getForeignId() { + return foreignId; + } + + /** + * Gets the foreign source. + * + * @return the foreign source + */ + public String getForeignSource() { + return foreignSource; + } + + /** + * Gets the interface name. + * + * @return the interface name + */ + public String getIfName() { + return ifName; + } + + /** + * Gets the interface description. + * + * @return the interface description + */ + public String getIfDescr() { + return ifDescr; + } + + /** + * Gets the physical address. + * + * @return the physical address + */ + public String getPhysAddr() { + return physAddr; + } + + /** + * Gets the old RRD label. + * + * @return the old RRD label + */ + public String getOldRrdLabel() { + return oldRrdLabel; + } + + /** + * Gets the new RRD label. + * + * @return the new RRD label + */ + public String getNewRrdLabel() { + return newRrdLabel; + } + + /** + * Checks if the interface directories should be merged + * + * @return true, if the interface directory should be merged + */ + public boolean shouldMerge() { + // An SnmpInterfaceUpgrade entry only exist for SNMP interfaces with MAC Address. + // For this reason, if the old directory exist, that means, the interface statistics must be merged. + return getOldInterfaceDir().exists(); + } + + /** + * Gets the old resource id. + * + * @return the old resource id + */ + public String getOldResourceId() { + return getResourceId(oldRrdLabel); + } + + /** + * Gets the new resource id. + * + * @return the new resource id + */ + public String getNewResourceId() { + return getResourceId(newRrdLabel); + } + + /** + * Gets the resource id. + * + * @param label the label + * @return the resource id + */ + private String getResourceId(String label) { + String parentType = storeByForeignSource ? "nodeSource" : "node"; + String parentId = storeByForeignSource ? foreignSource + ':' + foreignId : Integer.toString(nodeId); + return OnmsResource.createResourceId(parentType, parentId, "interfaceSnmp", label); + } + + /** + * Checks if the resourceId should be updated. + * + * @param resourceId the resource id to check + * @return true, if the resource should be updated + */ + public boolean shouldUpdate(String resourceId) { + return resourceId.endsWith("interfaceSnmp[" + oldRrdLabel + "]"); + } + + /** + * Gets the node directory. + * + * @param nodeId the node id + * @param foreignSource the foreign source + * @param foreignId the foreign id + * @return the node directory + */ + protected File getNodeDirectory(int nodeId, String foreignSource, String foreignId) { + String rrdPath = DataCollectionConfigFactory.getInstance().getRrdPath(); + File dir = new File(rrdPath, String.valueOf(nodeId)); + if (Boolean.getBoolean("org.opennms.rrd.storeByForeignSource") && !(foreignSource == null) && !(foreignId == null)) { + File fsDir = new File(rrdPath, "fs" + File.separatorChar + foreignSource); + dir = new File(fsDir, foreignId); + } + return dir; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Interface[ifName=" + getIfName() + ", nodeId=" + getNodeId() + ", foreignSource=" + getForeignSource() + ", foreignId=" + getForeignId() + "]"; + } + +} diff --git a/core/upgrade/src/main/java/org/opennms/upgrade/support/Upgrade.java b/core/upgrade/src/main/java/org/opennms/upgrade/support/Upgrade.java new file mode 100644 index 000000000000..c0f1ffc8c174 --- /dev/null +++ b/core/upgrade/src/main/java/org/opennms/upgrade/support/Upgrade.java @@ -0,0 +1,264 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.support; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Set; + +import org.opennms.core.utils.FuzzyDateFormatter; +import org.opennms.netmgt.vmmgr.ControllerUtils; +import org.opennms.upgrade.api.Ignore; +import org.opennms.upgrade.api.OnmsUpgrade; +import org.opennms.upgrade.api.OnmsUpgradeComparator; +import org.opennms.upgrade.api.OnmsUpgradeException; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; +import org.springframework.core.type.filter.AssignableTypeFilter; + +/** + * The Class Upgrade. + *

This is the helper class that is going to be instantiated from outside OpenNMS to perform the upgrade operations.

+ * + * @author Alejandro Galue + */ +public class Upgrade { + + /** The class scope. */ + private String classScope = "org/opennms/upgrade"; // To avoid issues with OSGi and other classes. + + /** The upgrade status object. */ + private UpgradeStatus upgradeStatus; + + /** + * Gets the upgrade status. + * + * @return the upgrade status + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + public UpgradeStatus getUpgradeStatus() throws OnmsUpgradeException { + if (upgradeStatus == null) { + upgradeStatus = new UpgradeStatus(); + } + return upgradeStatus; + } + + /** + * Sets the upgrade status. + * + * @param upgradeStatus the new upgrade status + */ + public void setUpgradeStatus(UpgradeStatus upgradeStatus) { + this.upgradeStatus = upgradeStatus; + } + + /** + * Gets the class scope. + * + * @return the class scope + */ + public String getClassScope() { + return classScope; + } + + /** + * Sets the class scope. + * + * @param classScope the new class scope + */ + public void setClassScope(String classScope) { + this.classScope = classScope; + } + + /** + * Checks if is OpenNMS running. + * + * @return true, if is OpenNMS running + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected boolean isOpennmsRunning() { + try { + return ControllerUtils.getController().status() == 0; + } catch (Exception e) { + log("Warning: can't retrieve OpeNNMS status (assuming it is not running).\n"); + return false; + } + } + + /** + * Was executed. + * + * @param upg the upgrade implementation class + * @return true, if successful + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected boolean wasExecuted(OnmsUpgrade upg) throws OnmsUpgradeException { + return getUpgradeStatus().wasExecuted(upg); + } + + /** + * Execute upgrade. + * + * @param upg the upgrade implementation class + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected void executeUpgrade(OnmsUpgrade upg) { + Date start = new Date(); + try { + if (wasExecuted(upg)) { + log(" Task %s has been executed at %s\n", upg.getId(), getUpgradeStatus().getLastExecutionTime(upg)); + return; + } + log("- Running pre-execution phase\n"); + upg.preExecute(); + } catch (OnmsUpgradeException e) { + log(" Ignoring: %s\n", e.getMessage()); + return; + } + try { + log("- Running execution phase\n"); + upg.execute(); + log("- Saving the execution state\n"); + markAsExecuted(upg); + } catch (OnmsUpgradeException executeException) { + log(" Warning: can't perform the upgrade operation because: %s\n", executeException.getMessage()); + try { + log("- Executing rollback phase\n"); + upg.rollback(); + } catch (OnmsUpgradeException rollbackException) { + log(" Warning: can't rollback the upgrade because: %s\n", rollbackException.getMessage()); + rollbackException.printStackTrace(); + } + } + try { + log("- Running post-execution phase\n"); + upg.postExecute(); + } catch (OnmsUpgradeException e) { + log(" Warning: can't run the post-execute phase because: %s\n", e.getMessage()); + } + log("\nFinished in %s\n\n", FuzzyDateFormatter.calculateDifference(start, new Date())); + } + + /** + * Mark as executed. + * + * @param upg the upgrade implementation class + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected void markAsExecuted(OnmsUpgrade upg) throws OnmsUpgradeException { + getUpgradeStatus().markAsExecuted(upg); + } + + /** + * Log. + * + * @param msgFormat the message format + * @param args the message's arguments + */ + protected void log(String msgFormat, Object... args) { + System.out.printf(msgFormat, args); + } + + /** + * Gets the upgrade objects. + * + * @return the upgrade objects + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + protected List getUpgradeObjects() throws OnmsUpgradeException { + List upgrades = new ArrayList(); + try { + ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true); + provider.addIncludeFilter(new AssignableTypeFilter(OnmsUpgrade.class)); + Set components = provider.findCandidateComponents(getClassScope()); + for (BeanDefinition component : components) { + if (component.isAbstract()) { + continue; + } + Class cls = Class.forName(component.getBeanClassName()); + if (cls.getAnnotation(Ignore.class) != null) { + continue; + } + OnmsUpgrade upgrade = (OnmsUpgrade) cls.newInstance(); + upgrades.add(upgrade); + log("Found upgrade task %s\n", upgrade.getId()); + } + Collections.sort(upgrades, new OnmsUpgradeComparator()); + } catch (Exception e) { + throw new OnmsUpgradeException(" Can't find the upgrade classes because: " + e.getMessage(), e); + } + return upgrades; + } + + /** + * Execute. + *

Perform the upgrade operations.

+ * + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + public void execute() throws OnmsUpgradeException { + log("\n==============================================================================\n"); + log("OpenNMS Upgrader"); + log("\n==============================================================================\n\n"); + log("OpenNMS is currently %s\n", (isOpennmsRunning() ? "running" : "stopped")); + List upgradeObjects = getUpgradeObjects(); + for (OnmsUpgrade upg : upgradeObjects) { + log("Processing %s: %s\n", upg.getId(), upg.getDescription()); + if (isOpennmsRunning()) { + if (upg.requiresOnmsRunning()) { + executeUpgrade(upg); + } else { + log(" Task %s requires that OpenNMS is stopped but it is running (ignoring)\n", upg.getId()); + } + } else { + if (upg.requiresOnmsRunning()) { + log(" Task %s requires OpenNMS is running but it is stopped (ignoring)\n", upg.getId()); + } else { + executeUpgrade(upg); + } + } + } + log("\nUpgrade completed successfully!\n"); + } + + /** + * The main method. + *

This is the class that must be called externally to perform the upgrade.

+ * + * TODO: be able to pass the class scope (package filter) + * TODO: be able to pass the execution status file + * + * @param args the arguments + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + public static void main(String args[]) throws OnmsUpgradeException { + new Upgrade().execute(); + } +} diff --git a/core/upgrade/src/main/java/org/opennms/upgrade/support/UpgradeStatus.java b/core/upgrade/src/main/java/org/opennms/upgrade/support/UpgradeStatus.java new file mode 100644 index 000000000000..f9755949a859 --- /dev/null +++ b/core/upgrade/src/main/java/org/opennms/upgrade/support/UpgradeStatus.java @@ -0,0 +1,130 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.support; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.util.Date; +import java.util.Properties; + +import org.opennms.core.utils.ConfigFileConstants; +import org.opennms.upgrade.api.OnmsUpgrade; +import org.opennms.upgrade.api.OnmsUpgradeException; + +/** + * The Class UpgradeStatus. + * + * @author Alejandro Galue + */ +public class UpgradeStatus { + + /** The Constant STATUS_FILE. */ + public static final String STATUS_FILE = "opennms-upgrade-status.properties"; + + /** The status properties. */ + private Properties status; + + /** The status file. */ + private File statusFile; + + /** + * Instantiates a new upgrade status. + * + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + public UpgradeStatus() throws OnmsUpgradeException { + this(new File(ConfigFileConstants.getFilePathString() + STATUS_FILE)); + } + + /** + * Instantiates a new upgrade status. + * + * @param statusFile the status file + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + public UpgradeStatus(File statusFile) throws OnmsUpgradeException { + this.statusFile = statusFile; + status = new Properties(); + try { + if (statusFile.exists()) { + status.load(new FileReader(statusFile)); + } + } catch (Exception e) { + throw new OnmsUpgradeException("Can't load upgrade status data.", e); + } + } + + /** + * Was executed. + * + * @param upg the upgrade implementation class + * @return true, if successful + */ + public boolean wasExecuted(OnmsUpgrade upg) { + for (Object obj : status.keySet()) { + String cls = (String) obj; + if (cls.equals(upg.getId())) { + return true; + } + } + return false; + } + + /** + * Gets the last execution time. + * + * @param upg the upgrade implementation class + * @return the last execution time + */ + public String getLastExecutionTime(OnmsUpgrade upg) { + for (Object obj : status.keySet()) { + String cls = (String) obj; + if (cls.equals(upg.getId())) { + return status.getProperty(cls); + } + } + return "Never"; + } + + /** + * Mark as executed. + * + * @param upg the upgrade implementation class + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + public void markAsExecuted(OnmsUpgrade upg) throws OnmsUpgradeException { + status.put(upg.getId(), new Date().toString()); + try { + status.store(new FileWriter(statusFile), null); + } catch (Exception e) { + throw new OnmsUpgradeException("Can't save upgrade status.", e); + } + } + +} diff --git a/core/upgrade/src/test/java/org/opennms/upgrade/api/AbstractOnmsUpgradeTest.java b/core/upgrade/src/test/java/org/opennms/upgrade/api/AbstractOnmsUpgradeTest.java new file mode 100644 index 000000000000..6f7282780671 --- /dev/null +++ b/core/upgrade/src/test/java/org/opennms/upgrade/api/AbstractOnmsUpgradeTest.java @@ -0,0 +1,96 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.api; + +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.Test; + +/** + * The Test Class for AbstractOnmsUpgrade. + * + * @author Alejandro Galue + */ +public class AbstractOnmsUpgradeTest { + + /** The task. */ + private MockOnmsUpgrade task; + + /** + * Sets up the test. + * + * @throws Exception the exception + */ + @Before + public void setUp() throws Exception { + System.setProperty("opennms.home", "src/test/resources"); + task = new MockOnmsUpgrade(); + } + + /** + * Test properties. + * + * @throws Exception the exception + */ + @Test + public void testProperties() throws Exception { + Assert.assertEquals(task.getClass().getSimpleName(), task.getId()); + Assert.assertEquals("src/test/resources", task.getHomeDirectory()); + Assert.assertEquals("1.12.2", task.getOpennmsVersion()); + Assert.assertEquals(".jrb", task.getRrdExtension()); + Assert.assertTrue(task.isInstalledVersionGreaterOrEqual(1, 8, 17)); + Assert.assertTrue(task.isInstalledVersionGreaterOrEqual(1, 10, 13)); + Assert.assertTrue(task.isInstalledVersionGreaterOrEqual(1, 12, 1)); + Assert.assertFalse(task.isInstalledVersionGreaterOrEqual(1, 12, 3)); + Assert.assertFalse(task.isInstalledVersionGreaterOrEqual(1, 13, 0)); + Assert.assertFalse(task.isRrdToolEnabled()); + Assert.assertFalse(task.isStoreByGroupEnabled()); + } + + /** + * Test ZIP and UNZIP directory. + * + * @throws Exception the exception + */ + @Test + public void testZipAndUnzipDirectory() throws Exception { + task.testZipAndUnzipDirectory(); + } + + /** + * Test ZIP and UNZIP file. + * + * @throws Exception the exception + */ + @Test + public void testZipAndUnzipFile() throws Exception { + task.testZipAndUnzipFile(); + } + +} diff --git a/core/upgrade/src/test/java/org/opennms/upgrade/api/MockOnmsUpgrade.java b/core/upgrade/src/test/java/org/opennms/upgrade/api/MockOnmsUpgrade.java new file mode 100644 index 000000000000..dacb52e3d47d --- /dev/null +++ b/core/upgrade/src/test/java/org/opennms/upgrade/api/MockOnmsUpgrade.java @@ -0,0 +1,138 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.api; + +import java.io.File; + +import org.apache.commons.io.FileUtils; +import org.junit.Assert; + +/** + * The test implementation of AbstractOnmsUpgrade. + * + * @author Alejandro Galue + */ +public class MockOnmsUpgrade extends AbstractOnmsUpgrade { + + /** The Constant TEST_ZIP. */ + public final static File TEST_ZIP = new File("target/zip-test.zip"); + + /** + * Instantiates a new mock onms upgrade. + * + * @throws OnmsUpgradeException the onms upgrade exception + */ + public MockOnmsUpgrade() throws OnmsUpgradeException { + super(); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getOrder() + */ + @Override + public int getOrder() { + return 1; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getDescription() + */ + @Override + public String getDescription() { + return "Mock Upgrade"; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#preExecute() + */ + @Override + public void preExecute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#postExecute() + */ + @Override + public void postExecute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#rollback() + */ + @Override + public void rollback() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#execute() + */ + @Override + public void execute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#requiresOnmsRunning() + */ + @Override + public boolean requiresOnmsRunning() { + return false; + } + + /** + * Test Zip and Unzip directory. + * + * @throws Exception the exception + */ + public void testZipAndUnzipDirectory() throws Exception { + zipDir(TEST_ZIP, new File("src/main/java")); + File output = new File("target/zip-test"); + unzipFile(TEST_ZIP, output); + Assert.assertTrue(new File(output, "org/opennms/upgrade/api/OnmsUpgrade.java").exists()); + FileUtils.deleteDirectory(output); + } + + /** + * Test Zip and Unzip file. + * + * @throws Exception the exception + */ + public void testZipAndUnzipFile() throws Exception { + File output = new File("target/zip-test"); + File srcFile = new File("src/main/java/org/opennms/upgrade/api/OnmsUpgrade.java"); + File dstFile = new File(output, "/org/opennms/upgrade/api/OnmsUpgrade.java"); + FileUtils.copyFile(srcFile, dstFile); + zipFile(dstFile); + File zip = new File(dstFile.getAbsoluteFile() + ".zip"); + Assert.assertTrue(zip.exists()); + FileUtils.deleteQuietly(dstFile); + unzipFile(zip, output); + Assert.assertTrue(new File(output, "OnmsUpgrade.java").exists()); + FileUtils.deleteDirectory(output);; + } + +} diff --git a/core/upgrade/src/test/java/org/opennms/upgrade/implementations/JmxRrdMigratorOfflineTest.java b/core/upgrade/src/test/java/org/opennms/upgrade/implementations/JmxRrdMigratorOfflineTest.java new file mode 100644 index 000000000000..8ebac66e611a --- /dev/null +++ b/core/upgrade/src/test/java/org/opennms/upgrade/implementations/JmxRrdMigratorOfflineTest.java @@ -0,0 +1,212 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.implementations; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.FilenameFilter; +import java.util.Arrays; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.LineIterator; +import org.jrobin.core.RrdDb; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * The Test Class for JmxRrdMigratorOffline. + * + * @author Alejandro Galue + */ +public class JmxRrdMigratorOfflineTest { + + /** + * Sets up the test. + * + * @throws Exception the exception + */ + @Before + public void setUp() throws Exception { + FileUtils.copyDirectory(new File("src/test/resources/etc"), new File("target/home/etc")); + FileUtils.copyDirectory(new File("src/test/resources/jetty-webapps/opennms/WEB-INF"), new File("target/home/jetty-webapps/opennms/WEB-INF/")); + System.setProperty("opennms.home", "target/home"); + } + + /** + * Tear down the test. + * + * @throws Exception the exception + */ + @After + public void tearDown() throws Exception { + FileUtils.deleteDirectory(new File("target/home")); + } + + /** + * Test upgrade (single-metric JRBs, i.e. storeByGroup=false). + * + * @throws Exception the exception + */ + @Test + public void testUpgradeSingleMetric() throws Exception { + FileUtils.copyDirectory(new File("src/test/resources/rrd"), new File("target/home/rrd")); + + JmxRrdMigratorOffline jmxMigrator = executeMigrator(); + + File rrdDir = new File("target/home/rrd/1/opennms-jvm/"); + for (File file : getFiles(rrdDir, ".jrb")) { + RrdDb jrb = new RrdDb(file, true); + String ds = jrb.getDsNames()[0]; + jrb.close(); + Assert.assertFalse(ds.contains(".")); + Assert.assertEquals(file.getName(), ds + ".jrb"); + Assert.assertEquals(ds, jmxMigrator.getFixedDsName(ds)); + } + for (File file : getFiles(rrdDir, ".meta")) { + String ds = file.getName().replaceFirst("\\.meta", ""); + Properties p = new Properties(); + p.load(new FileReader(file)); + for (Object o : p.keySet()) { + String key = (String) o; + Assert.assertTrue(key.endsWith(ds)); + Assert.assertEquals(ds, p.getProperty(key)); + } + } + } + + /** + * Test upgrade (multi-metric JRBs, i.e. storeByGroup=true). + * + * @throws Exception the exception + */ + @Test + public void testUpgradeMultiMetric() throws Exception { + FileUtils.copyDirectory(new File("src/test/resources/rrd2"), new File("target/home/rrd")); + + File config = new File("target/home/etc/opennms.properties"); + Properties p = new Properties(); + p.load(new FileReader(config)); + p.setProperty("org.opennms.rrd.storeByGroup", "true"); + p.store(new FileWriter(config), null); + + executeMigrator(); + + File jrbFile = new File("target/home/rrd/1/opennms-jvm/java_lang_type_MemoryPool_name_Survivor_Space.jrb"); + Assert.assertTrue(jrbFile.exists()); + RrdDb jrb = new RrdDb(jrbFile, true); + String[] dataSources = jrb.getDsNames(); + jrb.close(); + + Properties dsProp = new Properties(); + dsProp.load(new FileReader("target/home/rrd/1/opennms-jvm/ds.properties")); + + Properties meta = new Properties(); + meta.load(new FileReader("target/home/rrd/1/opennms-jvm/java_lang_type_MemoryPool_name_Survivor_Space.meta")); + + for (String ds : dataSources) { + Assert.assertFalse(ds.contains(".")); + Assert.assertEquals("java_lang_type_MemoryPool_name_Survivor_Space", dsProp.getProperty(ds)); + Assert.assertEquals(ds, meta.getProperty("JMX_java.lang:type=MemoryPool.name.Survivor Space." + ds)); + } + } + + /** + * Executes the JMX Migrator. + * + * @return the JMX Migrator object + * @throws Exception the exception + */ + private JmxRrdMigratorOffline executeMigrator() throws Exception { + JmxRrdMigratorOffline jmxMigrator = new JmxRrdMigratorOffline(); + jmxMigrator.preExecute(); + jmxMigrator.execute(); + jmxMigrator.postExecute(); + Assert.assertEquals(60, jmxMigrator.badMetrics.size()); + + // Verify graph templates + File templates = new File("target/home/etc/snmp-graph.properties.d/jvm-graph.properties"); + Pattern defRegex = Pattern.compile("DEF:.+:(.+\\..+):"); + Pattern colRegex = Pattern.compile("\\.columns=(.+)$"); + for (LineIterator it = FileUtils.lineIterator(templates); it.hasNext();) { + String line = it.next(); + Matcher m = defRegex.matcher(line); + if (m.find()) { + String ds = m.group(1); + if (jmxMigrator.badMetrics.contains(ds)) { + Assert.fail("Bad metric found"); + } + } + m = colRegex.matcher(line); + if (m.find()) { + String[] badColumns = m.group(1).split(",(\\s)?"); + if (jmxMigrator.badMetrics.containsAll(Arrays.asList(badColumns))) { + Assert.fail("Bad metric found"); + } + } + } + + // Verify metric definitions + File metrics = new File("target/home/etc/jmx-datacollection-config.xml"); + Pattern aliasRegex = Pattern.compile("alias=\"([^\"]+\\.[^\"]+)\""); + for (LineIterator it = FileUtils.lineIterator(metrics); it.hasNext();) { + String line = it.next(); + Matcher m = aliasRegex.matcher(line); + if (m.find()) { + String ds = m.group(1); + if (jmxMigrator.badMetrics.contains(ds)) { + Assert.fail("Bad metric found"); + } + } + } + + return jmxMigrator; + } + + /** + * Gets the files. + * + * @param resourceDir the resource directory + * @param ext the extension + * @return the files + */ + private File[] getFiles(final File resourceDir, final String ext) { + return resourceDir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.toLowerCase().endsWith(ext); + } + }); + } + +} diff --git a/core/upgrade/src/test/java/org/opennms/upgrade/implementations/SnmpInterfaceRrdMigratorOnlineTest.java b/core/upgrade/src/test/java/org/opennms/upgrade/implementations/SnmpInterfaceRrdMigratorOnlineTest.java new file mode 100644 index 000000000000..8672c3e1be4e --- /dev/null +++ b/core/upgrade/src/test/java/org/opennms/upgrade/implementations/SnmpInterfaceRrdMigratorOnlineTest.java @@ -0,0 +1,126 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.implementations; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.io.FileUtils; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.opennms.netmgt.config.DataCollectionConfigFactory; +import org.opennms.netmgt.config.DefaultDataCollectionConfigDao; +import org.opennms.netmgt.rrd.model.Row; +import org.opennms.netmgt.rrd.model.RrdConvertUtils; +import org.opennms.netmgt.rrd.model.v1.RRDv1; +import org.opennms.upgrade.api.OnmsUpgradeException; +import org.springframework.core.io.FileSystemResource; + +/** + * The Test Class for SnmpInterfaceRrdMigratorOnline. + * + * @author Alejandro Galue + */ +public class SnmpInterfaceRrdMigratorOnlineTest { + + /** + * Sets up the test. + * + * @throws Exception the exception + */ + @Before + public void setUp() throws Exception { + FileUtils.copyDirectory(new File("src/test/resources/etc"), new File("target/home/etc")); + FileUtils.copyDirectory(new File("src/test/resources/rrd"), new File("target/home/rrd")); + FileUtils.copyDirectory(new File("src/test/resources/jetty-webapps/opennms/WEB-INF"), new File("target/home/jetty-webapps/opennms/WEB-INF/")); + System.setProperty("opennms.home", "target/home"); + DefaultDataCollectionConfigDao dao = new DefaultDataCollectionConfigDao(); + dao.setConfigResource(new FileSystemResource(new File("target/home/etc/datacollection-config.xml"))); + dao.afterPropertiesSet(); + DataCollectionConfigFactory.setInstance(dao); + } + + /** + * Tear down the test. + * + * @throws Exception the exception + */ + @After + public void tearDown() throws Exception { + FileUtils.deleteDirectory(new File("target/home")); + } + + /** + * Test upgrade. + * + * @throws Exception the exception + */ + @Test + public void testUpgrade() throws Exception { + // Check Current JRBs + RRDv1 rrd = RrdConvertUtils.dumpJrb(new File("target/home/rrd/1/eth0/ifInOctets.jrb")); + Row r = rrd.findRowByTimestamp(rrd.getRras().get(0), 1381500900l); + Assert.assertNotNull(r); + Assert.assertEquals(new Double(-6.0), r.getValues().get(0)); + r = rrd.findRowByTimestamp(rrd.getRras().get(0), 1381512300l); + Assert.assertNull(r); + + rrd = RrdConvertUtils.dumpJrb(new File("target/home/rrd/1/eth0-005056c00008/ifInOctets.jrb")); + r = rrd.findRowByTimestamp(rrd.getRras().get(0), 1381500900l); + Assert.assertNotNull(r); + Assert.assertTrue(r.getValues().get(0).isNaN()); + r = rrd.findRowByTimestamp(rrd.getRras().get(0), 1381512300l); + Assert.assertNotNull(r); + Assert.assertEquals(new Double(12.0), r.getValues().get(0)); + + // Perform Migration + SnmpInterfaceRrdMigratorOnline obj = new SnmpInterfaceRrdMigratorOnline() { + protected List getInterfacesToMerge() throws OnmsUpgradeException { + List interfaces = new ArrayList(); + interfaces.add(new SnmpInterfaceUpgrade(1, null, null, "eth0", "eth0", "005056c00008", false)); + return interfaces; + } + }; + obj.preExecute(); + obj.execute(); + obj.postExecute(); + + // Check Merged JRB + rrd = RrdConvertUtils.dumpJrb(new File("target/home/rrd/1/eth0-005056c00008/ifInOctets.jrb")); + r = rrd.findRowByTimestamp(rrd.getRras().get(0), 1381500900l); + Assert.assertNotNull(r); + Assert.assertEquals(new Double(-6.0), r.getValues().get(0)); + r = rrd.findRowByTimestamp(rrd.getRras().get(0), 1381512300l); + Assert.assertNotNull(r); + Assert.assertEquals(new Double(12.0), r.getValues().get(0)); + } + +} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/SaveOrUpdateOperation.java b/core/upgrade/src/test/java/org/opennms/upgrade/support/UpgradeHelper.java similarity index 53% rename from opennms-import/src/main/java/org/opennms/netmgt/importer/operations/SaveOrUpdateOperation.java rename to core/upgrade/src/test/java/org/opennms/upgrade/support/UpgradeHelper.java index 85432581746a..0ee9b7157b15 100644 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/SaveOrUpdateOperation.java +++ b/core/upgrade/src/test/java/org/opennms/upgrade/support/UpgradeHelper.java @@ -25,50 +25,58 @@ * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ +package org.opennms.upgrade.support; -package org.opennms.netmgt.importer.operations; - -import org.opennms.netmgt.importer.config.types.InterfaceSnmpPrimaryType; - +import java.util.ArrayList; +import java.util.List; /** - *

SaveOrUpdateOperation interface.

- * - * @author ranger - * @version $Id: $ + * The Class UpgradeHelper. + * + * @author Alejandro Galue */ -public interface SaveOrUpdateOperation extends ImportOperation{ +public class UpgradeHelper { + + /** The executed list. */ + public static List executed = new ArrayList(); + + /** The rolled-back list. */ + public static List rolledback = new ArrayList(); /** - *

foundInterface

+ * Gets the executed List. * - * @param ipAddr a {@link java.lang.String} object. - * @param descr a {@link java.lang.Object} object. - * @param interfaceSnmpPrimaryType a {@link InterfaceSnmpPrimaryType} object. - * @param managed a boolean. - * @param status a int. + * @return the upgrade order */ - void foundInterface(String ipAddr, Object descr, InterfaceSnmpPrimaryType interfaceSnmpPrimaryType, boolean managed, int status); + public static List getExecutedList() { + return executed; + } /** - *

foundMonitoredService

+ * Adds an executed class. * - * @param serviceName a {@link java.lang.String} object. + * @param upgradeId the upgrade id */ - void foundMonitoredService(String serviceName); + public static void addExecuted(String upgradeId) { + executed.add(upgradeId); + } /** - *

foundCategory

+ * Gets the rolled-back List. * - * @param name a {@link java.lang.String} object. + * @return the upgrade order */ - void foundCategory(String name); + public static List getRolledBackList() { + return rolledback; + } /** - *

foundAsset

+ * Adds an rolled-back class. * - * @param name a {@link java.lang.String} object. - * @param value a {@link java.lang.String} object. + * @param upgradeId the upgrade id */ - void foundAsset(String name, String value); + public static void addRolledBack(String upgradeId) { + rolledback.add(upgradeId); + } + } diff --git a/core/upgrade/src/test/java/org/opennms/upgrade/support/UpgradeTest.java b/core/upgrade/src/test/java/org/opennms/upgrade/support/UpgradeTest.java new file mode 100644 index 000000000000..abfe7f67edc6 --- /dev/null +++ b/core/upgrade/src/test/java/org/opennms/upgrade/support/UpgradeTest.java @@ -0,0 +1,113 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.support; + +import java.io.File; +import java.io.FileWriter; +import java.util.Date; +import java.util.Properties; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.opennms.upgrade.api.OnmsUpgradeException; +import org.opennms.upgrade.tests.TestUpgradeA; +import org.opennms.upgrade.tests.TestUpgradeB; +import org.opennms.upgrade.tests.TestUpgradeExecuted; +import org.opennms.upgrade.tests.TestUpgradeNothing; +import org.opennms.upgrade.tests.bad.TestUpgradeWIthException; + +/** + * The Class UpgradeTest. + * + * @author Alejandro Galue + */ +public class UpgradeTest { + + /** The status file. */ + private File statusFile; + + /** The upgrade status. */ + private UpgradeStatus upgradeStatus; + + /** + * Sets up the test. + * + * @throws Exception the exception + */ + @Before + public void setUp() throws Exception { + statusFile = new File("target/status.properties"); + Properties p = new Properties(); + p.put(new TestUpgradeExecuted().getId(), new Date().toString()); + p.store(new FileWriter(statusFile), null); + upgradeStatus = new UpgradeStatus(statusFile); + } + + /** + * Tear down the test. + * + * @throws Exception the exception + */ + @After + public void tearDown() throws Exception { + statusFile.delete(); + } + + /** + * Test upgrade. + * + * @throws Exception the exception + */ + @Test + public void testUpgrade() throws Exception { + Assert.assertFalse(upgradeStatus.wasExecuted(new TestUpgradeNothing())); + performUpgrade("org/opennms/upgrade/tests"); + Assert.assertTrue(upgradeStatus.wasExecuted(new TestUpgradeNothing())); + Assert.assertEquals(3, UpgradeHelper.getExecutedList().size()); + Assert.assertEquals(TestUpgradeNothing.class.getName(), UpgradeHelper.getExecutedList().get(0)); + Assert.assertEquals(TestUpgradeA.class.getName(), UpgradeHelper.getExecutedList().get(1)); + Assert.assertEquals(TestUpgradeB.class.getName(), UpgradeHelper.getExecutedList().get(2)); + Assert.assertEquals(1, UpgradeHelper.getRolledBackList().size()); + Assert.assertEquals(TestUpgradeWIthException.class.getName(), UpgradeHelper.getRolledBackList().get(0)); + } + + /** + * Perform upgrade. + * + * @param scope the scope + * @throws OnmsUpgradeException the OpenNMS upgrade exception + */ + private void performUpgrade(String scope) throws OnmsUpgradeException { + Upgrade upgrade = new Upgrade(); + upgrade.setClassScope(scope); + upgrade.setUpgradeStatus(upgradeStatus); + upgrade.execute(); + } +} diff --git a/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeA.java b/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeA.java new file mode 100644 index 000000000000..4f00e715d361 --- /dev/null +++ b/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeA.java @@ -0,0 +1,104 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.tests; + +import org.opennms.upgrade.api.OnmsUpgrade; +import org.opennms.upgrade.api.OnmsUpgradeException; +import org.opennms.upgrade.support.UpgradeHelper; + +/** + * The Class TestUpgradeA. + *

This is an example implementation for the JUnit tests.

+ * + * @author Alejandro Galue + */ +public class TestUpgradeA implements OnmsUpgrade { + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getOrder() + */ + @Override + public int getOrder() { + return 200; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getId() + */ + @Override + public String getId() { + return getClass().getName(); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getDescription() + */ + @Override + public String getDescription() { + return "Testing class A"; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#preExecute() + */ + @Override + public void preExecute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#postExecute() + */ + @Override + public void postExecute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#rollback() + */ + @Override + public void rollback() throws OnmsUpgradeException { + UpgradeHelper.addRolledBack(getId()); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#execute() + */ + @Override + public void execute() throws OnmsUpgradeException { + UpgradeHelper.addExecuted(getId()); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#requiresOnmsRunning() + */ + @Override + public boolean requiresOnmsRunning() { + return false; + } + +} diff --git a/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeB.java b/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeB.java new file mode 100644 index 000000000000..dbd864b888a1 --- /dev/null +++ b/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeB.java @@ -0,0 +1,104 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.tests; + +import org.opennms.upgrade.api.OnmsUpgrade; +import org.opennms.upgrade.api.OnmsUpgradeException; +import org.opennms.upgrade.support.UpgradeHelper; + +/** + * The Class TestUpgradeB. + *

This is an example implementation for the JUnit tests.

+ * + * @author Alejandro Galue + */ +public class TestUpgradeB implements OnmsUpgrade { + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getOrder() + */ + @Override + public int getOrder() { + return 300; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getId() + */ + @Override + public String getId() { + return getClass().getName(); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getDescription() + */ + @Override + public String getDescription() { + return "Testing class B"; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#preExecute() + */ + @Override + public void preExecute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#postExecute() + */ + @Override + public void postExecute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#rollback() + */ + @Override + public void rollback() throws OnmsUpgradeException { + UpgradeHelper.addRolledBack(getId()); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#execute() + */ + @Override + public void execute() throws OnmsUpgradeException { + UpgradeHelper.addExecuted(getId()); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#requiresOnmsRunning() + */ + @Override + public boolean requiresOnmsRunning() { + return false; + } + +} diff --git a/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeC.java b/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeC.java new file mode 100644 index 000000000000..969b346deb6b --- /dev/null +++ b/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeC.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.tests; + +import org.opennms.upgrade.api.OnmsUpgrade; +import org.opennms.upgrade.api.OnmsUpgradeException; +import org.opennms.upgrade.support.UpgradeHelper; + +/** + * The Class TestUpgradeC. + *

This is an example implementation for the JUnit tests.

+ *

This class should not be executed because it requires OpenNMS to be running.

+ * + * @author Alejandro Galue + */ +public class TestUpgradeC implements OnmsUpgrade { + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getOrder() + */ + @Override + public int getOrder() { + return 400; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getId() + */ + @Override + public String getId() { + return getClass().getName(); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getDescription() + */ + @Override + public String getDescription() { + return "Testing class C"; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#preExecute() + */ + @Override + public void preExecute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#postExecute() + */ + @Override + public void postExecute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#rollback() + */ + @Override + public void rollback() throws OnmsUpgradeException { + UpgradeHelper.addRolledBack(getId()); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#execute() + */ + @Override + public void execute() throws OnmsUpgradeException { + UpgradeHelper.addExecuted(getId()); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#requiresOnmsRunning() + */ + @Override + public boolean requiresOnmsRunning() { + return true; + } + +} diff --git a/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeExecuted.java b/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeExecuted.java new file mode 100644 index 000000000000..45d1c2c5f5c4 --- /dev/null +++ b/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeExecuted.java @@ -0,0 +1,104 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.tests; + +import org.opennms.upgrade.api.OnmsUpgrade; +import org.opennms.upgrade.api.OnmsUpgradeException; +import org.opennms.upgrade.support.UpgradeHelper; + +/** + * The Class TestUpgradeExecuted. + *

This is an example implementation for the JUnit tests.

+ * + * @author Alejandro Galue + */ +public class TestUpgradeExecuted implements OnmsUpgrade { + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getOrder() + */ + @Override + public int getOrder() { + return 1; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getId() + */ + @Override + public String getId() { + return getClass().getName(); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getDescription() + */ + @Override + public String getDescription() { + return "Testing class executed"; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#preExecute() + */ + @Override + public void preExecute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#postExecute() + */ + @Override + public void postExecute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#rollback() + */ + @Override + public void rollback() throws OnmsUpgradeException { + UpgradeHelper.addRolledBack(getId()); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#execute() + */ + @Override + public void execute() throws OnmsUpgradeException { + UpgradeHelper.addExecuted(getId()); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#requiresOnmsRunning() + */ + @Override + public boolean requiresOnmsRunning() { + return false; + } + +} diff --git a/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeNothing.java b/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeNothing.java new file mode 100644 index 000000000000..8c710b7e3f1e --- /dev/null +++ b/core/upgrade/src/test/java/org/opennms/upgrade/tests/TestUpgradeNothing.java @@ -0,0 +1,104 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.tests; + +import org.opennms.upgrade.api.OnmsUpgrade; +import org.opennms.upgrade.api.OnmsUpgradeException; +import org.opennms.upgrade.support.UpgradeHelper; + +/** + * The Class TestUpgradeNothing. + *

This is an example implementation for the JUnit tests.

+ * + * @author Alejandro Galue + */ +public class TestUpgradeNothing implements OnmsUpgrade { + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getOrder() + */ + @Override + public int getOrder() { + return 100; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getId() + */ + @Override + public String getId() { + return getClass().getName(); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getDescription() + */ + @Override + public String getDescription() { + return "Testing class - do nothing"; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#preExecute() + */ + @Override + public void preExecute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#postExecute() + */ + @Override + public void postExecute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#rollback() + */ + @Override + public void rollback() throws OnmsUpgradeException { + UpgradeHelper.addRolledBack(getId()); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#execute() + */ + @Override + public void execute() throws OnmsUpgradeException { + UpgradeHelper.addExecuted(getId()); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#requiresOnmsRunning() + */ + @Override + public boolean requiresOnmsRunning() { + return false; + } + +} diff --git a/core/upgrade/src/test/java/org/opennms/upgrade/tests/bad/TestAbstract.java b/core/upgrade/src/test/java/org/opennms/upgrade/tests/bad/TestAbstract.java new file mode 100644 index 000000000000..51029bcbdc76 --- /dev/null +++ b/core/upgrade/src/test/java/org/opennms/upgrade/tests/bad/TestAbstract.java @@ -0,0 +1,107 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.tests.bad; + +import org.opennms.upgrade.api.Ignore; +import org.opennms.upgrade.api.OnmsUpgrade; +import org.opennms.upgrade.api.OnmsUpgradeException; + +/** + * The Class TestAbstract. + *

This is an example implementation for the JUnit tests.

+ * + * @author Alejandro Galue + */ +@Ignore +public abstract class TestAbstract implements OnmsUpgrade { + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getOrder() + */ + @Override + public int getOrder() { + return 25; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getId() + */ + @Override + public String getId() { + return getClass().getName(); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getDescription() + */ + @Override + public String getDescription() { + return "Testing Ignore"; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#preExecute() + */ + @Override + public void preExecute() throws OnmsUpgradeException { + throw new RuntimeException("This should not be called"); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#postExecute() + */ + @Override + public void postExecute() throws OnmsUpgradeException { + throw new RuntimeException("This should not be called"); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#rollback() + */ + @Override + public void rollback() throws OnmsUpgradeException { + throw new RuntimeException("This should not be called"); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#execute() + */ + @Override + public void execute() throws OnmsUpgradeException { + throw new RuntimeException("This should not be called"); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#requiresOnmsRunning() + */ + @Override + public boolean requiresOnmsRunning() { + return false; + } + +} diff --git a/core/upgrade/src/test/java/org/opennms/upgrade/tests/bad/TestIgnore.java b/core/upgrade/src/test/java/org/opennms/upgrade/tests/bad/TestIgnore.java new file mode 100644 index 000000000000..b3be3b09700f --- /dev/null +++ b/core/upgrade/src/test/java/org/opennms/upgrade/tests/bad/TestIgnore.java @@ -0,0 +1,107 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.tests.bad; + +import org.opennms.upgrade.api.Ignore; +import org.opennms.upgrade.api.OnmsUpgrade; +import org.opennms.upgrade.api.OnmsUpgradeException; + +/** + * The Class TestIgnore. + *

This is an example implementation for the JUnit tests.

+ * + * @author Alejandro Galue + */ +@Ignore +public class TestIgnore implements OnmsUpgrade { + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getOrder() + */ + @Override + public int getOrder() { + return 50; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getId() + */ + @Override + public String getId() { + return getClass().getName(); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getDescription() + */ + @Override + public String getDescription() { + return "Testing Ignore"; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#preExecute() + */ + @Override + public void preExecute() throws OnmsUpgradeException { + throw new RuntimeException("This should not be called"); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#postExecute() + */ + @Override + public void postExecute() throws OnmsUpgradeException { + throw new RuntimeException("This should not be called"); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#rollback() + */ + @Override + public void rollback() throws OnmsUpgradeException { + throw new RuntimeException("This should not be called"); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#execute() + */ + @Override + public void execute() throws OnmsUpgradeException { + throw new RuntimeException("This should not be called"); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#requiresOnmsRunning() + */ + @Override + public boolean requiresOnmsRunning() { + return false; + } + +} diff --git a/core/upgrade/src/test/java/org/opennms/upgrade/tests/bad/TestUpgradeWIthException.java b/core/upgrade/src/test/java/org/opennms/upgrade/tests/bad/TestUpgradeWIthException.java new file mode 100644 index 000000000000..8df7cb88ca74 --- /dev/null +++ b/core/upgrade/src/test/java/org/opennms/upgrade/tests/bad/TestUpgradeWIthException.java @@ -0,0 +1,104 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.upgrade.tests.bad; + +import org.opennms.upgrade.api.OnmsUpgrade; +import org.opennms.upgrade.api.OnmsUpgradeException; +import org.opennms.upgrade.support.UpgradeHelper; + +/** + * The Class TestUpgradeWIthException. + *

This is an example implementation for the JUnit tests.

+ * + * @author Alejandro Galue + */ +public class TestUpgradeWIthException implements OnmsUpgrade { + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getOrder() + */ + @Override + public int getOrder() { + return 100; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getId() + */ + @Override + public String getId() { + return getClass().getName(); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#getDescription() + */ + @Override + public String getDescription() { + return "Testing class - do nothing"; + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#preExecute() + */ + @Override + public void preExecute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#postExecute() + */ + @Override + public void postExecute() throws OnmsUpgradeException { + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#rollback() + */ + @Override + public void rollback() throws OnmsUpgradeException { + UpgradeHelper.addRolledBack(getId()); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#execute() + */ + @Override + public void execute() throws OnmsUpgradeException { + throw new OnmsUpgradeException("Something bad happen"); + } + + /* (non-Javadoc) + * @see org.opennms.upgrade.api.OnmsUpgrade#requiresOnmsRunning() + */ + @Override + public boolean requiresOnmsRunning() { + return false; + } + +} diff --git a/core/upgrade/src/test/resources/etc/collectd-configuration.xml b/core/upgrade/src/test/resources/etc/collectd-configuration.xml new file mode 100644 index 000000000000..45d6f923bb57 --- /dev/null +++ b/core/upgrade/src/test/resources/etc/collectd-configuration.xml @@ -0,0 +1,29 @@ + + + + + IPADDR != '0.0.0.0' + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/upgrade/src/test/resources/etc/datacollection-config.xml b/core/upgrade/src/test/resources/etc/datacollection-config.xml new file mode 100644 index 000000000000..847b90137bf3 --- /dev/null +++ b/core/upgrade/src/test/resources/etc/datacollection-config.xml @@ -0,0 +1,26 @@ + + + + + RRA:AVERAGE:0.5:1:2016 + RRA:AVERAGE:0.5:12:1488 + RRA:AVERAGE:0.5:288:366 + RRA:MAX:0.5:288:366 + RRA:MIN:0.5:288:366 + + + + + + + + + + .1.3.6.1.4.1. + + mib2-interfaces + + + + + diff --git a/core/upgrade/src/test/resources/etc/jmx-datacollection-config.xml b/core/upgrade/src/test/resources/etc/jmx-datacollection-config.xml new file mode 100644 index 000000000000..bcf259fc0af2 --- /dev/null +++ b/core/upgrade/src/test/resources/etc/jmx-datacollection-config.xml @@ -0,0 +1,151 @@ + + + + + RRA:AVERAGE:0.5:1:2016 + RRA:AVERAGE:0.5:12:1488 + RRA:AVERAGE:0.5:288:366 + RRA:MAX:0.5:288:366 + RRA:MIN:0.5:288:366 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/upgrade/src/test/resources/etc/ksc-performance-reports.xml b/core/upgrade/src/test/resources/etc/ksc-performance-reports.xml new file mode 100644 index 000000000000..aefbd5059cea --- /dev/null +++ b/core/upgrade/src/test/resources/etc/ksc-performance-reports.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/core/upgrade/src/test/resources/etc/opennms-server.xml b/core/upgrade/src/test/resources/etc/opennms-server.xml new file mode 100644 index 000000000000..e969c2b42d76 --- /dev/null +++ b/core/upgrade/src/test/resources/etc/opennms-server.xml @@ -0,0 +1,2 @@ + + diff --git a/core/upgrade/src/test/resources/etc/opennms.properties b/core/upgrade/src/test/resources/etc/opennms.properties new file mode 100644 index 000000000000..9684671b1b33 --- /dev/null +++ b/core/upgrade/src/test/resources/etc/opennms.properties @@ -0,0 +1,3 @@ +org.opennms.rrd.storeByGroup=false +rrd.base.dir=target/home/rrd +rrd.binary=/opt/local/bin/rrdtool \ No newline at end of file diff --git a/core/upgrade/src/test/resources/etc/rrd-configuration.properties b/core/upgrade/src/test/resources/etc/rrd-configuration.properties new file mode 100644 index 000000000000..282039add02a --- /dev/null +++ b/core/upgrade/src/test/resources/etc/rrd-configuration.properties @@ -0,0 +1,4 @@ +org.opennms.rrd.strategyClass=org.opennms.netmgt.rrd.jrobin.JRobinRrdStrategy +org.opennms.rrd.fileExtension=.jrb +org.opennms.rrd.usequeue=false +org.opennms.rrd.usetcp=false diff --git a/core/upgrade/src/test/resources/etc/snmp-graph.properties b/core/upgrade/src/test/resources/etc/snmp-graph.properties new file mode 100644 index 000000000000..44c0b1aa18b7 --- /dev/null +++ b/core/upgrade/src/test/resources/etc/snmp-graph.properties @@ -0,0 +1,17 @@ +command.prefix=/opt/local/bin/rrdtool graph - --imgformat PNG --font DEFAULT:7 --font TITLE:10 --start {startTime} --end {endTime} +info.command=/opt/local/bin/rrdtool info +default.report=mib2.HCbits +output.mime=image/png +include.directory=snmp-graph.properties.d + +reports=dummy + +report.dummy.name=Dummy Template +report.dummy.columns=dummy.updates +report.dummy.type=nodeSnmp +report.dummy.command=--title="Dummy Updates" \ + DEF:updates={rrd1}:dummy.updates:AVERAGE \ + LINE1:updates#0000ff:"Dummy Updates" \ + GPRINT:updates:AVERAGE:" Avg \\: %8.2lf %s" \ + GPRINT:updates:MIN:"Min \\: %8.2lf %s" \ + GPRINT:updates:MAX:"Max \\: %8.2lf %s\\n" diff --git a/core/upgrade/src/test/resources/etc/snmp-graph.properties.d/jvm-graph.properties b/core/upgrade/src/test/resources/etc/snmp-graph.properties.d/jvm-graph.properties new file mode 100644 index 000000000000..acd5df4abb14 --- /dev/null +++ b/core/upgrade/src/test/resources/etc/snmp-graph.properties.d/jvm-graph.properties @@ -0,0 +1,275 @@ +############################################################################## +## +## Please add report definition in a new line to make it easier +## for script based sanity checks +## +################################################## + +reports=free.memory, \ +jvm.thread.count, \ +jvm.thread.daemon, \ +jvm.thread.peak, \ +jvm.mempool.eden, \ +jvm.mempool.perm, \ +jvm.mempool.oldgen, \ +jvm.mempool.survivor, \ +jvm.gc.copy, \ +jvm.gc.msc, \ +jvm.gc.parnew, \ +jvm.gc.cms, \ +jvm.gc.psms, \ +jvm.gc.pss + +### +## JVM +### +report.free.memory.name=Free Memory +report.free.memory.columns=FreeMemory, TotalMemory +report.free.memory.type=interfaceSnmp +report.free.memory.command=--title="Memory Usage" \ + DEF:freemem={rrd1}:FreeMemory:AVERAGE \ + DEF:minFreemem={rrd1}:FreeMemory:MIN \ + DEF:maxFreemem={rrd1}:FreeMemory:MAX \ + DEF:totalmem={rrd2}:TotalMemory:AVERAGE \ + DEF:minTotalmem={rrd2}:TotalMemory:MIN \ + DEF:maxTotalmem={rrd2}:TotalMemory:MAX \ + CDEF:percentfree=freemem,totalmem,/,100,* \ + CDEF:minPercentfree=minFreemem,minTotalmem,/,100,* \ + CDEF:maxPercentfree=maxFreemem,maxTotalmem,/,100,* \ + LINE2:percentfree#0000ff:"%FreeMemory" \ + GPRINT:percentfree:AVERAGE:" Avg \\: %5.2lf %s" \ + GPRINT:percentfree:MIN:"Min \\: %5.2lf %s" \ + GPRINT:percentfree:MAX:"Max \\: %5.2lf %s\\n" + +report.jvm.thread.count.name=JVM Threading +report.jvm.thread.count.columns=ThreadCount +report.jvm.thread.count.type=interfaceSnmp +report.jvm.thread.count.command=--title="JVM Thread Count" \ + DEF:threads={rrd1}:ThreadCount:AVERAGE \ + LINE2:threads#0000ff:"Threads" \ + GPRINT:threads:AVERAGE:" Avg \\: %8.2lf %s\\n" + +report.jvm.thread.daemon.name=JVM Daemon Threads +report.jvm.thread.daemon.columns=DaemonThreadCount +report.jvm.thread.daemon.type=interfaceSnmp +report.jvm.thread.daemon.command=--title="JVM Daemon Thread Count" \ + DEF:dthreads={rrd1}:DaemonThreadCount:AVERAGE \ + LINE2:dthreads#0000ff:"Daemon Threads" \ + GPRINT:dthreads:AVERAGE:" Avg \\: %5.2lf %s\\n" + +report.jvm.thread.peak.name=JVM Peak Thread Count +report.jvm.thread.peak.columns=PeakThreadCount +report.jvm.thread.peak.type=interfaceSnmp +report.jvm.thread.peak.command=--title="JVM Peak Thread Count" \ + DEF:threads={rrd1}:PeakThreadCount:AVERAGE \ + LINE2:threads#0000ff:"Threads" \ + GPRINT:threads:AVERAGE:" Avg \\: %5.2lf %s\\n" + +report.jvm.mempool.eden.name=JVM Memory Pool: Eden Space +report.jvm.mempool.eden.columns=EdenUsage.used, EdenUsage.max +report.jvm.mempool.eden.type=interfaceSnmp +report.jvm.mempool.eden.command=--title="JVM Memory Pool: Eden Space" \ + DEF:used={rrd1}:EdenUsage.used:AVERAGE \ + DEF:max={rrd2}:EdenUsage.max:AVERAGE \ + LINE2:used#0000ff:"Bytes Used" \ + GPRINT:used:AVERAGE:" Avg \\: %5.2lf %s " \ + GPRINT:used:MIN:" Min \\: %5.2lf %s " \ + GPRINT:used:MAX:" Max \\: %5.2lf %s " \ + LINE2:max#ff0000:"Bytes Allocated" \ + GPRINT:max:AVERAGE:"Avg \\: %5.2lf %s " \ + GPRINT:max:MIN:"Min \\: %5.2lf %s " \ + GPRINT:max:MAX:"Max \\: %5.2lf %s\\n" + +report.jvm.mempool.perm.name=JVM Memory Pool: Perm Space +report.jvm.mempool.perm.columns=PermUsage.used, PermUsage.max +report.jvm.mempool.perm.type=interfaceSnmp +report.jvm.mempool.perm.command=--title="JVM Memory Pool: Perm Space" \ + DEF:used={rrd1}:PermUsage.used:AVERAGE \ + DEF:max={rrd2}:PermUsage.max:AVERAGE \ + LINE2:used#0000ff:"Bytes Used" \ + GPRINT:used:AVERAGE:" Avg \\: %5.2lf %s " \ + GPRINT:used:MIN:" Min \\: %5.2lf %s " \ + GPRINT:used:MAX:" Max \\: %5.2lf %s " \ + LINE2:max#ff0000:"Bytes Allocated" \ + GPRINT:max:AVERAGE:"Avg \\: %5.2lf %s " \ + GPRINT:max:MIN:"Min \\: %5.2lf %s " \ + GPRINT:max:MAX:"Max \\: %5.2lf %s\\n" + +report.jvm.mempool.survivor.name=JVM Memory Pool: Survivor Space +report.jvm.mempool.survivor.columns=SurvUsage.used, SurvUsage.max +report.jvm.mempool.survivor.type=interfaceSnmp +report.jvm.mempool.survivor.command=--title="JVM Memory Pool: Survivor Space" \ + DEF:used={rrd1}:SurvUsage.used:AVERAGE \ + DEF:max={rrd2}:SurvUsage.max:AVERAGE \ + LINE2:used#0000ff:"Bytes Used" \ + GPRINT:used:AVERAGE:" Avg \\: %5.2lf %s " \ + GPRINT:used:MIN:" Min \\: %5.2lf %s " \ + GPRINT:used:MAX:" Max \\: %5.2lf %s " \ + LINE2:max#ff0000:"Bytes Allocated" \ + GPRINT:max:AVERAGE:"Avg \\: %5.2lf %s " \ + GPRINT:max:MIN:"Min \\: %5.2lf %s " \ + GPRINT:max:MAX:"Max \\: %5.2lf %s\\n" + +report.jvm.mempool.oldgen.name=JVM Memory Pool: OldGen Space +report.jvm.mempool.oldgen.columns=OGenUsage.used, OGenUsage.max +report.jvm.mempool.oldgen.type=interfaceSnmp +report.jvm.mempool.oldgen.command=--title="JVM Memory Pool: Old Gen Space" \ + DEF:used={rrd1}:OGenUsage.used:AVERAGE \ + DEF:max={rrd2}:OGenUsage.max:AVERAGE \ + LINE2:used#0000ff:"Bytes Used" \ + GPRINT:used:AVERAGE:" Avg \\: %5.2lf %s " \ + GPRINT:used:MIN:" Min \\: %5.2lf %s " \ + GPRINT:used:MAX:" Max \\: %5.2lf %s " \ + LINE2:max#ff0000:"Bytes Allocated" \ + GPRINT:max:AVERAGE:"Avg \\: %5.2lf %s " \ + GPRINT:max:MIN:"Min \\: %5.2lf %s " \ + GPRINT:max:MAX:"Max \\: %5.2lf %s\\n" + +#report.jvm.gc.copy +report.jvm.gc.copy.name=JVM GarbageCollector: Copy +report.jvm.gc.copy.columns=Copy.CollCnt, Copy.CollTime, Copy.Duration +report.jvm.gc.copy.type=interfaceSnmp +report.jvm.gc.copy.command=--title="JVM GarbageCollector: Copy" \ + DEF:collCnt={rrd1}:Copy.CollCnt:AVERAGE \ + DEF:collTime={rrd2}:Copy.CollTime:AVERAGE \ + DEF:duration={rrd3}:Copy.Duration:AVERAGE \ + CDEF:collPerMin=collCnt,5,/ \ + CDEF:avgCollTime=collTime,collCnt,/,1000,/ \ + CDEF:collTimePerMin=avgCollTime,collPerMin,* \ + LINE2:collCnt#ff0000:"CollectionCount" \ + GPRINT:collCnt:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collTime#00ff00:"CollectionTime" \ + GPRINT:collTime:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:duration#0000ff:"CollectionDuration" \ + GPRINT:duration:AVERAGE:" Avg \\: %5.2lf %s " \ + GPRINT:duration:MIN:" Min \\: %5.2lf %s " \ + GPRINT:duration:MAX:" Max \\: %5.2lf %s " \ + LINE2:avgCollTime#0000aa:"AvgCollTime" \ + GPRINT:avgCollTime:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collPerMin#0000aa:"CollPerMin" \ + GPRINT:collPerMin:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collTimePerMin#aa0000:"CollTimePerMin" \ + GPRINT:collTimePerMin:AVERAGE:" Avg \\: %5.2lf %s\\n" + +report.jvm.gc.msc.name=JVM GarbageCollector: MarkSweepCompact +report.jvm.gc.msc.columns=MSC.CollCnt, MSC.CollTime, MSC.Duration +report.jvm.gc.msc.type=interfaceSnmp +report.jvm.gc.msc.command=--title="JVM GarbageCollector: MarkSweepCompact" \ + DEF:collCnt={rrd1}:MSC.CollCnt:AVERAGE \ + DEF:collTime={rrd2}:MSC.CollTime:AVERAGE \ + DEF:duration={rrd3}:MSC.Duration:AVERAGE \ + CDEF:collPerMin=collCnt,5,/ \ + CDEF:avgCollTime=collTime,collCnt,/,1000,/ \ + CDEF:collTimePerMin=avgCollTime,collPerMin,* \ + LINE2:collCnt#ff0000:"CollectionCount" \ + GPRINT:collCnt:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collTime#00ff00:"CollectionTime" \ + GPRINT:collTime:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:duration#0000ff:"CollectionDuration" \ + GPRINT:duration:AVERAGE:" Avg \\: %5.2lf %s " \ + GPRINT:duration:MIN:" Min \\: %5.2lf %s " \ + GPRINT:duration:MAX:" Max \\: %5.2lf %s " \ + LINE2:collPerMin#0000aa:"CollPerMin" \ + GPRINT:collPerMin:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collTimePerMin#aa0000:"CollTimePerMin" \ + GPRINT:collTimePerMin:AVERAGE:" Avg \\: %5.2lf %s\\n" + +report.jvm.gc.parnew.name=JVM GarbageCollector: ParNew +report.jvm.gc.parnew.columns=ParNew.CollCnt, ParNew.CollTime, ParNew.Duration +report.jvm.gc.parnew.type=interfaceSnmp +report.jvm.gc.parnew.command=--title="JVM GarbageCollector: ParNew" \ + DEF:collCnt={rrd1}:ParNew.CollCnt:AVERAGE \ + DEF:collTime={rrd2}:ParNew.CollTime:AVERAGE \ + DEF:duration={rrd3}:ParNew.Duration:AVERAGE \ + CDEF:collPerMin=collCnt,5,/ \ + CDEF:avgCollTime=collTime,collCnt,/,1000,/ \ + CDEF:collTimePerMin=avgCollTime,collPerMin,* \ + LINE2:collCnt#ff0000:"CollectionCount" \ + GPRINT:collCnt:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collTime#00ff00:"CollectionTime" \ + GPRINT:collTime:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:duration#0000ff:"CollectionDuration" \ + GPRINT:duration:AVERAGE:" Avg \\: %5.2lf %s " \ + GPRINT:duration:MIN:" Min \\: %5.2lf %s " \ + GPRINT:duration:MAX:" Max \\: %5.2lf %s " \ + LINE2:avgCollTime#0000aa:"AvgCollTime" \ + GPRINT:avgCollTime:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collPerMin#0000aa:"CollPerMin" \ + GPRINT:collPerMin:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collTimePerMin#aa0000:"CollTimePerMin" \ + GPRINT:collTimePerMin:AVERAGE:" Avg \\: %5.2lf %s\\n" + +report.jvm.gc.cms.name=JVM GarbageCollector: ConcurrentMarkSweep +report.jvm.gc.cms.columns=CMS.CollCnt, CMS.CollTime, CMS.Duration +report.jvm.gc.cms.type=interfaceSnmp +report.jvm.gc.cms.command=--title="JVM GarbageCollector: ConcurrentMarkSweep" \ + DEF:collCnt={rrd1}:CMS.CollCnt:AVERAGE \ + DEF:collTime={rrd2}:CMS.CollTime:AVERAGE \ + DEF:duration={rrd3}:CMS.Duration:AVERAGE \ + CDEF:collPerMin=collCnt,5,/ \ + CDEF:avgCollTime=collTime,collCnt,/,1000,/ \ + CDEF:collTimePerMin=avgCollTime,collPerMin,* \ + LINE2:collCnt#ff0000:"CollectionCount" \ + GPRINT:collCnt:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collTime#00ff00:"CollectionTime" \ + GPRINT:collTime:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:duration#0000ff:"CollectionDuration" \ + GPRINT:duration:AVERAGE:" Avg \\: %5.2lf %s " \ + GPRINT:duration:MIN:" Min \\: %5.2lf %s " \ + GPRINT:duration:MAX:" Max \\: %5.2lf %s " \ + LINE2:avgCollTime#0000aa:"AvgCollTime" \ + GPRINT:avgCollTime:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collPerMin#0000aa:"CollPerMin" \ + GPRINT:collPerMin:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collTimePerMin#aa0000:"CollTimePerMin" \ + GPRINT:collTimePerMin:AVERAGE:" Avg \\: %5.2lf %s\\n" + +report.jvm.gc.psms.name=JVM GarbageCollector: PS MarkSweep +report.jvm.gc.psms.columns=PSMS.CollCnt, PSMS.CollTime, PSMS.Duration +report.jvm.gc.psms.type=interfaceSnmp +report.jvm.gc.psms.command=--title="JVM GarbageCollector: PS MarkSweep" \ + DEF:collCnt={rrd1}:PSMS.CollCnt:AVERAGE \ + DEF:collTime={rrd2}:PSMS.CollTime:AVERAGE \ + DEF:duration={rrd3}:PSMS.Duration:AVERAGE \ + CDEF:collPerMin=collCnt,5,/ \ + CDEF:avgCollTime=collTime,collCnt,/,1000,/ \ + CDEF:collTimePerMin=avgCollTime,collPerMin,* \ + LINE2:collCnt#ff0000:"CollectionCount" \ + GPRINT:collCnt:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collTime#00ff00:"CollectionTime" \ + GPRINT:collTime:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:duration#0000ff:"CollectionDuration" \ + GPRINT:duration:AVERAGE:" Avg \\: %5.2lf %s " \ + GPRINT:duration:MIN:" Min \\: %5.2lf %s " \ + GPRINT:duration:MAX:" Max \\: %5.2lf %s " \ + LINE2:avgCollTime#0000aa:"AvgCollTime" \ + GPRINT:avgCollTime:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collPerMin#0000aa:"CollPerMin" \ + GPRINT:collPerMin:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collTimePerMin#aa0000:"CollTimePerMin" \ + GPRINT:collTimePerMin:AVERAGE:" Avg \\: %5.2lf %s\\n" + +report.jvm.gc.pss.name=JVM GarbageCollector: PS Scavenge +report.jvm.gc.pss.columns=PSS.CollCnt, PSS.CollTime, PSS.Duration +report.jvm.gc.pss.type=interfaceSnmp +report.jvm.gc.pss.command=--title="JVM GarbageCollector: PS Scavenge" \ + DEF:collCnt={rrd1}:PSS.CollCnt:AVERAGE \ + DEF:collTime={rrd2}:PSS.CollTime:AVERAGE \ + DEF:duration={rrd3}:PSS.Duration:AVERAGE \ + CDEF:collPerMin=collCnt,5,/ \ + CDEF:avgCollTime=collTime,collCnt,/,1000,/ \ + CDEF:collTimePerMin=avgCollTime,collPerMin,* \ + LINE2:collCnt#ff0000:"CollectionCount" \ + GPRINT:collCnt:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collTime#00ff00:"CollectionTime" \ + GPRINT:collTime:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:duration#0000ff:"CollectionDuration" \ + GPRINT:duration:AVERAGE:" Avg \\: %5.2lf %s " \ + GPRINT:duration:MIN:" Min \\: %5.2lf %s " \ + GPRINT:duration:MAX:" Max \\: %5.2lf %s " \ + LINE2:avgCollTime#0000aa:"AvgCollTime" \ + GPRINT:avgCollTime:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collPerMin#0000aa:"CollPerMin" \ + GPRINT:collPerMin:AVERAGE:" Avg \\: %5.2lf %s " \ + LINE2:collTimePerMin#aa0000:"CollTimePerMin" \ + GPRINT:collTimePerMin:AVERAGE:" Avg \\: %5.2lf %s\\n" diff --git a/core/upgrade/src/test/resources/jetty-webapps/opennms/WEB-INF/version.properties b/core/upgrade/src/test/resources/jetty-webapps/opennms/WEB-INF/version.properties new file mode 100644 index 000000000000..cab32a30f108 --- /dev/null +++ b/core/upgrade/src/test/resources/jetty-webapps/opennms/WEB-INF/version.properties @@ -0,0 +1 @@ +version.display=1.12.2 diff --git a/core/upgrade/src/test/resources/rrd/1/eth0-005056c00008/ifInOctets.jrb b/core/upgrade/src/test/resources/rrd/1/eth0-005056c00008/ifInOctets.jrb new file mode 100644 index 000000000000..a1c7011913ca Binary files /dev/null and b/core/upgrade/src/test/resources/rrd/1/eth0-005056c00008/ifInOctets.jrb differ diff --git a/core/upgrade/src/test/resources/rrd/1/eth0/ifInOctets.jrb b/core/upgrade/src/test/resources/rrd/1/eth0/ifInOctets.jrb new file mode 100644 index 000000000000..23ed21d83a15 Binary files /dev/null and b/core/upgrade/src/test/resources/rrd/1/eth0/ifInOctets.jrb differ diff --git a/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.CollCnt.jrb b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.CollCnt.jrb new file mode 100644 index 000000000000..2c5aa8b90973 Binary files /dev/null and b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.CollCnt.jrb differ diff --git a/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.CollCnt.meta b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.CollCnt.meta new file mode 100644 index 000000000000..66848a6c6939 --- /dev/null +++ b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.CollCnt.meta @@ -0,0 +1,2 @@ +#Tue Jul 30 12:29:26 EDT 2013 +JMX_java.lang\:type\=GarbageCollector.name.PS\ Scavenge.PSS.CollCnt=PSS.CollCnt diff --git a/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.CollTime.jrb b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.CollTime.jrb new file mode 100644 index 000000000000..982b2a5e8869 Binary files /dev/null and b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.CollTime.jrb differ diff --git a/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.CollTime.meta b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.CollTime.meta new file mode 100644 index 000000000000..d8b9bea982ad --- /dev/null +++ b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.CollTime.meta @@ -0,0 +1,2 @@ +#Tue Jul 30 12:29:26 EDT 2013 +JMX_java.lang\:type\=GarbageCollector.name.PS\ Scavenge.PSS.CollTime=PSS.CollTime diff --git a/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.Duration.jrb b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.Duration.jrb new file mode 100644 index 000000000000..4e7ecc7b0e3e Binary files /dev/null and b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.Duration.jrb differ diff --git a/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.Duration.meta b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.Duration.meta new file mode 100644 index 000000000000..9dd017317698 --- /dev/null +++ b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.Duration.meta @@ -0,0 +1,2 @@ +#Tue Jul 30 12:29:26 EDT 2013 +JMX_java.lang\:type\=GarbageCollector.name.PS\ Scavenge.PSS.Duration=PSS.Duration diff --git a/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.EndTime.jrb b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.EndTime.jrb new file mode 100644 index 000000000000..1cf3c2bd1e0a Binary files /dev/null and b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.EndTime.jrb differ diff --git a/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.EndTime.meta b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.EndTime.meta new file mode 100644 index 000000000000..e15c02070c49 --- /dev/null +++ b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.EndTime.meta @@ -0,0 +1,2 @@ +#Tue Jul 30 12:29:26 EDT 2013 +JMX_java.lang\:type\=GarbageCollector.name.PS\ Scavenge.PSS.EndTime=PSS.EndTime diff --git a/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.GcThreadCnt.jrb b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.GcThreadCnt.jrb new file mode 100644 index 000000000000..3339d15d5fde Binary files /dev/null and b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.GcThreadCnt.jrb differ diff --git a/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.GcThreadCnt.meta b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.GcThreadCnt.meta new file mode 100644 index 000000000000..09876f9e4027 --- /dev/null +++ b/core/upgrade/src/test/resources/rrd/1/opennms-jvm/PSS.GcThreadCnt.meta @@ -0,0 +1,2 @@ +#Tue Jul 30 12:29:26 EDT 2013 +JMX_java.lang\:type\=GarbageCollector.name.PS\ Scavenge.PSS.GcThreadCnt=PSS.GcThreadCnt diff --git a/core/upgrade/src/test/resources/rrd2/1/opennms-jvm/ds.properties b/core/upgrade/src/test/resources/rrd2/1/opennms-jvm/ds.properties new file mode 100644 index 000000000000..a72839a4a808 --- /dev/null +++ b/core/upgrade/src/test/resources/rrd2/1/opennms-jvm/ds.properties @@ -0,0 +1,11 @@ +#Wed Oct 30 09:57:14 EDT 2013 +SurvPeakUsage.max=java_lang_type_MemoryPool_name_Survivor Space +SurvPeakUsage.used=java_lang_type_MemoryPool_name_Survivor Space +SurvUsage.used=java_lang_type_MemoryPool_name_Survivor Space +SurvCollUseThrshCnt=java_lang_type_MemoryPool_name_Survivor Space +SurvPeakUsage.init=java_lang_type_MemoryPool_name_Survivor Space +SurvUsage.init=java_lang_type_MemoryPool_name_Survivor Space +SurvUsage.max=java_lang_type_MemoryPool_name_Survivor Space +SurvCollUseThresh=java_lang_type_MemoryPool_name_Survivor Space +SurvPeakUsg.cmmttd=java_lang_type_MemoryPool_name_Survivor Space +SurvUsg.cmmttd=java_lang_type_MemoryPool_name_Survivor Space diff --git a/core/upgrade/src/test/resources/rrd2/1/opennms-jvm/java_lang_type_MemoryPool_name_Survivor Space.jrb b/core/upgrade/src/test/resources/rrd2/1/opennms-jvm/java_lang_type_MemoryPool_name_Survivor Space.jrb new file mode 100644 index 000000000000..fd81044ab673 Binary files /dev/null and b/core/upgrade/src/test/resources/rrd2/1/opennms-jvm/java_lang_type_MemoryPool_name_Survivor Space.jrb differ diff --git a/core/upgrade/src/test/resources/rrd2/1/opennms-jvm/java_lang_type_MemoryPool_name_Survivor Space.meta b/core/upgrade/src/test/resources/rrd2/1/opennms-jvm/java_lang_type_MemoryPool_name_Survivor Space.meta new file mode 100644 index 000000000000..8b3cb95fd011 --- /dev/null +++ b/core/upgrade/src/test/resources/rrd2/1/opennms-jvm/java_lang_type_MemoryPool_name_Survivor Space.meta @@ -0,0 +1,11 @@ +#Wed Oct 30 09:57:14 EDT 2013 +JMX_java.lang\:type\=MemoryPool.name.Survivor\ Space.SurvPeakUsage.used=SurvPeakUsage.used +JMX_java.lang\:type\=MemoryPool.name.Survivor\ Space.SurvUsg.cmmttd=SurvUsg.cmmttd +JMX_java.lang\:type\=MemoryPool.name.Survivor\ Space.SurvUsage.init=SurvUsage.init +JMX_java.lang\:type\=MemoryPool.name.Survivor\ Space.SurvUsage.used=SurvUsage.used +JMX_java.lang\:type\=MemoryPool.name.Survivor\ Space.SurvPeakUsage.max=SurvPeakUsage.max +JMX_java.lang\:type\=MemoryPool.name.Survivor\ Space.SurvUsage.max=SurvUsage.max +JMX_java.lang\:type\=MemoryPool.name.Survivor\ Space.SurvCollUseThrshCnt=SurvCollUseThrshCnt +JMX_java.lang\:type\=MemoryPool.name.Survivor\ Space.SurvCollUseThresh=SurvCollUseThresh +JMX_java.lang\:type\=MemoryPool.name.Survivor\ Space.SurvPeakUsg.cmmttd=SurvPeakUsg.cmmttd +JMX_java.lang\:type\=MemoryPool.name.Survivor\ Space.SurvPeakUsage.init=SurvPeakUsage.init diff --git a/dependencies/atomikos/pom.xml b/dependencies/atomikos/pom.xml new file mode 100644 index 000000000000..d6059adc234e --- /dev/null +++ b/dependencies/atomikos/pom.xml @@ -0,0 +1,71 @@ + + + + org.opennms + dependencies + 1.13.0-SNAPSHOT + + 4.0.0 + org.opennms.dependencies + atomikos-dependencies + pom + OpenNMS Dependencies JOTM + + This module is used to provide a single artifact that the opennms project + can depend on to use JOTM. + + + + com.atomikos + transactions-jta + 3.8.0 + + + com.atomikos + transactions-jdbc + 3.8.0 + + + javax.transaction + jta + 1.1 + + + + diff --git a/dependencies/jasper/pom.xml b/dependencies/jasper/pom.xml index 231608bf676a..96ba6d5cb1fa 100644 --- a/dependencies/jasper/pom.xml +++ b/dependencies/jasper/pom.xml @@ -43,6 +43,10 @@ eclipse jdtcore + + commons-logging + commons-logging +
@@ -82,6 +86,10 @@ log4j log4j + + commons-logging + commons-logging +
diff --git a/dependencies/pom.xml b/dependencies/pom.xml index 33a9d139f639..88b15c63f732 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -13,6 +13,7 @@ activemq activemq-web asterisk + atomikos camel camel-test castor diff --git a/dependencies/spring/pom.xml b/dependencies/spring/pom.xml index 35c044c07bde..cd811e66403e 100644 --- a/dependencies/spring/pom.xml +++ b/dependencies/spring/pom.xml @@ -22,8 +22,8 @@ ${springVersion} - c3p0 - c3p0 + commons-logging + commons-logging
@@ -33,8 +33,8 @@ ${springVersion} - c3p0 - c3p0 + commons-logging + commons-logging @@ -44,8 +44,8 @@ ${springVersion} - c3p0 - c3p0 + commons-logging + commons-logging @@ -55,8 +55,8 @@ ${springVersion} - c3p0 - c3p0 + commons-logging + commons-logging @@ -66,8 +66,8 @@ ${springVersion} - c3p0 - c3p0 + commons-logging + commons-logging @@ -77,8 +77,8 @@ ${springVersion} - c3p0 - c3p0 + commons-logging + commons-logging @@ -87,10 +87,6 @@ spring-core ${springVersion} - - c3p0 - c3p0 - commons-logging commons-logging @@ -103,8 +99,8 @@ ${springVersion} - c3p0 - c3p0 + commons-logging + commons-logging @@ -114,8 +110,8 @@ ${springVersion} - c3p0 - c3p0 + commons-logging + commons-logging @@ -125,8 +121,8 @@ ${springVersion} - c3p0 - c3p0 + commons-logging + commons-logging @@ -135,10 +131,6 @@ spring-orm ${springVersion} - - c3p0 - c3p0 - org.hibernate hibernate @@ -151,6 +143,10 @@ org.hibernate hibernate-entitymanager + + commons-logging + commons-logging + @@ -159,8 +155,8 @@ ${springVersion} - c3p0 - c3p0 + commons-logging + commons-logging @@ -168,25 +164,39 @@ org.aspectj aspectjrt ${aspectjVersion} + + + commons-logging + commons-logging + + org.aspectj aspectjweaver ${aspectjVersion} + + + commons-logging + commons-logging + + javax.annotation jsr250-api - - c3p0 - c3p0 - commons-collections commons-collections + + + commons-logging + commons-logging + + org.slf4j diff --git a/features/access-point-monitor/pom.xml b/features/access-point-monitor/pom.xml index db2e43ccdf35..814a80a415b8 100644 --- a/features/access-point-monitor/pom.xml +++ b/features/access-point-monitor/pom.xml @@ -75,9 +75,9 @@ provided - hsqldb + org.hsqldb hsqldb - 1.8.0.10 + 2.3.1 test diff --git a/features/geocoder/nominatim/src/main/java/org/opennms/features/geocoder/nominatim/NominatimGeocoderService.java b/features/geocoder/nominatim/src/main/java/org/opennms/features/geocoder/nominatim/NominatimGeocoderService.java index 78a549831003..b8058b9d0cd7 100644 --- a/features/geocoder/nominatim/src/main/java/org/opennms/features/geocoder/nominatim/NominatimGeocoderService.java +++ b/features/geocoder/nominatim/src/main/java/org/opennms/features/geocoder/nominatim/NominatimGeocoderService.java @@ -9,6 +9,8 @@ import net.simon04.jelementtree.ElementTree; import org.apache.commons.io.IOUtils; +import org.apache.http.HttpResponse; +import org.apache.http.StatusLine; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.DefaultHttpClient; @@ -53,7 +55,12 @@ public Coordinates getCoordinates(final String address) throws GeocoderException InputStream responseStream = null; try { - responseStream = m_httpClient.execute(method).getEntity().getContent(); + final HttpResponse response = m_httpClient.execute(method); + final StatusLine statusLine = response.getStatusLine(); + if (statusLine.getStatusCode() != 200) { + throw new GeocoderException("Nominatim returned a non-OK response code: " + statusLine.getStatusCode() + " " + statusLine.getReasonPhrase()); + } + responseStream = response.getEntity().getContent(); final ElementTree tree = ElementTree.fromStream(responseStream); if (tree == null) { throw new GeocoderException("an error occurred connecting to the Nominatim geocoding service (no XML tree was found)"); @@ -81,7 +88,7 @@ public Coordinates getCoordinates(final String address) throws GeocoderException private String getUrl(final String geolocation) throws GeocoderException { try { - return GEOCODE_URL + "&q=" + URLEncoder.encode(geolocation, "UTF-8"); + return GEOCODE_URL + "&email=" + URLEncoder.encode(geolocation, "UTF-8") + "&q=" + URLEncoder.encode(geolocation, "UTF-8"); } catch (final UnsupportedEncodingException e) { throw new GeocoderException("unable to URL-encode query string", e); } diff --git a/features/jdbc-collector/src/main/java/org/opennms/netmgt/collectd/JdbcCollector.java b/features/jdbc-collector/src/main/java/org/opennms/netmgt/collectd/JdbcCollector.java index c7d002ff0b12..e42e44a14d8d 100644 --- a/features/jdbc-collector/src/main/java/org/opennms/netmgt/collectd/JdbcCollector.java +++ b/features/jdbc-collector/src/main/java/org/opennms/netmgt/collectd/JdbcCollector.java @@ -109,7 +109,6 @@ public void initialize(Map parameters) { m_scheduledNodes.clear(); initializeRrdDirs(); - initDatabaseConnectionFactory(); } private void initializeRrdDirs() { @@ -126,52 +125,8 @@ private void initializeRrdDirs() { } } - private void initDatabaseConnectionFactory() { - try { - DataSourceFactory.init(); - } catch (IOException e) { - LOG.error("initDatabaseConnectionFactory: IOException getting database connection", e); - throw new UndeclaredThrowableException(e); - } catch (MarshalException e) { - LOG.error("initDatabaseConnectionFactory: Marshall Exception getting database connection", e); - throw new UndeclaredThrowableException(e); - } catch (ValidationException e) { - LOG.error("initDatabaseConnectionFactory: Validation Exception getting database connection", e); - throw new UndeclaredThrowableException(e); - } catch (SQLException e) { - LOG.error("initDatabaseConnectionFactory: Failed getting connection to the database.", e); - throw new UndeclaredThrowableException(e); - } catch (PropertyVetoException e) { - LOG.error("initDatabaseConnectionFactory: Failed getting connection to the database.", e); - throw new UndeclaredThrowableException(e); - } catch (ClassNotFoundException e) { - LOG.error("initDatabaseConnectionFactory: Failed loading database driver.", e); - throw new UndeclaredThrowableException(e); - } - } - private void initDatabaseConnectionFactory(String dataSourceName) { - try { - DataSourceFactory.init(dataSourceName); - } catch (IOException e) { - LOG.error("initDatabaseConnectionFactory: IOException getting database connection", e); - throw new UndeclaredThrowableException(e); - } catch (MarshalException e) { - LOG.error("initDatabaseConnectionFactory: Marshall Exception getting database connection", e); - throw new UndeclaredThrowableException(e); - } catch (ValidationException e) { - LOG.error("initDatabaseConnectionFactory: Validation Exception getting database connection", e); - throw new UndeclaredThrowableException(e); - } catch (SQLException e) { - LOG.error("initDatabaseConnectionFactory: Failed getting connection to the database.", e); - throw new UndeclaredThrowableException(e); - } catch (PropertyVetoException e) { - LOG.error("initDatabaseConnectionFactory: Failed getting connection to the database.", e); - throw new UndeclaredThrowableException(e); - } catch (ClassNotFoundException e) { - LOG.error("initDatabaseConnectionFactory: Failed loading database driver.", e); - throw new UndeclaredThrowableException(e); - } + DataSourceFactory.init(dataSourceName); } @Override diff --git a/features/ncs/ncs-test/pom.xml b/features/ncs/ncs-test/pom.xml index 8c8315b597b7..2346e49b2bc1 100644 --- a/features/ncs/ncs-test/pom.xml +++ b/features/ncs/ncs-test/pom.xml @@ -37,9 +37,9 @@ provided - hsqldb + org.hsqldb hsqldb - 1.8.0.10 + 2.3.1 postgresql diff --git a/features/springframework-security/src/main/java/org/opennms/web/springframework/security/AuthFilterEnabler.java b/features/springframework-security/src/main/java/org/opennms/web/springframework/security/AuthFilterEnabler.java index f07ffe7f05c9..1dc81ca936b0 100644 --- a/features/springframework-security/src/main/java/org/opennms/web/springframework/security/AuthFilterEnabler.java +++ b/features/springframework-security/src/main/java/org/opennms/web/springframework/security/AuthFilterEnabler.java @@ -29,7 +29,7 @@ package org.opennms.web.springframework.security; import java.io.IOException; -import java.util.List; +import java.util.*; import javax.servlet.Filter; import javax.servlet.FilterChain; @@ -77,30 +77,41 @@ public void setGroupDao(GroupDao groupDao) { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - boolean shouldFilter = AclUtils.shouldFilter(SecurityContextHolder.getContext().getAuthentication().getAuthorities()); + boolean shouldFilter = AclUtils.shouldFilter(SecurityContextHolder.getContext().getAuthentication().getAuthorities()); try { + String[] groupNames; if (shouldFilter) { String user = SecurityContextHolder.getContext().getAuthentication().getName(); - List groups = m_groupDao.findGroupsForUser(user); - - String[] groupNames = new String[groups.size()]; + groupNames = new String[groups.size()]; for(int i = 0; i < groups.size(); i++) { groupNames[i] = groups.get(i).getName(); } + if(SecurityContextHolder.getContext().getAuthentication().getDetails() instanceof OnmsAuthenticationDetails){ + OnmsAuthenticationDetails details = (OnmsAuthenticationDetails) SecurityContextHolder.getContext().getAuthentication().getDetails(); + + if(details.getUserGroups() != null && details.getUserGroups().length > 0){ + Set detailsSet = new HashSet(Arrays.asList(details.getUserGroups())); + Set groupSet = new HashSet(Arrays.asList(groupNames)); + + if(groupSet.containsAll(detailsSet)){ + groupNames = details.getUserGroups(); + } + } + } m_filterManager.enableAuthorizationFilter(groupNames); } - chain.doFilter(request, response); } finally { if (shouldFilter) { m_filterManager.disableAuthorizationFilter(); } + } diff --git a/features/springframework-security/src/main/java/org/opennms/web/springframework/security/OnmsAuthenticationDetails.java b/features/springframework-security/src/main/java/org/opennms/web/springframework/security/OnmsAuthenticationDetails.java new file mode 100644 index 000000000000..7fad0116fce0 --- /dev/null +++ b/features/springframework-security/src/main/java/org/opennms/web/springframework/security/OnmsAuthenticationDetails.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ + +package org.opennms.web.springframework.security; + +import org.springframework.security.web.authentication.WebAuthenticationDetails; + +import javax.servlet.http.HttpServletRequest; + +public class OnmsAuthenticationDetails extends WebAuthenticationDetails { + + String[] m_userGroupList; + + /** + * Records the remote address and will also set the session Id if a session + * already exists (it won't create one). + * + * @param request that the authentication request was received from + */ + public OnmsAuthenticationDetails(HttpServletRequest request) { + super(request); + String userGroups = request.getParameter("j_usergroups"); + if(userGroups != null){ + String[] split = userGroups.split(","); + m_userGroupList = split[0].equals("") ? null : split; + } else { + m_userGroupList = null; + } + + } + + public String[] getUserGroups(){ + return m_userGroupList; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(super.toString()).append(": "); + sb.append("UserGroups: ").append(this.getUserGroups()); + + return sb.toString(); + } +} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/ModelImporter.java b/features/springframework-security/src/main/java/org/opennms/web/springframework/security/OnmsUsernamePasswordAuthenticationFilter.java similarity index 58% rename from opennms-import/src/main/java/org/opennms/netmgt/importer/ModelImporter.java rename to features/springframework-security/src/main/java/org/opennms/web/springframework/security/OnmsUsernamePasswordAuthenticationFilter.java index d90ee21345df..555fd9617f32 100644 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/ModelImporter.java +++ b/features/springframework-security/src/main/java/org/opennms/web/springframework/security/OnmsUsernamePasswordAuthenticationFilter.java @@ -1,7 +1,7 @@ /******************************************************************************* * This file is part of OpenNMS(R). * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * Copyright (C) 2012 The OpenNMS Group, Inc. * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. * * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. @@ -26,45 +26,20 @@ * http://www.opennms.com/ *******************************************************************************/ -package org.opennms.netmgt.importer; +package org.opennms.web.springframework.security; -import org.opennms.netmgt.model.events.EventIpcManager; +import org.springframework.security.authentication.AuthenticationDetailsSource; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import javax.servlet.http.HttpServletRequest; +public class OnmsUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter { + protected AuthenticationDetailsSource m_authDetailsSource = new OnmsWebAuthenticationDetailsSource(); -/** - * Model Importer - * - * @author ranger - * @version $Id: $ - */ -public class ModelImporter extends BaseImporter { - - private EventIpcManager m_eventManager; - - /** - *

Constructor for ModelImporter.

- */ - public ModelImporter() { + @Override + protected void setDetails(HttpServletRequest request, UsernamePasswordAuthenticationToken authRequest) { + authRequest.setDetails(m_authDetailsSource.buildDetails(request)); } - - /** - *

getEventManager

- * - * @return a {@link org.opennms.netmgt.model.events.EventIpcManager} object. - */ - public EventIpcManager getEventManager() { - return m_eventManager; - } - - /** - *

setEventManager

- * - * @param eventManager a {@link org.opennms.netmgt.model.events.EventIpcManager} object. - */ - public void setEventManager(EventIpcManager eventManager) { - m_eventManager = eventManager; - } - } diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/jmx/ImporterServiceMBean.java b/features/springframework-security/src/main/java/org/opennms/web/springframework/security/OnmsWebAuthenticationDetailsSource.java similarity index 68% rename from opennms-import/src/main/java/org/opennms/netmgt/importer/jmx/ImporterServiceMBean.java rename to features/springframework-security/src/main/java/org/opennms/web/springframework/security/OnmsWebAuthenticationDetailsSource.java index 7160fe4256a6..bbbaa7dea7a2 100644 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/jmx/ImporterServiceMBean.java +++ b/features/springframework-security/src/main/java/org/opennms/web/springframework/security/OnmsWebAuthenticationDetailsSource.java @@ -1,7 +1,7 @@ /******************************************************************************* * This file is part of OpenNMS(R). * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * Copyright (C) 2012 The OpenNMS Group, Inc. * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. * * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. @@ -26,21 +26,16 @@ * http://www.opennms.com/ *******************************************************************************/ -package org.opennms.netmgt.importer.jmx; +package org.opennms.web.springframework.security; -import org.opennms.netmgt.daemon.BaseOnmsMBean; +import org.springframework.security.authentication.AuthenticationDetailsSource; -/** - *

ImporterServiceMBean interface.

- * - * @author ranger - * @version $Id: $ - */ -public interface ImporterServiceMBean extends BaseOnmsMBean { - /** - *

getStats

- * - * @return a {@link java.lang.String} object. - */ - public String getStats(); +import javax.servlet.http.HttpServletRequest; + +public class OnmsWebAuthenticationDetailsSource implements AuthenticationDetailsSource { + + @Override + public OnmsAuthenticationDetails buildDetails(HttpServletRequest context) { + return new OnmsAuthenticationDetails(context); + } } diff --git a/features/ticketing/jira-integration/pom.xml b/features/ticketing/jira-integration/pom.xml index 8628acec7977..05a7f3850706 100644 --- a/features/ticketing/jira-integration/pom.xml +++ b/features/ticketing/jira-integration/pom.xml @@ -59,6 +59,10 @@ org.opennms.core org.opennms.core.lib
+ + commons-io + commons-io + junit junit @@ -77,6 +81,10 @@ com.sun.xml.bind jaxb-impl
+ + commons-logging + commons-logging +
diff --git a/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/support/VertexHopGraphProvider.java b/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/support/VertexHopGraphProvider.java index c8baa420ebe2..81f24aae26fd 100644 --- a/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/support/VertexHopGraphProvider.java +++ b/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/support/VertexHopGraphProvider.java @@ -34,13 +34,17 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; + import javax.xml.bind.JAXBException; + import org.opennms.features.topology.api.GraphContainer; +import org.opennms.features.topology.api.topo.CollapsibleCriteria; import org.opennms.features.topology.api.topo.Criteria; import org.opennms.features.topology.api.topo.Edge; import org.opennms.features.topology.api.topo.EdgeListener; @@ -87,6 +91,41 @@ public static FocusNodeHopCriteria getFocusNodeHopCriteriaForContainer(GraphCont } } + public static CollapsibleCriteria[] getCollapsedCriteriaForContainer(GraphContainer graphContainer) { + return getCollapsedCriteria(graphContainer.getCriteria()); + } + + public static CollapsibleCriteria[] getCollapsedCriteria(Criteria[] criteria) { + return getCollapsibleCriteria(criteria, true); + } + + public static CollapsibleCriteria[] getCollapsibleCriteriaForContainer(GraphContainer graphContainer) { + return getCollapsibleCriteria(graphContainer.getCriteria()); + } + + public static CollapsibleCriteria[] getCollapsibleCriteria(Criteria[] criteria) { + return getCollapsibleCriteria(criteria, false); + } + + public static CollapsibleCriteria[] getCollapsibleCriteria(Criteria[] criteria, boolean onlyCollapsed) { + List retval = new ArrayList(); + if (criteria != null) { + for (Criteria criterium : criteria) { + try { + CollapsibleCriteria hopCriteria = (CollapsibleCriteria)criterium; + if (onlyCollapsed) { + if (hopCriteria.isCollapsed()) { + retval.add(hopCriteria); + } + } else { + retval.add(hopCriteria); + } + } catch (ClassCastException e) {} + } + } + return retval.toArray(new CollapsibleCriteria[0]); + } + public abstract static class VertexHopCriteria extends Criteria { private String label = ""; private String m_id = ""; @@ -328,8 +367,63 @@ public List getVertices(Criteria... criteria) { semanticZoomLevel++; } + processed = collapseVertices(processed, getCollapsedCriteria(criteria)); + return new ArrayList(processed); } + + public static Set collapseVertices(Collection vertices, CollapsibleCriteria[] criteria) { + Set retval = new HashSet(vertices); + Set addMe = new HashSet(); + + for (Iterator itr = retval.iterator(); itr.hasNext();) { + Vertex vertex = itr.next(); + + nextVertex: + for (CollapsibleCriteria criterium : criteria) { + Set criteriaVertices = new HashSet(criterium.getVertices()); + for (Iterator critItr = criteriaVertices.iterator(); critItr.hasNext();) { + VertexRef criteriaVertex = critItr.next(); + if (new RefComparator().compare(vertex, criteriaVertex) == 0) { + // Remove the vertex from the return value + itr.remove(); + // Add the collapsed representation + addMe.add(criterium.getCollapsedRepresentation()); + break nextVertex; + } + } + } + } + + retval.addAll(addMe); + return retval; + } + + public static List collapseEdges(Collection edges, CollapsibleCriteria[] criteria) { + List retval = new ArrayList(edges); + List addMe = new ArrayList(); + + for (Iterator itr = retval.iterator(); itr.hasNext();) { + Edge edge = itr.next(); + for (CollapsibleCriteria criterium : criteria) { + Set criteriaVertices = new HashSet(criterium.getVertices()); + for (Iterator critItr = criteriaVertices.iterator(); critItr.hasNext();) { + VertexRef criteriaVertex = critItr.next(); + if (new RefComparator().compare(edge.getSource().getVertex(), criteriaVertex) == 0) { + // Reset the edge source to the collapsed vertex + edge.getSource().setVertex(criterium.getCollapsedRepresentation()); + } else if (new RefComparator().compare(edge.getTarget().getVertex(), criteriaVertex) == 0) { + // Reset the edge target to the collapsed vertex + edge.getTarget().setVertex(criterium.getCollapsedRepresentation()); + } + } + } + } + + retval.addAll(addMe); + return retval; + } + /** * TODO: OVERRIDE THIS FUNCTION? */ @@ -403,7 +497,9 @@ public Edge getEdge(EdgeRef reference) { */ @Override public List getEdges(Criteria... criteria) { - return m_delegate.getEdges(criteria); + List retval = m_delegate.getEdges(criteria); + retval = collapseEdges(retval, getCollapsedCriteria(criteria)); + return retval; } @Override diff --git a/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/AbstractSearchProvider.java b/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/AbstractSearchProvider.java new file mode 100644 index 000000000000..0abef6a6ae58 --- /dev/null +++ b/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/AbstractSearchProvider.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ + +package org.opennms.features.topology.api.topo; + +import org.opennms.features.topology.api.GraphContainer; +import org.opennms.features.topology.api.OperationContext; + +/** + * This abstract class provides empty implementations of all of the event handler functions. + * @author root + * + */ +public abstract class AbstractSearchProvider implements SearchProvider { + + public static final boolean supportsPrefix(String providerPrefix, String searchPrefix) { + if (searchPrefix == null || "".equals(searchPrefix)) { + return false; + } + return providerPrefix.startsWith(searchPrefix.substring(0, Math.min(searchPrefix.length(), providerPrefix.length()))); + } + + @Override + public void onFocusSearchResult(SearchResult searchResult, OperationContext operationContext) { + } + + @Override + public void onDefocusSearchResult(SearchResult searchResult, OperationContext operationContext) { + } + + @Override + public void onCenterSearchResult(SearchResult searchResult, GraphContainer graphContainer) { + } + + @Override + public void onToggleCollapse(SearchResult searchResult, GraphContainer graphContainer) { + } +} diff --git a/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/CollapsibleCriteria.java b/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/CollapsibleCriteria.java new file mode 100644 index 000000000000..6f82461a9443 --- /dev/null +++ b/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/CollapsibleCriteria.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ + +package org.opennms.features.topology.api.topo; + +import java.util.Set; + +/** + * This interface indicates that a criteria can be used to "collapse" elements of the graph. + * When collapsed, all of the elements of the graph will be replaced with a single vertex that + * represents all of the members. Edges that point to any member will be attached to the single + * vertex. + */ +public interface CollapsibleCriteria { + + String getId(); + + /** + * Check to see whether the Criteria is collapsed or not. + */ + boolean isCollapsed(); + + /** + * Set the collapsed state of the criteria. + * @param collapsed Whether the criteria should be collapsed or not. + */ + void setCollapsed(boolean collapsed); + + /** + * Fetch the list of child vertices that should be collapsed + */ + Set getVertices(); + + /** + * This function returns the vertex that will be used to represent the group when the state is + * set to collapsed. + */ + Vertex getCollapsedRepresentation(); + + String getLabel(); + + String getNamespace(); +} diff --git a/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/Connector.java b/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/Connector.java index c8654e09e640..2f00f4d0788a 100644 --- a/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/Connector.java +++ b/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/Connector.java @@ -33,4 +33,6 @@ public interface Connector extends ConnectorRef { EdgeRef getEdge(); VertexRef getVertex(); + + void setVertex(VertexRef vertex); } diff --git a/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/SearchProvider.java b/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/SearchProvider.java index 915f37d0f47d..13b91cc8dfbd 100644 --- a/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/SearchProvider.java +++ b/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/SearchProvider.java @@ -28,16 +28,14 @@ package org.opennms.features.topology.api.topo; +import java.util.List; + import org.opennms.features.topology.api.GraphContainer; import org.opennms.features.topology.api.OperationContext; -import org.opennms.features.topology.api.support.AbstractSearchSelectionOperation; -import org.opennms.features.topology.api.support.VertexHopGraphProvider.VertexHopCriteria; - -import java.util.List; public interface SearchProvider { String getSearchProviderNamespace(); - public boolean contributesTo(String namespace); + boolean contributesTo(String namespace); List query(SearchQuery searchQuery); void onFocusSearchResult(SearchResult searchResult, OperationContext operationContext); void onDefocusSearchResult(SearchResult searchResult, OperationContext operationContext); @@ -46,4 +44,5 @@ public interface SearchProvider { void addVertexHopCriteria(SearchResult searchResult, GraphContainer container); void removeVertexHopCriteria(SearchResult searchResult, GraphContainer container); void onCenterSearchResult(SearchResult searchResult, GraphContainer graphContainer); + void onToggleCollapse(SearchResult searchResult, GraphContainer graphContainer); } diff --git a/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/SearchResult.java b/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/SearchResult.java index 5a8c0eabec64..94e83e83d200 100644 --- a/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/SearchResult.java +++ b/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/SearchResult.java @@ -33,15 +33,16 @@ public class SearchResult{ private final String m_id; private final String m_namespace; private final String m_label; + private boolean m_collapsible = false; - public SearchResult(String id, String namespace, String label){ + public SearchResult(String namespace, String id, String label){ m_id = id; m_namespace = namespace; m_label = label; } public SearchResult(VertexRef vertexRef) { - this(vertexRef.getId(), vertexRef.getNamespace(), vertexRef.getLabel()); + this(vertexRef.getNamespace(), vertexRef.getId(), vertexRef.getLabel()); } public String getId() { @@ -76,4 +77,12 @@ public final int hashCode() { + ((getNamespace() == null) ? 0 : getNamespace().hashCode()); return result; } + + public boolean isCollapsible() { + return m_collapsible; + } + + public void setCollapsible(boolean collapsible) { + this.m_collapsible = collapsible; + } } diff --git a/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/SimpleConnector.java b/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/SimpleConnector.java index 38245e40a07b..b9747375ad6e 100644 --- a/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/SimpleConnector.java +++ b/features/topology-map/org.opennms.features.topology.api/src/main/java/org/opennms/features/topology/api/topo/SimpleConnector.java @@ -130,6 +130,11 @@ public VertexRef getVertex() { return m_vertex; } + @Override + public void setVertex(VertexRef vertex) { + m_vertex = vertex; + } + @Override public int compareTo(Ref o) { if (this.equals(o)) { diff --git a/features/topology-map/org.opennms.features.topology.api/src/test/java/org/opennms/features/topology/api/topo/AbstractSearchProviderTest.java b/features/topology-map/org.opennms.features.topology.api/src/test/java/org/opennms/features/topology/api/topo/AbstractSearchProviderTest.java index b85788fae8e5..0657aa00f0c9 100644 --- a/features/topology-map/org.opennms.features.topology.api/src/test/java/org/opennms/features/topology/api/topo/AbstractSearchProviderTest.java +++ b/features/topology-map/org.opennms.features.topology.api/src/test/java/org/opennms/features/topology/api/topo/AbstractSearchProviderTest.java @@ -28,16 +28,15 @@ package org.opennms.features.topology.api.topo; -import org.junit.Test; -import org.opennms.features.topology.api.GraphContainer; -import org.opennms.features.topology.api.OperationContext; -import org.opennms.features.topology.api.support.AbstractSearchSelectionOperation; -import org.opennms.features.topology.api.support.VertexHopGraphProvider; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; -import static org.junit.Assert.assertEquals; +import org.junit.Test; +import org.opennms.features.topology.api.GraphContainer; public class AbstractSearchProviderTest { @@ -108,7 +107,7 @@ public void testSearchProvider(){ } private SearchProvider createSearchProvider() { - return new SearchProvider() { + return new AbstractSearchProvider() { List m_vertexRefs = getVertexRefs(); @@ -127,21 +126,12 @@ public List query(SearchQuery searchQuery) { List verts = new ArrayList(); for (VertexRef vertexRef : m_vertexRefs) { if (searchQuery.matches(vertexRef.getLabel())) { - verts.add(new SearchResult(vertexRef.getId(), vertexRef.getNamespace(), vertexRef.getLabel())); + verts.add(new SearchResult(vertexRef.getNamespace(), vertexRef.getId(), vertexRef.getLabel())); } } return verts; } - @Override - public void onFocusSearchResult(SearchResult searchResult, OperationContext operationContext) { - } - - @Override - public void onDefocusSearchResult(SearchResult searchResult, OperationContext operationContext) { - - } - @Override public boolean supportsPrefix(String searchPrefix) { return false; @@ -154,20 +144,25 @@ public List getVertexRefsBy(SearchResult searchResult) { @Override public void addVertexHopCriteria(SearchResult searchResult, GraphContainer container) { - } @Override public void removeVertexHopCriteria(SearchResult searchResult, GraphContainer container) { - - } - - @Override - public void onCenterSearchResult(SearchResult searchResult, GraphContainer graphContainer) { } - }; } + + @Test + public void testSupportsPrefix() { + assertFalse(AbstractSearchProvider.supportsPrefix("category=", null)); + assertFalse(AbstractSearchProvider.supportsPrefix("category=", "")); + assertFalse(AbstractSearchProvider.supportsPrefix("category=", "d")); + assertTrue(AbstractSearchProvider.supportsPrefix("category=", "c")); + assertTrue(AbstractSearchProvider.supportsPrefix("category=", "cat")); + assertTrue(AbstractSearchProvider.supportsPrefix("category=", "category")); + assertFalse(AbstractSearchProvider.supportsPrefix("category=", "categoryy")); + assertTrue(AbstractSearchProvider.supportsPrefix("category=", "category=")); + } private List getVertexRefs(){ List vertexRefs = new ArrayList(); diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/CategorySearchProvider.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/CategorySearchProvider.java index 97beaa0b94c0..3ede2c4d262e 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/CategorySearchProvider.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/CategorySearchProvider.java @@ -28,18 +28,23 @@ package org.opennms.features.topology.app.internal; -import com.google.common.collect.Lists; +import java.util.ArrayList; +import java.util.List; + import org.opennms.features.topology.api.GraphContainer; -import org.opennms.features.topology.api.OperationContext; -import org.opennms.features.topology.api.topo.*; +import org.opennms.features.topology.api.support.VertexHopGraphProvider; +import org.opennms.features.topology.api.topo.AbstractSearchProvider; +import org.opennms.features.topology.api.topo.CollapsibleCriteria; +import org.opennms.features.topology.api.topo.SearchProvider; +import org.opennms.features.topology.api.topo.SearchQuery; +import org.opennms.features.topology.api.topo.SearchResult; +import org.opennms.features.topology.api.topo.VertexRef; import org.opennms.features.topology.app.internal.support.CategoryHopCriteria; import org.opennms.features.topology.app.internal.support.CategoryHopCriteriaFactory; import org.opennms.netmgt.dao.api.CategoryDao; import org.opennms.netmgt.dao.api.NodeDao; -import java.util.List; - -public class CategorySearchProvider implements SearchProvider{ +public class CategorySearchProvider extends AbstractSearchProvider implements SearchProvider { private CategoryHopCriteriaFactory m_categoryHopFactory; private CategoryDao m_categoryDao; @@ -62,29 +67,20 @@ public boolean contributesTo(String namespace) { @Override public List query(SearchQuery searchQuery) { List categories = m_categoryDao.getAllCategoryNames(); - List results = Lists.newArrayList(); + List results = new ArrayList(); for (String category : categories) { if(searchQuery.matches(category)){ - SearchResult result = new SearchResult(category, "category", category); + SearchResult result = new SearchResult("category", category, category); + result.setCollapsible(true); results.add(result); } } return results; } - @Override - public void onFocusSearchResult(SearchResult searchResult, OperationContext operationContext) { - - } - - @Override - public void onDefocusSearchResult(SearchResult searchResult, OperationContext operationContext) { - - } - @Override public boolean supportsPrefix(String searchPrefix) { - return searchPrefix.toLowerCase().equals("category="); + return supportsPrefix("category=", searchPrefix); } @Override @@ -106,11 +102,6 @@ public void removeVertexHopCriteria(SearchResult searchResult, GraphContainer co container.removeCriteria(c); } - @Override - public void onCenterSearchResult(SearchResult searchResult, GraphContainer graphContainer) { - - } - public CategoryDao getCategoryDao() { return m_categoryDao; } @@ -118,4 +109,16 @@ public CategoryDao getCategoryDao() { public void setCategoryDao(CategoryDao m_categoryDao) { this.m_categoryDao = m_categoryDao; } + + @Override + public void onToggleCollapse(SearchResult searchResult, GraphContainer graphContainer) { + CollapsibleCriteria[] criteria = VertexHopGraphProvider.getCollapsibleCriteriaForContainer(graphContainer); + for (CollapsibleCriteria criterium : criteria) { + if (criterium.getId().equals(searchResult.getId())) { + criterium.setCollapsed(!criterium.isCollapsed()); + graphContainer.redoLayout(); + break; + } + } + } } diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/TopologyUI.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/TopologyUI.java index a7caf8c7aeba..92a6cade5ac3 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/TopologyUI.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/TopologyUI.java @@ -126,7 +126,6 @@ public void refresh(Refresher refresher) { if (needsRefresh()) { refreshUI(); } - updateCounter(); } private void refreshUI() { @@ -142,22 +141,6 @@ private void refreshUI() { } } - private void updateCounter() { - if (m_graphContainer.getAutoRefreshSupport().isEnabled()) { - final long interval = m_graphContainer.getAutoRefreshSupport().getInterval(); //in seconds - final long diff = System.currentTimeMillis() - lastUpdateTime; - final long secondsPassed = diff / 1000; - final long secondsLeft = interval - secondsPassed; - m_refreshCounter.setCaption(Long.toString(secondsLeft)); - m_refreshCounter.setDescription(secondsLeft + " seconds until next refresh"); - m_refreshCounter.setEnabled(true); - } else { - m_refreshCounter.setCaption(""); - m_refreshCounter.setDescription("Auto-Refresh is disabled"); - m_refreshCounter.setEnabled(false); - } - } - private boolean needsRefresh() { if (refreshInProgress) { return false; @@ -199,7 +182,6 @@ private boolean needsRefresh() { private VerticesUpdateManager m_verticesUpdateManager; private Button m_panBtn; private Button m_selectBtn; - private final Label m_refreshCounter = new Label(); private Button m_szlOutBtn; int m_settingFragment = 0; @@ -207,15 +189,7 @@ private String getHeader(HttpServletRequest request) { if(m_headerProvider == null) { return ""; } else { - String headerHtml = m_headerProvider.getHeaderHtml(request); - - /** - * Adding some magic to hide the header when displayed inside an iFrame - */ - - headerHtml += ""; - - return headerHtml; + return m_headerProvider.getHeaderHtml(request); } } @@ -649,9 +623,7 @@ public void buttonClick(ClickEvent event) { VerticalLayout toolbar = new VerticalLayout(); toolbar.setDefaultComponentAlignment(Alignment.MIDDLE_CENTER); toolbar.setSpacing(true); - if (m_graphContainer.hasAutoRefreshSupport()) { - toolbar.addComponent(m_refreshCounter); - } + toolbar.addComponent(historyCtrlLayout); toolbar.addComponent(locationToolLayout); toolbar.addComponent(showFocusVerticesBtn); diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/GWTVertex.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/GWTVertex.java index c31bec038084..ea9d4fed1c92 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/GWTVertex.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/GWTVertex.java @@ -56,10 +56,10 @@ public class GWTVertex extends JavaScriptObject { protected GWTVertex() {}; public static native GWTVertex create(String id, int x, int y) /*-{ - return {"id":id, "x":x, "y":y, "initialX":0, "initialY":0, "selected":false, + return {"id":id, "x":x, "y":y, "initialX":-1000, "initialY":-1000, "selected":false, "iconUrl":"", "svgIconId":"", "semanticZoomLevel":0, "group":null, "status":"", "statusCount":"", "iconHeight":48, "iconWidth":48, "tooltipText":"", - "severityArray":[], "total": 0, "isGroup": true, "stylename":"vertex"}; + "severityArray":[], "total": 0, "isGroup": true, "stylename":"vertex", "isIconNormalized": false}; }-*/; public final native String getId()/*-{ @@ -210,6 +210,14 @@ public final native boolean isGroup() /*-{ public final native void setIsGroup(boolean group) /*-{ this.isGroup = group; }-*/; + + public final native void setIconNormalized(boolean bool) /*-{ + this.isIconNormalized = bool; + }-*/; + + public final native boolean isIconNormalized() /*-{ + return this.isIconNormalized; + }-*/; public final String[] getClassArray() { return classArray; @@ -373,6 +381,9 @@ public String call(GWTVertex vertex, int index) { double iconHeight = scaleFactor * height; vertex.setIconHeight(iconHeight); vertex.setIconWidth(scaleFactor * width); + if(scaleFactor != Double.POSITIVE_INFINITY){ + vertex.setIconNormalized(true); + } return "translate(-" + newX +" , -" + newY +") scale(" + scaleFactor + ")"; } }; @@ -456,13 +467,31 @@ public String call(GWTVertex vertex, int index) { }; } + protected static Func getVertexOpacity(){ + return new Func() { + @Override + public String call(GWTVertex vertex, int index) { + return vertex.isIconNormalized() ? "1" : "0"; + } + }; + } + + protected static Func getVertexVisibility(){ + return new Func() { + @Override + public String call(GWTVertex vertex, int index) { + return vertex.isIconNormalized() ? "visible" : "hidden"; + } + }; + } + public static D3Behavior draw() { return new D3Behavior() { @Override public D3 run(D3 selection) { final D3 iconContainer = selection.select(".icon-container"); - iconContainer.attr("transform", normalizeSVGIcon()).attr("opacity", 1); + iconContainer.attr("transform", normalizeSVGIcon()).attr("opacity", getVertexOpacity()); iconContainer.select(".vertex .activeIcon").attr("opacity", selectionFilter()); selection.select(".svgIconOverlay").attr("width", calculateOverlayWidth()).attr("height", calculateOverlayHeight()) @@ -493,7 +522,7 @@ public D3 run(D3 selection) { vertex.attr("opacity",1e-6).style("cursor", "pointer"); vertex.append("svg:rect").attr("class", "status").attr("fill", "none").attr("stroke-width", 5).attr("stroke-location", "outside").attr("stroke", "blue").attr("opacity", 0); - D3 svgIconContainer = vertex.append("g").attr("class", "icon-container"); + D3 svgIconContainer = vertex.append("g").attr("class", "icon-container").attr("opacity", 0); D3 svgIcon = svgIconContainer.append("use"); D3 svgIconRollover = svgIconContainer.append("use"); D3 svgIconActive = svgIconContainer.append("use"); @@ -527,7 +556,7 @@ public void call(Object o, int index) { } }); - svgIconContainer.attr("opacity", 0); + svgIcon.attr("xlink:href", svgIconId("")).attr("class", "upIcon"); svgIconRollover.attr("xlink:href", svgIconId("_rollover")).attr("class", "overIcon").attr("opacity", 0); svgIconActive.attr("xlink:href", svgIconId("_active")).attr("class", "activeIcon").attr("opacity", 0); @@ -553,7 +582,7 @@ public void call(Object o, int index) { }; } public static final native void logDocument(Object doc)/*-{ - $wnd.console.log(doc) + $wnd.console.debug(doc); }-*/; //support for creating a node-chart diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/SearchBoxConnector.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/SearchBoxConnector.java index cddbe05cab51..efdb418643d6 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/SearchBoxConnector.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/SearchBoxConnector.java @@ -28,6 +28,8 @@ package org.opennms.features.topology.app.internal.gwt.client; +import java.util.Date; + import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.SuggestOracle; import com.vaadin.client.communication.RpcProxy; @@ -114,4 +116,8 @@ public void addToFocus(SearchSuggestion searchSugestion){ public void centerOnSuggestion(SearchSuggestion searchSuggestion) { m_rpc.centerSearchSuggestion(searchSuggestion); } + + public void toggleSuggestionCollapse(SearchSuggestion searchSuggestion) { + m_rpc.toggleSuggestionCollapse(searchSuggestion); + } } diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/SearchBoxServerRpc.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/SearchBoxServerRpc.java index cca5a4d6885b..7719f6d211d8 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/SearchBoxServerRpc.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/SearchBoxServerRpc.java @@ -30,8 +30,6 @@ import com.vaadin.shared.communication.ServerRpc; -import java.util.List; - public interface SearchBoxServerRpc extends ServerRpc { public void querySuggestions(String query, int indexFrom, int indexTo); @@ -40,4 +38,5 @@ public interface SearchBoxServerRpc extends ServerRpc { public void addToFocus(SearchSuggestion searchSuggestion); public void removeFocused(SearchSuggestion searchSuggestion); public void centerSearchSuggestion(SearchSuggestion searchSuggestion); + public void toggleSuggestionCollapse(SearchSuggestion searchSuggestion); } diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/SearchSuggestion.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/SearchSuggestion.java index f9965bab05d8..8177c6f3fca3 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/SearchSuggestion.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/SearchSuggestion.java @@ -28,17 +28,29 @@ package org.opennms.features.topology.app.internal.gwt.client; +import java.io.Serializable; + import com.google.gwt.user.client.ui.SuggestOracle; -public class SearchSuggestion implements SuggestOracle.Suggestion { +public class SearchSuggestion implements Serializable, SuggestOracle.Suggestion { + private static final long serialVersionUID = 1876970713330053849L; String m_label; String m_id; String m_namespace; boolean m_focused = false; + boolean m_collapsible = false; + + public boolean isCollapsible() { + return m_collapsible; + } + + public void setCollapsible(boolean collapsible) { + this.m_collapsible = collapsible; + } - public void setLabel(String label){ + public void setLabel(String label){ m_label = label; } diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/TopologyViewImpl.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/TopologyViewImpl.java index 0d74e4c8674e..237973a28729 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/TopologyViewImpl.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/TopologyViewImpl.java @@ -72,6 +72,7 @@ protected void onLoad() { super.onLoad(); m_widgetContainer.setSize("100%", "100%"); sinkEvents(Event.ONCONTEXTMENU | VTooltip.TOOLTIP_EVENTS | Event.ONMOUSEWHEEL); + m_svg.setId("TopologyComponent"); } @Override diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/VSearchBox.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/VSearchBox.java index 2d0ed2952a8e..e9e7867ee379 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/VSearchBox.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/VSearchBox.java @@ -28,22 +28,42 @@ package org.opennms.features.topology.app.internal.gwt.client; -import com.google.common.collect.Lists; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.opennms.features.topology.app.internal.gwt.client.ui.SearchTokenField; +import org.opennms.features.topology.app.internal.gwt.client.ui.SearchTokenField.CollapseCallback; + import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; +import com.google.gwt.event.logical.shared.ResizeEvent; +import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; +import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.user.client.ui.*; -import org.opennms.features.topology.app.internal.gwt.client.ui.SearchTokenField; - -import java.util.*; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.HasHorizontalAlignment; +import com.google.gwt.user.client.ui.SuggestBox; +import com.google.gwt.user.client.ui.SuggestOracle; +import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.TextBoxBase; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; public class VSearchBox extends Composite implements SelectionHandler,KeyUpHandler { + private HandlerRegistration m_windowResizeRegistration; + public class DefaultCenterOnCallback implements SearchTokenField.CenterOnSuggestionCallback{ @Override @@ -80,12 +100,18 @@ interface VSearchComboBoxUiBinder extends UiBinder {} @UiField FlowPanel m_componentHolder; + FlowPanel m_scrollContainer; VerticalPanel m_focusedContainer; SuggestBox m_suggestBox; public VSearchBox(){ initWidget(uiBinder.createAndBindUi(this)); + } + @Override + protected void onDetach() { + super.onDetach(); + m_windowResizeRegistration.removeHandler(); } @Override @@ -125,15 +151,58 @@ public void onSelection(SelectionEvent event) { if(m_focusedContainer == null){ m_focusedContainer = new VerticalPanel(); - m_focusedContainer.setWidth("100%"); + + m_scrollContainer = new FlowPanel(); + m_scrollContainer.getElement().getStyle().setBackgroundColor("#f9f9f9"); + m_scrollContainer.add(m_focusedContainer); } m_focusedContainer.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT); m_focusedContainer.setTitle("Focused Vertices"); - m_componentHolder.add(m_focusedContainer); + m_componentHolder.add(m_scrollContainer); + + Timer timer = new Timer(){ + + @Override + public void run(){ + updateScrollPanelSize(); + } + }; + + timer.schedule(1000); + + m_windowResizeRegistration = Window.addResizeHandler(new ResizeHandler() { + @Override + public void onResize(ResizeEvent event) { + updateScrollPanelSize(); + } + }); + } + private void updateScrollPanelSize() { + Element topologyComponent = DOM.getElementById("TopologyComponent"); + int topoHeight = topologyComponent.getOffsetHeight(); + int containerHeight = topoHeight - (m_focusedContainer.getElement().getOffsetTop() + 5); + int tableHeight = m_focusedContainer.getOffsetHeight(); + + if(containerHeight >= 0){ + m_scrollContainer.setHeight("" + Math.min(containerHeight, tableHeight) + "px"); + + if(tableHeight > containerHeight){ + m_scrollContainer.getElement().getStyle().setOverflowY(Style.Overflow.SCROLL); + } else{ + m_scrollContainer.getElement().getStyle().setOverflowY(Style.Overflow.HIDDEN); + } + } + + } + + public static native void debug(Object obj) /*-{ + $wnd.console.debug(obj); + }-*/; + @Override public void onSelection(SelectionEvent event) { SuggestOracle.Suggestion suggestion = event.getSelectedItem(); @@ -161,10 +230,20 @@ public void onRemove(SearchSuggestion searchSuggestion) { } }); field.setCenterOnCallback(new DefaultCenterOnCallback()); + if (searchSuggestion.isCollapsible()) { + field.setCollapseCallback(new CollapseCallback() { + @Override + public void onCollapse(SearchSuggestion searchSuggestion) { + m_connector.toggleSuggestionCollapse(searchSuggestion); + } + }); + } m_focusedContainer.add(field); } + updateScrollPanelSize(); + } private static native void log(Object message) /*-{ diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/ui/SearchTokenField.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/ui/SearchTokenField.java index 2eac9897548e..04cd6292009c 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/ui/SearchTokenField.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/gwt/client/ui/SearchTokenField.java @@ -28,18 +28,29 @@ package org.opennms.features.topology.app.internal.gwt.client.ui; +import org.opennms.features.topology.app.internal.gwt.client.SearchSuggestion; +import org.springframework.util.StringUtils; + import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.SpanElement; import com.google.gwt.dom.client.Style; +import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.client.ui.*; -import org.opennms.features.topology.app.internal.gwt.client.SearchSuggestion; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.HasHorizontalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Widget; public class SearchTokenField extends Composite { + public interface CollapseCallback{ + void onCollapse(SearchSuggestion searchSuggestion); + } + public interface RemoveCallback{ void onRemove(SearchSuggestion searchSuggestion); } @@ -63,10 +74,14 @@ public interface SearchTokenFieldUiBinder extends UiBinder - + + - + diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/jung/AbstractLayoutAlgorithm.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/jung/AbstractLayoutAlgorithm.java index 6a2c4feee5ef..9703bce0873a 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/jung/AbstractLayoutAlgorithm.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/jung/AbstractLayoutAlgorithm.java @@ -9,19 +9,27 @@ import org.opennms.features.topology.api.Layout; import org.opennms.features.topology.api.LayoutAlgorithm; import org.opennms.features.topology.api.topo.VertexRef; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public abstract class AbstractLayoutAlgorithm implements LayoutAlgorithm, LayoutConstants { + + private static final Logger LOG = LoggerFactory.getLogger(AbstractLayoutAlgorithm.class); @Override abstract public void updateLayout(GraphContainer graph); protected static Dimension selectLayoutSize(GraphContainer g) { - int vertexCount = g.getGraph().getDisplayVertices().size(); + int vertexCount = g.getGraph().getDisplayVertices().size(); - double height = 1.5*Math.sqrt(vertexCount)*ELBOW_ROOM; - double width = height*16.0/9.0; + double height = 1.5*Math.sqrt(vertexCount)*ELBOW_ROOM; + double width = height*16.0/9.0; - return new Dimension((int)width, (int)height); + Dimension dim = new Dimension((int)width, (int)height); + + LOG.debug("selectLayoutSize: vertexCount={}, returm dim={}", vertexCount, dim); + + return dim; } protected static Transformer initializer(final Layout graphLayout) { diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/jung/LayoutConstants.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/jung/LayoutConstants.java index 7780067d6bab..aa62f53dcc57 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/jung/LayoutConstants.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/jung/LayoutConstants.java @@ -30,7 +30,7 @@ public interface LayoutConstants { - public static final int ELBOW_ROOM = 200; + public static final int ELBOW_ROOM = 50; public static final int LAYOUT_HEIGHT = 2000; public static final int LAYOUT_WIDTH = (int)(LAYOUT_HEIGHT*16.0/9.0); public static final double SPRING_FORCE_MULTIPLIER = 2.0/3.0; diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/operations/DeleteGroupOperation.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/operations/DeleteGroupOperation.java index ab7ae48dde58..0cd25f33884b 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/operations/DeleteGroupOperation.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/operations/DeleteGroupOperation.java @@ -86,6 +86,7 @@ public boolean enabled(List targets, OperationContext operationContex return targets != null && targets.size() == 1 && targets.get(0) != null && + operationContext.getGraphContainer().getBaseTopology().getVertex(targets.get(0)) != null && operationContext.getGraphContainer().getBaseTopology().getVertex(targets.get(0)).isGroup() ; } diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/operations/RenameGroupOperation.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/operations/RenameGroupOperation.java index 56c17716b228..709bd05c21b4 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/operations/RenameGroupOperation.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/operations/RenameGroupOperation.java @@ -202,6 +202,7 @@ public boolean enabled(List targets, OperationContext operationContex return targets != null && targets.size() == 1 && targets.get(0) != null && + operationContext.getGraphContainer().getBaseTopology().getVertex(targets.get(0)) != null && operationContext.getGraphContainer().getBaseTopology().getVertex(targets.get(0)).isGroup() ; } diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/support/CategoryHopCriteria.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/support/CategoryHopCriteria.java index b3651ea88424..145dee7c8a5f 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/support/CategoryHopCriteria.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/support/CategoryHopCriteria.java @@ -6,23 +6,40 @@ import java.util.TreeSet; import org.opennms.features.topology.api.support.VertexHopGraphProvider.VertexHopCriteria; +import org.opennms.features.topology.api.topo.AbstractVertex; import org.opennms.features.topology.api.topo.AbstractVertexRef; +import org.opennms.features.topology.api.topo.CollapsibleCriteria; import org.opennms.features.topology.api.topo.RefComparator; +import org.opennms.features.topology.api.topo.Vertex; import org.opennms.features.topology.api.topo.VertexRef; import org.opennms.netmgt.dao.api.CategoryDao; import org.opennms.netmgt.dao.api.NodeDao; import org.opennms.netmgt.model.OnmsCategory; import org.opennms.netmgt.model.OnmsNode; -public class CategoryHopCriteria extends VertexHopCriteria { +public class CategoryHopCriteria extends VertexHopCriteria implements CollapsibleCriteria { private final String m_categoryName; private CategoryDao m_categoryDao; private NodeDao m_nodeDao; + private boolean m_collapsed = false; + private CategoryVertex m_collapsedVertex; + + public static class CategoryVertex extends AbstractVertex { + public CategoryVertex(String namespace, String id, String label) { + super(namespace, id, label); + } + + @Override + public boolean isGroup() { + return true; + } + } public CategoryHopCriteria(String categoryName) { m_categoryName = categoryName; setLabel(m_categoryName); + m_collapsedVertex = new CategoryVertex("nodes", "category:" + m_categoryName, m_categoryName); } public CategoryDao getCategoryDao() { @@ -82,4 +99,22 @@ public Set getVertices() { return retval; } } + + @Override + public boolean isCollapsed() { + return m_collapsed; + } + + @Override + public void setCollapsed(boolean collapsed) { + if (collapsed != isCollapsed()) { + this.m_collapsed = collapsed; + setDirty(true); + } + } + + @Override + public Vertex getCollapsedRepresentation() { + return m_collapsedVertex; + } } diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/ui/SearchBox.java b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/ui/SearchBox.java index 788f506f2e23..3eb25c708f37 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/ui/SearchBox.java +++ b/features/topology-map/org.opennms.features.topology.app/src/main/java/org/opennms/features/topology/app/internal/ui/SearchBox.java @@ -44,6 +44,7 @@ import org.opennms.features.topology.api.support.VertexHopGraphProvider.VertexHopCriteria; import org.opennms.features.topology.api.topo.AbstractSearchQuery; import org.opennms.features.topology.api.topo.AbstractVertexRef; +import org.opennms.features.topology.api.topo.CollapsibleCriteria; import org.opennms.features.topology.api.topo.Criteria; import org.opennms.features.topology.api.topo.SearchProvider; import org.opennms.features.topology.api.topo.SearchQuery; @@ -52,6 +53,7 @@ import org.opennms.features.topology.app.internal.gwt.client.SearchBoxServerRpc; import org.opennms.features.topology.app.internal.gwt.client.SearchBoxState; import org.opennms.features.topology.app.internal.gwt.client.SearchSuggestion; +import org.opennms.features.topology.app.internal.support.CategoryHopCriteria; import org.opennms.osgi.OnmsServiceManager; import com.google.common.base.Function; @@ -80,7 +82,7 @@ public void querySuggestions(String query, int indexFrom, int indexTo) { @Override public void selectSuggestion(SearchSuggestion searchSuggestion) { - SearchResult searchResult = new SearchResult(searchSuggestion.getId(), searchSuggestion.getNamespace(), searchSuggestion.getLabel()); + SearchResult searchResult = new SearchResult(searchSuggestion.getNamespace(), searchSuggestion.getId(), searchSuggestion.getLabel()); Multiset keys = m_suggestionMap.keys(); for(SearchProvider key : keys){ @@ -94,7 +96,7 @@ public void selectSuggestion(SearchSuggestion searchSuggestion) { @Override public void removeSelected(SearchSuggestion searchSuggestion) { - SearchResult searchResult = new SearchResult(searchSuggestion.getId(), searchSuggestion.getNamespace(), searchSuggestion.getLabel()); + SearchResult searchResult = new SearchResult(searchSuggestion.getNamespace(), searchSuggestion.getId(), searchSuggestion.getLabel()); Multiset keys = m_suggestionMap.keys(); for(SearchProvider key : keys){ @@ -109,7 +111,7 @@ public void removeSelected(SearchSuggestion searchSuggestion) { @Override public void addToFocus(SearchSuggestion searchSuggestion) { - SearchResult searchResult = new SearchResult(searchSuggestion.getId(), searchSuggestion.getNamespace(), searchSuggestion.getLabel()); + SearchResult searchResult = new SearchResult(searchSuggestion.getNamespace(), searchSuggestion.getId(), searchSuggestion.getLabel()); Multiset keys = m_suggestionMap.keys(); for(SearchProvider key : keys){ @@ -126,7 +128,7 @@ public void addToFocus(SearchSuggestion searchSuggestion) { @Override public void removeFocused(SearchSuggestion searchSuggestion) { - SearchResult searchResult = new SearchResult(searchSuggestion.getId(), searchSuggestion.getNamespace(), searchSuggestion.getLabel()); + SearchResult searchResult = new SearchResult(searchSuggestion.getNamespace(), searchSuggestion.getId(), searchSuggestion.getLabel()); Multiset keys = m_suggestionMap.keys(); for(SearchProvider key : keys){ @@ -145,7 +147,7 @@ public void removeFocused(SearchSuggestion searchSuggestion) { @Override public void centerSearchSuggestion(SearchSuggestion searchSuggestion){ - SearchResult searchResult = new SearchResult(searchSuggestion.getId(), searchSuggestion.getNamespace(), searchSuggestion.getLabel()); + SearchResult searchResult = new SearchResult(searchSuggestion.getNamespace(), searchSuggestion.getId(), searchSuggestion.getLabel()); List vRefs = null; Multiset keys = m_suggestionMap.keys(); @@ -173,6 +175,18 @@ public void centerSearchSuggestion(SearchSuggestion searchSuggestion){ mapViewManager.setBoundingBox(graphContainer.getGraph().getLayout().computeBoundingBox(vRefs)); } + @Override + public void toggleSuggestionCollapse(SearchSuggestion searchSuggestion) { + SearchResult searchResult = new SearchResult(searchSuggestion.getNamespace(), searchSuggestion.getId(), searchSuggestion.getLabel()); + Multiset keys = m_suggestionMap.keys(); + for(SearchProvider key : keys){ + Collection searchResults = m_suggestionMap.get(key); + if(searchResults.contains(searchResult)) { + key.onToggleCollapse(searchResult, m_operationContext.getGraphContainer()); + break; + } + } + } }; public SearchBox(OnmsServiceManager serviceManager, OperationContext operationContext) { @@ -191,7 +205,6 @@ public void removeIfSpecialURLCase(SearchResult searchResult) { private List getQueryResults(final String query) { - String searchPrefix = getQueryPrefix(query); String namespace = m_operationContext.getGraphContainer().getBaseTopology().getVertexNamespace(); List providers = m_serviceManager.getServices(SearchProvider.class, null, new Properties()); @@ -199,8 +212,9 @@ private List getQueryResults(final String query) { for(SearchProvider provider : providers) { if(provider.getSearchProviderNamespace().equals(namespace) || provider.contributesTo(namespace)){ - if(searchPrefix != null && provider.supportsPrefix(searchPrefix)) { - String queryOnly = query.replace(searchPrefix, ""); + if(provider.supportsPrefix(query)) { + // If there is an '=' divider, strip it off. Otherwise, use an empty query string + String queryOnly = query.indexOf('=') > 0 ? query.substring(query.indexOf('=') + 1) : ""; List q = provider.query(getSearchQuery(queryOnly)); results.addAll(q); if(m_suggestionMap.containsKey(provider)){ @@ -226,25 +240,15 @@ private List getQueryResults(final String query) { } - private SearchQuery getSearchQuery(String query) { - SearchQuery searchQuery; - if(query.equals("*")){ - searchQuery = new AllSearchQuery(query); - } else{ - searchQuery = new ContainsSearchQuery(query); - } - return searchQuery; - } - - public String getQueryPrefix(String query){ - String prefix = null; - if(query.contains("=")){ - prefix = query.substring(0, query.indexOf('=') + 1); + private static SearchQuery getSearchQuery(String query) { + if("*".equals(query) || "".equals(query)){ + return new AllSearchQuery(query); + } else { + return new ContainsSearchQuery(query); } - return prefix; } - private List mapToSuggestions(List searchResults) { + private static List mapToSuggestions(List searchResults) { return Lists.transform(searchResults, new Function(){ @Override public SearchSuggestion apply(SearchResult searchResult) { @@ -254,20 +258,21 @@ public SearchSuggestion apply(SearchResult searchResult) { } - private VertexRef mapToVertexRef(SearchSuggestion suggestion) { + private static VertexRef mapToVertexRef(SearchSuggestion suggestion) { return new AbstractVertexRef(suggestion.getNamespace(), suggestion.getId(), suggestion.getLabel()); } - private SearchSuggestion mapToSearchSuggestion(SearchResult searchResult) { + private static SearchSuggestion mapToSearchSuggestion(SearchResult searchResult) { SearchSuggestion suggestion = new SearchSuggestion(); suggestion.setNamespace(searchResult.getNamespace()); suggestion.setId(searchResult.getId()); suggestion.setLabel(searchResult.getLabel()); + suggestion.setCollapsible(searchResult.isCollapsible()); return suggestion; } - private SearchSuggestion mapToSearchSuggestion(VertexRef vertexRef) { + private static SearchSuggestion mapToSearchSuggestion(VertexRef vertexRef) { SearchSuggestion suggestion = new SearchSuggestion(); suggestion.setNamespace(vertexRef.getNamespace()); suggestion.setId(vertexRef.getId()); @@ -316,8 +321,20 @@ private void updateTokenFieldList(GraphContainer graphContainer) { for (Criteria criteria : criterium) { - try { - if(criteria != nodeCriteria){ + if(criteria != nodeCriteria){ + try { + CollapsibleCriteria crit = (CollapsibleCriteria) criteria; + SearchSuggestion suggestion = new SearchSuggestion(); + suggestion.setId(crit.getId()); + suggestion.setLabel(crit.getLabel()); + suggestion.setNamespace(crit.getNamespace()); + suggestion.setCollapsible(true); + + suggestions.add(suggestion); + continue; + } catch (ClassCastException e) {} + + try { VertexHopCriteria crit = (VertexHopCriteria) criteria; SearchSuggestion suggestion = new SearchSuggestion(); suggestion.setId(crit.getId()); @@ -325,15 +342,15 @@ private void updateTokenFieldList(GraphContainer graphContainer) { suggestion.setNamespace(crit.getNamespace()); suggestions.add(suggestion); - } - } catch (ClassCastException e) { + continue; + } catch (ClassCastException e) {} } } getState().setFocused(suggestions); } - private class ContainsSearchQuery extends AbstractSearchQuery implements SearchQuery { + private static class ContainsSearchQuery extends AbstractSearchQuery implements SearchQuery { public ContainsSearchQuery(String query) { super(query); } @@ -344,7 +361,7 @@ public boolean matches(String str) { } } - private class AllSearchQuery extends AbstractSearchQuery{ + private static class AllSearchQuery extends AbstractSearchQuery{ public AllSearchQuery(String queryString) { super(queryString); diff --git a/features/topology-map/org.opennms.features.topology.app/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/features/topology-map/org.opennms.features.topology.app/src/main/resources/OSGI-INF/blueprint/blueprint.xml index 01ee7958b095..9ae8fea9d0c8 100644 --- a/features/topology-map/org.opennms.features.topology.app/src/main/resources/OSGI-INF/blueprint/blueprint.xml +++ b/features/topology-map/org.opennms.features.topology.app/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -242,7 +242,7 @@ http://www.osgi.org/xmlns/blueprint-ext/v1.1.0 https://svn.apache.org/repos/asf/ - + @@ -311,7 +311,7 @@ http://www.osgi.org/xmlns/blueprint-ext/v1.1.0 https://svn.apache.org/repos/asf/ - + diff --git a/features/topology-map/org.opennms.features.topology.widgetset/pom.xml b/features/topology-map/org.opennms.features.topology.widgetset/pom.xml index 9fa52526b892..136cf5156cb7 100644 --- a/features/topology-map/org.opennms.features.topology.widgetset/pom.xml +++ b/features/topology-map/org.opennms.features.topology.widgetset/pom.xml @@ -38,9 +38,12 @@ true http://localhost:8980/opennms/topology true + + 0.0.0.0 + goals @@ -288,6 +288,11 @@ opennms-reporting runtime + + org.opennms + opennms-rrd-model + compile + org.opennms opennms-rrd-jrobin @@ -631,10 +636,6 @@ postgresql postgresql - - org.opennms - opennms-qosdaemon - axis axis diff --git a/opennms-base-assembly/src/main/filtered/bin/install b/opennms-base-assembly/src/main/filtered/bin/install index ad12678026d3..ca3944647908 100755 --- a/opennms-base-assembly/src/main/filtered/bin/install +++ b/opennms-base-assembly/src/main/filtered/bin/install @@ -1,6 +1,15 @@ #!/bin/sh - OPENNMS_HOME="${install.dir}" +RUNAS="root" + +myuser="`id | sed -e 's/uid=[0-9][0-9]*(//' -e 's/).*//'`" +if [ x"$myuser" = x"$RUNAS" ]; then + true # all is well +else + echo "Error: you must run this script as $RUNAS, not '$myuser'" >&2 + exit 4 # According to LSB: 4 - user had insufficient privileges +fi if [ -f "$OPENNMS_HOME/etc/opennms.conf" ]; then . "$OPENNMS_HOME/etc/opennms.conf" diff --git a/opennms-base-assembly/src/main/filtered/bin/upgrade b/opennms-base-assembly/src/main/filtered/bin/upgrade new file mode 100755 index 000000000000..30b822b65022 --- /dev/null +++ b/opennms-base-assembly/src/main/filtered/bin/upgrade @@ -0,0 +1,19 @@ +#!/bin/sh - + +JAVA_OPTIONS="-Xmx512m" +OPENNMS_HOME="${install.dir}" +RUNAS="root" + +myuser="`id | sed -e 's/uid=[0-9][0-9]*(//' -e 's/).*//'`" +if [ x"$myuser" = x"$RUNAS" ]; then + true # all is well +else + echo "Error: you must run this script as $RUNAS, not '$myuser'" >&2 + exit 4 # According to LSB: 4 - user had insufficient privileges +fi + +app_class=org.opennms.upgrade.support.Upgrade +exec $OPENNMS_HOME/bin/runjava -r -- $JAVA_OPTIONS \ + -Dopennms.home=$OPENNMS_HOME \ + -Dopennms.manager.class=$app_class \ + -jar $OPENNMS_HOME/lib/opennms_bootstrap.jar $@ diff --git a/opennms-base-assembly/src/main/filtered/etc/jmx-datacollection-config.xml b/opennms-base-assembly/src/main/filtered/etc/jmx-datacollection-config.xml index 59f70e032fbf..1d61df823a3c 100644 --- a/opennms-base-assembly/src/main/filtered/etc/jmx-datacollection-config.xml +++ b/opennms-base-assembly/src/main/filtered/etc/jmx-datacollection-config.xml @@ -116,107 +116,107 @@ - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + diff --git a/opennms-base-assembly/src/main/filtered/etc/monitoring-locations.xml b/opennms-base-assembly/src/main/filtered/etc/monitoring-locations.xml index c9b39dd2319e..07a4a960a046 100644 --- a/opennms-base-assembly/src/main/filtered/etc/monitoring-locations.xml +++ b/opennms-base-assembly/src/main/filtered/etc/monitoring-locations.xml @@ -1,2 +1,4 @@ - \ No newline at end of file + + + diff --git a/opennms-base-assembly/src/main/filtered/etc/opennms-datasources.xml b/opennms-base-assembly/src/main/filtered/etc/opennms-datasources.xml index e9e9b337a892..18469de46ce3 100644 --- a/opennms-base-assembly/src/main/filtered/etc/opennms-datasources.xml +++ b/opennms-base-assembly/src/main/filtered/etc/opennms-datasources.xml @@ -6,16 +6,25 @@ - + +use strict; + +my $configFile = shift @ARGV or die "Please specify the JMX file you want to patch\n"; + +my $isXml = $configFile =~ m/\.xml$/; + +open CFG, $configFile or die "Can't read $configFile\n"; +while(my $line = ) { + if ($isXml) { + $line = applyFix($line, $1) if $line =~ m/alias="(.+\..+)"/; + } else { + $line = applyFix($line, $1) if $line =~ m/ DEF:.+:(.+\..+):/; + if ($line =~ m/\.columns=(.+)$/) { + my $columns = $1; + my @words = split /[,\s]+/, $columns; + foreach my $w (@words) { + $line = applyFix($line, $w); + } + } + } + print $line; +} +close CFG; + +sub applyFix { + my ($line, $word) = @_; + return $line unless $word; + my $target = $word; + if ($target =~ m/.+\..+/) { + $target =~ s/\.(\w+)/\u$1/; + } else { + $target =~ s/\.//; + } + $line =~ s/$word/$target/; + return $line; +} diff --git a/opennms-config-tester/pom.xml b/opennms-config-tester/pom.xml index 86e1921644c3..b7fa941bf9a2 100644 --- a/opennms-config-tester/pom.xml +++ b/opennms-config-tester/pom.xml @@ -62,10 +62,6 @@ org.opennms opennms-map-provisioning-adapter - - org.opennms - opennms-import - org.opennms.features opennms-integration-otrs diff --git a/opennms-config-tester/src/main/resources/META-INF/opennms/applicationContext-configTester.xml b/opennms-config-tester/src/main/resources/META-INF/opennms/applicationContext-configTester.xml index 45916e7c626d..65c1dfc14779 100644 --- a/opennms-config-tester/src/main/resources/META-INF/opennms/applicationContext-configTester.xml +++ b/opennms-config-tester/src/main/resources/META-INF/opennms/applicationContext-configTester.xml @@ -357,16 +357,8 @@ org.opennms.netmgt.filter.FilterParseException: SQL Exception occurred getting I --> - - org.opennms.core.db.ConnectionFactoryUtil.marshalDataSourceFromConfig - - - - ${opennms.home}/etc/opennms-datasources.xml - - opennms - - + + diff --git a/opennms-config/src/main/java/org/opennms/netmgt/config/DBPoolConnectionFactory.java b/opennms-config/src/main/java/org/opennms/netmgt/config/DBPoolConnectionFactory.java index 959bf847b277..61bf13702c14 100644 --- a/opennms-config/src/main/java/org/opennms/netmgt/config/DBPoolConnectionFactory.java +++ b/opennms-config/src/main/java/org/opennms/netmgt/config/DBPoolConnectionFactory.java @@ -29,8 +29,6 @@ package org.opennms.netmgt.config; import java.beans.PropertyVetoException; -import java.io.IOException; -import java.io.InputStream; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; @@ -41,9 +39,9 @@ import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.ValidationException; import org.opennms.core.db.BaseConnectionFactory; +import org.opennms.netmgt.config.opennmsDataSources.JdbcDataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.opennms.netmgt.config.opennmsDataSources.JdbcDataSource; import snaq.db.DBPoolDataSource; @@ -55,12 +53,8 @@ public class DBPoolConnectionFactory extends BaseConnectionFactory { private DBPoolDataSource m_dataSource; - public DBPoolConnectionFactory(final InputStream stream, final String dsName) throws MarshalException, ValidationException, PropertyVetoException, SQLException { - super(stream, dsName); - } - - public DBPoolConnectionFactory(final String configFile, final String dsName) throws IOException, MarshalException, ValidationException, PropertyVetoException, SQLException { - super(configFile, dsName); + public DBPoolConnectionFactory(final JdbcDataSource ds) throws MarshalException, ValidationException, PropertyVetoException, SQLException { + super(ds); } @Override @@ -120,7 +114,7 @@ public void setLogWriter(final PrintWriter out) throws SQLException { } @Override - public void setLoginTimeout(final int seconds) throws SQLException { + public void setLoginTimeout(final int seconds) { m_dataSource.setLoginTimeout(seconds); } @@ -135,7 +129,7 @@ public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedE } @Override - public void close() throws SQLException { + public void close() { super.close(); LOG.info("Closing DBPool pool."); m_dataSource.release(); diff --git a/opennms-config/src/main/java/org/opennms/netmgt/config/TomcatJdbcPoolConnectionFactory.java b/opennms-config/src/main/java/org/opennms/netmgt/config/TomcatJdbcPoolConnectionFactory.java index 87d6f534068f..9404eb9f41b7 100644 --- a/opennms-config/src/main/java/org/opennms/netmgt/config/TomcatJdbcPoolConnectionFactory.java +++ b/opennms-config/src/main/java/org/opennms/netmgt/config/TomcatJdbcPoolConnectionFactory.java @@ -29,8 +29,6 @@ package org.opennms.netmgt.config; import java.beans.PropertyVetoException; -import java.io.IOException; -import java.io.InputStream; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; @@ -42,22 +40,18 @@ import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.ValidationException; import org.opennms.core.db.BaseConnectionFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.opennms.netmgt.config.opennmsDataSources.JdbcDataSource; import org.opennms.netmgt.config.opennmsDataSources.Param; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class TomcatJdbcPoolConnectionFactory extends BaseConnectionFactory { private static final Logger LOG = LoggerFactory.getLogger(TomcatJdbcPoolConnectionFactory.class); private org.apache.tomcat.jdbc.pool.DataSource m_dataSource; - public TomcatJdbcPoolConnectionFactory(final InputStream stream, final String dsName) throws MarshalException, ValidationException, PropertyVetoException, SQLException { - super(stream, dsName); - } - - public TomcatJdbcPoolConnectionFactory(final String configFile, final String dsName) throws IOException, MarshalException, ValidationException, PropertyVetoException, SQLException { - super(configFile, dsName); + public TomcatJdbcPoolConnectionFactory(final JdbcDataSource ds) throws MarshalException, ValidationException, PropertyVetoException, SQLException { + super(ds); } @Override @@ -128,7 +122,7 @@ public void setLogWriter(final PrintWriter out) throws SQLException { } @Override - public void setLoginTimeout(final int seconds) throws SQLException { + public void setLoginTimeout(final int seconds) { m_dataSource.setLoginTimeout(seconds); } @@ -143,7 +137,7 @@ public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedE } @Override - public void close() throws SQLException { + public void close() { super.close(); LOG.info("Closing Tomcat DBCP pool."); m_dataSource.close(); diff --git a/opennms-dao/pom.xml b/opennms-dao/pom.xml index 0a930d1dbd4a..97310e8f88e1 100644 --- a/opennms-dao/pom.xml +++ b/opennms-dao/pom.xml @@ -94,6 +94,11 @@ hibernate-dependencies pom + + org.opennms.dependencies + atomikos-dependencies + pom + org.opennms.core org.opennms.core.xml @@ -162,10 +167,6 @@ org.slf4j jcl-over-slf4j - - c3p0 - c3p0 - org.hibernate.javax.persistence hibernate-jpa-2.0-api diff --git a/opennms-import/.cvsignore b/opennms-import/.cvsignore deleted file mode 100644 index 0a83928d4c3f..000000000000 --- a/opennms-import/.cvsignore +++ /dev/null @@ -1,5 +0,0 @@ -bin -target -.classpath -.project -.wtpmodules diff --git a/opennms-import/README.eclipse b/opennms-import/README.eclipse deleted file mode 100644 index b1986188a8ec..000000000000 --- a/opennms-import/README.eclipse +++ /dev/null @@ -1,73 +0,0 @@ -To Use Eclipse to develop this project: - - -Getting the Project to Build in Eclipse - -1. Install the Maven2 Plugin for Eclipse (http://maven.apache.org/eclipse-plugin.html) -2. Go to Window->Preferences->Maven2 - a. make sure your local repository is set to /.m2/repository - b. if you would like to see more in the log turn on debug output -3. Checkout the project using eclipse from www.opennms.org:/var/lib/cvsroot - a. When checking it out just say 'check out project in workspace' -4. After the project is checked out, right-click the project and select Maven2->Enable -5. At this point the mvn builder will start and take what seems to be an excessively - long time downloading needed jars and other such stuff. (NOTE: it only takes this - very long time the first time... other runs are much quicker.. though not speedy) - a. If you find that some jars are missing that start with javax. then read this: - http://maven.apache.org/guides/mini/guide-coping-with-sun-jars.html -6. When this finally finishes, you will have a very confused project because it will - have the wrong source folders listed. To fix this right-click on the project and - select Maven2->Update Source Folders -7. After the mvn builder has run again, it will run generate-sources goal and update - the source folders for the project. (You may need to right-click the project and - select Refresh after this finishes) - a. If everything has gone will you should have the following directories as source - folders (the order may be different): - src/main/java - src/main/resources - src/test/java - src/test/resources - target/generated-sources/castor - target/generated-sources/xdoclet - -8. Lastly, depending on how you checked out the project you may need add the - JRE System Library to you classpath. - a. Right click on the project and select Build Path -> Add Libraries - b. Select the JRE System Library - c. Click finish -9. At this point you should have a working project. Try expanding the src/test/java - folder and running some tests. - - -Other Interesting Things To Do - -A. Updating the Generated Sources. - -Whenever you change the .xsd file or any of the xdoclet tags you will need to regenerate -the sources. - -1. Select Maven2->Update Source Folders. This will automatically update the project -to see if there are errors you may need to manual switch the Console to the M2 view. -Do this by click the little picture that looks like a monitor and selecting M2. - - -B. Adding dependencies - -This can be done two ways. - -1. Select Maven2->Add Dependency. This will give you a window and you can type names -into and it will search the central repo for matching dependencies. When you select -one and click Ok it will automatically update the pom.xml file. (NOTE: any comments -in the pom.xml file will be removed by the update so don't use this if you have comments -in you file) - -2. Edit pom.xml. You can manually edit pom.xml and way you want to. Whenever you save -this file the mvn builder will be run to rebuild the project - -C. Stepping into source - -1. If you source is available in the maven repo for a dependency it will automatically -be downloaded and attached to you jar file. When this happens you will be able to jump -into source code for dependencies. SpringFramework currently has source available and -so it is easy to step into spring methods - diff --git a/opennms-import/README.model-import b/opennms-import/README.model-import deleted file mode 100644 index f65a5b8e17fa..000000000000 --- a/opennms-import/README.model-import +++ /dev/null @@ -1,32 +0,0 @@ -Run mvn -Dmaven.test.skip=true package - -This will create target/model-importer-1.0-snapshot-dist.tar.gz - -Untar this in $OPENNMS_HOME - -To complete installation: - -Add to service-configuration.xml an MBean using class name - org.opennms.netmgt.importer.jmx.ImporterService - - -Then edit the configuration in etc/model-importer.properties - -Note that the database properties are in model-importer.properties so you MUST change them -to be correct. They default to a test setup - -Also Note that the default cron settings run every 10 seconds.. This is WAY to much a setting -like - -importer.importSchedule= * * 0 * * ? - -will run it every night a midnight - - -It currently uses a BasicDataSource to get DB connections. - -If you get the c3p0 datasource working in opennms you can switch the model-importer to use its setting - -The bean wiring is currently commented out about the BasisDataSource bean element in importer-context.xml - - diff --git a/opennms-import/pom.xml b/opennms-import/pom.xml deleted file mode 100644 index 08b27c2c57ac..000000000000 --- a/opennms-import/pom.xml +++ /dev/null @@ -1,190 +0,0 @@ - - - - opennms - org.opennms - 1.13.0-SNAPSHOT - - 4.0.0 - opennms-import - OpenNMS Model Importer - http://maven.apache.org - bundle - - - - org.apache.felix - maven-bundle-plugin - true - - - JavaSE-1.6 - ${project.groupId}.${project.artifactId} - ${project.version} - - - - - org.opennms.maven.plugins - castor-maven-plugin - - - maven-assembly-plugin - true - - - src/assembly/xsds.xml - - - - - package - - single - - - - - - maven-jar-plugin - - - - org.opennms.netmgt.importer.Main - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - add-source - generate-sources - - add-source - - - - ${project.build.directory}/generated-sources/castor - - - - - - - - - - org.opennms.dependencies - castor-dependencies - pom - - - org.opennms.core.test-api - org.opennms.core.test-api.db - test - - - org.opennms.core.test-api - org.opennms.core.test-api.http - test - - - org.opennms.core.test-api - org.opennms.core.test-api.services - test - - - org.opennms.core.test-api - org.opennms.core.test-api.snmp - test - - - org.opennms - opennms-config - - - org.opennms - opennms-model - - - org.opennms - opennms-services - - - org.opennms.dependencies - spring-dependencies - pom - - - org.opennms - opennms-dao - test-jar - test - - - org.opennms - opennms-dao-mock - test - - - org.opennms - opennms-test - test - - - org.opennms - opennms-rrd-api - test - - - org.opennms - opennms-rrd-jrobin - test - - - org.opennms.tests - org.opennms.tests.mock-elements - test - - - commons-beanutils - commons-beanutils-core - test - - - commons-dbcp - commons-dbcp - - - commons-io - commons-io - - - commons-lang - commons-lang - - - org.opennms.dependencies - quartz-dependencies - pom - - - oro - oro - runtime - - - postgresql - postgresql - test - - - org.opennms - opennms-icmp-jna - test - - - diff --git a/opennms-import/src/etc/model-importer.properties b/opennms-import/src/etc/model-importer.properties deleted file mode 100644 index 250d433c1159..000000000000 --- a/opennms-import/src/etc/model-importer.properties +++ /dev/null @@ -1,37 +0,0 @@ -############################################################################### -# This file is part of OpenNMS(R). -# -# Copyright (C) 2006-2012 The OpenNMS Group, Inc. -# OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. -# -# OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. -# -# OpenNMS(R) is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, -# or (at your option) any later version. -# -# OpenNMS(R) 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenNMS(R). If not, see: -# http://www.gnu.org/licenses/ -# -# For more information contact: -# OpenNMS(R) Licensing -# http://www.opennms.org/ -# http://www.opennms.com/ -############################################################################### - -importer.importURL = file:${user.dir}/src/test/resources/tec_dump.xml.smallertest -importer.importSchedule = 0/10 * * * * ? -importer.scanThreads = 50 -importer.writeThreads = 8 -importer.maxActiveConnections = 10 -importer.db.driverClassName = org.postgresql.Driver -importer.db.url = jdbc:postgresql://localhost:5432/brozow -importer.db.username = opennms -importer.db.password = opennms diff --git a/opennms-import/src/main/castor/castorbuilder.properties b/opennms-import/src/main/castor/castorbuilder.properties deleted file mode 100644 index cdd6de1cce6d..000000000000 --- a/opennms-import/src/main/castor/castorbuilder.properties +++ /dev/null @@ -1,56 +0,0 @@ -############################################################################### -# This file is part of OpenNMS(R). -# -# Copyright (C) 2006-2012 The OpenNMS Group, Inc. -# OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. -# -# OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. -# -# OpenNMS(R) is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published -# by the Free Software Foundation, either version 3 of the License, -# or (at your option) any later version. -# -# OpenNMS(R) 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with OpenNMS(R). If not, see: -# http://www.gnu.org/licenses/ -# -# For more information contact: -# OpenNMS(R) Licensing -# http://www.opennms.org/ -# http://www.opennms.com/ -############################################################################### - -# Set to true if you want to have an equals() and -# hashCode() method generated for each generated class; -# false by default -org.exolab.castor.builder.equalsmethod=true - -# -# Ensure that the extra collection based methods are created -# -org.exolab.castor.builder.extraCollectionMethods=true - -# -# Set the name of the collection methods -# -org.exolab.castor.builder.collections.reference.suffix=Collection - -# -# Use Java 5 features -# -org.exolab.castor.builder.javaVersion=5.0 - -# -# XML namespace mapping to Java packages -# -#org.exolab.castor.builder.nspackages=\ -# http://www.xyz.com/schemas/project=com.xyz.schemas.project,\ -# http://www.xyz.com/schemas/person=com.xyz.schemas.person -org.exolab.castor.builder.nspackages=\ -http://xmlns.opennms.org/xsd/config/model-import=org.opennms.netmgt.importer.config diff --git a/opennms-import/src/main/castor/model-import.xsd b/opennms-import/src/main/castor/model-import.xsd deleted file mode 100644 index b88cefbe188c..000000000000 --- a/opennms-import/src/main/castor/model-import.xsd +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - Use this configuration file as an import of nodes, interfaces, and services to OpenNMS by-passing several phases of discovery and capabilities polling. - - - - - - - - - - - - - - A node in OpenNMS is a network entity that is used to contain network interfaces and those interface's services. - - - - - - - - - - - - - - - - - - - This optional attribute can be used to facilitate integration by making the key from the integrating DB available adjacent to the OpenNMS key. - - - - - - - This optional attribute can be used to facilitate building node relationships. - - - - - - - This optional attribute can be used to facilitate building node relationships. - - - - - - - This optional attribute can be used to facilitate building node relationships. - - - - - - - This optional attribute can be used to persist an asset value to the building column in the OpenNMS DB. - - - - - - - This optional attribute can be used to persist an asset value to the building column in the OpenNMS DB. - - - - - - - - A network interface. - - - - - - - - - - This will be used to set a description field. Currently a calculation of (ifDescr | ifName | ifAlias) - - - - - Set this optional value to 3 to indicate "testing". Any other value is ignored. - - - - - - - This attribute is used by OpenNMS to control SNMP data collection. P - Primary interface. This is the "preferred interface used in data collection. - S - Secondary interface. This interface meets all the qualifications to be a primary interface. N - Not a collectable interface. - This is a manual setting controlled by the user. - - If the snmpStorageFlag is set to "all", then all interfaces not set to 'N' will be collected. If the snmpStorageFlag is set to "select", then all - interfaces with 'P|S' will be collected. If the snmpStorageFlag is set to "primary", then only the interfaces set to 'P' will be collected. - - - - - - - - - - - - - - - - - This element is defined outside of the interface element for future use where it is expected that services on other network entities will be able to be - defined (i.e. networks, nodes and applications) - - - - - - - - - - - - - - This element is used to specify OpenNMS specific categories. Note: currently, these categories are defined in a separate configuration file and - are related directly to monitored services. I have separated out this element so that it can be referenced by other entities (nodes, interfaces, etc.) - however, they will be ignored until the domain model is changed and the service layer is adapted for this behavior. - - - - - - - - - This element is used to specify an asset record attribute. - - - - - - - diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/BaseImporter.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/BaseImporter.java deleted file mode 100644 index f6d9f01b3a3a..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/BaseImporter.java +++ /dev/null @@ -1,516 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer; - -import java.io.IOException; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import org.opennms.core.utils.InetAddressUtils; -import org.opennms.netmgt.dao.api.AssetRecordDao; -import org.opennms.netmgt.dao.api.CategoryDao; -import org.opennms.netmgt.dao.api.DistPollerDao; -import org.opennms.netmgt.dao.api.IpInterfaceDao; -import org.opennms.netmgt.dao.api.MonitoredServiceDao; -import org.opennms.netmgt.dao.api.NodeDao; -import org.opennms.netmgt.dao.api.ServiceTypeDao; -import org.opennms.netmgt.eventd.datablock.EventUtil; -import org.opennms.netmgt.importer.config.Node; -import org.opennms.netmgt.importer.operations.DefaultImportStatistics; -import org.opennms.netmgt.importer.operations.DeleteOperation; -import org.opennms.netmgt.importer.operations.ImportOperationFactory; -import org.opennms.netmgt.importer.operations.ImportOperationsManager; -import org.opennms.netmgt.importer.operations.ImportStatistics; -import org.opennms.netmgt.importer.operations.InsertOperation; -import org.opennms.netmgt.importer.operations.UpdateOperation; -import org.opennms.netmgt.importer.specification.AbstractImportVisitor; -import org.opennms.netmgt.importer.specification.SpecFile; -import org.opennms.netmgt.model.OnmsCategory; -import org.opennms.netmgt.model.OnmsDistPoller; -import org.opennms.netmgt.model.OnmsIpInterface; -import org.opennms.netmgt.model.OnmsNode; -import org.opennms.netmgt.model.OnmsServiceType; -import org.opennms.netmgt.model.PathElement; -import org.opennms.netmgt.xml.event.Event; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.io.Resource; -import org.springframework.transaction.TransactionStatus; -import org.springframework.transaction.support.TransactionCallback; -import org.springframework.transaction.support.TransactionCallbackWithoutResult; -import org.springframework.transaction.support.TransactionTemplate; - -/** - *

BaseImporter class.

- * - * @author ranger - * @version $Id: $ - */ -public class BaseImporter implements ImportOperationFactory { - - private static final Logger LOG = LoggerFactory.getLogger(BaseImporter.class); - - - protected TransactionTemplate m_transTemplate; - protected DistPollerDao m_distPollerDao; - private NodeDao m_nodeDao; - private IpInterfaceDao m_ipInterfaceDao; - private ServiceTypeDao m_serviceTypeDao; - private MonitoredServiceDao m_monitoredServiceDao; - private AssetRecordDao m_assetRecordDao; - private CategoryDao m_categoryDao; - private final ThreadLocal> m_typeCache = new ThreadLocal>(); - private final ThreadLocal> m_categoryCache = new ThreadLocal>(); - private int m_scanThreads = 50; - private int m_writeThreads = 4; - - //FIXME: We have a setTransactionTemplate and a setTransTemplate for the same field. - /** - *

setTransactionTemplate

- * - * @param transTemplate a {@link org.springframework.transaction.support.TransactionTemplate} object. - */ - public void setTransactionTemplate(TransactionTemplate transTemplate) { - m_transTemplate = transTemplate; - } - - /** - *

getDistPollerDao

- * - * @return a {@link org.opennms.netmgt.dao.api.DistPollerDao} object. - */ - public DistPollerDao getDistPollerDao() { - return m_distPollerDao; - } - - /** - *

setDistPollerDao

- * - * @param distPollerDao a {@link org.opennms.netmgt.dao.api.DistPollerDao} object. - */ - public void setDistPollerDao(DistPollerDao distPollerDao) { - m_distPollerDao = distPollerDao; - } - - /** - *

getNodeDao

- * - * @return a {@link org.opennms.netmgt.dao.api.NodeDao} object. - */ - public NodeDao getNodeDao() { - return m_nodeDao; - } - - /** - *

setNodeDao

- * - * @param nodeDao a {@link org.opennms.netmgt.dao.api.NodeDao} object. - */ - public void setNodeDao(NodeDao nodeDao) { - m_nodeDao = nodeDao; - } - - /** - *

getIpInterfaceDao

- * - * @return a {@link org.opennms.netmgt.dao.api.IpInterfaceDao} object. - */ - public IpInterfaceDao getIpInterfaceDao() { - return m_ipInterfaceDao; - } - - /** - *

setIpInterfaceDao

- * - * @param ipInterfaceDao a {@link org.opennms.netmgt.dao.api.IpInterfaceDao} object. - */ - public void setIpInterfaceDao(IpInterfaceDao ipInterfaceDao) { - m_ipInterfaceDao = ipInterfaceDao; - } - - /** - *

getMonitoredServiceDao

- * - * @return a {@link org.opennms.netmgt.dao.api.MonitoredServiceDao} object. - */ - public MonitoredServiceDao getMonitoredServiceDao() { - return m_monitoredServiceDao; - } - - /** - *

setMonitoredServiceDao

- * - * @param monitoredServiceDao a {@link org.opennms.netmgt.dao.api.MonitoredServiceDao} object. - */ - public void setMonitoredServiceDao(MonitoredServiceDao monitoredServiceDao) { - m_monitoredServiceDao = monitoredServiceDao; - } - - /** - *

getServiceTypeDao

- * - * @return a {@link org.opennms.netmgt.dao.api.ServiceTypeDao} object. - */ - public ServiceTypeDao getServiceTypeDao() { - return m_serviceTypeDao; - } - - /** - *

setServiceTypeDao

- * - * @param serviceTypeDao a {@link org.opennms.netmgt.dao.api.ServiceTypeDao} object. - */ - public void setServiceTypeDao(ServiceTypeDao serviceTypeDao) { - m_serviceTypeDao = serviceTypeDao; - } - - /** - *

getAssetRecordDao

- * - * @return a {@link org.opennms.netmgt.dao.api.AssetRecordDao} object. - */ - public AssetRecordDao getAssetRecordDao() { - return m_assetRecordDao; - } - - /** - *

setAssetRecordDao

- * - * @param assetRecordDao a {@link org.opennms.netmgt.dao.api.AssetRecordDao} object. - */ - public void setAssetRecordDao(AssetRecordDao assetRecordDao) { - m_assetRecordDao = assetRecordDao; - } - - /** - *

getTransTemplate

- * - * @return a {@link org.springframework.transaction.support.TransactionTemplate} object. - */ - public TransactionTemplate getTransTemplate() { - return m_transTemplate; - } - - /** - *

setTransTemplate

- * - * @param transTemplate a {@link org.springframework.transaction.support.TransactionTemplate} object. - */ - public void setTransTemplate(TransactionTemplate transTemplate) { - m_transTemplate = transTemplate; - } - - /** {@inheritDoc} */ - @Override - public InsertOperation createInsertOperation(String foreignSource, String foreignId, String nodeLabel, String building, String city) { - InsertOperation insertOperation = new InsertOperation(foreignSource, foreignId, nodeLabel, building, city); - insertOperation.setNodeDao(m_nodeDao); - insertOperation.setDistPollerDao(m_distPollerDao); - insertOperation.setServiceTypeDao(m_serviceTypeDao); - insertOperation.setCategoryDao(m_categoryDao); - insertOperation.setTypeCache(m_typeCache); - insertOperation.setCategoryCache(m_categoryCache); - return insertOperation; - - } - - /** {@inheritDoc} */ - @Override - public UpdateOperation createUpdateOperation(Integer nodeId, String foreignSource, String foreignId, String nodeLabel, String building, String city) { - UpdateOperation updateOperation = new UpdateOperation(nodeId, foreignSource, foreignId, nodeLabel, building, city); - updateOperation.setNodeDao(m_nodeDao); - updateOperation.setDistPollerDao(m_distPollerDao); - updateOperation.setServiceTypeDao(m_serviceTypeDao); - updateOperation.setCategoryDao(m_categoryDao); - updateOperation.setTypeCache(m_typeCache); - updateOperation.setCategoryCache(m_categoryCache); - return updateOperation; - } - - /** {@inheritDoc} */ - @Override - public DeleteOperation createDeleteOperation(Integer nodeId, String foreignSource, String foreignId) { - return new DeleteOperation(nodeId, foreignSource, foreignId, m_nodeDao); - } - - /** - *

importModelFromResource

- * - * @param resource a {@link org.springframework.core.io.Resource} object. - * @throws java.io.IOException if any. - * @throws org.opennms.netmgt.importer.ModelImportException if any. - */ - protected void importModelFromResource(Resource resource) throws IOException, ModelImportException { - importModelFromResource(resource, new DefaultImportStatistics(), null); - } - - /** - *

importModelFromResource

- * - * @param resource a {@link org.springframework.core.io.Resource} object. - * @param stats a {@link org.opennms.netmgt.importer.operations.ImportStatistics} object. - * @param event a {@link org.opennms.netmgt.xml.event.Event} object. - * @throws java.io.IOException if any. - * @throws org.opennms.netmgt.importer.ModelImportException if any. - */ - protected void importModelFromResource(Resource resource, ImportStatistics stats, Event event) throws IOException, ModelImportException { - - stats.beginImporting(); - stats.beginLoadingResource(resource); - - SpecFile specFile = new SpecFile(); - specFile.loadResource(resource); - - stats.finishLoadingResource(resource); - - - if (event != null && getEventForeignSource(event) != null) { - specFile.setForeignSource(getEventForeignSource(event)); - } - - stats.beginAuditNodes(); - createDistPollerIfNecessary(); - - Map foreignIdsToNodes = getForeignIdToNodeMap(specFile.getForeignSource()); - - ImportOperationsManager opsMgr = createImportOperationsManager(foreignIdsToNodes, stats); - opsMgr.setForeignSource(specFile.getForeignSource()); - opsMgr.setScanThreads(m_scanThreads); - opsMgr.setWriteThreads(m_writeThreads); - - auditNodes(opsMgr, specFile); - - stats.finishAuditNodes(); - - opsMgr.persistOperations(m_transTemplate, getNodeDao()); - - stats.beginRelateNodes(); - - relateNodes(specFile); - - stats.finishRelateNodes(); - - stats.finishImporting(); - } - - private String getEventForeignSource(Event event) { - return EventUtil.getNamedParmValue("parm[foreignSource]", event); - } - - /** - *

createImportOperationsManager

- * - * @param foreignIdsToNodes a {@link java.util.Map} object. - * @param stats a {@link org.opennms.netmgt.importer.operations.ImportStatistics} object. - * @return a {@link org.opennms.netmgt.importer.operations.ImportOperationsManager} object. - */ - protected ImportOperationsManager createImportOperationsManager(Map foreignIdsToNodes, ImportStatistics stats) { - ImportOperationsManager opsMgr = new ImportOperationsManager(foreignIdsToNodes, this); - opsMgr.setStats(stats); - return opsMgr; - } - - private void auditNodes(final ImportOperationsManager opsMgr, final SpecFile specFile) { - m_transTemplate.execute(new TransactionCallbackWithoutResult() { - - @Override - public void doInTransactionWithoutResult(TransactionStatus status) { - ImportAccountant accountant = new ImportAccountant(opsMgr); - specFile.visitImport(accountant); - } - - }); - } - - class NodeRelator extends AbstractImportVisitor { - String m_foreignSource; - - public NodeRelator(String foreignSource) { - m_foreignSource = foreignSource; - } - - @Override - public void visitNode(final Node node) { - m_transTemplate.execute(new TransactionCallbackWithoutResult() { - @Override - protected void doInTransactionWithoutResult(TransactionStatus status) { - - OnmsNode dbNode = findNodeByForeignId(m_foreignSource, node.getForeignId()); - if (dbNode == null) { - LOG.error("Error setting parent on node: {} node not in database", node.getForeignId()); - return; - } - OnmsNode parent = findParent(node); - - OnmsIpInterface critIface = null; - if (parent != null) { - critIface = getCriticalInterface(parent); - } - - LOG.info("Setting parent of node: {} to: {}", dbNode, parent); - dbNode.setParent(parent); - LOG.info("Setting criticalInterface of node: {} to: {}", dbNode, critIface); - if (critIface == null) { - dbNode.setPathElement(null); - } else { - final String ipAddress = InetAddressUtils.str(critIface.getIpAddress()); - dbNode.setPathElement(new PathElement(ipAddress, "ICMP")); - } - getNodeDao().update(dbNode); - } - - private OnmsIpInterface getCriticalInterface(OnmsNode parent) { - - OnmsIpInterface critIface = parent.getPrimaryInterface(); - if (critIface != null) { - return critIface; - } - - return parent.getInterfaceWithService("ICMP"); - - } - - }); - } - - private OnmsNode findParent(Node node) { - if (node.getParentForeignId() != null) { - return findNodeByForeignId(m_foreignSource, node.getParentForeignId()); - } else if (node.getParentNodeLabel() != null) { - return findNodeByNodeLabel(node.getParentNodeLabel()); - } - - return null; - } - - private OnmsNode findNodeByNodeLabel(String label) { - Collection nodes = getNodeDao().findByLabel(label); - if (nodes.size() == 1) { - return nodes.iterator().next(); - } - - LOG.error("Unable to locate a unique node using label {}{} nodes found. Ignoring relationship.", label, nodes.size()); - return null; - } - - private OnmsNode findNodeByForeignId(String foreignSource, String foreignId) { - return getNodeDao().findByForeignId(foreignSource, foreignId); - } - - }; - - private void relateNodes(SpecFile specFile) { - specFile.visitImport(new NodeRelator(specFile.getForeignSource())); - } - - - private Map getForeignIdToNodeMap(final String foreignSource) { - return m_transTemplate.execute(new TransactionCallback>() { - @Override - public Map doInTransaction(TransactionStatus status) { - return Collections.unmodifiableMap(getNodeDao().getForeignIdToNodeIdMap(foreignSource)); - } - }); - - } - - private OnmsDistPoller createDistPollerIfNecessary() { - return m_transTemplate.execute(new TransactionCallback() { - - @Override - public OnmsDistPoller doInTransaction(TransactionStatus status) { - OnmsDistPoller distPoller = m_distPollerDao.get("localhost"); - if (distPoller == null) { - distPoller = new OnmsDistPoller("localhost", "127.0.0.1"); - m_distPollerDao.save(distPoller); - } - return distPoller; - } - - }); - - } - - /** - *

getCategoryDao

- * - * @return a {@link org.opennms.netmgt.dao.api.CategoryDao} object. - */ - public CategoryDao getCategoryDao() { - return m_categoryDao; - } - - /** - *

setCategoryDao

- * - * @param categoryDao a {@link org.opennms.netmgt.dao.api.CategoryDao} object. - */ - public void setCategoryDao(CategoryDao categoryDao) { - m_categoryDao = categoryDao; - } - - /** - *

getScanThreads

- * - * @return a int. - */ - public int getScanThreads() { - return m_scanThreads; - } - - /** - *

setScanThreads

- * - * @param poolSize a int. - */ - public void setScanThreads(int poolSize) { - m_scanThreads = poolSize; - } - - /** - *

getWriteThreads

- * - * @return a int. - */ - public int getWriteThreads() { - return m_writeThreads; - } - - /** - *

setWriteThreads

- * - * @param writeThreads a int. - */ - public void setWriteThreads(int writeThreads) { - m_writeThreads = writeThreads; - } - -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/ImportAccountant.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/ImportAccountant.java deleted file mode 100644 index 154f9413667e..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/ImportAccountant.java +++ /dev/null @@ -1,94 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer; - -import org.opennms.netmgt.importer.config.Asset; -import org.opennms.netmgt.importer.config.Category; -import org.opennms.netmgt.importer.config.Interface; -import org.opennms.netmgt.importer.config.MonitoredService; -import org.opennms.netmgt.importer.config.Node; -import org.opennms.netmgt.importer.operations.ImportOperationsManager; -import org.opennms.netmgt.importer.operations.SaveOrUpdateOperation; -import org.opennms.netmgt.importer.specification.AbstractImportVisitor; - -/** - *

ImportAccountant class.

- * - * @author ranger - * @version $Id: $ - */ -public class ImportAccountant extends AbstractImportVisitor { - private final ImportOperationsManager m_opsMgr; - private SaveOrUpdateOperation m_currentOp; - - /** - *

Constructor for ImportAccountant.

- * - * @param opsMgr a {@link org.opennms.netmgt.importer.operations.ImportOperationsManager} object. - */ - public ImportAccountant(ImportOperationsManager opsMgr) { - m_opsMgr = opsMgr; - } - - /** {@inheritDoc} */ - @Override - public void visitNode(Node node) { - m_currentOp = m_opsMgr.foundNode(node.getForeignId(), node.getNodeLabel(), node.getBuilding(), node.getCity()); - } - /** {@inheritDoc} */ - @Override - public void completeNode(Node node) { - m_currentOp = null; - } - - /** {@inheritDoc} */ - @Override - public void visitInterface(Interface iface) { - m_currentOp.foundInterface(iface.getIpAddr(), iface.getDescr(), iface.getSnmpPrimary(), iface.getManaged(), iface.getStatus()); - - } - - /** {@inheritDoc} */ - @Override - public void visitMonitoredService(MonitoredService svc) { - m_currentOp.foundMonitoredService(svc.getServiceName()); - } - - /** {@inheritDoc} */ - @Override - public void visitCategory(Category category) { - m_currentOp.foundCategory(category.getName()); - } - - /** {@inheritDoc} */ - @Override - public void visitAsset(Asset asset) { - m_currentOp.foundAsset(asset.getName(), asset.getValue()); - } -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/ImporterService.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/ImporterService.java deleted file mode 100644 index 11fa891a4fdd..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/ImporterService.java +++ /dev/null @@ -1,485 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer; - -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import org.opennms.core.logging.Logging; -import org.opennms.netmgt.EventConstants; -import org.opennms.netmgt.daemon.SpringServiceDaemon; -import org.opennms.netmgt.importer.operations.AbstractSaveOrUpdateOperation; -import org.opennms.netmgt.importer.operations.ImportOperation; -import org.opennms.netmgt.importer.operations.ImportOperationsManager; -import org.opennms.netmgt.importer.operations.ImportStatistics; -import org.opennms.netmgt.model.events.EventBuilder; -import org.opennms.netmgt.model.events.EventIpcManager; -import org.opennms.netmgt.model.events.EventListener; -import org.opennms.netmgt.model.events.EventUtils; -import org.opennms.netmgt.xml.event.Event; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.core.io.Resource; -import org.springframework.core.io.UrlResource; - -/** - *

ImporterService class.

- * - * @author ranger - * @version $Id: $ - */ -public class ImporterService extends BaseImporter implements SpringServiceDaemon, DisposableBean, EventListener { - - private static final Logger LOG = LoggerFactory.getLogger(ImporterService.class); - - /** Constant NAME="ModelImporter" */ - public static final String NAME = "model-importer"; - - private volatile Resource m_importResource; - private volatile EventIpcManager m_eventManager; - private volatile ImporterStats m_stats; - - - /** - *

doImport

- */ - public void doImport() { - doImport(null); - } - - /** - * Begins importing from resource specified in model-importer.properties file or - * in event parameter: url. Import Resources are managed with a "key" called - * "foreignSource" specified in the XML retreived by the resource and can be overridden - * as a parameter of an event. - * @param event - */ - private void doImport(Event event) { - Resource resource = null; - try { - m_stats = new ImporterStats(); - resource = ((event != null && getEventUrl(event) != null) ? new UrlResource(getEventUrl(event)) : m_importResource); - sendImportStarted(resource); - importModelFromResource(resource, m_stats, event); - LOG.info("Finished Importing: {}", m_stats); - sendImportSuccessful(m_stats, resource); - } catch (IOException e) { - String msg = "IOException importing "+resource; - LOG.error(msg, e); - sendImportFailed(msg+": "+e.getMessage(), resource); - } catch (ModelImportException e) { - String msg = "Error parsing import data from "+resource; - LOG.error(msg, e); - sendImportFailed(msg+": "+e.getMessage(), resource); - } - } - - private String getEventUrl(Event event) { - return EventUtils.getParm(event, EventConstants.PARM_URL); - } - - /** - *

getStats

- * - * @return a {@link java.lang.String} object. - */ - public String getStats() { return (m_stats == null ? "No Stats Availabile" : m_stats.toString()); } - - private void sendImportSuccessful(ImporterStats stats, Resource resource) { - EventBuilder builder = new EventBuilder(EventConstants.IMPORT_SUCCESSFUL_UEI, NAME); - builder.addParam(EventConstants.PARM_IMPORT_RESOURCE, resource.toString()); - builder.addParam(EventConstants.PARM_IMPORT_STATS, stats.toString()); - m_eventManager.sendNow(builder.getEvent()); - } - - private void sendImportFailed(String msg, Resource resource) { - EventBuilder builder = new EventBuilder(EventConstants.IMPORT_FAILED_UEI, NAME); - builder.addParam(EventConstants.PARM_IMPORT_RESOURCE, resource.toString()); - builder.addParam(EventConstants.PARM_FAILURE_MESSAGE, msg); - m_eventManager.sendNow(builder.getEvent()); - } - - private void sendImportStarted(Resource resource) { - EventBuilder builder = new EventBuilder(EventConstants.IMPORT_STARTED_UEI, NAME); - builder.addParam(EventConstants.PARM_IMPORT_RESOURCE, resource.toString()); - m_eventManager.sendNow(builder.getEvent()); - } - - /** - *

setImportResource

- * - * @param resource a {@link org.springframework.core.io.Resource} object. - */ - public void setImportResource(Resource resource) { - m_importResource = resource; - } - - /** - *

getEventManager

- * - * @return a {@link org.opennms.netmgt.model.events.EventIpcManager} object. - */ - public EventIpcManager getEventManager() { - return m_eventManager; - } - - /** - *

setEventManager

- * - * @param eventManager a {@link org.opennms.netmgt.model.events.EventIpcManager} object. - */ - public void setEventManager(EventIpcManager eventManager) { - m_eventManager = eventManager; - } - - /** {@inheritDoc} */ - @Override - protected ImportOperationsManager createImportOperationsManager(Map assetNumbersToNodes, ImportStatistics stats) { - ImportOperationsManager opsMgr = super.createImportOperationsManager(assetNumbersToNodes, stats); - opsMgr.setEventMgr(m_eventManager); - return opsMgr; - } - - /** - *

afterPropertiesSet

- * - * @throws java.lang.Exception if any. - */ - @Override - public void afterPropertiesSet() throws Exception { - m_eventManager.addEventListener(this, EventConstants.RELOAD_IMPORT_UEI); - } - - /** - *

destroy

- * - * @throws java.lang.Exception if any. - */ - @Override - public void destroy() throws Exception { - m_eventManager.removeEventListener(this, EventConstants.RELOAD_IMPORT_UEI); - - } - - /** - *

getName

- * - * @return a {@link java.lang.String} object. - */ - @Override - public String getName() { - return NAME; - } - - /** {@inheritDoc} */ - @Override - public void onEvent(Event e) { - - Map mdc = Logging.getCopyOfContextMap(); - try { - Logging.putPrefix(NAME); - - if (!EventConstants.RELOAD_IMPORT_UEI.equals(e.getUei())) { - return; - } - doImport(e); - } finally { - Logging.setContextMap(mdc); - } - } - - public class ImporterStats implements ImportStatistics { - - private Duration m_importDuration = new Duration("Importing"); - private Duration m_auditDuration = new Duration("Auditing"); - private Duration m_loadingDuration = new Duration("Loading"); - private Duration m_processingDuration = new Duration("Processing"); - private Duration m_preprocessingDuration = new Duration("Scanning"); - private Duration m_relateDuration = new Duration("Relating"); - private WorkEffort m_preprocessingEffort = new WorkEffort("Scan Effort"); - private WorkEffort m_processingEffort = new WorkEffort("Write Effort"); - private WorkEffort m_eventEffort = new WorkEffort("Event Sending Effort"); - private int m_deleteCount; - private int m_insertCount; - private int m_updateCount; - private int m_eventCount; - - @Override - public void beginProcessingOps() { - m_processingDuration.start(); - } - - @Override - public void finishProcessingOps() { - m_processingDuration.end(); - } - - @Override - public void beginPreprocessingOps() { - m_preprocessingDuration.start(); - } - - @Override - public void finishPreprocessingOps() { - m_preprocessingDuration.end(); - } - - @Override - public void beginPreprocessing(ImportOperation oper) { - if (oper instanceof AbstractSaveOrUpdateOperation) { - m_preprocessingEffort.begin(); - } - } - - @Override - public void finishPreprocessing(ImportOperation oper) { - if (oper instanceof AbstractSaveOrUpdateOperation) { - m_preprocessingEffort.end(); - } - } - - @Override - public void beginPersisting(ImportOperation oper) { - m_processingEffort.begin(); - - } - - @Override - public void finishPersisting(ImportOperation oper) { - m_processingEffort.end(); - } - - @Override - public void beginSendingEvents(ImportOperation oper, List events) { - if (events != null) m_eventCount += events.size(); - m_eventEffort.begin(); - } - - @Override - public void finishSendingEvents(ImportOperation oper, List events) { - m_eventEffort.end(); - } - - @Override - public void beginLoadingResource(Resource resource) { - m_loadingDuration.setName("Loading Resource: "+resource); - m_loadingDuration.start(); - } - - @Override - public void finishLoadingResource(Resource resource) { - m_loadingDuration.end(); - } - - @Override - public void beginImporting() { - m_importDuration.start(); - } - - @Override - public void finishImporting() { - m_importDuration.end(); - } - - @Override - public void beginAuditNodes() { - m_auditDuration.start(); - } - - @Override - public void finishAuditNodes() { - m_auditDuration.end(); - } - - @Override - public void setDeleteCount(int deleteCount) { - m_deleteCount = deleteCount; - } - - @Override - public void setInsertCount(int insertCount) { - m_insertCount = insertCount; - } - - @Override - public void setUpdateCount(int updateCount) { - m_updateCount = updateCount; - } - - @Override - public void beginRelateNodes() { - m_relateDuration.start(); - } - - @Override - public void finishRelateNodes() { - m_relateDuration.end(); - } - - @Override - public String toString() { - StringBuffer stats = new StringBuffer(); - stats.append("Deletes: ").append(m_deleteCount).append(' '); - stats.append("Updates: ").append(m_updateCount).append(' '); - stats.append("Inserts: ").append(m_insertCount).append('\n'); - stats.append(m_importDuration).append(' '); - stats.append(m_loadingDuration).append(' '); - stats.append(m_auditDuration).append('\n'); - stats.append(m_preprocessingDuration).append(' '); - stats.append(m_processingDuration).append(' '); - stats.append(m_relateDuration).append(' '); - stats.append(m_preprocessingEffort).append(' '); - stats.append(m_processingEffort).append(' '); - stats.append(m_eventEffort).append(' '); - if (m_eventCount > 0) { - stats.append("Avg ").append((double)m_eventEffort.getTotalTime()/(double)m_eventCount).append(" ms per event"); - } - - return stats.toString(); - } - - } - - public class Duration { - - private String m_name = null; - private long m_start = -1L; - private long m_end = -1L; - - public Duration() { - this(null); - } - - public Duration(String name) { - m_name = name; - } - - public void setName(String name) { - m_name = name; - } - - public void start() { - m_start = System.currentTimeMillis(); - } - - public void end() { - m_end = System.currentTimeMillis(); - } - - public long getLength() { - if (m_start == -1L) return 0L; - long end = (m_end == -1L ? System.currentTimeMillis() : m_end); - return end - m_start; - } - - @Override - public String toString() { - return (m_name == null ? "" : m_name+": ")+(m_start == -1L ? "has not begun": elapsedTime()); - } - - private String elapsedTime() { - - long duration = getLength(); - - long hours = duration / 3600000L; - duration = duration % 3600000L; - long mins = duration / 60000L; - duration = duration % 60000L; - long secs = duration / 1000L; - long millis = duration % 1000L; - - StringBuffer elapsed = new StringBuffer(); - if (hours > 0) - elapsed.append(hours).append("h "); - if (mins > 0) - elapsed.append(mins).append("m "); - if (secs > 0) - elapsed.append(secs).append("s "); - if (millis > 0) - elapsed.append(millis).append("ms"); - - return elapsed.toString(); - - } - - } - - public class WorkEffort { - - private String m_name; - private long m_totalTime; - private long m_sectionCount; - private ThreadLocal m_pendingSection = new ThreadLocal(); - - public WorkEffort(String name) { - m_name = name; - } - - public void begin() { - Duration pending = new Duration(); - pending.start(); - m_pendingSection.set(pending); - } - - public void end() { - Duration pending = m_pendingSection.get(); - m_sectionCount++; - m_totalTime += pending.getLength(); - } - - public long getTotalTime() { - return m_totalTime; - } - - @Override - public String toString() { - StringBuffer buf = new StringBuffer(); - buf.append("Total ").append(m_name).append(": "); - buf.append((double)m_totalTime/(double)1000L).append(" thread-seconds"); - if (m_sectionCount > 0) { - buf.append(" Avg ").append(m_name).append(": "); - buf.append((double)m_totalTime/(double)m_sectionCount).append(" ms per node"); - } - return buf.toString(); - } - - } - - /** - *

start

- * - * @throws java.lang.Exception if any. - */ - @Override - public void start() throws Exception { - // nothing to do -- we're event-driven - } -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/AbstractSaveOrUpdateOperation.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/AbstractSaveOrUpdateOperation.java deleted file mode 100644 index 3f32228a9a7b..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/AbstractSaveOrUpdateOperation.java +++ /dev/null @@ -1,522 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer.operations; - -import static org.opennms.core.utils.InetAddressUtils.addr; -import static org.opennms.core.utils.InetAddressUtils.str; - -import java.net.InetAddress; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.opennms.netmgt.capsd.IfSnmpCollector; -import org.opennms.netmgt.capsd.snmp.IfTableEntry; -import org.opennms.netmgt.dao.api.CategoryDao; -import org.opennms.netmgt.dao.api.DistPollerDao; -import org.opennms.netmgt.dao.api.NodeDao; -import org.opennms.netmgt.dao.api.ServiceTypeDao; -import org.opennms.netmgt.importer.config.types.InterfaceSnmpPrimaryType; -import org.opennms.netmgt.model.OnmsCategory; -import org.opennms.netmgt.model.OnmsIpInterface; -import org.opennms.netmgt.model.OnmsMonitoredService; -import org.opennms.netmgt.model.OnmsNode; -import org.opennms.netmgt.model.OnmsNode.NodeLabelSource; -import org.opennms.netmgt.model.OnmsNode.NodeType; -import org.opennms.netmgt.model.OnmsServiceType; -import org.opennms.netmgt.model.OnmsSnmpInterface; -import org.opennms.netmgt.model.PrimaryType; -import org.opennms.netmgt.xml.event.Event; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.BeanWrapper; -import org.springframework.beans.BeansException; -import org.springframework.beans.PropertyAccessorFactory; - -/** - *

Abstract AbstractSaveOrUpdateOperation class.

- * - * @author ranger - * @version $Id: $ - */ -public abstract class AbstractSaveOrUpdateOperation extends AbstractImportOperation implements SaveOrUpdateOperation { - - private static final Logger LOG = LoggerFactory.getLogger(AbstractSaveOrUpdateOperation.class); - - - private final OnmsNode m_node; - private NodeDao m_nodeDao; - private DistPollerDao m_distPollerDao; - private OnmsIpInterface m_currentInterface; - private ServiceTypeDao m_svcTypeDao; - private CategoryDao m_categoryDao; - private ThreadLocal> m_types; - private ThreadLocal> m_categories; - - private IfSnmpCollector m_collector; - - /** - *

Constructor for AbstractSaveOrUpdateOperation.

- * - * @param foreignSource a {@link java.lang.String} object. - * @param foreignId a {@link java.lang.String} object. - * @param nodeLabel a {@link java.lang.String} object. - * @param building a {@link java.lang.String} object. - * @param city a {@link java.lang.String} object. - */ - public AbstractSaveOrUpdateOperation(final String foreignSource, final String foreignId, final String nodeLabel, final String building, final String city) { - this(null, foreignSource, foreignId, nodeLabel, building, city); - } - - /** - *

Constructor for AbstractSaveOrUpdateOperation.

- * - * @param nodeId a {@link java.lang.Integer} object. - * @param foreignSource a {@link java.lang.String} object. - * @param foreignId a {@link java.lang.String} object. - * @param nodeLabel a {@link java.lang.String} object. - * @param building a {@link java.lang.String} object. - * @param city a {@link java.lang.String} object. - */ - public AbstractSaveOrUpdateOperation(final Integer nodeId, final String foreignSource, final String foreignId, final String nodeLabel, final String building, final String city) { - m_node = new OnmsNode(); - m_node.setId(nodeId); - m_node.setLabel(nodeLabel); - m_node.setLabelSource(NodeLabelSource.USER); - m_node.setType(NodeType.ACTIVE); - m_node.setForeignSource(foreignSource); - m_node.setForeignId(foreignId); - m_node.getAssetRecord().setBuilding(building); - m_node.getAssetRecord().getGeolocation().setCity(city); - } - - /** {@inheritDoc} */ - @Override - public void foundInterface(final String ipAddr, final Object descr, final InterfaceSnmpPrimaryType snmpPrimary, final boolean managed, final int status) { - - if ("".equals(ipAddr)) { - LOG.error("Found interface on node {} with an empty ipaddr! Ignoring!", m_node.getLabel()); - // create a bogus OnmsIpInterface and set it to current to services we run across get ignored as well - m_currentInterface = new OnmsIpInterface(); - return; - } - - final InetAddress addr = addr(ipAddr); - - m_currentInterface = new OnmsIpInterface(addr, m_node); - m_currentInterface.setIsManaged(status == 3 ? "U" : "M"); - m_currentInterface.setIsSnmpPrimary(PrimaryType.get(snmpPrimary.toString())); - - if (InterfaceSnmpPrimaryType.P.equals(snmpPrimary)) { - if (addr == null) { - LOG.error("Unable to resolve address of snmpPrimary interface for node {}", m_node.getLabel()); - } - m_collector = new IfSnmpCollector(addr); - } - - //FIXME: verify this doesn't conflict with constructor. The constructor already adds this - //interface to the node. - m_node.addIpInterface(m_currentInterface); - } - - /** - *

gatherAdditionalData

- */ - @Override - public void gatherAdditionalData() { - updateSnmpData(); - } - - /** - *

persist

- * - * @return a {@link java.util.List} object. - */ - @Override - public List persist() { - return doPersist(); - } - - /** - *

doPersist

- * - * @return a {@link java.util.List} object. - */ - protected abstract List doPersist(); - - /** - *

updateSnmpData

- */ - protected void updateSnmpData() { - if (m_collector != null) { - m_collector.run(); - } - - updateSnmpDataForNode(); - - updateSnmpDataForSnmpInterfaces(); - - for (final OnmsIpInterface ipIf : m_node.getIpInterfaces()) { - resolveIpHostname(ipIf); - updateSnmpDataForInterface(ipIf); - } - } - - private void updateSnmpDataForSnmpInterfaces() { - if (m_collector != null && m_collector.hasIfTable()) { - - for(final IfTableEntry entry : m_collector.getIfTable()) { - final Integer ifIndex = entry.getIfIndex(); - if (ifIndex == null) { - continue; - } - - LOG.debug("Updating SNMP Interface with ifIndex {}", ifIndex); - - // first look to see if an snmpIf was created already - OnmsSnmpInterface snmpIf = m_node.getSnmpInterfaceWithIfIndex(ifIndex); - - if (snmpIf == null) { - // if not then create one - snmpIf = new OnmsSnmpInterface(m_node, ifIndex); - } - - snmpIf.setIfAlias(m_collector.getIfAlias(ifIndex)); - snmpIf.setIfName(m_collector.getIfName(ifIndex)); - snmpIf.setIfType(getIfType(ifIndex)); - snmpIf.setNetMask(getNetMask(ifIndex)); - snmpIf.setIfAdminStatus(getAdminStatus(ifIndex)); - snmpIf.setIfDescr(m_collector.getIfDescr(ifIndex)); - snmpIf.setIfSpeed(m_collector.getInterfaceSpeed(ifIndex)); - snmpIf.setPhysAddr(m_collector.getPhysAddr(ifIndex)); - - } - } - } - - private void updateSnmpDataForNode() { - if (m_collector != null && m_collector.hasSystemGroup()) { - m_node.setSysContact(m_collector.getSystemGroup().getSysContact()); - m_node.setSysDescription(m_collector.getSystemGroup().getSysDescr()); - m_node.setSysLocation(m_collector.getSystemGroup().getSysLocation()); - m_node.setSysObjectId(m_collector.getSystemGroup().getSysObjectID()); - } - } - - /** - *

isSnmpDataForNodeUpToDate

- * - * @return a boolean. - */ - protected boolean isSnmpDataForNodeUpToDate() { - return m_collector != null && m_collector.hasSystemGroup(); - } - - /** - *

isSnmpDataForInterfacesUpToDate

- * - * @return a boolean. - */ - protected boolean isSnmpDataForInterfacesUpToDate() { - return m_collector != null && m_collector.hasIfTable() && m_collector.hasIpAddrTable(); - } - - private void updateSnmpDataForInterface(final OnmsIpInterface ipIf) { - if (m_collector == null || !m_collector.hasIpAddrTable() || !m_collector.hasIfTable()) { - return; - } - - final InetAddress inetAddr = ipIf.getIpAddress(); - final String ipAddr = str(inetAddr); - - LOG.debug("Creating SNMP info for interface {}", ipAddr); - - final int ifIndex = m_collector.getIfIndex(inetAddr); - if (ifIndex == -1) { - return; - } - - // first look to see if an snmpIf was created already - OnmsSnmpInterface snmpIf = m_node.getSnmpInterfaceWithIfIndex(ifIndex); - - if (snmpIf == null) { - // if not then create one - snmpIf = new OnmsSnmpInterface(m_node, ifIndex); - snmpIf.setIfAlias(m_collector.getIfAlias(ifIndex)); - snmpIf.setIfName(m_collector.getIfName(ifIndex)); - snmpIf.setIfType(getIfType(ifIndex)); - snmpIf.setNetMask(getNetMask(ifIndex)); - snmpIf.setIfAdminStatus(getAdminStatus(ifIndex)); - snmpIf.setIfDescr(m_collector.getIfDescr(ifIndex)); - snmpIf.setIfSpeed(m_collector.getInterfaceSpeed(ifIndex)); - snmpIf.setPhysAddr(m_collector.getPhysAddr(ifIndex)); - } - - snmpIf.setCollectionEnabled(true); - - ipIf.setSnmpInterface(snmpIf); - - //FIXME: Improve OpenNMS to provide these values - // ifOperStatus - - } - - private Integer getAdminStatus(final int ifIndex) { - final int adminStatus = m_collector.getAdminStatus(ifIndex); - return (adminStatus == -1 ? null : Integer.valueOf(adminStatus)); - } - - private Integer getIfType(final int ifIndex) { - final int ifType = m_collector.getIfType(ifIndex); - return (ifType == -1 ? null : Integer.valueOf(ifType)); - } - - private InetAddress getNetMask(final int ifIndex) { - final InetAddress[] ifAddressAndMask = m_collector.getIfAddressAndMask(ifIndex); - if (ifAddressAndMask != null && ifAddressAndMask.length > 1 && ifAddressAndMask[1] != null) { - return ifAddressAndMask[1]; - } - return null; - } - - private void resolveIpHostname(final OnmsIpInterface ipIf) { - final String ipAddress = str(ipIf.getIpAddress()); - ipIf.setIpHostName(ipAddress); - } - - /** {@inheritDoc} */ - @Override - public void foundMonitoredService(final String serviceName) { - final OnmsServiceType svcType = getServiceType(serviceName); - final OnmsMonitoredService service = new OnmsMonitoredService(m_currentInterface, svcType); - service.setStatus("A"); - m_currentInterface.getMonitoredServices().add(service); - - } - - /** {@inheritDoc} */ - @Override - public void foundCategory(final String name) { - m_node.getCategories().add(getCategory(name)); - } - - /** {@inheritDoc} */ - @Override - public void foundAsset(final String name, final String value) { - final BeanWrapper w = PropertyAccessorFactory.forBeanPropertyAccess(m_node.getAssetRecord()); - try { - w.setPropertyValue(name, value); - } catch (final BeansException e) { - LOG.warn("Could not set property on asset: {}", name, e); - } - } - - private OnmsServiceType getServiceType(final String serviceName) { - preloadExistingTypes(); - OnmsServiceType type = getTypes().get(serviceName); - if (type == null) { - type = m_svcTypeDao.findByName(serviceName); - - if (type == null) { - type = new OnmsServiceType(serviceName); - m_svcTypeDao.save(type); - } - - getTypes().put(serviceName, type); - } - return type; - } - - private void preloadExistingTypes() { - if (getTypes() == null) { - setTypes(new HashMap()); - for (final OnmsServiceType svcType : m_svcTypeDao.findAll()) { - getTypes().put(svcType.getName(), svcType); - } - } - } - - private void preloadExistingCategories() { - if (getCategories() == null) { - setCategories(new HashMap()); - for (final OnmsCategory category : m_categoryDao.findAll()) { - getCategories().put(category.getName(), category); - } - } - } - - /** - *

getNode

- * - * @return a {@link org.opennms.netmgt.model.OnmsNode} object. - */ - protected OnmsNode getNode() { - return m_node; - } - - /** - *

getNodeDao

- * - * @return a {@link org.opennms.netmgt.dao.api.NodeDao} object. - */ - protected NodeDao getNodeDao() { - return m_nodeDao; - } - - /** - *

getDistPollerDao

- * - * @return a {@link org.opennms.netmgt.dao.api.DistPollerDao} object. - */ - protected DistPollerDao getDistPollerDao() { - return m_distPollerDao; - } - - private OnmsCategory getCategory(final String name) { - preloadExistingCategories(); - - OnmsCategory category = getCategories().get(name); - if (category == null) { - category = m_categoryDao.findByName(name); - if (category == null) { - category = new OnmsCategory(name); - m_categoryDao.save(category); - } - getCategories().put(category.getName(), category); - } - return category; - - } - - /** - *

getIpAddrToInterfaceMap

- * - * @param imported a {@link org.opennms.netmgt.model.OnmsNode} object. - * @return a {@link java.util.Map} object. - */ - protected Map getIpAddrToInterfaceMap(final OnmsNode imported) { - final Map ipAddrToIface = new HashMap(); - for (final OnmsIpInterface iface : imported.getIpInterfaces()) { - final String ipAddress = str(iface.getIpAddress()); - ipAddrToIface.put(ipAddress, iface); - } - return ipAddrToIface; - } - - private HashMap getTypes() { - return m_types.get(); - } - - private void setTypes(final HashMap types) { - m_types.set(types); - } - - private void setCategories(final HashMap categories) { - m_categories.set(categories); - } - - private HashMap getCategories() { - return m_categories.get(); - } - - /** - *

getCategoryDao

- * - * @return a {@link org.opennms.netmgt.dao.api.CategoryDao} object. - */ - public CategoryDao getCategoryDao() { - return m_categoryDao; - } - - /** - *

setCategoryDao

- * - * @param categoryDao a {@link org.opennms.netmgt.dao.api.CategoryDao} object. - */ - public void setCategoryDao(final CategoryDao categoryDao) { - m_categoryDao = categoryDao; - } - - /** - *

setServiceTypeDao

- * - * @param svcTypeDao a {@link org.opennms.netmgt.dao.api.ServiceTypeDao} object. - */ - public void setServiceTypeDao(final ServiceTypeDao svcTypeDao) { - m_svcTypeDao = svcTypeDao; - } - - /** - *

setNodeDao

- * - * @param nodeDao a {@link org.opennms.netmgt.dao.api.NodeDao} object. - */ - public void setNodeDao(final NodeDao nodeDao) { - m_nodeDao = nodeDao; - } - - /** - *

setDistPollerDao

- * - * @param distPollerDao a {@link org.opennms.netmgt.dao.api.DistPollerDao} object. - */ - public void setDistPollerDao(final DistPollerDao distPollerDao) { - m_distPollerDao = distPollerDao; - } - - /** - *

setTypeCache

- * - * @param typeCache a {@link java.lang.ThreadLocal} object. - */ - public void setTypeCache(final ThreadLocal> typeCache) { - m_types = typeCache; - } - - /** - *

setCategoryCache

- * - * @param categoryCache a {@link java.lang.ThreadLocal} object. - */ - public void setCategoryCache(final ThreadLocal> categoryCache) { - m_categories = categoryCache; - } - - /** - *

nullSafeEquals

- * - * @param o1 a {@link java.lang.Object} object. - * @param o2 a {@link java.lang.Object} object. - * @return a boolean. - */ - public boolean nullSafeEquals(final Object o1, final Object o2) { - return (o1 == null ? o2 == null : o1.equals(o2)); - } - -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/AddEventVisitor.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/AddEventVisitor.java deleted file mode 100644 index 3b492c058e76..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/AddEventVisitor.java +++ /dev/null @@ -1,71 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -/** - *

AddEventVisitor class.

- * - * @author ranger - * @version $Id: $ - */ -package org.opennms.netmgt.importer.operations; - -import java.util.List; - -import org.opennms.netmgt.capsd.EventUtils; -import org.opennms.netmgt.model.AbstractEntityVisitor; -import org.opennms.netmgt.model.OnmsIpInterface; -import org.opennms.netmgt.model.OnmsMonitoredService; -import org.opennms.netmgt.model.OnmsNode; -import org.opennms.netmgt.xml.event.Event; -public final class AddEventVisitor extends AbstractEntityVisitor { - private final List m_events; - - AddEventVisitor(List events) { - m_events = events; - } - - /** {@inheritDoc} */ - @Override - public void visitNode(OnmsNode node) { - m_events.add(EventUtils.createNodeAddedEvent(node.getId().intValue(), node.getLabel(), node.getLabelSource())); - } - - /** {@inheritDoc} */ - @Override - public void visitIpInterface(OnmsIpInterface iface) { - m_events.add(EventUtils.createNodeGainedInterfaceEvent("ModelImporter", iface.getNode().getId().intValue(), iface.getIpAddress())); - } - - /** {@inheritDoc} */ - @Override - public void visitMonitoredService(OnmsMonitoredService monSvc) { - OnmsIpInterface iface = monSvc.getIpInterface(); - OnmsNode node = iface.getNode(); - m_events.add(EventUtils.createNodeGainedServiceEvent("ModelImporter", monSvc.getNodeId().intValue(), iface.getIpAddress(), monSvc.getServiceType().getName(), node.getLabel(), node.getLabelSource(), node.getSysName(), node.getSysDescription())); - } -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/DefaultImportStatistics.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/DefaultImportStatistics.java deleted file mode 100644 index ea702012d21a..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/DefaultImportStatistics.java +++ /dev/null @@ -1,171 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -/** - *

DefaultImportStatistics class.

- * - * @author ranger - * @version $Id: $ - */ -package org.opennms.netmgt.importer.operations; - -import java.util.List; - -import org.opennms.netmgt.xml.event.Event; -import org.springframework.core.io.Resource; -public class DefaultImportStatistics implements ImportStatistics { - /** - *

beginProcessingOps

- */ - @Override - public void beginProcessingOps() { - } - - /** - *

finishProcessingOps

- */ - @Override - public void finishProcessingOps() { - } - - /** - *

beginPreprocessingOps

- */ - @Override - public void beginPreprocessingOps() { - } - - /** - *

finishPreprocessingOps

- */ - @Override - public void finishPreprocessingOps() { - } - - /** {@inheritDoc} */ - @Override - public void beginPreprocessing(ImportOperation oper) { - } - - /** {@inheritDoc} */ - @Override - public void finishPreprocessing(ImportOperation oper) { - } - - /** {@inheritDoc} */ - @Override - public void beginPersisting(ImportOperation oper) { - } - - /** {@inheritDoc} */ - @Override - public void finishPersisting(ImportOperation oper) { - } - - /** {@inheritDoc} */ - @Override - public void beginSendingEvents(ImportOperation oper, List events) { - } - - /** {@inheritDoc} */ - @Override - public void finishSendingEvents(ImportOperation oper, List events) { - } - - /** {@inheritDoc} */ - @Override - public void beginLoadingResource(Resource resource) { - } - - /** {@inheritDoc} */ - @Override - public void finishLoadingResource(Resource resource) { - } - - /** - *

beginImporting

- */ - @Override - public void beginImporting() { - } - - /** - *

finishImporting

- */ - @Override - public void finishImporting() { - } - - /** - *

beginAuditNodes

- */ - @Override - public void beginAuditNodes() { - } - - /** - *

finishAuditNodes

- */ - @Override - public void finishAuditNodes() { - } - - /** {@inheritDoc} */ - @Override - public void setDeleteCount(int deleteCount) { - } - - /** {@inheritDoc} */ - @Override - public void setInsertCount(int insertCount) { - } - - /** {@inheritDoc} */ - @Override - public void setUpdateCount(int updateCount) { - } - - /** - *

beginRelateNodes

- */ - @Override - public void beginRelateNodes() { - // TODO Auto-generated method stub - - } - - /** - *

finishRelateNodes

- */ - @Override - public void finishRelateNodes() { - // TODO Auto-generated method stub - - } - -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/DeleteEventVisitor.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/DeleteEventVisitor.java deleted file mode 100644 index 35cec426125c..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/DeleteEventVisitor.java +++ /dev/null @@ -1,70 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -/** - *

DeleteEventVisitor class.

- * - * @author ranger - * @version $Id: $ - */ -package org.opennms.netmgt.importer.operations; - -import java.util.List; - -import org.opennms.core.utils.InetAddressUtils; -import org.opennms.netmgt.capsd.EventUtils; -import org.opennms.netmgt.model.AbstractEntityVisitor; -import org.opennms.netmgt.model.OnmsIpInterface; -import org.opennms.netmgt.model.OnmsMonitoredService; -import org.opennms.netmgt.model.OnmsNode; -import org.opennms.netmgt.xml.event.Event; -public final class DeleteEventVisitor extends AbstractEntityVisitor { - private final List m_events; - - DeleteEventVisitor(List events) { - m_events = events; - } - - /** {@inheritDoc} */ - @Override - public void visitMonitoredServiceComplete(OnmsMonitoredService monSvc) { - m_events.add(EventUtils.createServiceDeletedEvent("ModelImporter", monSvc.getNodeId().longValue(), InetAddressUtils.str(monSvc.getIpAddress()), monSvc.getServiceType().getName(), -1L)); - } - - /** {@inheritDoc} */ - @Override - public void visitIpInterfaceComplete(OnmsIpInterface iface) { - m_events.add(EventUtils.createInterfaceDeletedEvent("ModelImporter", iface.getNode().getId().longValue(), InetAddressUtils.str(iface.getIpAddress()), -1L)); - } - - /** {@inheritDoc} */ - @Override - public void visitNodeComplete(OnmsNode node) { - m_events.add(EventUtils.createNodeDeletedEvent("ModelImporter", node.getId().intValue(), node.getLabel(), node.getLabel(), -1L)); - } -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/DeleteOperation.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/DeleteOperation.java deleted file mode 100644 index dab89a923244..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/DeleteOperation.java +++ /dev/null @@ -1,105 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer.operations; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -import org.opennms.netmgt.dao.api.NodeDao; -import org.opennms.netmgt.model.EntityVisitor; -import org.opennms.netmgt.model.OnmsNode; -import org.opennms.netmgt.xml.event.Event; - -/** - *

DeleteOperation class.

- * - * @author ranger - * @version $Id: $ - */ -public class DeleteOperation extends AbstractImportOperation { - - Integer m_nodeId; - NodeDao m_nodeDao; - - /** - *

Constructor for DeleteOperation.

- * - * @param nodeId a {@link java.lang.Integer} object. - * @param foreignSource a {@link java.lang.String} object. - * @param foreignId a {@link java.lang.String} object. - * @param nodeDao a {@link org.opennms.netmgt.dao.api.NodeDao} object. - */ - public DeleteOperation(Integer nodeId, String foreignSource, String foreignId, NodeDao nodeDao) { - m_nodeId = nodeId; - m_nodeDao = nodeDao; - } - - /** - *

persist

- * - * @return a {@link java.util.List} object. - */ - @Override - public List persist() { - - //TODO: whatif node comes back as null? can this happend? - OnmsNode node = m_nodeDao.get(m_nodeId); - if (node == null) return new ArrayList(0); - - m_nodeDao.delete(node); - - final List events = new LinkedList(); - - EntityVisitor eventAccumlator = new DeleteEventVisitor(events); - - node.visit(eventAccumlator); - - return events; - } - - - /** - *

toString

- * - * @return a {@link java.lang.String} object. - */ - @Override - public String toString() { - return "DELETE: Node "+m_nodeId; - } - - /** - *

gatherAdditionalData

- */ - @Override - public void gatherAdditionalData() { - // no additional data to gather - } -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/ImportOperationFactory.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/ImportOperationFactory.java deleted file mode 100644 index b354ab896c36..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/ImportOperationFactory.java +++ /dev/null @@ -1,76 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer.operations; - - - -/** - *

ImportOperationFactory interface.

- * - * @author ranger - * @version $Id: $ - */ -public interface ImportOperationFactory { - - /** - *

createInsertOperation

- * - * @param foreignSource a {@link java.lang.String} object. - * @param foreignId a {@link java.lang.String} object. - * @param nodeLabel a {@link java.lang.String} object. - * @param building a {@link java.lang.String} object. - * @param city a {@link java.lang.String} object. - * @return a {@link org.opennms.netmgt.importer.operations.InsertOperation} object. - */ - public abstract InsertOperation createInsertOperation(String foreignSource, String foreignId, String nodeLabel, String building, String city); - - /** - *

createUpdateOperation

- * - * @param nodeId a {@link java.lang.Integer} object. - * @param foreignSource a {@link java.lang.String} object. - * @param foreignId a {@link java.lang.String} object. - * @param nodeLabel a {@link java.lang.String} object. - * @param building a {@link java.lang.String} object. - * @param city a {@link java.lang.String} object. - * @return a {@link org.opennms.netmgt.importer.operations.UpdateOperation} object. - */ - public abstract UpdateOperation createUpdateOperation(Integer nodeId, String foreignSource, String foreignId, String nodeLabel, String building, String city); - - /** - *

createDeleteOperation

- * - * @param nodeId a {@link java.lang.Integer} object. - * @param foreignSource a {@link java.lang.String} object. - * @param foreignId a {@link java.lang.String} object. - * @return a {@link org.opennms.netmgt.importer.operations.DeleteOperation} object. - */ - public abstract DeleteOperation createDeleteOperation(Integer nodeId, String foreignSource, String foreignId); - -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/ImportOperationsManager.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/ImportOperationsManager.java deleted file mode 100644 index 237326bf545c..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/ImportOperationsManager.java +++ /dev/null @@ -1,438 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer.operations; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -import org.opennms.core.concurrent.LogPreservingThreadFactory; -import org.opennms.netmgt.dao.api.OnmsDao; -import org.opennms.netmgt.model.events.EventIpcManager; -import org.opennms.netmgt.xml.event.Event; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.transaction.TransactionStatus; -import org.springframework.transaction.support.TransactionCallback; -import org.springframework.transaction.support.TransactionTemplate; - -/** - * This nodes job is to tracks nodes that need to be deleted, added, or changed - * - * @author david - * @version $Id: $ - */ -public class ImportOperationsManager { - - private static final Logger LOG = LoggerFactory.getLogger(ImportOperationsManager.class); - - - private List m_inserts = new LinkedList(); - private List m_updates = new LinkedList(); - private Map m_foreignIdToNodeMap; - - private ImportOperationFactory m_operationFactory; - private ImportStatistics m_stats = new DefaultImportStatistics(); - private EventIpcManager m_eventMgr; - - private int m_scanThreads = 50; - private int m_writeThreads = 4; - private String m_foreignSource; - - /** - *

Constructor for ImportOperationsManager.

- * - * @param foreignIdToNodeMap a {@link java.util.Map} object. - * @param operationFactory a {@link org.opennms.netmgt.importer.operations.ImportOperationFactory} object. - */ - public ImportOperationsManager(Map foreignIdToNodeMap, ImportOperationFactory operationFactory) { - m_foreignIdToNodeMap = new HashMap(foreignIdToNodeMap); - m_operationFactory = operationFactory; - } - - /** - *

foundNode

- * - * @param foreignId a {@link java.lang.String} object. - * @param nodeLabel a {@link java.lang.String} object. - * @param building a {@link java.lang.String} object. - * @param city a {@link java.lang.String} object. - * @return a {@link org.opennms.netmgt.importer.operations.SaveOrUpdateOperation} object. - */ - public SaveOrUpdateOperation foundNode(String foreignId, String nodeLabel, String building, String city) { - - if (nodeExists(foreignId)) { - return updateNode(foreignId, nodeLabel, building, city); - } else { - return insertNode(foreignId, nodeLabel, building, city); - } - } - - private boolean nodeExists(String foreignId) { - return m_foreignIdToNodeMap.containsKey(foreignId); - } - - private SaveOrUpdateOperation insertNode(String foreignId, String nodeLabel, String building, String city) { - InsertOperation insertOperation = m_operationFactory.createInsertOperation(getForeignSource(), foreignId, nodeLabel, building, city); - m_inserts.add(insertOperation); - return insertOperation; - } - - private SaveOrUpdateOperation updateNode(String foreignId, String nodeLabel, String building, String city) { - Integer nodeId = processForeignId(foreignId); - UpdateOperation updateOperation = m_operationFactory.createUpdateOperation(nodeId, getForeignSource(), foreignId, nodeLabel, building, city); - m_updates.add(updateOperation); - return updateOperation; - } - - /** - * Return NodeId and remove it from the Map so we know which nodes have been operated on thereby - * tracking nodes to be deleted. - * @param foreignId - * @return a nodeId - */ - private Integer processForeignId(String foreignId) { - return m_foreignIdToNodeMap.remove(foreignId); - } - - /** - *

getOperationCount

- * - * @return a int. - */ - public int getOperationCount() { - return m_inserts.size() + m_updates.size() + m_foreignIdToNodeMap.size(); - } - - /** - *

getInsertCount

- * - * @return a int. - */ - public int getInsertCount() { - return m_inserts.size(); - } - - /** - *

getUpdateCount

- * - * @return a int. - */ - public int getUpdateCount() { - return m_updates.size(); - } - - /** - *

getDeleteCount

- * - * @return a int. - */ - public int getDeleteCount() { - return m_foreignIdToNodeMap.size(); - } - - class DeleteIterator implements Iterator { - - private Iterator> m_foreignIdIterator = m_foreignIdToNodeMap.entrySet().iterator(); - - @Override - public boolean hasNext() { - return m_foreignIdIterator.hasNext(); - } - - @Override - public ImportOperation next() { - Entry entry = m_foreignIdIterator.next(); - Integer nodeId = entry.getValue(); - String foreignId = entry.getKey(); - return m_operationFactory.createDeleteOperation(nodeId, m_foreignSource, foreignId); - - } - - @Override - public void remove() { - m_foreignIdIterator.remove(); - } - - } - - class OperationIterator implements Iterator { - - Iterator> m_iterIter; - Iterator m_currentIter; - - OperationIterator() { - List> iters = new ArrayList>(3); - iters.add(new DeleteIterator()); - iters.add(m_updates.iterator()); - iters.add(m_inserts.iterator()); - m_iterIter = iters.iterator(); - } - - @Override - public boolean hasNext() { - while((m_currentIter == null || !m_currentIter.hasNext()) && m_iterIter.hasNext()) { - m_currentIter = m_iterIter.next(); - m_iterIter.remove(); - } - - return (m_currentIter == null ? false: m_currentIter.hasNext()); - } - - @Override - public ImportOperation next() { - return m_currentIter.next(); - } - - @Override - public void remove() { - m_currentIter.remove(); - } - - - } - - /** - *

shutdownAndWaitForCompletion

- * - * @param executorService a {@link java.util.concurrent.ExecutorService} object. - * @param msg a {@link java.lang.String} object. - */ - public void shutdownAndWaitForCompletion(ExecutorService executorService, String msg) { - executorService.shutdown(); - try { - while (!executorService.awaitTermination(10, TimeUnit.SECONDS)) { - // loop util the await returns false - } - } catch (InterruptedException e) { - LOG.error(msg, e); - } - } - - /** - *

persistOperations

- * - * @param template a {@link org.springframework.transaction.support.TransactionTemplate} object. - * @param dao a {@link org.opennms.netmgt.dao.api.OnmsDao} object. - */ - public void persistOperations(TransactionTemplate template, OnmsDao dao) { - m_stats.beginProcessingOps(); - m_stats.setDeleteCount(getDeleteCount()); - m_stats.setInsertCount(getInsertCount()); - m_stats.setUpdateCount(getUpdateCount()); - ExecutorService pool = Executors.newFixedThreadPool(m_writeThreads, new LogPreservingThreadFactory(getClass().getSimpleName() + ".persistOperations", m_writeThreads, false)); - - preprocessOperations(template, dao, new OperationIterator(), pool); - - shutdownAndWaitForCompletion(pool, "persister interrupted!"); - - m_stats.finishProcessingOps(); - - } - - private void preprocessOperations(final TransactionTemplate template, final OnmsDao dao, OperationIterator iterator, final ExecutorService dbPool) { - - m_stats.beginPreprocessingOps(); - - ExecutorService pool = Executors.newFixedThreadPool(m_scanThreads, new LogPreservingThreadFactory(getClass().getSimpleName() + ".preprocessOperations", m_scanThreads, false)); - for (Iterator it = iterator; it.hasNext();) { - final ImportOperation oper = it.next(); - Runnable r = new Runnable() { - @Override - public void run() { - preprocessOperation(oper, template, dao, dbPool); - } - }; - pool.execute(r); - - } - - shutdownAndWaitForCompletion(pool, "preprocessor interrupted!"); - - m_stats.finishPreprocessingOps(); - } - - /** - *

preprocessOperation

- * - * @param oper a {@link org.opennms.netmgt.importer.operations.ImportOperation} object. - * @param template a {@link org.springframework.transaction.support.TransactionTemplate} object. - * @param dao a {@link org.opennms.netmgt.dao.api.OnmsDao} object. - * @param dbPool a {@link java.util.concurrent.ExecutorService} object. - */ - protected void preprocessOperation(final ImportOperation oper, final TransactionTemplate template, final OnmsDao dao, final ExecutorService dbPool) { - m_stats.beginPreprocessing(oper); - LOG.info("Preprocess: {}", oper); - oper.gatherAdditionalData(); - Runnable r = new Runnable() { - @Override - public void run() { - persistOperation(oper, template, dao); - } - }; - - dbPool.execute(r); - - m_stats.finishPreprocessing(oper); - } - - /** - *

persistOperation

- * - * @param oper a {@link org.opennms.netmgt.importer.operations.ImportOperation} object. - * @param template a {@link org.springframework.transaction.support.TransactionTemplate} object. - * @param dao a {@link org.opennms.netmgt.dao.api.OnmsDao} object. - */ - protected void persistOperation(final ImportOperation oper, TransactionTemplate template, final OnmsDao dao) { - m_stats.beginPersisting(oper); - LOG.info("Persist: {}", oper); - - List events = persistToDatabase(oper, template); - - m_stats.finishPersisting(oper); - - - if (m_eventMgr != null && events != null) { - m_stats.beginSendingEvents(oper, events); - LOG.info("Send Events: {}", oper); - // now send the events for the update - for (Iterator eventIt = events.iterator(); eventIt.hasNext();) { - Event event = eventIt.next(); - m_eventMgr.sendNow(event); - } - m_stats.finishSendingEvents(oper, events); - } - - LOG.info("Clear cache: {}", oper); - // clear the cache to we don't use up all the memory - dao.clear(); - } - - /** - * Persist the import operation changes to the database. - * - * @param oper changes to persist - * @param template transaction template in which to perform the persist operation - * @return list of events - */ - private List persistToDatabase(final ImportOperation oper, TransactionTemplate template) { - List events = template.execute(new TransactionCallback>() { - @Override - public List doInTransaction(TransactionStatus status) { - List result = oper.persist(); - return result; - } - }); - return events; - } - - - /** - *

setScanThreads

- * - * @param scanThreads a int. - */ - public void setScanThreads(int scanThreads) { - m_scanThreads = scanThreads; - } - - /** - *

setWriteThreads

- * - * @param writeThreads a int. - */ - public void setWriteThreads(int writeThreads) { - m_writeThreads = writeThreads; - } - - - - /** - *

getEventMgr

- * - * @return a {@link org.opennms.netmgt.model.events.EventIpcManager} object. - */ - public EventIpcManager getEventMgr() { - return m_eventMgr; - } - - - - /** - *

setEventMgr

- * - * @param eventMgr a {@link org.opennms.netmgt.model.events.EventIpcManager} object. - */ - public void setEventMgr(EventIpcManager eventMgr) { - m_eventMgr = eventMgr; - } - - /** - *

getStats

- * - * @return a {@link org.opennms.netmgt.importer.operations.ImportStatistics} object. - */ - public ImportStatistics getStats() { - return m_stats; - } - - /** - *

setStats

- * - * @param stats a {@link org.opennms.netmgt.importer.operations.ImportStatistics} object. - */ - public void setStats(ImportStatistics stats) { - m_stats = stats; - } - - /** - *

setForeignSource

- * - * @param foreignSource a {@link java.lang.String} object. - */ - public void setForeignSource(String foreignSource) { - m_foreignSource = foreignSource; - } - - /** - *

getForeignSource

- * - * @return a {@link java.lang.String} object. - */ - public String getForeignSource() { - return m_foreignSource; - } -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/ImportStatistics.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/ImportStatistics.java deleted file mode 100644 index 1ad46e43f7a3..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/ImportStatistics.java +++ /dev/null @@ -1,173 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer.operations; - -import java.util.List; - -import org.opennms.netmgt.xml.event.Event; -import org.springframework.core.io.Resource; - -/** - *

ImportStatistics interface.

- * - * @author ranger - * @version $Id: $ - */ -public interface ImportStatistics { - - /** - *

beginProcessingOps

- */ - void beginProcessingOps(); - - /** - *

finishProcessingOps

- */ - void finishProcessingOps(); - - /** - *

beginPreprocessingOps

- */ - void beginPreprocessingOps(); - - /** - *

finishPreprocessingOps

- */ - void finishPreprocessingOps(); - - /** - *

beginPreprocessing

- * - * @param oper a {@link org.opennms.netmgt.importer.operations.ImportOperation} object. - */ - void beginPreprocessing(ImportOperation oper); - - /** - *

finishPreprocessing

- * - * @param oper a {@link org.opennms.netmgt.importer.operations.ImportOperation} object. - */ - void finishPreprocessing(ImportOperation oper); - - /** - *

beginPersisting

- * - * @param oper a {@link org.opennms.netmgt.importer.operations.ImportOperation} object. - */ - void beginPersisting(ImportOperation oper); - - /** - *

finishPersisting

- * - * @param oper a {@link org.opennms.netmgt.importer.operations.ImportOperation} object. - */ - void finishPersisting(ImportOperation oper); - - /** - *

beginSendingEvents

- * - * @param oper a {@link org.opennms.netmgt.importer.operations.ImportOperation} object. - * @param events a {@link java.util.List} object. - */ - void beginSendingEvents(ImportOperation oper, List events); - - /** - *

finishSendingEvents

- * - * @param oper a {@link org.opennms.netmgt.importer.operations.ImportOperation} object. - * @param events a {@link java.util.List} object. - */ - void finishSendingEvents(ImportOperation oper, List events); - - /** - *

beginLoadingResource

- * - * @param resource a {@link org.springframework.core.io.Resource} object. - */ - void beginLoadingResource(Resource resource); - - /** - *

finishLoadingResource

- * - * @param resource a {@link org.springframework.core.io.Resource} object. - */ - void finishLoadingResource(Resource resource); - - /** - *

beginImporting

- */ - void beginImporting(); - - /** - *

finishImporting

- */ - void finishImporting(); - - /** - *

beginAuditNodes

- */ - void beginAuditNodes(); - - /** - *

finishAuditNodes

- */ - void finishAuditNodes(); - - /** - *

setDeleteCount

- * - * @param deleteCount a int. - */ - void setDeleteCount(int deleteCount); - - /** - *

setInsertCount

- * - * @param insertCount a int. - */ - void setInsertCount(int insertCount); - - /** - *

setUpdateCount

- * - * @param updateCount a int. - */ - void setUpdateCount(int updateCount); - - /** - *

beginRelateNodes

- */ - void beginRelateNodes(); - - /** - *

finishRelateNodes

- */ - void finishRelateNodes(); - -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/InsertOperation.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/InsertOperation.java deleted file mode 100644 index 464f96678da5..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/InsertOperation.java +++ /dev/null @@ -1,89 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer.operations; - -import java.util.LinkedList; -import java.util.List; - -import org.opennms.netmgt.model.EntityVisitor; -import org.opennms.netmgt.model.OnmsDistPoller; -import org.opennms.netmgt.xml.event.Event; - -/** - *

InsertOperation class.

- * - * @author ranger - * @version $Id: $ - */ -public class InsertOperation extends AbstractSaveOrUpdateOperation { - - /** - *

Constructor for InsertOperation.

- * - * @param foreignSource a {@link java.lang.String} object. - * @param foreignId a {@link java.lang.String} object. - * @param nodeLabel a {@link java.lang.String} object. - * @param building a {@link java.lang.String} object. - * @param city a {@link java.lang.String} object. - */ - public InsertOperation(String foreignSource, String foreignId, String nodeLabel, String building, String city) { - super(foreignSource, foreignId, nodeLabel, building, city); - } - - /** - *

doPersist

- * - * @return a {@link java.util.List} object. - */ - @Override - public List doPersist() { - OnmsDistPoller distPoller = getDistPollerDao().get("localhost"); - getNode().setDistPoller(distPoller); - getNodeDao().save(getNode()); - - final List events = new LinkedList(); - - EntityVisitor eventAccumlator = new AddEventVisitor(events); - - getNode().visit(eventAccumlator); - - return events; - } - - /** - *

toString

- * - * @return a {@link java.lang.String} object. - */ - @Override - public String toString() { - return "INSERT: Node: "+getNode().getLabel(); - } - -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/UpdateOperation.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/UpdateOperation.java deleted file mode 100644 index c5bc44c9e587..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/operations/UpdateOperation.java +++ /dev/null @@ -1,428 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer.operations; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.opennms.core.utils.InetAddressUtils; -import org.opennms.netmgt.model.OnmsIpInterface; -import org.opennms.netmgt.model.OnmsMonitoredService; -import org.opennms.netmgt.model.OnmsNode; -import org.opennms.netmgt.model.OnmsServiceType; -import org.opennms.netmgt.model.OnmsSnmpInterface; -import org.opennms.netmgt.xml.event.Event; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - *

UpdateOperation class.

- * - * @author ranger - * @version $Id: $ - */ -public class UpdateOperation extends AbstractSaveOrUpdateOperation { - - private static final Logger LOG = LoggerFactory.getLogger(UpdateOperation.class); - - - public class ServiceUpdater { - - private OnmsIpInterface m_iface; - Map m_svcTypToSvcMap; - - public ServiceUpdater(OnmsIpInterface iface, OnmsIpInterface imported) { - m_iface = iface; - - createSvcTypeToSvcMap(imported); - } - - private void createSvcTypeToSvcMap(OnmsIpInterface imported) { - m_svcTypToSvcMap = new HashMap(); - for (OnmsMonitoredService svc : imported.getMonitoredServices()) { - m_svcTypToSvcMap.put(svc.getServiceType(), svc); - } - } - - public void execute(List events) { - for (Iterator it = getExisting().iterator(); it.hasNext();) { - OnmsMonitoredService svc = it.next(); - OnmsMonitoredService imported = getImportedVersion(svc); - if (imported == null) { - it.remove(); - svc.visit(new DeleteEventVisitor(events)); - } - else { - update(svc, events); - } - markAsProcessed(svc); - } - addNewServices(events); - } - - private void addNewServices(List events) { - Collection newServices = getNewServices(); - LOG.debug("{} has {} new services.", getNode().getLabel(), newServices.size()); - for (OnmsMonitoredService svc : newServices) { - svc.setIpInterface(m_iface); - m_iface.getMonitoredServices().add(svc); - svc.visit(new AddEventVisitor(events)); - } - } - - private Collection getNewServices() { - return Collections.unmodifiableCollection(m_svcTypToSvcMap.values()); - } - - private void markAsProcessed(OnmsMonitoredService svc) { - m_svcTypToSvcMap.remove(svc.getServiceType()); - } - - private void update(OnmsMonitoredService svc, List events) { - // nothing to do here - } - - private OnmsMonitoredService getImportedVersion(OnmsMonitoredService svc) { - return (OnmsMonitoredService)m_svcTypToSvcMap.get(svc.getServiceType()); - } - - Set getExisting() { - return m_iface.getMonitoredServices(); - } - - } - - public class InterfaceUpdater { - - private OnmsNode m_node; - private Map m_ipAddrToImportIfs; - - public InterfaceUpdater(OnmsNode node, OnmsNode imported) { - m_node = node; - m_ipAddrToImportIfs = getIpAddrToInterfaceMap(imported); - } - - public void execute(List events) { - for (Iterator it = getExistingInterfaces().iterator(); it.hasNext();) { - OnmsIpInterface iface = it.next(); - OnmsIpInterface imported = getImportedVersion(iface); - - if (imported == null) { - it.remove(); - iface.visit(new DeleteEventVisitor(events)); - markAsProcessed(iface); - } else { - update(imported, iface, events); - markAsProcessed(iface); - } - - } - addNewInterfaces(events); - } - - private void addNewInterfaces(List events) { - for (OnmsIpInterface iface : getNewInterfaces()) { - m_node.addIpInterface(iface); - if (iface.getIfIndex() != null) { - iface.setSnmpInterface(m_node.getSnmpInterfaceWithIfIndex(iface.getIfIndex())); - } - iface.visit(new AddEventVisitor(events)); - } - } - - private OnmsIpInterface getImportedVersion(OnmsIpInterface iface) { - return m_ipAddrToImportIfs.get(InetAddressUtils.str(iface.getIpAddress())); - } - - private Collection getNewInterfaces() { - return m_ipAddrToImportIfs.values(); - } - - private void markAsProcessed(OnmsIpInterface iface) { - m_ipAddrToImportIfs.remove(InetAddressUtils.str(iface.getIpAddress())); - } - - private void update(OnmsIpInterface imported, OnmsIpInterface iface, List events) { - if (!nullSafeEquals(iface.getIsManaged(), imported.getIsManaged())) - iface.setIsManaged(imported.getIsManaged()); - - if (!nullSafeEquals(iface.getIsSnmpPrimary(), imported.getIsSnmpPrimary())) { - iface.setIsSnmpPrimary(imported.getIsSnmpPrimary()); - // TODO: send snmpPrimary event - } - - if (isSnmpDataForInterfacesUpToDate()) { - updateSnmpInterface(imported, iface); - } - - if (!nullSafeEquals(iface.getIpHostName(), imported.getIpHostName())) - iface.setIpHostName(imported.getIpHostName()); - - updateServices(iface, imported, events); - } - - private void updateSnmpInterface(OnmsIpInterface imported, OnmsIpInterface iface) { - - if (nullSafeEquals(iface.getIfIndex(), imported.getIfIndex())) { - // no need to change anything - return; - } - - if (imported.getSnmpInterface() == null) { - // there is no longer an snmpInterface associated with the ipInterface - iface.setSnmpInterface(null); - } else { - // locate the snmpInterface on this node that has the new ifIndex and set it - // into the interface - OnmsSnmpInterface snmpIface = m_node.getSnmpInterfaceWithIfIndex(imported.getIfIndex()); - iface.setSnmpInterface(snmpIface); - } - - - - } - - private void updateServices(OnmsIpInterface iface, OnmsIpInterface imported, List events) { - new ServiceUpdater(iface, imported).execute(events); - } - - private Set getExistingInterfaces() { - return m_node.getIpInterfaces(); - } - - } - - public class SnmpInterfaceUpdater { - - OnmsNode m_dbNode; - Map m_ifIndexToSnmpInterface; - - public SnmpInterfaceUpdater(OnmsNode db, OnmsNode imported) { - m_dbNode = db; - m_ifIndexToSnmpInterface = mapIfIndexToSnmpInterface(imported.getSnmpInterfaces()); - } - - private Map mapIfIndexToSnmpInterface(Set snmpInterfaces) { - Map map = new HashMap(); - for (OnmsSnmpInterface snmpIface : snmpInterfaces) { - if (snmpIface.getIfIndex() != null) { - map.put(snmpIface.getIfIndex(), snmpIface); - } - } - return map; - } - - public void execute() { - for (Iterator it = getExistingInterfaces().iterator(); it.hasNext();) { - OnmsSnmpInterface iface = (OnmsSnmpInterface) it.next(); - OnmsSnmpInterface imported = getImportedVersion(iface); - - if (imported == null) { - it.remove(); - markAsProcessed(iface); - } else { - update(imported, iface); - markAsProcessed(iface); - } - - } - addNewInterfaces(); - } - - private void update(OnmsSnmpInterface importedSnmpIface, OnmsSnmpInterface snmpIface) { - - if (!nullSafeEquals(snmpIface.getIfAdminStatus(), importedSnmpIface.getIfAdminStatus())) { - snmpIface.setIfAdminStatus(importedSnmpIface.getIfAdminStatus()); - } - - if (!nullSafeEquals(snmpIface.getIfAlias(), importedSnmpIface.getIfAlias())) { - snmpIface.setIfAlias(importedSnmpIface.getIfAlias()); - } - - if (!nullSafeEquals(snmpIface.getIfDescr(), importedSnmpIface.getIfDescr())) { - snmpIface.setIfDescr(importedSnmpIface.getIfDescr()); - } - - if (!nullSafeEquals(snmpIface.getIfName(), importedSnmpIface.getIfName())) { - snmpIface.setIfName(importedSnmpIface.getIfName()); - } - - if (!nullSafeEquals(snmpIface.getIfOperStatus(), importedSnmpIface.getIfOperStatus())) { - snmpIface.setIfOperStatus(importedSnmpIface.getIfOperStatus()); - } - - if (!nullSafeEquals(snmpIface.getIfSpeed(), importedSnmpIface.getIfSpeed())) { - snmpIface.setIfSpeed(importedSnmpIface.getIfSpeed()); - } - - if (!nullSafeEquals(snmpIface.getIfType(), importedSnmpIface.getIfType())) { - snmpIface.setIfType(importedSnmpIface.getIfType()); - } - - if (!nullSafeEquals(snmpIface.getNetMask(), importedSnmpIface.getNetMask())) { - snmpIface.setNetMask(importedSnmpIface.getNetMask()); - } - - if (!nullSafeEquals(snmpIface.getPhysAddr(), importedSnmpIface.getPhysAddr())) { - snmpIface.setPhysAddr(importedSnmpIface.getPhysAddr()); - } - - } - - private void markAsProcessed(OnmsSnmpInterface iface) { - m_ifIndexToSnmpInterface.remove(iface.getIfIndex()); - } - - private OnmsSnmpInterface getImportedVersion(OnmsSnmpInterface iface) { - return m_ifIndexToSnmpInterface.get(iface.getIfIndex()); - } - - private Set getExistingInterfaces() { - return m_dbNode.getSnmpInterfaces(); - } - - private void addNewInterfaces() { - for (OnmsSnmpInterface snmpIface : getNewInterfaces()) { - m_dbNode.addSnmpInterface(snmpIface); - } - } - - private Collection getNewInterfaces() { - return m_ifIndexToSnmpInterface.values(); - } - - - } - - - /** - *

Constructor for UpdateOperation.

- * - * @param nodeId a {@link java.lang.Integer} object. - * @param foreignSource a {@link java.lang.String} object. - * @param foreignId a {@link java.lang.String} object. - * @param nodeLabel a {@link java.lang.String} object. - * @param building a {@link java.lang.String} object. - * @param city a {@link java.lang.String} object. - */ - public UpdateOperation(Integer nodeId, String foreignSource, String foreignId, String nodeLabel, String building, String city) { - super(nodeId, foreignSource, foreignId, nodeLabel, building, city); - } - - /** - *

doPersist

- * - * @return a {@link java.util.List} object. - */ - @Override - public List doPersist() { - OnmsNode imported = getNode(); - OnmsNode db = getNodeDao().getHierarchy(imported.getId()); - - List events = new LinkedList(); - - // verify that the node label is still the same - if (!db.getLabel().equals(imported.getLabel())) { - db.setLabel(imported.getLabel()); - // TODO: nodeLabelChanged event - } - - if (!nullSafeEquals(db.getForeignSource(), imported.getForeignSource())) { - db.setForeignSource(imported.getForeignSource()); - } - - if (!nullSafeEquals(db.getForeignId(), imported.getForeignId())) { - db.setForeignId(imported.getForeignId()); - } - - if (isSnmpDataForNodeUpToDate()) { - - if (!nullSafeEquals(db.getSysContact(), imported.getSysContact())) { - db.setSysContact(imported.getSysContact()); - } - - if (!nullSafeEquals(db.getSysDescription(), imported.getSysDescription())) { - db.setSysDescription(imported.getSysDescription()); - } - - if (!nullSafeEquals(db.getSysLocation(), imported.getSysLocation())) { - db.setSysLocation(imported.getSysLocation()); - } - - if (!nullSafeEquals(db.getSysName(), imported.getSysName())) { - db.setSysName(imported.getSysName()); - } - - if (!nullSafeEquals(db.getSysObjectId(), imported.getSysObjectId())) { - db.setSysObjectId(imported.getSysObjectId()); - } - - } - - if (isSnmpDataForInterfacesUpToDate()) - updateSnmpInterfaces(db, imported); - - updateInterfaces(db, imported, events); - updateCategories(db, imported); - - getNodeDao().update(db); - - return events; - - } - - private void updateSnmpInterfaces(OnmsNode db, OnmsNode imported) { - new SnmpInterfaceUpdater(db, imported).execute(); - } - - private void updateCategories(OnmsNode db, OnmsNode imported) { - if (!db.getCategories().equals(imported.getCategories())) - db.setCategories(imported.getCategories()); - } - - private void updateInterfaces(OnmsNode db, OnmsNode imported, List events) { - new InterfaceUpdater(db, imported).execute(events); - } - - /** - *

toString

- * - * @return a {@link java.lang.String} object. - */ - @Override - public String toString() { - return "UPDATE: Node: "+getNode().getId()+": "+getNode().getLabel(); - } -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/specification/AbstractImportVisitor.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/specification/AbstractImportVisitor.java deleted file mode 100644 index a2122eab2cb7..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/specification/AbstractImportVisitor.java +++ /dev/null @@ -1,105 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer.specification; - -import org.opennms.netmgt.importer.config.Asset; -import org.opennms.netmgt.importer.config.Category; -import org.opennms.netmgt.importer.config.Interface; -import org.opennms.netmgt.importer.config.ModelImport; -import org.opennms.netmgt.importer.config.MonitoredService; -import org.opennms.netmgt.importer.config.Node; - -/** - *

AbstractImportVisitor class.

- * - * @author ranger - * @version $Id: $ - */ -public class AbstractImportVisitor implements ImportVisitor { - - /** {@inheritDoc} */ - @Override - public void visitModelImport(ModelImport mi) { - } - - /** {@inheritDoc} */ - @Override - public void completeModelImport(ModelImport modelImport) { - } - - /** {@inheritDoc} */ - @Override - public void visitNode(Node node) { - } - - /** {@inheritDoc} */ - @Override - public void completeNode(Node node) { - } - - /** {@inheritDoc} */ - @Override - public void visitInterface(Interface iface) { - } - - /** {@inheritDoc} */ - @Override - public void completeInterface(Interface iface) { - } - - /** {@inheritDoc} */ - @Override - public void visitMonitoredService(MonitoredService svc) { - } - - /** {@inheritDoc} */ - @Override - public void completeMonitoredService(MonitoredService svc) { - } - - /** {@inheritDoc} */ - @Override - public void visitCategory(Category category) { - } - - /** {@inheritDoc} */ - @Override - public void completeCategory(Category category) { - } - - /** {@inheritDoc} */ - @Override - public void visitAsset(Asset asset) { - } - - /** {@inheritDoc} */ - @Override - public void completeAsset(Asset asset) { - } -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/specification/ImportVisitor.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/specification/ImportVisitor.java deleted file mode 100644 index 187fd140ac3b..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/specification/ImportVisitor.java +++ /dev/null @@ -1,119 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer.specification; - -import org.opennms.netmgt.importer.config.Asset; -import org.opennms.netmgt.importer.config.Category; -import org.opennms.netmgt.importer.config.Interface; -import org.opennms.netmgt.importer.config.ModelImport; -import org.opennms.netmgt.importer.config.MonitoredService; -import org.opennms.netmgt.importer.config.Node; - -/** - *

ImportVisitor interface.

- * - * @author ranger - * @version $Id: $ - */ -public interface ImportVisitor { - - /** - *

visitModelImport

- * - * @param mi a {@link org.opennms.netmgt.importer.config.ModelImport} object. - */ - public void visitModelImport(ModelImport mi); - /** - *

completeModelImport

- * - * @param modelImport a {@link org.opennms.netmgt.importer.config.ModelImport} object. - */ - public void completeModelImport(ModelImport modelImport); - /** - *

visitNode

- * - * @param node a {@link org.opennms.netmgt.importer.config.Node} object. - */ - public void visitNode(Node node); - /** - *

completeNode

- * - * @param node a {@link org.opennms.netmgt.importer.config.Node} object. - */ - public void completeNode(Node node); - /** - *

visitInterface

- * - * @param iface a {@link org.opennms.netmgt.importer.config.Interface} object. - */ - public void visitInterface(Interface iface); - /** - *

completeInterface

- * - * @param iface a {@link org.opennms.netmgt.importer.config.Interface} object. - */ - public void completeInterface(Interface iface); - /** - *

visitMonitoredService

- * - * @param svc a {@link org.opennms.netmgt.importer.config.MonitoredService} object. - */ - public void visitMonitoredService(MonitoredService svc); - /** - *

completeMonitoredService

- * - * @param svc a {@link org.opennms.netmgt.importer.config.MonitoredService} object. - */ - public void completeMonitoredService(MonitoredService svc); - /** - *

visitCategory

- * - * @param category a {@link org.opennms.netmgt.importer.config.Category} object. - */ - public void visitCategory(Category category); - /** - *

completeCategory

- * - * @param category a {@link org.opennms.netmgt.importer.config.Category} object. - */ - public void completeCategory(Category category); - /** - *

visitAsset

- * - * @param asset a {@link org.opennms.netmgt.importer.config.Asset} object. - */ - public void visitAsset(Asset asset); - /** - *

completeAsset

- * - * @param asset a {@link org.opennms.netmgt.importer.config.Asset} object. - */ - public void completeAsset(Asset asset); - -} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/specification/SpecFile.java b/opennms-import/src/main/java/org/opennms/netmgt/importer/specification/SpecFile.java deleted file mode 100644 index b87dec04f914..000000000000 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/specification/SpecFile.java +++ /dev/null @@ -1,164 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer.specification; - -import java.io.IOException; - -import org.exolab.castor.xml.MarshalException; -import org.exolab.castor.xml.ValidationException; -import org.opennms.netmgt.importer.config.Asset; -import org.opennms.netmgt.importer.config.Category; -import org.opennms.netmgt.importer.config.Interface; -import org.opennms.netmgt.importer.config.ModelImport; -import org.opennms.netmgt.importer.config.MonitoredService; -import org.opennms.netmgt.importer.config.Node; -import org.opennms.core.xml.CastorUtils; -import org.opennms.netmgt.importer.ModelImportException; -import org.springframework.core.io.Resource; - -/** - *

SpecFile class.

- * - * @author ranger - * @version $Id: $ - */ -public class SpecFile { - - private ModelImport m_mi; - - /** - *

loadResource

- * - * @param resource a {@link org.springframework.core.io.Resource} object. - * @throws org.opennms.netmgt.importer.ModelImportException if any. - * @throws java.io.IOException if any. - */ - public void loadResource(Resource resource) throws ModelImportException, IOException { - try { - m_mi = CastorUtils.unmarshal(ModelImport.class, resource); - } catch (MarshalException e) { - throw new ModelImportException("Exception while marshalling import: "+e, e); - } catch (ValidationException e) { - throw new ModelImportException("Exception while validating import "+e); - } - } - - /** - *

visitImport

- * - * @param visitor a {@link org.opennms.netmgt.importer.specification.ImportVisitor} object. - */ - public void visitImport(ImportVisitor visitor) { - doVisitImport(visitor); - } - - private void doVisitImport(ImportVisitor visitor) { - visitor.visitModelImport(m_mi); - for (Node node : m_mi.getNodeCollection()) { - visitNode(visitor, node); - } - visitor.completeModelImport(m_mi); - } - - private void visitNode(final ImportVisitor visitor, final Node node) { - doVisitNode(visitor, node); - } - - private void doVisitNode(ImportVisitor visitor, Node node) { - visitor.visitNode(node); - for (Category category : node.getCategoryCollection()) { - visitCategory(visitor, category); - } - for (Interface iface : node.getInterfaceCollection()) { - visitInterface(visitor, iface); - } - for (Asset asset : node.getAssetCollection()) { - visitAsset(visitor, asset); - } - visitor.completeNode(node); - } - - private void visitAsset(ImportVisitor visitor, Asset asset) { - doVisitAsset(visitor, asset); - } - - private void doVisitAsset(ImportVisitor visitor, Asset asset) { - visitor.visitAsset(asset); - visitor.completeAsset(asset); - } - - private void visitCategory(ImportVisitor visitor, Category category) { - doVisitCategory(visitor, category); - } - - private void doVisitCategory(ImportVisitor visitor, Category category) { - visitor.visitCategory(category); - visitor.completeCategory(category); - } - - private void visitInterface(ImportVisitor visitor, Interface iface) { - doVisitInterface(visitor, iface); - } - - private void doVisitInterface(ImportVisitor visitor, Interface iface) { - visitor.visitInterface(iface); - for (MonitoredService svc : iface.getMonitoredServiceCollection()) { - visitMonitoredService(visitor, svc); - } - visitor.completeInterface(iface); - } - - private void visitMonitoredService(ImportVisitor visitor, MonitoredService svc) { - doVisitMonitoredService(visitor, svc); - } - - private void doVisitMonitoredService(ImportVisitor visitor, MonitoredService svc) { - visitor.visitMonitoredService(svc); - visitor.completeMonitoredService(svc); - } - - /** - *

getForeignSource

- * - * @return a {@link java.lang.String} object. - */ - public String getForeignSource() { - return m_mi.getForeignSource(); - } - - /** - *

setForeignSource

- * - * @param foreignSource a {@link java.lang.String} object. - */ - public void setForeignSource(String foreignSource) { - m_mi.setForeignSource(foreignSource); - } - -} diff --git a/opennms-import/src/main/resources/META-INF/opennms/applicationContext-importer.xml b/opennms-import/src/main/resources/META-INF/opennms/applicationContext-importer.xml deleted file mode 100644 index dc276638b6b2..000000000000 --- a/opennms-import/src/main/resources/META-INF/opennms/applicationContext-importer.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - file:${opennms.home}/etc/model-importer.properties - - - - - ${importer.importURL} - - - - ${importer.scanThreads} - - - - ${importer.writeThreads} - - - - ${importer.importSchedule} - - - - org.opennms.netmgt.config.SnmpPeerFactory.init - - - - - - - - - - - - - - - - - - - - - - - doImport - - - false - - - - - - - - - - - - - - - - - - - diff --git a/opennms-import/src/main/resources/beanRefContext.xml b/opennms-import/src/main/resources/beanRefContext.xml deleted file mode 100644 index 3a9bab686ade..000000000000 --- a/opennms-import/src/main/resources/beanRefContext.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - META-INF/opennms/applicationContext-importer.xml - - - - - diff --git a/opennms-import/src/test/java/org/opennms/netmgt/importer/ExecutorServiceTest.java b/opennms-import/src/test/java/org/opennms/netmgt/importer/ExecutorServiceTest.java deleted file mode 100644 index 310fefede237..000000000000 --- a/opennms-import/src/test/java/org/opennms/netmgt/importer/ExecutorServiceTest.java +++ /dev/null @@ -1,93 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2008-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - -import java.util.Date; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -import org.junit.Test; -import org.opennms.core.concurrent.LogPreservingThreadFactory; - -public class ExecutorServiceTest { - - public void sleep(long millis) { - try { Thread.sleep(millis); } catch(InterruptedException e) {} - } - - private int runs = 0; - - public synchronized void incr() { - runs++; - } - - public synchronized int getRuns() { - return runs; - } - - @Test - public void testThreadPool() throws Exception { - ExecutorService pool = Executors.newFixedThreadPool(11, new LogPreservingThreadFactory(getClass().getSimpleName() + ".testThreadPool", 11, false)); - - for(int i = 1; i <= 100; i++) { - final int index = i; - Runnable r = new Runnable() { - @Override - public void run() { - System.err.println(Thread.currentThread()+": "+new Date()+": "+index); - sleep(500); - incr(); - } - }; - pool.execute(r); - } - - - shutdownAndWaitForCompletion(pool); - - assertEquals(100, getRuns()); - } - - public void shutdownAndWaitForCompletion(ExecutorService executorService) { - executorService.shutdown(); - try { - while (!executorService.awaitTermination(10, TimeUnit.SECONDS)) { - // loop util the await returns false - } - } catch (InterruptedException e) { - fail("Thread Interrupted unexpectedly!!!"); - } - } - - -} diff --git a/opennms-import/src/test/java/org/opennms/netmgt/importer/ImportOperationsManagerTest.java b/opennms-import/src/test/java/org/opennms/netmgt/importer/ImportOperationsManagerTest.java deleted file mode 100644 index 8ff56b8a4e6e..000000000000 --- a/opennms-import/src/test/java/org/opennms/netmgt/importer/ImportOperationsManagerTest.java +++ /dev/null @@ -1,297 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.IOException; -import java.util.Collection; -import java.util.Collections; -import java.util.Map; -import java.util.Properties; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.opennms.core.test.MockLogAppender; -import org.opennms.core.test.OpenNMSJUnit4ClassRunner; -import org.opennms.core.test.db.annotations.JUnitTemporaryDatabase; -import org.opennms.core.test.snmp.annotations.JUnitSnmpAgent; -import org.opennms.core.utils.BeanUtils; -import org.opennms.core.utils.InetAddressUtils; -import org.opennms.netmgt.config.SnmpPeerFactory; -import org.opennms.netmgt.dao.DatabasePopulator; -import org.opennms.netmgt.dao.api.CategoryDao; -import org.opennms.netmgt.dao.api.DistPollerDao; -import org.opennms.netmgt.dao.api.IpInterfaceDao; -import org.opennms.netmgt.dao.api.NodeDao; -import org.opennms.netmgt.dao.api.ServiceTypeDao; -import org.opennms.netmgt.dao.api.SnmpInterfaceDao; -import org.opennms.netmgt.importer.operations.ImportOperationsManager; -import org.opennms.netmgt.importer.specification.AbstractImportVisitor; -import org.opennms.netmgt.importer.specification.SpecFile; -import org.opennms.netmgt.model.NetworkBuilder; -import org.opennms.netmgt.model.OnmsCategory; -import org.opennms.netmgt.model.OnmsDistPoller; -import org.opennms.netmgt.model.OnmsIpInterface; -import org.opennms.netmgt.model.OnmsNode; -import org.opennms.netmgt.model.OnmsServiceType; -import org.opennms.test.JUnitConfigurationEnvironment; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.transaction.TransactionStatus; -import org.springframework.transaction.support.TransactionCallback; -import org.springframework.transaction.support.TransactionCallbackWithoutResult; -import org.springframework.transaction.support.TransactionTemplate; - -@RunWith(OpenNMSJUnit4ClassRunner.class) -@ContextConfiguration(locations={ - "classpath:/META-INF/opennms/applicationContext-soa.xml", - "classpath:/META-INF/opennms/applicationContext-dao.xml", - "classpath*:/META-INF/opennms/component-dao.xml", - "classpath:/META-INF/opennms/applicationContext-databasePopulator.xml", - "classpath:/META-INF/opennms/applicationContext-setupIpLike-enabled.xml", - "classpath:/META-INF/opennms/applicationContext-minimal-conf.xml", - "classpath:/META-INF/opennms/applicationContext-proxy-snmp.xml" -}) -@JUnitConfigurationEnvironment -@JUnitTemporaryDatabase -public class ImportOperationsManagerTest implements InitializingBean { - private static final String TEST_IP_ADDRESS="127.0.0.1"; - private static final int TEST_PORT=1691; - - @Autowired - DatabasePopulator m_populator; - @Autowired - TransactionTemplate m_transTemplate; - @Autowired - DistPollerDao m_distPollerDao; - @Autowired - NodeDao m_nodeDao; - @Autowired - ServiceTypeDao m_serviceTypeDao; - @Autowired - CategoryDao m_categoryDao; - @Autowired - IpInterfaceDao m_ipInterfaceDao; - @Autowired - SnmpInterfaceDao m_snmpInterfaceDao; - @Autowired - private SnmpPeerFactory m_snmpPeerFactory; - - @Override - public void afterPropertiesSet() throws Exception { - BeanUtils.assertAutowiring(this); - SnmpPeerFactory.setInstance(m_snmpPeerFactory); - } - - @Before - public void onSetUpInTransactionIfEnabled() throws Exception { - Properties p = new Properties(); - p.setProperty("log4j.logger.org.snmp4j.Snmp", "FATAL"); - p.setProperty("log4j.logger.org.opennms.netmgt.snmp.SnmpWalker", "FATAL"); - MockLogAppender.setupLogging(p); - - m_populator.populateDatabase(); - - m_categoryDao.save(new OnmsCategory("AC")); - m_categoryDao.save(new OnmsCategory("UK")); - m_categoryDao.save(new OnmsCategory("low")); - m_categoryDao.flush(); - } - - - @After - public void onTearDownInTransactionIfEnabled() throws Exception { - MockLogAppender.assertNoWarningsOrGreater(); - } - - protected ModelImporter getModelImporter() { - ModelImporter mi = new ModelImporter(); - mi.setDistPollerDao(m_distPollerDao); - mi.setNodeDao(m_nodeDao); - mi.setServiceTypeDao(m_serviceTypeDao); - mi.setCategoryDao(m_categoryDao); - return mi; - } - - @Test - @JUnitTemporaryDatabase // Relies on specific IDs so we need a fresh database - @JUnitSnmpAgent(resource="classpath:snmpTestData1.properties", host=TEST_IP_ADDRESS, port=TEST_PORT) - public void testGetOperations() { - Map assetNumberMap = getAssetNumberMap("imported:"); - ImportOperationsManager opsMgr = new ImportOperationsManager(assetNumberMap, getModelImporter()); - opsMgr.setForeignSource("imported:"); - opsMgr.foundNode("1", "node1", "myhouse", "durham"); - opsMgr.foundNode("3", "node3", "myhouse", "durham"); - opsMgr.foundNode("5", "node5", "theoffice", "pittsboro"); - opsMgr.foundNode("6", "node6", "theoffice", "pittsboro"); - assertEquals(2, opsMgr.getUpdateCount()); - assertEquals(2, opsMgr.getInsertCount()); - assertEquals(2, opsMgr.getDeleteCount()); - assertEquals(6, opsMgr.getOperationCount()); - } - - @Test - @JUnitTemporaryDatabase // Relies on specific IDs so we need a fresh database - @JUnitSnmpAgent(resource="classpath:snmpTestData1.properties", host=TEST_IP_ADDRESS, port=TEST_PORT) - public void testSaveThenUpdate() throws Exception { - - - m_transTemplate.execute(new TransactionCallback() { - @Override - public OnmsNode doInTransaction(TransactionStatus status) { - OnmsServiceType icmp = m_serviceTypeDao.findByName("ICMP"); - OnmsServiceType snmp = m_serviceTypeDao.findByName("SNMP"); - OnmsDistPoller distPoller = m_distPollerDao.get("localhost"); - NetworkBuilder builder = new NetworkBuilder(distPoller); - builder.addNode("node7").setForeignSource("imported:").setForeignId("7"); - builder.getCurrentNode().getAssetRecord().setDisplayCategory("cat7"); - builder.addInterface("192.168.7.1").setIsManaged("M").setIsSnmpPrimary("P"); - builder.addService(icmp); - builder.addService(snmp); - m_nodeDao.save(builder.getCurrentNode()); - return builder.getCurrentNode(); - } - }); - - //m_distPollerDao.clear(); - - m_transTemplate.execute(new TransactionCallbackWithoutResult() { - @Override - public void doInTransactionWithoutResult(TransactionStatus status) { - OnmsNode node = m_nodeDao.findByForeignId("imported:", "7"); - assertNotNull(node); - assertEquals("node7", node.getLabel()); - assertEquals("cat7", node.getAssetRecord().getDisplayCategory()); - assertEquals(1, node.getIpInterfaces().size()); - OnmsIpInterface iface = node.getIpInterfaces().iterator().next(); - assertEquals("192.168.7.1", InetAddressUtils.str(iface.getIpAddress())); - assertEquals("M", iface.getIsManaged()); - assertEquals(2, iface.getMonitoredServices().size()); - - System.err.println("###################3 UPDATE ####################"); - m_nodeDao.update(node); - } - }); - - } - - @Test - @JUnitTemporaryDatabase // Relies on specific IDs so we need a fresh database - @JUnitSnmpAgent(host="172.20.1.201", resource="classpath:snmpTestData1.properties") - public void testChangeIpAddr() throws Exception { - doImportFromSpecFile(new ClassPathResource("/tec_dump.xml"), 1, 1); - - assertEquals(1, m_ipInterfaceDao.findByIpAddress("172.20.1.204").size()); - - doImportFromSpecFile(new ClassPathResource("/tec_dumpIpAddrChanged.xml"), 1, 1); - - assertEquals("Failed to add new interface 172.20.1.202", 1, m_ipInterfaceDao.findByIpAddress("172.20.1.202").size()); - assertEquals("Failed to delete removed interface 172.20.1.204", 0, m_ipInterfaceDao.findByIpAddress("172.20.1.204").size()); - } - - @Test - @JUnitTemporaryDatabase // Relies on specific IDs so we need a fresh database - @JUnitSnmpAgent(host="172.20.1.201", resource="classpath:snmpTestData1.properties") - public void testImportToOperationsMgr() throws Exception { - doDoubleImport(new ClassPathResource("/tec_dump.xml")); - - Collection c = m_ipInterfaceDao.findByIpAddress("172.20.1.201"); - assertEquals(1, c.size()); - - - } - - private void doDoubleImport(Resource specFileResource) throws ModelImportException, IOException { - - long pass1 = System.currentTimeMillis(); - doImportFromSpecFile(specFileResource); - - System.err.println("##################################################################################"); - long pass2 = System.currentTimeMillis(); - doImportFromSpecFile(specFileResource); - long end = System.currentTimeMillis(); - System.err.println("Pass1 Duration: "+(pass2-pass1)/1000+" s. Pass2 Duration: "+(end-pass2)/1000+" s."); - } - - private void doImportFromSpecFile(Resource specFileResource) throws IOException, ModelImportException { - doImportFromSpecFile(specFileResource, 4, 50); - } - - private void doImportFromSpecFile(Resource specFileResource, int writeThreads, int scanThreads) throws IOException, ModelImportException { - expectServiceTypeCreate("HTTP"); - final SpecFile specFile = new SpecFile(); - specFile.loadResource(specFileResource); - - Map assetNumbers = getAssetNumberMapInTransaction(specFile); - - final ImportOperationsManager opsMgr = new ImportOperationsManager(assetNumbers, getModelImporter()); - opsMgr.setWriteThreads(writeThreads); - opsMgr.setScanThreads(scanThreads); - opsMgr.setForeignSource(specFile.getForeignSource()); - - m_transTemplate.execute(new TransactionCallbackWithoutResult() { - - @Override - public void doInTransactionWithoutResult(TransactionStatus status) { - AbstractImportVisitor accountant = new ImportAccountant(opsMgr); - specFile.visitImport(accountant); - } - - }); - - opsMgr.persistOperations(m_transTemplate, m_nodeDao); - - } - - - private Map getAssetNumberMapInTransaction(final SpecFile specFile) { - Map assetNumbers = m_transTemplate.execute(new TransactionCallback>() { - @Override - public Map doInTransaction(TransactionStatus status) { - return Collections.unmodifiableMap(getAssetNumberMap(specFile.getForeignSource())); - } - }); - return assetNumbers; - } - - protected Map getAssetNumberMap(String foreignSource) { - return Collections.unmodifiableMap(m_nodeDao.getForeignIdToNodeIdMap(foreignSource)); - } - - protected void expectServiceTypeCreate(String string) { - // TODO Auto-generated method stub - } -} diff --git a/opennms-import/src/test/java/org/opennms/netmgt/importer/ImporterServiceJmxTest.java b/opennms-import/src/test/java/org/opennms/netmgt/importer/ImporterServiceJmxTest.java deleted file mode 100644 index 6e04ef682f2f..000000000000 --- a/opennms-import/src/test/java/org/opennms/netmgt/importer/ImporterServiceJmxTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2008-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer; - -import org.junit.Before; -import org.junit.Test; -import org.opennms.core.db.DataSourceFactory; -import org.opennms.core.test.MockLogAppender; -import org.opennms.core.test.db.MockDatabase; -import org.opennms.core.utils.BeanUtils; -import org.opennms.netmgt.importer.jmx.ImporterService; -import org.opennms.netmgt.importer.jmx.ImporterServiceMBean; -import org.opennms.test.DaoTestConfigBean; -import org.springframework.beans.factory.access.BeanFactoryReference; -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - - -public class ImporterServiceJmxTest { - - @Before - public void setUp() throws Exception { - - MockDatabase db = new MockDatabase(); - DataSourceFactory.setInstance(db); - - MockLogAppender.setupLogging(); - DaoTestConfigBean bean = new DaoTestConfigBean(); - bean.afterPropertiesSet(); - - - BeanFactoryReference ref = BeanUtils.getBeanFactory("daemonContext"); - ApplicationContext daemonContext = (ApplicationContext) ref.getFactory(); - - new ClassPathXmlApplicationContext(new String[] { "classpath:META-INF/opennms/mockEventIpcManager.xml" }, daemonContext); - - - } - - @Test - public void testStartStop() throws InterruptedException { - ImporterServiceMBean mbean = new ImporterService(); - mbean.init(); - mbean.start(); - mbean.stop(); - } -} diff --git a/opennms-import/src/test/java/org/opennms/netmgt/importer/ImporterServiceTest.java b/opennms-import/src/test/java/org/opennms/netmgt/importer/ImporterServiceTest.java deleted file mode 100644 index 8ce2c31eab78..000000000000 --- a/opennms-import/src/test/java/org/opennms/netmgt/importer/ImporterServiceTest.java +++ /dev/null @@ -1,131 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer; - -import static org.junit.Assert.assertTrue; - -import java.util.Properties; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.opennms.core.test.MockLogAppender; -import org.opennms.core.test.OpenNMSJUnit4ClassRunner; -import org.opennms.core.test.db.annotations.JUnitTemporaryDatabase; -import org.opennms.core.utils.BeanUtils; -import org.opennms.netmgt.EventConstants; -import org.opennms.netmgt.dao.mock.MockEventIpcManager; -import org.opennms.netmgt.model.events.EventBuilder; -import org.opennms.netmgt.xml.event.Event; -import org.opennms.test.JUnitConfigurationEnvironment; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; - -@RunWith(OpenNMSJUnit4ClassRunner.class) -@ContextConfiguration(locations={ - "classpath:/META-INF/opennms/applicationContext-soa.xml", - "classpath:/META-INF/opennms/applicationContext-dao.xml", - "classpath*:/META-INF/opennms/component-dao.xml", - "classpath:/META-INF/opennms/applicationContext-daemon.xml", - "classpath:/META-INF/opennms/mockEventIpcManager.xml", - "classpath:/META-INF/opennms/applicationContext-importer.xml", - "classpath:/META-INF/opennms/applicationContext-minimal-conf.xml", - "classpath:/importerServiceTest.xml" -}) -@JUnitConfigurationEnvironment -@JUnitTemporaryDatabase -public class ImporterServiceTest implements InitializingBean { - @Autowired - private MockEventIpcManager m_eventIpcMgr; - @Autowired - private ImporterService m_daemon; - - @Override - public void afterPropertiesSet() throws Exception { - BeanUtils.assertAutowiring(this); - } - - @Before - public void onSetUpInTransactionIfEnabled() throws Exception { - Properties logConfig = new Properties(); - - logConfig.put("log4j.logger.org.exolab.castor", "INFO"); - logConfig.put("log4j.logger.org.hibernate", "INFO"); - logConfig.put("log4j.logger.org.hibernate.SQL", "DEBUG"); - logConfig.put("log4j.logger.org.springframework", "INFO"); - - MockLogAppender.setupLogging(logConfig); - } - - @Test - public void testSchedule() throws Exception { - expectImportStarted(); - - m_daemon.start(); - - // we wait a while here because the start up time could be long - // this will end as soon as the event is received so no harm in waiting - waitForImportStarted(300000); - - expectImportSuccessful(); - - m_daemon.destroy(); - - // this will end as soon as the event is received so no harm in waiting - waitForImportSuccessful(300000); - } - - private void expectImportSuccessful() { - anticipateEvent(createEvent(EventConstants.IMPORT_SUCCESSFUL_UEI)); - } - - private void expectImportStarted() { - anticipateEvent(createEvent(EventConstants.IMPORT_STARTED_UEI)); - } - - private void waitForImportStarted(long timeout) { - assertTrue("Failed to receive importStarted event after waiting "+timeout+" millis", m_eventIpcMgr.getEventAnticipator().waitForAnticipated(timeout).size() == 0); - } - - private void waitForImportSuccessful(long timeout) { - assertTrue("Failed to receive importSuccessful event after waiting "+timeout+" millis", m_eventIpcMgr.getEventAnticipator().waitForAnticipated(timeout).size() == 0); - } - - public Event createEvent(String uei) { - return new EventBuilder(uei, "ModelImporter").getEvent(); - } - - private void anticipateEvent(Event e) { - anticipateEvent(e, false); - } - private void anticipateEvent(Event e, boolean checkUnanticipatedList) { - m_eventIpcMgr.getEventAnticipator().anticipateEvent(e, checkUnanticipatedList); - } -} diff --git a/opennms-import/src/test/java/org/opennms/netmgt/importer/ModelImporterTest.java b/opennms-import/src/test/java/org/opennms/netmgt/importer/ModelImporterTest.java deleted file mode 100644 index d30765b8fb5e..000000000000 --- a/opennms-import/src/test/java/org/opennms/netmgt/importer/ModelImporterTest.java +++ /dev/null @@ -1,401 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.opennms.core.test.OpenNMSJUnit4ClassRunner; -import org.opennms.core.test.db.annotations.JUnitTemporaryDatabase; -import org.opennms.core.test.snmp.annotations.JUnitSnmpAgent; -import org.opennms.core.test.snmp.annotations.JUnitSnmpAgents; -import org.opennms.core.utils.BeanUtils; -import org.opennms.netmgt.config.SnmpPeerFactory; -import org.opennms.netmgt.dao.DatabasePopulator; -import org.opennms.netmgt.dao.api.CategoryDao; -import org.opennms.netmgt.dao.api.ServiceTypeDao; -import org.opennms.netmgt.dao.api.SnmpInterfaceDao; -import org.opennms.netmgt.importer.config.Asset; -import org.opennms.netmgt.importer.config.Category; -import org.opennms.netmgt.importer.config.Interface; -import org.opennms.netmgt.importer.config.ModelImport; -import org.opennms.netmgt.importer.config.MonitoredService; -import org.opennms.netmgt.importer.config.Node; -import org.opennms.netmgt.importer.specification.ImportVisitor; -import org.opennms.netmgt.importer.specification.SpecFile; -import org.opennms.netmgt.model.OnmsAssetRecord; -import org.opennms.netmgt.model.OnmsCategory; -import org.opennms.netmgt.model.OnmsServiceType; -import org.opennms.test.JUnitConfigurationEnvironment; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.style.ToStringCreator; -import org.springframework.test.context.ContextConfiguration; - -/** - * Unit test for ModelImport application. - */ -@RunWith(OpenNMSJUnit4ClassRunner.class) -@ContextConfiguration(locations={ - "classpath:/META-INF/opennms/applicationContext-soa.xml", - "classpath:/META-INF/opennms/applicationContext-dao.xml", - "classpath*:/META-INF/opennms/component-dao.xml", - "classpath:/META-INF/opennms/applicationContext-databasePopulator.xml", - "classpath:/META-INF/opennms/applicationContext-setupIpLike-enabled.xml", - "classpath:/META-INF/opennms/applicationContext-proxy-snmp.xml", - "classpath:/META-INF/opennms/applicationContext-minimal-conf.xml", - "classpath:/modelImporterTest.xml" -}) -@JUnitConfigurationEnvironment -@JUnitTemporaryDatabase -@JUnitSnmpAgents({ - @JUnitSnmpAgent(host="172.20.1.201", resource="classpath:/snmpTestData1.properties"), - @JUnitSnmpAgent(host="192.168.2.1", resource="classpath:/snmpTestData1.properties"), - @JUnitSnmpAgent(host="10.99.99.99", resource="classpath:/snmpTestData1.properties"), - @JUnitSnmpAgent(host="10.128.2.1", resource="classpath:/snmpTestData1.properties"), - @JUnitSnmpAgent(host="10.128.7.1", resource="classpath:/snmpTestData1.properties"), - @JUnitSnmpAgent(host="10.131.177.1", resource="classpath:/snmpTestData1.properties"), - @JUnitSnmpAgent(host="10.131.180.1", resource="classpath:/snmpTestData1.properties"), - @JUnitSnmpAgent(host="10.131.182.1", resource="classpath:/snmpTestData1.properties"), - @JUnitSnmpAgent(host="10.131.185.1", resource="classpath:/snmpTestData1.properties"), - @JUnitSnmpAgent(host="10.132.80.1", resource="classpath:/snmpTestData1.properties"), - @JUnitSnmpAgent(host="10.132.78.1", resource="classpath:/snmpTestData1.properties"), - @JUnitSnmpAgent(host="10.136.160.1", resource="classpath:/snmpTestData1.properties") -}) -public class ModelImporterTest implements InitializingBean { - @Autowired - private DatabasePopulator m_populator; - @Autowired - private ServiceTypeDao m_serviceTypeDao; - @Autowired - private CategoryDao m_categoryDao; - @Autowired - private ModelImporter m_importer; - @Autowired - private SnmpInterfaceDao m_snmpInterfaceDao; - @Autowired - private SnmpPeerFactory m_snmpPeerFactory; - - @Override - public void afterPropertiesSet() throws Exception { - BeanUtils.assertAutowiring(this); - SnmpPeerFactory.setInstance(m_snmpPeerFactory); - } - - class CountingVisitor implements ImportVisitor { - private int m_modelImportCount; - private int m_modelImportCompleted; - private int m_nodeCount; - private int m_nodeCompleted; - private int m_ifaceCount; - private int m_ifaceCompleted; - private int m_svcCount; - private int m_svcCompleted; - private int m_categoryCount; - private int m_categoryCompleted; - private int m_assetCount; - private int m_assetCompleted; - - public int getModelImportCount() { - return m_modelImportCount; - } - - public int getModelImportCompletedCount() { - return m_modelImportCompleted; - } - - public int getNodeCount() { - return m_nodeCount; - } - - public int getNodeCompletedCount() { - return m_nodeCompleted; - } - - public int getInterfaceCount() { - return m_ifaceCount; - } - - public int getInterfaceCompletedCount() { - return m_ifaceCompleted; - } - - public int getMonitoredServiceCount() { - return m_svcCount; - } - - public int getMonitoredServiceCompletedCount() { - return m_svcCompleted; - } - - public int getCategoryCount() { - return m_categoryCount; - } - - public int getCategoryCompletedCount() { - return m_categoryCompleted; - } - - private int getAssetCount() { - return m_assetCount; - } - - private int getAssetCompletedCount() { - return m_assetCompleted; - } - - @Override - public void visitModelImport(ModelImport mi) { - m_modelImportCount++; - } - - @Override - public void visitNode(Node node) { - m_nodeCount++; - assertEquals("apknd", node.getNodeLabel()); - assertEquals("4243", node.getForeignId()); - } - - @Override - public void visitInterface(Interface iface) { - m_ifaceCount++; - } - - @Override - public void visitMonitoredService(MonitoredService svc) { - m_svcCount++; - } - - @Override - public void visitCategory(Category category) { - m_categoryCount++; - } - - @Override - public void visitAsset(Asset asset) { - m_assetCount++; - } - - @Override - public String toString() { - return (new ToStringCreator(this) - .append("modelImportCount", getModelImportCount()) - .append("modelImportCompletedCount", getModelImportCompletedCount()) - .append("nodeCount", getNodeCount()) - .append("nodeCompletedCount", getNodeCompletedCount()) - .append("interfaceCount", getInterfaceCount()) - .append("interfaceCompletedCount", getInterfaceCompletedCount()) - .append("monitoredServiceCount", getMonitoredServiceCount()) - .append("monitoredServiceCompletedCount", getMonitoredServiceCompletedCount()) - .append("categoryCount", getCategoryCount()) - .append("categoryCompletedCount", getCategoryCompletedCount()) - .append("assetCount", getAssetCount()) - .append("assetCompletedCount", getAssetCompletedCount()) - .toString()); - } - - @Override - public void completeModelImport(ModelImport modelImport) { - m_modelImportCompleted++; - } - - @Override - public void completeNode(Node node) { - m_nodeCompleted++; - } - - @Override - public void completeInterface(Interface iface) { - m_ifaceCompleted++; - } - - @Override - public void completeMonitoredService(MonitoredService svc) { - m_svcCompleted++; - } - - @Override - public void completeCategory(Category category) { - m_categoryCompleted++; - } - - @Override - public void completeAsset(Asset asset) { - m_assetCompleted++; - } - - } - - @Test - public void testVisit() throws Exception { - - SpecFile specFile = new SpecFile(); - specFile.loadResource(new ClassPathResource("/NewFile2.xml")); - CountingVisitor visitor = new CountingVisitor(); - specFile.visitImport(visitor); - verifyCounts(visitor); - } - - @Test - public void testFindQuery() throws Exception { - ModelImporter mi = m_importer; - String specFile = "/tec_dump.xml.smalltest"; - mi.importModelFromResource(new ClassPathResource(specFile)); - for (OnmsAssetRecord assetRecord : m_importer.getAssetRecordDao().findAll()) { - System.err.println(assetRecord.getAssetNumber()); - } - } - - @Test - @JUnitTemporaryDatabase // Relies on specific IDs so we need a fresh database - public void testPopulate() throws Exception { - createAndFlushServiceTypes(); - createAndFlushCategories(); - - ModelImporter mi = m_importer; - String specFile = "/tec_dump.xml.smalltest"; - mi.importModelFromResource(new ClassPathResource(specFile)); - - //Verify distpoller count - assertEquals(1, mi.getDistPollerDao().countAll()); - - //Verify node count - assertEquals(10, mi.getNodeDao().countAll()); - - //Verify ipinterface count - assertEquals(30, mi.getIpInterfaceDao().countAll()); - - //Verify ifservices count - assertEquals(50, mi.getMonitoredServiceDao().countAll()); - - //Verify service count - assertEquals(3, mi.getServiceTypeDao().countAll()); - } - - @Test - @JUnitTemporaryDatabase // Relies on specific IDs so we need a fresh database - public void testAddSnmpInterfaces() throws Exception { - createAndFlushServiceTypes(); - createAndFlushCategories(); - - ModelImporter mi = m_importer; - String specFile = "/tec_dump.xml"; - mi.importModelFromResource(new ClassPathResource(specFile)); - - assertEquals(1, mi.getIpInterfaceDao().findByIpAddress("172.20.1.204").size()); - - assertEquals(2, mi.getIpInterfaceDao().countAll()); - - assertEquals(6, m_snmpInterfaceDao.countAll()); - } - - - - /** - * This test first bulk imports 10 nodes then runs update with 1 node missing - * from the import file. - * - * @throws ModelImportException - */ - @Test - @JUnitTemporaryDatabase // Relies on specific IDs so we need a fresh database - public void testImportUtf8() throws Exception { - createAndFlushServiceTypes(); - createAndFlushCategories(); - - //Initialize the database - ModelImporter mi = m_importer; - String specFile = "/utf-8.xml"; - mi.importModelFromResource(new ClassPathResource(specFile)); - - assertEquals(1, mi.getNodeDao().countAll()); - // \u00f1 is unicode for n~ - assertEquals("\u00f1ode2", mi.getNodeDao().get(1).getLabel()); - } - - /** - * This test first bulk imports 10 nodes then runs update with 1 node missing - * from the import file. - * - * @throws ModelImportException - */ - @Test - @JUnitTemporaryDatabase // Relies on specific IDs so we need a fresh database - public void testDelete() throws Exception { - createAndFlushServiceTypes(); - createAndFlushCategories(); - - //Initialize the database - ModelImporter mi = m_importer; - String specFile = "/tec_dump.xml.smalltest"; - mi.importModelFromResource(new ClassPathResource(specFile)); - - assertEquals(10, mi.getNodeDao().countAll()); - } - - private static void verifyCounts(CountingVisitor visitor) { - System.err.println(visitor); - assertEquals(1, visitor.getModelImportCount()); - assertEquals(1, visitor.getNodeCount()); - assertEquals(3, visitor.getCategoryCount()); - assertEquals(4, visitor.getInterfaceCount()); - assertEquals(6, visitor.getMonitoredServiceCount()); - assertEquals(3, visitor.getAssetCount()); - assertEquals(visitor.getModelImportCount(), visitor.getModelImportCompletedCount()); - assertEquals(visitor.getNodeCount(), visitor.getNodeCompletedCount()); - assertEquals(visitor.getCategoryCount(), visitor.getCategoryCompletedCount()); - assertEquals(visitor.getInterfaceCount(), visitor.getInterfaceCompletedCount()); - assertEquals(visitor.getMonitoredServiceCount(), visitor.getMonitoredServiceCompletedCount()); - assertEquals(visitor.getAssetCount(), visitor.getAssetCompletedCount()); - } - - private void createAndFlushServiceTypes() { - m_serviceTypeDao.save(new OnmsServiceType("ICMP")); - m_serviceTypeDao.save(new OnmsServiceType("SNMP")); - m_serviceTypeDao.save(new OnmsServiceType("HTTP")); - m_serviceTypeDao.flush(); - } - - private void createAndFlushCategories() { - m_categoryDao.save(new OnmsCategory("AC")); - m_categoryDao.save(new OnmsCategory("AP")); - m_categoryDao.save(new OnmsCategory("UK")); - m_categoryDao.save(new OnmsCategory("BE")); - m_categoryDao.save(new OnmsCategory("high")); - m_categoryDao.save(new OnmsCategory("low")); - m_categoryDao.save(new OnmsCategory("Park Plaza")); - m_categoryDao.save(new OnmsCategory("Golden Tulip")); - m_categoryDao.save(new OnmsCategory("Hilton")); - m_categoryDao.save(new OnmsCategory("Scandic")); - m_categoryDao.save(new OnmsCategory("Best Western")); - m_categoryDao.flush(); - } -} diff --git a/opennms-import/src/test/java/org/opennms/netmgt/importer/operations/UpdateOperationTest.java b/opennms-import/src/test/java/org/opennms/netmgt/importer/operations/UpdateOperationTest.java deleted file mode 100644 index 2eafcc85eae2..000000000000 --- a/opennms-import/src/test/java/org/opennms/netmgt/importer/operations/UpdateOperationTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/******************************************************************************* - * This file is part of OpenNMS(R). - * - * Copyright (C) 2006-2012 The OpenNMS Group, Inc. - * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. - * - * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. - * - * OpenNMS(R) is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * OpenNMS(R) 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenNMS(R). If not, see: - * http://www.gnu.org/licenses/ - * - * For more information contact: - * OpenNMS(R) Licensing - * http://www.opennms.org/ - * http://www.opennms.com/ - *******************************************************************************/ - -package org.opennms.netmgt.importer.operations; - -import java.io.ByteArrayInputStream; -import java.io.IOException; - -import junit.framework.TestCase; - -import org.exolab.castor.xml.MarshalException; -import org.exolab.castor.xml.ValidationException; -import org.opennms.netmgt.config.SnmpPeerFactory; -import org.opennms.netmgt.importer.config.types.InterfaceSnmpPrimaryType; - -public class UpdateOperationTest extends TestCase { - - @Override - protected void setUp() throws Exception { - super.setUp(); - } - - @Override - protected void tearDown() throws Exception { - super.tearDown(); - } - - /* - * Test method for 'org.opennms.netmgt.importer.operations.AbstractSaveOrUpdateOperation.scanForSnmpData(Node)' - */ - public final void testScanForSnmpData() throws MarshalException, ValidationException, IOException { - - ByteArrayInputStream in = new ByteArrayInputStream(("\n" + - "\n" + - "\n" + - "").getBytes()); - - SnmpPeerFactory.setInstance(new SnmpPeerFactory(in)); - - - AbstractSaveOrUpdateOperation op = new UpdateOperation(new Integer(1), "imported:", "1", "node1", "theoffice", "pittsboro"); - op.foundInterface("192.168.0.102", "if1", InterfaceSnmpPrimaryType.P, true, 1); - op.foundInterface("127.0.0.1", "if2", InterfaceSnmpPrimaryType.N, true, 1); - op.updateSnmpData(); - - - } - -} diff --git a/opennms-import/src/test/resources/NewFile2.xml b/opennms-import/src/test/resources/NewFile2.xml deleted file mode 100644 index 4ef9c9d3af76..000000000000 --- a/opennms-import/src/test/resources/NewFile2.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/opennms-import/src/test/resources/importerServiceTest.xml b/opennms-import/src/test/resources/importerServiceTest.xml deleted file mode 100644 index 6079768c78ae..000000000000 --- a/opennms-import/src/test/resources/importerServiceTest.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - /tec_dump.xml.smalltest - - - - 50 - - - - 8 - - - - 0/10 * * * * ? - - \ No newline at end of file diff --git a/opennms-import/src/test/resources/modelImporterTest.xml b/opennms-import/src/test/resources/modelImporterTest.xml deleted file mode 100644 index 779376c06ccd..000000000000 --- a/opennms-import/src/test/resources/modelImporterTest.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - diff --git a/opennms-import/src/test/resources/simple.xml b/opennms-import/src/test/resources/simple.xml deleted file mode 100644 index 02144667dc8a..000000000000 --- a/opennms-import/src/test/resources/simple.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/opennms-import/src/test/resources/simple_update.xml b/opennms-import/src/test/resources/simple_update.xml deleted file mode 100644 index b9e64d61a182..000000000000 --- a/opennms-import/src/test/resources/simple_update.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/opennms-import/src/test/resources/snmpTestData1.properties b/opennms-import/src/test/resources/snmpTestData1.properties deleted file mode 100644 index 51173cc99a2e..000000000000 --- a/opennms-import/src/test/resources/snmpTestData1.properties +++ /dev/null @@ -1,1733 +0,0 @@ -# -# Generated using: -# snmpwalk -OUne -v1 -c public localhost -# -.1.3.6.1.2.1.1.1.0 = STRING: Darwin brozow.local 7.9.0 Darwin Kernel Version 7.9.0: Wed Mar 30 20:11:17 PST 2005; root:xnu/xnu-517.12.7.obj~1/RELEASE_PPC Power Macintosh -.1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.8072.3.2.255 -.1.3.6.1.2.1.1.3.0 = Timeticks: (77567) 0:12:55.67 -.1.3.6.1.2.1.1.4.0 = STRING: root@@no.where -.1.3.6.1.2.1.1.5.0 = STRING: brozow.local -.1.3.6.1.2.1.1.6.0 = STRING: Unknown -.1.3.6.1.2.1.1.8.0 = Timeticks: (84) 0:00:00.84 -.1.3.6.1.2.1.1.9.1.2.1 = OID: .1.3.6.1.2.1.31 -.1.3.6.1.2.1.1.9.1.2.2 = OID: .1.3.6.1.6.3.1 -.1.3.6.1.2.1.1.9.1.2.3 = OID: .1.3.6.1.2.1.49 -.1.3.6.1.2.1.1.9.1.2.4 = OID: .1.3.6.1.2.1.4 -.1.3.6.1.2.1.1.9.1.2.5 = OID: .1.3.6.1.2.1.50 -.1.3.6.1.2.1.1.9.1.2.6 = OID: .1.3.6.1.6.3.16.2.2.1 -.1.3.6.1.2.1.1.9.1.2.7 = OID: .1.3.6.1.6.3.10.3.1.1 -.1.3.6.1.2.1.1.9.1.2.8 = OID: .1.3.6.1.6.3.11.3.1.1 -.1.3.6.1.2.1.1.9.1.2.9 = OID: .1.3.6.1.6.3.15.2.1.1 -.1.3.6.1.2.1.1.9.1.3.1 = STRING: The MIB module to describe generic objects for network interface sub-layers -.1.3.6.1.2.1.1.9.1.3.2 = STRING: The MIB module for SNMPv2 entities -.1.3.6.1.2.1.1.9.1.3.3 = STRING: The MIB module for managing TCP implementations -.1.3.6.1.2.1.1.9.1.3.4 = STRING: The MIB module for managing IP and ICMP implementations -.1.3.6.1.2.1.1.9.1.3.5 = STRING: The MIB module for managing UDP implementations -.1.3.6.1.2.1.1.9.1.3.6 = STRING: View-based Access Control Model for SNMP. -.1.3.6.1.2.1.1.9.1.3.7 = STRING: The SNMP Management Architecture MIB. -.1.3.6.1.2.1.1.9.1.3.8 = STRING: The MIB for Message Processing and Dispatching. -.1.3.6.1.2.1.1.9.1.3.9 = STRING: The management information definitions for the SNMP User-based Security Model. -.1.3.6.1.2.1.1.9.1.4.1 = Timeticks: (1) 0:00:00.01 -.1.3.6.1.2.1.1.9.1.4.2 = Timeticks: (1) 0:00:00.01 -.1.3.6.1.2.1.1.9.1.4.3 = Timeticks: (1) 0:00:00.01 -.1.3.6.1.2.1.1.9.1.4.4 = Timeticks: (49) 0:00:00.49 -.1.3.6.1.2.1.1.9.1.4.5 = Timeticks: (65) 0:00:00.65 -.1.3.6.1.2.1.1.9.1.4.6 = Timeticks: (81) 0:00:00.81 -.1.3.6.1.2.1.1.9.1.4.7 = Timeticks: (84) 0:00:00.84 -.1.3.6.1.2.1.1.9.1.4.8 = Timeticks: (84) 0:00:00.84 -.1.3.6.1.2.1.1.9.1.4.9 = Timeticks: (84) 0:00:00.84 -.1.3.6.1.2.1.2.1.0 = INTEGER: 6 -.1.3.6.1.2.1.2.2.1.1.1 = INTEGER: 1 -.1.3.6.1.2.1.2.2.1.1.2 = INTEGER: 2 -.1.3.6.1.2.1.2.2.1.1.3 = INTEGER: 3 -.1.3.6.1.2.1.2.2.1.1.4 = INTEGER: 4 -.1.3.6.1.2.1.2.2.1.1.5 = INTEGER: 5 -.1.3.6.1.2.1.2.2.1.1.6 = INTEGER: 6 -.1.3.6.1.2.1.2.2.1.2.1 = STRING: lo0 -.1.3.6.1.2.1.2.2.1.2.2 = STRING: gif0 -.1.3.6.1.2.1.2.2.1.2.3 = STRING: stf0 -.1.3.6.1.2.1.2.2.1.2.4 = STRING: en0 -.1.3.6.1.2.1.2.2.1.2.5 = STRING: en1 -.1.3.6.1.2.1.2.2.1.2.6 = STRING: fw0 -.1.3.6.1.2.1.2.2.1.3.1 = INTEGER: 24 -.1.3.6.1.2.1.2.2.1.3.2 = INTEGER: 55 -.1.3.6.1.2.1.2.2.1.3.3 = INTEGER: 57 -.1.3.6.1.2.1.2.2.1.3.4 = INTEGER: 6 -.1.3.6.1.2.1.2.2.1.3.5 = INTEGER: 6 -.1.3.6.1.2.1.2.2.1.3.6 = INTEGER: 144 -.1.3.6.1.2.1.2.2.1.4.1 = INTEGER: 16384 -.1.3.6.1.2.1.2.2.1.4.2 = INTEGER: 1280 -.1.3.6.1.2.1.2.2.1.4.3 = INTEGER: 1280 -.1.3.6.1.2.1.2.2.1.4.4 = INTEGER: 1500 -.1.3.6.1.2.1.2.2.1.4.5 = INTEGER: 1500 -.1.3.6.1.2.1.2.2.1.4.6 = INTEGER: 4078 -.1.3.6.1.2.1.2.2.1.5.1 = Gauge32: 0 -.1.3.6.1.2.1.2.2.1.5.2 = Gauge32: 0 -.1.3.6.1.2.1.2.2.1.5.3 = Gauge32: 0 -.1.3.6.1.2.1.2.2.1.5.4 = Gauge32: 10000000 -.1.3.6.1.2.1.2.2.1.5.5 = Gauge32: 10000000 -.1.3.6.1.2.1.2.2.1.5.6 = Gauge32: 10000000 -.1.3.6.1.2.1.2.2.1.7.1 = INTEGER: 1 -.1.3.6.1.2.1.2.2.1.7.2 = INTEGER: 2 -.1.3.6.1.2.1.2.2.1.7.3 = INTEGER: 2 -.1.3.6.1.2.1.2.2.1.7.4 = INTEGER: 1 -.1.3.6.1.2.1.2.2.1.7.5 = INTEGER: 1 -.1.3.6.1.2.1.2.2.1.7.6 = INTEGER: 2 -.1.3.6.1.2.1.2.2.1.8.1 = INTEGER: 1 -.1.3.6.1.2.1.2.2.1.8.2 = INTEGER: 2 -.1.3.6.1.2.1.2.2.1.8.3 = INTEGER: 2 -.1.3.6.1.2.1.2.2.1.8.4 = INTEGER: 1 -.1.3.6.1.2.1.2.2.1.8.5 = INTEGER: 1 -.1.3.6.1.2.1.2.2.1.8.6 = INTEGER: 2 -.1.3.6.1.2.1.2.2.1.9.1 = Timeticks: (77571) 0:12:55.71 -.1.3.6.1.2.1.2.2.1.9.2 = Timeticks: (0) 0:00:00.00 -.1.3.6.1.2.1.2.2.1.9.3 = Timeticks: (0) 0:00:00.00 -.1.3.6.1.2.1.2.2.1.9.4 = Timeticks: (77567) 0:12:55.67 -.1.3.6.1.2.1.2.2.1.9.5 = Timeticks: (77570) 0:12:55.70 -.1.3.6.1.2.1.2.2.1.9.6 = Timeticks: (0) 0:00:00.00 -.1.3.6.1.2.1.2.2.1.10.1 = Counter32: 6808986 -.1.3.6.1.2.1.2.2.1.10.2 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.10.3 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.10.4 = Counter32: 6561336 -.1.3.6.1.2.1.2.2.1.10.5 = Counter32: 1241157 -.1.3.6.1.2.1.2.2.1.10.6 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.11.1 = Counter32: 79048 -.1.3.6.1.2.1.2.2.1.11.2 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.11.3 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.11.4 = Counter32: 4317 -.1.3.6.1.2.1.2.2.1.11.5 = Counter32: 4294960059 -.1.3.6.1.2.1.2.2.1.11.6 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.12.1 = Counter32: 610 -.1.3.6.1.2.1.2.2.1.12.2 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.12.3 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.12.4 = Counter32: 15725 -.1.3.6.1.2.1.2.2.1.12.5 = Counter32: 15969 -.1.3.6.1.2.1.2.2.1.12.6 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.13.1 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.13.2 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.13.3 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.13.4 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.13.5 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.13.6 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.14.1 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.14.2 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.14.3 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.14.4 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.14.5 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.14.6 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.15.1 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.15.2 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.15.3 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.15.4 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.15.5 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.15.6 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.16.1 = Counter32: 6815158 -.1.3.6.1.2.1.2.2.1.16.2 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.16.3 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.16.4 = Counter32: 1150791 -.1.3.6.1.2.1.2.2.1.16.5 = Counter32: 150021 -.1.3.6.1.2.1.2.2.1.16.6 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.17.1 = Counter32: 79730 -.1.3.6.1.2.1.2.2.1.17.2 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.17.3 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.17.4 = Counter32: 12615 -.1.3.6.1.2.1.2.2.1.17.5 = Counter32: 972 -.1.3.6.1.2.1.2.2.1.17.6 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.18.1 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.18.2 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.18.3 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.18.4 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.18.5 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.18.6 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.20.1 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.20.2 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.20.3 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.20.4 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.20.5 = Counter32: 0 -.1.3.6.1.2.1.2.2.1.20.6 = Counter32: 0 -.1.3.6.1.2.1.3.1.1.1.4.1.172.20.1.1 = INTEGER: 4 -.1.3.6.1.2.1.3.1.1.1.4.1.172.20.1.11 = INTEGER: 4 -.1.3.6.1.2.1.3.1.1.1.4.1.172.20.1.205 = INTEGER: 4 -.1.3.6.1.2.1.3.1.1.2.4.1.172.20.1.1 = Hex-STRING: 00 0F 66 20 02 FD -.1.3.6.1.2.1.3.1.1.2.4.1.172.20.1.11 = Hex-STRING: 00 30 48 11 41 9F -.1.3.6.1.2.1.3.1.1.2.4.1.172.20.1.205 = Hex-STRING: 00 0A 95 AC 87 02 -.1.3.6.1.2.1.3.1.1.3.4.1.172.20.1.1 = Network Address: AC:14:01:01 -.1.3.6.1.2.1.3.1.1.3.4.1.172.20.1.11 = Network Address: AC:14:01:0B -.1.3.6.1.2.1.3.1.1.3.4.1.172.20.1.205 = Network Address: AC:14:01:CD -.1.3.6.1.2.1.4.1.0 = INTEGER: 2 -.1.3.6.1.2.1.4.2.0 = INTEGER: 0 -.1.3.6.1.2.1.4.3.0 = Counter32: 99510 -.1.3.6.1.2.1.4.4.0 = Counter32: 0 -.1.3.6.1.2.1.4.5.0 = Counter32: 17 -.1.3.6.1.2.1.4.6.0 = Counter32: 0 -.1.3.6.1.2.1.4.7.0 = Counter32: 64 -.1.3.6.1.2.1.4.8.0 = Counter32: 0 -.1.3.6.1.2.1.4.9.0 = Counter32: 99396 -.1.3.6.1.2.1.4.10.0 = Counter32: 89083 -.1.3.6.1.2.1.4.11.0 = Counter32: 0 -.1.3.6.1.2.1.4.13.0 = INTEGER: 60 -.1.3.6.1.2.1.4.14.0 = Counter32: 32 -.1.3.6.1.2.1.4.15.0 = Counter32: 16 -.1.3.6.1.2.1.4.16.0 = Counter32: 0 -.1.3.6.1.2.1.4.17.0 = Counter32: 32 -.1.3.6.1.2.1.4.18.0 = Counter32: 0 -.1.3.6.1.2.1.4.19.0 = Counter32: 40 -.1.3.6.1.2.1.4.20.1.1.127.0.0.1 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.4.20.1.1.172.20.1.201 = IpAddress: 172.20.1.201 -.1.3.6.1.2.1.4.20.1.1.172.20.1.204 = IpAddress: 172.20.1.204 -.1.3.6.1.2.1.4.20.1.2.127.0.0.1 = INTEGER: 1 -.1.3.6.1.2.1.4.20.1.2.172.20.1.201 = INTEGER: 5 -.1.3.6.1.2.1.4.20.1.2.172.20.1.204 = INTEGER: 4 -.1.3.6.1.2.1.4.20.1.3.127.0.0.1 = IpAddress: 255.0.0.0 -.1.3.6.1.2.1.4.20.1.3.172.20.1.201 = IpAddress: 255.255.255.0 -.1.3.6.1.2.1.4.20.1.3.172.20.1.204 = IpAddress: 255.255.255.0 -.1.3.6.1.2.1.4.20.1.4.127.0.0.1 = INTEGER: 1 -.1.3.6.1.2.1.4.20.1.4.172.20.1.201 = INTEGER: 1 -.1.3.6.1.2.1.4.20.1.4.172.20.1.204 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.1.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.4.21.1.1.17.250.248.34 = IpAddress: 17.250.248.34 -.1.3.6.1.2.1.4.21.1.1.24.25.4.167 = IpAddress: 24.25.4.167 -.1.3.6.1.2.1.4.21.1.1.24.25.4.168 = IpAddress: 24.25.4.168 -.1.3.6.1.2.1.4.21.1.1.24.56.56.240 = IpAddress: 24.56.56.240 -.1.3.6.1.2.1.4.21.1.1.24.62.224.45 = IpAddress: 24.62.224.45 -.1.3.6.1.2.1.4.21.1.1.24.81.144.89 = IpAddress: 24.81.144.89 -.1.3.6.1.2.1.4.21.1.1.24.200.149.203 = IpAddress: 24.200.149.203 -.1.3.6.1.2.1.4.21.1.1.63.246.7.10 = IpAddress: 63.246.7.10 -.1.3.6.1.2.1.4.21.1.1.64.12.25.48 = IpAddress: 64.12.25.48 -.1.3.6.1.2.1.4.21.1.1.64.49.254.23 = IpAddress: 64.49.254.23 -.1.3.6.1.2.1.4.21.1.1.66.42.173.37 = IpAddress: 66.42.173.37 -.1.3.6.1.2.1.4.21.1.1.66.45.96.6 = IpAddress: 66.45.96.6 -.1.3.6.1.2.1.4.21.1.1.66.179.164.60 = IpAddress: 66.179.164.60 -.1.3.6.1.2.1.4.21.1.1.67.187.98.13 = IpAddress: 67.187.98.13 -.1.3.6.1.2.1.4.21.1.1.68.54.249.235 = IpAddress: 68.54.249.235 -.1.3.6.1.2.1.4.21.1.1.68.175.84.243 = IpAddress: 68.175.84.243 -.1.3.6.1.2.1.4.21.1.1.69.157.45.226 = IpAddress: 69.157.45.226 -.1.3.6.1.2.1.4.21.1.1.80.230.251.83 = IpAddress: 80.230.251.83 -.1.3.6.1.2.1.4.21.1.1.81.170.128.199 = IpAddress: 81.170.128.199 -.1.3.6.1.2.1.4.21.1.1.82.73.145.246 = IpAddress: 82.73.145.246 -.1.3.6.1.2.1.4.21.1.1.82.74.108.161 = IpAddress: 82.74.108.161 -.1.3.6.1.2.1.4.21.1.1.83.250.215.80 = IpAddress: 83.250.215.80 -.1.3.6.1.2.1.4.21.1.1.84.252.25.25 = IpAddress: 84.252.25.25 -.1.3.6.1.2.1.4.21.1.1.85.11.167.111 = IpAddress: 85.11.167.111 -.1.3.6.1.2.1.4.21.1.1.85.188.1.26 = IpAddress: 85.188.1.26 -.1.3.6.1.2.1.4.21.1.1.127.0.0.0 = IpAddress: 127.0.0.0 -.1.3.6.1.2.1.4.21.1.1.127.0.0.1 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.4.21.1.1.130.161.41.131 = IpAddress: 130.161.41.131 -.1.3.6.1.2.1.4.21.1.1.140.112.233.205 = IpAddress: 140.112.233.205 -.1.3.6.1.2.1.4.21.1.1.140.115.214.186 = IpAddress: 140.115.214.186 -.1.3.6.1.2.1.4.21.1.1.140.120.238.197 = IpAddress: 140.120.238.197 -.1.3.6.1.2.1.4.21.1.1.169.254.0.0 = IpAddress: 169.254.0.0 -.1.3.6.1.2.1.4.21.1.1.172.20.1.0 = IpAddress: 172.20.1.0 -.1.3.6.1.2.1.4.21.1.1.172.20.1.1 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.1.172.20.1.11 = IpAddress: 172.20.1.11 -.1.3.6.1.2.1.4.21.1.1.172.20.1.201 = IpAddress: 172.20.1.201 -.1.3.6.1.2.1.4.21.1.1.172.20.1.204 = IpAddress: 172.20.1.204 -.1.3.6.1.2.1.4.21.1.1.172.20.1.205 = IpAddress: 172.20.1.205 -.1.3.6.1.2.1.4.21.1.1.205.188.248.151 = IpAddress: 205.188.248.151 -.1.3.6.1.2.1.4.21.1.1.207.46.106.176 = IpAddress: 207.46.106.176 -.1.3.6.1.2.1.4.21.1.1.209.61.128.9 = IpAddress: 209.61.128.9 -.1.3.6.1.2.1.4.21.1.1.216.155.193.141 = IpAddress: 216.155.193.141 -.1.3.6.1.2.1.4.21.1.1.219.160.189.74 = IpAddress: 219.160.189.74 -.1.3.6.1.2.1.4.21.1.1.224.0.0.251 = IpAddress: 224.0.0.251 -.1.3.6.1.2.1.4.21.1.1.239.255.255.253 = IpAddress: 239.255.255.253 -.1.3.6.1.2.1.4.21.1.2.0.0.0.0 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.17.250.248.34 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.24.25.4.167 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.24.25.4.168 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.24.56.56.240 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.24.62.224.45 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.24.81.144.89 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.24.200.149.203 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.63.246.7.10 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.64.12.25.48 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.64.49.254.23 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.66.42.173.37 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.66.45.96.6 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.66.179.164.60 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.67.187.98.13 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.68.54.249.235 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.68.175.84.243 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.69.157.45.226 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.80.230.251.83 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.81.170.128.199 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.82.73.145.246 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.82.74.108.161 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.83.250.215.80 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.84.252.25.25 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.85.11.167.111 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.85.188.1.26 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.127.0.0.0 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.2.127.0.0.1 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.2.130.161.41.131 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.140.112.233.205 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.140.115.214.186 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.140.120.238.197 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.169.254.0.0 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.172.20.1.0 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.172.20.1.1 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.172.20.1.11 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.172.20.1.201 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.2.172.20.1.204 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.2.172.20.1.205 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.205.188.248.151 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.207.46.106.176 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.209.61.128.9 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.216.155.193.141 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.219.160.189.74 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.224.0.0.251 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.2.239.255.255.253 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.3.0.0.0.0 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.17.250.248.34 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.24.25.4.167 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.24.25.4.168 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.24.56.56.240 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.24.62.224.45 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.24.81.144.89 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.24.200.149.203 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.63.246.7.10 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.64.12.25.48 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.64.49.254.23 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.66.42.173.37 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.66.45.96.6 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.66.179.164.60 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.67.187.98.13 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.68.54.249.235 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.68.175.84.243 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.69.157.45.226 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.80.230.251.83 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.81.170.128.199 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.82.73.145.246 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.82.74.108.161 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.83.250.215.80 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.84.252.25.25 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.85.11.167.111 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.85.188.1.26 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.127.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.3.127.0.0.1 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.3.130.161.41.131 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.140.112.233.205 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.140.115.214.186 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.140.120.238.197 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.169.254.0.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.3.172.20.1.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.3.172.20.1.1 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.3.172.20.1.11 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.3.172.20.1.201 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.3.172.20.1.204 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.3.172.20.1.205 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.3.205.188.248.151 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.207.46.106.176 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.209.61.128.9 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.216.155.193.141 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.219.160.189.74 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.224.0.0.251 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.3.239.255.255.253 = INTEGER: 1 -.1.3.6.1.2.1.4.21.1.4.0.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.17.250.248.34 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.24.25.4.167 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.24.25.4.168 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.24.56.56.240 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.24.62.224.45 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.24.81.144.89 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.24.200.149.203 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.63.246.7.10 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.64.12.25.48 = INTEGER: 156250 -.1.3.6.1.2.1.4.21.1.4.64.49.254.23 = INTEGER: 123352 -.1.3.6.1.2.1.4.21.1.4.66.42.173.37 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.66.45.96.6 = INTEGER: 109375 -.1.3.6.1.2.1.4.21.1.4.66.179.164.60 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.67.187.98.13 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.68.54.249.235 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.68.175.84.243 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.69.157.45.226 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.80.230.251.83 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.81.170.128.199 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.82.73.145.246 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.82.74.108.161 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.83.250.215.80 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.84.252.25.25 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.85.11.167.111 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.85.188.1.26 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.127.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.127.0.0.1 = INTEGER: 119788 -.1.3.6.1.2.1.4.21.1.4.130.161.41.131 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.140.112.233.205 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.140.115.214.186 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.140.120.238.197 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.169.254.0.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.172.20.1.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.172.20.1.1 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.172.20.1.11 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.172.20.1.201 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.172.20.1.204 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.172.20.1.205 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.205.188.248.151 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.207.46.106.176 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.209.61.128.9 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.216.155.193.141 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.219.160.189.74 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.224.0.0.251 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.4.239.255.255.253 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.0.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.17.250.248.34 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.24.25.4.167 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.24.25.4.168 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.24.56.56.240 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.24.62.224.45 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.24.81.144.89 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.24.200.149.203 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.63.246.7.10 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.64.12.25.48 = INTEGER: 218750 -.1.3.6.1.2.1.4.21.1.5.64.49.254.23 = INTEGER: 177734 -.1.3.6.1.2.1.4.21.1.5.66.42.173.37 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.66.45.96.6 = INTEGER: 93750 -.1.3.6.1.2.1.4.21.1.5.66.179.164.60 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.67.187.98.13 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.68.54.249.235 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.68.175.84.243 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.69.157.45.226 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.80.230.251.83 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.81.170.128.199 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.82.73.145.246 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.82.74.108.161 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.83.250.215.80 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.84.252.25.25 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.85.11.167.111 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.85.188.1.26 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.127.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.127.0.0.1 = INTEGER: 217038 -.1.3.6.1.2.1.4.21.1.5.130.161.41.131 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.140.112.233.205 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.140.115.214.186 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.140.120.238.197 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.169.254.0.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.172.20.1.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.172.20.1.1 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.172.20.1.11 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.172.20.1.201 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.172.20.1.204 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.172.20.1.205 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.205.188.248.151 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.207.46.106.176 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.209.61.128.9 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.216.155.193.141 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.219.160.189.74 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.224.0.0.251 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.5.239.255.255.253 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.0.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.17.250.248.34 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.24.25.4.167 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.24.25.4.168 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.24.56.56.240 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.24.62.224.45 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.24.81.144.89 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.24.200.149.203 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.63.246.7.10 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.64.12.25.48 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.64.49.254.23 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.66.42.173.37 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.66.45.96.6 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.66.179.164.60 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.67.187.98.13 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.68.54.249.235 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.68.175.84.243 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.69.157.45.226 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.80.230.251.83 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.81.170.128.199 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.82.73.145.246 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.82.74.108.161 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.83.250.215.80 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.84.252.25.25 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.85.11.167.111 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.85.188.1.26 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.127.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.127.0.0.1 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.130.161.41.131 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.140.112.233.205 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.140.115.214.186 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.140.120.238.197 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.169.254.0.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.172.20.1.0 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.172.20.1.1 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.172.20.1.11 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.172.20.1.201 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.172.20.1.204 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.172.20.1.205 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.205.188.248.151 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.207.46.106.176 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.209.61.128.9 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.216.155.193.141 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.219.160.189.74 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.224.0.0.251 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.6.239.255.255.253 = INTEGER: 0 -.1.3.6.1.2.1.4.21.1.7.0.0.0.0 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.17.250.248.34 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.24.25.4.167 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.24.25.4.168 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.24.56.56.240 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.24.62.224.45 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.24.81.144.89 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.24.200.149.203 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.63.246.7.10 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.64.12.25.48 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.64.49.254.23 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.66.42.173.37 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.66.45.96.6 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.66.179.164.60 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.67.187.98.13 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.68.54.249.235 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.68.175.84.243 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.69.157.45.226 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.80.230.251.83 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.81.170.128.199 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.82.73.145.246 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.82.74.108.161 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.83.250.215.80 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.84.252.25.25 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.85.11.167.111 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.85.188.1.26 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.127.0.0.0 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.4.21.1.7.127.0.0.1 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.4.21.1.7.130.161.41.131 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.140.112.233.205 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.140.115.214.186 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.140.120.238.197 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.169.254.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.4.21.1.7.172.20.1.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.4.21.1.7.172.20.1.1 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.4.21.1.7.172.20.1.11 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.4.21.1.7.172.20.1.201 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.4.21.1.7.172.20.1.204 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.4.21.1.7.172.20.1.205 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.4.21.1.7.205.188.248.151 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.207.46.106.176 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.209.61.128.9 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.216.155.193.141 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.219.160.189.74 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.224.0.0.251 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.7.239.255.255.253 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.21.1.8.0.0.0.0 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.17.250.248.34 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.24.25.4.167 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.24.25.4.168 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.24.56.56.240 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.24.62.224.45 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.24.81.144.89 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.24.200.149.203 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.63.246.7.10 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.64.12.25.48 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.64.49.254.23 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.66.42.173.37 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.66.45.96.6 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.66.179.164.60 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.67.187.98.13 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.68.54.249.235 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.68.175.84.243 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.69.157.45.226 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.80.230.251.83 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.81.170.128.199 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.82.73.145.246 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.82.74.108.161 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.83.250.215.80 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.84.252.25.25 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.85.11.167.111 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.85.188.1.26 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.127.0.0.0 = INTEGER: 3 -.1.3.6.1.2.1.4.21.1.8.127.0.0.1 = INTEGER: 3 -.1.3.6.1.2.1.4.21.1.8.130.161.41.131 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.140.112.233.205 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.140.115.214.186 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.140.120.238.197 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.169.254.0.0 = INTEGER: 3 -.1.3.6.1.2.1.4.21.1.8.172.20.1.0 = INTEGER: 3 -.1.3.6.1.2.1.4.21.1.8.172.20.1.1 = INTEGER: 3 -.1.3.6.1.2.1.4.21.1.8.172.20.1.11 = INTEGER: 3 -.1.3.6.1.2.1.4.21.1.8.172.20.1.201 = INTEGER: 3 -.1.3.6.1.2.1.4.21.1.8.172.20.1.204 = INTEGER: 3 -.1.3.6.1.2.1.4.21.1.8.172.20.1.205 = INTEGER: 3 -.1.3.6.1.2.1.4.21.1.8.205.188.248.151 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.207.46.106.176 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.209.61.128.9 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.216.155.193.141 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.219.160.189.74 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.224.0.0.251 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.8.239.255.255.253 = INTEGER: 4 -.1.3.6.1.2.1.4.21.1.9.0.0.0.0 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.17.250.248.34 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.24.25.4.167 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.24.25.4.168 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.24.56.56.240 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.24.62.224.45 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.24.81.144.89 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.24.200.149.203 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.63.246.7.10 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.64.12.25.48 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.64.49.254.23 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.66.42.173.37 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.66.45.96.6 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.66.179.164.60 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.67.187.98.13 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.68.54.249.235 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.68.175.84.243 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.69.157.45.226 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.80.230.251.83 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.81.170.128.199 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.82.73.145.246 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.82.74.108.161 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.83.250.215.80 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.84.252.25.25 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.85.11.167.111 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.85.188.1.26 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.127.0.0.0 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.127.0.0.1 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.130.161.41.131 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.140.112.233.205 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.140.115.214.186 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.140.120.238.197 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.169.254.0.0 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.172.20.1.0 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.172.20.1.1 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.172.20.1.11 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.172.20.1.201 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.172.20.1.204 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.172.20.1.205 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.205.188.248.151 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.207.46.106.176 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.209.61.128.9 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.216.155.193.141 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.219.160.189.74 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.224.0.0.251 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.9.239.255.255.253 = INTEGER: 2 -.1.3.6.1.2.1.4.21.1.11.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.4.21.1.11.17.250.248.34 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.24.25.4.167 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.24.25.4.168 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.24.56.56.240 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.24.62.224.45 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.24.81.144.89 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.24.200.149.203 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.63.246.7.10 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.64.12.25.48 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.64.49.254.23 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.66.42.173.37 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.66.45.96.6 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.66.179.164.60 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.67.187.98.13 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.68.54.249.235 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.68.175.84.243 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.69.157.45.226 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.80.230.251.83 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.81.170.128.199 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.82.73.145.246 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.82.74.108.161 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.83.250.215.80 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.84.252.25.25 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.85.11.167.111 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.85.188.1.26 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.127.0.0.0 = IpAddress: 255.0.0.0 -.1.3.6.1.2.1.4.21.1.11.127.0.0.1 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.130.161.41.131 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.140.112.233.205 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.140.115.214.186 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.140.120.238.197 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.169.254.0.0 = IpAddress: 255.255.0.0 -.1.3.6.1.2.1.4.21.1.11.172.20.1.0 = IpAddress: 255.255.255.0 -.1.3.6.1.2.1.4.21.1.11.172.20.1.1 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.172.20.1.11 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.172.20.1.201 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.172.20.1.204 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.172.20.1.205 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.205.188.248.151 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.207.46.106.176 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.209.61.128.9 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.216.155.193.141 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.219.160.189.74 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.224.0.0.251 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.11.239.255.255.253 = IpAddress: 255.255.255.255 -.1.3.6.1.2.1.4.21.1.12.0.0.0.0 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.17.250.248.34 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.24.25.4.167 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.24.25.4.168 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.24.56.56.240 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.24.62.224.45 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.24.81.144.89 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.24.200.149.203 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.63.246.7.10 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.64.12.25.48 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.64.49.254.23 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.66.42.173.37 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.66.45.96.6 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.66.179.164.60 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.67.187.98.13 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.68.54.249.235 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.68.175.84.243 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.69.157.45.226 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.80.230.251.83 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.81.170.128.199 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.82.73.145.246 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.82.74.108.161 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.83.250.215.80 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.84.252.25.25 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.85.11.167.111 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.85.188.1.26 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.127.0.0.0 = INTEGER: 16384 -.1.3.6.1.2.1.4.21.1.12.127.0.0.1 = INTEGER: 16384 -.1.3.6.1.2.1.4.21.1.12.130.161.41.131 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.140.112.233.205 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.140.115.214.186 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.140.120.238.197 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.169.254.0.0 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.172.20.1.0 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.172.20.1.1 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.172.20.1.11 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.172.20.1.201 = INTEGER: 16384 -.1.3.6.1.2.1.4.21.1.12.172.20.1.204 = INTEGER: 16384 -.1.3.6.1.2.1.4.21.1.12.172.20.1.205 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.205.188.248.151 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.207.46.106.176 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.209.61.128.9 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.216.155.193.141 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.219.160.189.74 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.224.0.0.251 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.12.239.255.255.253 = INTEGER: 1500 -.1.3.6.1.2.1.4.21.1.13.0.0.0.0 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.17.250.248.34 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.24.25.4.167 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.24.25.4.168 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.24.56.56.240 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.24.62.224.45 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.24.81.144.89 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.24.200.149.203 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.63.246.7.10 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.64.12.25.48 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.64.49.254.23 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.66.42.173.37 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.66.45.96.6 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.66.179.164.60 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.67.187.98.13 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.68.54.249.235 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.68.175.84.243 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.69.157.45.226 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.80.230.251.83 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.81.170.128.199 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.82.73.145.246 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.82.74.108.161 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.83.250.215.80 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.84.252.25.25 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.85.11.167.111 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.85.188.1.26 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.127.0.0.0 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.127.0.0.1 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.130.161.41.131 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.140.112.233.205 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.140.115.214.186 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.140.120.238.197 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.169.254.0.0 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.172.20.1.0 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.172.20.1.1 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.172.20.1.11 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.172.20.1.201 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.172.20.1.204 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.172.20.1.205 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.205.188.248.151 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.207.46.106.176 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.209.61.128.9 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.216.155.193.141 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.219.160.189.74 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.224.0.0.251 = OID: .0.0 -.1.3.6.1.2.1.4.21.1.13.239.255.255.253 = OID: .0.0 -.1.3.6.1.2.1.4.22.1.1.4.172.20.1.1 = INTEGER: 4 -.1.3.6.1.2.1.4.22.1.1.4.172.20.1.11 = INTEGER: 4 -.1.3.6.1.2.1.4.22.1.1.4.172.20.1.205 = INTEGER: 4 -.1.3.6.1.2.1.4.22.1.2.4.172.20.1.1 = STRING: 0:f:66:20:2:fd -.1.3.6.1.2.1.4.22.1.2.4.172.20.1.11 = STRING: 0:30:48:11:41:9f -.1.3.6.1.2.1.4.22.1.2.4.172.20.1.205 = STRING: 0:a:95:ac:87:2 -.1.3.6.1.2.1.4.22.1.3.4.172.20.1.1 = IpAddress: 172.20.1.1 -.1.3.6.1.2.1.4.22.1.3.4.172.20.1.11 = IpAddress: 172.20.1.11 -.1.3.6.1.2.1.4.22.1.3.4.172.20.1.205 = IpAddress: 172.20.1.205 -.1.3.6.1.2.1.4.22.1.4.4.172.20.1.1 = INTEGER: 1 -.1.3.6.1.2.1.4.22.1.4.4.172.20.1.11 = INTEGER: 1 -.1.3.6.1.2.1.4.22.1.4.4.172.20.1.205 = INTEGER: 1 -.1.3.6.1.2.1.4.23.0 = Counter32: 0 -.1.3.6.1.2.1.5.1.0 = Counter32: 127 -.1.3.6.1.2.1.5.2.0 = Counter32: 0 -.1.3.6.1.2.1.5.3.0 = Counter32: 37 -.1.3.6.1.2.1.5.4.0 = Counter32: 0 -.1.3.6.1.2.1.5.5.0 = Counter32: 0 -.1.3.6.1.2.1.5.6.0 = Counter32: 0 -.1.3.6.1.2.1.5.7.0 = Counter32: 0 -.1.3.6.1.2.1.5.8.0 = Counter32: 90 -.1.3.6.1.2.1.5.9.0 = Counter32: 0 -.1.3.6.1.2.1.5.10.0 = Counter32: 0 -.1.3.6.1.2.1.5.11.0 = Counter32: 0 -.1.3.6.1.2.1.5.12.0 = Counter32: 0 -.1.3.6.1.2.1.5.13.0 = Counter32: 0 -.1.3.6.1.2.1.5.14.0 = Counter32: 174 -.1.3.6.1.2.1.5.15.0 = Counter32: 0 -.1.3.6.1.2.1.5.16.0 = Counter32: 84 -.1.3.6.1.2.1.5.17.0 = Counter32: 0 -.1.3.6.1.2.1.5.18.0 = Counter32: 0 -.1.3.6.1.2.1.5.19.0 = Counter32: 0 -.1.3.6.1.2.1.5.20.0 = Counter32: 0 -.1.3.6.1.2.1.5.21.0 = Counter32: 0 -.1.3.6.1.2.1.5.22.0 = Counter32: 90 -.1.3.6.1.2.1.5.23.0 = Counter32: 0 -.1.3.6.1.2.1.5.24.0 = Counter32: 0 -.1.3.6.1.2.1.5.25.0 = Counter32: 0 -.1.3.6.1.2.1.5.26.0 = Counter32: 0 -.1.3.6.1.2.1.6.1.0 = INTEGER: 4 -.1.3.6.1.2.1.6.2.0 = INTEGER: 1000 -.1.3.6.1.2.1.6.3.0 = INTEGER: 64000 -.1.3.6.1.2.1.6.5.0 = Counter32: 6182 -.1.3.6.1.2.1.6.6.0 = Counter32: 5607 -.1.3.6.1.2.1.6.7.0 = Counter32: 459 -.1.3.6.1.2.1.6.8.0 = Counter32: 17 -.1.3.6.1.2.1.6.9.0 = Gauge32: 0 -.1.3.6.1.2.1.6.10.0 = Counter32: 64605 -.1.3.6.1.2.1.6.11.0 = Counter32: 63155 -.1.3.6.1.2.1.6.12.0 = Counter32: 6 -.1.3.6.1.2.1.6.13.1.1.0.0.0.0.0.0.0.0.0.0 = INTEGER: 1 -.1.3.6.1.2.1.6.13.1.1.0.0.0.0.22.0.0.0.0.0 = INTEGER: 2 -.1.3.6.1.2.1.6.13.1.1.0.0.0.0.427.0.0.0.0.0 = INTEGER: 2 -.1.3.6.1.2.1.6.13.1.1.0.0.0.0.548.0.0.0.0.0 = INTEGER: 2 -.1.3.6.1.2.1.6.13.1.1.0.0.0.0.5298.0.0.0.0.0 = INTEGER: 2 -.1.3.6.1.2.1.6.13.1.1.0.0.0.0.54045.0.0.0.0.0 = INTEGER: 2 -.1.3.6.1.2.1.6.13.1.1.127.0.0.1.631.0.0.0.0.0 = INTEGER: 2 -.1.3.6.1.2.1.6.13.1.1.127.0.0.1.968.127.0.0.1.1033 = INTEGER: 5 -.1.3.6.1.2.1.6.13.1.1.127.0.0.1.1033.0.0.0.0.0 = INTEGER: 2 -.1.3.6.1.2.1.6.13.1.1.127.0.0.1.1033.127.0.0.1.968 = INTEGER: 5 -.1.3.6.1.2.1.6.13.1.1.127.0.0.1.49356.127.0.0.1.631 = INTEGER: 8 -.1.3.6.1.2.1.6.13.1.1.127.0.0.1.49357.127.0.0.1.631 = INTEGER: 8 -.1.3.6.1.2.1.6.13.1.1.172.20.1.201.49238.68.175.84.243.12211 = INTEGER: 5 -.1.3.6.1.2.1.6.13.1.1.172.20.1.201.49242.85.188.1.26.6667 = INTEGER: 5 -.1.3.6.1.2.1.6.13.1.1.172.20.1.204.49292.209.61.128.9.5222 = INTEGER: 5 -.1.3.6.1.2.1.6.13.1.1.172.20.1.204.49293.216.155.193.141.5050 = INTEGER: 5 -.1.3.6.1.2.1.6.13.1.1.172.20.1.204.49294.64.12.25.48.5190 = INTEGER: 5 -.1.3.6.1.2.1.6.13.1.1.172.20.1.204.49300.207.46.106.176.1863 = INTEGER: 5 -.1.3.6.1.2.1.6.13.1.1.172.20.1.204.49301.205.188.248.151.5190 = INTEGER: 5 -.1.3.6.1.2.1.6.13.1.1.172.20.1.204.49391.64.49.254.23.993 = INTEGER: 5 -.1.3.6.1.2.1.6.13.1.1.172.20.1.204.51764.64.49.254.23.993 = INTEGER: 5 -.1.3.6.1.2.1.6.13.1.1.172.20.1.204.51767.66.45.96.6.143 = INTEGER: 5 -.1.3.6.1.2.1.6.13.1.2.0.0.0.0.0.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.6.13.1.2.0.0.0.0.22.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.6.13.1.2.0.0.0.0.427.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.6.13.1.2.0.0.0.0.548.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.6.13.1.2.0.0.0.0.5298.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.6.13.1.2.0.0.0.0.54045.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.6.13.1.2.127.0.0.1.631.0.0.0.0.0 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.6.13.1.2.127.0.0.1.968.127.0.0.1.1033 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.6.13.1.2.127.0.0.1.1033.0.0.0.0.0 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.6.13.1.2.127.0.0.1.1033.127.0.0.1.968 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.6.13.1.2.127.0.0.1.49356.127.0.0.1.631 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.6.13.1.2.127.0.0.1.49357.127.0.0.1.631 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.6.13.1.2.172.20.1.201.49238.68.175.84.243.12211 = IpAddress: 172.20.1.201 -.1.3.6.1.2.1.6.13.1.2.172.20.1.201.49242.85.188.1.26.6667 = IpAddress: 172.20.1.201 -.1.3.6.1.2.1.6.13.1.2.172.20.1.204.49292.209.61.128.9.5222 = IpAddress: 172.20.1.204 -.1.3.6.1.2.1.6.13.1.2.172.20.1.204.49293.216.155.193.141.5050 = IpAddress: 172.20.1.204 -.1.3.6.1.2.1.6.13.1.2.172.20.1.204.49294.64.12.25.48.5190 = IpAddress: 172.20.1.204 -.1.3.6.1.2.1.6.13.1.2.172.20.1.204.49300.207.46.106.176.1863 = IpAddress: 172.20.1.204 -.1.3.6.1.2.1.6.13.1.2.172.20.1.204.49301.205.188.248.151.5190 = IpAddress: 172.20.1.204 -.1.3.6.1.2.1.6.13.1.2.172.20.1.204.49391.64.49.254.23.993 = IpAddress: 172.20.1.204 -.1.3.6.1.2.1.6.13.1.2.172.20.1.204.51764.64.49.254.23.993 = IpAddress: 172.20.1.204 -.1.3.6.1.2.1.6.13.1.2.172.20.1.204.51767.66.45.96.6.143 = IpAddress: 172.20.1.204 -.1.3.6.1.2.1.6.13.1.3.0.0.0.0.0.0.0.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.6.13.1.3.0.0.0.0.22.0.0.0.0.0 = INTEGER: 22 -.1.3.6.1.2.1.6.13.1.3.0.0.0.0.427.0.0.0.0.0 = INTEGER: 427 -.1.3.6.1.2.1.6.13.1.3.0.0.0.0.548.0.0.0.0.0 = INTEGER: 548 -.1.3.6.1.2.1.6.13.1.3.0.0.0.0.5298.0.0.0.0.0 = INTEGER: 5298 -.1.3.6.1.2.1.6.13.1.3.0.0.0.0.54045.0.0.0.0.0 = INTEGER: 54045 -.1.3.6.1.2.1.6.13.1.3.127.0.0.1.631.0.0.0.0.0 = INTEGER: 631 -.1.3.6.1.2.1.6.13.1.3.127.0.0.1.968.127.0.0.1.1033 = INTEGER: 968 -.1.3.6.1.2.1.6.13.1.3.127.0.0.1.1033.0.0.0.0.0 = INTEGER: 1033 -.1.3.6.1.2.1.6.13.1.3.127.0.0.1.1033.127.0.0.1.968 = INTEGER: 1033 -.1.3.6.1.2.1.6.13.1.3.127.0.0.1.49356.127.0.0.1.631 = INTEGER: 49356 -.1.3.6.1.2.1.6.13.1.3.127.0.0.1.49357.127.0.0.1.631 = INTEGER: 49357 -.1.3.6.1.2.1.6.13.1.3.172.20.1.201.49238.68.175.84.243.12211 = INTEGER: 49238 -.1.3.6.1.2.1.6.13.1.3.172.20.1.201.49242.85.188.1.26.6667 = INTEGER: 49242 -.1.3.6.1.2.1.6.13.1.3.172.20.1.204.49292.209.61.128.9.5222 = INTEGER: 49292 -.1.3.6.1.2.1.6.13.1.3.172.20.1.204.49293.216.155.193.141.5050 = INTEGER: 49293 -.1.3.6.1.2.1.6.13.1.3.172.20.1.204.49294.64.12.25.48.5190 = INTEGER: 49294 -.1.3.6.1.2.1.6.13.1.3.172.20.1.204.49300.207.46.106.176.1863 = INTEGER: 49300 -.1.3.6.1.2.1.6.13.1.3.172.20.1.204.49301.205.188.248.151.5190 = INTEGER: 49301 -.1.3.6.1.2.1.6.13.1.3.172.20.1.204.49391.64.49.254.23.993 = INTEGER: 49391 -.1.3.6.1.2.1.6.13.1.3.172.20.1.204.51764.64.49.254.23.993 = INTEGER: 51764 -.1.3.6.1.2.1.6.13.1.3.172.20.1.204.51767.66.45.96.6.143 = INTEGER: 51767 -.1.3.6.1.2.1.6.13.1.4.0.0.0.0.0.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.6.13.1.4.0.0.0.0.22.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.6.13.1.4.0.0.0.0.427.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.6.13.1.4.0.0.0.0.548.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.6.13.1.4.0.0.0.0.5298.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.6.13.1.4.0.0.0.0.54045.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.6.13.1.4.127.0.0.1.631.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.6.13.1.4.127.0.0.1.968.127.0.0.1.1033 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.6.13.1.4.127.0.0.1.1033.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.6.13.1.4.127.0.0.1.1033.127.0.0.1.968 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.6.13.1.4.127.0.0.1.49356.127.0.0.1.631 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.6.13.1.4.127.0.0.1.49357.127.0.0.1.631 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.6.13.1.4.172.20.1.201.49238.68.175.84.243.12211 = IpAddress: 68.175.84.243 -.1.3.6.1.2.1.6.13.1.4.172.20.1.201.49242.85.188.1.26.6667 = IpAddress: 85.188.1.26 -.1.3.6.1.2.1.6.13.1.4.172.20.1.204.49292.209.61.128.9.5222 = IpAddress: 209.61.128.9 -.1.3.6.1.2.1.6.13.1.4.172.20.1.204.49293.216.155.193.141.5050 = IpAddress: 216.155.193.141 -.1.3.6.1.2.1.6.13.1.4.172.20.1.204.49294.64.12.25.48.5190 = IpAddress: 64.12.25.48 -.1.3.6.1.2.1.6.13.1.4.172.20.1.204.49300.207.46.106.176.1863 = IpAddress: 207.46.106.176 -.1.3.6.1.2.1.6.13.1.4.172.20.1.204.49301.205.188.248.151.5190 = IpAddress: 205.188.248.151 -.1.3.6.1.2.1.6.13.1.4.172.20.1.204.49391.64.49.254.23.993 = IpAddress: 64.49.254.23 -.1.3.6.1.2.1.6.13.1.4.172.20.1.204.51764.64.49.254.23.993 = IpAddress: 64.49.254.23 -.1.3.6.1.2.1.6.13.1.4.172.20.1.204.51767.66.45.96.6.143 = IpAddress: 66.45.96.6 -.1.3.6.1.2.1.6.13.1.5.0.0.0.0.0.0.0.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.6.13.1.5.0.0.0.0.22.0.0.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.6.13.1.5.0.0.0.0.427.0.0.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.6.13.1.5.0.0.0.0.548.0.0.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.6.13.1.5.0.0.0.0.5298.0.0.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.6.13.1.5.0.0.0.0.54045.0.0.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.6.13.1.5.127.0.0.1.631.0.0.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.6.13.1.5.127.0.0.1.968.127.0.0.1.1033 = INTEGER: 1033 -.1.3.6.1.2.1.6.13.1.5.127.0.0.1.1033.0.0.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.6.13.1.5.127.0.0.1.1033.127.0.0.1.968 = INTEGER: 968 -.1.3.6.1.2.1.6.13.1.5.127.0.0.1.49356.127.0.0.1.631 = INTEGER: 631 -.1.3.6.1.2.1.6.13.1.5.127.0.0.1.49357.127.0.0.1.631 = INTEGER: 631 -.1.3.6.1.2.1.6.13.1.5.172.20.1.201.49238.68.175.84.243.12211 = INTEGER: 12211 -.1.3.6.1.2.1.6.13.1.5.172.20.1.201.49242.85.188.1.26.6667 = INTEGER: 6667 -.1.3.6.1.2.1.6.13.1.5.172.20.1.204.49292.209.61.128.9.5222 = INTEGER: 5222 -.1.3.6.1.2.1.6.13.1.5.172.20.1.204.49293.216.155.193.141.5050 = INTEGER: 5050 -.1.3.6.1.2.1.6.13.1.5.172.20.1.204.49294.64.12.25.48.5190 = INTEGER: 5190 -.1.3.6.1.2.1.6.13.1.5.172.20.1.204.49300.207.46.106.176.1863 = INTEGER: 1863 -.1.3.6.1.2.1.6.13.1.5.172.20.1.204.49301.205.188.248.151.5190 = INTEGER: 5190 -.1.3.6.1.2.1.6.13.1.5.172.20.1.204.49391.64.49.254.23.993 = INTEGER: 993 -.1.3.6.1.2.1.6.13.1.5.172.20.1.204.51764.64.49.254.23.993 = INTEGER: 993 -.1.3.6.1.2.1.6.13.1.5.172.20.1.204.51767.66.45.96.6.143 = INTEGER: 143 -.1.3.6.1.2.1.6.14.0 = Counter32: 0 -.1.3.6.1.2.1.6.15.0 = Counter32: 5273 -.1.3.6.1.2.1.7.2.0 = Counter32: 88 -.1.3.6.1.2.1.7.3.0 = Counter32: 0 -.1.3.6.1.2.1.7.5.1.1.0.0.0.0.0 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.7.5.1.1.0.0.0.0.68 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.7.5.1.1.0.0.0.0.123 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.7.5.1.1.0.0.0.0.161 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.7.5.1.1.0.0.0.0.427 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.7.5.1.1.0.0.0.0.514 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.7.5.1.1.0.0.0.0.631 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.7.5.1.1.0.0.0.0.5353 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.7.5.1.1.0.0.0.0.50803 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.7.5.1.1.0.0.0.0.54045 = IpAddress: 0.0.0.0 -.1.3.6.1.2.1.7.5.1.1.127.0.0.1.123 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.7.5.1.1.127.0.0.1.1022 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.7.5.1.1.127.0.0.1.1023 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.7.5.1.1.127.0.0.1.1033 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.7.5.1.1.127.0.0.1.49160 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.7.5.1.1.127.0.0.1.49161 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.7.5.1.1.127.0.0.1.49162 = IpAddress: 127.0.0.1 -.1.3.6.1.2.1.7.5.1.1.172.20.1.201.123 = IpAddress: 172.20.1.201 -.1.3.6.1.2.1.7.5.1.2.0.0.0.0.0 = INTEGER: 0 -.1.3.6.1.2.1.7.5.1.2.0.0.0.0.68 = INTEGER: 68 -.1.3.6.1.2.1.7.5.1.2.0.0.0.0.123 = INTEGER: 123 -.1.3.6.1.2.1.7.5.1.2.0.0.0.0.161 = INTEGER: 161 -.1.3.6.1.2.1.7.5.1.2.0.0.0.0.427 = INTEGER: 427 -.1.3.6.1.2.1.7.5.1.2.0.0.0.0.514 = INTEGER: 514 -.1.3.6.1.2.1.7.5.1.2.0.0.0.0.631 = INTEGER: 631 -.1.3.6.1.2.1.7.5.1.2.0.0.0.0.5353 = INTEGER: 5353 -.1.3.6.1.2.1.7.5.1.2.0.0.0.0.50803 = INTEGER: 50803 -.1.3.6.1.2.1.7.5.1.2.0.0.0.0.54045 = INTEGER: 54045 -.1.3.6.1.2.1.7.5.1.2.127.0.0.1.123 = INTEGER: 123 -.1.3.6.1.2.1.7.5.1.2.127.0.0.1.1022 = INTEGER: 1022 -.1.3.6.1.2.1.7.5.1.2.127.0.0.1.1023 = INTEGER: 1023 -.1.3.6.1.2.1.7.5.1.2.127.0.0.1.1033 = INTEGER: 1033 -.1.3.6.1.2.1.7.5.1.2.127.0.0.1.49160 = INTEGER: 49160 -.1.3.6.1.2.1.7.5.1.2.127.0.0.1.49161 = INTEGER: 49161 -.1.3.6.1.2.1.7.5.1.2.127.0.0.1.49162 = INTEGER: 49162 -.1.3.6.1.2.1.7.5.1.2.172.20.1.201.123 = INTEGER: 123 -.1.3.6.1.2.1.11.1.0 = Counter32: 13068 -.1.3.6.1.2.1.11.2.0 = Counter32: 13068 -.1.3.6.1.2.1.11.3.0 = Counter32: 0 -.1.3.6.1.2.1.11.4.0 = Counter32: 0 -.1.3.6.1.2.1.11.5.0 = Counter32: 0 -.1.3.6.1.2.1.11.6.0 = Counter32: 0 -.1.3.6.1.2.1.11.8.0 = Counter32: 0 -.1.3.6.1.2.1.11.9.0 = Counter32: 0 -.1.3.6.1.2.1.11.10.0 = Counter32: 0 -.1.3.6.1.2.1.11.11.0 = Counter32: 0 -.1.3.6.1.2.1.11.12.0 = Counter32: 0 -.1.3.6.1.2.1.11.13.0 = Counter32: 13078 -.1.3.6.1.2.1.11.14.0 = Counter32: 0 -.1.3.6.1.2.1.11.15.0 = Counter32: 0 -.1.3.6.1.2.1.11.16.0 = Counter32: 13082 -.1.3.6.1.2.1.11.17.0 = Counter32: 0 -.1.3.6.1.2.1.11.18.0 = Counter32: 0 -.1.3.6.1.2.1.11.19.0 = Counter32: 0 -.1.3.6.1.2.1.11.20.0 = Counter32: 0 -.1.3.6.1.2.1.11.21.0 = Counter32: 0 -.1.3.6.1.2.1.11.22.0 = Counter32: 0 -.1.3.6.1.2.1.11.24.0 = Counter32: 0 -.1.3.6.1.2.1.11.25.0 = Counter32: 0 -.1.3.6.1.2.1.11.26.0 = Counter32: 0 -.1.3.6.1.2.1.11.27.0 = Counter32: 0 -.1.3.6.1.2.1.11.28.0 = Counter32: 13092 -.1.3.6.1.2.1.11.29.0 = Counter32: 0 -.1.3.6.1.2.1.11.30.0 = INTEGER: 2 -.1.3.6.1.2.1.11.31.0 = Counter32: 0 -.1.3.6.1.2.1.11.32.0 = Counter32: 0 -.1.3.6.1.2.1.25.1.1.0 = Timeticks: (2156191) 5:59:21.91 -.1.3.6.1.2.1.25.1.2.0 = STRING: 2005-5-27,15:14:19.0,+4:0 -.1.3.6.1.2.1.25.1.3.0 = INTEGER: 1536 -.1.3.6.1.2.1.25.1.5.0 = Gauge32: 3 -.1.3.6.1.2.1.25.1.6.0 = Gauge32: 66 -.1.3.6.1.2.1.25.1.7.0 = INTEGER: 532 -.1.3.6.1.2.1.25.2.2.0 = INTEGER: 1048576 -.1.3.6.1.2.1.25.2.3.1.1.1 = INTEGER: 1 -.1.3.6.1.2.1.25.2.3.1.1.2 = INTEGER: 2 -.1.3.6.1.2.1.25.2.3.1.1.3 = INTEGER: 3 -.1.3.6.1.2.1.25.2.3.1.1.4 = INTEGER: 4 -.1.3.6.1.2.1.25.2.3.1.1.5 = INTEGER: 5 -.1.3.6.1.2.1.25.2.3.1.1.6 = INTEGER: 6 -.1.3.6.1.2.1.25.2.3.1.1.7 = INTEGER: 7 -.1.3.6.1.2.1.25.2.3.1.1.8 = INTEGER: 8 -.1.3.6.1.2.1.25.2.3.1.1.101 = INTEGER: 101 -.1.3.6.1.2.1.25.2.3.1.1.102 = INTEGER: 102 -.1.3.6.1.2.1.25.2.3.1.1.103 = INTEGER: 103 -.1.3.6.1.2.1.25.2.3.1.2.1 = OID: .1.3.6.1.2.1.25.2.1.4 -.1.3.6.1.2.1.25.2.3.1.2.2 = OID: .1.3.6.1.2.1.25.2.1.4 -.1.3.6.1.2.1.25.2.3.1.2.3 = OID: .1.3.6.1.2.1.25.2.1.4 -.1.3.6.1.2.1.25.2.3.1.2.4 = OID: .1.3.6.1.2.1.25.2.1.4 -.1.3.6.1.2.1.25.2.3.1.2.5 = OID: .1.3.6.1.2.1.25.2.1.4 -.1.3.6.1.2.1.25.2.3.1.2.6 = OID: .1.3.6.1.2.1.25.2.1.4 -.1.3.6.1.2.1.25.2.3.1.2.7 = OID: .1.3.6.1.2.1.25.2.1.4 -.1.3.6.1.2.1.25.2.3.1.2.8 = OID: .1.3.6.1.2.1.25.2.1.4 -.1.3.6.1.2.1.25.2.3.1.2.101 = OID: .1.3.6.1.2.1.25.2.1.2 -.1.3.6.1.2.1.25.2.3.1.2.102 = OID: .1.3.6.1.2.1.25.2.1.3 -.1.3.6.1.2.1.25.2.3.1.2.103 = OID: .1.3.6.1.2.1.25.2.1.1 -.1.3.6.1.2.1.25.2.3.1.3.1 = STRING: / -.1.3.6.1.2.1.25.2.3.1.3.2 = STRING: /dev -.1.3.6.1.2.1.25.2.3.1.3.3 = STRING: /dev -.1.3.6.1.2.1.25.2.3.1.3.4 = STRING: /.vol -.1.3.6.1.2.1.25.2.3.1.3.5 = STRING: /Network -.1.3.6.1.2.1.25.2.3.1.3.6 = STRING: /automount/Servers -.1.3.6.1.2.1.25.2.3.1.3.7 = STRING: /automount/static -.1.3.6.1.2.1.25.2.3.1.3.8 = STRING: /Volumes/iDisk -.1.3.6.1.2.1.25.2.3.1.3.101 = STRING: Real Memory -.1.3.6.1.2.1.25.2.3.1.3.102 = STRING: Swap Space -.1.3.6.1.2.1.25.2.3.1.3.103 = STRING: Memory Buffers -.1.3.6.1.2.1.25.2.3.1.4.1 = INTEGER: 4096 -.1.3.6.1.2.1.25.2.3.1.4.2 = INTEGER: 512 -.1.3.6.1.2.1.25.2.3.1.4.3 = INTEGER: 512 -.1.3.6.1.2.1.25.2.3.1.4.4 = INTEGER: 512 -.1.3.6.1.2.1.25.2.3.1.4.5 = INTEGER: 512 -.1.3.6.1.2.1.25.2.3.1.4.6 = INTEGER: 512 -.1.3.6.1.2.1.25.2.3.1.4.7 = INTEGER: 512 -.1.3.6.1.2.1.25.2.3.1.4.8 = INTEGER: 4096 -.1.3.6.1.2.1.25.2.3.1.4.101 = INTEGER: 4096 -.1.3.6.1.2.1.25.2.3.1.4.102 = INTEGER: 4096 -.1.3.6.1.2.1.25.2.3.1.4.103 = INTEGER: 256 -.1.3.6.1.2.1.25.2.3.1.5.1 = INTEGER: 14618502 -.1.3.6.1.2.1.25.2.3.1.5.2 = INTEGER: 2 -.1.3.6.1.2.1.25.2.3.1.5.3 = INTEGER: 2 -.1.3.6.1.2.1.25.2.3.1.5.4 = INTEGER: 1024 -.1.3.6.1.2.1.25.2.3.1.5.5 = INTEGER: 0 -.1.3.6.1.2.1.25.2.3.1.5.6 = INTEGER: 0 -.1.3.6.1.2.1.25.2.3.1.5.7 = INTEGER: 0 -.1.3.6.1.2.1.25.2.3.1.5.8 = INTEGER: 6454 -.1.3.6.1.2.1.25.2.3.1.5.101 = INTEGER: 9 -.1.3.6.1.2.1.25.2.3.1.5.102 = INTEGER: 0 -.1.3.6.1.2.1.25.2.3.1.6.1 = INTEGER: 10585579 -.1.3.6.1.2.1.25.2.3.1.6.2 = INTEGER: 2 -.1.3.6.1.2.1.25.2.3.1.6.3 = INTEGER: 2 -.1.3.6.1.2.1.25.2.3.1.6.4 = INTEGER: 1024 -.1.3.6.1.2.1.25.2.3.1.6.5 = INTEGER: 0 -.1.3.6.1.2.1.25.2.3.1.6.6 = INTEGER: 0 -.1.3.6.1.2.1.25.2.3.1.6.7 = INTEGER: 0 -.1.3.6.1.2.1.25.2.3.1.6.8 = INTEGER: 128 -.1.3.6.1.2.1.25.2.3.1.6.101 = INTEGER: 303104 -.1.3.6.1.2.1.25.2.3.1.6.102 = INTEGER: -1610571136 -.1.3.6.1.2.1.25.2.3.1.6.103 = INTEGER: 121 -.1.3.6.1.2.1.25.2.3.1.7.1 = Counter32: 0 -.1.3.6.1.2.1.25.2.3.1.7.2 = Counter32: 0 -.1.3.6.1.2.1.25.2.3.1.7.3 = Counter32: 0 -.1.3.6.1.2.1.25.2.3.1.7.4 = Counter32: 0 -.1.3.6.1.2.1.25.2.3.1.7.5 = Counter32: 0 -.1.3.6.1.2.1.25.2.3.1.7.6 = Counter32: 0 -.1.3.6.1.2.1.25.2.3.1.7.7 = Counter32: 0 -.1.3.6.1.2.1.25.2.3.1.7.8 = Counter32: 0 -.1.3.6.1.2.1.25.3.2.1.1.769 = INTEGER: 769 -.1.3.6.1.2.1.25.3.2.1.1.1280 = INTEGER: 1280 -.1.3.6.1.2.1.25.3.2.1.1.1281 = INTEGER: 1281 -.1.3.6.1.2.1.25.3.2.1.1.3072 = INTEGER: 3072 -.1.3.6.1.2.1.25.3.2.1.2.769 = OID: .1.3.6.1.2.1.25.3.1.3 -.1.3.6.1.2.1.25.3.2.1.2.1280 = OID: .1.3.6.1.2.1.25.3.1.5 -.1.3.6.1.2.1.25.3.2.1.2.1281 = OID: .1.3.6.1.2.1.25.3.1.5 -.1.3.6.1.2.1.25.3.2.1.2.3072 = OID: .1.3.6.1.2.1.25.3.1.12 -.1.3.6.1.2.1.25.3.2.1.3.769 = STRING: An electronic chip that makes the computer work. -.1.3.6.1.2.1.25.3.2.1.3.1280 = STRING: cartman-deskjet -.1.3.6.1.2.1.25.3.2.1.3.1281 = STRING: OpenNMS_DeskJet_970C -.1.3.6.1.2.1.25.3.2.1.3.3072 = STRING: Guessing that there's a floating point co-processor -.1.3.6.1.2.1.25.3.2.1.4.769 = OID: .0.0 -.1.3.6.1.2.1.25.3.2.1.4.1280 = OID: .0.0 -.1.3.6.1.2.1.25.3.2.1.4.1281 = OID: .0.0 -.1.3.6.1.2.1.25.3.2.1.4.3072 = OID: .0.0 -.1.3.6.1.2.1.25.3.3.1.1.769 = OID: .0.0 -.1.3.6.1.2.1.25.3.5.1.1.1280 = INTEGER: 2 -.1.3.6.1.2.1.25.3.5.1.1.1281 = INTEGER: 2 -.1.3.6.1.2.1.25.3.8.1.1.1 = INTEGER: 1 -.1.3.6.1.2.1.25.3.8.1.1.2 = INTEGER: 2 -.1.3.6.1.2.1.25.3.8.1.1.3 = INTEGER: 3 -.1.3.6.1.2.1.25.3.8.1.1.4 = INTEGER: 4 -.1.3.6.1.2.1.25.3.8.1.1.5 = INTEGER: 5 -.1.3.6.1.2.1.25.3.8.1.1.6 = INTEGER: 6 -.1.3.6.1.2.1.25.3.8.1.1.7 = INTEGER: 7 -.1.3.6.1.2.1.25.3.8.1.1.8 = INTEGER: 8 -.1.3.6.1.2.1.25.3.8.1.2.1 = STRING: "/" -.1.3.6.1.2.1.25.3.8.1.2.2 = STRING: "/dev" -.1.3.6.1.2.1.25.3.8.1.2.3 = STRING: "/dev" -.1.3.6.1.2.1.25.3.8.1.2.4 = STRING: "/.vol" -.1.3.6.1.2.1.25.3.8.1.2.5 = STRING: "/Network" -.1.3.6.1.2.1.25.3.8.1.2.6 = STRING: "/automount/Servers" -.1.3.6.1.2.1.25.3.8.1.2.7 = STRING: "/automount/static" -.1.3.6.1.2.1.25.3.8.1.2.8 = STRING: "/Volumes/iDisk" -.1.3.6.1.2.1.25.3.8.1.3.1 = "" -.1.3.6.1.2.1.25.3.8.1.3.2 = "" -.1.3.6.1.2.1.25.3.8.1.3.3 = "" -.1.3.6.1.2.1.25.3.8.1.3.4 = "" -.1.3.6.1.2.1.25.3.8.1.3.5 = STRING: "automount -nsl [333]" -.1.3.6.1.2.1.25.3.8.1.3.6 = STRING: "automount -fstab [336]" -.1.3.6.1.2.1.25.3.8.1.3.7 = STRING: "automount -static [336]" -.1.3.6.1.2.1.25.3.8.1.3.8 = "" -.1.3.6.1.2.1.25.3.8.1.4.1 = OID: .1.3.6.1.2.1.25.3.9.1 -.1.3.6.1.2.1.25.3.8.1.4.2 = OID: .1.3.6.1.2.1.25.3.9.1 -.1.3.6.1.2.1.25.3.8.1.4.3 = OID: .1.3.6.1.2.1.25.3.9.1 -.1.3.6.1.2.1.25.3.8.1.4.4 = OID: .1.3.6.1.2.1.25.3.9.1 -.1.3.6.1.2.1.25.3.8.1.4.5 = OID: .1.3.6.1.2.1.25.3.9.14 -.1.3.6.1.2.1.25.3.8.1.4.6 = OID: .1.3.6.1.2.1.25.3.9.14 -.1.3.6.1.2.1.25.3.8.1.4.7 = OID: .1.3.6.1.2.1.25.3.9.14 -.1.3.6.1.2.1.25.3.8.1.4.8 = OID: .1.3.6.1.2.1.25.3.9.1 -.1.3.6.1.2.1.25.3.8.1.5.1 = INTEGER: 1 -.1.3.6.1.2.1.25.3.8.1.5.2 = INTEGER: 1 -.1.3.6.1.2.1.25.3.8.1.5.3 = INTEGER: 1 -.1.3.6.1.2.1.25.3.8.1.5.4 = INTEGER: 1 -.1.3.6.1.2.1.25.3.8.1.5.5 = INTEGER: 1 -.1.3.6.1.2.1.25.3.8.1.5.6 = INTEGER: 1 -.1.3.6.1.2.1.25.3.8.1.5.7 = INTEGER: 1 -.1.3.6.1.2.1.25.3.8.1.5.8 = INTEGER: 1 -.1.3.6.1.2.1.25.3.8.1.6.1 = INTEGER: 1 -.1.3.6.1.2.1.25.3.8.1.6.2 = INTEGER: 2 -.1.3.6.1.2.1.25.3.8.1.6.3 = INTEGER: 2 -.1.3.6.1.2.1.25.3.8.1.6.4 = INTEGER: 2 -.1.3.6.1.2.1.25.3.8.1.6.5 = INTEGER: 2 -.1.3.6.1.2.1.25.3.8.1.6.6 = INTEGER: 2 -.1.3.6.1.2.1.25.3.8.1.6.7 = INTEGER: 2 -.1.3.6.1.2.1.25.3.8.1.6.8 = INTEGER: 2 -.1.3.6.1.2.1.25.3.8.1.7.1 = INTEGER: 1 -.1.3.6.1.2.1.25.3.8.1.7.2 = INTEGER: 2 -.1.3.6.1.2.1.25.3.8.1.7.3 = INTEGER: 3 -.1.3.6.1.2.1.25.3.8.1.7.4 = INTEGER: 4 -.1.3.6.1.2.1.25.3.8.1.7.5 = INTEGER: 5 -.1.3.6.1.2.1.25.3.8.1.7.6 = INTEGER: 6 -.1.3.6.1.2.1.25.3.8.1.7.7 = INTEGER: 7 -.1.3.6.1.2.1.25.3.8.1.7.8 = INTEGER: 8 -.1.3.6.1.2.1.25.3.8.1.8.1 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.8.2 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.8.3 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.8.4 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.8.5 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.8.6 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.8.7 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.8.8 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.9.1 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.9.2 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.9.3 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.9.4 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.9.5 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.9.6 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.9.7 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.3.8.1.9.8 = STRING: 0-1-1,0:0:0.0 -.1.3.6.1.2.1.25.4.2.1.1.0 = INTEGER: 0 -.1.3.6.1.2.1.25.4.2.1.1.1 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.1.2 = INTEGER: 2 -.1.3.6.1.2.1.25.4.2.1.1.78 = INTEGER: 78 -.1.3.6.1.2.1.25.4.2.1.1.84 = INTEGER: 84 -.1.3.6.1.2.1.25.4.2.1.1.86 = INTEGER: 86 -.1.3.6.1.2.1.25.4.2.1.1.87 = INTEGER: 87 -.1.3.6.1.2.1.25.4.2.1.1.92 = INTEGER: 92 -.1.3.6.1.2.1.25.4.2.1.1.97 = INTEGER: 97 -.1.3.6.1.2.1.25.4.2.1.1.119 = INTEGER: 119 -.1.3.6.1.2.1.25.4.2.1.1.120 = INTEGER: 120 -.1.3.6.1.2.1.25.4.2.1.1.122 = INTEGER: 122 -.1.3.6.1.2.1.25.4.2.1.1.124 = INTEGER: 124 -.1.3.6.1.2.1.25.4.2.1.1.127 = INTEGER: 127 -.1.3.6.1.2.1.25.4.2.1.1.129 = INTEGER: 129 -.1.3.6.1.2.1.25.4.2.1.1.153 = INTEGER: 153 -.1.3.6.1.2.1.25.4.2.1.1.163 = INTEGER: 163 -.1.3.6.1.2.1.25.4.2.1.1.164 = INTEGER: 164 -.1.3.6.1.2.1.25.4.2.1.1.169 = INTEGER: 169 -.1.3.6.1.2.1.25.4.2.1.1.177 = INTEGER: 177 -.1.3.6.1.2.1.25.4.2.1.1.181 = INTEGER: 181 -.1.3.6.1.2.1.25.4.2.1.1.205 = INTEGER: 205 -.1.3.6.1.2.1.25.4.2.1.1.227 = INTEGER: 227 -.1.3.6.1.2.1.25.4.2.1.1.235 = INTEGER: 235 -.1.3.6.1.2.1.25.4.2.1.1.237 = INTEGER: 237 -.1.3.6.1.2.1.25.4.2.1.1.239 = INTEGER: 239 -.1.3.6.1.2.1.25.4.2.1.1.251 = INTEGER: 251 -.1.3.6.1.2.1.25.4.2.1.1.261 = INTEGER: 261 -.1.3.6.1.2.1.25.4.2.1.1.265 = INTEGER: 265 -.1.3.6.1.2.1.25.4.2.1.1.269 = INTEGER: 269 -.1.3.6.1.2.1.25.4.2.1.1.270 = INTEGER: 270 -.1.3.6.1.2.1.25.4.2.1.1.271 = INTEGER: 271 -.1.3.6.1.2.1.25.4.2.1.1.303 = INTEGER: 303 -.1.3.6.1.2.1.25.4.2.1.1.321 = INTEGER: 321 -.1.3.6.1.2.1.25.4.2.1.1.330 = INTEGER: 330 -.1.3.6.1.2.1.25.4.2.1.1.333 = INTEGER: 333 -.1.3.6.1.2.1.25.4.2.1.1.336 = INTEGER: 336 -.1.3.6.1.2.1.25.4.2.1.1.338 = INTEGER: 338 -.1.3.6.1.2.1.25.4.2.1.1.358 = INTEGER: 358 -.1.3.6.1.2.1.25.4.2.1.1.360 = INTEGER: 360 -.1.3.6.1.2.1.25.4.2.1.1.361 = INTEGER: 361 -.1.3.6.1.2.1.25.4.2.1.1.365 = INTEGER: 365 -.1.3.6.1.2.1.25.4.2.1.1.367 = INTEGER: 367 -.1.3.6.1.2.1.25.4.2.1.1.368 = INTEGER: 368 -.1.3.6.1.2.1.25.4.2.1.1.369 = INTEGER: 369 -.1.3.6.1.2.1.25.4.2.1.1.370 = INTEGER: 370 -.1.3.6.1.2.1.25.4.2.1.1.393 = INTEGER: 393 -.1.3.6.1.2.1.25.4.2.1.1.415 = INTEGER: 415 -.1.3.6.1.2.1.25.4.2.1.1.418 = INTEGER: 418 -.1.3.6.1.2.1.25.4.2.1.1.436 = INTEGER: 436 -.1.3.6.1.2.1.25.4.2.1.1.437 = INTEGER: 437 -.1.3.6.1.2.1.25.4.2.1.1.446 = INTEGER: 446 -.1.3.6.1.2.1.25.4.2.1.1.448 = INTEGER: 448 -.1.3.6.1.2.1.25.4.2.1.1.465 = INTEGER: 465 -.1.3.6.1.2.1.25.4.2.1.1.497 = INTEGER: 497 -.1.3.6.1.2.1.25.4.2.1.1.623 = INTEGER: 623 -.1.3.6.1.2.1.25.4.2.1.1.625 = INTEGER: 625 -.1.3.6.1.2.1.25.4.2.1.1.626 = INTEGER: 626 -.1.3.6.1.2.1.25.4.2.1.1.647 = INTEGER: 647 -.1.3.6.1.2.1.25.4.2.1.1.675 = INTEGER: 675 -.1.3.6.1.2.1.25.4.2.1.1.676 = INTEGER: 676 -.1.3.6.1.2.1.25.4.2.1.1.677 = INTEGER: 677 -.1.3.6.1.2.1.25.4.2.1.1.681 = INTEGER: 681 -.1.3.6.1.2.1.25.4.2.1.1.686 = INTEGER: 686 -.1.3.6.1.2.1.25.4.2.1.1.687 = INTEGER: 687 -.1.3.6.1.2.1.25.4.2.1.1.717 = INTEGER: 717 -.1.3.6.1.2.1.25.4.2.1.2.0 = STRING: "kernel_task" -.1.3.6.1.2.1.25.4.2.1.2.1 = STRING: "init" -.1.3.6.1.2.1.25.4.2.1.2.2 = STRING: "mach_init" -.1.3.6.1.2.1.25.4.2.1.2.78 = STRING: "syslogd" -.1.3.6.1.2.1.25.4.2.1.2.84 = STRING: "kextd" -.1.3.6.1.2.1.25.4.2.1.2.86 = STRING: "configd" -.1.3.6.1.2.1.25.4.2.1.2.87 = STRING: "diskarbitrationd" -.1.3.6.1.2.1.25.4.2.1.2.92 = STRING: "notifyd" -.1.3.6.1.2.1.25.4.2.1.2.97 = STRING: "blued" -.1.3.6.1.2.1.25.4.2.1.2.119 = STRING: "netinfod" -.1.3.6.1.2.1.25.4.2.1.2.120 = STRING: "distnoted" -.1.3.6.1.2.1.25.4.2.1.2.122 = STRING: "update" -.1.3.6.1.2.1.25.4.2.1.2.124 = STRING: "ioupsd" -.1.3.6.1.2.1.25.4.2.1.2.127 = STRING: "coreservicesd" -.1.3.6.1.2.1.25.4.2.1.2.129 = STRING: "dynamic_pager" -.1.3.6.1.2.1.25.4.2.1.2.153 = STRING: "ATSServer" -.1.3.6.1.2.1.25.4.2.1.2.163 = STRING: "KernelEventAgent" -.1.3.6.1.2.1.25.4.2.1.2.164 = STRING: "cron" -.1.3.6.1.2.1.25.4.2.1.2.169 = STRING: "mDNSResponder" -.1.3.6.1.2.1.25.4.2.1.2.177 = STRING: "SecurityServer" -.1.3.6.1.2.1.25.4.2.1.2.181 = STRING: "WindowServer" -.1.3.6.1.2.1.25.4.2.1.2.205 = STRING: "crashreporterd" -.1.3.6.1.2.1.25.4.2.1.2.227 = STRING: "loginwindow" -.1.3.6.1.2.1.25.4.2.1.2.235 = STRING: "postfix-watch" -.1.3.6.1.2.1.25.4.2.1.2.237 = STRING: "DirectoryService" -.1.3.6.1.2.1.25.4.2.1.2.239 = STRING: "cupsd" -.1.3.6.1.2.1.25.4.2.1.2.251 = STRING: "xinetd" -.1.3.6.1.2.1.25.4.2.1.2.261 = STRING: "AppleFileServer" -.1.3.6.1.2.1.25.4.2.1.2.265 = STRING: "pbs" -.1.3.6.1.2.1.25.4.2.1.2.269 = STRING: "Dock" -.1.3.6.1.2.1.25.4.2.1.2.270 = STRING: "SystemUIServer" -.1.3.6.1.2.1.25.4.2.1.2.271 = STRING: "Finder" -.1.3.6.1.2.1.25.4.2.1.2.303 = STRING: "ntpd" -.1.3.6.1.2.1.25.4.2.1.2.321 = STRING: "nfsiod" -.1.3.6.1.2.1.25.4.2.1.2.330 = STRING: "rpc.lockd" -.1.3.6.1.2.1.25.4.2.1.2.333 = STRING: "automount" -.1.3.6.1.2.1.25.4.2.1.2.336 = STRING: "automount" -.1.3.6.1.2.1.25.4.2.1.2.338 = STRING: "MirrorAgent" -.1.3.6.1.2.1.25.4.2.1.2.358 = STRING: "IIDCAssistant" -.1.3.6.1.2.1.25.4.2.1.2.360 = STRING: "X-Assist" -.1.3.6.1.2.1.25.4.2.1.2.361 = STRING: "iCalAlarmSchedul" -.1.3.6.1.2.1.25.4.2.1.2.365 = STRING: "X-Chat Aqua" -.1.3.6.1.2.1.25.4.2.1.2.367 = STRING: "System Events" -.1.3.6.1.2.1.25.4.2.1.2.368 = STRING: "iTunesHelper" -.1.3.6.1.2.1.25.4.2.1.2.369 = STRING: "BluePhoneElite" -.1.3.6.1.2.1.25.4.2.1.2.370 = STRING: "Skype" -.1.3.6.1.2.1.25.4.2.1.2.393 = STRING: "lookupd" -.1.3.6.1.2.1.25.4.2.1.2.415 = STRING: "Adium" -.1.3.6.1.2.1.25.4.2.1.2.418 = STRING: "slpd" -.1.3.6.1.2.1.25.4.2.1.2.436 = STRING: "eclipse" -.1.3.6.1.2.1.25.4.2.1.2.437 = STRING: "java" -.1.3.6.1.2.1.25.4.2.1.2.446 = STRING: "Mail" -.1.3.6.1.2.1.25.4.2.1.2.448 = STRING: "GPGMEProxyServer" -.1.3.6.1.2.1.25.4.2.1.2.465 = STRING: "firefox-bin" -.1.3.6.1.2.1.25.4.2.1.2.497 = STRING: "AppleSpell" -.1.3.6.1.2.1.25.4.2.1.2.623 = STRING: "iTerm" -.1.3.6.1.2.1.25.4.2.1.2.625 = STRING: "login" -.1.3.6.1.2.1.25.4.2.1.2.626 = STRING: "bash" -.1.3.6.1.2.1.25.4.2.1.2.647 = STRING: "snmpd" -.1.3.6.1.2.1.25.4.2.1.2.675 = STRING: "man" -.1.3.6.1.2.1.25.4.2.1.2.676 = STRING: "sh" -.1.3.6.1.2.1.25.4.2.1.2.677 = STRING: "sh" -.1.3.6.1.2.1.25.4.2.1.2.681 = STRING: "less" -.1.3.6.1.2.1.25.4.2.1.2.686 = STRING: "login" -.1.3.6.1.2.1.25.4.2.1.2.687 = STRING: "bash" -.1.3.6.1.2.1.25.4.2.1.2.717 = STRING: "snmpwalk" -.1.3.6.1.2.1.25.4.2.1.3.0 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.1 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.2 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.78 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.84 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.86 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.87 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.92 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.97 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.119 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.120 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.122 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.124 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.127 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.129 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.153 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.163 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.164 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.169 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.177 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.181 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.205 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.227 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.235 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.237 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.239 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.251 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.261 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.265 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.269 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.270 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.271 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.303 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.321 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.330 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.333 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.336 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.338 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.358 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.360 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.361 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.365 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.367 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.368 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.369 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.370 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.393 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.415 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.418 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.436 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.437 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.446 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.448 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.465 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.497 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.623 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.625 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.626 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.647 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.675 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.676 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.677 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.681 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.686 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.687 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.3.717 = OID: .0.0 -.1.3.6.1.2.1.25.4.2.1.4.0 = STRING: "kernel_task" -.1.3.6.1.2.1.25.4.2.1.4.1 = STRING: "init" -.1.3.6.1.2.1.25.4.2.1.4.2 = STRING: "mach_init" -.1.3.6.1.2.1.25.4.2.1.4.78 = STRING: "syslogd" -.1.3.6.1.2.1.25.4.2.1.4.84 = STRING: "kextd" -.1.3.6.1.2.1.25.4.2.1.4.86 = STRING: "configd" -.1.3.6.1.2.1.25.4.2.1.4.87 = STRING: "diskarbitrationd" -.1.3.6.1.2.1.25.4.2.1.4.92 = STRING: "notifyd" -.1.3.6.1.2.1.25.4.2.1.4.97 = STRING: "blued" -.1.3.6.1.2.1.25.4.2.1.4.119 = STRING: "netinfod" -.1.3.6.1.2.1.25.4.2.1.4.120 = STRING: "distnoted" -.1.3.6.1.2.1.25.4.2.1.4.122 = STRING: "update" -.1.3.6.1.2.1.25.4.2.1.4.124 = STRING: "ioupsd" -.1.3.6.1.2.1.25.4.2.1.4.127 = STRING: "coreservicesd" -.1.3.6.1.2.1.25.4.2.1.4.129 = STRING: "dynamic_pager" -.1.3.6.1.2.1.25.4.2.1.4.153 = STRING: "ATSServer" -.1.3.6.1.2.1.25.4.2.1.4.163 = STRING: "KernelEventAgent" -.1.3.6.1.2.1.25.4.2.1.4.164 = STRING: "cron" -.1.3.6.1.2.1.25.4.2.1.4.169 = STRING: "mDNSResponder" -.1.3.6.1.2.1.25.4.2.1.4.177 = STRING: "SecurityServer" -.1.3.6.1.2.1.25.4.2.1.4.181 = STRING: "WindowServer" -.1.3.6.1.2.1.25.4.2.1.4.205 = STRING: "crashreporterd" -.1.3.6.1.2.1.25.4.2.1.4.227 = STRING: "loginwindow" -.1.3.6.1.2.1.25.4.2.1.4.235 = STRING: "postfix-watch" -.1.3.6.1.2.1.25.4.2.1.4.237 = STRING: "DirectoryService" -.1.3.6.1.2.1.25.4.2.1.4.239 = STRING: "cupsd" -.1.3.6.1.2.1.25.4.2.1.4.251 = STRING: "xinetd" -.1.3.6.1.2.1.25.4.2.1.4.261 = STRING: "AppleFileServer" -.1.3.6.1.2.1.25.4.2.1.4.265 = STRING: "pbs" -.1.3.6.1.2.1.25.4.2.1.4.269 = STRING: "Dock" -.1.3.6.1.2.1.25.4.2.1.4.270 = STRING: "SystemUIServer" -.1.3.6.1.2.1.25.4.2.1.4.271 = STRING: "Finder" -.1.3.6.1.2.1.25.4.2.1.4.303 = STRING: "ntpd" -.1.3.6.1.2.1.25.4.2.1.4.321 = STRING: "nfsiod" -.1.3.6.1.2.1.25.4.2.1.4.330 = STRING: "rpc.lockd" -.1.3.6.1.2.1.25.4.2.1.4.333 = STRING: "automount" -.1.3.6.1.2.1.25.4.2.1.4.336 = STRING: "automount" -.1.3.6.1.2.1.25.4.2.1.4.338 = STRING: "MirrorAgent" -.1.3.6.1.2.1.25.4.2.1.4.358 = STRING: "IIDCAssistant" -.1.3.6.1.2.1.25.4.2.1.4.360 = STRING: "X-Assist" -.1.3.6.1.2.1.25.4.2.1.4.361 = STRING: "iCalAlarmSchedul" -.1.3.6.1.2.1.25.4.2.1.4.365 = STRING: "X-Chat Aqua" -.1.3.6.1.2.1.25.4.2.1.4.367 = STRING: "System Events" -.1.3.6.1.2.1.25.4.2.1.4.368 = STRING: "iTunesHelper" -.1.3.6.1.2.1.25.4.2.1.4.369 = STRING: "BluePhoneElite" -.1.3.6.1.2.1.25.4.2.1.4.370 = STRING: "Skype" -.1.3.6.1.2.1.25.4.2.1.4.393 = STRING: "lookupd" -.1.3.6.1.2.1.25.4.2.1.4.415 = STRING: "Adium" -.1.3.6.1.2.1.25.4.2.1.4.418 = STRING: "slpd" -.1.3.6.1.2.1.25.4.2.1.4.436 = STRING: "eclipse" -.1.3.6.1.2.1.25.4.2.1.4.437 = STRING: "java" -.1.3.6.1.2.1.25.4.2.1.4.446 = STRING: "Mail" -.1.3.6.1.2.1.25.4.2.1.4.448 = STRING: "GPGMEProxyServer" -.1.3.6.1.2.1.25.4.2.1.4.465 = STRING: "firefox-bin" -.1.3.6.1.2.1.25.4.2.1.4.497 = STRING: "AppleSpell" -.1.3.6.1.2.1.25.4.2.1.4.623 = STRING: "iTerm" -.1.3.6.1.2.1.25.4.2.1.4.625 = STRING: "login" -.1.3.6.1.2.1.25.4.2.1.4.626 = STRING: "bash" -.1.3.6.1.2.1.25.4.2.1.4.647 = STRING: "snmpd" -.1.3.6.1.2.1.25.4.2.1.4.675 = STRING: "man" -.1.3.6.1.2.1.25.4.2.1.4.676 = STRING: "sh" -.1.3.6.1.2.1.25.4.2.1.4.677 = STRING: "sh" -.1.3.6.1.2.1.25.4.2.1.4.681 = STRING: "less" -.1.3.6.1.2.1.25.4.2.1.4.686 = STRING: "login" -.1.3.6.1.2.1.25.4.2.1.4.687 = STRING: "bash" -.1.3.6.1.2.1.25.4.2.1.4.717 = STRING: "snmpwalk" -.1.3.6.1.2.1.25.4.2.1.5.0 = "" -.1.3.6.1.2.1.25.4.2.1.5.1 = "" -.1.3.6.1.2.1.25.4.2.1.5.2 = "" -.1.3.6.1.2.1.25.4.2.1.5.78 = "" -.1.3.6.1.2.1.25.4.2.1.5.84 = "" -.1.3.6.1.2.1.25.4.2.1.5.86 = "" -.1.3.6.1.2.1.25.4.2.1.5.87 = "" -.1.3.6.1.2.1.25.4.2.1.5.92 = "" -.1.3.6.1.2.1.25.4.2.1.5.97 = "" -.1.3.6.1.2.1.25.4.2.1.5.119 = "" -.1.3.6.1.2.1.25.4.2.1.5.120 = "" -.1.3.6.1.2.1.25.4.2.1.5.122 = "" -.1.3.6.1.2.1.25.4.2.1.5.124 = "" -.1.3.6.1.2.1.25.4.2.1.5.127 = "" -.1.3.6.1.2.1.25.4.2.1.5.129 = "" -.1.3.6.1.2.1.25.4.2.1.5.153 = "" -.1.3.6.1.2.1.25.4.2.1.5.163 = "" -.1.3.6.1.2.1.25.4.2.1.5.164 = "" -.1.3.6.1.2.1.25.4.2.1.5.169 = "" -.1.3.6.1.2.1.25.4.2.1.5.177 = "" -.1.3.6.1.2.1.25.4.2.1.5.181 = "" -.1.3.6.1.2.1.25.4.2.1.5.205 = "" -.1.3.6.1.2.1.25.4.2.1.5.227 = "" -.1.3.6.1.2.1.25.4.2.1.5.235 = "" -.1.3.6.1.2.1.25.4.2.1.5.237 = "" -.1.3.6.1.2.1.25.4.2.1.5.239 = "" -.1.3.6.1.2.1.25.4.2.1.5.251 = "" -.1.3.6.1.2.1.25.4.2.1.5.261 = "" -.1.3.6.1.2.1.25.4.2.1.5.265 = "" -.1.3.6.1.2.1.25.4.2.1.5.269 = "" -.1.3.6.1.2.1.25.4.2.1.5.270 = "" -.1.3.6.1.2.1.25.4.2.1.5.271 = "" -.1.3.6.1.2.1.25.4.2.1.5.303 = "" -.1.3.6.1.2.1.25.4.2.1.5.321 = "" -.1.3.6.1.2.1.25.4.2.1.5.330 = "" -.1.3.6.1.2.1.25.4.2.1.5.333 = "" -.1.3.6.1.2.1.25.4.2.1.5.336 = "" -.1.3.6.1.2.1.25.4.2.1.5.338 = "" -.1.3.6.1.2.1.25.4.2.1.5.358 = "" -.1.3.6.1.2.1.25.4.2.1.5.360 = "" -.1.3.6.1.2.1.25.4.2.1.5.361 = "" -.1.3.6.1.2.1.25.4.2.1.5.365 = "" -.1.3.6.1.2.1.25.4.2.1.5.367 = "" -.1.3.6.1.2.1.25.4.2.1.5.368 = "" -.1.3.6.1.2.1.25.4.2.1.5.369 = "" -.1.3.6.1.2.1.25.4.2.1.5.370 = "" -.1.3.6.1.2.1.25.4.2.1.5.393 = "" -.1.3.6.1.2.1.25.4.2.1.5.415 = "" -.1.3.6.1.2.1.25.4.2.1.5.418 = "" -.1.3.6.1.2.1.25.4.2.1.5.436 = "" -.1.3.6.1.2.1.25.4.2.1.5.437 = "" -.1.3.6.1.2.1.25.4.2.1.5.446 = "" -.1.3.6.1.2.1.25.4.2.1.5.448 = "" -.1.3.6.1.2.1.25.4.2.1.5.465 = "" -.1.3.6.1.2.1.25.4.2.1.5.497 = "" -.1.3.6.1.2.1.25.4.2.1.5.623 = "" -.1.3.6.1.2.1.25.4.2.1.5.625 = "" -.1.3.6.1.2.1.25.4.2.1.5.626 = "" -.1.3.6.1.2.1.25.4.2.1.5.647 = "" -.1.3.6.1.2.1.25.4.2.1.5.675 = "" -.1.3.6.1.2.1.25.4.2.1.5.676 = "" -.1.3.6.1.2.1.25.4.2.1.5.677 = "" -.1.3.6.1.2.1.25.4.2.1.5.681 = "" -.1.3.6.1.2.1.25.4.2.1.5.686 = "" -.1.3.6.1.2.1.25.4.2.1.5.687 = "" -.1.3.6.1.2.1.25.4.2.1.5.717 = "" -.1.3.6.1.2.1.25.4.2.1.6.0 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.1 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.2 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.78 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.84 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.86 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.87 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.92 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.97 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.119 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.120 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.122 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.124 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.127 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.129 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.153 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.163 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.164 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.169 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.177 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.181 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.205 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.227 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.235 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.237 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.239 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.251 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.261 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.265 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.269 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.270 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.271 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.303 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.321 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.330 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.333 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.336 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.338 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.358 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.360 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.361 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.365 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.367 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.368 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.369 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.370 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.393 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.415 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.418 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.436 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.437 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.446 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.448 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.465 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.497 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.623 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.625 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.626 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.647 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.675 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.676 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.677 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.681 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.686 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.687 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.6.717 = INTEGER: 4 -.1.3.6.1.2.1.25.4.2.1.7.0 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.1 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.2 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.78 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.84 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.86 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.87 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.92 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.97 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.119 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.120 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.122 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.124 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.127 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.129 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.153 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.163 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.164 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.169 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.177 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.181 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.205 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.227 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.235 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.237 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.239 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.251 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.261 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.265 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.269 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.270 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.271 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.303 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.321 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.330 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.333 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.336 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.338 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.358 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.360 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.361 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.365 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.367 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.368 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.369 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.370 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.393 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.415 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.418 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.436 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.437 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.446 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.448 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.465 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.497 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.623 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.625 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.626 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.647 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.675 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.676 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.677 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.681 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.686 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.687 = INTEGER: 1 -.1.3.6.1.2.1.25.4.2.1.7.717 = INTEGER: 1 -.1.3.6.1.2.1.25.5.1.1.1.0 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.1 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.2 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.78 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.84 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.86 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.87 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.92 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.97 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.119 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.120 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.122 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.124 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.127 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.129 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.153 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.163 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.164 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.169 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.177 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.181 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.205 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.227 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.235 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.237 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.239 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.251 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.261 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.265 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.269 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.270 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.271 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.303 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.321 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.330 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.333 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.336 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.338 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.358 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.360 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.361 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.365 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.367 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.368 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.369 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.370 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.393 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.415 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.418 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.436 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.437 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.446 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.448 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.465 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.497 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.623 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.625 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.626 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.647 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.675 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.676 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.677 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.681 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.686 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.687 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.1.717 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.0 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.1 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.2 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.78 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.84 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.86 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.87 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.92 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.97 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.119 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.120 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.122 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.124 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.127 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.129 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.153 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.163 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.164 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.169 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.177 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.181 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.205 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.227 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.235 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.237 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.239 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.251 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.261 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.265 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.269 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.270 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.271 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.303 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.321 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.330 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.333 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.336 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.338 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.358 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.360 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.361 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.365 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.367 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.368 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.369 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.370 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.393 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.415 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.418 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.436 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.437 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.446 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.448 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.465 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.497 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.623 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.625 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.626 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.647 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.675 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.676 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.677 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.681 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.686 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.687 = INTEGER: 0 -.1.3.6.1.2.1.25.5.1.1.2.717 = INTEGER: 0 diff --git a/opennms-import/src/test/resources/tec_dump.xml b/opennms-import/src/test/resources/tec_dump.xml deleted file mode 100644 index 2625e992dfa3..000000000000 --- a/opennms-import/src/test/resources/tec_dump.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/opennms-import/src/test/resources/tec_dump.xml.smalltest b/opennms-import/src/test/resources/tec_dump.xml.smalltest deleted file mode 100644 index 64f7e7f04017..000000000000 --- a/opennms-import/src/test/resources/tec_dump.xml.smalltest +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/opennms-import/src/test/resources/tec_dumpIpAddrChanged.xml b/opennms-import/src/test/resources/tec_dumpIpAddrChanged.xml deleted file mode 100644 index 5a466f3a852d..000000000000 --- a/opennms-import/src/test/resources/tec_dumpIpAddrChanged.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - ]> - - - - - - - - - - - - - - - diff --git a/opennms-import/src/test/resources/utf-8.xml b/opennms-import/src/test/resources/utf-8.xml deleted file mode 100644 index fb4c34608077..000000000000 --- a/opennms-import/src/test/resources/utf-8.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/opennms-install/pom.xml b/opennms-install/pom.xml index 46af5e10fae5..405fa0504057 100644 --- a/opennms-install/pom.xml +++ b/opennms-install/pom.xml @@ -119,6 +119,10 @@ org.opennms.core.schema liquibase
+ + org.opennms.core + org.opennms.core.upgrade + commons-cli diff --git a/opennms-install/src/main/java/org/opennms/install/Installer.java b/opennms-install/src/main/java/org/opennms/install/Installer.java index 0dd83d1125df..2f3c02275857 100644 --- a/opennms-install/src/main/java/org/opennms/install/Installer.java +++ b/opennms-install/src/main/java/org/opennms/install/Installer.java @@ -56,7 +56,7 @@ import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; import org.opennms.bootstrap.Bootstrap; -import org.opennms.core.db.ConnectionFactoryUtil; +import org.opennms.core.db.DataSourceConfigurationFactory; import org.opennms.core.db.install.InstallerDb; import org.opennms.core.db.install.SimpleDataSource; import org.opennms.core.schema.ExistingResourceAccessor; @@ -67,6 +67,7 @@ import org.opennms.netmgt.config.opennmsDataSources.JdbcDataSource; import org.opennms.netmgt.icmp.Pinger; import org.opennms.netmgt.icmp.PingerFactory; +import org.opennms.upgrade.support.Upgrade; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; @@ -104,6 +105,7 @@ public class Installer { boolean m_ignore_database_version = false; boolean m_do_not_revert = false; boolean m_remove_database = false; + boolean m_skip_upgrade_tools = false; String m_etc_dir = ""; String m_tomcat_conf = null; @@ -157,12 +159,12 @@ public void install(final String[] argv) throws Exception { final File cfgFile = ConfigFileConstants.getFile(ConfigFileConstants.OPENNMS_DATASOURCE_CONFIG_FILE_NAME); InputStream is = new FileInputStream(cfgFile); - final JdbcDataSource adminDsConfig = ConnectionFactoryUtil.marshalDataSourceFromConfig(is, ADMIN_DATA_SOURCE_NAME); + final JdbcDataSource adminDsConfig = new DataSourceConfigurationFactory(is).getJdbcDataSource(ADMIN_DATA_SOURCE_NAME); final DataSource adminDs = new SimpleDataSource(adminDsConfig); is.close(); is = new FileInputStream(cfgFile); - final JdbcDataSource dsConfig = ConnectionFactoryUtil.marshalDataSourceFromConfig(is, OPENNMS_DATA_SOURCE_NAME); + final JdbcDataSource dsConfig = new DataSourceConfigurationFactory(is).getJdbcDataSource(OPENNMS_DATA_SOURCE_NAME); final DataSource ds = new SimpleDataSource(dsConfig); is.close(); @@ -289,6 +291,10 @@ public void install(final String[] argv) throws Exception { System.out.println(); System.out.println("Installer completed successfully!"); + + if (!m_skip_upgrade_tools) { + new Upgrade().execute(); + } } private void checkIPv6() { @@ -504,6 +510,10 @@ public void parseArguments(String[] argv) throws Exception { options.addOption("r", "rpm-install", false, "RPM install (deprecated)"); + // upgrade tools options + options.addOption("S", "skip-upgrade-tools", false, + "Skip the execution of the upgrade tools (post-processing tasks)"); + CommandLineParser parser = new PosixParser(); m_commandLine = parser.parse(options, argv); @@ -569,6 +579,7 @@ public void parseArguments(String[] argv) throws Exception { } m_fix_constraint_remove_rows = m_commandLine.hasOption("X"); m_install_webapp = m_commandLine.hasOption("y"); + m_skip_upgrade_tools = m_commandLine.hasOption("S"); if (m_commandLine.getArgList().size() > 0) { usage(options, m_commandLine, "Unknown command-line arguments: " diff --git a/opennms-model/src/main/java/org/opennms/netmgt/model/OnmsServiceType.java b/opennms-model/src/main/java/org/opennms/netmgt/model/OnmsServiceType.java index 05fe543c0f17..6b3fed94f3f4 100644 --- a/opennms-model/src/main/java/org/opennms/netmgt/model/OnmsServiceType.java +++ b/opennms-model/src/main/java/org/opennms/netmgt/model/OnmsServiceType.java @@ -82,7 +82,7 @@ public OnmsServiceType() { */ @Id @XmlAttribute(name="id") - @Column(name="serviceId", nullable=false, unique=true) + @Column(name="serviceId") @SequenceGenerator(name="serviceTypeSequence", sequenceName="serviceNxtId") @GeneratedValue(generator="serviceTypeSequence") public Integer getId() { diff --git a/opennms-provision/opennms-provision-persistence/src/main/java/org/opennms/netmgt/provision/persist/requisition/RequisitionInterface.java b/opennms-provision/opennms-provision-persistence/src/main/java/org/opennms/netmgt/provision/persist/requisition/RequisitionInterface.java index a8759fef1d47..ab6533c3d3ce 100644 --- a/opennms-provision/opennms-provision-persistence/src/main/java/org/opennms/netmgt/provision/persist/requisition/RequisitionInterface.java +++ b/opennms-provision/opennms-provision-persistence/src/main/java/org/opennms/netmgt/provision/persist/requisition/RequisitionInterface.java @@ -357,7 +357,7 @@ public void setSnmpPrimary(final PrimaryType value) { * * @return a int. */ - public int getStatus() { + public Integer getStatus() { if (m_status == null) { return 1; } else { diff --git a/opennms-provision/opennms-provisiond/src/main/java/org/opennms/netmgt/provision/service/snmp/IfTableEntry.java b/opennms-provision/opennms-provisiond/src/main/java/org/opennms/netmgt/provision/service/snmp/IfTableEntry.java index 1ab18e4edf90..d2aa51d2aff9 100644 --- a/opennms-provision/opennms-provisiond/src/main/java/org/opennms/netmgt/provision/service/snmp/IfTableEntry.java +++ b/opennms-provision/opennms-provisiond/src/main/java/org/opennms/netmgt/provision/service/snmp/IfTableEntry.java @@ -252,7 +252,8 @@ public String getPhysAddr() { // This is the normal case that most agents conform to: the value is an ASCII // string representing the colon-separated MAC address. We just need to reformat // it to remove the colons and convert it into a 12-character string. - return normalizeMacAddress(getDisplayString(IfTableEntry.IF_PHYS_ADDR)); + String mac = getDisplayString(IfTableEntry.IF_PHYS_ADDR); + return mac == null || mac.trim().isEmpty() ? null : normalizeMacAddress(mac); } } catch (IllegalArgumentException e) { LOG.warn(e.getMessage(), e); diff --git a/opennms-qosdaemon/src/assembly/xsds.xml b/opennms-qosdaemon/src/assembly/xsds.xml deleted file mode 100644 index d2b44cb1879e..000000000000 --- a/opennms-qosdaemon/src/assembly/xsds.xml +++ /dev/null @@ -1,17 +0,0 @@ - - xsds - - jar - - false - - - target/xsds - xsds - 0644 - 0755 - - - diff --git a/opennms-rrd/opennms-rrd-model/pom.xml b/opennms-rrd/opennms-rrd-model/pom.xml new file mode 100644 index 000000000000..544b406cbcbf --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/pom.xml @@ -0,0 +1,54 @@ + + + + opennms-rrd + org.opennms + 1.13.0-SNAPSHOT + + 4.0.0 + opennms-rrd-model + OpenNMS RRD PRM (object-relational mapping) + bundle + + + + org.apache.felix + maven-bundle-plugin + true + + + JavaSE-1.6 + ${project.groupId}.${project.artifactId} + ${project.version} + org.opennms.netmgt.rrd.model.*;version="${project.version}" + + + + + + + + org.opennms + opennms-rrd-api + + + org.opennms.core + org.opennms.core.xml + + + org.opennms.dependencies + spring-dependencies + pom + + + org.opennms + opennms-test + test + + + org.opennms.dependencies + jrobin-dependencies + pom + + + diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/AbstractDS.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/AbstractDS.java new file mode 100644 index 000000000000..af8cf9b02efa --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/AbstractDS.java @@ -0,0 +1,237 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + +/** + * The Abstract DS (Data Source). + * + * @author Alejandro Galue + */ +public abstract class AbstractDS { + + /** The name of the database. */ + private String name; + + /** The minimum heartbeat. */ + private Integer minHeartbeat = 0; + + /** The minimum value of the data source. Defaults to 'U' */ + private Double min = null; + + /** The maximum value of the data source. Defaults to 'U'. */ + private Double max = null; + + /** The last value. */ + private Double lastDs = Double.NaN; + + /** The value. */ + private Double value = 0.0; + + /** The unknown seconds. */ + private Integer unknownSec = 0; + + /** + * Gets the name. + * + * @return the name + */ + @XmlElement + public String getName() { + return name; + } + + /** + * Sets the name. + *

The XML may contain spaces that must be removed.

+ * + * @param name the new name + */ + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } + + /** + * Gets the minimum heartbeat. + * + * @return the minimum heartbeat + */ + @XmlElement(name="minimal_heartbeat") + public Integer getMinHeartbeat() { + return minHeartbeat; + } + + /** + * Sets the minimum heartbeat. + * + * @param minHeartbeat the new minimum heartbeat + */ + public void setMinHeartbeat(Integer minHeartbeat) { + this.minHeartbeat = minHeartbeat; + } + + /** + * Gets the minimum value. + * + * @return the minimum value + */ + @XmlElement + public Double getMin() { + return min; + } + + /** + * Sets the minimum value. + * + * @param min the new minimum value + */ + public void setMin(Double min) { + this.min = min; + } + + /** + * Gets the maximum value. + * + * @return the maximum value + */ + @XmlElement + public Double getMax() { + return max; + } + + /** + * Sets the maximum value. + * + * @param max the new maximum value + */ + public void setMax(Double max) { + this.max = max; + } + + /** + * Gets the last data source value. + * + * @return the last data source time stamp + */ + @XmlElement(name="last_ds") + @XmlJavaTypeAdapter(DoubleAdapter.class) + public Double getLastDs() { + return lastDs; + } + + /** + * Sets the last data source value. + * + * @param lastDs the new last data source value + */ + public void setLastDs(Double lastDs) { + this.lastDs = lastDs; + } + + /** + * Gets the value. + * + * @return the value + */ + @XmlElement + public Double getValue() { + return value; + } + + /** + * Sets the value. + * + * @param value the new value + */ + public void setValue(Double value) { + this.value = value; + } + + /** + * Gets the unknown seconds. + * + * @return the unknown seconds + */ + @XmlElement(name="unknown_sec") + public Integer getUnknownSec() { + return unknownSec; + } + + /** + * Sets the unknown seconds. + * + * @param unknownSec the new unknown seconds + */ + public void setUnknownSec(Integer unknownSec) { + this.unknownSec = unknownSec; + } + + /** + * Format equals. + * + * @param ds the DS object + * @return true, if successful + */ + public boolean formatEquals(AbstractDS ds) { + if (this.name != null) { + if (ds.name == null) return false; + else if (!(this.name.equals(ds.name))) + return false; + } + else if (ds.name != null) + return false; + + if (this.minHeartbeat != null) { + if (ds.minHeartbeat == null) return false; + else if (!(this.minHeartbeat.equals(ds.minHeartbeat))) + return false; + } + else if (ds.minHeartbeat != null) + return false; + + if (this.min != null) { + if (ds.min == null) return false; + else if (!(this.min.equals(ds.min))) + return false; + } + else if (ds.min != null) + return false; + + if (this.max != null) { + if (ds.max == null) return false; + else if (!(this.max.equals(ds.max))) + return false; + } + else if (ds.max != null) + return false; + + return true; + } +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/AbstractRRA.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/AbstractRRA.java new file mode 100644 index 000000000000..97d30872d0eb --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/AbstractRRA.java @@ -0,0 +1,123 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; + +/** + * The Abstract RRA (Round Robin Archives). + * + * @author Alejandro Galue + */ +public abstract class AbstractRRA { + + /** The PDP (Primary Data Points) per row. */ + private Integer pdpPerRow; + + /** The rows. */ + private List rows = new ArrayList(); + + /** + * Creates a RRA with a single data source. + * + * @param dsIndex the RRA-DS index + * @return the abstract RRA + * @throws IllegalArgumentException the illegal argument exception + */ + protected abstract AbstractRRA createSingleRRA(int dsIndex) throws IllegalArgumentException; + + /** + * Gets the PDP (Primary Data Points) per row. + * + * @return the PDP (Primary Data Points) per row + */ + @XmlElement(name="pdp_per_row") + public Integer getPdpPerRow() { + return pdpPerRow; + } + + /** + * Sets the PDP (Primary Data Points) per row. + * + * @param pdpPerRow the new PDP (Primary Data Points) per row + */ + public void setPdpPerRow(Integer pdpPerRow) { + this.pdpPerRow = pdpPerRow; + } + + /** + * Gets the rows. + * + * @return the rows + */ + @XmlElement(name="row") + @XmlElementWrapper(name="database") + public List getRows() { + return rows; + } + + /** + * Sets the rows. + * + * @param rows the new rows + */ + public void setRows(List rows) { + this.rows = rows; + } + + /** + * Format equals. + * + * @param rra the RRA object + * @return true, if successful + */ + public boolean formatEquals(AbstractRRA rra) { + if (this.pdpPerRow != null) { + if (rra.pdpPerRow == null) return false; + else if (!(this.pdpPerRow.equals(rra.pdpPerRow))) + return false; + } + else if (rra.pdpPerRow != null) + return false; + + if (this.rows != null) { + if (rra.rows == null) return false; + else if (!(this.rows.size() == rra.rows.size())) + return false; + } + else if (rra.rows != null) + return false; + + return true; + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/AbstractRRD.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/AbstractRRD.java new file mode 100644 index 000000000000..85b429d6b74e --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/AbstractRRD.java @@ -0,0 +1,404 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + +/** + * The Abstract RRD (Round Robin Database). + * + * @author Alejandro Galue + */ +public abstract class AbstractRRD { + + /** The version of the RRD Dump. */ + private String version; + + /** The step (interval) expressed in seconds. */ + private Long step; + + /** The last update time stamp, expressed in seconds since 1970-01-01 UTC. */ + private Long lastupdate; + + /** + * Creates the RRD. + * + * @return the abstract RRD + */ + protected abstract AbstractRRD createRRD(); + + /** + * Gets the data sources. + * + * @return the data sources + */ + public abstract List getDataSources(); + + /** + * Gets the RRAs. + * + * @return the RRAs + */ + public abstract List getRras(); + + /** + * Adds the RRA. + * + * @param rra the RRA + */ + public abstract void addRRA(AbstractRRA rra); + + /** + * Adds the data source. + * + * @param ds the DS + */ + public abstract void addDataSource(AbstractDS ds); + + /** + * Gets the data source. + * + * @param index the index + * @return the data source + */ + public abstract AbstractDS getDataSource(int index); + + /** + * Gets the required version. + * + * @return the required version + */ + @XmlTransient + protected abstract String getRequiredVersion(); + + /** + * Gets the version of the RRD Dump. + * + * @return the version + */ + @XmlElement(name="version") + public String getVersion() { + if (version == null) { + version = getRequiredVersion(); + } + return version; + } + + /** + * Sets the version. + * + * @param version the new version + */ + public void setVersion(String version) { + if (!version.equals(getRequiredVersion())) { + throw new IllegalArgumentException("Invalid RRD Version (expecting version " + getRequiredVersion() + ")"); + } + this.version = version; + } + + /** + * Gets the step (interval) expressed in seconds. + * + * @return the step + */ + @XmlElement(name="step") + public Long getStep() { + return step; + } + + /** + * Sets the step. + * + * @param step the new step + */ + public void setStep(Long step) { + this.step = step; + } + + /** + * Gets the last update. + * + * @return the last update + */ + @XmlElement(name="lastupdate") + @XmlJavaTypeAdapter(LongAdapter.class) + public Long getLastUpdate() { + return lastupdate; + } + + /** + * Sets the last update. + * + * @param lastUpdate the new last update + */ + public void setLastUpdate(Long lastUpdate) { + this.lastupdate = lastUpdate; + } + + /** + * Gets the start time stamp, expressed in seconds since 1970-01-01 UTC. + * + * @param rra the RRA + * @return the start time stamp (in seconds) + */ + public Long getStartTimestamp(AbstractRRA rra) { + if (getLastUpdate() == null || getStep() == null || rra == null) { + return null; + } + return getEndTimestamp(rra) - getStep() * rra.getPdpPerRow() * rra.getRows().size(); + } + + /** + * Gets the end time stamp, expressed in seconds since 1970-01-01 UTC. + * + * @param rra the RRA + * @return the end time stamp (in seconds) + */ + public Long getEndTimestamp(AbstractRRA rra) { + if (getLastUpdate() == null || getStep() == null || rra == null) { + return null; + } + return getLastUpdate() - getLastUpdate() % (getStep() * rra.getPdpPerRow()) + (getStep() * rra.getPdpPerRow()); + } + + /** + * Finds the row time stamp, expressed in seconds since 1970-01-01 UTC. + * + * @param rra the RRA object + * @param row the Row object + * @return the long + */ + public Long findTimestampByRow(AbstractRRA rra, Row row) { + int rowNumber = rra.getRows().indexOf(row); + if (rowNumber < 0) { + return null; + } + return getStartTimestamp(rra) + rowNumber * rra.getPdpPerRow() * getStep(); + } + + /** + * Gets the row that corresponds to a specific time stamp (expressed in seconds since 1970-01-01 UTC). + * + * @param rra the RRA + * @param timestamp the row time stamp + * @return the row object + */ + public Row findRowByTimestamp(AbstractRRA rra, Long timestamp) { + try { + Long n = (timestamp - getStartTimestamp(rra)) / (rra.getPdpPerRow() * getStep()); + return rra.getRows().get(n.intValue()); + } catch (Exception e) { + return null; + } + } + + /** + * Merge. + *

Merge the content of rrdSrc into this RRD.

+ *

The format must be equal in order to perform the merge operation.

+ * + * @param rrdSrc the RRD source + * @throws IllegalArgumentException the illegal argument exception + */ + public void merge(AbstractRRD rrdSrc) throws IllegalArgumentException { + if (!formatEquals(rrdSrc)) { + throw new IllegalArgumentException("Invalid RRD format"); + } + int rraNum = 0; + for (AbstractRRA rra : rrdSrc.getRras()) { + for (Row row : rra.getRows()) { + if (!row.isNan()) { + Long ts = rrdSrc.findTimestampByRow(rra, row); + Row localRow = findRowByTimestamp(getRras().get(rraNum), ts); + if (localRow != null) { + localRow.setValues(row.getValues()); + } + } + } + rraNum++; + } + } + + /** + * Merge. + * + * @param rrdList the RRD list + * @throws IllegalArgumentException the illegal argument exception + */ + public void merge(List rrdList) throws IllegalArgumentException { + if (rrdList.size() != getDataSources().size()) { + throw new IllegalArgumentException("Cannot merge RRDs because the amount of RRDs doesn't match the amount of data sources."); + } + for (AbstractRRD arrd : rrdList) { + if (!getVersion().equals(getVersion())) { + throw new IllegalArgumentException("Cannot merge RRDs because one of them have a different file version."); + } + if (!hasEqualsRras(arrd)) { + throw new IllegalArgumentException("Cannot merge RRDs because one of them as different RRA configuration."); + } + if (arrd.getDataSources().size() > 1) { + throw new IllegalArgumentException("Cannot merge RRDs because one of them has more than one DS."); + } + } + Collections.sort(rrdList, new Comparator() { + @Override + public int compare(AbstractRRD a, AbstractRRD b) { + int aInt = getIndex(a.getDataSources().get(0).getName()); + int bInt = getIndex(b.getDataSources().get(0).getName()); + return aInt - bInt; + } + }); + for (int i = 0; i < getRras().size(); i++) { + AbstractRRA rra = getRras().get(i); + for (int j = 0; j < rra.getRows().size(); j++) { + Row row = rra.getRows().get(j); + for (int k = 0; k < row.getValues().size(); k++) { + Double v = rrdList.get(k).getRras().get(i).getRows().get(j).getValues().get(0); + if (!v.isNaN()) { + row.getValues().set(k, v); + } + } + } + } + } + + /** + * Split. + *

If the RRD contain several data sources, it will return one RRD per DS. + * Otherwise, it will throw an exception.

+ * + * @return the RRD list + * @throws IllegalArgumentException the illegal argument exception + */ + public List split() throws IllegalArgumentException { + if (getDataSources().size() <= 1) { + throw new IllegalArgumentException("Cannot split an RRD composed by 1 or less data-sources."); + } + List rrds = new ArrayList(); + for (int i = 0; i < getDataSources().size(); i++) { + AbstractRRD rrd = createRRD(); + rrd.addDataSource(getDataSource(i)); + for (int j = 0; j < getRras().size(); j++) { + AbstractRRA currentRra = getRras().get(j); + AbstractRRA rra = currentRra.createSingleRRA(i); + for (Row currentRow : currentRra.getRows()) { + Row row = new Row(); + row.getValues().add(currentRow.getValues().get(i)); + rra.getRows().add(row); + } + rrd.addRRA(rra); + } + rrds.add(rrd); + } + return rrds; + } + + /** + * Format equals. + * + * @param rrd the RRD object + * @return true, if successful + */ + public boolean formatEquals(AbstractRRD rrd) { + if (this.step != null) { + if (rrd.step == null) return false; + else if (!(this.step.equals(rrd.step))) + return false; + } + else if (rrd.step != null) + return false; + + if (this.getDataSources() != null) { + if (rrd.getDataSources() == null) return false; + else if (!(this.getDataSources().size() == rrd.getDataSources().size())) + return false; + } + else if (rrd.getDataSources() != null) + return false; + + for (int i = 0; i < getDataSources().size(); i++) { + if (!getDataSources().get(i).formatEquals(rrd.getDataSources().get(i))) + return false; + } + + if (!hasEqualsRras(rrd)) { + return false; + } + + return true; + } + + /** + * Checks for equals RRAs. + * + * @param rrd the RRD object + * @return true, if successful + */ + public boolean hasEqualsRras(AbstractRRD rrd) { + if (this.getRras() != null) { + if (rrd.getRras() == null) return false; + else if (!(this.getRras().size() == rrd.getRras().size())) + return false; + } + else if (rrd.getRras() != null) + return false; + + for (int i = 0; i < getRras().size(); i++) { + if (!getRras().get(i).formatEquals(rrd.getRras().get(i))) + return false; + } + + return true; + } + + /** + * Gets the index. + * + * @param dsName the DS name + * @return the index + */ + protected int getIndex(String dsName) { + if (getDataSources() == null) { + return -1; + } + for (int i=0; i < getDataSources().size(); i++) { + if (getDataSources().get(i).getName().equals(dsName)) { + return i; + } + } + return -1; + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/DoubleAdapter.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/DoubleAdapter.java new file mode 100644 index 000000000000..d414bf3f8170 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/DoubleAdapter.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model; + +import javax.xml.bind.annotation.adapters.XmlAdapter; + +/** + * The Class DoubleAdapter. + *

The null representation of some integer values inside the XML version of an RRD is expressed as 'U'

+ * + * @author Alejandro Galue + */ +public class DoubleAdapter extends XmlAdapter { + + /* (non-Javadoc) + * @see javax.xml.bind.annotation.adapters.XmlAdapter#marshal(java.lang.Object) + */ + @Override + public String marshal(Double value) throws Exception { + if (value == null) { + return null; + } + if (value == Double.NEGATIVE_INFINITY) { + return "-inf"; + } + if (value == Double.POSITIVE_INFINITY) { + return "inf"; + } + if (value.isNaN()) { + return "NaN"; + } + return value.toString(); + } + + /* (non-Javadoc) + * @see javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal(java.lang.Object) + */ + @Override + public Double unmarshal(String value) throws Exception { + if (value.equalsIgnoreCase("U")) { + return null; + } + if (value.equalsIgnoreCase("-inf")) { + return Double.NEGATIVE_INFINITY; + } + if (value.equalsIgnoreCase("inf")) { + return Double.POSITIVE_INFINITY; + } + if (value.equalsIgnoreCase("nan")) { + return Double.NaN; + } + return new Double(value); + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/LongAdapter.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/LongAdapter.java new file mode 100644 index 000000000000..9b3d54886597 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/LongAdapter.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model; + +import javax.xml.bind.annotation.adapters.XmlAdapter; + +/** + * The Class LongAdapter. + *

The null representation of some integer values inside the XML version of an RRD is expressed as 'U'

+ * + * @author Alejandro Galue + */ +public class LongAdapter extends XmlAdapter { + + /* (non-Javadoc) + * @see javax.xml.bind.annotation.adapters.XmlAdapter#marshal(java.lang.Object) + */ + @Override + public String marshal(Long value) throws Exception { + if (value == null) { + return null; + } + if (value == Long.MIN_VALUE) { + return "-inf"; + } + if (value == Long.MAX_VALUE) { + return "inf"; + } + return value.toString(); + } + + /* (non-Javadoc) + * @see javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal(java.lang.Object) + */ + @Override + public Long unmarshal(String value) throws Exception { + if (value.equalsIgnoreCase("U")) { + return null; + } + if (value.equalsIgnoreCase("-inf")) { + return Long.MIN_VALUE; + } + if (value.equalsIgnoreCase("inf")) { + return Long.MAX_VALUE; + } + return new Long(value); + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/Row.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/Row.java new file mode 100644 index 000000000000..305c91a687bd --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/Row.java @@ -0,0 +1,82 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * The Class Row. + * + * @author Alejandro Galue + */ +@XmlRootElement(name="row") +@XmlAccessorType(XmlAccessType.FIELD) +public class Row { + + /** The values. */ + @XmlElement(name="v") + private List values = new ArrayList(); + + /** + * Gets the values. + * + * @return the values + */ + public List getValues() { + return values; + } + + /** + * Sets the values. + * + * @param values the new values + */ + public void setValues(List values) { + this.values = values; + } + + /** + * Checks if is all the values are NaN. + * + * @return true, if all the values are NaN. + */ + public boolean isNan() { + for (Double v : values) { + if (!v.isNaN()) { + return false; + } + } + return true; + } +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/RrdConvertUtils.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/RrdConvertUtils.java new file mode 100644 index 000000000000..882f6c7df0f1 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/RrdConvertUtils.java @@ -0,0 +1,263 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import org.jrobin.core.RrdDb; +import org.jrobin.core.RrdException; +import org.opennms.core.utils.StringUtils; +import org.opennms.core.xml.JaxbUtils; +import org.opennms.netmgt.rrd.model.v1.RRDv1; +import org.opennms.netmgt.rrd.model.v3.RRDv3; +import org.springframework.util.FileCopyUtils; + +/** + * The Class RRD Conversion Utilities. + * + * @author Alejandro Galue + */ +public class RrdConvertUtils { + + /** + * Instantiates a new RRDtool Convert Utils. + */ + private RrdConvertUtils() {} + + /** + * Dumps a JRB. + * + * @param sourceFile the source file + * @return the RRD Object (old version) + * @throws IOException Signals that an I/O exception has occurred. + * @throws RrdException the RRD exception + */ + public static RRDv1 dumpJrb(File sourceFile) throws IOException, RrdException { + RrdDb jrb = new RrdDb(sourceFile, true); + RRDv1 rrd = JaxbUtils.unmarshal(RRDv1.class, jrb.getXml()); + jrb.close(); + return rrd; + } + + /** + * Dumps a RRD. + * + * @param sourceFile the source file + * @return the RRD Object + * @throws IOException Signals that an I/O exception has occurred. + * @throws RrdException the RRD exception + */ + public static RRDv3 dumpRrd(File sourceFile) throws IOException, RrdException { + String rrdBinary = System.getProperty("rrd.binary"); + if (rrdBinary == null) { + throw new IllegalArgumentException("rrd.binary property must be set"); + } + String command = rrdBinary + " dump " + sourceFile.getAbsolutePath(); + String[] commandArray = StringUtils.createCommandArray(command, '@'); + RRDv3 rrd = null; + Process process = Runtime.getRuntime().exec(commandArray); + byte[] byteArray = FileCopyUtils.copyToByteArray(process.getInputStream()); + String errors = FileCopyUtils.copyToString(new InputStreamReader(process.getErrorStream())); + if (errors.length() > 0) { + throw new RrdException("RRDtool command fail: " + errors); + } + BufferedReader reader = null; + try { + InputStream is = new ByteArrayInputStream(byteArray); + reader = new BufferedReader(new InputStreamReader(is)); + rrd = JaxbUtils.unmarshal(RRDv3.class, reader); + } finally { + reader.close(); + } + return rrd; + } + + /** + * Restore a JRB. + * + * @param rrd the RRD object (old version) + * @param targetFile the target file + * @throws IOException Signals that an I/O exception has occurred. + * @throws RrdException the RRD exception + */ + public static void restoreJrb(RRDv1 rrd, File targetFile) throws IOException, RrdException { + final File outputXmlFile = new File(targetFile + ".xml"); + JaxbUtils.marshal(rrd, new FileWriter(outputXmlFile)); + RrdDb targetJrb = new RrdDb(targetFile.getCanonicalPath(), RrdDb.PREFIX_XML + outputXmlFile.getAbsolutePath()); + targetJrb.close(); + outputXmlFile.delete(); + } + + /** + * Restores a RRD. + * + * @param rrd the RRD object + * @param targetFile the target file + * @throws IOException Signals that an I/O exception has occurred. + * @throws RrdException the RRD exception + */ + public static void restoreRrd(RRDv3 rrd, File targetFile) throws IOException, RrdException { + String rrdBinary = System.getProperty("rrd.binary"); + if (rrdBinary == null) { + throw new IllegalArgumentException("rrd.binary property must be set"); + } + File xmlDest = new File(targetFile + ".xml"); + JaxbUtils.marshal(rrd, new FileWriter(xmlDest)); + String command = rrdBinary + " restore " + xmlDest.getAbsolutePath() + " " + targetFile.getAbsolutePath(); + String[] commandArray = StringUtils.createCommandArray(command, '@'); + Process process = Runtime.getRuntime().exec(commandArray); + String errors = FileCopyUtils.copyToString(new InputStreamReader(process.getErrorStream())); + if (errors.length() > 0) { + throw new RrdException("RRDtool command fail: " + errors); + } + xmlDest.delete(); + } + + /** + * Convert from RRDtool to JRobin. + * + * @param sourceRrdFile the source RRDtool file + * @param targetJrobinFile the target JRobin file + * @throws IOException Signals that an I/O exception has occurred. + * @throws RrdException the RRD exception + */ + public static void convertFromRrdToJrobin(File sourceRrdFile, File targetJrobinFile) throws IOException, RrdException { + RRDv3 rrd = dumpRrd(sourceRrdFile); + RRDv1 jrb = convert(rrd); + restoreJrb(jrb, targetJrobinFile); + } + + /** + * Convert from JRobin to RRDtool. + * + * @param sourceJrobinFile the source JRobin file + * @param targetRrdFile the target RRDtool file + * @throws IOException Signals that an I/O exception has occurred. + * @throws RrdException the RRD exception + */ + public static void convertFromJrobinToRrd(File sourceJrobinFile, File targetRrdFile) throws IOException, RrdException { + RRDv1 jrb = dumpJrb(sourceJrobinFile); + RRDv3 rrd = convert(jrb); + restoreRrd(rrd, targetRrdFile); + } + + /** + * Converts a JRobin object into an RRDtool object. + * + * @param jrb the source JRobin object representation + * @return the RRDtool object representation + * @throws IllegalArgumentException the illegal argument exception (when the conversion is not possible) + */ + protected static RRDv3 convert(RRDv1 jrb) throws IllegalArgumentException { + RRDv3 rrd = new RRDv3(); + rrd.setStep(jrb.getStep()); + rrd.setLastUpdate(jrb.getLastUpdate()); + for (org.opennms.netmgt.rrd.model.v1.RRA rrav1 : jrb.getRras()) { + org.opennms.netmgt.rrd.model.v3.RRA rrav3 = new org.opennms.netmgt.rrd.model.v3.RRA(); + rrav3.setConsolidationFunction(rrav1.getConsolidationFunction().name()); + rrav3.setPdpPerRow(rrav1.getPdpPerRow()); + rrav3.setRows(rrav1.getRows()); + rrav3.getParameters().setXff(rrav1.getXff()); + for (org.opennms.netmgt.rrd.model.v1.RRADS rradsv1 : rrav1.getDataSources()) { + org.opennms.netmgt.rrd.model.v3.RRADS rradsv3 = new org.opennms.netmgt.rrd.model.v3.RRADS(); + rradsv3.setUnknownDataPoints(rradsv1.getUnknownDataPoints()); + rradsv3.setValue(rradsv1.getValue()); + rrav3.getDataSources().add(rradsv3); + } + rrd.addRRA(rrav3); + } + for (org.opennms.netmgt.rrd.model.v1.DS dsv1 : jrb.getDataSources()) { + org.opennms.netmgt.rrd.model.v3.DS dsv3 = new org.opennms.netmgt.rrd.model.v3.DS(); + dsv3.setName(dsv1.getName()); + dsv3.setLastDs(dsv1.getLastDs()); + dsv3.setMin(dsv1.getMax()); + dsv3.setMax(dsv1.getMax()); + dsv3.setMinHeartbeat(dsv1.getMinHeartbeat()); + dsv3.setUnknownSec(dsv1.getUnknownSec()); + dsv3.setValue(dsv1.getValue()); + dsv3.setType(dsv1.getType().value()); + rrd.addDataSource(dsv3); + } + return rrd; + } + + /** + * Converts a RRDtool object into a JRobin object. + * + * @param rrd the RRDtool object representation + * @return the JRobin object representation + * @throws IllegalArgumentException the illegal argument exception (when the conversion is not possible) + */ + protected static RRDv1 convert(RRDv3 rrd) throws IllegalArgumentException { + RRDv1 jrb = new RRDv1(); + jrb.setStep(rrd.getStep()); + jrb.setLastUpdate(rrd.getLastUpdate()); + for (org.opennms.netmgt.rrd.model.v3.RRA rrav3 : rrd.getRras()) { + org.opennms.netmgt.rrd.model.v1.RRA rrav1 = new org.opennms.netmgt.rrd.model.v1.RRA(); + try { + rrav1.setConsolidationFunction(rrav3.getConsolidationFunction().name()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("RRDv1 doesn't support the consolidation function " + rrav3.getConsolidationFunction().value()); + } + rrav1.setPdpPerRow(rrav3.getPdpPerRow()); + rrav1.setRows(rrav3.getRows()); + rrav1.setXff(rrav3.getParameters().getXff()); + for (org.opennms.netmgt.rrd.model.v3.RRADS rradsv3 : rrav3.getDataSources()) { + org.opennms.netmgt.rrd.model.v1.RRADS rradsv1 = new org.opennms.netmgt.rrd.model.v1.RRADS(); + rradsv1.setUnknownDataPoints(rradsv3.getUnknownDataPoints()); + rradsv1.setValue(rradsv3.getValue()); + rrav1.getDataSources().add(rradsv1); + } + jrb.addRRA(rrav1); + } + for (org.opennms.netmgt.rrd.model.v3.DS dsv3 : rrd.getDataSources()) { + org.opennms.netmgt.rrd.model.v1.DS dsv1 = new org.opennms.netmgt.rrd.model.v1.DS(); + try { + dsv1.setType(dsv3.getType().value()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("RRDv1 doesn't support the data source type " + dsv3.getType().value()); + } + dsv1.setName(dsv3.getName()); + dsv1.setLastDs(dsv3.getLastDs()); + dsv1.setMin(dsv3.getMax()); + dsv1.setMax(dsv3.getMax()); + dsv1.setMinHeartbeat(dsv3.getMinHeartbeat()); + dsv1.setUnknownSec(dsv3.getUnknownSec()); + dsv1.setValue(dsv3.getValue()); + jrb.addDataSource(dsv1); + } + return jrb; + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/RrdXport.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/RrdXport.java new file mode 100644 index 000000000000..537f0f702d26 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/RrdXport.java @@ -0,0 +1,93 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * The Class XPort (the XML representation of the 'rrdtool xport' command). + * + * @author Alejandro Galue + */ +@XmlRootElement(name="xport") +@XmlAccessorType(XmlAccessType.FIELD) +public class RrdXport { + + /** The meta data. */ + @XmlElement(name="meta") + private XMeta meta; + + /** The rows. */ + @XmlElement(name="row") + @XmlElementWrapper(name="data") + private List rows = new ArrayList(); + + /** + * Gets the meta data. + * + * @return the meta data + */ + public XMeta getMeta() { + return meta; + } + + /** + * Sets the meta data. + * + * @param meta the new meta data + */ + public void setMeta(XMeta meta) { + this.meta = meta; + } + + /** + * Gets the rows. + * + * @return the rows + */ + public List getRows() { + return rows; + } + + /** + * Sets the rows. + * + * @param rows the new rows + */ + public void setRows(List rows) { + this.rows = rows; + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/XMeta.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/XMeta.java new file mode 100644 index 000000000000..07564d42b250 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/XMeta.java @@ -0,0 +1,184 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * The Class Meta. + * + * @author Alejandro Galue + */ +@XmlRootElement(name="meta") +@XmlAccessorType(XmlAccessType.FIELD) +public class XMeta { + + /** The start time expressed in seconds since 1970-01-01 UTC. */ + @XmlElement + private Long start; + + /** The end time expressed in seconds since 1970-01-01 UTC. */ + @XmlElement + private Long end; + + /** The step (interval) time expressed in seconds. */ + @XmlElement + private Integer step; + + /** The number of rows. */ + @XmlElement + private Integer rows; + + /** The number of columns. */ + @XmlElement + private Integer columns; + + /** The legend entries. */ + @XmlElement(name="entry") + @XmlElementWrapper(name="legend") + private List legends = new ArrayList(); + + /** + * Gets the start. + *

The start time expressed in seconds since 1970-01-01 UTC.

+ * + * @return the start + */ + public Long getStart() { + return start; + } + + /** + * Sets the start. + * + * @param start the new start + */ + public void setStart(Long start) { + this.start = start; + } + + /** + * Gets the end. + *

The end time expressed in seconds since 1970-01-01 UTC

+ * + * @return the end + */ + public Long getEnd() { + return end; + } + + /** + * Sets the end. + * + * @param end the new end + */ + public void setEnd(Long end) { + this.end = end; + } + + /** + * Gets the step. + *

The step (interval) time expressed in seconds

+ * + * @return the step + */ + public Integer getStep() { + return step; + } + + /** + * Sets the step. + * + * @param step the new step + */ + public void setStep(Integer step) { + this.step = step; + } + + /** + * Gets the rows. + * + * @return the rows + */ + public Integer getRows() { + return rows; + } + + /** + * Sets the rows. + * + * @param rows the new rows + */ + public void setRows(Integer rows) { + this.rows = rows; + } + + /** + * Gets the columns. + * + * @return the columns + */ + public Integer getColumns() { + return columns; + } + + /** + * Sets the columns. + * + * @param columns the new columns + */ + public void setColumns(Integer columns) { + this.columns = columns; + } + + /** + * Gets the legend entries. + * + * @return the legend entries + */ + public List getLegends() { + return legends; + } + + /** + * Sets the legend entries. + * + * @param entries the new legend entries + */ + public void setLegends(List entries) { + this.legends = entries; + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/XRow.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/XRow.java new file mode 100644 index 000000000000..b1291ba04aa3 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/XRow.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * The Class XRow (XPort Row). + * + * @author Alejandro Galue + */ +@XmlRootElement(name="row") +@XmlAccessorType(XmlAccessType.FIELD) +public class XRow extends Row { + + /** The time stamp expressed in seconds since 1970-01-01 UTC. */ + @XmlElement(name="t") + private Long timestamp; + + /** + * Gets the time stamp. + *

Expressed in seconds since 1970-01-01 UTC

+ * + * @return the time stamp + */ + public Long getTimestamp() { + return timestamp; + } + + /** + * Sets the time stamp. + * + * @param timestamp the new time stamp + */ + public void setTimestamp(Long timestamp) { + this.timestamp = timestamp; + } + +} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/ModelImportException.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/CFType.java similarity index 65% rename from opennms-import/src/main/java/org/opennms/netmgt/importer/ModelImportException.java rename to opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/CFType.java index c09e8a8788f0..3e145376bc90 100644 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/ModelImportException.java +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/CFType.java @@ -25,35 +25,41 @@ * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v1; -package org.opennms.netmgt.importer; /** - *

ModelImportException class.

- * - * @author ranger - * @version $Id: $ + * The Enumeration CFType (Consolidation Function Type). */ -public class ModelImportException extends Exception { +public enum CFType { + + /** RRA:AVERAGE:xff:steps:rows. */ + AVERAGE, + + /** RRA:MIN:xff:steps:rows. */ + MIN, - private static final long serialVersionUID = 6520991163434052156L; + /** RRA:MAX:xff:steps:rows. */ + MAX, + + /** RRA:LAST:xff:steps:rows. */ + LAST; /** - *

Constructor for ModelImportException.

+ * Gets the CF Value. * - * @param msg a {@link java.lang.String} object. + * @return the string representation of the consolidation function */ - public ModelImportException(String msg) { - super(msg); + public String value() { + return name(); } - + /** - *

Constructor for ModelImportException.

+ * From value. * - * @param msg a {@link java.lang.String} object. - * @param t a {@link java.lang.Throwable} object. + * @param v the string name of the CF + * @return the consolidation function type */ - public ModelImportException(String msg, Throwable t) { - super(msg, t); + public static CFType fromValue(String v) { + return v == null ? null : valueOf(v.trim()); } - } diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/DS.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/DS.java new file mode 100644 index 000000000000..fb3c54b59b4e --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/DS.java @@ -0,0 +1,99 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v1; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + +import org.opennms.netmgt.rrd.model.AbstractDS; + +/** + * The Class DS (Data Source). + *
    + *
  • ds.decl: name, type, minimal_heartbeat, min, max, last_ds, value, unknown_sec
  • + *
+ * + * @author Alejandro Galue + */ +@XmlRootElement(name="ds") +@XmlAccessorType(XmlAccessType.PROPERTY) +public class DS extends AbstractDS { + + /** The type of the datasource. */ + private DSType type; + + /** + * Gets the type. + * + * @return the type + */ + @XmlElement(required=true) + @XmlJavaTypeAdapter(DSAdapter.class) + public DSType getType() { + return type; + } + + /** + * Sets the type. + * + * @param type the new type + */ + public void setType(DSType type) { + this.type = type; + } + + /** + * Sets the type. + * + * @param type the new type + */ + public void setType(String type) { + this.type = DSType.fromValue(type); + } + + /** + * Format equals. + * + * @param ds the DS object + * @return true, if successful + */ + public boolean formatEquals(DS ds) { + if (this.type != null) { + if (ds.type == null) return false; + else if (!(this.type.equals(ds.type))) + return false; + } + else if (ds.type != null) + return false; + + return super.formatEquals(ds); + } +} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/jmx/ImporterService.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/DSAdapter.java similarity index 61% rename from opennms-import/src/main/java/org/opennms/netmgt/importer/jmx/ImporterService.java rename to opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/DSAdapter.java index 793ba6aa610d..c616b3d02e51 100644 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/jmx/ImporterService.java +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/DSAdapter.java @@ -25,37 +25,32 @@ * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v1; -package org.opennms.netmgt.importer.jmx; - -import org.opennms.netmgt.daemon.AbstractSpringContextJmxServiceDaemon; +import javax.xml.bind.annotation.adapters.XmlAdapter; /** - *

ImporterService class.

- * - * @author ranger - * @version $Id: $ + * The Class DSAdapter. + *

The XML representation sometimes contain spaces when defining the data source.

+ * + * @author Alejandro Galue */ -public class ImporterService extends AbstractSpringContextJmxServiceDaemon implements ImporterServiceMBean { - /** {@inheritDoc} */ - @Override - protected String getLoggingPrefix() { - return org.opennms.netmgt.importer.ImporterService.NAME; - } +public class DSAdapter extends XmlAdapter { - /** {@inheritDoc} */ + /* (non-Javadoc) + * @see javax.xml.bind.annotation.adapters.XmlAdapter#marshal(java.lang.Object) + */ @Override - protected String getSpringContext() { - return "importerDaemonContext"; + public String marshal(DSType type) throws Exception { + return type == null ? null : type.value(); } - /** - *

getStats

- * - * @return a {@link java.lang.String} object. + /* (non-Javadoc) + * @see javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal(java.lang.Object) */ @Override - public String getStats() { - return getDaemon().getStats(); + public DSType unmarshal(String value) throws Exception { + return value == null ? null : DSType.fromValue(value.trim()); } + } diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/DSType.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/DSType.java new file mode 100644 index 000000000000..2cc38e9056f6 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/DSType.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v1; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlType; + +/** + * The Enumeration DSType (Data Source Type). + * + * @author Alejandro Galue + */ +@XmlEnum +@XmlType(name = "type") +public enum DSType { + + /** The gauge data source. */ + GAUGE, + + /** The counter data source. */ + COUNTER, + + /** The derive data source. */ + DERIVE, + + /** The absolute data source. */ + ABSOLUTE; + + /** + * Gets the DS Value. + * + * @return the string representation of the data source + */ + public String value() { + return name(); + } + + /** + * From value. + * + * @param v the string name of the DS + * @return the data source type + */ + public static DSType fromValue(String v) { + return v == null ? null : valueOf(v.trim()); + } +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/RRA.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/RRA.java new file mode 100644 index 000000000000..b4e153102e7d --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/RRA.java @@ -0,0 +1,170 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v1; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; + +import org.opennms.netmgt.rrd.model.AbstractRRA; + +/** + * The Class RRA (Round Robin Archives). + *

Warning: This representation doesn't support Aberrant Behavior Detection with Holt-Winters Forecasting

+ * + * @author Alejandro Galue + */ +@XmlRootElement(name="rra") +@XmlAccessorType(XmlAccessType.PROPERTY) +public class RRA extends AbstractRRA { + + /** The consolidation function. */ + private CFType consolidationFunction; + + /** The CDP Data. */ + private List dataSources = new ArrayList(); + + /** The XFF. */ + private Double xff = 0.5; + + /** + * Gets the consolidation function. + * + * @return the consolidation function + */ + @XmlElement(name="cf") + public CFType getConsolidationFunction() { + return consolidationFunction; + } + + /** + * Sets the consolidation function. + * + * @param consolidationFunction the new consolidation function + */ + public void setConsolidationFunction(CFType consolidationFunction) { + this.consolidationFunction = consolidationFunction; + } + + /** + * Sets the consolidation function. + * + * @param consolidationFunction the new consolidation function + */ + public void setConsolidationFunction(String consolidationFunction) { + this.consolidationFunction = CFType.fromValue(consolidationFunction); + } + + /** + * Gets the data sources. + * + * @return the data sources + */ + @XmlElement(name="ds") + @XmlElementWrapper(name="cdp_prep") + public List getDataSources() { + return dataSources; + } + + /** + * Sets the data sources. + * + * @param dataSources the new data sources + */ + public void setDataSources(List dataSources) { + this.dataSources = dataSources; + } + + /** + * Gets the XFF. + * + *

XFF The xfiles factor defines what part of a consolidation interval may be made up from *UNKNOWN* data while the consolidated + * value is still regarded as known. It is given as the ratio of allowed *UNKNOWN* PDPs to the number of PDPs in the interval. + * Thus, it ranges from 0 to 1 (exclusive).

+ * + * @return the XFF + */ + @XmlElement(name="xff") + public Double getXff() { + return xff; + } + + /** + * Sets the XFF. + * + * @param xff the new XFF + */ + public void setXff(Double xff) { + this.xff = xff; + } + + /** + * Format equals. + * + * @param rra the RRA object + * @return true, if successful + */ + public boolean formatEquals(RRA rra) { + if (this.consolidationFunction != null) { + if (rra.consolidationFunction == null) return false; + else if (!(this.consolidationFunction.equals(rra.consolidationFunction))) + return false; + } + else if (rra.consolidationFunction != null) + return false; + + if (this.xff != null) { + if (rra.xff == null) return false; + else if (!(this.xff.equals(rra.xff))) + return false; + } + else if (rra.xff != null) + return false; + + return super.formatEquals(rra); + } + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRA#createSingleRRA(int) + */ + @Override + protected AbstractRRA createSingleRRA(int dsIndex) throws IllegalArgumentException { + RRA clone = new RRA(); + clone.setConsolidationFunction(getConsolidationFunction()); + clone.setPdpPerRow(getPdpPerRow()); + clone.getDataSources().add(getDataSources().get(dsIndex)); + clone.setXff(getXff()); + return clone; + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/RRADS.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/RRADS.java new file mode 100644 index 000000000000..da41a2dda172 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/RRADS.java @@ -0,0 +1,88 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v1; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * The Class RraDS (RRA CDP Data Source). + * + * @author Alejandro Galue + */ +@XmlRootElement(name="ds") +@XmlAccessorType(XmlAccessType.FIELD) +public class RRADS { + + /** The unknown data points. */ + @XmlElement(name="unknown_datapoints") + private Long unknownDataPoints = 0L; + + /** The value. */ + @XmlElement(name="value") + private Double value; + + /** + * Gets the unknown data points. + * + * @return the unknown data points + */ + public Long getUnknownDataPoints() { + return unknownDataPoints; + } + + /** + * Sets the unknown data points. + * + * @param unknownDataPoints the new unknown data points + */ + public void setUnknownDataPoints(Long unknownDataPoints) { + this.unknownDataPoints = unknownDataPoints; + } + + /** + * Gets the value. + * + * @return the value + */ + public Double getValue() { + return value; + } + + /** + * Sets the value. + * + * @param value the new value + */ + public void setValue(Double value) { + this.value = value; + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/RRDv1.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/RRDv1.java new file mode 100644 index 000000000000..3454b307049d --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v1/RRDv1.java @@ -0,0 +1,138 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v1; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +import org.opennms.netmgt.rrd.model.AbstractDS; +import org.opennms.netmgt.rrd.model.AbstractRRA; +import org.opennms.netmgt.rrd.model.AbstractRRD; + +/** + * The Class RRD (Round Robin Database) version 1 (JRobin). + * + * @author Alejandro Galue + */ +@XmlRootElement(name="rrd") +@XmlAccessorType(XmlAccessType.PROPERTY) +public class RRDv1 extends AbstractRRD { + + /** The Constant VERSION. */ + public static final String VERSION = "0001"; + + /** The RRAs. */ + public List rras = new ArrayList(); + + /** The data sources. */ + public List dataSources = new ArrayList(); + + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRD#getRras() + */ + @XmlElement(name="rra") + public List getRras() { + return rras; + } + + /** + * Sets the RRAs. + * + * @param rras the new RRAs + */ + public void setRras(List rras) { + this.rras = rras; + } + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRD#getDataSources() + */ + @XmlElement(name="ds") + public List getDataSources() { + return dataSources; + } + + /** + * Sets the data sources. + * + * @param dataSources the new data sources + */ + public void setDataSources(List dataSources) { + this.dataSources = dataSources; + } + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRD#getRequiredVersion() + */ + @Override + protected String getRequiredVersion() { + return VERSION; + } + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRD#createRRD() + */ + @Override + protected AbstractRRD createRRD() { + RRDv1 clone = new RRDv1(); + clone.setLastUpdate(getLastUpdate()); + clone.setStep(getStep()); + return clone; + } + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRD#addDataSource(org.opennms.netmgt.rrd.model.AbstractDS) + */ + @Override + public void addDataSource(AbstractDS ds) { + dataSources.add((DS)ds); + } + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRD#getDataSource(int) + */ + @Override + public AbstractDS getDataSource(int index) { + return dataSources.get(index); + } + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRD#addRRA(org.opennms.netmgt.rrd.model.AbstractRRA) + */ + @Override + public void addRRA(AbstractRRA rra) { + rras.add((RRA)rra); + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/CFType.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/CFType.java new file mode 100644 index 000000000000..90082dda49b5 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/CFType.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v3; + +/** + * The Enumeration CFType (Consolidation Function Type). + */ +public enum CFType { + + /** RRA:AVERAGE:xff:steps:rows. */ + AVERAGE, + + /** RRA:MIN:xff:steps:rows. */ + MIN, + + /** RRA:MAX:xff:steps:rows. */ + MAX, + + /** RRA:LAST:xff:steps:rows. */ + LAST, + + /** RRA:HWPREDICT:rows:alpha:beta:seasonal period[:rra-num]. */ + HWPREDICT, + + /** RRA:SEASONAL:seasonal period:gamma:rra-num[:smoothing-window=fraction]. */ + SEASONAL, + + /** RRA:DEVSEASONAL:seasonal period:gamma:rra-num[:smoothing-window=fraction]. */ + DEVSEASONAL, + + /** RRA:DEVPREDICT:rows:rra-num. */ + DEVPREDICT, + + /** RRA:FAILURES:rows:threshold:window length:rra-num. */ + FAILURES; + + /** + * Gets the CF Value. + * + * @return the string representation of the consolidation function + */ + public String value() { + return name(); + } + + /** + * From value. + * + * @param v the string name of the CF + * @return the consolidation function type + */ + public static CFType fromValue(String v) { + return v == null ? null : valueOf(v.trim()); + } +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/DS.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/DS.java new file mode 100644 index 000000000000..b5ab01576ecc --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/DS.java @@ -0,0 +1,131 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v3; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; + +import org.opennms.netmgt.rrd.model.AbstractDS; + +/** + * The Class DS (Data Source). + *
    + *
  • ds.decl.normal: minimal_heartbeat, min, max
  • + *
  • ds.decl.cdef: cdef
  • + *
  • ds.decl: name, type, (ds.decl.normal | ds.decl.cdef), last_ds, value, unknown_sec
  • + *
+ * + * @author Alejandro Galue + */ +@XmlRootElement(name="ds") +@XmlAccessorType(XmlAccessType.PROPERTY) +public class DS extends AbstractDS { + + /** The type of the datasource. */ + private DSType type; + + /** The CDEF (Computed Datasource). */ + private String cdef; + + /** + * Gets the type. + * + * @return the type + */ + @XmlElement(required=true) + @XmlJavaTypeAdapter(DSAdapter.class) + public DSType getType() { + return type; + } + + /** + * Sets the type. + * + * @param type the new type + */ + public void setType(DSType type) { + this.type = type; + } + + /** + * Sets the type. + * + * @param type the new type + */ + public void setType(String type) { + this.type = DSType.fromValue(type); + } + + /** + * Gets the CDEF. + * + * @return the CDEF + */ + public String getCdef() { + return cdef; + } + + /** + * Sets the CDEF. + *

The XML may contain spaces that must be removed.

+ * + * @param cdef the new CDEF + */ + public void setCdef(String cdef) { + this.cdef = cdef == null ? null : cdef.trim(); + } + + /** + * Format equals. + * + * @param ds the DS object + * @return true, if successful + */ + public boolean formatEquals(DS ds) { + if (this.type != null) { + if (ds.type == null) return false; + else if (!(this.type.equals(ds.type))) + return false; + } + else if (ds.type != null) + return false; + + if (this.cdef != null) { + if (ds.cdef == null) return false; + else if (!(this.cdef.equals(ds.cdef))) + return false; + } + else if (ds.cdef != null) + return false; + + return super.formatEquals(ds); + } +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/DSAdapter.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/DSAdapter.java new file mode 100644 index 000000000000..d0ea9803c923 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/DSAdapter.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v3; + +import javax.xml.bind.annotation.adapters.XmlAdapter; + +/** + * The Class DSAdapter. + *

The XML representation sometimes contain spaces when defining the data source.

+ * + * @author Alejandro Galue + */ +public class DSAdapter extends XmlAdapter { + + /* (non-Javadoc) + * @see javax.xml.bind.annotation.adapters.XmlAdapter#marshal(java.lang.Object) + */ + @Override + public String marshal(DSType type) throws Exception { + return type == null ? null : type.value(); + } + + /* (non-Javadoc) + * @see javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal(java.lang.Object) + */ + @Override + public DSType unmarshal(String value) throws Exception { + return value == null ? null : DSType.fromValue(value.trim()); + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/DSType.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/DSType.java new file mode 100644 index 000000000000..d0f0d179b747 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/DSType.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v3; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlType; + +/** + * The Enumeration DSType (Data Source Type). + * + * @author Alejandro Galue + */ +@XmlEnum +@XmlType(name = "type") +public enum DSType { + + /** The gauge data source. */ + GAUGE, + + /** The counter data source. */ + COUNTER, + + /** The derive data source. */ + DERIVE, + + /** The absolute data source. */ + ABSOLUTE, + + /** The compute data source. */ + COMPUTE; + + /** + * Gets the DS Value. + * + * @return the string representation of the data source + */ + public String value() { + return name(); + } + + /** + * From value. + * + * @param v the string name of the DS + * @return the data source type + */ + public static DSType fromValue(String v) { + return v == null ? null : valueOf(v.trim()); + } +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/Parameters.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/Parameters.java new file mode 100644 index 000000000000..3b8419f46e3e --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/Parameters.java @@ -0,0 +1,298 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v3; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * The Class RRA Parameters. + * + *
    + *
  • param.hwpredict: hw_alpha, hw_beta, dependent_rra_idx
  • + *
  • param.seasonal: seasonal_gamma, seasonal_smooth_idx, smoothing_window?, dependent_rra_idx
  • + *
  • param.failures: delta_pos, delta_neg, window_len, failure_threshold
  • + *
  • param.devpredict: dependent_rra_idx
  • + *
  • param.avg_min_max: xff
  • + *
+ * + * @author Alejandro Galue + */ +@XmlRootElement(name="params") +@XmlAccessorType(XmlAccessType.FIELD) +public class Parameters { + + /** The delta negative. */ + @XmlElement(name="delta_neg") + private Double deltaNeg; + + /** The delta position. */ + @XmlElement(name="delta_pos") + private Double deltaPos; + + /** The dependent RRA index. */ + @XmlElement(name="dependent_rra_idx") + private Integer dependentRraIdx; + + /** The failure threshold. */ + @XmlElement(name="failure_threshold") + private Integer failureThreshold; + + /** The hw alpha. */ + @XmlElement(name="hw_alpha") + private Double hwAlpha; + + /** The hw beta. */ + @XmlElement(name="hw_beta") + private Double hwBeta; + + /** The seasonal gamma. */ + @XmlElement(name="seasonal_gamma") + private Double seasonalGamma; + + /** The seasonal smooth index. */ + @XmlElement(name="seasonal_smooth_idx") + private Integer seasonalSmoothIdx; + + /** The failure threshold. */ + @XmlElement(name="smoothing_window") + private Integer smoothingWindow; + + /** The window length. */ + @XmlElement(name="window_len") + private Integer windowLen; + + /** The XFF. */ + @XmlElement(name="xff") + private Double xff = 0.5; + + /** + * Gets the delta negative. + * + * @return the delta negative + */ + public Double getDeltaNeg() { + return deltaNeg; + } + + /** + * Sets the delta negative. + * + * @param deltaNeg the new delta negative + */ + public void setDeltaNeg(Double deltaNeg) { + this.deltaNeg = deltaNeg; + } + + /** + * Gets the delta position. + * + * @return the delta position + */ + public Double getDeltaPos() { + return deltaPos; + } + + /** + * Sets the delta position. + * + * @param deltaPos the new delta position + */ + public void setDeltaPos(Double deltaPos) { + this.deltaPos = deltaPos; + } + + /** + * Gets the dependent RRA index. + * + * @return the dependent RRA index + */ + public Integer getDependentRraIdx() { + return dependentRraIdx; + } + + /** + * Sets the dependent RRA index. + * + * @param dependentRraIdx the new dependent RRA index + */ + public void setDependentRraIdx(Integer dependentRraIdx) { + this.dependentRraIdx = dependentRraIdx; + } + + /** + * Gets the failure threshold. + * + * @return the failure threshold + */ + public Integer getFailureThreshold() { + return failureThreshold; + } + + /** + * Sets the failure threshold. + * + * @param failureThreshold the new failure threshold + */ + public void setFailureThreshold(Integer failureThreshold) { + this.failureThreshold = failureThreshold; + } + + /** + * Gets the hw alpha. + * + * @return the hw alpha + */ + public Double getHwAlpha() { + return hwAlpha; + } + + /** + * Sets the hw alpha. + * + * @param hwAlpha the new hw alpha + */ + public void setHwAlpha(Double hwAlpha) { + this.hwAlpha = hwAlpha; + } + + /** + * Gets the hw beta. + * + * @return the hw beta + */ + public Double getHwBeta() { + return hwBeta; + } + + /** + * Sets the hw beta. + * + * @param hwBeta the new hw beta + */ + public void setHwBeta(Double hwBeta) { + this.hwBeta = hwBeta; + } + + /** + * Gets the seasonal gamma. + * + * @return the seasonal gamma + */ + public Double getSeasonalGamma() { + return seasonalGamma; + } + + /** + * Sets the seasonal gamma. + * + * @param seasonalGamma the new seasonal gamma + */ + public void setSeasonalGamma(Double seasonalGamma) { + this.seasonalGamma = seasonalGamma; + } + + /** + * Gets the seasonal smooth index. + * + * @return the seasonal smooth index + */ + public Integer getSeasonalSmoothIdx() { + return seasonalSmoothIdx; + } + + /** + * Sets the seasonal smooth index. + * + * @param seasonalSmoothIdx the new seasonal smooth index + */ + public void setSeasonalSmoothIdx(Integer seasonalSmoothIdx) { + this.seasonalSmoothIdx = seasonalSmoothIdx; + } + + /** + * Gets the smoothing window. + * + * @return the smoothing window + */ + public Integer getSmoothingWindow() { + return smoothingWindow; + } + + /** + * Sets the smoothing window. + * + * @param smoothingWindow the new smoothing window + */ + public void setSmoothingWindow(Integer smoothingWindow) { + this.smoothingWindow = smoothingWindow; + } + + /** + * Gets the window length. + * + * @return the window length + */ + public Integer getWindowLen() { + return windowLen; + } + + /** + * Sets the window length. + * + * @param windowLen the new window length + */ + public void setWindowLen(Integer windowLen) { + this.windowLen = windowLen; + } + + /** + * Gets the XFF. + * + *

XFF The xfiles factor defines what part of a consolidation interval may be made up from *UNKNOWN* data while the consolidated + * value is still regarded as known. It is given as the ratio of allowed *UNKNOWN* PDPs to the number of PDPs in the interval. + * Thus, it ranges from 0 to 1 (exclusive).

+ * + * @return the XFF + */ + public Double getXff() { + return xff; + } + + /** + * Sets the XFF. + * + * @param xff the new XFF + */ + public void setXff(Double xff) { + this.xff = xff; + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/RRA.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/RRA.java new file mode 100644 index 000000000000..c76df8442161 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/RRA.java @@ -0,0 +1,158 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v3; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; + +import org.opennms.netmgt.rrd.model.AbstractRRA; + +/** + * The Class RRA (Round Robin Archives). + * + * @author Alejandro Galue + */ +@XmlRootElement(name="rra") +@XmlAccessorType(XmlAccessType.PROPERTY) +public class RRA extends AbstractRRA { + + /** The consolidation function. */ + private CFType consolidationFunction; + + /** The parameters. */ + private Parameters parameters = new Parameters(); + + /** The CDP Data. */ + private List dataSources = new ArrayList(); + + /** + * Gets the consolidation function. + * + * @return the consolidation function + */ + @XmlElement(name="cf") + public CFType getConsolidationFunction() { + return consolidationFunction; + } + + /** + * Sets the consolidation function. + * + * @param consolidationFunction the new consolidation function + */ + public void setConsolidationFunction(CFType consolidationFunction) { + this.consolidationFunction = consolidationFunction; + } + + /** + * Sets the consolidation function. + * + * @param consolidationFunction the new consolidation function + */ + public void setConsolidationFunction(String consolidationFunction) { + this.consolidationFunction = CFType.fromValue(consolidationFunction); + } + + /** + * Gets the parameters. + * + * @return the parameters + */ + @XmlElement(name="params") + public Parameters getParameters() { + return parameters; + } + + /** + * Sets the parameters. + * + * @param parameters the new parameters + */ + public void setParameters(Parameters parameters) { + this.parameters = parameters; + } + + /** + * Gets the data sources. + * + * @return the data sources + */ + @XmlElement(name="ds") + @XmlElementWrapper(name="cdp_prep") + public List getDataSources() { + return dataSources; + } + + /** + * Sets the data sources. + * + * @param dataSources the new data sources + */ + public void setDataSources(List dataSources) { + this.dataSources = dataSources; + } + + /** + * Format equals. + * TODO: Check the parameters and the RRA data sources + * + * @param rra the RRA object + * @return true, if successful + */ + public boolean formatEquals(RRA rra) { + if (this.consolidationFunction != null) { + if (rra.consolidationFunction == null) return false; + else if (!(this.consolidationFunction.equals(rra.consolidationFunction))) + return false; + } + else if (rra.consolidationFunction != null) + return false; + + return super.formatEquals(rra); + } + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRA#createSingleRRA(int) + */ + @Override + protected AbstractRRA createSingleRRA(int dsIndex) throws IllegalArgumentException { + RRA clone = new RRA(); + clone.setConsolidationFunction(getConsolidationFunction()); + clone.setPdpPerRow(getPdpPerRow()); + clone.getDataSources().add(getDataSources().get(dsIndex)); + clone.setParameters(getParameters()); + return clone; + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/RRADS.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/RRADS.java new file mode 100644 index 000000000000..34e65ee55005 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/RRADS.java @@ -0,0 +1,360 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v3; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * The Class RraDS (RRA CDP Data Source). + * + *
    + *
  • ds.cdp.hwpredict: intercept, last_intercept, slope, last_slope, nan_count, last_nan_count
  • + *
  • ds.cdp.seasonal: seasonal, last_seasonal, init_flag
  • + *
  • ds.cdp.failures: history
  • + *
  • ds.cdp.avg_min_max: value, unknown_datapoints
  • + *
  • ds.cdp: primary_value, secondary_value, (ds.cdp.hwpredict | ds.cdp.seasonal | ds.cdp.failures | ds.cdp.avg_min_max)?
  • + *
+ * + * @author Alejandro Galue + */ +@XmlRootElement(name="ds") +@XmlAccessorType(XmlAccessType.FIELD) +public class RRADS { + + /** The history. */ + @XmlElement(name="history") + private String history; + + /** The init flag. */ + @XmlElement(name="init_flag") + private Integer initFlag = 1; + + /** The intercept. */ + @XmlElement(name="intercept") + private Double intercept = Double.NaN; + + /** The last intercept. */ + @XmlElement(name="last_intercept") + private Double lastIntercept = Double.NaN; + + /** The last NaN count. */ + @XmlElement(name="last_nan_count") + private Integer lastNanCount = 1; + + /** The last seasonal. */ + @XmlElement(name="last_seasonal") + private Double lastSeasonal = Double.NaN; + + /** The last slope. */ + @XmlElement(name="last_slope") + private Double lastSlope = Double.NaN; + + /** The NaN count. */ + @XmlElement(name="nan_count") + private Integer nanCount = 1; + + /** The primary value. */ + @XmlElement(name="primary_value") + private Double primaryValue = 0.0; + + /** The seasonal. */ + @XmlElement(name="seasonal") + private Double seasonal = Double.NaN; + + /** The secondary value. */ + @XmlElement(name="secondary_value") + private Double secondaryValue = 0.0; + + /** The slope. */ + @XmlElement(name="slope") + private Double slope = Double.NaN; + + /** The unknown data points. */ + @XmlElement(name="unknown_datapoints") + private Long unknownDataPoints = 0L; + + /** The value. */ + @XmlElement(name="value") + private Double value; + + /** + * Gets the history. + * + * @return the history + */ + public String getHistory() { + return history; + } + + /** + * Sets the history. + * + * @param history the new history + */ + public void setHistory(String history) { + this.history = history; + } + + /** + * Gets the inits the flag. + * + * @return the inits the flag + */ + public Integer getInitFlag() { + return initFlag; + } + + /** + * Sets the inits the flag. + * + * @param initFlag the new inits the flag + */ + public void setInitFlag(Integer initFlag) { + this.initFlag = initFlag; + } + + /** + * Gets the intercept. + * + * @return the intercept + */ + public Double getIntercept() { + return intercept; + } + + /** + * Sets the intercept. + * + * @param intercept the new intercept + */ + public void setIntercept(Double intercept) { + this.intercept = intercept; + } + + /** + * Gets the last intercept. + * + * @return the last intercept + */ + public Double getLastIntercept() { + return lastIntercept; + } + + /** + * Sets the last intercept. + * + * @param lastIntercept the new last intercept + */ + public void setLastIntercept(Double lastIntercept) { + this.lastIntercept = lastIntercept; + } + + /** + * Gets the last NaN count. + * + * @return the last NaN count + */ + public Integer getLastNanCount() { + return lastNanCount; + } + + /** + * Sets the last NaN count. + * + * @param lastNanCount the new last NaN count + */ + public void setLastNanCount(Integer lastNanCount) { + this.lastNanCount = lastNanCount; + } + + /** + * Gets the last seasonal. + * + * @return the last seasonal + */ + public Double getLastSeasonal() { + return lastSeasonal; + } + + /** + * Sets the last seasonal. + * + * @param lastSeasonal the new last seasonal + */ + public void setLastSeasonal(Double lastSeasonal) { + this.lastSeasonal = lastSeasonal; + } + + /** + * Gets the last slope. + * + * @return the last slope + */ + public Double getLastSlope() { + return lastSlope; + } + + /** + * Sets the last slope. + * + * @param lastSlope the new last slope + */ + public void setLastSlope(Double lastSlope) { + this.lastSlope = lastSlope; + } + + /** + * Gets the NaN count. + * + * @return the NaN count + */ + public Integer getNanCount() { + return nanCount; + } + + /** + * Sets the NaN count. + * + * @param nanCount the new NaN count + */ + public void setNanCount(Integer nanCount) { + this.nanCount = nanCount; + } + + /** + * Gets the primary value. + * + * @return the primary value + */ + public Double getPrimaryValue() { + return primaryValue; + } + + /** + * Sets the primary value. + * + * @param primaryValue the new primary value + */ + public void setPrimaryValue(Double primaryValue) { + this.primaryValue = primaryValue; + } + + /** + * Gets the seasonal. + * + * @return the seasonal + */ + public Double getSeasonal() { + return seasonal; + } + + /** + * Sets the seasonal. + * + * @param seasonal the new seasonal + */ + public void setSeasonal(Double seasonal) { + this.seasonal = seasonal; + } + + /** + * Gets the secondary value. + * + * @return the secondary value + */ + public Double getSecondaryValue() { + return secondaryValue; + } + + /** + * Sets the secondary value. + * + * @param secondaryValue the new secondary value + */ + public void setSecondaryValue(Double secondaryValue) { + this.secondaryValue = secondaryValue; + } + + /** + * Gets the slope. + * + * @return the slope + */ + public Double getSlope() { + return slope; + } + + /** + * Sets the slope. + * + * @param slope the new slope + */ + public void setSlope(Double slope) { + this.slope = slope; + } + + /** + * Gets the unknown data points. + * + * @return the unknown data points + */ + public Long getUnknownDataPoints() { + return unknownDataPoints; + } + + /** + * Sets the unknown data points. + * + * @param unknownDataPoints the new unknown data points + */ + public void setUnknownDataPoints(Long unknownDataPoints) { + this.unknownDataPoints = unknownDataPoints; + } + + /** + * Gets the value. + * + * @return the value + */ + public Double getValue() { + return value; + } + + /** + * Sets the value. + * + * @param value the new value + */ + public void setValue(Double value) { + this.value = value; + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/RRDv3.java b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/RRDv3.java new file mode 100644 index 000000000000..2c1e7dc2bb0a --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/main/java/org/opennms/netmgt/rrd/model/v3/RRDv3.java @@ -0,0 +1,137 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model.v3; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +import org.opennms.netmgt.rrd.model.AbstractDS; +import org.opennms.netmgt.rrd.model.AbstractRRA; +import org.opennms.netmgt.rrd.model.AbstractRRD; + +/** + * The Class RRD (Round Robin Database) version 3. + * + * @author Alejandro Galue + */ +@XmlRootElement(name="rrd") +@XmlAccessorType(XmlAccessType.PROPERTY) +public class RRDv3 extends AbstractRRD { + + /** The Constant VERSION. */ + public static final String VERSION = "0003"; + + /** The RRAs. */ + public List rras = new ArrayList(); + + /** The data sources. */ + public List dataSources = new ArrayList(); + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRD#getRras() + */ + @XmlElement(name="rra") + public List getRras() { + return rras; + } + + /** + * Sets the RRAs. + * + * @param rras the new RRAs + */ + public void setRras(List rras) { + this.rras = rras; + } + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRD#getDataSources() + */ + @XmlElement(name="ds") + public List getDataSources() { + return dataSources; + } + + /** + * Sets the data sources. + * + * @param dataSources the new data sources + */ + public void setDataSources(List dataSources) { + this.dataSources = dataSources; + } + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRD#getRequiredVersion() + */ + @Override + protected String getRequiredVersion() { + return VERSION; + } + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRD#createRRD() + */ + @Override + protected AbstractRRD createRRD() { + RRDv3 clone = new RRDv3(); + clone.setLastUpdate(getLastUpdate()); + clone.setStep(getStep()); + return clone; + } + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRD#addDataSource(org.opennms.netmgt.rrd.model.AbstractDS) + */ + @Override + public void addDataSource(AbstractDS ds) { + dataSources.add((DS)ds); + } + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRD#getDataSource(int) + */ + @Override + public AbstractDS getDataSource(int index) { + return dataSources.get(index); + } + + /* (non-Javadoc) + * @see org.opennms.netmgt.rrd.model.AbstractRRD#addRRA(org.opennms.netmgt.rrd.model.AbstractRRA) + */ + @Override + public void addRRA(AbstractRRA rra) { + rras.add((RRA)rra); + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/test/java/org/opennms/netmgt/rrd/model/RRDv1Test.java b/opennms-rrd/opennms-rrd-model/src/test/java/org/opennms/netmgt/rrd/model/RRDv1Test.java new file mode 100644 index 000000000000..80989bb4f783 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/test/java/org/opennms/netmgt/rrd/model/RRDv1Test.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model; + +import java.io.File; + +import org.junit.Assert; +import org.junit.Test; +import org.opennms.core.xml.JaxbUtils; +import org.opennms.netmgt.rrd.model.v1.RRDv1; +import org.opennms.netmgt.rrd.model.v1.CFType; +import org.opennms.netmgt.rrd.model.v1.DSType; + +/** + * The Class JRB Parsing Test. + * + * @author Alejandro Galue + */ +public class RRDv1Test { + + /** + * Parses a simple JRB. + * + * @throws Exception the exception + */ + @Test + public void parseJrbSimple() throws Exception { + RRDv1 rrd = JaxbUtils.unmarshal(RRDv1.class, new File("src/test/resources/jrb-dump.xml")); + Assert.assertNotNull(rrd); + Assert.assertEquals(new Long(300), rrd.getStep()); + Assert.assertEquals(new Long(1381503600), rrd.getLastUpdate()); + Assert.assertEquals("temp", rrd.getDataSources().get(0).getName()); + Assert.assertEquals(DSType.GAUGE, rrd.getDataSources().get(0).getType()); + Assert.assertEquals(new Integer(0), rrd.getDataSources().get(0).getUnknownSec()); + + Assert.assertEquals(CFType.AVERAGE, rrd.getRras().get(0).getConsolidationFunction()); + Assert.assertEquals(new Integer(1), rrd.getRras().get(0).getPdpPerRow()); + + Assert.assertEquals(new Integer(1), rrd.getRras().get(0).getPdpPerRow()); + Assert.assertEquals(new Long(1381488900), rrd.getStartTimestamp(rrd.getRras().get(0))); + } + +} diff --git a/opennms-rrd/opennms-rrd-model/src/test/java/org/opennms/netmgt/rrd/model/RRDv3Test.java b/opennms-rrd/opennms-rrd-model/src/test/java/org/opennms/netmgt/rrd/model/RRDv3Test.java new file mode 100644 index 000000000000..4396d40d3a4a --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/test/java/org/opennms/netmgt/rrd/model/RRDv3Test.java @@ -0,0 +1,137 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model; + +import java.io.File; +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; +import org.opennms.core.xml.JaxbUtils; +import org.opennms.netmgt.rrd.model.AbstractRRD; +import org.opennms.netmgt.rrd.model.Row; +import org.opennms.netmgt.rrd.model.v3.CFType; +import org.opennms.netmgt.rrd.model.v3.DSType; +import org.opennms.netmgt.rrd.model.v3.RRA; +import org.opennms.netmgt.rrd.model.v3.RRDv3; + +/** + * The Class RRD Parsing Test. + * + * @author Alejandro Galue + */ +public class RRDv3Test { + + /** + * Parses a simple RRD. + * + * @throws Exception the exception + */ + @Test + public void parseRrdSimple() throws Exception { + RRDv3 rrd = JaxbUtils.unmarshal(RRDv3.class, new File("src/test/resources/rrd-dump.xml")); + Assert.assertNotNull(rrd); + Assert.assertEquals(new Long(300), rrd.getStep()); + Assert.assertEquals(new Long(1233926670), rrd.getLastUpdate()); + Assert.assertEquals("ifInDiscards", rrd.getDataSources().get(0).getName()); + Assert.assertEquals(DSType.COUNTER, rrd.getDataSources().get(0).getType()); + Assert.assertEquals(new Integer(0), rrd.getDataSources().get(0).getUnknownSec()); + + Assert.assertEquals(CFType.AVERAGE, rrd.getRras().get(0).getConsolidationFunction()); + Assert.assertEquals(new Integer(1), rrd.getRras().get(0).getPdpPerRow()); + + Assert.assertEquals(new Integer(1), rrd.getRras().get(0).getPdpPerRow()); + Assert.assertEquals(new Long(1233321900), rrd.getStartTimestamp(rrd.getRras().get(0))); + Assert.assertEquals(new Integer(12), rrd.getRras().get(1).getPdpPerRow()); + Assert.assertEquals(new Long(1228572000), rrd.getStartTimestamp(rrd.getRras().get(1))); + Assert.assertEquals(new Integer(288), rrd.getRras().get(4).getPdpPerRow()); + Assert.assertEquals(new Long(1202342400), rrd.getStartTimestamp(rrd.getRras().get(4))); + } + + /** + * Parses the RRD with computed DS. + * + * @throws Exception the exception + */ + @Test + public void parseRrdWithComputedDs() throws Exception { + RRDv3 rrd = JaxbUtils.unmarshal(RRDv3.class, new File("src/test/resources/rrd-dump-compute-ds.xml")); + Assert.assertNotNull(rrd); + } + + /** + * Parses the RRD with aberrant behavior detection. + * + * @throws Exception the exception + */ + @Test + public void parseRrdWithAberrantBehaviorDetection() throws Exception { + RRDv3 rrd = JaxbUtils.unmarshal(RRDv3.class, new File("src/test/resources/rrd-dump-aberrant-behavior-detection.xml")); + Assert.assertNotNull(rrd); + } + + /** + * Test split and merge + * + * @throws Exception the exception + */ + @Test + public void testSplit() throws Exception { + RRDv3 masterRrd = JaxbUtils.unmarshal(RRDv3.class, new File("src/test/resources/rrd-dump.xml")); + Assert.assertNotNull(masterRrd); + List rrds = masterRrd.split(); + Assert.assertEquals(masterRrd.getDataSources().size(), rrds.size()); + RRA masterRRA = masterRrd.getRras().get(0); + for (int i=0; i + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model; + +import java.io.File; + +import org.junit.Assert; +import org.junit.Test; +import org.opennms.core.xml.JaxbUtils; +import org.opennms.netmgt.rrd.model.RrdConvertUtils; +import org.opennms.netmgt.rrd.model.v1.RRDv1; +import org.opennms.netmgt.rrd.model.v3.RRDv3; + +/** + * The Test Class for RrdConvertUtils. + * + * @author Alejandro Galue + */ +public class RrdConvertUtilsTest { + + /** + * Test JRobin parse. + * + * @throws Exception the exception + */ + @Test + public void testJrobinParse() throws Exception { + RRDv1 jrb = RrdConvertUtils.dumpJrb(new File("src/test/resources/tempA.jrb")); + Assert.assertNotNull(jrb); + + } + + /** + * Test JRobin restore. + * + * @throws Exception the exception + */ + @Test + public void testJrobinRestore() throws Exception { + RRDv1 jrb = RrdConvertUtils.dumpJrb(new File("src/test/resources/tempA.jrb")); + File target = new File("target/tempA-converted.jrb"); + RrdConvertUtils.restoreJrb(jrb, target); + Assert.assertTrue(target.exists()); + } + + /** + * Test convert JRB into RRD. + * + * @throws Exception the exception + */ + @Test + public void testConvertJrbIntoRrd() throws Exception { + RRDv1 jrb = RrdConvertUtils.dumpJrb(new File("src/test/resources/tempA.jrb")); + RRDv3 rrd = RrdConvertUtils.convert(jrb); + Assert.assertNotNull(rrd); + } + + /** + * Test convert RRD into JRB. + * + * @throws Exception the exception + */ + @Test + public void testConvertRrdIntoJrb() throws Exception { + RRDv3 rrd = JaxbUtils.unmarshal(RRDv3.class, new File("src/test/resources/rrd-dump.xml")); + RRDv1 jrb = RrdConvertUtils.convert(rrd); + Assert.assertNotNull(jrb); + } + + /** + * Test convert Advanced RRD into JRB (1). + * + * @throws Exception the exception + */ + @Test(expected=IllegalArgumentException.class) + public void testConvertAdvRrdIntoJrb1() throws Exception { + RRDv3 rrd = JaxbUtils.unmarshal(RRDv3.class, new File("src/test/resources/rrd-dump-compute-ds.xml")); + RRDv1 jrb = RrdConvertUtils.convert(rrd); + Assert.assertNull(jrb); + } + + /** + * Test convert Advanced RRD into JRB (2). + * + * @throws Exception the exception + */ + @Test(expected=IllegalArgumentException.class) + public void testConvertAdvRrdIntoJrb2() throws Exception { + RRDv3 rrd = JaxbUtils.unmarshal(RRDv3.class, new File("src/test/resources/rrd-dump-aberrant-behavior-detection.xml")); + RRDv1 jrb = RrdConvertUtils.convert(rrd); + Assert.assertNull(jrb); + } + +} + diff --git a/opennms-rrd/opennms-rrd-model/src/test/java/org/opennms/netmgt/rrd/model/RrdMergeTest.java b/opennms-rrd/opennms-rrd-model/src/test/java/org/opennms/netmgt/rrd/model/RrdMergeTest.java new file mode 100644 index 000000000000..7c0250453958 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/test/java/org/opennms/netmgt/rrd/model/RrdMergeTest.java @@ -0,0 +1,128 @@ +/******************************************************************************* + * This file is part of OpenNMS(R). + * + * Copyright (C) 2006-2012 The OpenNMS Group, Inc. + * OpenNMS(R) is Copyright (C) 1999-2012 The OpenNMS Group, Inc. + * + * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc. + * + * OpenNMS(R) is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * OpenNMS(R) 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenNMS(R). If not, see: + * http://www.gnu.org/licenses/ + * + * For more information contact: + * OpenNMS(R) Licensing + * http://www.opennms.org/ + * http://www.opennms.com/ + *******************************************************************************/ +package org.opennms.netmgt.rrd.model; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; +import org.opennms.core.xml.JaxbUtils; +import org.opennms.netmgt.rrd.model.Row; +import org.opennms.netmgt.rrd.model.v3.RRDv3; +import org.opennms.netmgt.rrd.model.v3.RRA; + +/** + * The Class RRD Merging Test. + * + * @author Alejandro Galue + */ +public class RrdMergeTest { + + /** + * Test RRD merge. + *

Both test XML contains data from different range of times, and the value is always increasing.

+ * + * @throws Exception the exception + */ + @Test + public void testRrdMerge() throws Exception { + RRDv3 tempA = JaxbUtils.unmarshal(RRDv3.class, new File("src/test/resources/rrd-tempA.xml")); + RRDv3 tempB = JaxbUtils.unmarshal(RRDv3.class, new File("src/test/resources/rrd-tempB.xml")); + + // Retrieve a list of the time stamps of the rows with data from tempA.rrd + // Verify the max value + Double value = Double.NEGATIVE_INFINITY; + List timestampsA = new ArrayList(); + for (RRA rra : tempA.getRras()) { + for (Row row : rra.getRows()) { + if (!row.isNan()) { + timestampsA.add(tempA.findTimestampByRow(rra, row)); + Double current = row.getValues().get(0); + if (current > value) { + value = current; + } + } + } + } + Assert.assertEquals(new Double(3.0), value); + + // Retrieve a list of the time stamps of the rows with data from tempB.rrd + value = Double.NEGATIVE_INFINITY; + List timestampsB = new ArrayList(); + for (RRA rra : tempB.getRras()) { + for (Row row : rra.getRows()) { + if (!row.isNan()) { + timestampsB.add(tempB.findTimestampByRow(rra, row)); + Double current = row.getValues().get(0); + if (current > value) { + value = current; + } + } + } + } + Assert.assertEquals(new Double(18.0), value); + + // Verify that all the timestamps on timestampsA are different than the timestamps from timestampsB + for (Long l : timestampsA) { + if (timestampsB.contains(l)) { + Assert.fail("The timestampsB should not contain any timestamp from timestampsA"); + } + } + for (Long l : timestampsB) { + if (timestampsA.contains(l)) { + Assert.fail("The timestampsA should not contain any timestamp from timestampsB"); + } + } + + // Perform the Merge Operation, merging the data from tempA.rrd to tempB.rrd + tempB.merge(tempA); + + // Retrieve the list of the non NaN rows from the updated tempB.rrd + value = Double.NEGATIVE_INFINITY; + List timestampsFinal = new ArrayList(); + for (RRA rra : tempB.getRras()) { + for (Row row : rra.getRows()) { + if (!row.isNan()) { + timestampsFinal.add(tempB.findTimestampByRow(rra, row)); + Double current = row.getValues().get(0); + if (current > value) { + value = current; + } + } + } + } + Assert.assertEquals(new Double(18.0), value); + + // Verify that timestampsFinal contains timestampsA and timestampsB + Assert.assertTrue(timestampsFinal.containsAll(timestampsA)); + Assert.assertTrue(timestampsFinal.containsAll(timestampsB)); + } + +} diff --git a/opennms-import/src/main/java/org/opennms/netmgt/importer/Main.java b/opennms-rrd/opennms-rrd-model/src/test/java/org/opennms/netmgt/rrd/model/RrdXportTest.java similarity index 53% rename from opennms-import/src/main/java/org/opennms/netmgt/importer/Main.java rename to opennms-rrd/opennms-rrd-model/src/test/java/org/opennms/netmgt/rrd/model/RrdXportTest.java index c67f7e0fa5e6..3d07912a6035 100644 --- a/opennms-import/src/main/java/org/opennms/netmgt/importer/Main.java +++ b/opennms-rrd/opennms-rrd-model/src/test/java/org/opennms/netmgt/rrd/model/RrdXportTest.java @@ -25,40 +25,36 @@ * http://www.opennms.org/ * http://www.opennms.com/ *******************************************************************************/ +package org.opennms.netmgt.rrd.model; -package org.opennms.netmgt.importer; +import java.io.File; -import java.io.IOException; - -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; -import org.springframework.core.io.FileSystemResource; -import org.springframework.core.io.Resource; +import org.junit.Assert; +import org.junit.Test; +import org.opennms.core.xml.JaxbUtils; +import org.opennms.netmgt.rrd.model.RrdXport; /** - *

Main class.

- * - * @author ranger - * @version $Id: $ + * The Class RRD Export Test. + * + * @author Alejandro Galue */ -public class Main { +public class RrdXportTest { /** - *

main

+ * Parses the Xport. * - * @param args an array of {@link java.lang.String} objects. + * @throws Exception the exception */ - public static void main(String[] args) { - try { - ApplicationContext appContext = new ClassPathXmlApplicationContext("/META-INF/modelImport-appContext.xml"); - ModelImporter importer = (ModelImporter)appContext.getBean("modelImporter"); - Resource resource = new FileSystemResource(args[0]); - importer.importModelFromResource(resource); - } catch (ModelImportException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } + @Test + public void parseXport() throws Exception { + RrdXport xport = JaxbUtils.unmarshal(RrdXport.class, new File("src/test/resources/rrd-xport.xml")); + Assert.assertNotNull(xport); + Assert.assertEquals(new Integer(300), xport.getMeta().getStep()); + Assert.assertEquals(new Long(1206312900), xport.getMeta().getStart()); + Assert.assertEquals(new Long(1206316500), xport.getMeta().getEnd()); + Assert.assertEquals("load average 5min", xport.getMeta().getLegends().get(0)); + Assert.assertEquals(new Long(1206312900), xport.getRows().get(0).getTimestamp()); + Assert.assertEquals(new Double(19.86), xport.getRows().get(0).getValues().get(0)); } - } diff --git a/opennms-rrd/opennms-rrd-model/src/test/resources/jrb-dump.xml b/opennms-rrd/opennms-rrd-model/src/test/resources/jrb-dump.xml new file mode 100644 index 000000000000..577db792d3f6 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/test/resources/jrb-dump.xml @@ -0,0 +1,233 @@ + + + 0001 + + 300 + + 1381503600 + + temp + GAUGE + 600 + -2.7300000000E02 + +5.0000000000E03 + + +3.0000000000E00 + +0.0000000000E00 + 0 + + + AVERAGE + + 1 + +5.0000000000E-01 + + + NaN + 0 + + + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + NaN + + + + -1.0000000000E01 + + + + -9.0000000000E00 + + + + -8.0000000000E00 + + + + -7.0000000000E00 + + + + -6.0000000000E00 + + + + -5.0000000000E00 + + + + -4.0000000000E00 + + + + -3.0000000000E00 + + + + -2.0000000000E00 + + + + -1.0000000000E00 + + + + +0.0000000000E00 + + + + +1.0000000000E00 + + + + +2.0000000000E00 + + + + +3.0000000000E00 + + + + diff --git a/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-dump-aberrant-behavior-detection.xml b/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-dump-aberrant-behavior-detection.xml new file mode 100644 index 000000000000..477ddb3192e5 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-dump-aberrant-behavior-detection.xml @@ -0,0 +1,5904 @@ + + + + + 0003 + 300 + 1381497644 + + + ifOutOctets + COUNTER + 1800 + 0.0000000000e+00 + 4.2949672950e+09 + + + U + 0.0000000000e+00 + 44 + + + + + AVERAGE + 1 + + + 5.0000000000e-01 + + + + 0.0000000000e+00 + 0.0000000000e+00 + NaN + 0 + + + + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + + + + HWPREDICT + 1 + + + 1.0000000000e-01 + 3.5000000000e-03 + 2 + + + + 0.0000000000e+00 + 0.0000000000e+00 + NaN + NaN + NaN + NaN + 1 + 1 + + + + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + + + + SEASONAL + 1 + + + 1.0000000000e-01 + 183 + 1 + + + + 0.0000000000e+00 + 0.0000000000e+00 + NaN + NaN + 1 + + + + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + + + + DEVPREDICT + 1 + + + 4 + + + + 0.0000000000e+00 + 0.0000000000e+00 + + + + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + + + + DEVSEASONAL + 1 + + + 1.0000000000e-01 + 183 + 1 + + + + 0.0000000000e+00 + 0.0000000000e+00 + NaN + NaN + 1 + + + + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + + + + FAILURES + 1 + + + 2.0000000000e+00 + 2.0000000000e+00 + 9 + 7 + 4 + + + + 0.0000000000e+00 + 0.0000000000e+00 + 000000000 + + + + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + + + diff --git a/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-dump-compute-ds.xml b/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-dump-compute-ds.xml new file mode 100644 index 000000000000..2544823673fc --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-dump-compute-ds.xml @@ -0,0 +1,2112 @@ + + + + + 0003 + 300 + 1381498605 + + + Total + DERIVE + 1800 + 0.0000000000e+00 + NaN + + + U + 0.0000000000e+00 + 105 + + + + Requests + DERIVE + 1800 + 0.0000000000e+00 + NaN + + + U + 0.0000000000e+00 + 105 + + + + Duration + DERIVE + 1800 + 0.0000000000e+00 + NaN + + + U + 0.0000000000e+00 + 105 + + + + AvgReqDur + COMPUTE + Duration,Requests,0,EQ,1,Requests,IF,/ + + + U + 0.0000000000e+00 + 105 + + + + + AVERAGE + 1 + + + 5.0000000000e-01 + + + + 0.0000000000e+00 + 0.0000000000e+00 + NaN + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + NaN + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + NaN + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + NaN + 0 + + + + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + NaNNaNNaNNaN + + + diff --git a/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-dump.xml b/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-dump.xml new file mode 100644 index 000000000000..77aae9325e5a --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-dump.xml @@ -0,0 +1,8277 @@ + + + + + 0003 + 300 + 1233926670 + + + ifInDiscards + COUNTER + 600 + NaN + NaN + + + 0 + 0.0000000000e+00 + 0 + + + + ifInErrors + COUNTER + 600 + NaN + NaN + + + 0 + 0.0000000000e+00 + 0 + + + + ifInNUcastPkts + COUNTER + 600 + NaN + NaN + + + 275400 + 1.3455149502e+01 + 0 + + + + ifInOctets + COUNTER + 600 + NaN + NaN + + + 2546757961 + 2.5076093023e+05 + 0 + + + + ifInUcastPkts + COUNTER + 600 + NaN + NaN + + + 64073006 + 1.1777740864e+03 + 0 + + + + ifInUnknownProtos + COUNTER + 600 + NaN + NaN + + + 0 + 0.0000000000e+00 + 0 + + + + ifOutDiscards + COUNTER + 600 + NaN + NaN + + + U + NaN + 270 + + + + ifOutErrors + COUNTER + 600 + NaN + NaN + + + 11342 + 0.0000000000e+00 + 0 + + + + ifOutNUcastPkts + COUNTER + 600 + NaN + NaN + + + 0 + 0.0000000000e+00 + 0 + + + + ifOutOctets + COUNTER + 600 + NaN + NaN + + + 236036471 + 7.1537262458e+05 + 0 + + + + ifOutUcastPkts + COUNTER + 600 + NaN + NaN + + + 66227652 + 1.2244186047e+03 + 0 + + + + + AVERAGE + 1 + + + 5.0000000000e-01 + + + + 0.0000000000e+00 + 0.0000000000e+00 + NaN + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + NaN + 0 + + + 1.3026578073e-01 + 1.0047451291e-01 + NaN + 0 + + + 1.0713797231e+03 + 6.9864084144e+02 + NaN + 0 + + + 4.0552934662e+00 + 4.3080632998e+00 + NaN + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + NaN + 0 + + + NaN + NaN + NaN + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + NaN + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + NaN + 0 + + + 2.4367114064e+03 + 4.1542160582e+02 + NaN + 0 + + + 3.9510077519e+00 + 3.6721840622e+00 + NaN + 0 + + + + 0.0000000000e+000.0000000000e+002.0903654485e-013.6984209967e+032.4135813953e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.2926683322e+042.9502059801e+01 + 0.0000000000e+000.0000000000e+001.8571668512e-011.8643690652e+038.1737012551e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4738531225e+038.1421077519e+00 + 0.0000000000e+000.0000000000e+001.8571188630e-011.8037089304e+037.4945711702e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.5142897236e+037.9072388704e+00 + 0.0000000000e+000.0000000000e+001.6621033592e-013.1370907029e+031.8800262163e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5373867776e+042.5811083352e+01 + 0.0000000000e+000.0000000000e+001.7156375046e-012.2276612240e+032.6445861868e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.8248261039e+044.7428429384e+01 + 0.0000000000e+000.0000000000e+001.7802138567e-012.2392590415e+031.9972423489e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6629816440e+043.3561740006e+01 + 0.0000000000e+000.0000000000e+001.6544819720e-011.9089817456e+031.5066147976e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3069874343e+042.4575697277e+01 + 0.0000000000e+000.0000000000e+001.6621111111e-011.8836100444e+031.7565577778e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2275688378e+043.0013033333e+01 + 0.0000000000e+000.0000000000e+001.9715967623e-011.3532118302e+031.5872280868e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1827640281e+042.8803796983e+01 + 0.0000000000e+000.0000000000e+001.5745143488e-011.8949194253e+031.3747630243e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7761348052e+042.1282603017e+01 + 0.0000000000e+000.0000000000e+001.5000000000e-011.9997333333e+031.3450000000e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5464586667e+042.0083333333e+01 + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + 0.0000000000e+000.0000000000e+001.9601328904e-011.1363122924e+031.1089700997e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.6974478405e+041.9116279070e+01 + 0.0000000000e+000.0000000000e+001.8757475083e-015.7531264673e+023.0984053156e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3396861130e+033.9466002215e+00 + 0.0000000000e+000.0000000000e+002.4696185636e-012.1532943992e+031.6424432722e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4690041382e+042.1405268971e+01 + 0.0000000000e+000.0000000000e+002.4231832083e-012.0955165753e+031.9274969271e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4365918164e+042.6257333465e+01 + 0.0000000000e+000.0000000000e+002.7519379845e-011.1705598007e+037.8892580288e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.2155160576e+038.9191583610e+00 + 0.0000000000e+000.0000000000e+002.0741061803e-015.4864328189e+022.4154746870e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.2773178247e+022.0902631405e+00 + 0.0000000000e+000.0000000000e+002.6369680168e-012.1091483460e+032.2705333729e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2932422736e+043.6869759008e+01 + 0.0000000000e+000.0000000000e+001.8963255814e-017.5146236833e+025.9864803987e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1702005454e+048.8862462901e+00 + 0.0000000000e+000.0000000000e+002.5126445183e-018.2013223854e+022.3289016611e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.1786264120e+021.8985820598e+00 + 0.0000000000e+000.0000000000e+002.3111849391e-011.1457900886e+035.3644518272e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.5711644518e+036.3204318937e+00 + 0.0000000000e+000.0000000000e+002.6582502769e-016.6332987818e+022.9081727575e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.8604941307e+033.2787153931e+00 + 0.0000000000e+000.0000000000e+002.3269102990e-011.2544712625e+035.4743189369e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4940591362e+035.1581063123e+00 + 0.0000000000e+000.0000000000e+002.5475083056e-011.2617391141e+035.2295016611e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.2897788261e+034.6347729790e+00 + 0.0000000000e+000.0000000000e+002.8914728682e-015.4979514950e+022.1016500554e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1701527132e+021.8113842746e+00 + 0.0000000000e+000.0000000000e+002.4252491694e-017.6346445183e+022.8279069767e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.8490498339e+022.4146179402e+00 + 0.0000000000e+000.0000000000e+002.1807928685e-011.5072759325e+036.1638228348e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7070690030e+035.7368650855e+00 + 0.0000000000e+000.0000000000e+002.1636534216e-011.4328402510e+034.9774066225e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5622471230e+034.7607573951e+00 + 0.0000000000e+000.0000000000e+002.2193333333e-017.5897990000e+022.7193666667e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6837360000e+022.3822333333e+00 + 0.0000000000e+000.0000000000e+002.3786026490e-013.8062776291e+021.2874430464e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7788306291e+021.0604529801e+00 + 0.0000000000e+000.0000000000e+004.2053973510e-013.6894821486e+021.3041236203e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1797338153e+028.8011368653e-01 + 0.0000000000e+000.0000000000e+005.2744444444e-014.3643361111e+021.5967222222e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1469927778e+021.2111666667e+00 + 0.0000000000e+000.0000000000e+002.7647083795e-019.4930585585e+023.4168071244e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8744526914e+033.0272369878e+00 + 0.0000000000e+000.0000000000e+002.7003322259e-011.4258217940e+033.5926910299e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6142691030e+033.1914285714e+00 + 0.0000000000e+000.0000000000e+002.4318482835e-019.6226886124e+024.5832685124e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3266141501e+034.3614566630e+00 + 0.0000000000e+000.0000000000e+002.3456710963e-011.5116639627e+036.0495775563e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5129626827e+035.3046119970e+00 + 0.0000000000e+000.0000000000e+001.8235511259e-016.8200227065e+022.5112224437e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.3394566172e+022.0883546696e+00 + 0.0000000000e+000.0000000000e+002.2533038021e-014.6171417453e+021.7662194168e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.9952307582e+021.4818003691e+00 + 0.0000000000e+000.0000000000e+002.5465490308e-011.8460953720e+033.9229883831e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.2007431658e+033.4875721106e+00 + 0.0000000000e+000.0000000000e+002.4178138337e-018.2091840898e+022.0346366446e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.4476800280e+021.7301719647e+00 + 0.0000000000e+000.0000000000e+002.2338652639e-017.5320402628e+022.6541357697e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.6684305065e+022.2297863787e+00 + 0.0000000000e+000.0000000000e+002.6653186949e-018.9545733295e+023.2547706321e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8613642446e+032.9990262040e+00 + 0.0000000000e+000.0000000000e+002.5212815266e-016.4357509230e+022.9558273745e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0023874941e+032.6197667085e+00 + 0.0000000000e+000.0000000000e+001.9063122924e-016.2907712625e+022.6301328904e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2494909551e+032.4112873754e+00 + 0.0000000000e+000.0000000000e+001.8488962472e-017.3921708609e+024.2285761589e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3820141336e+033.7779746137e+00 + 0.0000000000e+000.0000000000e+001.8472148639e-016.4095832502e+023.0839460633e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3563431998e+032.6612476085e+00 + 0.0000000000e+000.0000000000e+001.7053285345e-017.3845456120e+023.2955730159e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5809975255e+033.3091692506e+00 + 0.0000000000e+000.0000000000e+001.6815625619e-012.7803990627e+021.4284389782e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0691437339e+031.5065147081e+00 + 0.0000000000e+000.0000000000e+001.3274075378e-014.6050908598e+022.8308522731e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5200272235e+022.5063313605e+00 + 0.0000000000e+000.0000000000e+002.3358803987e-011.1149916279e+037.8224252492e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1603901993e+036.9143853821e+00 + 0.0000000000e+000.0000000000e+001.5958732114e-011.2628063943e+036.5505635373e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1406095507e+035.6027711161e+00 + 0.0000000000e+000.0000000000e+001.5725033113e-019.3837641325e+025.1242913907e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9126076821e+024.3681059603e+00 + 0.0000000000e+000.0000000000e+001.1333333333e-018.1244746667e+024.9737333333e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8461293333e+024.2713333333e+00 + 0.0000000000e+000.0000000000e+001.3284119601e-013.3800380111e+022.0924637874e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0841384629e+021.7926733112e+00 + 0.0000000000e+000.0000000000e+001.1402547065e-014.6149766556e+022.3899695460e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8620439426e+032.5382155777e+00 + 0.0000000000e+000.0000000000e+001.2833333333e-012.0922552381e+021.1691666667e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.6272756349e+021.1771111111e+00 + 0.0000000000e+000.0000000000e+001.1608888889e-016.0135631746e+014.4957777778e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2145380952e+013.6822222222e-01 + 0.0000000000e+000.0000000000e+001.0404400148e-012.0994693747e+021.1508762643e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6027454153e+021.0198840901e+00 + 0.0000000000e+000.0000000000e+001.1478405316e-012.1937475083e+021.2653820598e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.5894385382e+021.1219933555e+00 + 0.0000000000e+000.0000000000e+001.4073089701e-013.4099805094e+022.0975415282e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2673984053e+031.9415725360e+00 + 0.0000000000e+000.0000000000e+001.1887754578e-014.1614523766e+022.0351543787e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.2948471368e+021.7679414828e+00 + 0.0000000000e+000.0000000000e+001.2472156828e-012.6554403145e+021.2835942370e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1887393526e+029.4384146297e-01 + 0.0000000000e+000.0000000000e+001.2598006645e-011.4561266888e+028.6148394241e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2007140642e+025.8303433001e-01 + 0.0000000000e+000.0000000000e+001.2980066445e-011.2944262458e+028.3906976744e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1670036545e+025.9322259136e-01 + 0.0000000000e+000.0000000000e+001.0343898117e-011.3395837204e+038.9455422665e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0757462823e+041.0411221262e+01 + 0.0000000000e+000.0000000000e+001.3770166113e-011.1657468333e+037.3324643780e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.9688659589e+038.1276713178e+00 + 0.0000000000e+000.0000000000e+001.3222591362e-013.5678881506e+022.1326135105e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4963883721e+032.0089700997e+00 + 0.0000000000e+000.0000000000e+001.2893909192e-011.9757610720e+021.1676332226e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1133475792e+029.0189191584e-01 + 0.0000000000e+000.0000000000e+001.2880000000e-013.8217240000e+022.1564000000e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0466990667e+031.9228000000e+00 + 0.0000000000e+000.0000000000e+001.0808300221e-012.5384112141e+021.5320264901e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4034133863e+021.2746207506e+00 + 0.0000000000e+000.0000000000e+001.0179695350e-011.4364782432e+021.0105958798e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2523708485e+026.5129641445e-01 + 0.0000000000e+000.0000000000e+001.0521594684e-011.4144933555e+029.8112956811e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3178737542e+026.5813953488e-01 + 0.0000000000e+000.0000000000e+001.2594515706e-011.3809277390e+029.2381539093e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2670452429e+026.4314683212e-01 + 0.0000000000e+000.0000000000e+001.2071043541e-011.3346392599e+028.8177707861e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1547874260e+026.1398495083e-01 + 0.0000000000e+000.0000000000e+001.1977072721e-016.5814410772e+023.4213444814e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6119361453e+032.8518670727e+00 + 0.0000000000e+000.0000000000e+001.2960911776e-014.0164619129e+022.1512025840e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.8854232643e+021.7434928387e+00 + 0.0000000000e+000.0000000000e+001.2882421558e-011.2095640871e+027.8153074935e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.9135884681e+015.5051827243e-01 + 0.0000000000e+000.0000000000e+001.0902739018e-012.6006997003e+021.4608723514e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6525196693e+021.1109767442e+00 + 0.0000000000e+000.0000000000e+001.2498273083e-014.3242127178e+022.2151047663e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.2882278379e+021.7050694604e+00 + 0.0000000000e+000.0000000000e+001.1960396040e-014.9837069307e+022.4574257426e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.8215498350e+022.0062046205e+00 + 0.0000000000e+000.0000000000e+001.2940887181e-014.2848517229e+022.3064007947e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0922066852e+031.9965189118e+00 + 0.0000000000e+000.0000000000e+001.0713678276e-017.7425121935e+029.0174495904e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1001393458e+041.4946880428e+01 + 0.0000000000e+000.0000000000e+001.2585258526e-011.8394001980e+032.3964598460e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.1914960220e+044.2513113311e+01 + 0.0000000000e+000.0000000000e+001.5151721093e-011.1868350848e+031.4510583529e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6180042474e+042.5233087401e+01 + 0.0000000000e+000.0000000000e+001.4968190898e-011.9709065775e+021.6559071203e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.6375716519e+032.2755594638e+00 + 0.0000000000e+000.0000000000e+001.2202420242e-016.9477579758e+014.2490649065e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.5293905391e+013.4283828383e-01 + 0.0000000000e+000.0000000000e+009.3014301430e-021.1387568757e+027.3330033003e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5536369637e+015.6982398240e-01 + 0.0000000000e+000.0000000000e+004.7428709976e-021.2847872843e+028.7015140988e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6456823070e+016.5671248046e-01 + 0.0000000000e+000.0000000000e+003.4298462741e-021.4515435188e+029.6445805107e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0886508012e+027.6041623241e-01 + 0.0000000000e+000.0000000000e+006.5247524752e-023.7835155116e+022.2847524752e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.2589950495e+021.8857755776e+00 + 0.0000000000e+000.0000000000e+006.3677696717e-025.5154789083e+023.2523684211e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0912377019e+022.7184353830e+00 + 0.0000000000e+000.0000000000e+003.1030774130e-025.3487568453e+023.1561904348e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0223237942e+022.6452719877e+00 + 0.0000000000e+000.0000000000e+004.4345434543e-025.3780628163e+023.1615401540e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0178979098e+022.6400660066e+00 + 0.0000000000e+000.0000000000e+004.6970282555e-025.3134307770e+023.1189799375e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.9848125065e+022.6112628829e+00 + 0.0000000000e+000.0000000000e+002.4283842858e-025.1739430404e+023.0570596665e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.9193925540e+022.5580110445e+00 + 0.0000000000e+000.0000000000e+004.0649064906e-024.7753222222e+022.8231133113e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7022029703e+022.3535753575e+00 + 0.0000000000e+000.0000000000e+005.5396039604e-022.5966312286e+021.5499586011e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5541860547e+021.2808039488e+00 + 0.0000000000e+000.0000000000e+004.5165016502e-025.2251277575e+013.4455184992e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6491350530e+012.7498262984e-01 + 0.0000000000e+000.0000000000e+003.3036303630e-024.7019009901e+013.2957095710e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3793597360e+012.6498349835e-01 + 0.0000000000e+000.0000000000e+004.8903943026e-024.7278045857e+013.2734649123e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3926324040e+012.6749001216e-01 + 0.0000000000e+000.0000000000e+004.7333680736e-024.7297025650e+013.2487573099e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3172575850e+012.6216895374e-01 + 0.0000000000e+000.0000000000e+003.0440044004e-024.6418767877e+013.3595159516e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4733619362e+012.6858085809e-01 + 0.0000000000e+000.0000000000e+004.1919257715e-024.7390609982e+013.3441390192e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5628410052e+012.6999580221e-01 + 0.0000000000e+000.0000000000e+005.6463580569e-024.8092624341e+013.3098763824e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2731501940e+012.6222642001e-01 + 0.0000000000e+000.0000000000e+002.3993399340e-024.5435577558e+013.3273927393e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3288569857e+012.6883388339e-01 + 0.0000000000e+000.0000000000e+003.3556177986e-024.5949517399e+013.2208449134e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2416638730e+012.5847917029e-01 + 0.0000000000e+000.0000000000e+003.2175395171e-024.5250570610e+013.2826754386e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2814802414e+012.6450212784e-01 + 0.0000000000e+000.0000000000e+005.0726072607e-024.7831386139e+013.3660066007e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3900429043e+012.6508250825e-01 + 0.0000000000e+000.0000000000e+003.3743269064e-024.8478481848e+013.3655723467e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5387180823e+012.6837589022e-01 + 0.0000000000e+000.0000000000e+005.0404145678e-022.2854733773e+021.4349939204e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4877939783e+021.2173226796e+00 + 0.0000000000e+000.0000000000e+005.2805280528e-027.3474708471e+024.5281628163e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4189185919e+023.8760506051e+00 + 0.0000000000e+000.0000000000e+004.5211626426e-029.5863250738e+025.9091020352e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7112773421e+025.0457056627e+00 + 0.0000000000e+000.0000000000e+003.6262520989e-029.4902111198e+025.8833182068e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6662793136e+025.0305759655e+00 + 0.0000000000e+000.0000000000e+005.1408140814e-029.3050420242e+025.7835973597e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.5534585259e+024.9235973597e+00 + 0.0000000000e+000.0000000000e+002.6452145215e-029.5484108911e+025.9410011001e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7040801430e+025.0588091309e+00 + 0.0000000000e+000.0000000000e+003.7376237624e-029.6418029703e+025.9864356436e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7361242574e+025.0922029703e+00 + 0.0000000000e+000.0000000000e+002.4323432343e-028.6993458746e+025.4146534653e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2088663366e+024.6086798680e+00 + 0.0000000000e+000.0000000000e+005.9528400208e-025.1923882165e+023.2434503648e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1540475638e+022.7464636529e+00 + 0.0000000000e+000.0000000000e+001.7259278559e-024.5491178348e+013.4177515778e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4369325025e+012.8047804123e-01 + 0.0000000000e+000.0000000000e+003.7546754675e-024.9165203520e+013.5702970297e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5626204620e+012.8772277228e-01 + 0.0000000000e+000.0000000000e+005.3000984309e-025.1438245325e+013.7270829715e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6244952811e+013.0282988825e-01 + 0.0000000000e+000.0000000000e+003.7208036593e-024.9318245325e+013.7077905159e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6137841468e+013.0008540328e-01 + 0.0000000000e+000.0000000000e+003.0715071507e-025.0485665567e+013.6687568757e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6744158416e+013.0201320132e-01 + 0.0000000000e+000.0000000000e+005.0256716461e-025.0045716302e+013.6642420821e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5531508888e+012.9257244803e-01 + 0.0000000000e+000.0000000000e+003.5738883099e-024.9929432213e+013.5531396561e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6148909154e+012.9186099531e-01 + 0.0000000000e+000.0000000000e+003.2574257426e-025.6536435644e+014.0462046205e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0392013201e+013.3488448845e-01 + 0.0000000000e+000.0000000000e+003.4822824388e-026.4446478635e+014.4646908112e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4897323259e+013.7546942852e-01 + 0.0000000000e+000.0000000000e+007.0281686063e-025.9410650078e+014.4430099589e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4090707544e+013.8612573099e-01 + 0.0000000000e+000.0000000000e+005.3124312431e-021.3250985699e+021.2826622662e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3259644664e+021.2309240924e+00 + 0.0000000000e+000.0000000000e+005.5804527821e-025.0745260480e+013.4672094841e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4503065109e+012.7413438712e-01 + 0.0000000000e+000.0000000000e+005.2160268658e-024.7654684515e+013.4901062475e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3852336431e+012.7662468878e-01 + 0.0000000000e+000.0000000000e+004.4741474147e-024.8236578658e+013.5334433443e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4212211221e+012.8031903190e-01 + 0.0000000000e+000.0000000000e+002.4852643159e-024.8620732442e+013.5672398819e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4161373400e+012.7717908633e-01 + 0.0000000000e+000.0000000000e+005.6192461351e-025.5471401772e+013.6056974118e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8006239361e+012.7569220080e-01 + 0.0000000000e+000.0000000000e+006.1914191419e-024.9524851485e+013.2983498350e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3375280528e+012.6042904290e-01 + 0.0000000000e+000.0000000000e+003.6103873545e-024.5379733585e+013.2334527532e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1984730111e+012.5100594928e-01 + 0.0000000000e+000.0000000000e+004.4632331654e-024.6690743768e+013.2791482109e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3141699851e+012.6196127179e-01 + 0.0000000000e+000.0000000000e+004.4632331654e-024.6690743768e+013.2791482109e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3141699851e+012.6196127179e-01 + 0.0000000000e+000.0000000000e+002.6523652365e-024.8241199120e+013.5308030803e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8098283828e+012.8376237624e-01 + 0.0000000000e+000.0000000000e+003.9299403625e-024.6107817729e+013.2277864629e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1903031382e+012.5045104510e-01 + 0.0000000000e+000.0000000000e+004.9237450061e-024.6769850038e+013.2661629321e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3299377859e+012.5401540154e-01 + 0.0000000000e+000.0000000000e+004.3146314631e-024.8178140814e+013.3309130913e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2389317932e+012.5730473047e-01 + 0.0000000000e+000.0000000000e+001.1410094957e-024.4595715289e+013.4169590643e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2972948946e+012.6602635921e-01 + 0.0000000000e+000.0000000000e+003.1615207573e-024.5960907374e+013.3696195935e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2671352484e+012.6106935036e-01 + 0.0000000000e+000.0000000000e+005.1419141914e-024.6964851485e+013.1514851485e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2189768977e+012.5458745875e-01 + 0.0000000000e+000.0000000000e+003.1461264548e-021.6509250869e+021.0146877714e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0658490924e+028.5256687511e-01 + 0.0000000000e+000.0000000000e+002.6701551734e-025.8597117278e+013.8765546291e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9840514301e+013.2082146373e-01 + 0.0000000000e+000.0000000000e+006.4873487349e-024.6917876788e+013.1683168317e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1842178218e+012.4888888889e-01 + 0.0000000000e+000.0000000000e+002.5354785479e-024.6344720847e+013.2757425743e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3352724147e+012.6138613861e-01 + 0.0000000000e+000.0000000000e+002.8440594059e-024.4728073432e+013.1548404840e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2455273652e+012.4662266227e-01 + 0.0000000000e+000.0000000000e+002.9702970297e-024.8898547855e+013.4487348735e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8072079208e+012.6986798680e-01 + 0.0000000000e+000.0000000000e+005.4882751433e-024.7099760292e+013.2078281512e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2365081350e+012.4789531585e-01 + 0.0000000000e+000.0000000000e+004.0069710701e-025.8167765772e+013.6483095155e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2495918438e+012.8649703730e-01 + 0.0000000000e+000.0000000000e+004.7598879379e-024.9935017931e+013.3367986036e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4303631017e+012.5952674309e-01 + 0.0000000000e+000.0000000000e+004.7076411960e-024.5203322259e+013.1455149502e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1574086379e+012.4421926910e-01 + 0.0000000000e+000.0000000000e+004.6384311310e-024.7169430229e+013.1964943932e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1735704238e+012.4733566552e-01 + 0.0000000000e+000.0000000000e+001.9241380828e-024.3899650613e+013.1934280874e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1666698863e+012.4629667114e-01 + 0.0000000000e+000.0000000000e+006.4839424142e-024.6900166113e+013.2165005537e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1882059801e+012.4856035437e-01 + 0.0000000000e+000.0000000000e+003.5808819755e-024.6923869809e+013.2139124185e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2615722573e+012.5119153961e-01 + 0.0000000000e+000.0000000000e+003.1920969836e-024.5463450236e+013.3009270056e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2259039332e+012.5233005508e-01 + 0.0000000000e+000.0000000000e+003.3311554079e-024.8812384348e+013.3847109635e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4642977372e+012.6655669989e-01 + 0.0000000000e+000.0000000000e+005.9933185677e-024.7743152750e+013.2841705426e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2669835474e+012.5593499446e-01 + 0.0000000000e+000.0000000000e+002.9289036545e-026.3457825028e+016.0378294574e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.9265797564e+027.7049833887e-01 + 0.0000000000e+000.0000000000e+003.6000000000e-025.0056000000e+013.8533333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.2948400000e+023.7733333333e-01 + 0.0000000000e+000.0000000000e+004.5086092715e-024.5472441501e+013.1432229581e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1997717439e+012.4800883002e-01 + 0.0000000000e+000.0000000000e+004.3844139843e-024.7421418964e+013.3121258792e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2672499615e+012.5954155757e-01 + 0.0000000000e+000.0000000000e+003.5315614618e-025.1993255814e+013.3817275748e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6681528239e+012.6508305648e-01 + 0.0000000000e+000.0000000000e+005.1370046864e-024.8529320807e+013.1193915792e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2901733735e+012.4945927116e-01 + 0.0000000000e+000.0000000000e+003.8384105960e-024.4577362914e+013.0881986755e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1581654305e+012.4370728477e-01 + 0.0000000000e+000.0000000000e+003.5933333333e-024.6046000000e+013.2300000000e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4114266667e+012.5893333333e-01 + 0.0000000000e+000.0000000000e+002.8728918322e-024.6487211038e+013.1723090508e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3611805298e+012.5939028698e-01 + 0.0000000000e+000.0000000000e+005.4497264296e-024.6779774441e+013.1887118513e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2974018024e+012.5506669872e-01 + 0.0000000000e+000.0000000000e+003.7513751375e-024.5299097910e+013.0249724972e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2207590759e+012.4404840484e-01 + 0.0000000000e+000.0000000000e+003.4585504603e-024.3852520120e+012.9877171270e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0896444691e+012.3537092525e-01 + 0.0000000000e+000.0000000000e+004.6041558103e-024.5951286260e+013.1472663714e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3219077862e+012.5610322216e-01 + 0.0000000000e+000.0000000000e+004.2277227723e-024.5083300330e+013.0326732673e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1829570957e+012.4475247525e-01 + 0.0000000000e+000.0000000000e+002.2931214174e-024.3509887094e+013.0816831683e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1123390655e+012.3942939031e-01 + 0.0000000000e+000.0000000000e+003.5143593307e-024.4982874182e+013.0623212321e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1380547739e+012.4302385502e-01 + 0.0000000000e+000.0000000000e+004.2904290429e-024.4646842684e+013.0822882288e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1393069307e+012.4422442244e-01 + 0.0000000000e+000.0000000000e+004.9583695212e-024.5791993660e+013.0275396619e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1088904884e+012.4141400324e-01 + 0.0000000000e+000.0000000000e+002.3903945911e-024.3057954916e+012.9687700356e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0947914044e+012.3726911756e-01 + 0.0000000000e+000.0000000000e+005.4485049834e-025.4985780731e+013.5578073090e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8519435216e+012.8485049834e-01 + 0.0000000000e+000.0000000000e+004.1026208933e-025.1392565522e+013.3734957549e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5895275009e+012.6743447767e-01 + 0.0000000000e+000.0000000000e+002.7645327447e-024.3964113319e+013.0532744665e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1574429728e+012.4116261957e-01 + 0.0000000000e+000.0000000000e+003.6444742690e-024.5181261358e+013.0637059691e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2500926492e+012.4989681195e-01 + 0.0000000000e+000.0000000000e+004.6411960133e-024.5463798450e+013.0460686600e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2199069767e+012.4926910299e-01 + 0.0000000000e+000.0000000000e+002.8092524550e-024.4470569331e+013.0816160994e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3159496014e+012.5396874290e-01 + 0.0000000000e+000.0000000000e+002.9561000736e-024.5231057542e+013.1475570272e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2615211332e+012.5076938926e-01 + 0.0000000000e+000.0000000000e+004.3033074935e-024.5460776227e+013.0739276486e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1887673606e+012.4613672942e-01 + 0.0000000000e+000.0000000000e+004.0021818368e-024.4775737974e+013.0168155449e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1320878859e+012.4106297625e-01 + 0.0000000000e+000.0000000000e+002.1694682185e-024.3141914296e+013.0619219966e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0963130001e+012.3679970371e-01 + 0.0000000000e+000.0000000000e+005.7650424511e-024.7214549280e+013.1384459210e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1723295312e+012.4482281285e-01 + 0.0000000000e+000.0000000000e+003.8944076527e-024.4959540839e+013.0904709345e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1433541575e+012.4266004415e-01 + 0.0000000000e+000.0000000000e+003.6174048242e-024.6108401575e+013.1984364114e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3412133213e+012.5556254721e-01 + 0.0000000000e+000.0000000000e+003.3315208564e-024.6771135364e+013.2127593208e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3182558546e+012.5594407530e-01 + 0.0000000000e+000.0000000000e+004.8005224430e-024.5271114275e+013.0916740250e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1445275129e+012.4277593819e-01 + 0.0000000000e+000.0000000000e+003.8458083064e-024.5679887681e+013.1345478281e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2464060013e+012.4914266646e-01 + 0.0000000000e+000.0000000000e+004.7707641196e-025.1108970100e+013.2097452935e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5760221484e+012.5785160576e-01 + 0.0000000000e+000.0000000000e+005.8955688544e-025.1586175332e+013.4180689094e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8050972366e+012.7477173220e-01 + 0.0000000000e+000.0000000000e+005.2395363505e-024.7860159109e+013.3096165834e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4861929074e+012.6729914267e-01 + 0.0000000000e+000.0000000000e+003.7873754153e-024.5543521595e+013.1162790698e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2349501661e+012.5182724252e-01 + 0.0000000000e+000.0000000000e+005.1574149450e-021.7426246720e+021.0413508320e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1008457368e+028.7695529251e-01 + 0.0000000000e+000.0000000000e+005.4685651214e-026.6684819360e+023.8965671082e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6963971104e+023.2711430464e+00 + 0.0000000000e+000.0000000000e+003.4814396456e-029.4555529712e+025.5258140642e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1637537198e+024.6269847176e+00 + 0.0000000000e+000.0000000000e+004.0124676391e-029.3332103467e+025.4706431102e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1016150638e+024.5662320594e+00 + 0.0000000000e+000.0000000000e+004.9764581637e-029.4878387120e+025.5708851290e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1886525995e+024.6387291809e+00 + 0.0000000000e+000.0000000000e+005.1749723145e-029.5163356589e+025.5738981174e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1980724252e+024.6543853821e+00 + 0.0000000000e+000.0000000000e+003.0299003322e-029.4368066445e+025.5259357697e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1722901440e+024.6327353267e+00 + 0.0000000000e+000.0000000000e+004.7375415282e-029.3651295681e+025.4790365449e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1311029900e+024.5924584718e+00 + 0.0000000000e+000.0000000000e+004.1085271318e-029.3253986711e+025.4676633444e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0989789590e+024.5632336656e+00 + 0.0000000000e+000.0000000000e+003.9069767442e-029.4887653378e+025.5848504983e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1933491694e+024.6496124031e+00 + 0.0000000000e+000.0000000000e+004.7176079734e-029.5814312292e+025.6209966777e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2657328904e+024.6722923588e+00 + 0.0000000000e+000.0000000000e+005.6641085271e-029.5746466382e+025.6032100775e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2598691499e+024.6716919897e+00 + 0.0000000000e+000.0000000000e+004.2092935982e-029.5361901450e+025.5911618102e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2240793767e+024.6778744665e+00 + 0.0000000000e+000.0000000000e+002.9040065125e-029.4258696398e+025.5260489318e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1668545742e+024.6284069657e+00 + 0.0000000000e+000.0000000000e+004.5625692137e-029.4667619048e+025.5359025471e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1834777409e+024.6452270210e+00 + 0.0000000000e+000.0000000000e+005.1441306755e-021.1278569866e+035.7403089332e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8559019749e+024.7924804356e+00 + 0.0000000000e+000.0000000000e+003.9079180509e-021.0995838661e+035.7144308232e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7601274825e+024.7752382798e+00 + 0.0000000000e+000.0000000000e+003.8870431894e-029.4309189369e+025.5242524917e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1741435216e+024.6359468439e+00 + 0.0000000000e+000.0000000000e+003.7596899225e-026.3792825028e+023.7774750831e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5663136213e+023.1594130676e+00 + 0.0000000000e+000.0000000000e+003.8677550182e-022.0617205195e+021.2700138611e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2865421223e+021.0568304328e+00 + 0.0000000000e+000.0000000000e+002.7191774292e-024.8670749818e+013.5630950547e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5705245136e+012.9135339890e-01 + 0.0000000000e+000.0000000000e+003.9523809524e-024.8397918051e+013.5563676633e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5940586932e+012.9108527132e-01 + 0.0000000000e+000.0000000000e+004.5668522145e-024.9662744934e+013.4957690700e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5775713186e+012.8471364766e-01 + 0.0000000000e+000.0000000000e+002.9946095795e-024.7570643770e+013.3993582833e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4399668874e+012.7369166795e-01 + 0.0000000000e+000.0000000000e+004.0000000000e-024.7565847176e+013.4056478405e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4307740864e+012.7744186047e-01 + 0.0000000000e+000.0000000000e+004.1400482571e-024.7407769539e+013.3826318453e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3851883860e+012.7356845834e-01 + 0.0000000000e+000.0000000000e+002.9839827507e-024.7861444193e+013.5160392511e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4230253460e+012.8028536226e-01 + 0.0000000000e+000.0000000000e+002.8205980066e-024.8632469546e+013.6712070875e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5502104097e+012.9235880399e-01 + 0.0000000000e+000.0000000000e+004.2969644966e-024.8730986924e+013.5505020058e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5306428315e+012.8371344965e-01 + 0.0000000000e+000.0000000000e+004.9832126906e-024.8664284394e+013.4007715268e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3819252748e+012.6881146729e-01 + 0.0000000000e+000.0000000000e+003.0454042082e-024.6059634551e+013.3554817276e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2692691030e+012.5924695460e-01 + 0.0000000000e+000.0000000000e+003.8698378474e-024.6997405558e+013.3342544718e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3022603683e+012.5858616972e-01 + 0.0000000000e+000.0000000000e+005.0656364974e-025.3518028403e+013.5268182487e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8162419720e+012.8292597498e-01 + 0.0000000000e+000.0000000000e+003.0177777778e-025.1864511111e+013.5457777778e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8441577778e+012.8615555556e-01 + 0.0000000000e+000.0000000000e+002.9769804356e-024.9386821262e+013.6407685493e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8194351200e+013.0066009598e-01 + 0.0000000000e+000.0000000000e+004.2674640089e-025.0592912071e+013.6815647841e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8868693245e+013.0512879291e-01 + 0.0000000000e+000.0000000000e+003.7635437431e-024.6340963898e+013.2792325581e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3004905869e+012.6136068660e-01 + 0.0000000000e+000.0000000000e+002.7629021730e-024.5608992835e+013.2816879717e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2568670290e+012.5873578139e-01 + 0.0000000000e+000.0000000000e+004.1135540839e-024.6284709934e+013.3060794702e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2761690508e+012.6060353201e-01 + 0.0000000000e+000.0000000000e+004.3600000000e-024.6661733333e+013.2693333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2892666667e+012.6026666667e-01 + 0.0000000000e+000.0000000000e+003.2297674419e-024.5777875083e+013.1366976744e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2785665781e+012.5474617940e-01 + 0.0000000000e+000.0000000000e+004.7530454042e-022.4108106312e+021.4250276855e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4480187154e+021.1961683278e+00 + 0.0000000000e+000.0000000000e+004.9302325581e-025.5909780731e+023.2517829457e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1154967885e+022.7376301218e+00 + 0.0000000000e+000.0000000000e+002.8571428571e-026.6168538206e+023.8438538206e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6563936877e+023.2395348837e+00 + 0.0000000000e+000.0000000000e+003.1342561831e-026.6630791687e+023.8882880030e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6906703728e+023.2749427095e+00 + 0.0000000000e+000.0000000000e+003.9000000000e-026.6152393333e+023.8733555556e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6701146667e+023.2548444444e+00 + 0.0000000000e+000.0000000000e+004.7276485788e-026.4624076331e+023.7691759321e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5662831776e+023.1563922481e+00 + 0.0000000000e+000.0000000000e+002.9201291990e-024.4148541447e+022.6033351790e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5052759336e+022.1747521964e+00 + 0.0000000000e+000.0000000000e+004.5449870801e-021.2642683359e+027.8789405685e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.4901454264e+016.4819354005e-01 + 0.0000000000e+000.0000000000e+004.7654397043e-024.5504691206e+013.0746650239e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1768861851e+012.4775296473e-01 + 0.0000000000e+000.0000000000e+002.7838404729e-024.3774445007e+013.0607724069e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1663109356e+012.4638878499e-01 + 0.0000000000e+000.0000000000e+003.2325581395e-024.5437607973e+013.1514950166e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2934784053e+012.5677740864e-01 + 0.0000000000e+000.0000000000e+005.1668243456e-022.4100061810e+021.4317754652e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4533800063e+021.1775843582e+00 + 0.0000000000e+000.0000000000e+004.4156784229e-025.4033318035e+023.1768181118e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0199454643e+022.6171553981e+00 + 0.0000000000e+000.0000000000e+003.1007751938e-025.9464008859e+023.5202104097e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3088372093e+022.9028239203e+00 + 0.0000000000e+000.0000000000e+004.2385132707e-025.9235229397e+023.5011392489e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2940277016e+022.8848330436e+00 + 0.0000000000e+000.0000000000e+004.6662486341e-025.9557509252e+023.5328585363e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3040969938e+022.9038491269e+00 + 0.0000000000e+000.0000000000e+002.1373569583e-025.9940165980e+023.5872109265e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3345348627e+022.9271747877e+00 + 0.0000000000e+000.0000000000e+004.0055555556e-025.9978281111e+023.5654888889e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3049491111e+022.9048444444e+00 + 0.0000000000e+000.0000000000e+004.4573089701e-025.9804109941e+023.5456390550e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2908078313e+022.8965521964e+00 + 0.0000000000e+000.0000000000e+002.9926910299e-025.8606382281e+023.4810498339e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2417560576e+022.8489922481e+00 + 0.0000000000e+000.0000000000e+002.9275747508e-025.9400005316e+023.5145980066e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2740560133e+022.8801328904e+00 + 0.0000000000e+000.0000000000e+004.4446106796e-025.8440086958e+023.4693357682e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2066520000e+022.8203417233e+00 + 0.0000000000e+000.0000000000e+004.5178145695e-023.5996241060e+022.1570662252e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0411429868e+021.7410920530e+00 + 0.0000000000e+000.0000000000e+003.4207419712e-024.5732589147e+013.0608970100e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2519460354e+012.4560941307e-01 + 0.0000000000e+000.0000000000e+003.9113330840e-024.6624161405e+013.2033193256e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2824309403e+012.5525217634e-01 + 0.0000000000e+000.0000000000e+005.0687333612e-026.7953712350e+014.3427493344e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3179001782e+013.5360718136e-01 + 0.0000000000e+000.0000000000e+003.4950166113e-027.9641184939e+014.9159468439e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9094019934e+014.0073089701e-01 + 0.0000000000e+000.0000000000e+005.1073317052e-024.6451526552e+013.1099572433e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2704395503e+012.5374139183e-01 + 0.0000000000e+000.0000000000e+004.9867989703e-024.9719791277e+013.3274735429e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6186678694e+012.7361187506e-01 + 0.0000000000e+000.0000000000e+006.2225913621e-028.6654008859e+017.0974529347e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.1110431894e+016.4359911406e-01 + 0.0000000000e+000.0000000000e+004.5521990715e-021.5202388198e+021.5485890299e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5573133088e+031.9334954126e+00 + 0.0000000000e+000.0000000000e+005.3319205298e-021.2742412127e+021.3191424577e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.6514983825e+032.0580969831e+00 + 0.0000000000e+000.0000000000e+005.7644444444e-024.5839777778e+013.0097777778e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1464666667e+012.4097777778e-01 + 0.0000000000e+000.0000000000e+004.0338778514e-024.3912149522e+012.9597247976e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0980549080e+012.3611287712e-01 + 0.0000000000e+000.0000000000e+003.6238999264e-024.4989183812e+013.0347196468e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2327206475e+012.4719823400e-01 + 0.0000000000e+000.0000000000e+005.4821410114e-024.7820176892e+013.1272115172e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3790194315e+012.5932358804e-01 + 0.0000000000e+000.0000000000e+003.0142681129e-024.3903354528e+012.9752653040e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1024552852e+012.3779385125e-01 + 0.0000000000e+000.0000000000e+003.9657983323e-024.4837996524e+013.0062407868e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1635458222e+012.4207325838e-01 + 0.0000000000e+000.0000000000e+003.6544850498e-024.5397563677e+013.0897009967e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2661129568e+012.5138427464e-01 + 0.0000000000e+000.0000000000e+005.4393192669e-024.6070179314e+013.0855151702e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2338456360e+012.4881619766e-01 + 0.0000000000e+000.0000000000e+002.3228771155e-024.4687673510e+013.1865106696e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3393153127e+012.5676438558e-01 + 0.0000000000e+000.0000000000e+004.0577777778e-024.5782144444e+013.1441111111e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1873666667e+012.4774444444e-01 + 0.0000000000e+000.0000000000e+005.7230978661e-024.6267908315e+013.0956475350e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1747815968e+012.4518211921e-01 + 0.0000000000e+000.0000000000e+002.5035688006e-024.3791636130e+012.9954635762e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1489339588e+012.3770676968e-01 + 0.0000000000e+000.0000000000e+003.7000000000e-024.6024444444e+013.1105555556e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2404000000e+012.4650000000e-01 + 0.0000000000e+000.0000000000e+003.5933370247e-024.4200609635e+013.0879549649e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1984908269e+012.4885861942e-01 + 0.0000000000e+000.0000000000e+005.1699963086e-024.5684468143e+013.0244894795e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1585658398e+012.4154138058e-01 + 0.0000000000e+000.0000000000e+002.9800000000e-024.5728688889e+013.1104444444e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2318933333e+012.4666666667e-01 + 0.0000000000e+000.0000000000e+004.3853274467e-024.8369755408e+013.2305842531e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3684533481e+012.5341751288e-01 + 0.0000000000e+000.0000000000e+005.2494481236e-025.2968609272e+013.3624724062e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6340000000e+012.6415011038e-01 + 0.0000000000e+000.0000000000e+003.0447183791e-024.4993216838e+013.1261556619e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2309064979e+012.4976394990e-01 + 0.0000000000e+000.0000000000e+003.1749066354e-024.5114292166e+013.1721458659e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2202601833e+012.4979839760e-01 + 0.0000000000e+000.0000000000e+005.4532561809e-024.8188073070e+013.4518365323e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4250907518e+012.6890347258e-01 + 0.0000000000e+000.0000000000e+002.1782178218e-024.4351815182e+013.1111111111e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1397799780e+012.4180418042e-01 + 0.0000000000e+000.0000000000e+003.0362891552e-024.5697677537e+013.1917672688e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2374231298e+012.4908401366e-01 + 0.0000000000e+000.0000000000e+002.6820826820e-024.7802971527e+013.5185737653e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5322688394e+012.7380927566e-01 + 0.0000000000e+000.0000000000e+005.6215621562e-025.4125962596e+013.7876787679e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0120132013e+012.9075907591e-01 + 0.0000000000e+000.0000000000e+001.8334165653e-024.2638423332e+013.0304799230e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0954756347e+012.3891849053e-01 + 0.0000000000e+000.0000000000e+004.1753843147e-024.4987121222e+013.1548886139e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1632229351e+012.4636203752e-01 + 0.0000000000e+000.0000000000e+005.7425742574e-024.8261386139e+013.2211221122e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2680528053e+012.5346534653e-01 + 0.0000000000e+000.0000000000e+003.3155940594e-024.3867512376e+013.0469059406e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0849040842e+012.3747524752e-01 + 0.0000000000e+000.0000000000e+002.5578932893e-024.4603224697e+013.1288916392e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1225667629e+012.4106160616e-01 + 0.0000000000e+000.0000000000e+005.0605060506e-024.7772827283e+013.2673267327e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3048954895e+012.5687568757e-01 + 0.0000000000e+000.0000000000e+003.9068199583e-024.5209967757e+013.1367860141e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1247351159e+012.4059340803e-01 + 0.0000000000e+000.0000000000e+003.4782185455e-024.6092672507e+013.3428619507e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3511394715e+012.5859251057e-01 + 0.0000000000e+000.0000000000e+003.2123212321e-024.8305390539e+013.4037403740e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4078987899e+012.6754675468e-01 + 0.0000000000e+000.0000000000e+006.2787584680e-024.6902342655e+013.0142529385e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2399540632e+012.4620722599e-01 + 0.0000000000e+000.0000000000e+001.9357629842e-024.3375006080e+013.1077492618e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1034804803e+012.3765416015e-01 + 0.0000000000e+000.0000000000e+004.3234323432e-024.6717821782e+013.2310231023e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1399339934e+012.4455445545e-01 + 0.0000000000e+000.0000000000e+004.5302783568e-024.5471327840e+013.1914907938e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1601041667e+012.4685936686e-01 + 0.0000000000e+000.0000000000e+003.5940340745e-024.3827043997e+013.1055389092e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1062731711e+012.4095141422e-01 + 0.0000000000e+000.0000000000e+003.4983498350e-024.8020902090e+013.2893289329e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3325412541e+012.5302530253e-01 + 0.0000000000e+000.0000000000e+006.1948967923e-025.5983271018e+013.5724567194e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3142754871e+012.8116582711e-01 + 0.0000000000e+000.0000000000e+004.8920118986e-024.7592174527e+013.2999305194e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2522195624e+012.5160645012e-01 + 0.0000000000e+000.0000000000e+003.8943894389e-028.1867436744e+016.3234323432e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.0508250825e+015.6633663366e-01 + 0.0000000000e+000.0000000000e+002.1028530485e-024.4006693554e+013.0775143304e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1273226796e+012.4159638990e-01 + 0.0000000000e+000.0000000000e+001.5582236842e-015.3290740132e+013.2434210526e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3077192982e+012.5185307018e-01 + 0.0000000000e+000.0000000000e+001.5582236842e-015.3290740132e+013.2434210526e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3077192982e+012.5185307018e-01 + 0.0000000000e+000.0000000000e+004.2574257426e-019.5567656766e+016.6996699670e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1270627063e+012.4422442244e-01 + 0.0000000000e+000.0000000000e+006.2875846795e-024.8202123936e+013.3887072260e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3634022060e+012.6296856001e-01 + 0.0000000000e+000.0000000000e+004.3284769266e-024.5405224799e+013.0115127960e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0746131955e+012.3499623647e-01 + 0.0000000000e+000.0000000000e+001.4191419142e-024.2973047305e+013.0990099010e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1059405941e+012.4070407041e-01 + 0.0000000000e+000.0000000000e+003.2041355451e-024.4767002019e+013.1554860749e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2907038858e+012.5590057032e-01 + 0.0000000000e+000.0000000000e+004.8563705055e-024.5788619543e+013.0120606798e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1087867632e+012.3869788953e-01 + 0.0000000000e+000.0000000000e+004.0264026403e-024.3556215622e+012.9108910891e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0696369637e+012.3454345435e-01 + 0.0000000000e+000.0000000000e+002.1259987841e-024.4059748169e+013.0169605118e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1008613608e+012.3968628771e-01 + 0.0000000000e+000.0000000000e+007.3855523710e-027.8941118470e+035.9257186903e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0302319057e+023.6556052414e+00 + 0.0000000000e+000.0000000000e+002.2772277228e-021.6015046535e+041.2731353135e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.0509438944e+027.6676567657e+00 + 0.0000000000e+000.0000000000e+003.9874392044e-022.5271177671e+042.0854825104e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5529040318e+031.1656178782e+01 + 0.0000000000e+000.0000000000e+002.5527148110e-022.0932366586e+044.0066638042e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8246962723e+044.0421378973e+01 + 0.0000000000e+000.0000000000e+007.4587458746e-021.1078651705e+048.6642904290e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5705119428e+051.0643124312e+02 + 0.0000000000e+000.0000000000e+003.1552059811e-026.9121448553e+039.9258692317e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8726749609e+051.2417963667e+02 + 0.0000000000e+000.0000000000e+003.7006796074e-026.4625517783e+031.0035996555e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9039566113e+051.2599392768e+02 + 0.0000000000e+000.0000000000e+004.5104510451e-026.4219339934e+031.0012156216e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9013788669e+051.2582563256e+02 + 0.0000000000e+000.0000000000e+004.6079482948e-026.4043535155e+039.9665577558e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8971193886e+051.2554597704e+02 + 0.0000000000e+000.0000000000e+002.2116336634e-026.4640909839e+031.0047603960e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9039035524e+051.2599526609e+02 + 0.0000000000e+000.0000000000e+005.3465346535e-026.4738363036e+031.0042244224e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9033549175e+051.2595907591e+02 + 0.0000000000e+000.0000000000e+003.6556474726e-026.4422712432e+031.0009823964e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8968166052e+051.2553119528e+02 + 0.0000000000e+000.0000000000e+004.2497430664e-026.4601321672e+031.0027319050e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9029940575e+051.2593112595e+02 + 0.0000000000e+000.0000000000e+003.3553355336e-026.4887740374e+031.0051023102e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9039803982e+051.2607590759e+02 + 0.0000000000e+000.0000000000e+006.1986494702e-026.8359893875e+039.9479418389e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8793435293e+051.2563267041e+02 + 0.0000000000e+000.0000000000e+002.8387542702e-026.6047575102e+031.0027266082e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8935736964e+051.2576609747e+02 + 0.0000000000e+000.0000000000e+004.7084708471e-026.4633188119e+031.0037381738e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9034497140e+051.2597755776e+02 + 0.0000000000e+000.0000000000e+006.4023362863e-026.4276983929e+039.9997820045e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8987124982e+051.2566284697e+02 + 0.0000000000e+000.0000000000e+006.1257165190e-026.4731668987e+031.0040765850e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9036017800e+051.2597745006e+02 + 0.0000000000e+000.0000000000e+003.6303630363e-026.4936990099e+031.0044158416e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9070288053e+051.2620099010e+02 + 0.0000000000e+000.0000000000e+005.3579555324e-026.4215225563e+039.9566557777e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9009887900e+051.2582012344e+02 + 0.0000000000e+000.0000000000e+004.8070609693e-026.4297623061e+039.9582881166e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9021668571e+051.2589523410e+02 + 0.0000000000e+000.0000000000e+003.5203520352e-026.4956666667e+039.9881188119e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9058671177e+051.2611991199e+02 + 0.0000000000e+000.0000000000e+003.0771922587e-026.5384495360e+039.9904000890e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9028728839e+051.2595091751e+02 + 0.0000000000e+000.0000000000e+005.3023456951e-026.5420705740e+031.0001626314e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9049960283e+051.2610057864e+02 + 0.0000000000e+000.0000000000e+003.6743674367e-026.5117920792e+031.0033157316e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9063109087e+051.2617227723e+02 + 0.0000000000e+000.0000000000e+003.4114447629e-026.5006682130e+031.0014495976e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9022366173e+051.2589264851e+02 + 0.0000000000e+000.0000000000e+004.2849248741e-026.5168875736e+031.0006201494e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9034754964e+051.2596692244e+02 + 0.0000000000e+000.0000000000e+004.0924092409e-026.2257900990e+039.8297689769e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8894772607e+051.2503432343e+02 + 0.0000000000e+000.0000000000e+002.7882360604e-023.1098711761e+035.0181051872e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6894723730e+046.4232668599e+01 + 0.0000000000e+000.0000000000e+004.6419069539e-021.1419097700e+038.2727985134e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4315931771e+041.0114757143e+01 + 0.0000000000e+000.0000000000e+004.9174917492e-023.4531500550e+035.3620462046e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6298927393e+034.4227722772e+00 + 0.0000000000e+000.0000000000e+004.1730574373e-026.1753337934e+035.6223982036e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0188746297e+057.0079849965e+01 + 0.0000000000e+000.0000000000e+002.9996598344e-026.7995354915e+039.6285313893e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8583787128e+051.2328823584e+02 + 0.0000000000e+000.0000000000e+004.1254853962e-026.6949143910e+039.8347799416e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9016042553e+051.2584469215e+02 + 0.0000000000e+000.0000000000e+004.2027311464e-026.7014875653e+039.8354108160e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8987513128e+051.2565607438e+02 + 0.0000000000e+000.0000000000e+003.3612865137e-026.6675007570e+039.7789125835e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8838547499e+051.2467154151e+02 + 0.0000000000e+000.0000000000e+004.6553247820e-026.6742155996e+039.7812424552e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8767644051e+051.2420714066e+02 + 0.0000000000e+000.0000000000e+005.3244739756e-026.7070188483e+039.8178095238e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8753111978e+051.2415732004e+02 + 0.0000000000e+000.0000000000e+003.2740643770e-026.6777654528e+039.7729149084e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8622372978e+051.2330443555e+02 + 0.0000000000e+000.0000000000e+002.5000220017e-026.6332420887e+039.7078857561e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8447596702e+051.2212597420e+02 + 0.0000000000e+000.0000000000e+004.3189368771e-026.6726827243e+039.7614617940e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8508766279e+051.2253488372e+02 + 0.0000000000e+000.0000000000e+004.4790543662e-026.6541657058e+039.7233963793e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8395433449e+051.2178424142e+02 + 0.0000000000e+000.0000000000e+002.8486975717e-026.6059977726e+039.6581801545e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8292800901e+051.2109923333e+02 + 0.0000000000e+000.0000000000e+004.7497674419e-026.5629155581e+039.6022462791e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8221462908e+051.2063293721e+02 + 0.0000000000e+000.0000000000e+004.9081575030e-026.5009455876e+039.5044731249e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7946571220e+051.1881023564e+02 + 0.0000000000e+000.0000000000e+002.2834261072e-026.5140896948e+039.5244172405e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7944980269e+051.1878265473e+02 + 0.0000000000e+000.0000000000e+003.1638981174e-026.5147196456e+039.5271605759e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7982902658e+051.1904062016e+02 + 0.0000000000e+000.0000000000e+004.3959428835e-026.4817580547e+039.4848482322e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7976978345e+051.1901575382e+02 + 0.0000000000e+000.0000000000e+004.8842343036e-026.4249962421e+039.3957287335e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7757020516e+051.1757569690e+02 + 0.0000000000e+000.0000000000e+003.6544850498e-026.3746863898e+039.3169767442e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7564917019e+051.1630658915e+02 + 0.0000000000e+000.0000000000e+004.1058722580e-025.7138255359e+038.3533784075e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5839262233e+051.0490117973e+02 + 0.0000000000e+000.0000000000e+004.6497718911e-022.7268831358e+033.9678873289e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.5317652992e+045.0023543782e+01 + 0.0000000000e+000.0000000000e+003.3066666667e-024.9963288889e+013.6151111111e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5396711111e+012.8635555556e-01 + 0.0000000000e+000.0000000000e+004.6514851485e-021.8559368405e+021.1037927393e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1522083916e+029.2007348735e-01 + 0.0000000000e+000.0000000000e+005.9097909791e-022.1666531353e+021.2665896590e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3083257426e+021.0624202420e+00 + 0.0000000000e+000.0000000000e+003.3993399340e-024.8542464246e+013.4411441144e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5062046205e+012.7997799780e-01 + 0.0000000000e+000.0000000000e+002.9801003127e-024.6898317121e+013.3477234237e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4065688473e+012.7164274651e-01 + 0.0000000000e+000.0000000000e+004.0826059580e-024.6445929303e+013.3133326820e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3800307126e+012.7610202797e-01 + 0.0000000000e+000.0000000000e+005.7425742574e-025.0190099010e+013.4455445545e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5373597360e+012.8712871287e-01 + 0.0000000000e+000.0000000000e+003.0947759250e-021.7080257041e+033.9438600834e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0553609091e+034.0542473293e+00 + 0.0000000000e+000.0000000000e+004.2880623589e-025.0247881572e+033.0351288431e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3285939872e+043.7770604156e+01 + 0.0000000000e+000.0000000000e+005.3355335534e-024.9334622662e+035.5469306931e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0689747558e+057.1768206821e+01 + 0.0000000000e+000.0000000000e+003.2294742632e-021.7511748945e+032.5451213848e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9358722281e+043.2856868848e+01 + 0.0000000000e+000.0000000000e+003.1302617104e-025.1522685245e+013.7276854988e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8139039394e+013.0350518933e-01 + 0.0000000000e+000.0000000000e+005.0605060506e-025.7233223322e+013.9493949395e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1550055006e+013.2343234323e-01 + 0.0000000000e+000.0000000000e+002.5098901338e-024.7785133099e+013.5935335968e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5843339811e+012.9671378322e-01 + 0.0000000000e+000.0000000000e+003.2128821435e-024.9367474162e+013.6198877454e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6079157439e+012.9840172833e-01 + 0.0000000000e+000.0000000000e+003.7953795380e-025.2274917492e+013.7557755776e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7935643564e+013.1155115512e-01 + 0.0000000000e+000.0000000000e+005.6320891958e-025.4771599574e+013.7952796595e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8891339348e+013.2017869550e-01 + 0.0000000000e+000.0000000000e+002.1027842916e-024.8442811867e+013.6106609345e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6191014888e+012.9906222859e-01 + 0.0000000000e+000.0000000000e+003.8283828383e-025.1746974697e+013.7447744774e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7195819582e+013.0517051705e-01 + 0.0000000000e+000.0000000000e+005.1958195820e-025.3658844884e+013.7810781078e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8404004400e+013.0710671067e-01 + 0.0000000000e+000.0000000000e+004.3784957443e-025.7135425569e+013.9825654276e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1578667709e+013.2403335070e-01 + 0.0000000000e+000.0000000000e+003.4806901743e-025.1434695443e+013.8131441434e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7927910949e+013.1295234787e-01 + 0.0000000000e+000.0000000000e+005.6048361415e-025.0259306750e+013.6789611198e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6121047384e+013.0193800301e-01 + 0.0000000000e+000.0000000000e+003.5689812402e-024.9330869268e+013.6486516415e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6199106631e+012.9903009380e-01 + 0.0000000000e+000.0000000000e+003.9603960396e-025.3238943894e+013.7821782178e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7792079208e+013.1353135314e-01 + 0.0000000000e+000.0000000000e+002.4443069307e-021.4274534035e+029.0402227723e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4622004950e+017.6277846535e-01 + 0.0000000000e+000.0000000000e+006.3081683168e-024.7123998419e+022.7043495600e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5736303355e+022.2739872112e+00 + 0.0000000000e+000.0000000000e+002.4202420242e-021.1496259626e+027.3432343234e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.8201320132e+015.9515951595e-01 + 0.0000000000e+000.0000000000e+004.6180808870e-025.1003439291e+013.7676560419e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6135459911e+013.0244318511e-01 + 0.0000000000e+000.0000000000e+004.4655274738e-024.9780323085e+013.6579765213e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6056410276e+012.9950400961e-01 + 0.0000000000e+000.0000000000e+003.4543454345e-025.2481848185e+013.8679867987e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8194719472e+013.1837183718e-01 + 0.0000000000e+000.0000000000e+002.5527148110e-024.9791480046e+013.6908129958e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7080734287e+013.0599476724e-01 + 0.0000000000e+000.0000000000e+004.5002732121e-024.9349317735e+013.6845547736e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6340440309e+013.0332477269e-01 + 0.0000000000e+000.0000000000e+005.9589811739e-025.4181269546e+013.9086718346e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9668937615e+013.3104525655e-01 + 0.0000000000e+000.0000000000e+003.2824363234e-025.8713946401e+014.6979726836e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6601040236e+014.1052727944e-01 + 0.0000000000e+000.0000000000e+005.8881506091e-021.3865029900e+021.3342967885e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3699199336e+021.2807973422e+00 + 0.0000000000e+000.0000000000e+007.4086378738e-025.4412624585e+013.7043189369e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8293355482e+013.1428571429e-01 + 0.0000000000e+000.0000000000e+002.7430786268e-024.9250553710e+013.5837209302e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7700188261e+013.0457364341e-01 + 0.0000000000e+000.0000000000e+006.3952241608e-025.9956557758e+013.8248150022e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2183045918e+013.2362646953e-01 + 0.0000000000e+000.0000000000e+004.1491390728e-024.9578640765e+013.5364267844e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7121376748e+013.0365621781e-01 + 0.0000000000e+000.0000000000e+005.6822222222e-024.9914222222e+013.4753333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5818000000e+012.9391111111e-01 + 0.0000000000e+000.0000000000e+002.4478331488e-024.8578331192e+013.6117083795e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6540312661e+013.0423255814e-01 + 0.0000000000e+000.0000000000e+003.8221668512e-025.4181024363e+014.0402916205e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0054076227e+013.4504521964e-01 + 0.0000000000e+000.0000000000e+005.3328719085e-025.1451124031e+013.5378922111e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7257075489e+013.0352620893e-01 + 0.0000000000e+000.0000000000e+001.8726100636e-024.7481712614e+013.6162284658e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6853662186e+013.0874568216e-01 + 0.0000000000e+000.0000000000e+004.3300477437e-025.3240923045e+013.9145578022e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0290413119e+013.4153117276e-01 + 0.0000000000e+000.0000000000e+004.5813953488e-024.9314418605e+013.5926910299e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6501129568e+013.0564784053e-01 + 0.0000000000e+000.0000000000e+003.6101882614e-025.0340863787e+013.6677740864e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7588482835e+013.0719822813e-01 + 0.0000000000e+000.0000000000e+003.0117755629e-025.3405257918e+013.8314119601e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9104570137e+013.2686197859e-01 + 0.0000000000e+000.0000000000e+003.4811111111e-024.7750522222e+013.5126666667e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6055955556e+012.9772222222e-01 + 0.0000000000e+000.0000000000e+005.5392284976e-025.3199535474e+013.7349911406e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7719961573e+013.1642355113e-01 + 0.0000000000e+000.0000000000e+003.5548172757e-027.3056411960e+015.0598006645e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.3576411960e+014.3049833887e-01 + 0.0000000000e+000.0000000000e+002.2770653378e-023.0436446368e+021.8589319306e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8362547091e+021.5792003322e+00 + 0.0000000000e+000.0000000000e+006.7162901440e-025.5061606788e+023.2251322997e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1272980041e+022.7817299003e+00 + 0.0000000000e+000.0000000000e+002.1714876338e-022.3881569878e+021.4716899225e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4874336626e+021.2583034330e+00 + 0.0000000000e+000.0000000000e+005.1906386120e-025.0706504983e+013.5046954596e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7070332521e+012.9994684385e-01 + 0.0000000000e+000.0000000000e+002.8405315615e-024.8482890365e+013.6013289037e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6356644518e+013.0049833887e-01 + 0.0000000000e+000.0000000000e+006.0952380952e-025.4260930233e+013.8367663344e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0421949059e+013.2704318937e-01 + 0.0000000000e+000.0000000000e+001.8194905869e-024.7343001107e+013.5114064230e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5699047619e+012.9133997785e-01 + 0.0000000000e+000.0000000000e+005.3414006292e-025.9913900684e+014.0101295901e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3593527975e+013.4148511584e-01 + 0.0000000000e+000.0000000000e+005.8727005151e-025.4557772627e+013.7545621781e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8521364974e+013.2246431199e-01 + 0.0000000000e+000.0000000000e+003.3218899963e-024.4839378738e+013.1707456626e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3327709487e+012.6363639719e-01 + 0.0000000000e+000.0000000000e+003.0598006645e-024.8563156146e+013.2930232558e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4615215947e+012.7272425249e-01 + 0.0000000000e+000.0000000000e+005.2268450272e-024.7588235536e+013.4163267402e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4590875155e+012.8183728998e-01 + 0.0000000000e+000.0000000000e+002.0070198675e-024.5312162914e+013.2130154525e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3006421634e+012.6169094923e-01 + 0.0000000000e+000.0000000000e+002.9599335548e-024.6379944850e+013.2744230343e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3547022148e+012.6731339978e-01 + 0.0000000000e+000.0000000000e+001.1125167763e-024.8867704598e+013.6482127273e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6647648933e+012.9854531987e-01 + 0.0000000000e+000.0000000000e+007.8875496689e-025.1211350552e+013.2793642384e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5458728918e+012.7157461369e-01 + 0.0000000000e+000.0000000000e+002.0333333333e-025.0951166667e+013.4433333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6699000000e+012.7996666667e-01 + 0.0000000000e+000.0000000000e+005.3198671096e-024.4860548140e+027.6885581395e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8312599535e+026.0322458472e-01 + 0.0000000000e+000.0000000000e+003.9911406423e-024.5570166113e+013.2566998893e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3140863787e+012.6248062016e-01 + 0.0000000000e+000.0000000000e+004.6434366925e-024.7398896936e+013.3908530823e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3363974197e+012.6596146179e-01 + 0.0000000000e+000.0000000000e+003.6544996321e-025.2529835614e+013.6877038263e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6920222185e+012.9069735099e-01 + 0.0000000000e+000.0000000000e+003.6544996321e-025.2529835614e+013.6877038263e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6920222185e+012.9069735099e-01 + 0.0000000000e+000.0000000000e+004.9998896247e-025.1138506549e+013.4662590140e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5554777851e+012.8326085357e-01 + 0.0000000000e+000.0000000000e+003.3388888889e-024.9017144444e+013.7324444444e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6380600000e+012.9994444444e-01 + 0.0000000000e+000.0000000000e+001.9912435614e-024.9363057616e+013.7416938926e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5978176233e+012.9801986755e-01 + 0.0000000000e+000.0000000000e+006.9268442939e-025.1733542716e+013.6882477833e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5338671866e+012.8912631185e-01 + 0.0000000000e+000.0000000000e+001.4085788114e-025.2717033001e+013.9958361019e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9704251901e+013.2287604282e-01 + 0.0000000000e+000.0000000000e+004.2650183959e-025.1424920971e+013.7124944812e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7144659014e+013.0161795438e-01 + 0.0000000000e+000.0000000000e+004.3327593819e-024.9172279029e+013.5695055188e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5613852097e+012.9022649007e-01 + 0.0000000000e+000.0000000000e+005.9666666667e-025.5156933333e+014.0240000000e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9800600000e+013.2920000000e-01 + 0.0000000000e+000.0000000000e+002.7160264901e-026.2131692715e+014.0071567329e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2639190287e+013.2785827815e-01 + 0.0000000000e+000.0000000000e+003.6276722918e-024.9602899533e+013.6962120379e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6013626103e+012.9653795663e-01 + 0.0000000000e+000.0000000000e+004.9596345515e-025.5102507752e+013.8936312292e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8982516944e+013.2250376523e-01 + 0.0000000000e+000.0000000000e+003.3725913621e-024.8943583056e+013.7263023256e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6218081063e+012.9973322259e-01 + 0.0000000000e+000.0000000000e+003.3222591362e-025.1493355482e+013.6245847176e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7073754153e+013.0221483942e-01 + 0.0000000000e+000.0000000000e+006.2026578073e-021.9445261351e+021.2486489480e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2693176080e+021.0384274640e+00 + 0.0000000000e+000.0000000000e+002.1597764626e-023.5169468747e+022.2033486612e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1713946624e+021.8450419133e+00 + 0.0000000000e+000.0000000000e+003.8933796836e-026.3997361261e+014.4033904645e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3747432986e+013.5682962604e-01 + 0.0000000000e+000.0000000000e+002.0993355482e-024.9780732558e+013.7227464009e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6380738095e+012.9595293466e-01 + 0.0000000000e+000.0000000000e+006.4122923588e-025.0920563123e+013.5006201550e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5708708195e+012.8626190476e-01 + 0.0000000000e+000.0000000000e+002.5632631968e-024.6480181322e+013.4047131783e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3600014027e+012.6768253968e-01 + 0.0000000000e+000.0000000000e+004.5275452196e-025.1780150904e+013.7667153931e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9029720192e+012.9727870063e-01 + 0.0000000000e+000.0000000000e+004.3377630122e-024.8184928018e+013.5993355482e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4995337763e+012.8646733112e-01 + 0.0000000000e+000.0000000000e+003.7058028793e-024.7169809967e+013.4426157254e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3746386489e+012.7094285714e-01 + 0.0000000000e+000.0000000000e+003.9800000000e-026.5694400000e+014.1853333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.5684000000e+013.4833333333e-01 + 0.0000000000e+000.0000000000e+005.2366777409e-024.8711205316e+013.4706112957e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4875039867e+012.8040265781e-01 + 0.0000000000e+000.0000000000e+004.0708748616e-025.0019191584e+013.4530454042e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4771029900e+012.7574750831e-01 + 0.0000000000e+000.0000000000e+004.9169435216e-024.8607751938e+013.4551495017e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5148837209e+012.7884828350e-01 + 0.0000000000e+000.0000000000e+002.1965193285e-024.7548094871e+013.5368935777e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4442391037e+012.8128985061e-01 + 0.0000000000e+000.0000000000e+006.6156512141e-024.9372589625e+013.4109668874e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3552646431e+012.6780058867e-01 + 0.0000000000e+000.0000000000e+001.7677777778e-024.8662066667e+013.5846666667e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5828600000e+012.8821111111e-01 + 0.0000000000e+000.0000000000e+004.0768359088e-025.1649902208e+013.7614304636e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7484625533e+013.0657108168e-01 + 0.0000000000e+000.0000000000e+004.6222855383e-025.0664201558e+013.7863303338e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6618049291e+013.0583943881e-01 + 0.0000000000e+000.0000000000e+006.1875452196e-023.1556292957e+022.1761128092e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1029733807e+032.1758672573e+00 + 0.0000000000e+000.0000000000e+001.7626208933e-028.0839519889e+025.0188595054e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6406199025e+024.2942324105e+00 + 0.0000000000e+000.0000000000e+004.3521594684e-028.5018315615e+025.2089368771e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9673661130e+024.4088704319e+00 + 0.0000000000e+000.0000000000e+006.1572535991e-028.6312930233e+025.2659136213e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0839924695e+024.5164562569e+00 + 0.0000000000e+000.0000000000e+005.3960602260e-021.5135528495e+039.2408929396e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.7738226673e+027.8857430346e+00 + 0.0000000000e+000.0000000000e+004.1222121992e-021.6248345481e+039.9505467060e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4371142098e+028.5019535324e+00 + 0.0000000000e+000.0000000000e+007.5719158361e-021.6368507451e+039.9773836840e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4704339712e+028.5420776670e+00 + 0.0000000000e+000.0000000000e+002.0444444444e-021.6441896444e+031.0054088889e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5710511111e+028.6237333333e+00 + 0.0000000000e+000.0000000000e+004.2835025754e-021.6653120271e+031.0193113171e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6766083238e+028.7272023547e+00 + 0.0000000000e+000.0000000000e+003.7656963910e-021.6620056122e+031.0162091997e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6885113558e+028.7435314955e+00 + 0.0000000000e+000.0000000000e+005.4152823920e-021.6554001661e+039.9888704319e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5122314507e+028.5651716501e+00 + 0.0000000000e+000.0000000000e+001.8471760797e-021.6174277741e+039.9229235880e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4615136213e+028.5298338870e+00 + 0.0000000000e+000.0000000000e+004.2414174972e-021.6678738206e+031.0120819491e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5976912514e+028.6534772979e+00 + 0.0000000000e+000.0000000000e+005.2314507198e-021.6797376966e+031.0222037652e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6823096346e+028.7378294574e+00 + 0.0000000000e+000.0000000000e+003.5813953488e-021.6654026246e+031.0168970100e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6499906977e+028.7012624585e+00 + 0.0000000000e+000.0000000000e+003.9096345515e-021.6444070343e+039.9837069029e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5520716648e+028.5692469546e+00 + 0.0000000000e+000.0000000000e+004.8522702104e-021.6258119690e+039.9193606497e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4178484902e+028.4793133998e+00 + 0.0000000000e+000.0000000000e+004.3973986638e-021.6599286557e+031.0136848328e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6355008181e+028.6929382559e+00 + 0.0000000000e+000.0000000000e+001.7592200147e-021.6372575197e+031.0053235467e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5305763584e+028.5927150110e+00 + 0.0000000000e+000.0000000000e+004.1756072351e-021.6668899929e+031.0124312661e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6123080949e+028.6509137320e+00 + 0.0000000000e+000.0000000000e+004.9205811387e-021.6366162071e+039.9809066174e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4925293437e+028.5580268861e+00 + 0.0000000000e+000.0000000000e+003.5744354726e-021.6416342248e+039.9366349109e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.3913540450e+028.4568679090e+00 + 0.0000000000e+000.0000000000e+003.0420819491e-021.6636354817e+031.0160498339e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6555249169e+028.7024252492e+00 + 0.0000000000e+000.0000000000e+005.7631735275e-021.6506307791e+031.0029643792e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5426938857e+028.6041064003e+00 + 0.0000000000e+000.0000000000e+003.2634045456e-021.6384947691e+031.0032670715e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5519483070e+028.6137452055e+00 + 0.0000000000e+000.0000000000e+003.4850498339e-021.6306213289e+039.9626578073e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4916534884e+028.5550830565e+00 + 0.0000000000e+000.0000000000e+004.1919429716e-021.6463703258e+031.0015422030e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5299575866e+028.5701562855e+00 + 0.0000000000e+000.0000000000e+005.1336384238e-021.6540880795e+031.0070746298e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5702971200e+028.6267650877e+00 + 0.0000000000e+000.0000000000e+002.3356404577e-021.6549401111e+031.0030951274e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5532425452e+028.6178324105e+00 + 0.0000000000e+000.0000000000e+004.0914275202e-021.6577799882e+031.0068567329e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5591730280e+028.6289455482e+00 + 0.0000000000e+000.0000000000e+004.6482365625e-021.6557790701e+031.0076993025e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5722959440e+028.6233881543e+00 + 0.0000000000e+000.0000000000e+003.8471760797e-021.6459913400e+039.9879734219e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4637802879e+028.5301439646e+00 + 0.0000000000e+000.0000000000e+002.8538205980e-021.6743500443e+031.0214983389e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.7095087486e+028.7618493909e+00 + 0.0000000000e+000.0000000000e+006.3982281285e-021.6750647796e+031.0137816168e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6528358804e+028.6794507198e+00 + 0.0000000000e+000.0000000000e+003.3209713024e-021.6338428786e+039.9438454746e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4814066225e+028.5313156733e+00 + 0.0000000000e+000.0000000000e+002.8277129081e-021.6375489153e+031.0042786104e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5608935968e+028.6259474846e+00 + 0.0000000000e+000.0000000000e+002.4532959875e-021.6178795395e+039.9169723814e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4620971404e+028.5128556540e+00 + 0.0000000000e+000.0000000000e+006.1221122112e-021.6551115182e+031.0145742574e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6645339934e+028.7082838284e+00 + 0.0000000000e+000.0000000000e+002.9925742574e-021.6405626485e+031.0072153465e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5810269802e+028.6344306931e+00 + 0.0000000000e+000.0000000000e+003.3737623762e-021.6391375165e+031.0045261276e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5409654290e+028.6001237624e+00 + 0.0000000000e+000.0000000000e+004.6897689769e-021.6655445875e+031.0174367437e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6455134213e+028.6914851485e+00 + 0.0000000000e+000.0000000000e+004.4605914539e-021.6530804180e+031.0109735322e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5924117198e+028.6469437207e+00 + 0.0000000000e+000.0000000000e+002.1675713624e-021.6492734764e+031.0059824634e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6012033517e+028.6504820219e+00 + 0.0000000000e+000.0000000000e+004.5561128481e-021.6214017977e+039.8824560680e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4135941264e+028.4859982413e+00 + 0.0000000000e+000.0000000000e+003.8850312663e-021.5984251990e+039.8019443721e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.3445476778e+028.4098433429e+00 + 0.0000000000e+000.0000000000e+004.5412541254e-021.6527329373e+031.0130825083e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6611828383e+028.6807920792e+00 + 0.0000000000e+000.0000000000e+003.5057321522e-021.6671533878e+031.0171890633e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.7006646593e+028.7230487884e+00 + 0.0000000000e+000.0000000000e+004.8044988709e-021.6532635869e+031.0102377794e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5931441416e+028.6347179882e+00 + 0.0000000000e+000.0000000000e+003.5929592959e-021.6675254345e+031.0144796480e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6439469747e+028.6617821782e+00 + 0.0000000000e+000.0000000000e+002.9336821840e-021.6358521189e+039.9513564284e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4920481381e+028.5228748335e+00 + 0.0000000000e+000.0000000000e+003.9134025245e-021.6392688712e+031.0035134221e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5296418509e+028.5684012941e+00 + 0.0000000000e+000.0000000000e+004.8976897690e-021.6767717492e+031.0271023102e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.7414842684e+028.7607480748e+00 + 0.0000000000e+000.0000000000e+003.0869340223e-021.6610198183e+031.0166594870e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6556190561e+028.6858287013e+00 + 0.0000000000e+000.0000000000e+003.5951341845e-021.6381231190e+031.0019631753e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5016509108e+028.5543143130e+00 + 0.0000000000e+000.0000000000e+003.9933993399e-021.6259615182e+039.9373597360e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4225630363e+028.4763696370e+00 + 0.0000000000e+000.0000000000e+004.0528052805e-021.6359576568e+031.0009141914e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4878521452e+028.5311221122e+00 + 0.0000000000e+000.0000000000e+002.7698454056e-021.6593785175e+031.0148954316e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5864772190e+028.6363956922e+00 + 0.0000000000e+000.0000000000e+004.3852701060e-021.6617905805e+031.0173091888e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6349239911e+028.6728892363e+00 + 0.0000000000e+000.0000000000e+004.8052805281e-021.6532997140e+031.0043289329e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5510783278e+028.5877667767e+00 + 0.0000000000e+000.0000000000e+003.1383967344e-021.4059222714e+038.5441670285e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.1371202688e+027.3033132853e+00 + 0.0000000000e+000.0000000000e+005.3280499103e-021.0159449124e+036.2244248306e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9882417774e+025.3093049766e+00 + 0.0000000000e+000.0000000000e+005.7656765677e-028.5835123212e+025.2394169417e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0679497250e+024.4671397140e+00 + 0.0000000000e+000.0000000000e+002.9852208905e-028.0835207921e+024.9649520873e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7759433660e+024.2296298709e+00 + 0.0000000000e+000.0000000000e+002.9146690985e-024.1547287129e+022.5838157895e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5424045987e+022.1879168838e+00 + 0.0000000000e+000.0000000000e+004.7557755776e-024.8068778878e+013.2402640264e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3339438944e+012.5782178218e-01 + 0.0000000000e+000.0000000000e+004.8185904117e-024.6818854221e+013.2364903596e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2498807322e+012.5347186034e-01 + 0.0000000000e+000.0000000000e+003.1033017775e-024.5622630928e+013.2422775172e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1619267486e+012.4811229807e-01 + 0.0000000000e+000.0000000000e+004.1001100110e-024.6416710671e+013.2176017602e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2382024202e+012.5347634763e-01 + 0.0000000000e+000.0000000000e+004.7242197904e-024.7014539980e+013.2352961612e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2922765329e+012.5950784552e-01 + 0.0000000000e+000.0000000000e+002.5453071623e-024.5567517225e+013.1997973482e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2598169764e+012.5137224249e-01 + 0.0000000000e+000.0000000000e+004.4235423542e-024.8857205721e+013.3061606161e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3665082508e+012.6067106711e-01 + 0.0000000000e+000.0000000000e+005.1320276765e-024.6668720036e+013.2159718603e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2917317903e+012.5696984830e-01 + 0.0000000000e+000.0000000000e+004.6743529616e-024.7193689204e+013.2935990968e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3860657895e+012.6678152684e-01 + 0.0000000000e+000.0000000000e+003.9834983498e-028.1712442244e+017.1590759076e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.8711716172e+016.5198019802e-01 + 0.0000000000e+000.0000000000e+006.6184644780e-021.1121582031e+021.0077588154e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0723832769e+029.3827774883e-01 + 0.0000000000e+000.0000000000e+006.5586532337e-025.4871033380e+013.4065702623e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7124235568e+012.7177725667e-01 + 0.0000000000e+000.0000000000e+004.6138613861e-024.5788074807e+013.0581958196e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2103498350e+012.4971397140e-01 + 0.0000000000e+000.0000000000e+004.9086257310e-024.6159203216e+013.1082602339e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2668384503e+012.5155701754e-01 + 0.0000000000e+000.0000000000e+006.1639815297e-024.8058805585e+013.1979003821e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2664277763e+012.5393253141e-01 + 0.0000000000e+000.0000000000e+002.4510451045e-024.3705885589e+013.0392739274e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1261716172e+012.4192519252e-01 + 0.0000000000e+000.0000000000e+003.7073417868e-024.5707479880e+013.0735713045e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2048106942e+012.4977824098e-01 + 0.0000000000e+000.0000000000e+003.4136703144e-021.3278373024e+028.2138874414e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.8548515720e+016.7554629147e-01 + 0.0000000000e+000.0000000000e+005.1122112211e-024.0858726073e+022.4035643564e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3317897690e+022.0059735974e+00 + 0.0000000000e+000.0000000000e+002.5771886399e-025.6280017131e+023.3230512854e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1542687142e+022.7755415147e+00 + 0.0000000000e+000.0000000000e+004.6054296219e-025.8755095080e+023.4428123010e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2943302957e+022.8921372532e+00 + 0.0000000000e+000.0000000000e+005.0638063806e-026.2050585259e+023.5904730473e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4446102310e+023.0355115512e+00 + 0.0000000000e+000.0000000000e+003.1526967266e-026.8233468508e+023.9599296221e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7783257841e+023.3472579576e+00 + 0.0000000000e+000.0000000000e+003.5960264901e-026.0266907285e+023.5325827815e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3719688742e+022.9545033113e+00 + 0.0000000000e+000.0000000000e+006.1789472912e-027.3531776961e+024.3188856864e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1472280669e+023.6447962274e+00 + 0.0000000000e+000.0000000000e+003.6013289037e-021.2822290033e+037.6559800664e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.3494897010e+026.5091362126e+00 + 0.0000000000e+000.0000000000e+004.0332225914e-021.3829730454e+038.2845847176e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.9616660022e+027.0845625692e+00 + 0.0000000000e+000.0000000000e+002.8144776670e-021.3332848060e+038.0016579181e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.6926393285e+026.8347849760e+00 + 0.0000000000e+000.0000000000e+006.1133333333e-021.1113739222e+036.7290888889e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.5143100000e+025.7519000000e+00 + 0.0000000000e+000.0000000000e+001.9374981604e-028.3636094570e+025.1865245769e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1116176740e+024.4150186902e+00 + 0.0000000000e+000.0000000000e+004.4381238403e-028.1821856527e+025.0292623925e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9496337726e+024.2964358687e+00 + 0.0000000000e+000.0000000000e+004.8549280177e-028.4511428571e+025.2022148394e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1182405316e+024.4380952381e+00 + 0.0000000000e+000.0000000000e+004.0016501287e-028.4705582451e+025.2229377791e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1484988746e+024.4580406372e+00 + 0.0000000000e+000.0000000000e+002.9577998528e-028.2556584547e+025.0951048565e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9694145916e+024.3265651214e+00 + 0.0000000000e+000.0000000000e+004.2697858989e-028.3390387818e+025.1371179402e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0263195349e+024.3748959025e+00 + 0.0000000000e+000.0000000000e+004.1063122924e-028.3043302326e+025.0904983389e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0220039867e+024.3617275748e+00 + 0.0000000000e+000.0000000000e+004.1239018088e-028.3777450967e+025.1555170543e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0693367006e+024.4137987449e+00 + 0.0000000000e+000.0000000000e+002.6047803618e-028.4378712931e+025.2116700997e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0922419262e+024.4366331488e+00 + 0.0000000000e+000.0000000000e+006.3987884388e-028.3537214832e+025.1313389511e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0233915381e+024.3626157107e+00 + 0.0000000000e+000.0000000000e+003.7551429011e-028.3722839431e+025.1402114365e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0548381407e+024.3721461941e+00 + 0.0000000000e+000.0000000000e+004.3166010282e-028.2701881319e+025.0858040160e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9949822787e+024.3454917750e+00 + 0.0000000000e+000.0000000000e+004.3024100423e-028.4106936008e+025.1868878179e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0751955970e+024.4178317633e+00 + 0.0000000000e+000.0000000000e+003.9031903190e-028.2901271727e+025.1056105611e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0017839384e+024.3498349835e+00 + 0.0000000000e+000.0000000000e+001.8742038678e-028.2710301763e+025.1073613282e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9957057665e+024.3505768340e+00 + 0.0000000000e+000.0000000000e+003.6164451972e-028.2908270294e+025.1257959875e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0154801521e+024.3619204157e+00 + 0.0000000000e+000.0000000000e+005.7161716172e-028.4269612761e+025.1774697470e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0657452145e+024.4081188119e+00 + 0.0000000000e+000.0000000000e+003.7216721672e-028.3738643564e+025.1729812981e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0576375138e+024.4020682068e+00 + 0.0000000000e+000.0000000000e+002.1408864571e-028.3904411977e+025.1724810376e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0819852556e+024.4170153726e+00 + 0.0000000000e+000.0000000000e+006.4608737190e-028.2700924657e+025.0626784784e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9895001129e+024.3407734063e+00 + 0.0000000000e+000.0000000000e+001.5049504950e-028.3915366337e+025.1742904290e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0866587459e+024.4340924092e+00 + 0.0000000000e+000.0000000000e+003.9004038562e-028.3350581813e+025.1270223207e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0421360974e+024.3748929564e+00 + 0.0000000000e+000.0000000000e+003.0995961438e-028.4512073852e+025.2005904406e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1260681931e+024.4539189248e+00 + 0.0000000000e+000.0000000000e+005.7711771177e-028.3470402640e+025.1311661166e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0566585259e+024.3848074807e+00 + 0.0000000000e+000.0000000000e+001.3726477911e-028.2924576139e+025.1179364252e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0192713074e+024.3593656997e+00 + 0.0000000000e+000.0000000000e+003.3072201957e-028.6918439262e+025.4439997684e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4306247322e+024.7035715940e+00 + 0.0000000000e+000.0000000000e+004.7860286029e-028.6109426293e+025.2924037404e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2157672717e+024.5151265127e+00 + 0.0000000000e+000.0000000000e+004.7860286029e-028.6109426293e+025.2924037404e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2157672717e+024.5151265127e+00 + 0.0000000000e+000.0000000000e+003.6273015459e-021.0330347350e+036.3096138035e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.1959747156e+025.3730832754e+00 + 0.0000000000e+000.0000000000e+006.5410152857e-025.9320190963e+023.6581969776e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6255497069e+023.1187209050e+00 + 0.0000000000e+000.0000000000e+003.3491749175e-011.0654524752e+027.2917491749e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3635808581e+013.5468646865e-01 + 0.0000000000e+000.0000000000e+003.5162410978e-016.8957206879e+013.7613687685e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4622400556e+012.7293034567e-01 + 0.0000000000e+000.0000000000e+003.4393491981e-025.3541032945e+013.9126686353e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2704002084e+013.0824677205e-01 + 0.0000000000e+000.0000000000e+006.9053905391e-024.7300825083e+013.0309130913e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1652563256e+012.4222222222e-01 + 0.0000000000e+000.0000000000e+001.7517514909e-024.2316102498e+013.0222077471e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1298675887e+012.4299591801e-01 + 0.0000000000e+000.0000000000e+004.6354872329e-024.5603842496e+013.0052950032e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1185537534e+012.4114049563e-01 + 0.0000000000e+000.0000000000e+004.6523652365e-025.0022948295e+013.3312431243e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4188690869e+012.7371837184e-01 + 0.0000000000e+000.0000000000e+003.7253054253e-024.4230511841e+012.9744267848e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2323732123e+012.4702709745e-01 + 0.0000000000e+000.0000000000e+002.1767847837e-024.4571556366e+013.0232629842e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2736476898e+012.4993659892e-01 + 0.0000000000e+000.0000000000e+006.5742574257e-024.8199471947e+013.1798679868e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4071650165e+012.6231023102e-01 + 0.0000000000e+000.0000000000e+002.7138700712e-024.5342502388e+013.0225269237e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2921434341e+012.4347685426e-01 + 0.0000000000e+000.0000000000e+003.6557668925e-024.4269653827e+013.0856138903e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1658059609e+012.4359685311e-01 + 0.0000000000e+000.0000000000e+002.8558855886e-026.4285291529e+014.0411441144e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.5153454345e+013.3534653465e-01 + 0.0000000000e+000.0000000000e+006.9839615541e-025.7817488854e+013.4515314689e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4379407099e+012.8691187540e-01 + 0.0000000000e+000.0000000000e+002.5545258495e-024.5988713062e+013.2080550213e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3356541353e+012.5632482369e-01 + 0.0000000000e+000.0000000000e+003.2126245847e-024.4325747508e+012.9471760797e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1174086379e+012.3903654485e-01 + 0.0000000000e+000.0000000000e+004.4584717608e-021.0919483942e+026.9906976744e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.8423344408e+015.8963455150e-01 + 0.0000000000e+000.0000000000e+004.1067816623e-025.9793354822e+013.8823447229e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9974756221e+013.2149879357e-01 + 0.0000000000e+000.0000000000e+002.6606601982e-024.6727110295e+013.2060273701e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3650703358e+012.6483564718e-01 + 0.0000000000e+000.0000000000e+004.4341085271e-024.7061063123e+013.1045404208e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3853554817e+012.5397563677e-01 + 0.0000000000e+000.0000000000e+004.9833887043e-024.5445747508e+012.9777408638e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1528704319e+012.3867109635e-01 + 0.0000000000e+000.0000000000e+004.4720118125e-024.6666458176e+013.1218973791e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3977993355e+012.6009892949e-01 + 0.0000000000e+000.0000000000e+002.4977777778e-024.4264177778e+013.0093333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2269555556e+012.4831111111e-01 + 0.0000000000e+000.0000000000e+006.1763898117e-024.9437780436e+013.1418589886e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4054189738e+012.5315142119e-01 + 0.0000000000e+000.0000000000e+005.2270210410e-025.0019269103e+013.1633444075e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3870653378e+012.5841638981e-01 + 0.0000000000e+000.0000000000e+003.3554817276e-024.5497342193e+013.0784053156e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3310631229e+012.5654485050e-01 + 0.0000000000e+000.0000000000e+007.6114826957e-025.3523821808e+013.2286400006e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6636552881e+012.6287129729e-01 + 0.0000000000e+000.0000000000e+003.8529580574e-024.7264930905e+013.0896401766e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2586583885e+012.4316048565e-01 + 0.0000000000e+000.0000000000e+003.3506201550e-024.4118301550e+012.9999922481e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1592189922e+012.4373565891e-01 + 0.0000000000e+000.0000000000e+002.3758919862e-024.4298434211e+013.1093741979e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2019007649e+012.5283895477e-01 + 0.0000000000e+000.0000000000e+005.5434878587e-024.8989764238e+013.2123002208e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3896769095e+012.5879205298e-01 + 0.0000000000e+000.0000000000e+003.3733333333e-024.5981333333e+013.1573333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3672933333e+012.5746666667e-01 + 0.0000000000e+000.0000000000e+003.5798675497e-024.4666076821e+013.0420662252e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1740143046e+012.4530860927e-01 + 0.0000000000e+000.0000000000e+004.9845621292e-024.6919563046e+013.1459249155e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3776971904e+012.5984620800e-01 + 0.0000000000e+000.0000000000e+005.0789036545e-024.6106960133e+013.0723421927e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1966985050e+012.4394518272e-01 + 0.0000000000e+000.0000000000e+002.2466777409e-024.3473914729e+013.1005260244e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1877976190e+012.4853543743e-01 + 0.0000000000e+000.0000000000e+004.8017718715e-025.0003410853e+013.2717607973e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4581306755e+012.6737541528e-01 + 0.0000000000e+000.0000000000e+004.4983388704e-024.5926522702e+013.1000000000e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2388383167e+012.5019933555e-01 + 0.0000000000e+000.0000000000e+003.7319090889e-024.3787067831e+012.9913445249e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1538244483e+012.4438098172e-01 + 0.0000000000e+000.0000000000e+002.6767287848e-024.4653308691e+013.0604827177e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1488056735e+012.4319376911e-01 + 0.0000000000e+000.0000000000e+004.7645736434e-024.7659241860e+013.2432192691e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2728632669e+012.6258172757e-01 + 0.0000000000e+000.0000000000e+003.2276744186e-024.5983349502e+013.0494717608e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2531046179e+012.4994318937e-01 + 0.0000000000e+000.0000000000e+002.3312144703e-024.6226250498e+013.1819726836e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3765476043e+012.6249014396e-01 + 0.0000000000e+000.0000000000e+003.7866666667e-024.5369888889e+013.0728888889e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3306000000e+012.5546666667e-01 + 0.0000000000e+000.0000000000e+005.0471244001e-024.5148855076e+012.8961904762e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1631934810e+012.4215393134e-01 + 0.0000000000e+000.0000000000e+002.9125138427e-024.7722879291e+013.3377630122e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4907032115e+012.7044296788e-01 + 0.0000000000e+000.0000000000e+004.6381395349e-025.3531776744e+013.3860465116e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7635144186e+012.7346976744e-01 + 0.0000000000e+000.0000000000e+004.9355038760e-024.7877868882e+013.1339977852e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3854612182e+012.5978604651e-01 + 0.0000000000e+000.0000000000e+004.1749723145e-024.8191140642e+013.2469545958e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4853654485e+012.7248062016e-01 + 0.0000000000e+000.0000000000e+002.5647840532e-024.4891738649e+013.0378737542e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2510941307e+012.5063122924e-01 + 0.0000000000e+000.0000000000e+005.9853578579e-024.5729849178e+012.9637345713e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1402094013e+012.4334228070e-01 + 0.0000000000e+000.0000000000e+003.6660485651e-024.4270580427e+012.9472170714e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1349575791e+012.4149315673e-01 + 0.0000000000e+000.0000000000e+003.1722222222e-024.3985755556e+013.0036666667e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1846000000e+012.4703333333e-01 + 0.0000000000e+000.0000000000e+002.7234366925e-024.5284291030e+013.0496120340e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2433636951e+012.4707918051e-01 + 0.0000000000e+000.0000000000e+005.1310077519e-024.7510308970e+013.1336101883e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3240751938e+012.5575415282e-01 + 0.0000000000e+000.0000000000e+003.2953488372e-024.5796302326e+013.1360465116e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3352348837e+012.5706976744e-01 + 0.0000000000e+000.0000000000e+004.0764119601e-024.6069988926e+013.0997785161e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2001461794e+012.4655592470e-01 + 0.0000000000e+000.0000000000e+004.9833887043e-025.4004739756e+013.5964562569e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9744451827e+012.9550387597e-01 + 0.0000000000e+000.0000000000e+004.3048504983e-023.4868710233e+022.0527385382e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0301743754e+021.7203704319e+00 + 0.0000000000e+000.0000000000e+003.5400000000e-024.4305690000e+022.5894333333e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5284200000e+022.1683000000e+00 + 0.0000000000e+000.0000000000e+005.1459161148e-024.2246198874e+022.4750856512e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4176035960e+022.0748467991e+00 + 0.0000000000e+000.0000000000e+003.7096394408e-024.2189042237e+022.4826810155e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4070044040e+022.0812420898e+00 + 0.0000000000e+000.0000000000e+004.0333333333e-024.3119672222e+022.5401111111e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4549566667e+022.1185555556e+00 + 0.0000000000e+000.0000000000e+002.6091243561e-024.3836731457e+022.5788855776e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4869061479e+022.1508314937e+00 + 0.0000000000e+000.0000000000e+004.8066379178e-024.3846745675e+022.5626816058e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4833950536e+022.1525535192e+00 + 0.0000000000e+000.0000000000e+003.4042081949e-024.4078908084e+022.5805758583e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5042440753e+022.1718715393e+00 + 0.0000000000e+000.0000000000e+002.6544960507e-024.4466912466e+022.6288617412e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5298979571e+022.1956301292e+00 + 0.0000000000e+000.0000000000e+004.0885825761e-024.4313790745e+022.6206731425e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5176295069e+022.1848017645e+00 + 0.0000000000e+000.0000000000e+004.2126245847e-024.3961076412e+022.5816611296e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4923289037e+022.1541528239e+00 + 0.0000000000e+000.0000000000e+002.8908458193e-024.4082075448e+022.6060100988e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5128147683e+022.1773368023e+00 + 0.0000000000e+000.0000000000e+003.4112582781e-024.3617993046e+022.5570397351e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4886952539e+022.1572108168e+00 + 0.0000000000e+000.0000000000e+004.4232558140e-024.3803342359e+022.5534285714e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4868261905e+022.1558067553e+00 + 0.0000000000e+000.0000000000e+005.2956810631e-022.3050719823e+021.3618826135e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4167798450e+021.1434772979e+00 + 0.0000000000e+000.0000000000e+003.2967884828e-026.8685459579e+014.3383167220e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.5948438538e+013.6243632337e-01 + 0.0000000000e+000.0000000000e+005.1827242525e-024.5315348837e+012.8784053156e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2192292359e+012.4558139535e-01 + 0.0000000000e+000.0000000000e+004.2214179373e-024.4141188973e+012.8210270401e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1653323396e+012.4231964093e-01 + 0.0000000000e+000.0000000000e+003.2901324503e-024.3059480795e+012.8351390728e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1560175497e+012.4361192053e-01 + 0.0000000000e+000.0000000000e+003.6589922481e-024.4097934884e+012.8815968992e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1858461240e+012.4824341085e-01 + 0.0000000000e+000.0000000000e+004.4769238667e-024.5699096463e+012.9673699882e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2715701011e+012.5487756045e-01 + 0.0000000000e+000.0000000000e+003.1232976172e-024.4367094013e+012.9164616840e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3015184924e+012.5263074520e-01 + 0.0000000000e+000.0000000000e+004.0530084902e-024.4717996862e+012.8835714286e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2080541713e+012.4557050572e-01 + 0.0000000000e+000.0000000000e+005.1175341454e-024.5851449428e+012.9964950166e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3229314323e+012.5512716870e-01 + 0.0000000000e+000.0000000000e+004.7796234773e-024.5701040975e+013.0361018826e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2836323367e+012.5430786268e-01 + 0.0000000000e+000.0000000000e+003.2372868217e-024.8373587375e+013.1107364341e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4426106755e+012.5577607973e-01 + 0.0000000000e+000.0000000000e+005.5711295681e-025.0712625249e+013.2615780731e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5431678405e+012.6757940199e-01 + 0.0000000000e+000.0000000000e+004.2188704319e-024.6042196973e+013.0458663714e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2924454928e+012.5275393134e-01 + 0.0000000000e+000.0000000000e+004.2130232558e-025.0124137468e+013.1027493540e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5501392248e+012.5765581395e-01 + 0.0000000000e+000.0000000000e+003.4389855742e-024.7595368345e+013.0295523384e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3990135787e+012.5258303814e-01 + 0.0000000000e+000.0000000000e+005.1768800589e-024.4251116409e+012.8524760854e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1173927520e+012.3870559235e-01 + 0.0000000000e+000.0000000000e+004.3453746770e-024.4964556220e+012.9466537468e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2135759505e+012.5205577704e-01 + 0.0000000000e+000.0000000000e+002.9104163458e-024.5261281013e+013.0369628831e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2959463085e+012.5801346505e-01 + 0.0000000000e+000.0000000000e+004.0973355922e-024.4901166384e+012.9743327980e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2886417314e+012.5156571546e-01 + 0.0000000000e+000.0000000000e+005.0490956072e-024.5658029716e+012.9098283499e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2572248985e+012.4576504245e-01 + 0.0000000000e+000.0000000000e+003.3850129199e-024.5495768734e+013.0300387597e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3839179587e+012.5836563307e-01 + 0.0000000000e+000.0000000000e+005.2838759690e-021.0276055349e+029.3542945736e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0171340930e+028.9022325581e-01 + 0.0000000000e+000.0000000000e+006.1103654485e-028.6544994684e+017.4811428571e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.3878584053e+017.0153754153e-01 + 0.0000000000e+000.0000000000e+004.7829237347e-024.6645988097e+013.0426363923e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3574774446e+012.5784082492e-01 + 0.0000000000e+000.0000000000e+003.7033774834e-024.5791617219e+013.0388874172e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3320274834e+012.5735496689e-01 + 0.0000000000e+000.0000000000e+006.6100000000e-022.5965923333e+025.0993333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1742423333e+023.9866666667e-01 + 0.0000000000e+000.0000000000e+005.7120088300e-022.0678152252e+024.5940088300e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.8744664018e+013.6040220751e-01 + 0.0000000000e+000.0000000000e+003.3600177481e-024.3579235734e+012.9295637060e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1234658020e+012.3987708375e-01 + 0.0000000000e+000.0000000000e+004.5946400886e-024.4380408416e+012.9704274640e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1303277962e+012.4005404208e-01 + 0.0000000000e+000.0000000000e+003.6489922481e-024.6161407752e+013.0835038760e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2477131783e+012.5032248062e-01 + 0.0000000000e+000.0000000000e+002.8803986711e-024.5426533776e+013.0674418605e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3123920266e+012.5396456257e-01 + 0.0000000000e+000.0000000000e+003.5128313031e-024.6047769583e+013.1210542636e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3214525729e+012.5480184570e-01 + 0.0000000000e+000.0000000000e+001.1013193060e-015.0497800738e+013.1941173865e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4958840827e+012.6538641565e-01 + 0.0000000000e+000.0000000000e+001.6730544983e-015.1706899188e+013.0560768740e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3439323117e+012.5371718994e-01 + 0.0000000000e+000.0000000000e+001.7669233534e-015.1750454079e+012.9703904571e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0865195155e+012.3523076133e-01 + 0.0000000000e+000.0000000000e+001.5938139535e-015.5354134884e+013.4094152824e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4001863123e+012.6537674419e-01 + 0.0000000000e+000.0000000000e+001.6333178295e-015.5111568328e+013.3652248062e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3663829014e+012.6230874862e-01 + 0.0000000000e+000.0000000000e+001.2555710594e-014.9490865006e+013.0823307494e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1449426541e+012.4166902916e-01 + 0.0000000000e+000.0000000000e+006.7966666667e-022.5866506667e+021.5262000000e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5395185556e+021.2788555556e+00 + 0.0000000000e+000.0000000000e+003.8229654157e-024.8948909205e+022.8769468727e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7653345975e+022.4110735099e+00 + 0.0000000000e+000.0000000000e+004.1236606455e-023.0699977140e+021.8363276936e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8045066236e+021.5286012409e+00 + 0.0000000000e+000.0000000000e+003.6900406054e-027.5663769878e+014.9441432263e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8803589000e+014.0444747139e-01 + 0.0000000000e+000.0000000000e+002.5431023102e-024.5578104950e+013.1801056106e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2969073047e+012.5326930693e-01 + 0.0000000000e+000.0000000000e+004.1419141914e-024.4674202420e+013.0852585259e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1621562156e+012.4251925193e-01 + 0.0000000000e+000.0000000000e+003.9460946095e-024.3647959296e+013.0641914191e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1157409241e+012.4218921892e-01 + 0.0000000000e+000.0000000000e+002.4807480748e-024.3161138614e+013.0804730473e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1300687569e+012.4381738174e-01 + 0.0000000000e+000.0000000000e+004.0429042904e-024.4210616062e+013.0225522552e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1506820682e+012.4103410341e-01 + 0.0000000000e+000.0000000000e+004.0991546523e-024.6232697079e+013.1974132940e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3452360170e+012.6216605871e-01 + 0.0000000000e+000.0000000000e+002.3804933125e-026.9094838675e+014.7066571131e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8416616727e+013.9618377627e-01 + 0.0000000000e+000.0000000000e+002.5907590759e-027.0768481848e+014.7128712871e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8892079208e+013.9372937294e-01 + 0.0000000000e+000.0000000000e+003.6340107695e-024.3044464565e+012.9949452840e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0948584766e+012.3872720167e-01 + 0.0000000000e+000.0000000000e+004.4760002316e-024.4025139396e+013.0305772683e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0971008193e+012.3906157721e-01 + 0.0000000000e+000.0000000000e+002.3377337734e-024.3365511551e+013.0500550055e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1551155116e+012.4174917492e-01 + 0.0000000000e+000.0000000000e+003.6972309073e-024.5186739404e+013.0919554455e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2682288446e+012.5120679173e-01 + 0.0000000000e+000.0000000000e+004.0222410399e-024.5607749045e+013.1030940594e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2445621345e+012.5301763071e-01 + 0.0000000000e+000.0000000000e+002.9977997800e-024.3742079208e+013.0946094609e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1438943894e+012.4499449945e-01 + 0.0000000000e+000.0000000000e+002.4689942678e-024.2278351572e+012.9963754270e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0766728620e+012.3694401019e-01 + 0.0000000000e+000.0000000000e+003.8874413757e-024.2778051068e+012.8971339239e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0690818134e+012.3528921313e-01 + 0.0000000000e+000.0000000000e+004.8349834983e-024.6753300330e+013.2161716172e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2621452145e+012.5346534653e-01 + 0.0000000000e+000.0000000000e+003.4968733715e-024.6497749479e+013.2283611256e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3480931475e+012.5914017718e-01 + 0.0000000000e+000.0000000000e+003.0421805338e-024.3023537650e+013.0176234729e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1213347953e+012.4033177002e-01 + 0.0000000000e+000.0000000000e+004.8239823982e-024.4759240924e+013.0726072607e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1415841584e+012.4438943894e-01 + 0.0000000000e+000.0000000000e+001.6952405767e-024.1765708268e+012.9343306699e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1178354322e+012.3839282612e-01 + 0.0000000000e+000.0000000000e+003.5830872561e-024.3133884691e+012.8917419374e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1431293643e+012.3745975913e-01 + 0.0000000000e+000.0000000000e+004.0099009901e-024.3826347635e+012.9081408141e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1377337734e+012.4130913091e-01 + 0.0000000000e+000.0000000000e+002.6679766661e-024.4914833464e+013.0935383012e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3222837922e+012.6169163627e-01 + 0.0000000000e+000.0000000000e+001.5883489665e-024.1519192939e+012.9143824909e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1362101572e+012.4520605350e-01 + 0.0000000000e+000.0000000000e+003.6303630363e-028.8018976898e+015.5280528053e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.4603135314e+014.5874587459e-01 + 0.0000000000e+000.0000000000e+004.2220774709e-022.4640461525e+021.4548792774e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4757114469e+021.2273857912e+00 + 0.0000000000e+000.0000000000e+002.5887036072e-022.5919954316e+021.5201702275e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5369508193e+021.2850894563e+00 + 0.0000000000e+000.0000000000e+002.3927392739e-024.3203245325e+012.9499449945e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1674037404e+012.4405940594e-01 + 0.0000000000e+000.0000000000e+005.1786448382e-024.7591093090e+013.1641422037e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3887547334e+012.6170640090e-01 + 0.0000000000e+000.0000000000e+001.4979228186e-024.1429093929e+012.9157257831e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1266688090e+012.4028479822e-01 + 0.0000000000e+000.0000000000e+003.7513751375e-024.3734378438e+012.9790979098e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1234543454e+012.3971397140e-01 + 0.0000000000e+000.0000000000e+004.1739476579e-024.3488654826e+012.8981587632e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1517408807e+012.3647052863e-01 + 0.0000000000e+000.0000000000e+003.3035000869e-024.3182445284e+013.0173527879e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1504010335e+012.4631274970e-01 + 0.0000000000e+000.0000000000e+002.0462046205e-024.3089603960e+013.0049504950e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1628052805e+012.4620462046e-01 + 0.0000000000e+000.0000000000e+004.2884531874e-024.6586437598e+013.1814247872e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2873616684e+012.5592561230e-01 + 0.0000000000e+000.0000000000e+004.1944951074e-024.3818545901e+013.0395873140e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1446636341e+012.4555953622e-01 + 0.0000000000e+000.0000000000e+003.3608360836e-024.2960891089e+012.9196919692e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0932343234e+012.3839383938e-01 + 0.0000000000e+000.0000000000e+001.8459845985e-024.2123435817e+013.0106768572e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1229507267e+012.4238434370e-01 + 0.0000000000e+000.0000000000e+005.8514851485e-024.3152108737e+012.8061548260e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0206257310e+012.2889178392e-01 + 0.0000000000e+000.0000000000e+002.1177117712e-024.2792904290e+012.9372937294e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1932343234e+012.4944994499e-01 + 0.0000000000e+000.0000000000e+003.4847504487e-024.7871390481e+013.2754110937e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4671004719e+012.6863195530e-01 + 0.0000000000e+000.0000000000e+001.9222902553e-024.3246761334e+012.9670531527e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2307763158e+012.4366727462e-01 + 0.0000000000e+000.0000000000e+006.0231023102e-024.5074257426e+013.0643564356e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1651815182e+012.4735973597e-01 + 0.0000000000e+000.0000000000e+001.4120635748e-024.1648191767e+012.9672746222e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1344456748e+012.4392912976e-01 + 0.0000000000e+000.0000000000e+003.6451421458e-024.2958980951e+012.8958716924e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0757094407e+012.3703896705e-01 + 0.0000000000e+000.0000000000e+004.6149614961e-024.3453355336e+012.9433443344e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1401540154e+012.4438943894e-01 + 0.0000000000e+000.0000000000e+002.9614961496e-024.4887887789e+013.1176017602e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2027260726e+012.4748074807e-01 + 0.0000000000e+000.0000000000e+002.9614961496e-024.4887887789e+013.1176017602e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2027260726e+012.4748074807e-01 + 0.0000000000e+000.0000000000e+006.2346672167e-024.3630078926e+012.8620936107e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0059640040e+012.2702018557e-01 + 0.0000000000e+000.0000000000e+002.7004262926e-024.2699029985e+013.0009426930e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1445101434e+012.4393691014e-01 + 0.0000000000e+000.0000000000e+003.9251925193e-024.3662926293e+012.9711771177e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0704114411e+012.3458745875e-01 + 0.0000000000e+000.0000000000e+002.6803022408e-024.5760017406e+013.2143933472e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4705455207e+012.7160721006e-01 + 0.0000000000e+000.0000000000e+007.0292687163e-024.9406297225e+013.2964977419e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3933191658e+012.6761171183e-01 + 0.0000000000e+000.0000000000e+002.9339824348e-025.3198500707e+013.8830696359e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2774730436e+013.0334857406e-01 + 0.0000000000e+000.0000000000e+004.2003366263e-022.1741834595e+021.3057665398e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3277170532e+021.0769846281e+00 + 0.0000000000e+000.0000000000e+005.2613245033e-026.9053376358e+024.0699284768e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8004246689e+023.3681397351e+00 + 0.0000000000e+000.0000000000e+005.6258250277e-026.8238073654e+024.0191333333e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7628145349e+023.3341779623e+00 + 0.0000000000e+000.0000000000e+001.6374973045e-022.6484907127e+021.6573377338e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6751253716e+021.3963700024e+00 + 0.0000000000e+000.0000000000e+005.8580858086e-026.3710671067e+014.1914191419e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1913366337e+013.3663366337e-01 + 0.0000000000e+000.0000000000e+002.0814081408e-024.3405808581e+013.0547854785e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1601716172e+012.4514851485e-01 + 0.0000000000e+000.0000000000e+003.1200784552e-024.3198164734e+013.0568434804e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1434819387e+012.4645362892e-01 + 0.0000000000e+000.0000000000e+001.5498885415e-024.2170152097e+012.9223644404e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1761605256e+012.3868388484e-01 + 0.0000000000e+000.0000000000e+006.2200220022e-024.5497095710e+013.0195819582e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1286468647e+012.4050605061e-01 + 0.0000000000e+000.0000000000e+002.3671508598e-024.4835635965e+013.0560799172e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3760862501e+012.4875962596e-01 + 0.0000000000e+000.0000000000e+003.0519910544e-024.6243736972e+013.1800036912e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3337377323e+012.5631188119e-01 + 0.0000000000e+000.0000000000e+004.4350295495e-024.4716518536e+013.0238391281e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1688301481e+012.4211835137e-01 + 0.0000000000e+000.0000000000e+003.5393133998e-024.4363754153e+013.1568106312e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1688294574e+012.4476190476e-01 + 0.0000000000e+000.0000000000e+001.6611295681e-024.2784053156e+013.1063122924e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1495016611e+012.4307862680e-01 + 0.0000000000e+000.0000000000e+003.2692469546e-024.3673234551e+013.0152491694e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1310847730e+012.4042923588e-01 + 0.0000000000e+000.0000000000e+004.4966666667e-024.3834233333e+012.9723333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1371866667e+012.4000000000e-01 + 0.0000000000e+000.0000000000e+003.5416777042e-024.6357144592e+013.1977108168e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3168783444e+012.5791920530e-01 + 0.0000000000e+000.0000000000e+001.9572111847e-024.4393088742e+013.0707336277e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2619394334e+012.4655857248e-01 + 0.0000000000e+000.0000000000e+005.7833333333e-024.4565322222e+012.9510000000e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1325555556e+012.3784444444e-01 + 0.0000000000e+000.0000000000e+002.2682855040e-024.1931964312e+012.9173392200e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1105866887e+012.3810250184e-01 + 0.0000000000e+000.0000000000e+003.5094922737e-024.3778091244e+013.0114385578e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1256866446e+012.3970860927e-01 + 0.0000000000e+000.0000000000e+004.8031007752e-024.4795160207e+012.9979715762e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2214406977e+012.4477519380e-01 + 0.0000000000e+000.0000000000e+003.6233892910e-024.6427620514e+013.1705015658e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3568075363e+012.6134401150e-01 + 0.0000000000e+000.0000000000e+001.9846210449e-024.3907908168e+013.0947490802e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2386284327e+012.5019190581e-01 + 0.0000000000e+000.0000000000e+003.0111111111e-024.2647266667e+012.9322222222e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1268288889e+012.3860000000e-01 + 0.0000000000e+000.0000000000e+004.3839587932e-024.3484891391e+012.9646401766e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1264521707e+012.4074451803e-01 + 0.0000000000e+000.0000000000e+004.6604856512e-024.4925041943e+013.0760264901e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1933589404e+012.4301103753e-01 + 0.0000000000e+000.0000000000e+002.5227373068e-024.3368512141e+013.1100662252e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1967668874e+012.4999116998e-01 + 0.0000000000e+000.0000000000e+005.3852934962e-024.8164312941e+013.2353463161e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3906183711e+012.6146977612e-01 + 0.0000000000e+000.0000000000e+002.6512651265e-024.4795874587e+013.1639163916e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2263036304e+012.5110011001e-01 + 0.0000000000e+000.0000000000e+002.9178970529e-024.3753563488e+013.1527763303e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1779444444e+012.5198280354e-01 + 0.0000000000e+000.0000000000e+001.7927740142e-024.2206469515e+013.0404029877e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0949191419e+012.3887528227e-01 + 0.0000000000e+000.0000000000e+005.5280528053e-024.8891089109e+013.4983498350e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7523102310e+012.9125412541e-01 + 0.0000000000e+000.0000000000e+002.7788778878e-024.5096897690e+013.1993399340e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4500726073e+012.6627062706e-01 + 0.0000000000e+000.0000000000e+002.7577514330e-024.5800159914e+013.2211177697e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3194940724e+012.5742671965e-01 + 0.0000000000e+000.0000000000e+004.0068250246e-024.5010467149e+013.0843827804e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2016236393e+012.4865688872e-01 + 0.0000000000e+000.0000000000e+003.5907590759e-024.3150759076e+012.9799779978e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1048844884e+012.3955995600e-01 + 0.0000000000e+000.0000000000e+001.9177667767e-024.2523477723e+013.0093234323e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1262166529e+012.4395420792e-01 + 0.0000000000e+000.0000000000e+004.7015951595e-024.3859976623e+012.8978272827e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1352959983e+012.3599078658e-01 + 0.0000000000e+000.0000000000e+002.9372937294e-024.5013773377e+013.1938393839e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3876831683e+012.6435643564e-01 + 0.0000000000e+000.0000000000e+002.8446637427e-024.6788640351e+013.2935307018e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4007905702e+012.6900584795e-01 + 0.0000000000e+000.0000000000e+001.9100117249e-024.2787465260e+012.9632349748e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1456417731e+012.4227027966e-01 + 0.0000000000e+000.0000000000e+004.5808580858e-024.3188514851e+012.9108910891e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1205676568e+012.4158415842e-01 + 0.0000000000e+000.0000000000e+003.2711915928e-024.2478449713e+012.8812467431e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0900581140e+012.3872231631e-01 + 0.0000000000e+000.0000000000e+002.7431098373e-024.1828062938e+012.8550568873e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0716151533e+012.3606316224e-01 + 0.0000000000e+000.0000000000e+004.2310231023e-024.3639207921e+012.9513751375e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1589966997e+012.4162816282e-01 + 0.0000000000e+000.0000000000e+004.2188495165e-024.6863847562e+013.2133048173e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3327138049e+012.5944683284e-01 + 0.0000000000e+000.0000000000e+002.4148138498e-024.4683369159e+013.1692034335e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2545117176e+012.5485459730e-01 + 0.0000000000e+000.0000000000e+002.8338833883e-024.2841584158e+013.0363036304e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1085808581e+012.4044004400e-01 + 0.0000000000e+000.0000000000e+003.9530571478e-024.4589915103e+013.0677385502e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1877330822e+012.4459570957e-01 + 0.0000000000e+000.0000000000e+003.7730154594e-024.4365662454e+013.0795661803e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1675595471e+012.4319306931e-01 + 0.0000000000e+000.0000000000e+002.3828382838e-024.2035247525e+012.9623762376e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0503894389e+012.3227722772e-01 + 0.0000000000e+000.0000000000e+004.2816462567e-024.5279046161e+013.0406233715e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2070685578e+012.4824680823e-01 + 0.0000000000e+000.0000000000e+004.0208839963e-024.4987730516e+013.0427649673e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2007235214e+012.4814483093e-01 + 0.0000000000e+000.0000000000e+002.4906490649e-024.2106886689e+012.9544554455e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0884444444e+012.3771177118e-01 + 0.0000000000e+000.0000000000e+004.1145634300e-024.3311895953e+012.9493804644e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0815184377e+012.3729032772e-01 + 0.0000000000e+000.0000000000e+004.2935773841e-024.4102097447e+012.9791123849e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1548963038e+012.4179658097e-01 + 0.0000000000e+000.0000000000e+002.7106710671e-024.3720968097e+013.0849284928e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2443476348e+012.5256325633e-01 + 0.0000000000e+000.0000000000e+002.3850059348e-024.4719719544e+013.1585468415e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2594369825e+012.5501516270e-01 + 0.0000000000e+000.0000000000e+003.9208246483e-024.6248355263e+013.1542144346e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3217753387e+012.5728406722e-01 + 0.0000000000e+000.0000000000e+004.1567930879e-024.4500066445e+013.0636623795e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2399891670e+012.5048298850e-01 + 0.0000000000e+000.0000000000e+002.6810631229e-024.2867142857e+012.9839424142e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1339867110e+012.4149501661e-01 + 0.0000000000e+000.0000000000e+003.3001107420e-024.2746068660e+012.9047619048e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0820155039e+012.3444075305e-01 + 0.0000000000e+000.0000000000e+004.3122923588e-024.3451960133e+012.9664451827e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1123056478e+012.3827242525e-01 + 0.0000000000e+000.0000000000e+002.5168253968e-024.4856761905e+013.1413333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2716622222e+012.5473015873e-01 + 0.0000000000e+000.0000000000e+003.9388668138e-024.5866896247e+013.1211390728e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2443753054e+012.5037233260e-01 + 0.0000000000e+000.0000000000e+004.3166887417e-024.3310637086e+012.9448609272e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0977291391e+012.3611655629e-01 + 0.0000000000e+000.0000000000e+003.3533333333e-024.4145000000e+013.0893333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2196933333e+012.5226666667e-01 + 0.0000000000e+000.0000000000e+003.1070198675e-028.3012199558e+017.4134878587e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.2490698013e+016.8762119205e-01 + 0.0000000000e+000.0000000000e+005.8780078179e-029.9658992468e+019.0669218866e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.8291091798e+018.5146230739e-01 + 0.0000000000e+000.0000000000e+005.6016389812e-024.7076607973e+013.1349235880e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2994743522e+012.5028316722e-01 + 0.0000000000e+000.0000000000e+003.3382339956e-024.5758516556e+013.1505827815e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2648458278e+012.5053929360e-01 + 0.0000000000e+000.0000000000e+004.7195437822e-024.4194183444e+013.0474172185e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1298019500e+012.4102737307e-01 + 0.0000000000e+000.0000000000e+005.0581912145e-024.4897834884e+013.0763787375e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1469210594e+012.4235836102e-01 + 0.0000000000e+000.0000000000e+003.8538205980e-024.4487707641e+013.1096345515e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1425249169e+012.4186046512e-01 + 0.0000000000e+000.0000000000e+002.9213732004e-021.4940190476e+029.7109634551e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0129420819e+028.0254706534e-01 + 0.0000000000e+000.0000000000e+003.8510594315e-022.0876618605e+021.3443467700e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3464956537e+021.1172785530e+00 + 0.0000000000e+000.0000000000e+004.2637821928e-024.7232679912e+013.2811228845e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3065855335e+012.5829462840e-01 + 0.0000000000e+000.0000000000e+002.7478383314e-024.2994788527e+012.9988867132e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1307082059e+012.3668595484e-01 + 0.0000000000e+000.0000000000e+002.9917128092e-024.3120753784e+012.9145459579e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1510718162e+012.3567497231e-01 + 0.0000000000e+000.0000000000e+004.2560338484e-024.4322768948e+012.9941832230e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1543027594e+012.3957064018e-01 + 0.0000000000e+000.0000000000e+002.1172994849e-024.5057508830e+013.1912612215e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3191861295e+012.5560713760e-01 + 0.0000000000e+000.0000000000e+003.2063824289e-024.5969920819e+013.2000095976e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2727128276e+012.5133994094e-01 + 0.0000000000e+000.0000000000e+003.7829457364e-024.4396013289e+013.1021040975e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1679645626e+012.4376522702e-01 + 0.0000000000e+000.0000000000e+001.9584496124e-024.2937932558e+013.0897751938e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1684670543e+012.4491705426e-01 + 0.0000000000e+000.0000000000e+002.1966666667e-024.2916700000e+013.0333333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1398333333e+012.4086666667e-01 + 0.0000000000e+000.0000000000e+004.0309302326e-024.4175168106e+013.0418970100e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1219676080e+012.3883421927e-01 + 0.0000000000e+000.0000000000e+004.1638981174e-024.5650498339e+013.1417497231e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2555481728e+012.4983388704e-01 + 0.0000000000e+000.0000000000e+002.7187153931e-024.6538549280e+013.2528239203e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3452668882e+012.5642303433e-01 + 0.0000000000e+000.0000000000e+003.3280235858e-024.4274916283e+013.1378847550e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1265158962e+012.4078590130e-01 + 0.0000000000e+000.0000000000e+004.6553651185e-024.4157630782e+013.0616722771e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1093323873e+012.3910335673e-01 + 0.0000000000e+000.0000000000e+002.7076411960e-024.3433720930e+013.0664451827e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1898671096e+012.4900332226e-01 + 0.0000000000e+000.0000000000e+003.6127111248e-024.3941407670e+012.9968273525e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1735091124e+012.4339442477e-01 + 0.0000000000e+000.0000000000e+003.3593818985e-024.4910108609e+013.0330331126e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2690094923e+012.4898852097e-01 + 0.0000000000e+000.0000000000e+007.4600000000e-021.8802813333e+021.7888000000e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4766241333e+031.9385333333e+00 + 0.0000000000e+000.0000000000e+009.5546179402e-027.2384667375e+026.9481142857e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8693328844e+037.2442332226e+00 + 0.0000000000e+000.0000000000e+009.2890365449e-028.6493180509e+027.8807087486e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.0093781174e+037.6681838317e+00 + 0.0000000000e+000.0000000000e+006.7630121816e-021.8677254337e+029.2024363234e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3128497601e+027.3289405685e-01 + 0.0000000000e+000.0000000000e+006.3333333333e-022.7688222222e+021.0422222222e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5308888889e+028.6666666667e-01 + 0.0000000000e+000.0000000000e+006.3233665559e-021.6013163529e+029.8818752307e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3833687708e+028.3387227759e-01 + 0.0000000000e+000.0000000000e+008.6411960133e-022.0474651163e+021.0226245847e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0044169435e+028.4604651163e-01 + 0.0000000000e+000.0000000000e+009.6154374308e-023.5579529753e+021.4718990033e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3811096190e+021.2357256552e+00 + 0.0000000000e+000.0000000000e+001.0598294574e-012.0585707235e+021.4841364341e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.4906038915e+021.4752599483e+00 + 0.0000000000e+000.0000000000e+007.5813953488e-023.3232779623e+022.3440420819e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7018134884e+032.4153488372e+00 + 0.0000000000e+000.0000000000e+001.0146976744e-012.7388697586e+029.0262148394e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4328938915e+027.4103565891e-01 + 0.0000000000e+000.0000000000e+006.9851655629e-021.8835858896e+029.9631964680e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2185377837e+028.3751611479e-01 + 0.0000000000e+000.0000000000e+007.9081677704e-023.2784909993e+021.4822803532e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.2253622163e+021.2731061074e+00 + 0.0000000000e+000.0000000000e+009.6772978959e-021.4494965419e+029.5837984496e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7775479690e+028.2788807678e-01 + 0.0000000000e+000.0000000000e+007.8317528767e-021.1221378452e+029.0183428307e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2839370553e+027.7325526391e-01 + 0.0000000000e+000.0000000000e+006.6231714496e-022.8801640574e+021.2694414275e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6614489757e+021.2961344371e+00 + 0.0000000000e+000.0000000000e+009.6666666667e-027.7819901111e+023.4875555556e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6904028444e+033.8961555556e+00 + 0.0000000000e+000.0000000000e+008.9514987080e-022.8171875982e+032.6817525323e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3599059560e+043.2957234367e+01 + 0.0000000000e+000.0000000000e+007.2093023256e-027.5415129568e+038.2831229236e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4734017674e+051.0456644518e+02 + 0.0000000000e+000.0000000000e+008.3565891473e-027.6279133998e+039.7318405316e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8441059049e+051.2621106312e+02 + 0.0000000000e+000.0000000000e+009.7711381488e-026.2124124606e+038.5209529677e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7007298218e+051.1352962296e+02 + 0.0000000000e+000.0000000000e+006.2636938926e-025.3543067513e+037.4452432671e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5282324139e+051.0219777881e+02 + 0.0000000000e+000.0000000000e+008.1822222222e-024.1344072222e+035.4699809524e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1528033441e+057.7322542857e+01 + 0.0000000000e+000.0000000000e+007.8145695364e-021.0409654525e+038.1607931252e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2788000859e+041.0065042573e+01 + 0.0000000000e+000.0000000000e+001.3548763797e-011.0567655857e+027.2384179544e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2212143113e+026.0532568065e-01 + 0.0000000000e+000.0000000000e+003.1023333333e-011.7630285556e+021.1865555556e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1481064444e+029.1312222222e-01 + 0.0000000000e+000.0000000000e+004.2760620155e-011.6215878782e+021.2853765227e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0117260218e+028.2436112957e-01 + 0.0000000000e+000.0000000000e+001.5888268734e-012.0646074551e+021.1540456995e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8162474227e+029.8053887043e-01 + 0.0000000000e+000.0000000000e+008.3022222222e-026.2875548889e+022.7440222222e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9470419556e+032.5892000000e+00 + 0.0000000000e+000.0000000000e+009.5968844592e-028.1577544887e+023.4866164636e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5226841106e+033.3552223699e+00 + 0.0000000000e+000.0000000000e+001.3282392027e-013.7966897010e+022.3994684385e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6623552492e+032.3524916944e+00 + 0.0000000000e+000.0000000000e+007.5083056478e-023.8724562569e+022.6250276855e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.9934039867e+032.8730897010e+00 + 0.0000000000e+000.0000000000e+007.9159204418e-022.4842243951e+022.2023083100e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.2333984126e+032.3855556167e+00 + 0.0000000000e+000.0000000000e+006.7720529801e-024.0011219360e+022.7479791023e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.8583779742e+032.9691072848e+00 + 0.0000000000e+000.0000000000e+001.0710697674e-019.3243892171e+025.4503881137e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.5814390284e+036.0884046512e+00 + 0.0000000000e+000.0000000000e+006.9767441860e-023.7029776301e+021.4503211517e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5425842746e+021.0025249169e+00 + 0.0000000000e+000.0000000000e+007.7325581395e-021.5358791528e+027.4194629014e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1405843300e+026.1137043189e-01 + 0.0000000000e+000.0000000000e+009.6666666667e-023.1339000000e+021.1216666667e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1422916667e+029.3916666667e-01 + 0.0000000000e+000.0000000000e+007.8289036545e-023.7305982558e+023.7788455150e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7709183555e+022.4414119601e+00 + 0.0000000000e+000.0000000000e+006.1422074566e-022.3714267855e+031.1888432263e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.2393814645e+037.6144102621e+00 + 0.0000000000e+000.0000000000e+008.9955555556e-024.6838531556e+039.3796222222e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.9483242667e+039.7739555556e+00 + 0.0000000000e+000.0000000000e+008.5167220377e-021.2166580213e+031.2323628793e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4785730415e+041.7679430417e+01 + 0.0000000000e+000.0000000000e+008.5946843854e-025.6705889258e+022.4352602436e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5389171650e+032.2220487265e+00 + 0.0000000000e+000.0000000000e+001.9581926910e-017.3957415282e+023.8011109635e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5208484199e+033.2834764120e+00 + 0.0000000000e+000.0000000000e+008.8267549669e-026.8988205298e+024.2793748344e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1792470128e+034.2545271523e+00 + 0.0000000000e+000.0000000000e+008.1354672553e-024.1139728035e+022.8181140545e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0562573650e+033.2235172921e+00 + 0.0000000000e+000.0000000000e+007.0444444444e-021.8925966667e+027.8422222222e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2299533333e+027.8866666667e-01 + 0.0000000000e+000.0000000000e+004.8377483444e-024.4478152318e+012.9603016924e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6355866814e+013.0357763061e-01 + 0.0000000000e+000.0000000000e+003.7807455648e-024.7499027084e+013.2971918476e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3642779550e+012.6570328486e-01 + 0.0000000000e+000.0000000000e+002.2181727575e-021.3691347615e+028.8023953488e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5450464747e+017.4629686231e-01 + 0.0000000000e+000.0000000000e+003.8090286976e-025.1148186762e+023.1807918322e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0943682193e+022.7351632082e+00 + 0.0000000000e+000.0000000000e+005.6209713024e-026.7636864349e+024.2139970567e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0457278918e+023.6189812362e+00 + 0.0000000000e+000.0000000000e+002.5024363234e-026.9403370930e+024.3031997047e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1196071041e+023.6988610188e+00 + 0.0000000000e+000.0000000000e+004.3189368771e-026.9482148394e+024.3197342193e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1437754153e+023.7117607973e+00 + 0.0000000000e+000.0000000000e+004.1073243713e-026.7765062243e+024.2420425293e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0565392577e+023.6317104134e+00 + 0.0000000000e+000.0000000000e+002.8413024283e-026.7348077322e+024.2019679912e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0225898896e+023.5907344371e+00 + 0.0000000000e+000.0000000000e+001.5397452935e-026.6772519350e+024.1593560354e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0010506977e+023.5770457364e+00 + 0.0000000000e+000.0000000000e+006.9102990033e-029.8698471761e+025.8458471761e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5679621262e+035.1295681063e+00 + 0.0000000000e+000.0000000000e+001.8757475083e-012.7125585714e+031.9799601329e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.6061333976e+042.4242558140e+01 + 0.0000000000e+000.0000000000e+001.2604651163e-014.1814866888e+034.4994352159e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6624540221e+047.0009612403e+01 + 0.0000000000e+000.0000000000e+007.9789773602e-022.1656639340e+032.3165519901e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6415247344e+043.5286176542e+01 + 0.0000000000e+000.0000000000e+001.1227740986e-012.2927048613e+031.4122990066e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5156693263e+041.5945083517e+01 + 0.0000000000e+000.0000000000e+007.4000000000e-027.7078483333e+024.9497777778e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7851266667e+024.0802222222e+00 + 0.0000000000e+000.0000000000e+001.1451974898e-011.5114974234e+031.0818589332e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3935046002e+038.3873106312e+00 + 0.0000000000e+000.0000000000e+001.3873754153e-013.1357894352e+032.3791893688e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7600800000e+031.9155747508e+01 + 0.0000000000e+000.0000000000e+008.6057767966e-021.7908409740e+031.4159127361e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.9307245511e+031.3067321246e+01 + 0.0000000000e+000.0000000000e+007.1811454172e-021.5288333005e+031.5045371468e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6733127298e+041.6078965499e+01 + 0.0000000000e+000.0000000000e+008.7832783278e-022.3695155336e+032.5723652365e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8124085149e+043.0883212321e+01 + 0.0000000000e+000.0000000000e+009.9580386610e-022.7411806349e+032.6366754675e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0677470688e+042.5590323747e+01 + 0.0000000000e+000.0000000000e+009.7842951750e-021.5453124409e+031.6612913907e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0139407966e+041.6632034059e+01 + 0.0000000000e+000.0000000000e+007.6442762535e-022.3130278138e+031.7651814775e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0642702532e+041.7308984767e+01 + 0.0000000000e+000.0000000000e+001.3901904762e-011.5689228215e+031.5343704651e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.5579347493e+031.4603133555e+01 + 0.0000000000e+000.0000000000e+001.1018415842e-012.1218646937e+032.4647111221e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.3086113248e+031.9731849505e+01 + 0.0000000000e+000.0000000000e+008.9108910891e-021.7533119472e+031.9514191419e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0259132277e+041.9733069307e+01 + 0.0000000000e+000.0000000000e+009.4290319397e-021.0061564734e+031.2729079087e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2002847452e+041.5503099350e+01 + 0.0000000000e+000.0000000000e+001.2735326689e-011.8647808638e+031.5304983389e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3149098383e+041.7671362126e+01 + 0.0000000000e+000.0000000000e+006.1395348837e-027.4355348062e+031.9607054264e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2533651938e+041.8970199336e+01 + 0.0000000000e+000.0000000000e+001.3126799557e-012.1183478616e+043.5849813953e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5382699092e+042.8953220377e+01 + 0.0000000000e+000.0000000000e+001.0930463576e-014.7343921854e+031.1675470199e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0277821126e+041.1897509934e+01 + 0.0000000000e+000.0000000000e+004.0273142016e-024.3259014570e+012.9675202355e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0944918617e+012.3680117734e-01 + 0.0000000000e+000.0000000000e+001.8000000000e-024.3744444444e+013.1480000000e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2149066667e+012.5177777778e-01 + 0.0000000000e+000.0000000000e+005.8349374540e-024.4928638116e+012.9957380427e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1446434143e+012.3868373804e-01 + 0.0000000000e+000.0000000000e+001.3406181015e-024.4708784106e+013.2569286240e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3323010302e+012.5669403974e-01 + 0.0000000000e+000.0000000000e+004.6822222222e-024.5001466667e+013.0535555556e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1513866667e+012.4202222222e-01 + 0.0000000000e+000.0000000000e+001.7648431155e-024.5791225249e+013.2455710594e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3727402805e+012.6152993725e-01 + 0.0000000000e+000.0000000000e+005.9251568845e-024.4863685862e+013.0213178295e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1445563861e+012.4259228498e-01 + 0.0000000000e+000.0000000000e+001.7769472130e-024.2752482466e+013.0157807309e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1436916759e+012.4381967516e-01 + 0.0000000000e+000.0000000000e+003.0687113595e-024.4054364480e+013.1779278784e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2047720842e+012.4857362874e-01 + 0.0000000000e+000.0000000000e+003.9510080942e-024.4064108609e+013.0478469463e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1592084621e+012.4281780721e-01 + 0.0000000000e+000.0000000000e+003.4708674788e-024.5429190255e+013.0732284976e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3404923219e+012.5709139904e-01 + 0.0000000000e+000.0000000000e+001.1355195705e-024.4845387670e+013.1391894568e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3507219533e+012.6100690854e-01 + 0.0000000000e+000.0000000000e+003.0840199914e-024.2631083681e+012.9383807255e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1549559118e+012.4334349660e-01 + 0.0000000000e+000.0000000000e+004.5324532453e-024.7854565457e+013.2915291529e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5871023102e+012.6644664466e-01 + 0.0000000000e+000.0000000000e+002.8702817302e-024.3496138942e+013.1257192607e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1779417780e+012.5043060929e-01 + 0.0000000000e+000.0000000000e+008.5796909492e-034.1883545107e+012.9133973510e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2064712804e+012.4178094187e-01 + 0.0000000000e+000.0000000000e+005.8165448505e-024.4860065412e+012.9142646733e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1679706645e+012.4427822075e-01 + 0.0000000000e+000.0000000000e+001.0631229236e-024.5648504983e+013.2801771872e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3956699889e+012.6832779623e-01 + 0.0000000000e+000.0000000000e+003.0299003322e-024.3084883721e+013.0202657807e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1617574751e+012.4554817276e-01 + 0.0000000000e+000.0000000000e+004.2923588040e-024.3688593577e+012.9289036545e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0895016611e+012.3632336656e-01 + 0.0000000000e+000.0000000000e+003.2680730897e-024.7062196752e+013.3106109265e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4170168771e+012.6853355482e-01 + 0.0000000000e+000.0000000000e+001.0541860465e-021.7366660724e+021.0976653747e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1654036279e+029.2395813953e-01 + 0.0000000000e+000.0000000000e+003.3355481728e-024.3979468439e+013.0279069767e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2088372093e+012.5275747508e-01 + 0.0000000000e+000.0000000000e+003.9702657807e-024.7457868771e+013.2521059432e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3931854005e+012.6535105205e-01 + 0.0000000000e+000.0000000000e+002.9720750552e-024.3120307947e+013.0363097866e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1294670714e+012.4019426049e-01 + 0.0000000000e+000.0000000000e+001.3712582781e-024.3739358720e+013.2101346578e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1951840397e+012.5147240618e-01 + 0.0000000000e+000.0000000000e+005.9499667774e-024.4799563123e+013.0335647841e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0814292691e+012.3355813953e-01 + 0.0000000000e+000.0000000000e+002.1616832780e-024.3819468439e+013.1013842746e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2357236988e+012.5038759690e-01 + 0.0000000000e+000.0000000000e+002.1616832780e-024.3819468439e+013.1013842746e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2357236988e+012.5038759690e-01 + 0.0000000000e+000.0000000000e+001.3333333333e-024.6753333333e+013.4000000000e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4496666667e+012.7000000000e-01 + 0.0000000000e+000.0000000000e+006.3122923588e-024.5259136213e+013.0564784053e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1644518272e+012.4584717608e-01 + 0.0000000000e+000.0000000000e+001.6711513498e-024.3185742375e+012.9473847293e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2147324995e+012.4173560538e-01 + 0.0000000000e+000.0000000000e+002.9766891818e-024.2968897714e+013.0224934545e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1863350531e+012.4580592286e-01 + 0.0000000000e+000.0000000000e+003.9865337763e-024.4588090365e+013.1647545220e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2238228424e+012.5323351790e-01 + 0.0000000000e+000.0000000000e+003.3204415011e-024.3152150993e+012.9172774099e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1320418837e+012.4187667403e-01 + 0.0000000000e+000.0000000000e+001.0429693516e-024.5001718774e+013.1513014015e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3630344987e+012.6204373941e-01 + 0.0000000000e+000.0000000000e+005.8637873754e-024.3897718715e+012.8965669989e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0725027685e+012.3325581395e-01 + 0.0000000000e+000.0000000000e+001.7763012182e-024.3000575858e+013.0197120709e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1909147287e+012.4872646733e-01 + 0.0000000000e+000.0000000000e+003.9169435216e-024.4172325581e+012.9910299003e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1737275748e+012.3627906977e-01 + 0.0000000000e+000.0000000000e+001.0963455150e-024.1466666667e+012.9579180509e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1165669989e+012.3909191584e-01 + 0.0000000000e+000.0000000000e+009.2870967269e-021.3860058602e+021.3186782836e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3595749015e+021.2655698811e+00 + 0.0000000000e+000.0000000000e+002.6483370125e-025.0319746284e+013.6496335541e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8176280868e+013.0845643856e-01 + 0.0000000000e+000.0000000000e+003.9277777778e-024.7852521111e+022.8137111111e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7050517778e+022.3488666667e+00 + 0.0000000000e+000.0000000000e+005.2417660044e-025.4897102494e+023.1995595291e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0555263628e+022.6939462104e+00 + 0.0000000000e+000.0000000000e+004.0522760775e-025.5586789455e+023.2820245979e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1257330972e+022.7422416448e+00 + 0.0000000000e+000.0000000000e+002.0996677741e-025.5659712071e+023.2479734219e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0905931340e+022.7190254707e+00 + 0.0000000000e+000.0000000000e+005.1107493051e-025.6273868232e+023.2950571678e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1304873450e+022.7528498823e+00 + 0.0000000000e+000.0000000000e+004.0697601080e-025.4232224792e+023.1962495875e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0257260548e+022.6546252008e+00 + 0.0000000000e+000.0000000000e+003.9867109635e-025.4485802879e+023.2017718715e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0372934662e+022.6602436323e+00 + 0.0000000000e+000.0000000000e+001.5108578469e-025.6000986678e+023.2820999538e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1279159094e+022.7637956261e+00 + 0.0000000000e+000.0000000000e+005.6231399382e-025.5068758616e+023.2460174327e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0655993730e+022.6879983939e+00 + 0.0000000000e+000.0000000000e+001.3984053156e-028.8883391451e+025.1906019934e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8739533688e+024.3575517165e+00 + 0.0000000000e+000.0000000000e+003.1263576159e-021.0833539408e+036.3204556291e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8948141457e+025.3136441501e+00 + 0.0000000000e+000.0000000000e+003.9281717307e-021.0631615909e+036.1533499080e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7379836483e+025.1698340337e+00 + 0.0000000000e+000.0000000000e+002.4750830565e-021.1018827907e+036.4349169435e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9996521595e+025.4034551495e+00 + 0.0000000000e+000.0000000000e+002.0243632337e-021.1154285271e+036.4922259136e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.0523774086e+025.4436323367e+00 + 0.0000000000e+000.0000000000e+001.0930232558e-021.0992260133e+036.4139867110e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9861915836e+025.3881616833e+00 + 0.0000000000e+000.0000000000e+005.7807308970e-021.1044302326e+036.4531561462e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9968073090e+025.3940199336e+00 + 0.0000000000e+000.0000000000e+001.5489368771e-021.0539030045e+036.1609531931e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7477935231e+025.1633971576e+00 + 0.0000000000e+000.0000000000e+002.7755187638e-021.0947503353e+036.3931330390e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9683070611e+025.3733827079e+00 + 0.0000000000e+000.0000000000e+004.1716683901e-021.1200861286e+036.5078849750e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.0587529042e+025.4550695254e+00 + 0.0000000000e+000.0000000000e+003.1406423034e-021.0856266888e+036.3827685493e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9068081949e+025.3115614618e+00 + 0.0000000000e+000.0000000000e+001.2292358804e-021.0992368771e+036.4124031008e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9829623477e+025.3715946844e+00 + 0.0000000000e+000.0000000000e+003.0431893688e-021.0786842525e+036.3045847176e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8637142857e+025.2797342193e+00 + 0.0000000000e+000.0000000000e+003.9047619048e-021.1845756257e+036.8890143965e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.4446727575e+025.8016832780e+00 + 0.0000000000e+000.0000000000e+003.1076323953e-021.1312010454e+036.5744259386e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.1340024239e+025.5246283543e+00 + 0.0000000000e+000.0000000000e+001.5529065489e-021.1210660132e+036.5253186166e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.0776273584e+025.4704679912e+00 + 0.0000000000e+000.0000000000e+005.3605020303e-029.2343412625e+025.4108645257e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0566036619e+024.5271184939e+00 + 0.0000000000e+000.0000000000e+001.6748916415e-026.1597459561e+023.6262009637e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4589084941e+023.0459455238e+00 + 0.0000000000e+000.0000000000e+002.9884527660e-025.8054627925e+023.3747624915e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2512127683e+022.8510422946e+00 + 0.0000000000e+000.0000000000e+003.8892580288e-025.8116301218e+023.4066002215e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2438733112e+022.8509856035e+00 + 0.0000000000e+000.0000000000e+003.1311192273e-025.7893527810e+023.4108006425e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2435407417e+022.8537336912e+00 + 0.0000000000e+000.0000000000e+001.5875961658e-025.7749473297e+023.4145481948e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2348529460e+022.8314822556e+00 + 0.0000000000e+000.0000000000e+002.7242524917e-025.8720823920e+023.4543521595e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2756358804e+022.8579401993e+00 + 0.0000000000e+000.0000000000e+003.8239202658e-025.6990860465e+023.3589479513e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1970244740e+022.7970764120e+00 + 0.0000000000e+000.0000000000e+003.4422296050e-025.5958824289e+023.3064784053e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1398499446e+022.7473421927e+00 + 0.0000000000e+000.0000000000e+001.3888888889e-025.6681777778e+023.3444444444e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1936888889e+022.7983333333e+00 + 0.0000000000e+000.0000000000e+005.1500553710e-025.6876053525e+023.3191325212e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1829324843e+022.7828405316e+00 + 0.0000000000e+000.0000000000e+002.1232779623e-025.8116824252e+023.4016897010e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2444242935e+022.8514928018e+00 + 0.0000000000e+000.0000000000e+002.7083942414e-025.7954806977e+023.4215993355e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2560144662e+022.8642768549e+00 + 0.0000000000e+000.0000000000e+001.3394644782e-025.8037099646e+023.4180346600e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2483727589e+022.8477363901e+00 + 0.0000000000e+000.0000000000e+005.3548876812e-025.9168348859e+023.4592189391e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2966995556e+022.8984319377e+00 + 0.0000000000e+000.0000000000e+001.9739202658e-026.1755005629e+023.6439359542e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4606781082e+023.0434437062e+00 + 0.0000000000e+000.0000000000e+002.6171081678e-026.4497582597e+023.7959179544e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6026871266e+023.1702877116e+00 + 0.0000000000e+000.0000000000e+004.0762251656e-023.0435816291e+021.8114264901e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7892713179e+021.5082900662e+00 + 0.0000000000e+000.0000000000e+003.2452602436e-027.8176065559e+015.1024784053e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.0464207420e+014.2412469546e-01 + 0.0000000000e+000.0000000000e+001.3820598007e-021.1135486157e+027.0420819491e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7835836102e+015.8405315615e-01 + 0.0000000000e+000.0000000000e+004.4662236988e-026.0638992248e+013.9167220377e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9778959025e+013.1951273533e-01 + 0.0000000000e+000.0000000000e+002.9235880399e-024.2591362126e+012.9235880399e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1566112957e+012.4385382060e-01 + 0.0000000000e+000.0000000000e+002.8470404025e-024.5603624013e+013.1532929235e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3169364187e+012.5838848430e-01 + 0.0000000000e+000.0000000000e+001.6756617016e-024.3324017183e+013.0628754043e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1258996832e+012.3865470507e-01 + 0.0000000000e+000.0000000000e+005.2657216685e-024.4550010631e+013.0049612403e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1621179033e+012.4365684755e-01 + 0.0000000000e+000.0000000000e+002.1351642673e-024.2483134441e+013.0182945736e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1504679217e+012.4079497970e-01 + 0.0000000000e+000.0000000000e+002.8270579550e-024.3532665559e+013.0311498708e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1700709671e+012.4504946475e-01 + 0.0000000000e+000.0000000000e+003.8555555556e-024.3704055556e+013.0333333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1005222222e+012.3622222222e-01 + 0.0000000000e+000.0000000000e+004.2386313466e-024.8225277778e+013.3288557763e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4214930464e+012.6324871229e-01 + 0.0000000000e+000.0000000000e+001.9934838251e-024.4201378738e+013.1097617948e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2430145395e+012.5158148336e-01 + 0.0000000000e+000.0000000000e+002.6212181617e-024.2939843485e+013.0310490956e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0983690808e+012.3616980436e-01 + 0.0000000000e+000.0000000000e+003.7528476821e-024.4512033848e+013.0690125092e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2404320530e+012.4750257542e-01 + 0.0000000000e+000.0000000000e+003.7382634290e-024.3858855040e+012.9674319352e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1660412804e+012.4271964680e-01 + 0.0000000000e+000.0000000000e+001.6196751569e-024.1569179033e+012.9003912883e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1179737542e+012.3938870432e-01 + 0.0000000000e+000.0000000000e+004.8006644518e-024.6435946844e+013.1186046512e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2850365449e+012.5441860465e-01 + 0.0000000000e+000.0000000000e+002.4451827243e-024.3910431894e+013.0378737542e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2287973422e+012.5156146179e-01 + 0.0000000000e+000.0000000000e+002.5933665559e-024.4095386674e+013.1741303064e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2614290255e+012.5988678479e-01 + 0.0000000000e+000.0000000000e+002.2383056478e-022.4364301864e+021.5090543005e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5968137973e+021.2832915098e+00 + 0.0000000000e+000.0000000000e+004.5094721299e-021.0987932580e+026.9229014396e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.0360031377e+015.8578626800e-01 + 0.0000000000e+000.0000000000e+002.3200000000e-024.2962955556e+012.9246666667e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2344488889e+012.4497777778e-01 + 0.0000000000e+000.0000000000e+002.5813805832e-024.5029091842e+013.0679357697e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3144715615e+012.5523816907e-01 + 0.0000000000e+000.0000000000e+003.9867109635e-024.5062292359e+013.0730897010e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2302325581e+012.5166112957e-01 + 0.0000000000e+000.0000000000e+004.8274640089e-024.4128060244e+012.9894189738e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1450581026e+012.4232292359e-01 + 0.0000000000e+000.0000000000e+002.0108527132e-024.3086657364e+013.0089198966e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2505576227e+012.4932713178e-01 + 0.0000000000e+000.0000000000e+004.9479512735e-024.3901317829e+012.8750830565e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1236035437e+012.3767441860e-01 + 0.0000000000e+000.0000000000e+003.3678626800e-024.2969958140e+012.9295526024e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1711832780e+012.4546511628e-01 + 0.0000000000e+000.0000000000e+003.5568327796e-024.6004693023e+013.1560509413e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3263194906e+012.5921926910e-01 + 0.0000000000e+000.0000000000e+002.7687227759e-024.3397551421e+012.9358379476e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1550438427e+012.4100295312e-01 + 0.0000000000e+000.0000000000e+005.2800000000e-024.4445388889e+012.9806666667e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1742755556e+012.4561111111e-01 + 0.0000000000e+000.0000000000e+003.3866666667e-024.4092044444e+013.0333333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2338711111e+012.4508888889e-01 + 0.0000000000e+000.0000000000e+003.0618420081e-024.3155790439e+012.9280136582e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1672701772e+012.4029040236e-01 + 0.0000000000e+000.0000000000e+004.5162988060e-024.2693688439e+012.8279698402e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0657033212e+012.3320431711e-01 + 0.0000000000e+000.0000000000e+003.0352071391e-024.5397028871e+013.1555135777e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2812193525e+012.5664665480e-01 + 0.0000000000e+000.0000000000e+001.6050568873e-024.3577602592e+013.0862906027e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2057080402e+012.5066907678e-01 + 0.0000000000e+000.0000000000e+003.8613861386e-024.3738283828e+012.9570957096e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1568316832e+012.3960396040e-01 + 0.0000000000e+000.0000000000e+003.8043903075e-024.4187984193e+013.0441136877e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1568001889e+012.4389362949e-01 + 0.0000000000e+000.0000000000e+003.2968198136e-024.3155954201e+013.0096816919e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1090842995e+012.4056181605e-01 + 0.0000000000e+000.0000000000e+001.7601760176e-024.1915291529e+012.9922992299e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0898789879e+012.3762376238e-01 + 0.0000000000e+000.0000000000e+004.4441006601e-024.6594477954e+013.1696199554e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2767625897e+012.5655126368e-01 + 0.0000000000e+000.0000000000e+002.8661303630e-024.4602595753e+013.0511721238e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2495377403e+012.4790418187e-01 + 0.0000000000e+000.0000000000e+002.2442244224e-024.3007920792e+013.0627062706e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1529372937e+012.4180418042e-01 + 0.0000000000e+000.0000000000e+003.7843820566e-024.3003058016e+012.9238409038e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0673780362e+012.3552190087e-01 + 0.0000000000e+000.0000000000e+003.6809644780e-024.3277272017e+012.9828697672e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1391258142e+012.4280593191e-01 + 0.0000000000e+000.0000000000e+002.1122112211e-024.2009900990e+012.9636963696e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1253465347e+012.4092409241e-01 + 0.0000000000e+000.0000000000e+002.4820435991e-024.4309208572e+013.0403856175e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2018280897e+012.4745418621e-01 + 0.0000000000e+000.0000000000e+003.6763722425e-025.0694652814e+013.4684152626e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5561741105e+012.8561512072e-01 + 0.0000000000e+000.0000000000e+003.3993399340e-024.8240594059e+013.3410341034e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4734983498e+012.7513751375e-01 + 0.0000000000e+000.0000000000e+002.0492878235e-024.3132713653e+013.0453751954e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1690928905e+012.4487236553e-01 + 0.0000000000e+000.0000000000e+004.5458716924e-024.4979321551e+013.1034696891e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1627761964e+012.4235535725e-01 + 0.0000000000e+000.0000000000e+003.9163916392e-024.4203080308e+013.0803080308e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1549614961e+012.4070407041e-01 + 0.0000000000e+000.0000000000e+002.1934384228e-024.4512685861e+013.1186345608e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2059903777e+012.4754364252e-01 + 0.0000000000e+000.0000000000e+003.6316440855e-024.4835102918e+013.0607933820e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1590118226e+012.4186229807e-01 + 0.0000000000e+000.0000000000e+003.6303630363e-024.3333333333e+013.0363036304e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1118811881e+012.4092409241e-01 + 0.0000000000e+000.0000000000e+002.3300330033e-024.4080759076e+013.2168316832e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2204752475e+012.5250825083e-01 + 0.0000000000e+000.0000000000e+002.1075212784e-024.3585146778e+013.1832204273e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1257337155e+012.3937641133e-01 + 0.0000000000e+000.0000000000e+003.7351629900e-024.4710815818e+013.2354814429e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1853366916e+012.5042556887e-01 + 0.0000000000e+000.0000000000e+004.0176017602e-024.7438558856e+013.4144114411e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3535324532e+012.6818481848e-01 + 0.0000000000e+000.0000000000e+002.2669720919e-021.7132643673e+021.0524010625e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0881398399e+028.6092908633e-01 + 0.0000000000e+000.0000000000e+003.1334679521e-024.1819933885e+022.4656957472e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3764841425e+022.0527672833e+00 + 0.0000000000e+000.0000000000e+003.9845984598e-025.4565814081e+023.2041364136e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0236721672e+022.6546204620e+00 + 0.0000000000e+000.0000000000e+001.9981616583e-024.3167688437e+022.5731722251e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4534827254e+022.1234236582e+00 + 0.0000000000e+000.0000000000e+002.5683949974e-021.7443827514e+021.0813162237e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1185641393e+028.9241792600e-01 + 0.0000000000e+000.0000000000e+003.2673267327e-024.5019900990e+013.1577557756e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2048448845e+012.4920792079e-01 + 0.0000000000e+000.0000000000e+003.6489273927e-024.6583205446e+013.2575907591e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2802132838e+012.5699257426e-01 + 0.0000000000e+000.0000000000e+001.4720847085e-024.2249566832e+013.0783828383e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0904324807e+012.3800192519e-01 + 0.0000000000e+000.0000000000e+003.3696369637e-024.3883443344e+013.1212321232e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0820176018e+012.3667766777e-01 + 0.0000000000e+000.0000000000e+004.1341555208e-024.3996222280e+013.0328411789e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0893240403e+012.3836865265e-01 + 0.0000000000e+000.0000000000e+001.9758554803e-024.4049179260e+013.1506571710e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2018607782e+012.4481066528e-01 + 0.0000000000e+000.0000000000e+002.8338833883e-024.6823861386e+013.2926292629e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3646017602e+012.5772277228e-01 + 0.0000000000e+000.0000000000e+004.3139976249e-024.4405246213e+013.0724914213e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1010373455e+012.3890783118e-01 + 0.0000000000e+000.0000000000e+002.8320529801e-024.3858397351e+013.1164326711e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1784932156e+012.4426048565e-01 + 0.0000000000e+000.0000000000e+001.7121594684e-024.3896053156e+013.1457984496e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2336739461e+012.4668881506e-01 + 0.0000000000e+000.0000000000e+003.6202467126e-024.4000306667e+013.0603958109e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1106860392e+012.3896239907e-01 + 0.0000000000e+000.0000000000e+003.9116997792e-024.5160353201e+013.1751655629e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1704194260e+012.4430463576e-01 + 0.0000000000e+000.0000000000e+002.4987323236e-024.5293240771e+013.1557886915e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2621080694e+012.5228837453e-01 + 0.0000000000e+000.0000000000e+002.6083897863e-024.2552265503e+012.9530093799e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0700624023e+012.3556279312e-01 + 0.0000000000e+000.0000000000e+004.7821492676e-024.3824093133e+013.0224581669e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0665393579e+012.3574633779e-01 + 0.0000000000e+000.0000000000e+002.1584158416e-024.3408239824e+013.1107810781e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1852893289e+012.4828382838e-01 + 0.0000000000e+000.0000000000e+003.7182621917e-024.4933815408e+013.1076726277e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1675565058e+012.3886049070e-01 + 0.0000000000e+000.0000000000e+003.9058693245e-024.4947120709e+013.1445182724e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1500897010e+012.4064230343e-01 + 0.0000000000e+000.0000000000e+003.0166112957e-024.7886777409e+013.4338870432e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3535681063e+012.6099667774e-01 + 0.0000000000e+000.0000000000e+001.4707973422e-024.3009100886e+013.1665249169e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1606371170e+012.4525223330e-01 + 0.0000000000e+000.0000000000e+003.3121483942e-024.4906402990e+013.2289346622e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2070295496e+012.4943215209e-01 + 0.0000000000e+000.0000000000e+004.0111849391e-024.6689897010e+013.2937320044e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3384760059e+012.6309007014e-01 + 0.0000000000e+000.0000000000e+002.6111111111e-024.3690000000e+013.1688888889e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1436666667e+012.4255555556e-01 + 0.0000000000e+000.0000000000e+002.5674760854e-024.4074973510e+013.1314643120e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1717111847e+012.4426490066e-01 + 0.0000000000e+000.0000000000e+005.3480794702e-029.8398026490e+016.1827579102e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.9262154820e+014.9817954378e-01 + 0.0000000000e+000.0000000000e+001.4510741971e-022.9451163234e+021.7631905500e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7434546386e+021.4662842377e+00 + 0.0000000000e+000.0000000000e+002.6180648757e-023.1949460166e+021.9059398400e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8717866167e+021.5899953796e+00 + 0.0000000000e+000.0000000000e+002.4097498160e-024.3995377116e+013.0550294334e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2113330022e+012.4394260486e-01 + 0.0000000000e+000.0000000000e+005.1770579550e-024.4178315799e+012.9789276486e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1366812292e+012.4126688815e-01 + 0.0000000000e+000.0000000000e+001.4928017719e-024.3071760797e+013.0728682171e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1975503876e+012.4726467331e-01 + 0.0000000000e+000.0000000000e+003.4617940199e-024.6850730897e+013.2348837209e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2941362126e+012.5249169435e-01 + 0.0000000000e+000.0000000000e+003.5072351421e-024.2301767028e+025.0216320413e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1267412666e+047.8931322997e+00 + 0.0000000000e+000.0000000000e+001.4590875644e-022.2469489928e+032.6858556880e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.2324785480e+044.3148612656e+01 + 0.0000000000e+000.0000000000e+009.2847242085e-033.9286336802e+034.5223687048e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0534362392e+057.3446793250e+01 + 0.0000000000e+000.0000000000e+001.9280177187e-025.1047593466e+036.3539723145e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6021955069e+051.0709457364e+02 + 0.0000000000e+000.0000000000e+001.4680131717e-025.7919766641e+037.5023278549e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8112010005e+051.2107390904e+02 + 0.0000000000e+000.0000000000e+005.3863134658e-036.1326713979e+037.3819401407e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7594627906e+051.1748817290e+02 + 0.0000000000e+000.0000000000e+002.9235880399e-024.6199404762e+035.4168881506e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2593006645e+058.4660797342e+01 + 0.0000000000e+000.0000000000e+001.4332225914e-011.0319465116e+033.9156146179e+000.0000000000e+00NaN6.5780730897e-030.0000000000e+003.9896110963e+034.3381395349e+00 + 0.0000000000e+000.0000000000e+005.9797416021e-021.2074432194e+037.3794790698e+000.0000000000e+00NaN3.0088593577e-020.0000000000e+009.7400483197e+038.0666349575e+00 + 0.0000000000e+000.0000000000e+008.2233333333e-027.0928903333e+022.2293111111e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2437212222e+032.2196888889e+00 + 0.0000000000e+000.0000000000e+003.5196740250e-016.2355793767e+022.3930518028e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5142555489e+032.2763345843e+00 + 0.0000000000e+000.0000000000e+009.8526765088e-021.5891938960e+034.3758656575e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7689548649e+034.0604423445e+00 + 0.0000000000e+000.0000000000e+003.1028054633e-025.3904897748e+022.4196825397e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8138974640e+032.2091897379e+00 + 0.0000000000e+000.0000000000e+004.2144959529e-022.3812342899e+039.7646063282e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.2352225166e+039.6202906549e+00 + 0.0000000000e+000.0000000000e+006.2663087721e-028.3458486106e+023.7165527711e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2823794104e+033.6245173924e+00 + 0.0000000000e+000.0000000000e+003.2858619417e-029.7117227124e+022.6669631229e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6280148842e+032.6605141750e+00 + 0.0000000000e+000.0000000000e+006.7635025754e-022.5328070434e+021.0434156733e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0028305644e+028.6566379691e-01 + 0.0000000000e+000.0000000000e+008.2920529801e-026.2197581788e+021.6238509934e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.0863163245e+021.6260695364e+00 + 0.0000000000e+000.0000000000e+001.8100000000e-011.5056116667e+021.0878333333e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.9752833333e+028.3916666667e-01 + 0.0000000000e+000.0000000000e+003.6777851606e-015.1275639646e+022.9091439646e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8463418832e+032.7989291251e+00 + 0.0000000000e+000.0000000000e+002.3924370616e-011.0303876924e+035.5246115910e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4675045946e+035.5090486526e+00 + 0.0000000000e+000.0000000000e+008.8528888889e-011.2488432889e+036.1577333333e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0800406222e+035.6294222222e+00 + 0.0000000000e+000.0000000000e+002.4289819121e-012.1952686754e+031.0842162274e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9864234617e+041.5913378516e+01 + 0.0000000000e+000.0000000000e+001.9296847545e-014.2326598802e+034.7074448837e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1676783751e+058.1686199262e+01 + 0.0000000000e+000.0000000000e+003.4839365079e-016.3200332095e+035.8256614286e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3996686809e+059.9142117460e+01 + 0.0000000000e+000.0000000000e+002.0724252492e-011.6236125183e+045.9982657807e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.5211089369e+047.6756478405e+01 + 0.0000000000e+000.0000000000e+002.7806201550e-011.7253765205e+042.6668571429e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8232953588e+042.5601805094e+01 + 0.0000000000e+000.0000000000e+004.1390180879e-017.7672626918e+031.4707945367e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2753525670e+031.1729621262e+01 + 0.0000000000e+000.0000000000e+003.7063281825e-013.1420595350e+031.2964206034e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3146827638e+031.1362057395e+01 + 0.0000000000e+000.0000000000e+002.9661708947e-019.9529588696e+032.4358823128e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8477364521e+031.8306859548e+01 + 0.0000000000e+000.0000000000e+003.3630564784e-013.9705509762e+044.3008981949e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.8782124507e+033.1263594168e+01 + 0.0000000000e+000.0000000000e+001.9126048565e-011.8410945816e+042.8216665121e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.3900794525e+032.2337901692e+01 + 0.0000000000e+000.0000000000e+001.4159222753e-017.6143767249e+035.2616744956e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.1969010203e+034.0086920530e+01 + 0.0000000000e+000.0000000000e+002.3324473976e-016.7915296346e+032.0722967885e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0726504075e+041.8548682171e+01 + 0.0000000000e+000.0000000000e+002.0854051616e-014.1182100495e+045.0841103936e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1138413823e+043.5941803481e+01 + 0.0000000000e+000.0000000000e+001.7665091979e-019.2157479515e+031.7049673657e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0111249229e+041.5156114349e+01 + 0.0000000000e+000.0000000000e+001.8763248431e-015.6905296268e+031.5559598929e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4575399936e+031.4467231672e+01 + 0.0000000000e+000.0000000000e+001.9269102990e-012.7590642525e+043.0919933555e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.7678199336e+032.1957807309e+01 + 0.0000000000e+000.0000000000e+001.6985603544e-011.0985677143e+042.5854418605e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.0667559801e+032.0481926910e+01 + 0.0000000000e+000.0000000000e+002.3774086379e-012.4393587508e+043.0063388704e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0573517121e+042.3520930233e+01 + 0.0000000000e+000.0000000000e+002.4983388704e-012.1353711296e+031.4712159468e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4877987076e+041.6739401993e+01 + 0.0000000000e+000.0000000000e+001.8913458841e-011.7198084565e+031.5762022961e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6242251429e+041.7900679660e+01 + 0.0000000000e+000.0000000000e+001.8984444444e-017.5435385778e+033.6575022222e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3464337711e+043.9233977778e+01 + 0.0000000000e+000.0000000000e+002.2010180879e-013.3174106100e+044.0188004651e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2249625223e+042.8695984865e+01 + 0.0000000000e+000.0000000000e+001.8387596899e-015.0780919367e+044.0905006460e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8399647102e+032.4672959579e+01 + 0.0000000000e+000.0000000000e+001.6300110742e-011.8461846425e+041.7988570506e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4267383352e+031.3113241971e+01 + 0.0000000000e+000.0000000000e+001.9308970100e-018.2527759468e+031.2294750831e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.9457322259e+039.4279069767e+00 + 0.0000000000e+000.0000000000e+001.6155363603e-015.5324851784e+045.8830323108e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7067003228e+044.3992873274e+01 + 0.0000000000e+000.0000000000e+001.8661912145e-016.0301254883e+044.5317761056e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0554531509e+033.1805022628e+01 + 0.0000000000e+000.0000000000e+001.8702104097e-015.9508101705e+045.2498338870e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5231670476e+044.0492934662e+01 + 0.0000000000e+000.0000000000e+001.9700996678e-015.7734269734e+045.0466411960e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5682960930e+043.7876179402e+01 + 0.0000000000e+000.0000000000e+001.6744186047e-015.8907270210e+046.0069767442e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5094052492e+044.4172978959e+01 + 0.0000000000e+000.0000000000e+001.8583610188e-016.1224593898e+045.7216954596e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9480656290e+044.4450653378e+01 + 0.0000000000e+000.0000000000e+001.8116079734e-016.0446731502e+045.8492443854e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5975175361e+044.8324575415e+01 + 0.0000000000e+000.0000000000e+001.6126666667e-015.8816534067e+045.0185600000e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.0710201333e+033.4911200000e+01 + 0.0000000000e+000.0000000000e+002.2966445916e-015.7976971393e+045.8328755850e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2556297216e+044.1509171744e+01 + 0.0000000000e+000.0000000000e+001.7186156520e-015.8874500037e+048.2661062976e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0771413170e+047.5532771556e+01 + 0.0000000000e+000.0000000000e+001.7076411960e-015.7705956645e+041.0331212625e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0263547641e+051.1245149502e+02 + 0.0000000000e+000.0000000000e+002.5724186487e-015.6731042304e+048.5218863758e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0639797841e+059.6086152853e+01 + 0.0000000000e+000.0000000000e+002.1524982949e-015.6219285260e+048.6023782975e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0431886684e+059.6431765198e+01 + 0.0000000000e+000.0000000000e+001.3794038391e-015.6146589251e+046.1308530417e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3056067175e+044.7727854743e+01 + 0.0000000000e+000.0000000000e+001.8306736803e-015.6045180827e+045.4665445220e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5767019857e+044.5179875046e+01 + 0.0000000000e+000.0000000000e+001.7475083056e-015.5969783389e+045.5493576966e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2875868328e+044.8346290144e+01 + 0.0000000000e+000.0000000000e+001.3810631229e-014.8535056811e+047.8147308970e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0328223877e+059.1981594684e+01 + 0.0000000000e+000.0000000000e+001.9878814548e-015.0609290070e+048.6033275982e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.0817348786e+049.0880523054e+01 + 0.0000000000e+000.0000000000e+001.7723178808e-015.4867235015e+048.2451737307e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.0083588902e+048.8318372627e+01 + 0.0000000000e+000.0000000000e+001.0105647841e-014.6346496366e+048.5035529347e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1280573179e+059.9134182946e+01 + 0.0000000000e+000.0000000000e+001.5314661210e-014.7862178001e+048.0719731139e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0643694134e+059.4677930079e+01 + 0.0000000000e+000.0000000000e+001.7159314427e-013.7456673605e+046.0643092781e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.5375447046e+046.0364594838e+01 + 0.0000000000e+000.0000000000e+001.1324473976e-016.6488600709e+045.9344916944e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.1615737984e+033.8735326689e+01 + 0.0000000000e+000.0000000000e+001.4093646638e-016.4168904201e+045.0882325160e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.8280720669e+033.4869697073e+01 + 0.0000000000e+000.0000000000e+001.4093646638e-016.4168904201e+045.0882325160e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.8280720669e+033.4869697073e+01 + 0.0000000000e+000.0000000000e+001.3286682361e-016.3226015640e+045.3082481464e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.1642151352e+033.7481048822e+01 + 0.0000000000e+000.0000000000e+001.4609080842e-016.5647469369e+046.5966733112e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5040998206e+044.6636279070e+01 + 0.0000000000e+000.0000000000e+001.5275747508e-016.5312396013e+045.4863853821e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4262214950e+043.9642691030e+01 + 0.0000000000e+000.0000000000e+001.2945487081e-016.2364621274e+045.0667759419e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4496513508e+043.8249649953e+01 + 0.0000000000e+000.0000000000e+001.6211766518e-016.3339902270e+045.7533181888e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0940432107e+044.4939519483e+01 + 0.0000000000e+000.0000000000e+001.4007751938e-016.3783199867e+046.4459169435e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0811272481e+044.9823466224e+01 + 0.0000000000e+000.0000000000e+001.1652446224e-016.5133935699e+046.1615463246e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3313000843e+044.8493195309e+01 + 0.0000000000e+000.0000000000e+001.5852980132e-016.5848171074e+046.3076770419e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.8725034175e+045.0989232524e+01 + 0.0000000000e+000.0000000000e+001.3700553710e-016.5932171488e+046.3392926910e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7707211660e+045.1041093762e+01 + 0.0000000000e+000.0000000000e+001.3258828189e-016.6024878752e+047.5279695606e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7074819430e+047.1301638394e+01 + 0.0000000000e+000.0000000000e+001.8054571590e-017.0974559322e+041.0408450151e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+009.2141598466e+049.6304397043e+01 + 0.0000000000e+000.0000000000e+001.6055370986e-016.9745661307e+046.8255282392e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6346303632e+045.4894728682e+01 + 0.0000000000e+000.0000000000e+009.6345514950e-026.8381364120e+046.5617940199e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6835445017e+045.5544019934e+01 + 0.0000000000e+000.0000000000e+001.9745012920e-016.8499430568e+047.9457853378e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6502499084e+047.0565166630e+01 + 0.0000000000e+000.0000000000e+001.9071111111e-016.8889429022e+047.5273155556e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3455015289e+046.1031022222e+01 + 0.0000000000e+000.0000000000e+001.5119293598e-016.8993713487e+046.4645869610e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7120770664e+045.2105676527e+01 + 0.0000000000e+000.0000000000e+002.2200706402e-016.9393477913e+046.2788041501e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5343092380e+044.9822412362e+01 + 0.0000000000e+000.0000000000e+002.2666666667e-016.8436619133e+046.1024066667e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1834887000e+044.7995866667e+01 + 0.0000000000e+000.0000000000e+001.3227109635e-016.9484029821e+046.4867425249e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7218322005e+044.6750276412e+01 + 0.0000000000e+000.0000000000e+002.0404208195e-016.7517904662e+046.1164440753e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3546226910e+044.3948648948e+01 + 0.0000000000e+000.0000000000e+002.2239793282e-016.5521268850e+045.2919800664e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0765410684e+043.8200719085e+01 + 0.0000000000e+000.0000000000e+001.8795732156e-016.5022737744e+045.3030838852e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0566714419e+043.8367021339e+01 + 0.0000000000e+000.0000000000e+002.0139446877e-017.0054034801e+046.2447976209e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2130921530e+044.3008007085e+01 + 0.0000000000e+000.0000000000e+002.3872694403e-016.8834196888e+046.4041803041e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5823038228e+044.6351915653e+01 + 0.0000000000e+000.0000000000e+001.6327748564e-016.7947155405e+046.0762981013e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0399683190e+044.5906810815e+01 + 0.0000000000e+000.0000000000e+001.8648947951e-016.8010604031e+046.0264274640e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6317421639e+044.3616655592e+01 + 0.0000000000e+000.0000000000e+002.1154030217e-016.9643736057e+046.5018316524e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8677201137e+044.6891836141e+01 + 0.0000000000e+000.0000000000e+002.1154030217e-016.9643736057e+046.5018316524e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8677201137e+044.6891836141e+01 + 0.0000000000e+000.0000000000e+002.4102792280e-016.8877336080e+046.1360498734e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8391900451e+044.6396826056e+01 + 0.0000000000e+000.0000000000e+001.9161015893e-016.7409437966e+045.8224751637e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7621179334e+044.4502139007e+01 + 0.0000000000e+000.0000000000e+001.6434775913e-017.0750764205e+046.8025037953e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1382264586e+045.0884904183e+01 + 0.0000000000e+000.0000000000e+001.9702104097e-016.9991064751e+046.8745149502e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1385411063e+045.1765780731e+01 + 0.0000000000e+000.0000000000e+002.1726254648e-016.8771518969e+046.4044757358e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8742292541e+044.8379866963e+01 + 0.0000000000e+000.0000000000e+002.1613723204e-017.0316313345e+046.7383592587e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4050178888e+045.1559612550e+01 + 0.0000000000e+000.0000000000e+002.6196013289e-016.8661509812e+046.8732724252e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.2610939812e+045.3333665559e+01 + 0.0000000000e+000.0000000000e+002.5049833887e-016.9472143920e+047.2161328904e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0773317608e+045.9825116279e+01 + 0.0000000000e+000.0000000000e+001.6645948384e-017.0687632867e+047.1624848738e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.6780642556e+045.5569640932e+01 + 0.0000000000e+000.0000000000e+002.1081626367e-017.0365475815e+046.3772493454e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8745737899e+044.7224013553e+01 + 0.0000000000e+000.0000000000e+002.0028748909e-016.9867821901e+046.4039073874e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8418562532e+044.7389231480e+01 + 0.0000000000e+000.0000000000e+001.6338914435e-017.0398044545e+046.5129851928e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9123221156e+044.8223758553e+01 + 0.0000000000e+000.0000000000e+002.8160575858e-017.0197345936e+046.5954152824e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7128497287e+044.7903488372e+01 + 0.0000000000e+000.0000000000e+001.9127441274e-014.1502438129e+043.7292993040e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1043860277e+042.8168735415e+01 + 0.0000000000e+000.0000000000e+008.8016838647e-024.8521438313e+036.7273391858e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.6873418492e+035.7598249397e+00 + 0.0000000000e+000.0000000000e+009.7248062016e-021.6801461240e+021.0368436693e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6711032817e+021.0500904393e+00 + 0.0000000000e+000.0000000000e+005.8465783664e-021.2237534216e+027.3898491538e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2436756880e+026.1008462104e-01 + 0.0000000000e+000.0000000000e+002.6921813235e-027.0141031037e+015.4833531349e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.2682125182e+014.2219481786e-01 + 0.0000000000e+000.0000000000e+005.8471760797e-035.9251760797e+015.1289036545e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4488527132e+013.9576965670e-01 + 0.0000000000e+000.0000000000e+002.6445182724e-026.1464584718e+015.0295681063e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.5795448505e+013.9823920266e-01 + 0.0000000000e+000.0000000000e+006.8564681378e-035.7912965611e+015.0022148394e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3796912426e+013.8604797841e-01 + 0.0000000000e+000.0000000000e+003.3207190161e-035.7291220435e+014.8142857143e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3406830653e+013.7377483444e-01 + 0.0000000000e+000.0000000000e+004.7619047619e-045.5026411960e+014.6132890365e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2536312292e+013.6355481728e-01 + 0.0000000000e+000.0000000000e+002.8349944629e-025.7375105205e+014.7548172757e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2091517165e+013.7063122924e-01 + 0.0000000000e+000.0000000000e+004.9833887043e-031.1092426019e+027.4444291655e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.5012271457e+015.8213845680e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+006.5808951325e+015.0782729386e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6206754013e+013.9960019215e-01 + 0.0000000000e+000.0000000000e+003.0697674419e-025.6519335548e+014.5514950166e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1148039867e+013.5322259136e-01 + 0.0000000000e+000.0000000000e+005.9689922481e-035.2825182724e+014.4403100775e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0134451827e+013.4660022148e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.2376420027e+014.3788182145e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9944794027e+013.3628339677e-01 + 0.0000000000e+000.0000000000e+002.7464008859e-025.4039438223e+014.3828650635e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9715028786e+013.4084838617e-01 + 0.0000000000e+000.0000000000e+005.8693244740e-035.9085647841e+014.7683277962e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2941960133e+013.7228128461e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.8815946844e+014.9049833887e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4826843854e+013.9235880399e-01 + 0.0000000000e+000.0000000000e+005.4444444444e-035.6595395349e+014.7397729790e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3276336102e+013.7464728682e-01 + 0.0000000000e+000.0000000000e+002.5722222222e-025.5792500000e+014.6727777778e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2151333333e+013.7272222222e-01 + 0.0000000000e+000.0000000000e+008.2041942605e-035.4435188742e+014.6955114054e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1754789183e+013.6861000736e-01 + 0.0000000000e+000.0000000000e+003.3291390728e-035.4611511258e+014.6733774834e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1611277483e+013.6683443709e-01 + 0.0000000000e+000.0000000000e+002.7543632337e-025.7632447841e+015.0039424142e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2339209635e+013.7913510520e-01 + 0.0000000000e+000.0000000000e+006.4230343300e-035.8384219709e+015.0694792194e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3528585730e+013.8905253276e-01 + 0.0000000000e+000.0000000000e+005.3333333333e-035.8720132450e+015.1199116998e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3583637969e+013.8481236203e-01 + 0.0000000000e+000.0000000000e+001.3333333333e-036.1394666667e+015.0266666667e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8115333333e+013.9666666667e-01 + 0.0000000000e+000.0000000000e+002.6578073090e-025.6190726467e+014.6146179402e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1790870432e+013.5641196013e-01 + 0.0000000000e+000.0000000000e+009.4108157992e-035.5358873533e+014.7161598376e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1808829568e+013.6767692876e-01 + 0.0000000000e+000.0000000000e+003.3245108896e-035.4126442082e+014.5158445921e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2024559136e+013.6175828719e-01 + 0.0000000000e+000.0000000000e+002.4328984327e-025.6419313326e+014.5452098597e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1899131592e+013.6048836476e-01 + 0.0000000000e+000.0000000000e+001.1584636935e-021.4753963462e+021.0017580838e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0024681525e+028.0616722771e-01 + 0.0000000000e+000.0000000000e+001.4396456257e-037.9291472868e+016.1079734219e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.4605481728e+014.8449612403e-01 + 0.0000000000e+000.0000000000e+002.0662251656e-025.3880128710e+014.5027018107e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0256643418e+013.4827704561e-01 + 0.0000000000e+000.0000000000e+001.1159970567e-025.4158875055e+014.5190228109e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1000602208e+013.5645739514e-01 + 0.0000000000e+000.0000000000e+004.0888888889e-035.4939200000e+014.6364444444e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2480933333e+013.6773333333e-01 + 0.0000000000e+000.0000000000e+007.5555555556e-045.5666494481e+014.6683738043e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2175329801e+013.6554437086e-01 + 0.0000000000e+000.0000000000e+002.8017718715e-025.6823507734e+014.7062367531e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1626812391e+013.6516614963e-01 + 0.0000000000e+000.0000000000e+008.6489479513e-035.5478637874e+014.6922480620e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2385581395e+013.6798449612e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.3816794790e+014.6474312996e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1178136015e+013.5777650657e-01 + 0.0000000000e+000.0000000000e+002.5027685493e-025.6503149839e+014.7725022552e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1789892778e+013.7020798956e-01 + 0.0000000000e+000.0000000000e+001.0805647841e-025.5182915282e+014.7293189369e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1623214286e+013.6635382060e-01 + 0.0000000000e+000.0000000000e+008.3333333333e-045.5829244186e+014.7132059801e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2248712625e+013.6741140642e-01 + 0.0000000000e+000.0000000000e+004.9612403101e-035.6056744186e+014.6928017719e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2723322259e+013.7125138427e-01 + 0.0000000000e+000.0000000000e+002.4005426357e-025.6550678295e+014.6712144703e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2672098450e+013.6805943152e-01 + 0.0000000000e+000.0000000000e+001.2639091916e-025.3542677187e+014.4822739018e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0882475194e+013.5094389073e-01 + 0.0000000000e+000.0000000000e+004.1860465116e-035.4286445183e+014.6152823920e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1638604651e+013.6518272425e-01 + 0.0000000000e+000.0000000000e+002.5430417128e-025.5580077630e+014.6467770395e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2023253488e+013.7055116279e-01 + 0.0000000000e+000.0000000000e+008.7777777778e-035.6598818764e+014.6839080206e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2763304857e+013.7795209713e-01 + 0.0000000000e+000.0000000000e+007.3000000000e-035.6427614570e+014.6762030905e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3324628477e+013.7778123620e-01 + 0.0000000000e+000.0000000000e+001.2400996678e-025.5941661794e+014.8008637874e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2616498671e+013.7817840532e-01 + 0.0000000000e+000.0000000000e+001.8117386489e-025.5099667774e+014.7297895903e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0939534884e+013.6183831672e-01 + 0.0000000000e+000.0000000000e+007.9180509413e-035.5339102990e+014.7564784053e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2080066445e+013.7470653378e-01 + 0.0000000000e+000.0000000000e+003.3222591362e-035.4594817276e+014.7122923588e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1996677741e+013.7488372093e-01 + 0.0000000000e+000.0000000000e+002.2369878184e-025.8172093023e+014.8034330011e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3374750831e+013.7923588040e-01 + 0.0000000000e+000.0000000000e+001.0933459477e-025.6989214759e+014.7445600757e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3420425733e+013.7879533270e-01 + 0.0000000000e+000.0000000000e+009.7130242826e-045.4011316803e+014.5956392599e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1863527755e+013.6663102389e-01 + 0.0000000000e+000.0000000000e+002.1100000000e-025.3779358915e+014.4683879660e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0705440162e+013.5125300849e-01 + 0.0000000000e+000.0000000000e+001.1228918322e-022.4571020728e+021.5568202355e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5175951994e+021.2836060338e+00 + 0.0000000000e+000.0000000000e+003.3266372333e-036.3401814827e+023.7961464312e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5716733561e+023.1751495217e+00 + 0.0000000000e+000.0000000000e+001.0111111111e-037.5515291111e+024.5086111111e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2049588889e+023.7570000000e+00 + 0.0000000000e+000.0000000000e+002.5459579181e-027.6830054828e+024.5678514212e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2625373123e+023.8175650794e+00 + 0.0000000000e+000.0000000000e+001.1207087486e-027.7559137394e+024.6106708010e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3042350210e+023.8591238095e+00 + 0.0000000000e+000.0000000000e+000.0000000000e+007.7327437357e+024.6027068291e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2907300952e+023.8395915836e+00 + 0.0000000000e+000.0000000000e+002.2847682119e-027.7926178390e+024.6286270929e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3130183065e+023.8652234274e+00 + 0.0000000000e+000.0000000000e+001.0485651214e-027.6480113969e+024.5553042471e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2417612062e+023.8033369269e+00 + 0.0000000000e+000.0000000000e+000.0000000000e+007.7142657807e+024.5669102990e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2760890365e+023.8194019934e+00 + 0.0000000000e+000.0000000000e+001.1240310078e-027.8864466224e+024.6767884828e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3848290144e+023.9225359911e+00 + 0.0000000000e+000.0000000000e+001.8848283499e-027.8260923588e+024.6214174972e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3331459579e+023.8840753045e+00 + 0.0000000000e+000.0000000000e+006.5780730897e-037.7602443776e+024.5894344408e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3068117165e+023.8535347730e+00 + 0.0000000000e+000.0000000000e+002.2185430464e-031.0086503040e+036.0405092715e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6836423179e+025.0996867550e+00 + 0.0000000000e+000.0000000000e+002.3225901398e-021.3424719627e+038.0639573951e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.5976304599e+026.8493688006e+00 + 0.0000000000e+000.0000000000e+001.1222222222e-021.3764354889e+038.2899888889e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.8072086667e+027.0330888889e+00 + 0.0000000000e+000.0000000000e+002.2037652270e-039.5833421864e+025.7393436693e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3949764958e+024.8437006275e+00 + 0.0000000000e+000.0000000000e+002.0929568106e-027.7818805914e+024.6385674419e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3215800598e+023.8753215947e+00 + 0.0000000000e+000.0000000000e+001.2400000000e-027.7081893333e+024.5766000000e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2702853333e+023.8218666667e+00 + 0.0000000000e+000.0000000000e+003.3187637969e-037.7329098411e+024.5844233996e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2954294702e+023.8498432671e+00 + 0.0000000000e+000.0000000000e+003.3256806475e-037.7717792701e+024.6359988227e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3378996409e+023.8879567329e+00 + 0.0000000000e+000.0000000000e+002.2860981912e-027.7697402997e+024.6300692506e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3222588734e+023.8641922481e+00 + 0.0000000000e+000.0000000000e+001.3780224858e-027.7310712691e+024.5962498075e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2995691899e+023.8443631603e+00 + 0.0000000000e+000.0000000000e+001.1810154525e-035.7821752090e+023.4830364974e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2847836034e+022.9161223694e+00 + 0.0000000000e+000.0000000000e+002.3510520487e-022.0378766670e+021.3154977482e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2917573950e+021.0751955334e+00 + 0.0000000000e+000.0000000000e+001.3156146179e-025.4472026578e+014.6033222591e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1112026578e+013.5800664452e-01 + 0.0000000000e+000.0000000000e+002.1222222222e-035.3981017829e+014.6398113695e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1772456146e+013.6743115541e-01 + 0.0000000000e+000.0000000000e+009.6717977113e-035.6237254596e+014.6658364710e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2494420930e+013.7223661868e-01 + 0.0000000000e+000.0000000000e+001.9552558433e-025.5695319135e+014.6116477085e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1810649931e+013.6623946668e-01 + 0.0000000000e+000.0000000000e+008.6534216336e-035.4247326269e+014.6304047093e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1676029139e+013.6661280353e-01 + 0.0000000000e+000.0000000000e+004.1777777778e-035.4605333333e+014.5831111111e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1889733333e+013.6164444444e-01 + 0.0000000000e+000.0000000000e+002.1164385578e-025.4700784106e+014.5145194996e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1403244150e+013.5933657101e-01 + 0.0000000000e+000.0000000000e+001.3384303976e-025.5301370047e+014.6773712350e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2144197267e+013.6784999230e-01 + 0.0000000000e+000.0000000000e+003.3222591362e-035.7233056478e+014.7430786268e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3602325581e+013.7619047619e-01 + 0.0000000000e+000.0000000000e+002.1593657639e-025.6060143011e+014.5861726548e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1996854635e+013.6375202599e-01 + 0.0000000000e+000.0000000000e+001.3024282561e-025.4432116125e+014.6333179321e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1177663638e+013.6106524976e-01 + 0.0000000000e+000.0000000000e+002.0111111111e-035.4102996899e+014.6265400517e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1716403618e+013.6618346253e-01 + 0.0000000000e+000.0000000000e+001.3222222222e-035.3605042968e+014.5775574013e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1347871023e+013.6192284976e-01 + 0.0000000000e+000.0000000000e+001.9867549669e-025.4597128776e+014.5954764472e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1037774746e+013.6007788608e-01 + 0.0000000000e+000.0000000000e+001.5443561442e-025.6365761589e+014.6406328182e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2046665342e+013.6631037528e-01 + 0.0000000000e+000.0000000000e+001.3555555556e-035.4929266667e+014.6271111111e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1638266667e+013.6208888889e-01 + 0.0000000000e+000.0000000000e+001.7740863787e-025.5202261573e+014.6106445183e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1936927796e+013.6384843116e-01 + 0.0000000000e+000.0000000000e+001.6192469546e-021.0237890509e+027.3213554817e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7022772204e+015.9566267996e-01 + 0.0000000000e+000.0000000000e+002.7333333333e-038.6421133333e+016.4466666667e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.8901333333e+015.2323333333e-01 + 0.0000000000e+000.0000000000e+001.9601328904e-035.3735066777e+014.5244473976e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1941830233e+013.6262115172e-01 + 0.0000000000e+000.0000000000e+002.0928755999e-025.8376166556e+014.7617748247e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3754269767e+013.7847884828e-01 + 0.0000000000e+000.0000000000e+001.3777777778e-025.7333066667e+014.8355555556e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3448933333e+013.8413333333e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.4345285050e+014.7378855666e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1744504540e+013.6951406423e-01 + 0.0000000000e+000.0000000000e+001.9444444444e-025.4982181617e+014.6101144334e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1001917682e+013.5699704688e-01 + 0.0000000000e+000.0000000000e+001.3888888889e-025.4825193798e+014.6602067183e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1470994832e+013.6427648579e-01 + 0.0000000000e+000.0000000000e+001.9205298013e-035.4455026952e+014.7417064531e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1644387802e+013.6753734791e-01 + 0.0000000000e+000.0000000000e+002.0523914643e-025.7673112583e+014.8105312730e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2354595143e+013.6945283297e-01 + 0.0000000000e+000.0000000000e+001.4222222222e-025.6577142857e+014.7812063492e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1648990476e+013.6309841270e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.4573420057e+014.7087038789e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1567573321e+013.6047303690e-01 + 0.0000000000e+000.0000000000e+003.7430786268e-035.4889835757e+014.6920713149e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1873988141e+013.6679163641e-01 + 0.0000000000e+000.0000000000e+001.9502535408e-025.6310390803e+014.7874453576e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1770581395e+013.6673282042e-01 + 0.0000000000e+000.0000000000e+001.5225233050e-025.6158352441e+014.8591627584e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1684801980e+013.6579034219e-01 + 0.0000000000e+000.0000000000e+003.3003300330e-035.8263465347e+015.0286028603e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3398745875e+013.8050605061e-01 + 0.0000000000e+000.0000000000e+001.8886717619e-025.8569563792e+014.9992957848e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2562833724e+013.7300185282e-01 + 0.0000000000e+000.0000000000e+001.6008771930e-025.6389655130e+014.9623103758e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1342897849e+013.6941838921e-01 + 0.0000000000e+000.0000000000e+001.6611661166e-035.6038734873e+014.9662266227e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2119174917e+013.7619361936e-01 + 0.0000000000e+000.0000000000e+006.5405882694e-035.3961588067e+014.6488752823e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0403694777e+013.5280904406e-01 + 0.0000000000e+000.0000000000e+001.6220687858e-025.3931382230e+014.5903986451e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9553015894e+013.4081031787e-01 + 0.0000000000e+000.0000000000e+001.3795379538e-025.6342739274e+014.7679867987e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0900660066e+013.5429042904e-01 + 0.0000000000e+000.0000000000e+003.3003300330e-035.5951089109e+014.8462046205e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0693135314e+013.5696369637e-01 + 0.0000000000e+000.0000000000e+001.5137549939e-025.4237234562e+014.7325809884e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9218024253e+013.4339608303e-01 + 0.0000000000e+000.0000000000e+001.9559919808e-025.3460785240e+014.5274850182e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8625078057e+013.3456871345e-01 + 0.0000000000e+000.0000000000e+003.7843784378e-035.3806732673e+014.6389438944e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9465742574e+013.4037403740e-01 + 0.0000000000e+000.0000000000e+001.2335526316e-025.4882547876e+014.7048430172e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0365232000e+013.4661426669e-01 + 0.0000000000e+000.0000000000e+001.8995606798e-025.5624712850e+014.6443319003e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0173678891e+013.4389178392e-01 + 0.0000000000e+000.0000000000e+003.3003300330e-035.4931947195e+014.6664466447e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0020726073e+013.4523652365e-01 + 0.0000000000e+000.0000000000e+002.0352035204e-035.3778011008e+014.7183881217e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9954147668e+013.4784537664e-01 + 0.0000000000e+000.0000000000e+001.2211221122e-025.3966939487e+014.6046041775e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9821165863e+013.4348575647e-01 + 0.0000000000e+000.0000000000e+002.1122112211e-025.2222178218e+014.3115511551e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7831947195e+013.2105610561e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+008.2774599401e+017.8315420358e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.0620461503e+016.7682875195e-01 + 0.0000000000e+000.0000000000e+001.1111111111e-021.1240028509e+021.0990570175e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1017983553e+029.9688961988e-01 + 0.0000000000e+000.0000000000e+002.2222222222e-025.1913597360e+014.2682068207e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6985478548e+013.1130913091e-01 + 0.0000000000e+000.0000000000e+001.0416666667e-035.0601402640e+014.2963765127e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7163479785e+013.1424642464e-01 + 0.0000000000e+000.0000000000e+001.2302667767e-025.2377332233e+014.3836014851e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8037983361e+013.2011001100e-01 + 0.0000000000e+000.0000000000e+002.4290429043e-025.4237711771e+014.5544554455e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9678899890e+013.3390539054e-01 + 0.0000000000e+000.0000000000e+004.2292716114e-035.3609298101e+014.5781711395e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9630265872e+013.4198240548e-01 + 0.0000000000e+000.0000000000e+004.8026315789e-035.5400459875e+014.6155582335e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9812044359e+013.3733552632e-01 + 0.0000000000e+000.0000000000e+008.5808580858e-035.2472211221e+014.5029702970e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8258613861e+013.2904290429e-01 + 0.0000000000e+000.0000000000e+002.5574843669e-025.3266561360e+014.3775241011e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8148881253e+013.1821586764e-01 + 0.0000000000e+000.0000000000e+002.5109649123e-035.1708092105e+014.4286365150e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7720381673e+013.2262021597e-01 + 0.0000000000e+000.0000000000e+006.7326732673e-035.2125104510e+014.4642464246e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9436523652e+013.3240924092e-01 + 0.0000000000e+000.0000000000e+002.4692765329e-025.5747768297e+014.6733451306e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2612699938e+013.5707580626e-01 + 0.0000000000e+000.0000000000e+005.2412280702e-035.4631549635e+014.5163138353e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9684780810e+013.3776467778e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.2983762376e+014.5353135314e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0057689769e+013.4270627063e-01 + 0.0000000000e+000.0000000000e+006.0307017544e-035.2125609041e+014.4648200017e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8242726789e+013.2894791124e-01 + 0.0000000000e+000.0000000000e+002.7863687685e-025.4286668187e+014.5315496352e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8984038887e+013.4012799635e-01 + 0.0000000000e+000.0000000000e+003.3003300330e-035.2865346535e+014.5953795380e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9360396040e+013.4231023102e-01 + 0.0000000000e+000.0000000000e+008.2329121070e-035.2059037910e+014.3672594233e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8126222968e+013.2392142175e-01 + 0.0000000000e+000.0000000000e+003.1239035088e-025.8851589152e+014.7642037230e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0947077362e+013.4509948034e-01 + 0.0000000000e+000.0000000000e+004.1804180418e-045.3150099010e+014.5256325633e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0366380638e+013.4407040704e-01 + 0.0000000000e+000.0000000000e+006.7530108274e-035.3231316224e+014.5949224857e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0080686736e+013.5161958630e-01 + 0.0000000000e+000.0000000000e+002.9495614035e-025.7071368045e+014.8859356001e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1038961228e+013.6457403306e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.4385082508e+014.7524752475e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1288844884e+013.6096809681e-01 + 0.0000000000e+000.0000000000e+005.4824561404e-045.4806970500e+014.7621373980e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1979715817e+013.7338330873e-01 + 0.0000000000e+000.0000000000e+008.1976289734e-035.8647308928e+014.8579946153e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3540691224e+013.7675970558e-01 + 0.0000000000e+000.0000000000e+002.8118811881e-025.5799339934e+014.7214521452e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0714191419e+013.5643564356e-01 + 0.0000000000e+000.0000000000e+003.2997872156e-039.7709513418e+017.3668251694e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.6415128322e+015.8499544033e-01 + 0.0000000000e+000.0000000000e+004.3789806612e-031.0680468232e+036.6044835997e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.5406372756e+025.7156536246e+00 + 0.0000000000e+000.0000000000e+003.2123212321e-025.0255465787e+033.0570737074e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0143506711e+032.6672519252e+01 + 0.0000000000e+000.0000000000e+001.0964912281e-046.8163728262e+034.1381698186e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0283919281e+033.5589217474e+01 + 0.0000000000e+000.0000000000e+001.8179498871e-023.3719084219e+032.0430201512e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9924455431e+031.7682024926e+01 + 0.0000000000e+000.0000000000e+001.8179498871e-023.3719084219e+032.0430201512e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9924455431e+031.7682024926e+01 + 0.0000000000e+000.0000000000e+001.9801980198e-043.8980216062e+032.3489174917e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3083745215e+032.0595445545e+01 + 0.0000000000e+000.0000000000e+003.2346491228e-037.0766434612e+024.2085251288e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.9528982000e+023.5101208312e+00 + 0.0000000000e+000.0000000000e+003.3000043425e-036.6629595091e+023.9868434080e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7161661564e+023.3043346144e+00 + 0.0000000000e+000.0000000000e+002.8646864686e-026.4827551155e+023.8380198020e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6296264026e+023.2055445545e+00 + 0.0000000000e+000.0000000000e+007.7351485149e-036.6648791254e+023.9665841584e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7274516295e+023.2944410066e+00 + 0.0000000000e+000.0000000000e+004.1666666667e-046.7308052530e+024.0199724972e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7733008457e+023.3466371012e+00 + 0.0000000000e+000.0000000000e+003.0583058306e-026.5858008801e+023.9221782178e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6572244224e+023.2489108911e+00 + 0.0000000000e+000.0000000000e+005.7656259047e-036.5693706213e+023.9295269165e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6623924950e+023.2522590252e+00 + 0.0000000000e+000.0000000000e+003.2992805860e-036.5880543512e+023.9426403002e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6796781321e+023.2629884995e+00 + 0.0000000000e+000.0000000000e+003.5203520352e-046.6353553355e+023.9556875688e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7043533553e+023.2846644664e+00 + 0.0000000000e+000.0000000000e+002.9057017544e-026.7015732080e+023.9891830959e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7342143459e+023.3182571218e+00 + 0.0000000000e+000.0000000000e+004.2763157895e-036.5981694763e+023.9532041428e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6815986354e+023.2716108650e+00 + 0.0000000000e+000.0000000000e+004.5412541254e-023.4200659406e+031.7741254125e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5953034851e+041.9430891089e+01 + 0.0000000000e+000.0000000000e+006.6637897342e-024.7663442276e+045.1758381644e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6458816995e+033.7088517783e+01 + 0.0000000000e+000.0000000000e+004.4418208268e-026.1808707053e+045.6893961590e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.6220513812e+044.6358192888e+01 + 0.0000000000e+000.0000000000e+003.9603960396e-026.2158369021e+045.3176105611e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3218885721e+044.3786930693e+01 + 0.0000000000e+000.0000000000e+009.0539234845e-026.0794166843e+044.4269549027e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.0065758730e+033.1369010190e+01 + 0.0000000000e+000.0000000000e+004.9218740953e-026.4080792926e+045.4433630291e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6992441820e+033.6893960107e+01 + 0.0000000000e+000.0000000000e+004.1540154015e-026.5360267635e+045.2813861386e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5741790539e+033.7096215622e+01 + 0.0000000000e+000.0000000000e+003.7640227839e-026.4486760799e+045.0092278060e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0784974922e+043.6365909798e+01 + 0.0000000000e+000.0000000000e+008.9642500434e-026.4210230807e+045.1095103678e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0580284572e+043.7470107804e+01 + 0.0000000000e+000.0000000000e+007.3003300330e-026.9095703762e+046.1657293729e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1126222442e+044.2166072607e+01 + 0.0000000000e+000.0000000000e+002.1797919924e-016.8433842097e+045.8851034610e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6133096703e+044.2996330554e+01 + 0.0000000000e+000.0000000000e+002.7039263795e-016.7499255274e+045.2705478041e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1260459843e+043.7622206300e+01 + 0.0000000000e+000.0000000000e+002.9700770077e-016.8958683102e+046.0169856986e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7524720088e+044.9833751375e+01 + 0.0000000000e+000.0000000000e+001.3175536304e-016.9739475221e+046.9889094798e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4992295870e+045.8583505045e+01 + 0.0000000000e+000.0000000000e+001.6013682618e-017.1795145340e+049.4200938206e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.7949142898e+048.1707452051e+01 + 0.0000000000e+000.0000000000e+003.5691969197e-017.1808609857e+048.0458833883e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7054107283e+046.4569856986e+01 + 0.0000000000e+000.0000000000e+003.6184699062e-017.1596442829e+047.5597420893e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1646113777e+046.0505958507e+01 + 0.0000000000e+000.0000000000e+005.1871406549e-017.2536673343e+048.6190081857e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.0697483901e+047.3630873176e+01 + 0.0000000000e+000.0000000000e+003.0996699670e-017.3235684224e+048.7964290429e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.2916960264e+047.7998217822e+01 + 0.0000000000e+000.0000000000e+002.9804042904e-017.1044895591e+046.8706362363e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1969427830e+045.4843036195e+01 + 0.0000000000e+000.0000000000e+002.3290566557e-016.9977307094e+045.8881503423e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7024581983e+044.2452761385e+01 + 0.0000000000e+000.0000000000e+001.7456545655e-016.9894547195e+046.3545522552e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1557389483e+044.6817337734e+01 + 0.0000000000e+000.0000000000e+001.6808351365e-017.1218680564e+046.9830019525e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.2794654025e+045.0817174830e+01 + 0.0000000000e+000.0000000000e+001.3745033113e-017.0844413874e+046.5501523179e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0616537219e+044.7294966887e+01 + 0.0000000000e+000.0000000000e+001.4411989469e-017.0744218787e+046.1504033575e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0386997819e+044.5050284409e+01 + 0.0000000000e+000.0000000000e+001.8205980066e-017.0873345515e+046.2148837209e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0847639867e+044.5877076412e+01 + 0.0000000000e+000.0000000000e+001.6535452099e-017.2578096471e+047.2922647980e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4223975195e+045.3152694367e+01 + 0.0000000000e+000.0000000000e+001.5081081678e-017.2007073115e+047.3784775276e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.2531615609e+045.3314804415e+01 + 0.0000000000e+000.0000000000e+001.8184130676e-017.1390585497e+047.8426652049e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0115911167e+046.8497916501e+01 + 0.0000000000e+000.0000000000e+001.6980924512e-017.1727042381e+047.3428374000e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0329902848e+046.1347268047e+01 + 0.0000000000e+000.0000000000e+001.7434357880e-017.1134465559e+046.8619123232e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0052150540e+045.0056951222e+01 + 0.0000000000e+000.0000000000e+002.1376522702e-017.1659370609e+047.5666400886e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5974836069e+045.6384086379e+01 + 0.0000000000e+000.0000000000e+001.8923588040e-017.1666689701e+047.3246954596e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7819741218e+045.5819977852e+01 + 0.0000000000e+000.0000000000e+001.7840531561e-016.9208245947e+046.9529302326e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1569568870e+045.5386578073e+01 + 0.0000000000e+000.0000000000e+001.7763012182e-015.4890488926e+046.5935991141e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0849938095e+046.0897009967e+01 + 0.0000000000e+000.0000000000e+001.6207241498e-012.8866504832e+043.9457316121e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4534795627e+043.7129546618e+01 + 0.0000000000e+000.0000000000e+001.7772824947e-018.2931263967e+031.6722883215e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0809283000e+041.3695780071e+01 + 0.0000000000e+000.0000000000e+002.0042421558e-011.4809074061e+039.1528913252e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.6255272647e+038.4115741602e+00 + 0.0000000000e+000.0000000000e+001.8790358066e-012.4434444766e+031.5549888298e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9816830520e+041.8101714876e+01 + 0.0000000000e+000.0000000000e+001.7093023256e-013.0620370432e+031.7107973422e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9051728239e+041.8987541528e+01 + 0.0000000000e+000.0000000000e+001.3674418605e-013.2268848062e+044.0698870432e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3042952381e+043.1716722038e+01 + 0.0000000000e+000.0000000000e+008.9647019134e-026.4224784573e+046.6145285802e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.2617535206e+045.0348720307e+01 + 0.0000000000e+000.0000000000e+001.1933415473e-017.0209457398e+046.5382421839e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3154626754e+044.9525354998e+01 + 0.0000000000e+000.0000000000e+001.4529346622e-017.0996141971e+046.7951273533e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8660618826e+044.8952380952e+01 + 0.0000000000e+000.0000000000e+001.1176079734e-017.2230541761e+048.7469136213e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4612857475e+046.6604119601e+01 + 0.0000000000e+000.0000000000e+001.1926910299e-017.2998610720e+041.0144772979e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+002.8767434219e+048.2902990033e+01 + 0.0000000000e+000.0000000000e+001.3242524917e-017.3156426600e+049.9143809524e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3982284850e+048.1602159468e+01 + 0.0000000000e+000.0000000000e+009.1718554047e-027.3330263802e+049.5687428219e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1964341263e+047.8421251018e+01 + 0.0000000000e+000.0000000000e+009.8835155809e-027.1995073131e+048.1736126598e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8131596389e+046.5381362493e+01 + 0.0000000000e+000.0000000000e+002.0621627907e-017.1562681607e+047.0586867442e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6007124809e+045.4293260465e+01 + 0.0000000000e+000.0000000000e+001.9656334441e-017.3139274661e+047.3526499114e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.6995053430e+046.0082188040e+01 + 0.0000000000e+000.0000000000e+001.6504983389e-017.3217183034e+047.4041506091e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0712567752e+046.1918493909e+01 + 0.0000000000e+000.0000000000e+008.2204237726e-017.2506088427e+047.4671994795e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.9297115185e+046.2146818051e+01 + 0.0000000000e+000.0000000000e+008.4357777778e-017.4271571844e+049.1576233333e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2870747700e+048.1741100000e+01 + 0.0000000000e+000.0000000000e+002.9835548173e-017.5184600371e+049.9365105205e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.8747100825e+049.2749988926e+01 + 0.0000000000e+000.0000000000e+003.2615562938e-017.5388368896e+049.1331072573e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9908514531e+048.4415566630e+01 + 0.0000000000e+000.0000000000e+002.8633877851e-017.5042995292e+048.2059760412e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3557713508e+047.1984797645e+01 + 0.0000000000e+000.0000000000e+002.1155874825e-017.3865670940e+047.8606974324e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1548704221e+046.5103699955e+01 + 0.0000000000e+000.0000000000e+001.9684385382e-017.4350236489e+048.3348504983e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5471085437e+046.9548449612e+01 + 0.0000000000e+000.0000000000e+002.1302325581e-017.3402205316e+047.9897541528e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6274175814e+046.7495548173e+01 + 0.0000000000e+000.0000000000e+001.9444610680e-017.2031926725e+047.5338634794e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0637962430e+046.1768648838e+01 + 0.0000000000e+000.0000000000e+001.9821170051e-017.2027070849e+047.2295418363e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3564773273e+045.6691162901e+01 + 0.0000000000e+000.0000000000e+001.6939977852e-017.1784297233e+047.2616543374e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1854947850e+045.6979470653e+01 + 0.0000000000e+000.0000000000e+001.0108609272e-017.0427054655e+047.1746581310e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.6153495544e+045.8946198675e+01 + 0.0000000000e+000.0000000000e+009.8113907285e-027.0513443034e+046.7610729801e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5306422167e+045.5646001325e+01 + 0.0000000000e+000.0000000000e+001.2287308970e-017.0796360416e+046.8273122259e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5928200696e+045.6748916279e+01 + 0.0000000000e+000.0000000000e+001.0790925025e-017.1539258029e+047.7844006659e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6646232016e+046.7691042661e+01 + 0.0000000000e+000.0000000000e+009.6686541550e-027.2390989081e+048.4106978944e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1347616456e+047.8520020462e+01 + 0.0000000000e+000.0000000000e+001.1426445183e-017.2079906741e+047.8601781026e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0873252677e+047.4965931709e+01 + 0.0000000000e+000.0000000000e+001.1520794702e-017.1687890050e+047.3956714643e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0751548615e+046.6849147167e+01 + 0.0000000000e+000.0000000000e+001.0959205298e-017.2347540350e+047.5588129801e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6166041340e+046.5386475055e+01 + 0.0000000000e+000.0000000000e+001.1293333333e-017.2367695333e+047.6074400000e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1056855200e+046.3189866667e+01 + 0.0000000000e+000.0000000000e+001.1341280353e-017.0564518997e+046.9629589404e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0478864784e+045.9475468433e+01 + 0.0000000000e+000.0000000000e+001.1374777233e-017.0516524852e+046.8819196864e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2303068247e+046.0600464236e+01 + 0.0000000000e+000.0000000000e+001.0973942414e-017.1787676551e+046.8702713732e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4477146669e+045.6298167331e+01 + 0.0000000000e+000.0000000000e+009.2119867550e-027.2164571621e+047.2198288079e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4386999157e+045.6846644371e+01 + 0.0000000000e+000.0000000000e+001.1434225870e-017.0138215626e+047.1063095641e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7170830132e+045.7913039904e+01 + 0.0000000000e+000.0000000000e+001.2770764120e-016.9530597010e+046.8474418605e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7506708372e+045.7105049834e+01 + 0.0000000000e+000.0000000000e+009.2894912470e-027.0952098523e+047.3278004518e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7267721540e+046.3607660814e+01 + 0.0000000000e+000.0000000000e+001.1599766782e-017.2861367468e+048.4076425161e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3623246013e+047.7000666982e+01 + 0.0000000000e+000.0000000000e+001.3599114064e-017.3357300066e+048.5275127353e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9807831694e+047.8157962348e+01 + 0.0000000000e+000.0000000000e+001.1879485600e-017.3182263271e+047.8499661614e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.5837021421e+046.9760156542e+01 + 0.0000000000e+000.0000000000e+001.4376328354e-017.2239005633e+047.4449928641e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2691985224e+046.2446111453e+01 + 0.0000000000e+000.0000000000e+001.6170542636e-017.1586199513e+047.1932070875e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4044444097e+045.7728106312e+01 + 0.0000000000e+000.0000000000e+001.1352687510e-017.0787033177e+047.3982503795e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5542583427e+046.0012283338e+01 + 0.0000000000e+000.0000000000e+009.3478292862e-027.1282394447e+047.7962364606e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7178741511e+046.9000395879e+01 + 0.0000000000e+000.0000000000e+001.2905241787e-017.2635210992e+048.5077423957e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.5608575061e+047.8534042820e+01 + 0.0000000000e+000.0000000000e+001.1384898022e-017.2069783126e+048.7474979648e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7870899288e+048.1182007217e+01 + 0.0000000000e+000.0000000000e+009.5287232404e-027.1631977195e+048.4718176498e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2907160878e+047.6613552030e+01 + 0.0000000000e+000.0000000000e+001.3368914729e-017.1545352665e+047.7602264341e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8586182717e+046.6712453488e+01 + 0.0000000000e+000.0000000000e+001.2502624585e-017.1493827235e+047.4209884053e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5153829487e+046.3853792359e+01 + 0.0000000000e+000.0000000000e+008.0651531931e-027.1968910676e+048.0058438169e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8126088791e+047.0685152086e+01 + 0.0000000000e+000.0000000000e+002.0423218900e-017.1964473278e+047.8879313769e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2789013147e+046.6939510151e+01 + 0.0000000000e+000.0000000000e+003.4302314581e-017.1310871545e+048.1261724495e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7593388303e+046.8354226420e+01 + 0.0000000000e+000.0000000000e+003.3816179329e-017.1431868510e+048.4364078385e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8468126647e+047.4927146781e+01 + 0.0000000000e+000.0000000000e+003.0186046512e-017.0937729236e+047.8170121816e+010.0000000000e+00NaN5.8693244740e-030.0000000000e+004.3033104385e+047.0835991141e+01 + 0.0000000000e+000.0000000000e+001.7707641196e-017.0299347010e+047.6097508306e+010.0000000000e+00NaN1.0797342193e-020.0000000000e+003.6937985050e+046.7203820598e+01 + 0.0000000000e+000.0000000000e+001.6584717608e-017.0687995615e+048.2905736434e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3274359823e+047.3902059801e+01 + 0.0000000000e+000.0000000000e+001.5966777409e-017.0840575437e+048.0395492802e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6765419014e+047.3515337763e+01 + 0.0000000000e+000.0000000000e+001.6918549647e-017.0399709081e+047.4931918770e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1806577828e+046.7581791820e+01 + 0.0000000000e+000.0000000000e+001.6816777042e-017.0445736843e+047.2046438558e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2961945247e+046.2778226637e+01 + 0.0000000000e+000.0000000000e+001.8090808416e-017.1102576501e+047.4353348099e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1928792241e+046.2943602805e+01 + 0.0000000000e+000.0000000000e+001.7066445183e-017.1643450332e+047.3895714286e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1615593588e+046.2203820598e+01 + 0.0000000000e+000.0000000000e+001.5160575858e-017.0756665183e+047.2821040975e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.8764466135e+045.9796943522e+01 + 0.0000000000e+000.0000000000e+001.6493909192e-017.0105427099e+046.9740642303e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5498637586e+045.6252646733e+01 + 0.0000000000e+000.0000000000e+001.6199335548e-016.9815001595e+047.0997342193e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4919612625e+045.7974883721e+01 + 0.0000000000e+000.0000000000e+001.6850036914e-017.0541306180e+048.1032467700e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5680215715e+046.9245380399e+01 + 0.0000000000e+000.0000000000e+002.0381413806e-017.1321336467e+048.9627277593e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.5266285481e+048.1323379291e+01 + 0.0000000000e+000.0000000000e+001.6863435348e-017.2767637837e+049.7534955667e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.8750085379e+048.8984449627e+01 + 0.0000000000e+000.0000000000e+001.6979311053e-017.1348992230e+049.8581711000e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.1347615020e+049.1845472854e+01 + 0.0000000000e+000.0000000000e+002.0142506460e-017.1841556145e+041.1442770018e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4621684664e+041.0818253156e+02 + 0.0000000000e+000.0000000000e+001.4881493745e-017.3064175378e+041.2030608550e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0366273434e+051.1270526269e+02 + 0.0000000000e+000.0000000000e+001.0015866904e-016.9187997414e+041.1179221653e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0093225656e+051.0650801970e+02 + 0.0000000000e+000.0000000000e+001.6885935770e-016.2191663167e+049.5290764120e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.1058498782e+048.9328549280e+01 + 0.0000000000e+000.0000000000e+001.4019933555e-016.5931040399e+041.0245046512e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+008.6604876744e+049.3047641196e+01 + 0.0000000000e+000.0000000000e+009.6832779623e-027.1346745028e+041.1543176080e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1716532053e+051.1218471761e+02 + 0.0000000000e+000.0000000000e+001.0537098560e-017.0996448173e+041.0063156146e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0223591002e+051.0046611296e+02 + 0.0000000000e+000.0000000000e+001.0382169809e-016.9281406813e+047.5780340147e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9012527061e+047.1548645794e+01 + 0.0000000000e+000.0000000000e+001.0878073823e-016.7900206886e+046.6164178126e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1862262552e+045.4765628846e+01 + 0.0000000000e+000.0000000000e+001.0013289037e-016.8584734252e+047.1670531561e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2921192359e+045.7591627907e+01 + 0.0000000000e+000.0000000000e+009.0865620852e-026.8743050517e+046.7570963602e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.9410606900e+045.3071065543e+01 + 0.0000000000e+000.0000000000e+001.7004246331e-016.9245467478e+046.6290919012e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.9764305924e+045.2567206882e+01 + 0.0000000000e+000.0000000000e+001.5694352159e-017.0251801750e+046.6553388704e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.8260647176e+045.1848327796e+01 + 0.0000000000e+000.0000000000e+002.5570717183e-017.0223354150e+047.1123396478e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2065724825e+045.6104112121e+01 + 0.0000000000e+000.0000000000e+002.5959736859e-016.9674690413e+047.1678242503e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7915433459e+045.9248401722e+01 + 0.0000000000e+000.0000000000e+001.8110741971e-017.0970329302e+047.6279280177e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8716417065e+046.6473277962e+01 + 0.0000000000e+000.0000000000e+001.6560867748e-017.1216381344e+047.8028724561e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9191998836e+046.7593706629e+01 + 0.0000000000e+000.0000000000e+001.5115765696e-016.9456415101e+047.0939581087e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2755357909e+045.7379028698e+01 + 0.0000000000e+000.0000000000e+002.0727574751e-016.8930475648e+047.0435282392e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4758882458e+045.7440564784e+01 + 0.0000000000e+000.0000000000e+001.7807308970e-016.8764344053e+046.7905204873e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3850228571e+045.5531295681e+01 + 0.0000000000e+000.0000000000e+001.5882613511e-016.8320510066e+046.7434396456e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7223454153e+045.6447785161e+01 + 0.0000000000e+000.0000000000e+002.0994595792e-016.8654625301e+045.9080294574e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7329628045e+044.2978687708e+01 + 0.0000000000e+000.0000000000e+001.5165298013e-016.8485626409e+046.0002105960e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2151690453e+044.2248443709e+01 + 0.0000000000e+000.0000000000e+001.5855610071e-016.8361207027e+045.7628961592e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3617668678e+044.1229601696e+01 + 0.0000000000e+000.0000000000e+001.9888319289e-016.9098318315e+045.7856524059e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6747954666e+044.2856104706e+01 + 0.0000000000e+000.0000000000e+001.7195509469e-016.8505715204e+045.5156121108e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0175069778e+043.9014358662e+01 + 0.0000000000e+000.0000000000e+001.5861863818e-016.9412571768e+045.9911812033e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0093136310e+044.1628273406e+01 + 0.0000000000e+000.0000000000e+001.0620462046e-016.1896371947e+045.4873333333e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1703557954e+043.8762046205e+01 + 0.0000000000e+000.0000000000e+001.0381709224e-012.4482013784e+042.1037365598e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6999889273e+031.5509899687e+01 + 0.0000000000e+000.0000000000e+007.9505239998e-025.7218932857e+013.9842098026e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4331061715e+013.4820812344e-01 + 0.0000000000e+000.0000000000e+008.6380638064e-025.6416413641e+013.8864686469e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.5362288229e+013.1555555556e-01 + 0.0000000000e+000.0000000000e+001.0481587632e-016.0195859642e+014.2270189190e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1976573302e+013.4727798767e-01 + 0.0000000000e+000.0000000000e+007.9386543918e-025.8672116156e+014.1393177147e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1327354091e+013.4275501563e-01 + 0.0000000000e+000.0000000000e+008.2134213421e-024.9908822882e+013.4105610561e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4315269527e+012.7760176018e-01 + 0.0000000000e+000.0000000000e+008.2240207573e-025.2570541225e+013.5787396503e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8807760154e+012.8689103121e-01 + 0.0000000000e+000.0000000000e+001.0620863731e-017.2362044033e+014.2419424179e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7668290451e+013.4012767066e-01 + 0.0000000000e+000.0000000000e+008.2244224422e-026.7705742574e+013.8653465347e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8635775578e+013.1669966997e-01 + 0.0000000000e+000.0000000000e+008.0571261073e-025.0363562077e+013.5443557843e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4504475638e+012.7831520323e-01 + 0.0000000000e+000.0000000000e+009.7580554108e-025.3840244304e+013.7103196833e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5740518861e+012.9263089138e-01 + 0.0000000000e+000.0000000000e+007.9361936194e-025.1173443344e+013.6066006601e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5407832783e+012.9104510451e-01 + 0.0000000000e+000.0000000000e+008.3463211453e-025.4810928580e+013.8142200075e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8771407128e+013.0552356551e-01 + 0.0000000000e+000.0000000000e+001.0794492936e-016.5859665480e+014.2987612906e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4478295843e+013.5421240808e-01 + 0.0000000000e+000.0000000000e+008.2596259626e-025.3910099010e+013.8591859186e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7503102310e+013.1009900990e-01 + 0.0000000000e+000.0000000000e+007.9060545857e-025.2513807448e+013.6737676235e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6800528994e+012.9983442259e-01 + 0.0000000000e+000.0000000000e+007.9060545857e-025.2513807448e+013.6737676235e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6800528994e+012.9983442259e-01 + 0.0000000000e+000.0000000000e+001.1177989838e-015.3366455511e+013.4672062272e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6938424961e+013.0358748046e-01 + 0.0000000000e+000.0000000000e+007.9867986799e-025.0568844884e+013.5947194719e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5384884488e+012.9069306931e-01 + 0.0000000000e+000.0000000000e+007.8955184992e-026.7242418903e+014.2559471079e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.8115100638e+013.3417339760e-01 + 0.0000000000e+000.0000000000e+001.1076978751e-015.2783961735e+013.4689153784e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6843590231e+012.9869788953e-01 + 0.0000000000e+000.0000000000e+008.0968096810e-025.1346402640e+013.7135313531e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5754455446e+012.9702970297e-01 + 0.0000000000e+000.0000000000e+006.9720449019e-025.3749120274e+013.8103164264e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7996099061e+013.1460135487e-01 + 0.0000000000e+000.0000000000e+009.0620585085e-025.2335709209e+013.6750521105e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5841667716e+012.9846795206e-01 + 0.0000000000e+000.0000000000e+009.8437843784e-025.1833861386e+013.6030803080e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5831023102e+012.9702970297e-01 + 0.0000000000e+000.0000000000e+008.0886746569e-026.0404716685e+014.0026789850e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1372638129e+013.3180497655e-01 + 0.0000000000e+000.0000000000e+008.2116553761e-025.3155063293e+013.6467159545e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7120112146e+013.0126433038e-01 + 0.0000000000e+000.0000000000e+001.0574257426e-015.2188778878e+013.5683168317e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6103234323e+012.9993399340e-01 + 0.0000000000e+000.0000000000e+009.1428152684e-025.4546596426e+013.8117215998e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7780348706e+013.1664158850e-01 + 0.0000000000e+000.0000000000e+007.2103200452e-025.0046120846e+013.4637459470e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5314084737e+012.8888096375e-01 + 0.0000000000e+000.0000000000e+001.0563256326e-015.2746732673e+013.6787678768e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5696369637e+012.9500550055e-01 + 0.0000000000e+000.0000000000e+008.4380464362e-026.6724416218e+014.0493721412e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.8160817555e+013.3474292166e-01 + 0.0000000000e+000.0000000000e+008.1879161600e-025.2784373661e+013.4980426003e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2989325459e+012.8597214985e-01 + 0.0000000000e+000.0000000000e+007.9823982398e-024.7535181518e+013.2052805281e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2703630363e+012.6050605061e-01 + 0.0000000000e+000.0000000000e+001.0542404898e-015.4575664119e+013.6091768716e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6238272248e+012.9109855393e-01 + 0.0000000000e+000.0000000000e+007.8239317353e-024.9322267674e+013.3878528313e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4089560535e+012.7404996092e-01 + 0.0000000000e+000.0000000000e+007.7029702970e-024.6901650165e+013.1458745875e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2887788779e+012.6217821782e-01 + 0.0000000000e+000.0000000000e+001.1193492705e-015.7724843126e+013.5757024058e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0666872177e+012.9805910196e-01 + 0.0000000000e+000.0000000000e+008.9550221470e-025.2495167875e+013.5016353280e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6605152025e+012.8251295524e-01 + 0.0000000000e+000.0000000000e+007.9207920792e-024.8177029703e+013.2844884488e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3594983498e+012.6899889989e-01 + 0.0000000000e+000.0000000000e+001.0324843669e-015.2170181808e+013.3961130653e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4797485091e+012.8121840803e-01 + 0.0000000000e+000.0000000000e+008.8236711829e-024.9771248335e+013.3667032164e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3989357594e+012.7493120694e-01 + 0.0000000000e+000.0000000000e+007.2145214521e-024.8375577558e+013.4275027503e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3471947195e+012.7062706271e-01 + 0.0000000000e+000.0000000000e+008.5341757860e-026.4020356124e+013.9200484193e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.3155975913e+013.1858646720e-01 + 0.0000000000e+000.0000000000e+001.0370114643e-015.6464275339e+013.5974433299e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.0963011985e+012.9176556800e-01 + 0.0000000000e+000.0000000000e+008.8712871287e-025.0075115512e+013.4336633663e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4441452145e+012.7511551155e-01 + 0.0000000000e+000.0000000000e+008.1237298072e-025.1786080641e+013.5238275143e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5349724466e+012.8543251694e-01 + 0.0000000000e+000.0000000000e+009.5418367495e-025.0461488116e+013.3869535638e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3737976304e+012.7059608592e-01 + 0.0000000000e+000.0000000000e+009.1639163916e-024.9067326733e+013.3430143014e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3419141914e+012.6926292629e-01 + 0.0000000000e+000.0000000000e+007.7251679115e-025.7057610590e+013.6734312576e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7993660290e+012.9429668954e-01 + 0.0000000000e+000.0000000000e+007.0460092062e-025.3330090180e+013.5068767732e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6441202196e+012.8186392652e-01 + 0.0000000000e+000.0000000000e+008.1452145215e-024.8917623762e+013.3610561056e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3754719472e+012.6935093509e-01 + 0.0000000000e+000.0000000000e+008.4962762724e-025.1065312373e+013.4521329107e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4520470876e+012.7802855943e-01 + 0.0000000000e+000.0000000000e+008.0449778530e-024.9981398298e+013.4157438770e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4040959267e+012.7370961438e-01 + 0.0000000000e+000.0000000000e+001.0217821782e-015.0063234323e+013.3089108911e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3986006601e+012.6924092409e-01 + 0.0000000000e+000.0000000000e+009.7964108911e-026.0363766502e+013.5424504950e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.5748834571e+012.8511963696e-01 + 0.0000000000e+000.0000000000e+007.5039191419e-025.6182185094e+013.4996837184e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2336379950e+012.7638751375e-01 + 0.0000000000e+000.0000000000e+009.0957095710e-024.7897953795e+013.1920792079e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2491529153e+012.5711771177e-01 + 0.0000000000e+000.0000000000e+009.4595818134e-024.9143040936e+013.1321405825e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2925939581e+012.5897284465e-01 + 0.0000000000e+000.0000000000e+008.0651706618e-024.7757135082e+013.0769903306e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2480375051e+012.5324937757e-01 + 0.0000000000e+000.0000000000e+007.9207920792e-024.6467986799e+013.1049504950e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1695049505e+012.4761276128e-01 + 0.0000000000e+000.0000000000e+009.5633793643e-025.3187125926e+013.3284758410e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5590123690e+012.7027821203e-01 + 0.0000000000e+000.0000000000e+009.0999869724e-025.3268462632e+013.3625032569e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5930250347e+012.7377019281e-01 + 0.0000000000e+000.0000000000e+007.8811881188e-024.9194323432e+013.4099009901e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4599867987e+012.6851485149e-01 + 0.0000000000e+000.0000000000e+009.9793512246e-025.2139067005e+013.4660825951e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5530934297e+012.7545618378e-01 + 0.0000000000e+000.0000000000e+009.3924859591e-024.9830019903e+013.2548194951e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2850990895e+012.5808617046e-01 + 0.0000000000e+000.0000000000e+008.2926292629e-024.7731221122e+013.2090209021e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2172805281e+012.4864686469e-01 + 0.0000000000e+000.0000000000e+001.0275411094e-015.8282092308e+013.5254139888e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3420348561e+012.7387003503e-01 + 0.0000000000e+000.0000000000e+009.3835548028e-025.9753661267e+013.5416927219e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6605041978e+012.8299465144e-01 + 0.0000000000e+000.0000000000e+007.3507748126e-024.6093508914e+013.0768474198e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2233949541e+012.5423964913e-01 + 0.0000000000e+000.0000000000e+007.8226515002e-024.7939922041e+013.1401487316e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2674352306e+012.5482152941e-01 + 0.0000000000e+000.0000000000e+008.8329776389e-025.0229272220e+013.3238689284e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3242822087e+012.6073034697e-01 + 0.0000000000e+000.0000000000e+009.5662693157e-024.7927882634e+013.1607696836e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1938425901e+012.4900110375e-01 + 0.0000000000e+000.0000000000e+008.1212403101e-025.2120885013e+013.3795917313e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5474898191e+012.7470930233e-01 + 0.0000000000e+000.0000000000e+009.3367729350e-025.5769742287e+013.5278505057e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7773563325e+012.9495405308e-01 + 0.0000000000e+000.0000000000e+009.7850432334e-025.0593059485e+013.3113521521e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4606015856e+012.7497950173e-01 + 0.0000000000e+000.0000000000e+008.4947212994e-025.2033257660e+013.5005389443e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5592767073e+012.8224603175e-01 + 0.0000000000e+000.0000000000e+008.8019131714e-024.9857159676e+013.4197866078e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3943203826e+012.7469499632e-01 + 0.0000000000e+000.0000000000e+009.2083489179e-024.9509516219e+013.3610697968e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3595391227e+012.7061157437e-01 + 0.0000000000e+000.0000000000e+001.0438626800e-015.8952012994e+013.7164769288e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9028116058e+012.9806009598e-01 + 0.0000000000e+000.0000000000e+008.6167441860e-026.4043546253e+014.0381188630e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.0580089922e+013.3011266150e-01 + 0.0000000000e+000.0000000000e+009.2165891473e-025.3472875969e+013.7329922481e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6989443411e+013.0639844961e-01 + 0.0000000000e+000.0000000000e+001.0100000000e-015.5142966667e+013.8050000000e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7318466667e+013.0840000000e-01 + 0.0000000000e+000.0000000000e+007.6128476821e-025.1216123841e+013.7154370861e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6092400000e+012.9926490066e-01 + 0.0000000000e+000.0000000000e+008.5312497708e-025.2200779924e+013.7462384399e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6055526024e+012.9837297309e-01 + 0.0000000000e+000.0000000000e+001.0109235880e-015.7195929568e+013.8906578073e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0369807309e+013.1256212625e-01 + 0.0000000000e+000.0000000000e+007.9809271523e-025.8357539956e+013.9327505519e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3966587196e+013.2394348786e-01 + 0.0000000000e+000.0000000000e+007.7301839588e-025.2746948933e+013.6905827815e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7596168359e+013.0910095659e-01 + 0.0000000000e+000.0000000000e+008.6288888889e-025.4427000000e+013.8175555556e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7708000000e+013.1391111111e-01 + 0.0000000000e+000.0000000000e+001.0272273731e-015.2554549963e+013.6697866078e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6262939809e+013.0182236939e-01 + 0.0000000000e+000.0000000000e+008.7013456313e-025.2131350367e+013.7399383647e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6676262832e+013.1090216306e-01 + 0.0000000000e+000.0000000000e+009.1397139714e-026.0152255226e+013.9613861386e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.1713597360e+013.2023102310e-01 + 0.0000000000e+000.0000000000e+009.3750000000e-026.5087770468e+013.8423245614e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.5544049708e+013.1485380117e-01 + 0.0000000000e+000.0000000000e+006.7735148515e-024.8230810390e+013.3078404551e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3760878785e+012.7170285450e-01 + 0.0000000000e+000.0000000000e+007.7278648395e-025.1199038715e+013.4875833279e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5009140676e+012.8268543411e-01 + 0.0000000000e+000.0000000000e+008.0706401766e-024.8299006623e+013.3210816777e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3189072848e+012.6490066225e-01 + 0.0000000000e+000.0000000000e+009.4616180062e-024.9866825262e+013.3668621152e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3721479615e+012.6900970276e-01 + 0.0000000000e+000.0000000000e+008.2104097453e-025.3276389812e+013.5266888151e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6976965670e+012.8954595792e-01 + 0.0000000000e+000.0000000000e+008.8205980066e-025.6500775194e+013.6085271318e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9100553710e+013.0149501661e-01 + 0.0000000000e+000.0000000000e+001.0211568502e-015.0729398253e+013.3386504147e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4568572749e+012.7944159644e-01 + 0.0000000000e+000.0000000000e+008.1948545320e-025.3948254017e+013.7660007481e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7360441648e+013.0940668705e-01 + 0.0000000000e+000.0000000000e+008.2505980066e-025.1200453488e+013.6487740864e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5841089037e+012.9504717608e-01 + 0.0000000000e+000.0000000000e+008.8050993377e-025.1500232892e+013.6089558499e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5858866667e+012.9459690949e-01 + 0.0000000000e+000.0000000000e+008.2049006623e-025.7609333775e+013.7950441501e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7627922222e+013.1433642384e-01 + 0.0000000000e+000.0000000000e+008.0804872647e-026.9075771650e+014.2598504983e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.8603982540e+013.4481240310e-01 + 0.0000000000e+000.0000000000e+009.6013289037e-027.6127176080e+016.2657807309e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.0855282392e+015.6750830565e-01 + 0.0000000000e+000.0000000000e+001.2017072721e-011.2331086338e+021.1246702104e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1667345729e+021.0590237357e+00 + 0.0000000000e+000.0000000000e+008.3262273902e-025.1546401292e+013.5884031008e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6540673385e+012.9556098191e-01 + 0.0000000000e+000.0000000000e+009.0631229236e-025.1205847176e+013.5464008859e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5704983389e+012.9320044297e-01 + 0.0000000000e+000.0000000000e+001.0465116279e-015.5051495017e+013.6461794020e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7723421927e+013.0647840532e-01 + 0.0000000000e+000.0000000000e+008.0553709856e-025.9301727575e+013.9625692137e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1862879291e+013.3395348837e-01 + 0.0000000000e+000.0000000000e+008.2989556519e-025.2730964629e+013.7762663821e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7509671294e+013.1787415752e-01 + 0.0000000000e+000.0000000000e+008.9223178808e-025.4162964312e+013.7081810155e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7472637380e+013.1033252391e-01 + 0.0000000000e+000.0000000000e+001.0053333333e-015.2190666667e+013.6236666667e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6148666667e+012.9903333333e-01 + 0.0000000000e+000.0000000000e+007.3090033223e-025.1014950351e+013.6813654485e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6475669177e+013.0485300849e-01 + 0.0000000000e+000.0000000000e+008.9343300111e-025.5746105205e+013.7407456626e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8945753045e+013.0779143595e-01 + 0.0000000000e+000.0000000000e+001.0300000000e-016.6433555556e+014.1644444444e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7844888889e+013.4288888889e-01 + 0.0000000000e+000.0000000000e+008.0713178295e-025.6943816537e+014.1703359173e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4113366925e+013.5297416021e-01 + 0.0000000000e+000.0000000000e+008.6953488372e-025.4623461240e+013.7801085271e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7838277519e+013.1381472868e-01 + 0.0000000000e+000.0000000000e+009.3100000000e-025.1271666667e+013.5486666667e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5983666667e+012.9666666667e-01 + 0.0000000000e+000.0000000000e+006.8418272425e-025.2351627353e+013.6813023256e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7211090144e+013.0331705426e-01 + 0.0000000000e+000.0000000000e+006.9215060908e-025.8361183758e+013.9111421189e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0736820967e+013.2280516796e-01 + 0.0000000000e+000.0000000000e+009.4533333333e-025.2901466667e+013.6835555556e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7354400000e+013.0804444444e-01 + 0.0000000000e+000.0000000000e+001.0389280177e-015.2301934293e+013.4953355482e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6191326098e+012.9580598007e-01 + 0.0000000000e+000.0000000000e+008.2373864895e-025.4338343485e+013.7787755629e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7632318346e+013.1063846438e-01 + 0.0000000000e+000.0000000000e+008.6618383167e-025.1390848099e+013.6454769288e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5695012772e+012.9311568845e-01 + 0.0000000000e+000.0000000000e+001.0159468439e-015.7583853821e+013.8631229236e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3535016611e+013.0770764120e-01 + 0.0000000000e+000.0000000000e+007.3864710225e-026.8630631414e+014.2860668143e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.3765703950e+013.4794333702e-01 + 0.0000000000e+000.0000000000e+007.3777777778e-025.0256888889e+013.5811111111e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5874555556e+012.9594444444e-01 + 0.0000000000e+000.0000000000e+007.4085086748e-025.1770862865e+013.7098984865e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6538145810e+013.0176005906e-01 + 0.0000000000e+000.0000000000e+001.0161683278e-015.6286511628e+013.9087486157e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8493820598e+013.2513842746e-01 + 0.0000000000e+000.0000000000e+006.6142524917e-024.9901181063e+013.6097973422e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5796655814e+012.9641262458e-01 + 0.0000000000e+000.0000000000e+009.0634883721e-025.3746282946e+013.6688294574e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6890010853e+012.9832713178e-01 + 0.0000000000e+000.0000000000e+009.0276854928e-026.0507131783e+013.9364341085e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1625559247e+013.3189368771e-01 + 0.0000000000e+000.0000000000e+007.5721594684e-024.9825807494e+013.5042919897e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5558385456e+012.9255695829e-01 + 0.0000000000e+000.0000000000e+006.6652097130e-025.0661017292e+013.6089941133e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6217633407e+012.9697807211e-01 + 0.0000000000e+000.0000000000e+009.0214569536e-025.4549204930e+013.7338947756e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7410655482e+013.0773303900e-01 + 0.0000000000e+000.0000000000e+007.6066666667e-025.0485200000e+013.5666666667e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5911200000e+012.9333333333e-01 + 0.0000000000e+000.0000000000e+005.8654042082e-025.1415558767e+013.6296740495e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7088548690e+012.9771531931e-01 + 0.0000000000e+000.0000000000e+006.6002214839e-025.5045249169e+013.8035437431e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7880000000e+013.1047619048e-01 + 0.0000000000e+000.0000000000e+001.0827707641e-015.1662880952e+013.4826710963e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5403206866e+012.8921960133e-01 + 0.0000000000e+000.0000000000e+006.4328476821e-025.0703672185e+013.6458013245e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6028684768e+012.9403907285e-01 + 0.0000000000e+000.0000000000e+008.4050039236e-025.4680146751e+013.8129450764e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7518296627e+013.0962061707e-01 + 0.0000000000e+000.0000000000e+008.7906976744e-025.1516411960e+013.6637873754e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6052225914e+013.0053156146e-01 + 0.0000000000e+000.0000000000e+007.6799557032e-025.3741196013e+013.6898117386e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0725581395e+013.0351052049e-01 + 0.0000000000e+000.0000000000e+006.7729789590e-026.5596677741e+014.1461794020e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.8951495017e+013.3935769657e-01 + 0.0000000000e+000.0000000000e+009.0265780731e-024.9107674419e+013.3222591362e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3247508306e+012.6358803987e-01 + 0.0000000000e+000.0000000000e+009.0808416390e-025.0117940199e+013.3444075305e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3897009967e+012.7076411960e-01 + 0.0000000000e+000.0000000000e+007.6478405316e-025.0802990033e+013.4225913621e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4985249169e+012.7744186047e-01 + 0.0000000000e+000.0000000000e+006.6765891473e-024.8183057364e+013.2682170543e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4404415504e+012.6924651163e-01 + 0.0000000000e+000.0000000000e+008.9989368771e-021.5137264585e+027.9827242525e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0620358007e+026.6161727575e-01 + 0.0000000000e+000.0000000000e+001.6810631229e-026.1438461508e+022.9739902679e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.9264302656e+022.4977986183e+00 + 0.0000000000e+000.0000000000e+002.0000000000e-033.3378363907e+021.6074039735e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.9423749338e+021.4138841060e+00 + 0.0000000000e+000.0000000000e+001.4323366556e-027.8061237708e+023.0173100775e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.6400598787e+033.2484390919e+00 + 0.0000000000e+000.0000000000e+001.7009966777e-021.4247056035e+031.5723499446e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4976088859e+041.9689302326e+01 + 0.0000000000e+000.0000000000e+001.2900000000e-024.5057527194e+035.8530568254e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1188608498e+057.9690136360e+01 + 0.0000000000e+000.0000000000e+009.7166666667e-025.6273438444e+037.8218700000e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6485631809e+051.1147051111e+02 + 0.0000000000e+000.0000000000e+001.2088571429e-014.2474495270e+034.7530731746e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.7182082641e+046.7151301587e+01 + 0.0000000000e+000.0000000000e+007.1096345515e-039.0111421927e+027.3930897010e+000.0000000000e+00NaN9.3023255814e-040.0000000000e+009.4099573422e+038.2822591362e+00 + 0.0000000000e+000.0000000000e+001.3160206718e-021.6009122426e+031.4930745220e+010.0000000000e+00NaN5.7364341085e-030.0000000000e+002.0758794772e+041.7848417054e+01 + 0.0000000000e+000.0000000000e+001.0324067922e-011.0089088316e+031.0989299077e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0666564995e+041.4777241860e+01 + 0.0000000000e+000.0000000000e+004.8150609081e-011.3014817276e+036.2961240310e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.5689366556e+036.8256921373e+00 + 0.0000000000e+000.0000000000e+006.5448504983e-023.4153547176e+033.6057342193e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.2927240764e+044.5007541528e+01 + 0.0000000000e+000.0000000000e+004.5756895705e-027.1870320740e+039.9098155376e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9063165035e+051.2874817657e+02 + 0.0000000000e+000.0000000000e+001.0692306000e-016.5592233966e+039.4633472531e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8482047537e+051.2315512354e+02 + 0.0000000000e+000.0000000000e+002.2234699151e-014.7849934415e+036.6983962348e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2919505164e+058.6804746585e+01 + 0.0000000000e+000.0000000000e+001.1207648579e+008.9533953747e+024.1922170543e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.2097569380e+023.8304250646e+00 + 0.0000000000e+000.0000000000e+003.0621291990e-016.0581379587e+025.3993162791e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.9025659618e+036.7967860465e+00 + 0.0000000000e+000.0000000000e+002.0734189738e-012.2060252185e+032.8418502104e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9791726308e+044.1039437652e+01 + 0.0000000000e+000.0000000000e+002.1473256914e-012.5869047095e+021.2634126862e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7502953378e+029.0218972080e-01 + 0.0000000000e+000.0000000000e+002.2919220015e-012.4898365497e+021.2758296542e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9273220221e+029.1612818249e-01 + 0.0000000000e+000.0000000000e+001.9633333333e-011.5063206556e+034.1041111111e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1658425667e+033.2778222222e+00 + 0.0000000000e+000.0000000000e+001.1040634921e-011.8269484277e+043.3176591178e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.1396180561e+032.5271213141e+01 + 0.0000000000e+000.0000000000e+001.4757142857e-016.7466284834e+045.7517686600e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8765408439e+033.7285609081e+01 + 0.0000000000e+000.0000000000e+001.9857475083e-016.7237094070e+045.3293398671e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8706649369e+033.4707691030e+01 + 0.0000000000e+000.0000000000e+002.6450719823e-016.8645957165e+045.3733012182e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8569413289e+033.4944573643e+01 + 0.0000000000e+000.0000000000e+001.6256921373e-016.7193593223e+045.4447441860e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2388577187e+033.6103433001e+01 + 0.0000000000e+000.0000000000e+001.8760797342e-016.9383570731e+046.6733820598e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.2013121595e+034.5133754153e+01 + 0.0000000000e+000.0000000000e+001.3650055371e-016.7253288948e+045.5421373200e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.6220543300e+033.8619645626e+01 + 0.0000000000e+000.0000000000e+001.4235142119e-016.6837231697e+045.3069231266e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.2463974705e+033.6565624769e+01 + 0.0000000000e+000.0000000000e+001.7273163529e-016.5944890030e+045.4426272610e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.7945377344e+033.8699447213e+01 + 0.0000000000e+000.0000000000e+001.6398671096e-017.0284291960e+046.8153754153e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.1778934219e+034.5111096346e+01 + 0.0000000000e+000.0000000000e+001.4289276486e-016.9252203676e+045.3914284348e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8114573548e+033.5231534219e+01 + 0.0000000000e+000.0000000000e+001.7972074566e-016.9812715460e+045.7489835253e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7078041513e+033.7953770321e+01 + 0.0000000000e+000.0000000000e+001.3860780474e-017.0009910556e+045.6493931267e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.1243538700e+033.7928866765e+01 + 0.0000000000e+000.0000000000e+001.6691821962e-016.8445816243e+046.1333654558e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.2042103936e+034.1705762249e+01 + 0.0000000000e+000.0000000000e+001.4061989664e-016.9239020585e+046.3047801144e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5313047296e+034.2853056220e+01 + 0.0000000000e+000.0000000000e+001.5827866078e-016.7842786163e+045.6997948271e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.9446629232e+033.9275927667e+01 + 0.0000000000e+000.0000000000e+001.8008261644e-016.6813764481e+045.6538292667e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4472477408e+044.0897416999e+01 + 0.0000000000e+000.0000000000e+001.4617940199e-016.7399807619e+045.6040398671e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1252579491e+043.9351450720e+01 + 0.0000000000e+000.0000000000e+001.4863864381e-016.8540364180e+047.1926606675e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1400880552e+045.4232169809e+01 + 0.0000000000e+000.0000000000e+002.1540343813e-016.7019193372e+046.9940635850e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1206648430e+046.0963732738e+01 + 0.0000000000e+000.0000000000e+006.5629501661e-017.0496680306e+049.4396240089e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4934676797e+049.6408979845e+01 + 0.0000000000e+000.0000000000e+006.0367682119e-017.3104301266e+049.1798267550e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.4728615502e+048.5352386755e+01 + 0.0000000000e+000.0000000000e+002.1147902870e-017.2631738079e+049.3599337748e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8724491501e+047.9793046358e+01 + 0.0000000000e+000.0000000000e+002.0407923783e-017.2777449661e+048.1645619263e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1442556078e+047.1886370396e+01 + 0.0000000000e+000.0000000000e+004.0208152394e-017.0162781555e+046.5862711192e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.8239878060e+045.4787342366e+01 + 0.0000000000e+000.0000000000e+004.6116906724e-017.0429624127e+046.4618903205e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4079835817e+044.6778734127e+01 + 0.0000000000e+000.0000000000e+004.6116906724e-017.0429624127e+046.4618903205e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4079835817e+044.6778734127e+01 + 0.0000000000e+000.0000000000e+001.8426747609e-017.2723478684e+048.8326680059e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.3952247024e+048.1737630316e+01 + 0.0000000000e+000.0000000000e+003.0192894057e-017.3117644054e+048.7094046438e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.9460448829e+048.2913375932e+01 + 0.0000000000e+000.0000000000e+001.7692137320e-017.2517389457e+048.0331074197e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9764545316e+047.5003277962e+01 + 0.0000000000e+000.0000000000e+001.3661129568e-017.2011793821e+047.3904983389e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8146631163e+046.2432093023e+01 + 0.0000000000e+000.0000000000e+001.6517157672e-017.0064733233e+047.4710103335e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1461742072e+046.2030212170e+01 + 0.0000000000e+000.0000000000e+001.6935776991e-016.9919397243e+046.5200948714e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4296411140e+045.1581925150e+01 + 0.0000000000e+000.0000000000e+002.7975636766e-017.0584539535e+047.6671483942e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1377997187e+047.0350498339e+01 + 0.0000000000e+000.0000000000e+002.8792780504e-017.6553554613e+041.0235368213e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0109404825e+051.0536762066e+02 + 0.0000000000e+000.0000000000e+001.5412092143e-017.3135504468e+041.3688637324e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5876727317e+051.4831901278e+02 + 0.0000000000e+000.0000000000e+001.3669988926e-017.2744203544e+041.2659557032e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5211212839e+051.4077099668e+02 + 0.0000000000e+000.0000000000e+001.8664055796e-017.2175445697e+041.2407366351e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5399238197e+051.3891091769e+02 + 0.0000000000e+000.0000000000e+001.4183120283e-017.1958009453e+041.1230600427e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4661725997e+051.2912066592e+02 + 0.0000000000e+000.0000000000e+001.5531561462e-017.3620413455e+049.3153986711e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.3749428904e+049.5776411960e+01 + 0.0000000000e+000.0000000000e+001.9327260860e-016.9984703428e+047.1583960456e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6414671329e+045.9214047949e+01 + 0.0000000000e+000.0000000000e+001.3663879783e-016.9844195897e+046.9200978636e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6566018361e+045.7861411630e+01 + 0.0000000000e+000.0000000000e+001.1733111849e-016.9717251218e+046.2812093023e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.9304156999e+045.0497242525e+01 + 0.0000000000e+000.0000000000e+001.0664818523e-016.8744021053e+046.1608473594e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4907743978e+044.7919866816e+01 + 0.0000000000e+000.0000000000e+001.2514819720e-016.9610090999e+046.8852351876e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7025303018e+045.3521622811e+01 + 0.0000000000e+000.0000000000e+009.8866666667e-026.9751278778e+047.0572888889e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.9586571889e+045.5552000000e+01 + 0.0000000000e+000.0000000000e+001.1176220007e-017.0703281806e+047.3989286748e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2501290074e+046.2342889110e+01 + 0.0000000000e+000.0000000000e+001.2522702104e-017.0908358660e+046.1663255814e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1475345227e+044.6207486157e+01 + 0.0000000000e+000.0000000000e+001.0149039625e-017.0065158852e+046.4682945150e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6031548048e+044.5823661966e+01 + 0.0000000000e+000.0000000000e+006.8696990821e-026.8812947332e+046.1887608487e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5786015103e+044.4096484112e+01 + 0.0000000000e+000.0000000000e+001.2539082856e-016.9839858689e+045.9431158807e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6627527215e+044.2670652032e+01 + 0.0000000000e+000.0000000000e+001.0264026403e-017.0742324422e+046.1438448845e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7048402277e+044.4290792079e+01 + 0.0000000000e+000.0000000000e+009.8723293382e-027.1231066011e+046.4982256384e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5817284455e+044.6072832204e+01 + 0.0000000000e+000.0000000000e+001.1326790574e-016.9112069248e+046.3106302472e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8139065182e+044.7305264605e+01 + 0.0000000000e+000.0000000000e+001.0985698570e-016.8150344081e+046.4858327833e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5503100176e+045.1963080308e+01 + 0.0000000000e+000.0000000000e+006.9616336634e-027.0699142987e+046.7767343379e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0882724599e+045.5073146315e+01 + 0.0000000000e+000.0000000000e+001.1492711771e-017.1139083746e+046.9201743530e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0557838570e+045.5922167217e+01 + 0.0000000000e+000.0000000000e+008.4653465347e-027.1012931232e+047.4852321232e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7646621859e+046.2163938394e+01 + 0.0000000000e+000.0000000000e+001.5596766256e-017.1003203443e+047.5683259800e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8599909308e+046.1932096144e+01 + 0.0000000000e+000.0000000000e+001.0615554977e-017.1075975721e+047.0519072434e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8177939350e+045.8276847751e+01 + 0.0000000000e+000.0000000000e+001.1518151815e-017.0828983729e+047.2610891089e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.9421042772e+046.0247128713e+01 + 0.0000000000e+000.0000000000e+009.1434222892e-027.0331862051e+047.8749301029e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5705103924e+046.6481066815e+01 + 0.0000000000e+000.0000000000e+001.3437841485e-017.0827585343e+048.5228753749e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.1604969078e+047.7194263273e+01 + 0.0000000000e+000.0000000000e+001.7811871539e-017.0772052701e+047.8226134330e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8387439949e+046.8029791694e+01 + 0.0000000000e+000.0000000000e+001.1967751938e-016.9688306878e+047.5469768217e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3895180195e+046.5082234884e+01 + 0.0000000000e+000.0000000000e+001.0221483942e-016.9796942636e+048.5409413068e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8891733776e+047.6038316722e+01 + 0.0000000000e+000.0000000000e+002.1457364341e-017.1537489380e+049.7280398671e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.3588323145e+049.1983676633e+01 + 0.0000000000e+000.0000000000e+003.1986710963e-017.0008582724e+041.1588066445e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2017797648e+051.1559455150e+02 + 0.0000000000e+000.0000000000e+002.0895902547e-017.1946064828e+041.0076454042e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+008.0283313488e+049.9460055371e+01 + 0.0000000000e+000.0000000000e+002.1867109635e-017.2286631118e+048.8363300111e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0583656722e+048.3382591362e+01 + 0.0000000000e+000.0000000000e+001.6824162285e-017.1887016257e+048.4160945304e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8904838813e+047.5501218345e+01 + 0.0000000000e+000.0000000000e+008.6950699043e-027.1299094579e+047.6533469757e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.8710791838e+046.5104477410e+01 + 0.0000000000e+000.0000000000e+008.8966666667e-027.0969331700e+047.5683833333e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.8855581389e+046.5798377778e+01 + 0.0000000000e+000.0000000000e+001.2853204134e-017.0340129436e+047.5866214507e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0910026399e+046.5768473533e+01 + 0.0000000000e+000.0000000000e+007.8212403101e-027.0725419231e+048.3371352159e+010.0000000000e+00NaN7.4000000000e-030.0000000000e+003.5652823523e+047.2511659801e+01 + 0.0000000000e+000.0000000000e+001.8000000000e-017.0653606467e+048.1141333333e+010.0000000000e+00NaN1.0000000000e-020.0000000000e+003.6634262400e+047.2361200000e+01 + 0.0000000000e+000.0000000000e+002.1142192982e-017.0131503204e+047.9398004386e+010.0000000000e+00NaN1.1944210526e-010.0000000000e+004.4205871738e+047.3368147368e+01 + 0.0000000000e+000.0000000000e+001.9228918129e-016.8318538152e+047.1152417836e+010.0000000000e+00NaN1.2712245614e+000.0000000000e+003.3618948485e+046.2661430409e+01 + 0.0000000000e+000.0000000000e+001.9345854559e-017.0040842637e+047.6848044001e+010.0000000000e+00NaN7.6853355482e-010.0000000000e+003.2825125870e+046.4519832632e+01 + 0.0000000000e+000.0000000000e+001.5722926455e-016.6588592888e+046.7329856322e+010.0000000000e+00NaN1.6476716232e+000.0000000000e+002.4850058321e+045.6334870496e+01 + 0.0000000000e+000.0000000000e+001.5653596247e-016.7957790478e+046.3316278783e+010.0000000000e+00NaN8.7019105678e-010.0000000000e+001.9791526353e+045.1649082992e+01 + 0.0000000000e+000.0000000000e+001.3757475083e-016.9889385814e+046.9107176080e+010.0000000000e+00NaN9.8870431894e-020.0000000000e+002.5754344186e+045.7573621262e+01 + 0.0000000000e+000.0000000000e+001.6915968112e-017.0303277920e+046.8408520605e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4889281056e+045.4860956561e+01 + 0.0000000000e+000.0000000000e+001.9142725133e-017.0427309189e+047.2235898000e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5139224183e+045.7964680205e+01 + 0.0000000000e+000.0000000000e+002.0214787745e-016.9853137506e+047.2589015098e+010.0000000000e+00NaN2.5487777778e-010.0000000000e+002.5728344410e+045.8942489184e+01 + 0.0000000000e+000.0000000000e+001.9046563307e-016.5734363158e+046.4019633850e+010.0000000000e+00NaN1.2178888889e-010.0000000000e+002.4015658358e+045.1748352455e+01 + 0.0000000000e+000.0000000000e+003.5049833887e-012.1802207951e+042.2793687708e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.7389741085e+031.8894352159e+01 + 0.0000000000e+000.0000000000e+003.0056478405e-018.8614229236e+023.5031229236e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0029852159e+033.3278073090e+00 + 0.0000000000e+000.0000000000e+001.9822812846e-013.4563255814e+036.5957918051e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0691472868e+035.5980066445e+00 + 0.0000000000e+000.0000000000e+001.8643200443e-014.6499985832e+038.7046859358e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2647054528e+037.0729925434e+00 + 0.0000000000e+000.0000000000e+001.9000000000e-012.0367991778e+035.6406222222e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5048043333e+035.1277222222e+00 + 0.0000000000e+000.0000000000e+001.6500419426e-013.6141128433e+021.9946727005e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2529235279e+031.9373058867e+00 + 0.0000000000e+000.0000000000e+001.2428916122e-012.1866057813e+021.1697976576e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.7746302043e+021.1045042647e+00 + 0.0000000000e+000.0000000000e+001.0116220007e-013.1456709310e+021.1205740864e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3794102946e+021.0646009598e+00 + 0.0000000000e+000.0000000000e+001.1816227390e-011.9147133437e+027.7944806202e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7594253643e+026.8022739018e-01 + 0.0000000000e+000.0000000000e+009.9335548173e-027.2806146179e+014.7707641196e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6150332226e+013.9219269103e-01 + 0.0000000000e+000.0000000000e+007.4462901440e-025.3392403101e+013.7581395349e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7142436323e+013.0389811739e-01 + 0.0000000000e+000.0000000000e+009.7311977001e-025.2751573159e+013.5946422154e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5149684862e+012.8439997653e-01 + 0.0000000000e+000.0000000000e+009.1838410596e-025.1811832082e+013.6005290655e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5058032377e+012.8357071376e-01 + 0.0000000000e+000.0000000000e+008.1945957918e-026.0178344481e+013.6256482097e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5769104467e+012.9452100406e-01 + 0.0000000000e+000.0000000000e+008.7076558638e-025.6188289220e+013.5507542922e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5289397373e+012.8789062214e-01 + 0.0000000000e+000.0000000000e+009.6044150110e-025.0065499632e+013.3992641648e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3536031494e+012.6592170714e-01 + 0.0000000000e+000.0000000000e+008.9382059801e-025.1031249908e+013.4096714655e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3763663049e+012.6654204504e-01 + 0.0000000000e+000.0000000000e+007.4772978959e-024.9541694352e+013.3516057586e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3587707641e+012.6000000000e-01 + 0.0000000000e+000.0000000000e+001.0091162791e-015.0969211296e+013.3785005537e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3949273754e+012.6128017719e-01 + 0.0000000000e+000.0000000000e+009.7095016611e-025.0456536213e+013.3850653378e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3348500332e+012.6199778516e-01 + 0.0000000000e+000.0000000000e+008.0844939239e-024.8221713677e+013.3077911744e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2328984877e+012.5452318614e-01 + 0.0000000000e+000.0000000000e+009.7870453895e-024.9238264175e+013.3253206750e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2844226640e+012.6229851928e-01 + 0.0000000000e+000.0000000000e+008.7464008859e-028.8357940199e+015.6330011074e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.4559136213e+014.5452934662e-01 + 0.0000000000e+000.0000000000e+007.6939267930e-027.3574546178e+014.7979696083e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6428403152e+013.7981672570e-01 + 0.0000000000e+000.0000000000e+007.9627730963e-024.7099008639e+013.1855298380e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1987543692e+012.5017220010e-01 + 0.0000000000e+000.0000000000e+009.3736360281e-022.1252381314e+021.2108211148e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2752996065e+021.0130844592e+00 + 0.0000000000e+000.0000000000e+008.9331192322e-027.2064589893e+024.2969308232e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2435135718e+023.6369155408e+00 + 0.0000000000e+000.0000000000e+007.9734219269e-027.9634378738e+024.8021926910e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7423823920e+024.0669435216e+00 + 0.0000000000e+000.0000000000e+009.9445699520e-023.0450580258e+021.8412320413e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8947367028e+021.5494520487e+00 + 0.0000000000e+000.0000000000e+009.3621853082e-025.0249944924e+013.2626519011e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3520161388e+012.5972846069e-01 + 0.0000000000e+000.0000000000e+007.9734219269e-024.7898671096e+013.2475083056e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2486710963e+012.5249169435e-01 + 0.0000000000e+000.0000000000e+008.1821705426e-024.8609606202e+013.3340620155e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2534305426e+012.5684651163e-01 + 0.0000000000e+000.0000000000e+009.8588039867e-024.9877525581e+013.3794485050e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2663047841e+012.5757209302e-01 + 0.0000000000e+000.0000000000e+009.4307862680e-024.8969435216e+013.3312292359e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2216611296e+012.5198228128e-01 + 0.0000000000e+000.0000000000e+008.3215208564e-025.0680061425e+013.4482111480e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3327918642e+012.6111229236e-01 + 0.0000000000e+000.0000000000e+009.8412698413e-025.0669130159e+013.3693968254e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2864584127e+012.5615238095e-01 + 0.0000000000e+000.0000000000e+008.7042857143e-024.8391214286e+013.2857142857e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2584471429e+012.5581428571e-01 + 0.0000000000e+000.0000000000e+007.7442192691e-024.9458841085e+013.3838316722e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4053214064e+012.6851572536e-01 + 0.0000000000e+000.0000000000e+001.0376522702e-015.1234219269e+013.4407530454e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4332890365e+012.7430786268e-01 + 0.0000000000e+000.0000000000e+009.7142857143e-024.9847840532e+013.3990033223e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3607308970e+012.7013289037e-01 + 0.0000000000e+000.0000000000e+007.0549723145e-025.0723999114e+013.5297452935e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4650286600e+012.7747685493e-01 + 0.0000000000e+000.0000000000e+007.9959689922e-025.1979212403e+013.6040310078e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5479624806e+012.8427286822e-01 + 0.0000000000e+000.0000000000e+001.0227021041e-015.2552358804e+013.6472868217e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5649700997e+012.8978959025e-01 + 0.0000000000e+000.0000000000e+008.3898117386e-025.1634750831e+013.6657807309e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5453820598e+012.9016611296e-01 + 0.0000000000e+000.0000000000e+007.2259136213e-025.1075913621e+013.6943521595e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5656146179e+012.9302325581e-01 + 0.0000000000e+000.0000000000e+009.6079734219e-025.2506976744e+013.7178294574e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6149501661e+012.9900332226e-01 + 0.0000000000e+000.0000000000e+009.5344222961e-025.4371343152e+013.7849420450e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6635150203e+012.9954485050e-01 + 0.0000000000e+000.0000000000e+008.1522222222e-025.3803833333e+013.7761111111e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7152000000e+013.0000000000e-01 + 0.0000000000e+000.0000000000e+007.9855592470e-025.1852940901e+013.6933211517e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5945031414e+012.9043300111e-01 + 0.0000000000e+000.0000000000e+009.2292358804e-025.1835282392e+013.6159468439e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5445847176e+012.8956810631e-01 + 0.0000000000e+000.0000000000e+008.5160575858e-025.1337840532e+013.6083056478e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5950166113e+012.9568106312e-01 + 0.0000000000e+000.0000000000e+007.4942245495e-025.0511884594e+013.6127111248e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5445176857e+012.8986087581e-01 + 0.0000000000e+000.0000000000e+009.7304782929e-025.4638973804e+013.7467152318e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7060833996e+013.0683473142e-01 + 0.0000000000e+000.0000000000e+009.5637799926e-024.2034998324e+026.9026998893e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.6976048948e+015.2031435954e-01 + 0.0000000000e+000.0000000000e+007.9596048492e-021.0256742107e+031.0936346468e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.2163856571e+017.4860146091e-01 + 0.0000000000e+000.0000000000e+009.1799484915e-026.4521953937e+027.6130647535e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.1934216703e+015.2692862399e-01 + 0.0000000000e+000.0000000000e+009.6289959395e-024.9913514581e+013.3608877815e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3827973237e+012.7286415652e-01 + 0.0000000000e+000.0000000000e+008.6290143965e-024.9582591362e+013.3725359911e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4494219269e+012.7583610188e-01 + 0.0000000000e+000.0000000000e+008.3197674419e-025.1528516279e+013.4794651163e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5320518605e+012.8124418605e-01 + 0.0000000000e+000.0000000000e+009.6933333333e-025.1940766667e+013.4986666667e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4657933333e+012.7823333333e-01 + 0.0000000000e+000.0000000000e+009.4564451827e-025.1296342746e+013.5800077519e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5409776190e+012.9489678848e-01 + 0.0000000000e+000.0000000000e+007.6367663344e-025.0142812846e+013.5357696567e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5034152824e+012.9036544850e-01 + 0.0000000000e+000.0000000000e+009.1483942414e-024.9913588040e+013.4223698782e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3509966777e+012.6912513843e-01 + 0.0000000000e+000.0000000000e+009.4552375085e-025.0316467184e+013.4991529339e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3834035555e+012.7362984313e-01 + 0.0000000000e+000.0000000000e+008.1376011773e-025.1075244739e+013.5214775570e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4518746431e+012.7738278146e-01 + 0.0000000000e+000.0000000000e+008.6622222222e-025.1300666667e+013.4511111111e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4373733333e+012.7013333333e-01 + 0.0000000000e+000.0000000000e+009.9507284768e-024.9870203385e+013.3556674025e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3058690213e+012.5915055188e-01 + 0.0000000000e+000.0000000000e+009.8130367502e-024.9775590783e+013.3659464772e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2879644966e+012.6192940383e-01 + 0.0000000000e+000.0000000000e+007.8349944629e-024.9242026578e+013.3726467331e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3904651163e+012.6899224806e-01 + 0.0000000000e+000.0000000000e+008.8729400893e-025.0127857253e+013.4455127500e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4657315351e+012.7834987129e-01 + 0.0000000000e+000.0000000000e+009.6863068653e-025.3536273423e+013.7058715246e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6361743343e+012.9936884410e-01 + 0.0000000000e+000.0000000000e+007.6810631229e-022.8095867110e+021.6815946844e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6701777409e+021.4070764120e+00 + 0.0000000000e+000.0000000000e+008.3720930233e-025.8233776301e+023.4170542636e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2601085271e+022.8688815061e+00 + 0.0000000000e+000.0000000000e+009.5188372093e-026.4194767003e+023.7693310078e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5681306150e+023.1547178295e+00 + 0.0000000000e+000.0000000000e+007.7546954596e-026.4926348169e+023.8118317829e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6099818989e+023.1951160576e+00 + 0.0000000000e+000.0000000000e+006.7596312512e-026.3435784053e+023.7243693208e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5446122616e+023.1376649579e+00 + 0.0000000000e+000.0000000000e+009.7245621781e-026.3245315556e+023.7072100074e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5203125063e+023.1132856512e+00 + 0.0000000000e+000.0000000000e+001.0551111111e-016.5062395556e+023.8118222222e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6061635556e+023.1915111111e+00 + 0.0000000000e+000.0000000000e+008.1260927152e-028.6954266814e+025.1690693157e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8784822163e+024.3531061074e+00 + 0.0000000000e+000.0000000000e+009.1961295070e-021.2162158874e+037.2853084621e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.8575193392e+026.1633383370e+00 + 0.0000000000e+000.0000000000e+008.8340568475e-021.1624124396e+036.9998397195e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.5958031443e+025.9303629384e+00 + 0.0000000000e+000.0000000000e+007.6879013483e-028.4612176167e+025.1764482893e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9304722330e+024.3939530132e+00 + 0.0000000000e+000.0000000000e+008.2948294829e-026.8785907591e+024.2465346535e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1047799780e+023.6290429043e+00 + 0.0000000000e+000.0000000000e+009.1782178218e-026.9052650165e+024.2297469747e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1010809681e+023.6234983498e+00 + 0.0000000000e+000.0000000000e+009.7885617509e-026.7963253691e+024.1775192519e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0349039807e+023.5604135545e+00 + 0.0000000000e+000.0000000000e+008.1025273580e-026.7477360170e+024.1660891089e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0228612559e+023.5501585027e+00 + 0.0000000000e+000.0000000000e+009.0792079208e-026.9222194719e+024.2508910891e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1110554455e+023.6307590759e+00 + 0.0000000000e+000.0000000000e+009.6274752475e-026.9508563531e+024.2780198020e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1333811056e+023.6473061056e+00 + 0.0000000000e+000.0000000000e+008.0589933993e-026.9416956821e+024.2658965897e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1313249450e+023.6488105061e+00 + 0.0000000000e+000.0000000000e+009.6171617162e-027.0040124312e+024.3071177118e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1676543454e+023.6807700770e+00 + 0.0000000000e+000.0000000000e+009.9663887441e-027.0165791674e+024.3097927161e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1753869376e+023.6918009959e+00 + 0.0000000000e+000.0000000000e+008.1227201668e-026.8540206126e+024.2053007932e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0865285739e+023.6092221064e+00 + 0.0000000000e+000.0000000000e+007.9207920792e-026.9375490649e+024.2727392739e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1129779978e+023.6372387239e+00 + 0.0000000000e+000.0000000000e+008.6341193330e-027.0316476471e+024.3280344942e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1592504458e+023.6789558364e+00 + 0.0000000000e+000.0000000000e+009.8114252215e-026.9789654442e+024.2881481240e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1399055498e+023.6595590151e+00 + 0.0000000000e+000.0000000000e+008.6237623762e-026.9955432343e+024.3052475248e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1512000000e+023.6730693069e+00 + 0.0000000000e+000.0000000000e+008.8345492444e-026.9353437337e+024.2632490881e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1127023450e+023.6405953622e+00 + 0.0000000000e+000.0000000000e+001.0401974408e-016.9849560463e+024.2875759944e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1359453998e+023.6543331307e+00 + 0.0000000000e+000.0000000000e+008.0814081408e-026.9994264026e+024.3171507151e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1639442244e+023.6685918592e+00 + 0.0000000000e+000.0000000000e+008.0714420126e-026.9459298318e+024.2937820624e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1207171740e+023.6335443084e+00 + 0.0000000000e+000.0000000000e+009.3928044120e-027.1124013013e+024.3888802038e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2012492726e+023.7143654826e+00 + 0.0000000000e+000.0000000000e+008.6897689769e-027.0644167217e+024.3519471947e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1893443344e+023.6999559956e+00 + 0.0000000000e+000.0000000000e+007.9854090672e-026.9649771525e+024.2895234787e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1299820508e+023.6473232586e+00 + 0.0000000000e+000.0000000000e+008.7571651902e-026.9657550808e+024.2903335070e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1404673441e+023.6596404377e+00 + 0.0000000000e+000.0000000000e+001.0326732673e-016.9851785479e+024.3100660066e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1296122112e+023.6584818482e+00 + 0.0000000000e+000.0000000000e+007.7976810839e-027.0111806258e+024.3250171530e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1680368920e+023.6788733281e+00 + 0.0000000000e+000.0000000000e+007.8458832725e-026.9604377461e+024.3082171704e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1481863203e+023.6615117104e+00 + 0.0000000000e+000.0000000000e+001.0425742574e-016.8617420242e+024.2072497250e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0871580858e+023.6113201320e+00 + 0.0000000000e+000.0000000000e+007.9691969197e-026.9972017602e+024.3136193619e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1705826183e+023.6869526953e+00 + 0.0000000000e+000.0000000000e+008.2021596897e-027.0551720880e+024.3372295322e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1802015941e+023.6944040588e+00 + 0.0000000000e+000.0000000000e+008.2642869550e-027.0465237316e+024.3607682676e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2011223883e+023.7203154131e+00 + 0.0000000000e+000.0000000000e+001.0479647965e-017.0160017602e+024.3520132013e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1825590759e+023.6982398240e+00 + 0.0000000000e+000.0000000000e+007.3262405188e-027.0328227538e+024.3441373907e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1857784042e+023.7129688857e+00 + 0.0000000000e+000.0000000000e+008.1644085461e-027.0194557940e+024.3517812011e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1893769313e+023.7131367249e+00 + 0.0000000000e+000.0000000000e+001.0679867987e-017.4815709571e+024.6183498350e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4362574257e+023.9404620462e+00 + 0.0000000000e+000.0000000000e+008.2258989057e-021.2588643424e+037.7001211569e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.3562722219e+026.6319056149e+00 + 0.0000000000e+000.0000000000e+008.0084245267e-021.2343339304e+037.5835642117e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.2807469201e+026.5753771134e+00 + 0.0000000000e+000.0000000000e+009.8239823982e-021.1209866667e+036.8799339934e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.5786121012e+025.9152915292e+00 + 0.0000000000e+000.0000000000e+008.1774614961e-027.0438372311e+024.3592101282e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2075175138e+023.7127853048e+00 + 0.0000000000e+000.0000000000e+006.2581820682e-027.0374572683e+024.3423410269e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1907835863e+023.7083478085e+00 + 0.0000000000e+000.0000000000e+006.6622662266e-026.8354411441e+024.2158415842e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0798930693e+023.6176897690e+00 + 0.0000000000e+000.0000000000e+001.0047451291e-016.9864084144e+024.3080632998e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1542160582e+023.6721840622e+00 + 0.0000000000e+000.0000000000e+001.0047451291e-016.9864084144e+024.3080632998e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1542160582e+023.6721840622e+00 + 0.0000000000e+000.0000000000e+007.9303999479e-027.0088816311e+024.3330263158e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1904827351e+023.7060829208e+00 + 0.0000000000e+000.0000000000e+001.1155115512e-017.1292983498e+024.3689108911e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2452574257e+023.7612541254e+00 + 0.0000000000e+000.0000000000e+007.3563705055e-026.9371054358e+024.2791154247e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1434782602e+023.6706015503e+00 + 0.0000000000e+000.0000000000e+008.2068858202e-026.9447601308e+024.2771882057e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1358767453e+023.6446129712e+00 + 0.0000000000e+000.0000000000e+009.5005500550e-026.9699678768e+024.2803520352e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1455493949e+023.6623102310e+00 + 0.0000000000e+000.0000000000e+009.2333535985e-026.9660802161e+024.2827448469e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1528653071e+023.6736469732e+00 + 0.0000000000e+000.0000000000e+008.3244021771e-027.0673382657e+024.3507975074e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1874623057e+023.7007754690e+00 + 0.0000000000e+000.0000000000e+007.6940305326e-024.4760573607e+022.7686098045e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7262649452e+022.3599938599e+00 + 0.0000000000e+000.0000000000e+001.0028767244e-018.2916471255e+015.3091263119e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.2883132714e+014.4500308024e-01 + 0.0000000000e+000.0000000000e+008.4950422800e-024.8454636165e+013.1947496571e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3193666843e+012.6301463848e-01 + 0.0000000000e+000.0000000000e+008.0066445183e-024.7907973422e+013.2491694352e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3069767442e+012.6245847176e-01 + 0.0000000000e+000.0000000000e+001.0654485050e-014.9465780731e+013.2260243632e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3417275748e+012.6543743079e-01 + 0.0000000000e+000.0000000000e+001.0400546327e-011.2761727959e+021.1927298634e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2415165921e+021.1420388335e+00 + 0.0000000000e+000.0000000000e+008.2488888889e-025.9805200000e+014.3311111111e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4509288889e+013.8013333333e-01 + 0.0000000000e+000.0000000000e+007.3610596026e-024.8486999853e+013.2213156733e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4454423547e+012.6911376012e-01 + 0.0000000000e+000.0000000000e+001.0841110940e-014.9411140716e+013.1035525438e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3121516505e+012.6016479285e-01 + 0.0000000000e+000.0000000000e+008.6544850498e-024.9059634551e+013.2364341085e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4051827243e+012.6500553710e-01 + 0.0000000000e+000.0000000000e+008.0132890365e-024.8092890365e+013.2265780731e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4444518272e+012.7747508306e-01 + 0.0000000000e+000.0000000000e+001.2087833149e-015.1055878959e+013.2320084902e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4424281100e+012.7696304910e-01 + 0.0000000000e+000.0000000000e+008.5755555556e-025.0706844444e+013.2917777778e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4966044444e+012.7666666667e-01 + 0.0000000000e+000.0000000000e+007.1029457364e-024.8631894537e+013.3486389812e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4615067590e+012.7877338501e-01 + 0.0000000000e+000.0000000000e+009.0077519380e-025.1149568106e+013.5005537099e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5251162791e+012.8777408638e-01 + 0.0000000000e+000.0000000000e+008.1693023256e-025.0216626246e+013.4738073090e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5570680731e+012.8987475083e-01 + 0.0000000000e+000.0000000000e+007.9768770764e-025.2080339424e+013.7456832780e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7971689147e+013.1517508306e-01 + 0.0000000000e+000.0000000000e+006.8217054264e-025.4666223699e+014.0753045404e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1533111849e+013.3621262458e-01 + 0.0000000000e+000.0000000000e+001.0404750831e-015.6294392433e+013.8724566261e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8846710114e+013.1970118125e-01 + 0.0000000000e+000.0000000000e+006.9169746975e-025.3050485039e+013.7720737074e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8283412871e+013.0826127613e-01 + 0.0000000000e+000.0000000000e+008.5236523652e-025.2502134213e+013.7342134213e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5778701870e+012.9284928493e-01 + 0.0000000000e+000.0000000000e+008.9108910891e-025.0906831683e+013.5623762376e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5266336634e+012.9042904290e-01 + 0.0000000000e+000.0000000000e+008.0640958833e-025.0806255790e+013.6313220138e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5773712075e+012.9785659487e-01 + 0.0000000000e+000.0000000000e+006.8335938857e-025.0904514287e+013.6882599444e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5444956792e+012.9203339413e-01 + 0.0000000000e+000.0000000000e+006.0660066007e-025.1936006601e+013.6963696370e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6745280528e+013.0112211221e-01 + 0.0000000000e+000.0000000000e+008.5565398645e-025.0790246656e+013.5024318221e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5811889873e+012.9493659892e-01 + 0.0000000000e+000.0000000000e+007.6766834578e-025.0037619130e+013.4629147125e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5381168433e+012.9092698744e-01 + 0.0000000000e+000.0000000000e+006.2354235424e-025.0642541254e+013.6447744774e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6226468647e+012.9299229923e-01 + 0.0000000000e+000.0000000000e+009.7085070349e-024.9857449265e+013.3591967749e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3834358535e+012.7029123965e-01 + 0.0000000000e+000.0000000000e+007.4015039662e-024.8567776258e+013.3392630710e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3658699771e+012.7127091657e-01 + 0.0000000000e+000.0000000000e+007.4972497250e-025.1195478548e+013.4399339934e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5351353135e+012.7883388339e-01 + 0.0000000000e+000.0000000000e+007.9016849053e-024.8600407475e+013.2640046899e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3423784813e+012.6296537548e-01 + 0.0000000000e+000.0000000000e+008.8639916623e-025.0216765242e+013.4122329338e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4393299896e+012.8095101615e-01 + 0.0000000000e+000.0000000000e+007.1320132013e-024.8085280528e+013.3343234323e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3172970297e+012.6465346535e-01 + 0.0000000000e+000.0000000000e+007.4075039083e-024.8023107738e+013.3519085461e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2834585070e+012.6044815008e-01 + 0.0000000000e+000.0000000000e+009.0457414162e-024.9705748147e+013.3958362284e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2923159704e+012.6148804354e-01 + 0.0000000000e+000.0000000000e+008.4543454345e-027.8441199120e+015.0295929593e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8683575358e+014.0588558856e-01 + 0.0000000000e+000.0000000000e+006.8069306931e-024.3960189045e+022.5971281339e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5033797985e+022.1693807539e+00 + 0.0000000000e+000.0000000000e+009.2821782178e-022.5902242198e+021.5560071797e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5372659661e+021.2850416884e+00 + 0.0000000000e+000.0000000000e+007.7062706271e-025.5640473047e+013.8371837184e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6643586359e+012.9839383938e-01 + 0.0000000000e+000.0000000000e+007.1782178218e-024.7171995325e+013.2759900990e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2311461771e+012.5601622662e-01 + 0.0000000000e+000.0000000000e+006.8877887789e-024.6737718647e+013.1893564356e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1821860561e+012.4971534653e-01 + 0.0000000000e+000.0000000000e+009.0891089109e-025.0876996700e+013.3495049505e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3812409241e+012.6363036304e-01 + 0.0000000000e+000.0000000000e+008.1064356436e-024.9496315355e+013.3598228244e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3471936338e+012.6351832552e-01 + 0.0000000000e+000.0000000000e+007.4238173817e-024.7719669243e+013.2958427422e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1956105466e+012.5126715303e-01 + 0.0000000000e+000.0000000000e+008.2508250825e-023.7517624862e+023.1886248625e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1837793619e+034.1947414741e+00 + 0.0000000000e+000.0000000000e+003.7617610445e-023.3023974155e+034.5913238232e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.2341046375e+046.1937741373e+01 + 0.0000000000e+000.0000000000e+001.4692982456e-033.7249215834e+035.0663593451e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0194469089e+056.8574964898e+01 + 0.0000000000e+000.0000000000e+005.5813953488e-031.2564181707e+036.1206140149e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8837151452e+035.8843144780e+00 + 0.0000000000e+000.0000000000e+002.5027685493e-021.0575074197e+037.0325027685e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.2274040975e+037.5262458472e+00 + 0.0000000000e+000.0000000000e+003.3202789818e-037.0257644496e+022.1011847924e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5447899936e+032.1779694616e+00 + 0.0000000000e+000.0000000000e+006.1924563449e-031.2000875991e+026.6336670260e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1775242056e+024.8042477980e-01 + 0.0000000000e+000.0000000000e+001.8803986711e-029.1150797342e+017.0385382060e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.7405116279e+014.8029900332e-01 + 0.0000000000e+000.0000000000e+001.1626073500e-022.7836441626e+021.8184748410e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7977705478e+021.4279517136e+00 + 0.0000000000e+000.0000000000e+003.8445798772e-036.3769632571e+024.0459105410e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5393270159e+023.2813949088e+00 + 0.0000000000e+000.0000000000e+001.1849390919e-027.6811902547e+024.9182834994e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8604950166e+023.9533222591e+00 + 0.0000000000e+000.0000000000e+003.4769605363e-025.9150654727e+023.5883004408e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4878115216e+022.9430532515e+00 + 0.0000000000e+000.0000000000e+007.1130081480e-035.5379524675e+023.3342134020e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0895966733e+022.7193830719e+00 + 0.0000000000e+000.0000000000e+007.6633444075e-026.5865595792e+023.6499335548e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2313141750e+022.9777408638e+00 + 0.0000000000e+000.0000000000e+004.1598864711e-011.1448390161e+034.9229612110e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2212983633e+034.0528098392e+00 + 0.0000000000e+000.0000000000e+005.0788761523e-028.0083247893e+024.8574706827e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0420798538e+034.4076331287e+00 + 0.0000000000e+000.0000000000e+003.7840531561e-023.1786076412e+021.8835880399e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.9735418605e+021.4643853821e+00 + 0.0000000000e+000.0000000000e+005.6138918836e-026.6184602847e+023.0932900633e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2450955187e+032.4648026813e+00 + 0.0000000000e+000.0000000000e+001.2136938681e-014.7615250974e+022.3721141449e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5713499963e+032.0067809289e+00 + 0.0000000000e+000.0000000000e+001.0559246955e-011.6161351606e+037.2128460687e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8623971761e+036.9145625692e+00 + 0.0000000000e+000.0000000000e+007.1205914061e-024.7708361004e+023.1533400072e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1962199800e+033.6768904975e+00 + 0.0000000000e+000.0000000000e+002.2786385338e-011.5780004653e+037.0341350759e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2431904851e+036.6883033010e+00 + 0.0000000000e+000.0000000000e+001.3026578073e-011.0713797231e+034.0552934662e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4367114064e+033.9510077519e+00 + + + + AVERAGE + 12 + + + 5.0000000000e-01 + + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 7.0563861203e-02 + 1.2136938681e-01 + 5.3492801772e-01 + 0 + + + 5.8173492617e+02 + 4.7615250974e+02 + 4.7425989590e+03 + 0 + + + 3.2656995201e+00 + 2.3721141449e+00 + 2.1455614618e+01 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + NaN + NaN + NaN + 4 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 7.2876787745e+02 + 1.5713499963e+03 + 1.4738519048e+04 + 0 + + + 2.6816297527e+00 + 2.0067809289e+00 + 2.1230764120e+01 + 0 + + + + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + 0.0000000000e+000.0000000000e+007.2922888263e-022.1443716494e+042.4740844887e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4007093389e+042.0825713626e+01 + 0.0000000000e+000.0000000000e+009.3530169242e-021.9678322461e+041.7946092715e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0647587776e+031.3358601913e+01 + 0.0000000000e+000.0000000000e+001.2748935667e-011.2832798337e+041.5074964391e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.6415497578e+031.2929135919e+01 + 0.0000000000e+000.0000000000e+001.3679955703e-011.0965707226e+042.2835624769e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4320463109e+042.2785868402e+01 + 0.0000000000e+000.0000000000e+001.7983607082e-011.8203379411e+031.3896913211e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6287332116e+031.1968437481e+01 + 0.0000000000e+000.0000000000e+001.9287128713e-018.2194138339e+028.9602429410e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2072727824e+035.1623093143e+00 + 0.0000000000e+000.0000000000e+002.1819856986e-014.2722862761e+022.1780060506e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7783975578e+032.0326815182e+00 + 0.0000000000e+000.0000000000e+001.5492115878e-014.3232146315e+029.8844426109e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1654711404e+027.3449486615e-01 + 0.0000000000e+000.0000000000e+009.6486065273e-025.8586014851e+013.2805738907e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.4403772461e+012.8016409974e-01 + 0.0000000000e+000.0000000000e+009.5831499817e-025.8287502750e+013.2469746975e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.4491896773e+012.7047579758e-01 + 0.0000000000e+000.0000000000e+001.0135221856e-015.8892356986e+013.3173083975e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.0874019985e+012.7623303997e-01 + 0.0000000000e+000.0000000000e+001.0096259626e-018.0628464980e+024.6956618995e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7174912541e+024.0267656766e+00 + 0.0000000000e+000.0000000000e+001.0332874954e-019.3451363953e+025.3624917492e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3276302072e+024.5645370370e+00 + 0.0000000000e+000.0000000000e+009.4011722364e-027.7535108836e+014.4234917200e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.3376163457e+013.7312974013e-01 + 0.0000000000e+000.0000000000e+009.8053715968e-026.5414101361e+013.9193340692e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3611011038e+023.4795253863e-01 + 0.0000000000e+000.0000000000e+009.5547277410e-025.8549402134e+013.3627851361e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.1967346394e+012.7876287712e-01 + 0.0000000000e+000.0000000000e+009.7126759872e-025.9353283947e+013.3779451803e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.5689925822e+012.7682240005e-01 + 0.0000000000e+000.0000000000e+001.1001759259e-019.1805174074e+013.7376666667e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.7214646296e+013.0585277778e-01 + 0.0000000000e+000.0000000000e+001.7893810447e-017.1035863990e+013.7523471761e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3582306349e+023.6817393257e-01 + 0.0000000000e+000.0000000000e+001.5977022887e-012.6548448045e+021.2936578750e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.4889731151e+021.2528223637e+00 + 0.0000000000e+000.0000000000e+001.8084605263e-011.1311395449e+036.3119218811e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.3671169106e+036.7057353314e+00 + 0.0000000000e+000.0000000000e+003.1406129977e-011.3522297831e+035.3781046866e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1898283165e+035.2589649436e+00 + 0.0000000000e+000.0000000000e+002.6531444811e-011.2424807967e+035.3564191419e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3686643381e+035.0866620829e+00 + 0.0000000000e+000.0000000000e+002.6424459113e-011.8891626128e+036.6125925926e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.1860137175e+037.3110478548e+00 + 0.0000000000e+000.0000000000e+002.0247801601e-011.8177789458e+038.4039461104e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7997090375e+039.1568607341e+00 + 0.0000000000e+000.0000000000e+008.5509699425e-027.3662756502e+023.3356165959e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0616618087e+033.6035866440e+00 + 0.0000000000e+000.0000000000e+001.3044546841e-011.7588707306e+031.3217684823e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6264997498e+041.5774489850e+01 + 0.0000000000e+000.0000000000e+001.3153931340e-012.7312093675e+032.1472323428e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0057209645e+042.9612565522e+01 + 0.0000000000e+000.0000000000e+001.4664082687e-011.1360878741e+035.8738421312e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3414503255e+036.5027759321e+00 + 0.0000000000e+000.0000000000e+009.8516057586e-025.1199089147e+013.1159929863e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5142388335e+012.7618955334e-01 + 0.0000000000e+000.0000000000e+009.5896279632e-028.9549233136e+013.5833677721e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1898214585e+013.0936416874e-01 + 0.0000000000e+000.0000000000e+009.4162987491e-025.0923879691e+012.9695088300e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4463964312e+012.5526582046e-01 + 0.0000000000e+000.0000000000e+009.4226447163e-021.8754607137e+021.1431942519e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2240638238e+029.8165369482e-01 + 0.0000000000e+000.0000000000e+009.8434516781e-027.1275374467e+024.3623613036e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2230937277e+023.7351684170e+00 + 0.0000000000e+000.0000000000e+009.8706769684e-027.2323422737e+024.4308351729e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2881904617e+023.7985191317e+00 + 0.0000000000e+000.0000000000e+009.4252216673e-028.2930706303e+025.1286695257e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9205468275e+024.4006286196e+00 + 0.0000000000e+000.0000000000e+009.5496679574e-023.5475416398e+022.1773321300e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1721326151e+021.8566552288e+00 + 0.0000000000e+000.0000000000e+009.7263612951e-027.9976510302e+013.3205206034e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7800365158e+012.7279893304e-01 + 0.0000000000e+000.0000000000e+009.2709438003e-024.8788242295e+013.0381256127e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2653834575e+012.5000227962e-01 + 0.0000000000e+000.0000000000e+009.5377445552e-021.1098413529e+026.7930324843e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.8481337209e+015.7618032484e-01 + 0.0000000000e+000.0000000000e+009.2900513750e-026.2172730856e+023.8073551370e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7161233817e+023.2338591354e+00 + 0.0000000000e+000.0000000000e+008.5533941915e-024.9723555207e+013.1450053973e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3758540454e+012.5718232198e-01 + 0.0000000000e+000.0000000000e+008.7694996321e-025.3302534952e+013.3170069904e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5085248344e+012.7369757174e-01 + 0.0000000000e+000.0000000000e+008.8082550439e-025.0070816068e+013.1400758815e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3157162830e+012.5306900716e-01 + 0.0000000000e+000.0000000000e+001.3762569214e-011.3708683511e+037.8197087486e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5681045249e+039.2159246955e+00 + 0.0000000000e+000.0000000000e+007.5323551126e-021.9506108677e+037.1228361019e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.3378762800e+037.9217488003e+00 + 0.0000000000e+000.0000000000e+005.9706902916e-021.5020538047e+031.5611663714e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.9555557502e+042.7737191768e+01 + 0.0000000000e+000.0000000000e+006.8159837578e-029.6118858527e+024.2634357697e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0423669408e+034.6284689922e+00 + 0.0000000000e+000.0000000000e+001.1136766334e-014.1357291011e+032.8118166298e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1664770484e+042.5215691214e+01 + 0.0000000000e+000.0000000000e+005.2554448136e-026.7639716501e+022.3530869324e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3172666602e+032.3720985604e+00 + 0.0000000000e+000.0000000000e+007.7208379476e-021.1789680999e+035.5576614987e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8643357484e+035.8143909192e+00 + 0.0000000000e+000.0000000000e+005.5737356958e-028.6033777778e+024.0965780731e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5632134718e+034.5462043189e+00 + 0.0000000000e+000.0000000000e+002.0240374860e-011.1911635012e+038.8927259637e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4245544478e+041.2013148855e+01 + 0.0000000000e+000.0000000000e+001.8475901398e-012.4695800377e+032.6156621597e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4325302331e+043.6902331678e+01 + 0.0000000000e+000.0000000000e+001.6854137178e-011.0390197677e+031.2403336087e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3774123573e+041.6603476647e+01 + 0.0000000000e+000.0000000000e+001.1828625883e-012.8213270932e+021.8782340017e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3056453603e+032.1242275472e+00 + 0.0000000000e+000.0000000000e+009.4209126923e-021.9525866665e+021.2214586893e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3414432408e+021.0610206993e+00 + 0.0000000000e+000.0000000000e+009.8379475821e-024.8892893134e+012.9558324105e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2842156700e+012.5178755999e-01 + 0.0000000000e+000.0000000000e+009.3984563800e-024.7809110920e+012.9441202473e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2275492506e+012.4812975883e-01 + 0.0000000000e+000.0000000000e+009.5218518519e-024.8368140741e+012.9215648148e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2487918519e+012.4641481481e-01 + 0.0000000000e+000.0000000000e+009.5896585456e-025.1090934016e+013.2958597884e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1658349281e+023.0698458841e-01 + 0.0000000000e+000.0000000000e+009.6731266150e-024.8731006829e+012.9423588040e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2565488188e+012.4861664821e-01 + 0.0000000000e+000.0000000000e+009.4415836102e-024.8570422665e+012.9816537468e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2649344777e+012.4971391657e-01 + 0.0000000000e+000.0000000000e+009.5521053767e-024.8158034638e+012.9971802828e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2246978989e+012.4828358168e-01 + 0.0000000000e+000.0000000000e+009.1789388643e-024.9179554703e+013.0179388498e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2811683768e+012.5026365548e-01 + 0.0000000000e+000.0000000000e+008.7068713450e-024.8639966192e+013.0508406433e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3161400768e+012.5320540936e-01 + 0.0000000000e+000.0000000000e+008.6514071637e-025.9663753655e+013.6284448099e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8474732273e+013.0244791667e-01 + 0.0000000000e+000.0000000000e+008.6749817251e-026.8607693713e+014.1897478070e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4183982091e+013.5409630848e-01 + 0.0000000000e+000.0000000000e+001.6547701892e-016.9020027853e+022.8047598847e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0436175640e+032.7499124526e+00 + 0.0000000000e+000.0000000000e+002.6024556941e-012.1923740261e+031.2791293315e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8001624664e+041.6312654463e+01 + 0.0000000000e+000.0000000000e+002.9694075305e-014.9290452178e+031.5818636028e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8086468036e+041.8698221669e+01 + 0.0000000000e+000.0000000000e+001.8937921241e-014.1039486460e+031.9058769349e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1233233855e+042.6810313335e+01 + 0.0000000000e+000.0000000000e+001.1113573775e-011.6129221458e+031.1838516550e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1922955584e+041.8033686296e+01 + 0.0000000000e+000.0000000000e+005.5302820009e-025.6739960913e+021.9299740685e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.7034871441e+021.8851142928e+00 + 0.0000000000e+000.0000000000e+005.4215452416e-021.6438303613e+039.0515412508e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5953627849e+041.2751510846e+01 + 0.0000000000e+000.0000000000e+001.3086563307e-012.8142397222e+032.6162465855e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0060770211e+043.1499305094e+01 + 0.0000000000e+000.0000000000e+002.3302884828e-013.8979607323e+033.6550331968e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2306479561e+043.9733180639e+01 + 0.0000000000e+000.0000000000e+001.1419983389e-015.3541311971e+021.9652051310e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.8721559016e+021.8132986896e+00 + 0.0000000000e+000.0000000000e+001.0768918420e-011.2177070801e+032.1563482835e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.9233025102e+021.7776762643e+00 + 0.0000000000e+000.0000000000e+009.2482465855e-026.1182153008e+013.4379014396e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0097019195e+012.9231727575e-01 + 0.0000000000e+000.0000000000e+009.7659310760e-025.7177707919e+013.9319540396e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1174142019e+013.4008793964e-01 + 0.0000000000e+000.0000000000e+009.3305739514e-024.9982405261e+013.0798841060e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3469359823e+012.5485099338e-01 + 0.0000000000e+000.0000000000e+009.2172383912e-022.8707889189e+021.7574648784e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7634090387e+021.4936692760e+00 + 0.0000000000e+000.0000000000e+009.6016081871e-021.3263826060e+037.9830994152e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.5005433114e+026.8044773392e+00 + 0.0000000000e+000.0000000000e+009.7021198830e-021.3335151133e+038.0214729532e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.5292956506e+026.8323135965e+00 + 0.0000000000e+000.0000000000e+009.4476555112e-021.2266369758e+037.3656404040e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.9290145919e+026.2743901989e+00 + 0.0000000000e+000.0000000000e+009.3744957829e-025.3984363770e+023.2187935460e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1205567473e+022.7033855886e+00 + 0.0000000000e+000.0000000000e+009.1509900990e-028.0952011551e+024.8596424642e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6846715897e+024.1110524386e+00 + 0.0000000000e+000.0000000000e+009.3678588789e-026.9399355626e+024.1648389216e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0448704437e+023.5226091003e+00 + 0.0000000000e+000.0000000000e+008.5166020672e-024.8682481097e+013.0958208133e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3091438424e+012.5242963271e-01 + 0.0000000000e+000.0000000000e+008.6128837719e-027.9398579983e+014.8971804337e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9663558382e+014.0606999269e-01 + 0.0000000000e+000.0000000000e+008.3720830055e-029.9154646746e+016.1100626141e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.1847110060e+015.0980140820e-01 + 0.0000000000e+000.0000000000e+002.6244924326e-013.8355844269e+039.2709662237e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3862017761e+041.2339876338e+01 + 0.0000000000e+000.0000000000e+002.2916405193e-012.8066827834e+031.7730957620e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3405797014e+042.6936126335e+01 + 0.0000000000e+000.0000000000e+002.1031028222e-011.4352831181e+031.1995815115e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3654670463e+041.7969149260e+01 + 0.0000000000e+000.0000000000e+002.5684166667e-019.0894952037e+023.5572555556e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.2474021343e+033.3614194444e+00 + 0.0000000000e+000.0000000000e+002.6648906423e-019.4903839689e+023.1949055925e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4377143834e+032.8110316076e+00 + 0.0000000000e+000.0000000000e+001.6185815799e-017.0119828830e+023.8709138520e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2781102926e+033.4716674665e+00 + 0.0000000000e+000.0000000000e+001.2306063123e-014.0487873551e+022.4635388981e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0841114433e+032.5053904885e+00 + 0.0000000000e+000.0000000000e+001.1930873071e-012.7195678649e+021.5569527135e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9927266646e+021.2189837323e+00 + 0.0000000000e+000.0000000000e+001.0074101818e-015.2594323458e+025.2035252012e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0384125410e+047.9921138397e+00 + 0.0000000000e+000.0000000000e+004.0789473684e-022.6218911915e+021.5719627193e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5731895468e+021.3080994152e+00 + 0.0000000000e+000.0000000000e+004.1100146199e-024.1977762427e+022.6222843567e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5955999269e+022.2282967836e+00 + 0.0000000000e+000.0000000000e+003.7529239766e-022.3501752558e+021.5022112573e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5299967105e+021.2679385965e+00 + 0.0000000000e+000.0000000000e+004.7580312856e-025.6598036388e+014.2961859234e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2597006157e+013.6000992753e-01 + 0.0000000000e+000.0000000000e+003.6055188852e-025.7429677301e+013.9028327833e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8964456362e+013.1196736340e-01 + 0.0000000000e+000.0000000000e+004.2529702970e-024.9231316282e+013.5138687202e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0590572754e+022.9807022369e-01 + 0.0000000000e+000.0000000000e+004.0608360836e-024.6872140814e+013.2207480748e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8528528053e+012.6267051705e-01 + 0.0000000000e+000.0000000000e+003.7570815029e-024.6044245131e+013.1192703211e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2634335818e+012.4972462644e-01 + 0.0000000000e+000.0000000000e+004.1126747609e-024.6442438374e+013.1495309051e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2854912620e+012.4985835173e-01 + 0.0000000000e+000.0000000000e+004.4234312776e-027.0628484438e+024.1482695070e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.9097643521e+023.4659663276e+00 + 0.0000000000e+000.0000000000e+004.1079734219e-027.3918263935e+024.2179789590e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0549583979e+023.5248200443e+00 + 0.0000000000e+000.0000000000e+003.8154103605e-024.8711314175e+013.4653549280e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4959361468e+012.7679161437e-01 + 0.0000000000e+000.0000000000e+003.7540740741e-022.6002917593e+021.5534870370e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5576217222e+021.3003851852e+00 + 0.0000000000e+000.0000000000e+003.8916666667e-023.7601439074e+022.2365925926e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1582552870e+021.8453064815e+00 + 0.0000000000e+000.0000000000e+004.1112926049e-023.0486450269e+021.8274343423e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7687035547e+021.4895423742e+00 + 0.0000000000e+000.0000000000e+004.4506518395e-026.4463338972e+015.2707862065e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8912812416e+025.7130299619e-01 + 0.0000000000e+000.0000000000e+004.0862862120e-024.6426153896e+013.1593217822e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2682619169e+012.5001945361e-01 + 0.0000000000e+000.0000000000e+003.6323799047e-024.6284296846e+013.2448661533e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2863731206e+012.5240007334e-01 + 0.0000000000e+000.0000000000e+005.0032771095e-025.0446679246e+013.4883232731e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6285456690e+012.7744642090e-01 + 0.0000000000e+000.0000000000e+008.1712353801e-024.1369955359e+033.5554724050e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3637574013e+022.0985846126e+00 + 0.0000000000e+000.0000000000e+004.2502741228e-028.1147580464e+039.3947908443e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7515420382e+051.1696025311e+02 + 0.0000000000e+000.0000000000e+004.4046966374e-026.4918810462e+031.0007674708e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9026504747e+051.2596138615e+02 + 0.0000000000e+000.0000000000e+004.1305823303e-025.5723012600e+037.5430537536e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4362414586e+059.5639691537e+01 + 0.0000000000e+000.0000000000e+003.7883905500e-026.5514970764e+039.5816408269e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8138483604e+051.2008443798e+02 + 0.0000000000e+000.0000000000e+004.2955482702e-021.7292736580e+031.8088648400e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3201566954e+042.2658456883e+01 + 0.0000000000e+000.0000000000e+003.7963879721e-021.9387905666e+022.4657159883e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1573715227e+033.0215814081e+00 + 0.0000000000e+000.0000000000e+004.1547378071e-029.9030393216e+016.4262002200e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.1147941144e+015.3392570590e-01 + 0.0000000000e+000.0000000000e+004.4462015504e-025.9617496641e+014.5738528362e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6308711640e+014.0287155162e-01 + 0.0000000000e+000.0000000000e+004.0891472868e-021.3119279716e+028.3249723145e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.0791172942e+017.1092284976e-01 + 0.0000000000e+000.0000000000e+003.8301956441e-028.2844437984e+013.8085917313e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7402713178e+013.1298357327e-01 + 0.0000000000e+000.0000000000e+004.0977888520e-025.0646012661e+013.6627868217e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6321739276e+012.9367572905e-01 + 0.0000000000e+000.0000000000e+003.8213695090e-028.9698360724e+016.0221707272e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.8622084090e+014.9469359542e-01 + 0.0000000000e+000.0000000000e+004.3095564169e-027.2653922610e+015.1206255691e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3417669369e+024.4719344161e-01 + 0.0000000000e+000.0000000000e+004.2466451335e-021.4340962370e+038.7587034084e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.4067463706e+027.4993569460e+00 + 0.0000000000e+000.0000000000e+004.0392211148e-021.6508705795e+031.0062402178e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5595546881e+028.6132825766e+00 + 0.0000000000e+000.0000000000e+003.7989283978e-021.6486880334e+031.0039142892e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5505951657e+028.6053111192e+00 + 0.0000000000e+000.0000000000e+004.0576640997e-021.6469343757e+031.0070114595e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5818946095e+028.6273276494e+00 + 0.0000000000e+000.0000000000e+003.9083241657e-021.5757742373e+039.6270141181e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.1440584158e+028.2174440777e+00 + 0.0000000000e+000.0000000000e+004.1618995233e-022.0870040246e+021.3089108911e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3536944169e+021.0994059406e+00 + 0.0000000000e+000.0000000000e+004.5594976164e-021.8074507151e+021.1335716905e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1753397140e+029.5484506784e-01 + 0.0000000000e+000.0000000000e+004.1488366276e-029.2478648152e+025.5595101930e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3823524034e+024.7308369366e+00 + 0.0000000000e+000.0000000000e+003.8524468341e-028.3311262830e+025.1310765323e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0283911793e+024.3728365141e+00 + 0.0000000000e+000.0000000000e+003.8806380638e-028.4326990466e+025.1971186285e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1156516868e+024.4424064906e+00 + 0.0000000000e+000.0000000000e+009.3902640264e-021.8146044921e+021.1350925926e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1921433168e+029.3225155849e-01 + 0.0000000000e+000.0000000000e+003.9243381005e-025.4743164210e+013.5866079941e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0004336634e+012.9445067840e-01 + 0.0000000000e+000.0000000000e+004.3274061769e-024.7081732952e+013.1148511136e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3285515135e+012.5337030885e-01 + 0.0000000000e+000.0000000000e+003.7586747877e-024.6005137505e+013.1148301956e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2725922850e+012.5339239572e-01 + 0.0000000000e+000.0000000000e+004.1122185308e-024.7262028424e+013.1445828719e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3685389443e+012.5751661130e-01 + 0.0000000000e+000.0000000000e+003.7833549072e-024.2942962821e+022.5249499003e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4471146212e+022.1125410790e+00 + 0.0000000000e+000.0000000000e+004.1292512205e-021.2755463351e+027.6868243640e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.6123630161e+016.5057446175e-01 + 0.0000000000e+000.0000000000e+004.2019195275e-024.6590072905e+013.0280730897e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3389757291e+012.5376061277e-01 + 0.0000000000e+000.0000000000e+005.1010520487e-028.5356422111e+014.2480343300e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.2080691214e+013.6420265781e-01 + 0.0000000000e+000.0000000000e+009.0242709487e-021.2734432401e+027.7126568845e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.4075604005e+016.3493816907e-01 + 0.0000000000e+000.0000000000e+003.2690058480e-024.8393150585e+013.3401315789e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4531074561e+012.7021929825e-01 + 0.0000000000e+000.0000000000e+003.4568713450e-026.4449619883e+014.1875730994e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2514049708e+013.4523391813e-01 + 0.0000000000e+000.0000000000e+003.2185672515e-026.1700614035e+014.0235380117e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1074122807e+013.3184210526e-01 + 0.0000000000e+000.0000000000e+003.6607994133e-024.3858569567e+012.9962499759e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1652628153e+012.4410640187e-01 + 0.0000000000e+000.0000000000e+003.8252658599e-021.8664120462e+021.1426017602e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1795309681e+029.4331224789e-01 + 0.0000000000e+000.0000000000e+003.5492548151e-024.4432981854e+013.0555828155e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2013219646e+012.4469920005e-01 + 0.0000000000e+000.0000000000e+003.4371771614e-024.4354559400e+013.0791714933e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2063129822e+012.4764953482e-01 + 0.0000000000e+000.0000000000e+003.4021372532e-024.4549139236e+013.0944218271e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2695532477e+012.5325436244e-01 + 0.0000000000e+000.0000000000e+003.4548611111e-024.3877704678e+013.0268457602e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1591546053e+012.4365771199e-01 + 0.0000000000e+000.0000000000e+003.4905043860e-024.4211306140e+013.0493567251e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1985177741e+012.4706966374e-01 + 0.0000000000e+000.0000000000e+004.0276851852e-027.5050196296e+015.3623611111e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.2703741667e+014.5130277778e-01 + 0.0000000000e+000.0000000000e+003.2601959518e-024.4485944014e+013.1094282946e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1975803941e+012.4583753230e-01 + 0.0000000000e+000.0000000000e+007.4276485788e-022.9901426726e+022.2078303802e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4376581331e+032.1457622739e+00 + 0.0000000000e+000.0000000000e+008.2826184324e-022.6389005572e+033.1385629568e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8691368832e+044.0758936305e+01 + 0.0000000000e+000.0000000000e+001.4382962963e-017.2382931574e+026.9513203704e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1933777198e+048.9363000000e+00 + 0.0000000000e+000.0000000000e+009.3090740741e-021.0685520639e+034.9557259259e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5008152500e+034.9278537037e+00 + 0.0000000000e+000.0000000000e+004.1275962840e-025.0005811111e+023.0630956380e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8539770152e+022.6498391165e+00 + 0.0000000000e+000.0000000000e+001.0633925668e-012.2288473859e+031.9962545336e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.3707893977e+042.3279880653e+01 + 0.0000000000e+000.0000000000e+008.7915746873e-023.6761168598e+031.4436195732e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.2699199411e+031.3758307579e+01 + 0.0000000000e+000.0000000000e+003.1335540839e-024.4624373620e+013.1155813098e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2599892384e+012.5136405445e-01 + 0.0000000000e+000.0000000000e+003.0817724338e-025.5249246982e+013.7420246224e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8417106013e+013.0600696049e-01 + 0.0000000000e+000.0000000000e+003.0436507937e-024.4134885567e+013.0641472868e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2202231451e+012.4829826504e-01 + 0.0000000000e+000.0000000000e+004.0545404208e-024.2758038852e+022.5619915098e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4680767442e+022.1530592470e+00 + 0.0000000000e+000.0000000000e+002.7243447767e-021.0758266704e+036.2763196752e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8505336379e+025.2621087117e+00 + 0.0000000000e+000.0000000000e+003.0657069029e-027.9418265042e+024.6458684016e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3734724252e+023.8909865264e+00 + 0.0000000000e+000.0000000000e+002.9001476560e-024.8202936047e+022.8446945367e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7331349483e+022.3767211148e+00 + 0.0000000000e+000.0000000000e+003.2168495254e-024.5525532967e+013.1402413833e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2636525862e+012.5205298624e-01 + 0.0000000000e+000.0000000000e+003.1392781970e-026.6138433441e+014.3563256156e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.5198489827e+013.6338167599e-01 + 0.0000000000e+000.0000000000e+003.5993514552e-024.3963444342e+012.9924601353e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1848191321e+012.4486414984e-01 + 0.0000000000e+000.0000000000e+002.9830043860e-024.4495303363e+013.0875913743e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2175537281e+012.4973135965e-01 + 0.0000000000e+000.0000000000e+003.2910888677e-021.2807189341e+027.9726488767e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.5468883904e+016.4935011182e-01 + 0.0000000000e+000.0000000000e+002.8438864097e-028.7573352981e+015.6642246783e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.4622473320e+014.5562340786e-01 + 0.0000000000e+000.0000000000e+003.2512089332e-024.4717634459e+013.1544056848e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1868718008e+012.4611852467e-01 + 0.0000000000e+000.0000000000e+002.7526670358e-026.3140548016e+026.9379573643e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4968179928e+041.0792898640e+01 + 0.0000000000e+000.0000000000e+007.8355481728e-022.5471372176e+032.5228787375e+010.0000000000e+00NaN3.0555555556e-030.0000000000e+005.6400340556e+043.8894390919e+01 + 0.0000000000e+000.0000000000e+002.6052417866e-014.2522357909e+031.8653167220e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2622610681e+042.6585732743e+01 + 0.0000000000e+000.0000000000e+002.4324381691e-011.5670778398e+042.8068421927e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.0142706451e+032.1803376707e+01 + 0.0000000000e+000.0000000000e+001.9656884459e-013.1610869301e+043.4633480066e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2721436801e+042.7289341085e+01 + 0.0000000000e+000.0000000000e+001.8635382060e-015.7922036565e+046.7748075858e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3999990974e+046.1260398671e+01 + 0.0000000000e+000.0000000000e+001.4722960502e-015.6224101667e+046.7337775932e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1673870238e+046.3132661499e+01 + 0.0000000000e+000.0000000000e+001.5015869324e-016.6576443730e+046.9059474997e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7362428808e+045.7764760847e+01 + 0.0000000000e+000.0000000000e+001.9566364829e-016.8238289899e+046.1081319560e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7478640816e+044.5247153885e+01 + 0.0000000000e+000.0000000000e+002.1074738924e-016.9567896307e+046.6094381127e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1464969034e+045.0310219453e+01 + 0.0000000000e+000.0000000000e+007.9155629139e-021.5633454197e+041.4990610584e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2339253852e+031.1171296971e+01 + 0.0000000000e+000.0000000000e+001.1892016188e-026.1216114335e+014.9010317583e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4100343312e+013.8416200658e-01 + 0.0000000000e+000.0000000000e+001.1774282561e-026.6129130795e+015.3261221486e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7650864606e+014.1681475350e-01 + 0.0000000000e+000.0000000000e+001.0911958911e-025.5379076576e+014.6609228742e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1898925895e+013.6457418123e-01 + 0.0000000000e+000.0000000000e+001.1902297896e-025.5568349123e+014.6861345823e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2228892808e+013.7141578688e-01 + 0.0000000000e+000.0000000000e+001.0186111111e-027.1790128333e+024.2734407407e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0006154259e+023.5733453704e+00 + 0.0000000000e+000.0000000000e+001.1681432263e-028.4312118519e+025.0495201827e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7422517922e+024.2467255537e+00 + 0.0000000000e+000.0000000000e+001.0986160330e-025.5089062034e+014.6262611357e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1899667079e+013.6554574259e-01 + 0.0000000000e+000.0000000000e+001.0897222222e-026.1855938889e+015.0241018519e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.5485255556e+013.9874074074e-01 + 0.0000000000e+000.0000000000e+001.0740282362e-025.6226991199e+014.8331224789e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1953297121e+013.6860606894e-01 + 0.0000000000e+000.0000000000e+001.0601393473e-025.4572975798e+014.6742574257e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9932858453e+013.4585716905e-01 + 0.0000000000e+000.0000000000e+001.1482398240e-026.0248644114e+015.2615969930e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6172356069e+014.1029519619e-01 + 0.0000000000e+000.0000000000e+001.2500000000e-025.4094101577e+014.5765768243e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9911515402e+013.4255225523e-01 + 0.0000000000e+000.0000000000e+009.7139985380e-032.0484014366e+031.2480092532e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2224416938e+031.0791629064e+01 + 0.0000000000e+000.0000000000e+001.8790204678e-024.8087900420e+039.0836229898e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4412930994e+037.4424214181e+00 + 0.0000000000e+000.0000000000e+001.1522843567e-016.5552187878e+045.5503937317e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6093454423e+044.1711849415e+01 + 0.0000000000e+000.0000000000e+002.5373413852e-017.1297497018e+047.2877447258e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6288419696e+045.7630416366e+01 + 0.0000000000e+000.0000000000e+001.7845174111e-015.5408549737e+045.9741109345e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.8786437125e+044.7841182306e+01 + 0.0000000000e+000.0000000000e+001.3417314815e-015.6539859262e+046.7408900926e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0817494244e+045.3903131481e+01 + 0.0000000000e+000.0000000000e+003.2934724068e-017.3702266070e+048.1338270460e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.9132126175e+046.9637205223e+01 + 0.0000000000e+000.0000000000e+001.1460225175e-017.1417956564e+047.3738981174e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4072212133e+046.3749916944e+01 + 0.0000000000e+000.0000000000e+001.1833847053e-017.1655726909e+047.4991216885e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.9127938271e+046.3823020426e+01 + 0.0000000000e+000.0000000000e+001.8397972807e-017.1498112257e+048.0901637489e+010.0000000000e+00NaN1.3888888889e-030.0000000000e+004.3362392798e+047.1645312908e+01 + 0.0000000000e+000.0000000000e+001.6982281285e-017.0924034565e+047.9663195829e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1275437155e+046.9537161314e+01 + 0.0000000000e+000.0000000000e+001.2794204504e-016.9026207638e+049.2317290513e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.2437681370e+048.4330584164e+01 + 0.0000000000e+000.0000000000e+001.8620431894e-016.9442480047e+046.8090738280e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1486427636e+045.4543602805e+01 + 0.0000000000e+000.0000000000e+001.1334583292e-012.4483527979e+042.0965165163e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4836246861e+031.5002424984e+01 + 0.0000000000e+000.0000000000e+008.6873878177e-025.6155751630e+013.7803498277e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9090073018e+013.0638738709e-01 + 0.0000000000e+000.0000000000e+008.9400584795e-025.4321790022e+013.7076845760e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0317870066e+013.0617507310e-01 + 0.0000000000e+000.0000000000e+008.7671783626e-025.1987795139e+013.4432017544e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8765862573e+012.8072825292e-01 + 0.0000000000e+000.0000000000e+008.7952302632e-025.2386110197e+013.4621253655e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7033096674e+012.7864857456e-01 + 0.0000000000e+000.0000000000e+008.8774671053e-025.0923384503e+013.2968384503e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5168716192e+012.6349689327e-01 + 0.0000000000e+000.0000000000e+008.9285745614e-025.1731656701e+013.3716661793e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6392378947e+012.7267023635e-01 + 0.0000000000e+000.0000000000e+008.8866666667e-025.5303488889e+013.8117037037e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0944107407e+013.1125185185e-01 + 0.0000000000e+000.0000000000e+008.5088888889e-025.3120690741e+013.5515277778e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9046586111e+012.9058518519e-01 + 0.0000000000e+000.0000000000e+009.0938888889e-026.2622077778e+014.5871759259e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7876423148e+013.9503518519e-01 + 0.0000000000e+000.0000000000e+008.7023148148e-025.6427699074e+013.8340277778e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1491824074e+013.1631018519e-01 + 0.0000000000e+000.0000000000e+007.7487095484e-025.2870908069e+013.6884903716e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7107097576e+013.0402244063e-01 + 0.0000000000e+000.0000000000e+007.6684200812e-021.0765582571e+026.1267748357e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4000502335e+025.0639462461e-01 + 0.0000000000e+000.0000000000e+008.1708977189e-022.6945376269e+033.1616080758e+010.0000000000e+00NaN5.5555555556e-040.0000000000e+005.9516501402e+044.2012741906e+01 + 0.0000000000e+000.0000000000e+002.7707562968e-011.9890350876e+043.3665959366e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3909013703e+043.3244312159e+01 + 0.0000000000e+000.0000000000e+001.5773213338e-016.8458276606e+045.8460779044e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.8837371881e+033.9598493212e+01 + 0.0000000000e+000.0000000000e+003.2287677827e-017.0210733955e+047.4942716348e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0709560206e+046.3247332880e+01 + 0.0000000000e+000.0000000000e+001.9102360957e-017.2366885714e+049.6106826683e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.0070024697e+049.6881417356e+01 + 0.0000000000e+000.0000000000e+001.1775943957e-016.9893622594e+046.5643620860e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.6106216126e+045.0833179766e+01 + 0.0000000000e+000.0000000000e+001.1435676568e-017.0515358358e+047.2148808938e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5870253269e+045.9221801953e+01 + 0.0000000000e+000.0000000000e+001.5957222222e-017.0928217936e+048.6660436111e+010.0000000000e+00NaN1.4500000000e-030.0000000000e+005.3090709014e+047.9048902778e+01 + 0.0000000000e+000.0000000000e+002.0439776670e-015.9327757599e+046.0891804633e+010.0000000000e+00NaN4.2938333333e-010.0000000000e+002.4380028524e+045.0987135253e+01 + 0.0000000000e+000.0000000000e+001.2734772979e-019.6001449428e+022.3283803987e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.4351639812e+022.0119952012e+00 + 0.0000000000e+000.0000000000e+008.8480429433e-026.8938980552e+014.4027237603e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3262735739e+013.5150473114e-01 + 0.0000000000e+000.0000000000e+008.8558145687e-021.8885832657e+021.1620467454e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2285952432e+029.6446056971e-01 + 0.0000000000e+000.0000000000e+008.7911590993e-025.1951555925e+013.6307585825e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5513109081e+012.8814322628e-01 + 0.0000000000e+000.0000000000e+008.8173680325e-022.1267808140e+024.7705980066e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1522906054e+013.6513842746e-01 + 0.0000000000e+000.0000000000e+008.9277879291e-021.6336683518e+029.9849629937e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0391168462e+028.2406148025e-01 + 0.0000000000e+000.0000000000e+008.6665264026e-027.8281524220e+024.7088157591e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4839144448e+023.9867876238e+00 + 0.0000000000e+000.0000000000e+009.0582141547e-026.9627824074e+024.2801677668e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1347760909e+023.6543683535e+00 + 0.0000000000e+000.0000000000e+008.6287828344e-026.9936516069e+024.3110846759e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1524568435e+023.6679137596e+00 + 0.0000000000e+000.0000000000e+008.5098432404e-028.3034473708e+025.1180104414e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9202613080e+024.3848920080e+00 + 0.0000000000e+000.0000000000e+008.8315844568e-025.1898907075e+023.2020094059e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1310765706e+022.7351615295e+00 + 0.0000000000e+000.0000000000e+009.0931044666e-025.6974978175e+014.0932583979e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1914812172e+013.5578505906e-01 + 0.0000000000e+000.0000000000e+007.7489328933e-025.2051465851e+013.6990150348e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6921953236e+013.0270803997e-01 + 0.0000000000e+000.0000000000e+008.1006600660e-021.0224649982e+026.4412357902e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.1581995783e+015.2580033003e-01 + 0.0000000000e+000.0000000000e+004.5714221754e-028.9841739484e+029.7775147108e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7871379338e+041.2671712477e+01 + 0.0000000000e+000.0000000000e+007.0563861203e-025.8173492617e+023.2656995201e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.2876787745e+022.6816297527e+00 + + + + MAX + 12 + + + 5.0000000000e-01 + + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 4.1598864711e-01 + 1.2136938681e-01 + 2.2786385338e-01 + 0 + + + 1.1448390161e+03 + 4.7615250974e+02 + 1.6161351606e+03 + 0 + + + 4.9229612110e+00 + 2.3721141449e+00 + 7.2128460687e+00 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + NaN + NaN + NaN + 4 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 2.0420798538e+03 + 1.5713499963e+03 + 4.8623971761e+03 + 0 + + + 4.4076331287e+00 + 2.0067809289e+00 + 6.9145625692e+00 + 0 + + + + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + 0.0000000000e+000.0000000000e+001.4519959223e-012.3564204053e+043.6670954068e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0963119578e+043.4777385719e+01 + 0.0000000000e+000.0000000000e+002.3174451607e-012.2761469103e+042.0646998893e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1057600443e+031.5977718715e+01 + 0.0000000000e+000.0000000000e+001.7625692137e-011.4656375947e+041.9809302326e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7771820133e+041.9224629014e+01 + 0.0000000000e+000.0000000000e+001.9182724252e-011.3729097657e+043.9860453675e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2754932589e+044.3036850161e+01 + 0.0000000000e+000.0000000000e+003.0497076023e-013.8174923961e+032.6817871627e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8643847766e+042.9615475090e+01 + 0.0000000000e+000.0000000000e+002.4323432343e-013.3033061015e+034.0827346600e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1438458963e+032.4634034002e+01 + 0.0000000000e+000.0000000000e+002.7981573157e-011.3512936964e+038.2668316832e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.7455617492e+038.3482838284e+00 + 0.0000000000e+000.0000000000e+002.8327832783e-013.1478900990e+032.9112211221e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0028272199e+031.9769217547e+00 + 0.0000000000e+000.0000000000e+001.1845915842e-019.6583237761e+014.4305830583e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5302788229e+023.8227103960e-01 + 0.0000000000e+000.0000000000e+001.1023102310e-018.6956590455e+014.0888758613e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5386327131e+023.4997495802e-01 + 0.0000000000e+000.0000000000e+001.1331133113e-017.8073255638e+013.9704801401e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4506438303e+023.5136793614e-01 + 0.0000000000e+000.0000000000e+001.1804180418e-015.0238009235e+032.9014200104e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7033987175e+032.4811417984e+01 + 0.0000000000e+000.0000000000e+001.2374500608e-015.0238009235e+032.9014200104e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7033987175e+032.4811417984e+01 + 0.0000000000e+000.0000000000e+001.2374500608e-012.4579304852e+021.5065727927e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6173572536e+021.2921603485e+00 + 0.0000000000e+000.0000000000e+001.2136441491e-012.4579304852e+021.5065727927e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7943055928e+021.2921603485e+00 + 0.0000000000e+000.0000000000e+001.3557910228e-011.0697142311e+026.0255329916e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7943055928e+027.7566390178e-01 + 0.0000000000e+000.0000000000e+001.2489497847e-011.0055077829e+024.5206666667e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8369748425e+023.9833333333e-01 + 0.0000000000e+000.0000000000e+003.2918888889e-014.2032367870e+026.9318209671e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7731247453e+025.2743396087e-01 + 0.0000000000e+000.0000000000e+003.9410852713e-019.9127125239e+016.2044296788e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.9920572536e+028.0756367663e-01 + 0.0000000000e+000.0000000000e+003.4764119601e-018.9794286122e+024.6932654116e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4304340982e+034.9357105943e+00 + 0.0000000000e+000.0000000000e+006.7474363234e-013.6366420062e+032.8873600662e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.9935946473e+043.2965992494e+01 + 0.0000000000e+000.0000000000e+001.0837468155e+002.4222287991e+039.9617651699e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.9464860039e+031.0701168324e+01 + 0.0000000000e+000.0000000000e+003.1076504690e-011.7649704557e+038.6544795466e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.5127535552e+031.0104826950e+01 + 0.0000000000e+000.0000000000e+003.5317684733e-014.9448428378e+031.1734225166e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0539265471e+041.7043538779e+01 + 0.0000000000e+000.0000000000e+002.4241136901e-014.9448428378e+031.2528599977e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8757718708e+041.5541531266e+01 + 0.0000000000e+000.0000000000e+001.6683190173e-012.0213371964e+031.5511432423e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.8149245105e+042.1585160095e+01 + 0.0000000000e+000.0000000000e+002.0581299577e-014.9746801391e+034.6984389946e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.7718432197e+046.6323041659e+01 + 0.0000000000e+000.0000000000e+002.0615982340e-019.2456076412e+034.4393743079e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.3704504606e+045.9891494100e+01 + 0.0000000000e+000.0000000000e+002.9635460899e-012.8228361868e+032.2723728313e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8378966659e+043.1455448505e+01 + 0.0000000000e+000.0000000000e+001.2839853175e-019.7511998911e+021.0334332211e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5333766943e+038.3649778516e+00 + 0.0000000000e+000.0000000000e+001.1302325581e-014.5043598656e+029.1589587321e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3268200406e+028.2266176762e-01 + 0.0000000000e+000.0000000000e+001.1798955652e-017.8676190476e+013.5579180509e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.3764141750e+013.1745293466e-01 + 0.0000000000e+000.0000000000e+001.2415036706e-016.7962746401e+024.1612403101e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0579579181e+023.5727574751e+00 + 0.0000000000e+000.0000000000e+001.3100467170e-011.0767193252e+036.5978860018e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.3048493102e+025.6053702522e+00 + 0.0000000000e+000.0000000000e+001.2246254208e-017.9473218719e+024.8977043409e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7104815912e+024.1931099426e+00 + 0.0000000000e+000.0000000000e+001.1877846472e-018.9859817752e+025.9409836234e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6714024261e+025.2258022926e+00 + 0.0000000000e+000.0000000000e+001.1166112957e-018.4151645695e+025.1447682119e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9461523179e+024.3945364238e+00 + 0.0000000000e+000.0000000000e+001.1630180487e-013.6960920530e+026.5070640177e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0073328918e+025.1395143488e-01 + 0.0000000000e+000.0000000000e+001.1630180487e-015.6362238308e+013.3518089078e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6912509149e+012.6696691675e-01 + 0.0000000000e+000.0000000000e+001.1851605759e-017.0151238095e+024.2691472868e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1873818383e+023.6392912514e+00 + 0.0000000000e+000.0000000000e+001.1851605759e-019.4972497250e+025.7876787679e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.5664246425e+024.9119911991e+00 + 0.0000000000e+000.0000000000e+001.0475504458e-016.0462806909e+013.5657185455e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2355775578e+013.0602860286e-01 + 0.0000000000e+000.0000000000e+001.0593576966e-017.8052903126e+014.7777184954e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8776822842e+014.0762396134e-01 + 0.0000000000e+000.0000000000e+009.8803876702e-025.4685209713e+013.4370640910e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6683498896e+012.7052980132e-01 + 0.0000000000e+000.0000000000e+003.4883720930e-012.2932442636e+031.8498305648e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4908705880e+042.6405725360e+01 + 0.0000000000e+000.0000000000e+001.1588699919e-015.5698820983e+031.3413654705e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7934752635e+041.5650523054e+01 + 0.0000000000e+000.0000000000e+002.2016611296e-012.3623570127e+032.8618709269e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7379939384e+045.2926790610e+01 + 0.0000000000e+000.0000000000e+001.5146073060e-011.8169296343e+039.3356562012e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.7980196628e+031.0196210754e+01 + 0.0000000000e+000.0000000000e+001.5230504420e-011.0832143674e+045.1373448622e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4069133874e+045.1872471453e+01 + 0.0000000000e+000.0000000000e+009.4595791805e-021.7268677176e+039.4077076412e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5839078915e+041.3522392027e+01 + 0.0000000000e+000.0000000000e+002.3933554817e-013.1918621927e+031.9537674419e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0586961063e+042.1527707641e+01 + 0.0000000000e+000.0000000000e+001.2254955887e-012.1257726106e+031.1330099668e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6941244784e+041.6033488372e+01 + 0.0000000000e+000.0000000000e+003.3940199336e-012.3555622005e+031.7311772868e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7366053003e+042.7610666704e+01 + 0.0000000000e+000.0000000000e+002.3948281299e-015.8341066214e+036.6023244740e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4110933960e+059.4101417497e+01 + 0.0000000000e+000.0000000000e+001.9410299003e-012.3648189276e+033.4074221983e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.9590777902e+044.7057868474e+01 + 0.0000000000e+000.0000000000e+001.7737108828e-011.7835028018e+032.7578095238e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7008144673e+043.8086013289e+01 + 0.0000000000e+000.0000000000e+001.1107419712e-016.6943260244e+024.0414174972e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1459114064e+023.4811960133e+00 + 0.0000000000e+000.0000000000e+001.1165190107e-015.5613202289e+013.1806681432e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8141134367e+012.7746511628e-01 + 0.0000000000e+000.0000000000e+001.1165190107e-015.5613202289e+013.1806681432e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8141134367e+012.7746511628e-01 + 0.0000000000e+000.0000000000e+001.0665960265e-015.3839211921e+013.1626666667e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5558573804e+012.6417777778e-01 + 0.0000000000e+000.0000000000e+001.1777408638e-016.4254651163e+015.4521594684e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.8357641196e+026.9362126246e-01 + 0.0000000000e+000.0000000000e+001.2019449517e-016.4254651163e+015.4521594684e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.8357641196e+026.9362126246e-01 + 0.0000000000e+000.0000000000e+001.1787991463e-015.5442607064e+013.2774525386e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7419957395e+012.7406467991e-01 + 0.0000000000e+000.0000000000e+001.1861572536e-015.0100553710e+013.2684022350e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5005747930e+012.6467604655e-01 + 0.0000000000e+000.0000000000e+001.2053445805e-015.7683828383e+013.5326732673e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6238855886e+012.8448844884e-01 + 0.0000000000e+000.0000000000e+001.0833883388e-015.5905788895e+013.5089108911e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8555115512e+012.9887788779e-01 + 0.0000000000e+000.0000000000e+001.0496800996e-011.4541626476e+028.4881698367e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.2782676416e+017.1629711655e-01 + 0.0000000000e+000.0000000000e+001.0006600660e-011.6635422511e+021.0003650990e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0969928652e+028.5439331104e-01 + 0.0000000000e+000.0000000000e+003.9062912541e-011.6868943674e+035.9115291529e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4275209901e+036.1027722772e+00 + 0.0000000000e+000.0000000000e+008.9232123212e-015.4295224642e+031.7983654102e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7386484848e+043.2595406751e+01 + 0.0000000000e+000.0000000000e+003.4310077519e-018.8638247713e+032.4109683756e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4411397360e+043.5330987425e+01 + 0.0000000000e+000.0000000000e+003.3761904762e-019.8683307973e+032.4988693245e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4250419994e+043.4731849391e+01 + 0.0000000000e+000.0000000000e+001.5796234773e-013.1897356700e+032.5413156146e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9249010532e+043.9666511628e+01 + 0.0000000000e+000.0000000000e+007.1594684385e-021.1358081838e+034.6088372093e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1913467442e+034.7746954596e+00 + 0.0000000000e+000.0000000000e+007.2899936195e-022.9450027158e+032.0976609819e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1736088594e+043.0589811370e+01 + 0.0000000000e+000.0000000000e+003.4101876380e-016.1650841279e+035.3006016390e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.6454814308e+047.0297749080e+01 + 0.0000000000e+000.0000000000e+004.1376364974e-017.6172303654e+038.4868748616e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7050259927e+048.3184613100e+01 + 0.0000000000e+000.0000000000e+002.7193333333e-018.5639873333e+025.1076000000e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0201331333e+035.4404666667e+00 + 0.0000000000e+000.0000000000e+001.2689878184e-018.4626647362e+038.3950729790e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1092032830e+035.9683712071e+00 + 0.0000000000e+000.0000000000e+001.1782945736e-011.3337362126e+026.4739756368e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.8344850498e+028.4784053156e-01 + 0.0000000000e+000.0000000000e+001.4134342479e-011.4445170257e+021.3406587314e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3836000000e+021.2904760438e+00 + 0.0000000000e+000.0000000000e+001.2526721084e-015.6670099668e+013.5119010705e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9241528239e+012.9830564784e-01 + 0.0000000000e+000.0000000000e+001.1446666667e-011.3004826252e+037.8533653234e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.3385795756e+026.6642092236e+00 + 0.0000000000e+000.0000000000e+001.1808494007e-011.3490945985e+038.1312651265e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.6202616062e+026.9160066007e+00 + 0.0000000000e+000.0000000000e+001.1402640264e-011.3495053795e+038.1335973597e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.6275284928e+026.9193949395e+00 + 0.0000000000e+000.0000000000e+001.0705141567e-011.3463538376e+038.1061985409e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.6031542702e+026.9040612877e+00 + 0.0000000000e+000.0000000000e+001.0373747901e-018.2252321232e+024.9302750275e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7487091309e+024.1689768977e+00 + 0.0000000000e+000.0000000000e+001.0966812142e-018.2245659686e+024.9273189161e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7536383370e+024.1682804629e+00 + 0.0000000000e+000.0000000000e+001.2032275925e-018.2170948259e+024.9205934080e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7573914191e+024.1665474640e+00 + 0.0000000000e+000.0000000000e+001.0930232558e-015.4897947388e+013.7864858126e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1081804581e+013.1623158273e-01 + 0.0000000000e+000.0000000000e+001.2106384981e-013.1772362188e+021.9004344886e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9042823109e+021.6116211821e+00 + 0.0000000000e+000.0000000000e+001.1624503311e-015.8278985220e+023.5410558140e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5209575814e+023.0319131783e+00 + 0.0000000000e+000.0000000000e+001.1624584718e+002.2010289285e+043.7876943522e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7461525692e+046.0270143965e+01 + 0.0000000000e+000.0000000000e+001.1624584718e+009.3813722038e+033.7876943522e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7461525692e+046.0270143965e+01 + 0.0000000000e+000.0000000000e+002.7519379845e-012.1532943992e+032.2705333729e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2932422736e+043.6869759008e+01 + 0.0000000000e+000.0000000000e+004.2053973510e-011.5072759325e+036.1638228348e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1702005454e+048.8862462901e+00 + 0.0000000000e+000.0000000000e+005.2744444444e-011.8460953720e+036.0495775563e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3266141501e+035.3046119970e+00 + 0.0000000000e+000.0000000000e+002.5212815266e-011.2628063943e+037.8224252492e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5809975255e+036.9143853821e+00 + 0.0000000000e+000.0000000000e+001.4073089701e-011.3395837204e+038.9455422665e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0757462823e+041.0411221262e+01 + 0.0000000000e+000.0000000000e+001.3222591362e-016.5814410772e+023.4213444814e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6119361453e+032.8518670727e+00 + 0.0000000000e+000.0000000000e+001.5151721093e-011.8394001980e+032.3964598460e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.1914960220e+044.2513113311e+01 + 0.0000000000e+000.0000000000e+006.3677696717e-025.5154789083e+023.2523684211e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0912377019e+022.7184353830e+00 + 0.0000000000e+000.0000000000e+005.6463580569e-029.5863250738e+025.9410011001e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7112773421e+025.0588091309e+00 + 0.0000000000e+000.0000000000e+005.9528400208e-029.6418029703e+025.9864356436e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7361242574e+025.0922029703e+00 + 0.0000000000e+000.0000000000e+007.0281686063e-021.3250985699e+021.2826622662e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3259644664e+021.2309240924e+00 + 0.0000000000e+000.0000000000e+006.4873487349e-021.6509250869e+021.0146877714e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0658490924e+028.5256687511e-01 + 0.0000000000e+000.0000000000e+006.4839424142e-026.3457825028e+016.0378294574e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.9265797564e+027.7049833887e-01 + 0.0000000000e+000.0000000000e+005.4497264296e-026.3457825028e+016.0378294574e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.9265797564e+027.7049833887e-01 + 0.0000000000e+000.0000000000e+005.4485049834e-025.4985780731e+013.5578073090e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8519435216e+012.8485049834e-01 + 0.0000000000e+000.0000000000e+005.8955688544e-025.1586175332e+013.4180689094e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8050972366e+012.7477173220e-01 + 0.0000000000e+000.0000000000e+005.8955688544e-029.5163356589e+025.5848504983e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1980724252e+024.6543853821e+00 + 0.0000000000e+000.0000000000e+005.6641085271e-021.1278569866e+035.7403089332e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8559019749e+024.7924804356e+00 + 0.0000000000e+000.0000000000e+005.0656364974e-025.3518028403e+013.6712070875e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8441577778e+012.9235880399e-01 + 0.0000000000e+000.0000000000e+004.9302325581e-026.6630791687e+023.8882880030e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6906703728e+023.2749427095e+00 + 0.0000000000e+000.0000000000e+005.1668243456e-026.6152393333e+023.8733555556e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6701146667e+023.2548444444e+00 + 0.0000000000e+000.0000000000e+005.1073317052e-025.9978281111e+023.5872109265e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3345348627e+022.9271747877e+00 + 0.0000000000e+000.0000000000e+006.2225913621e-021.5202388198e+021.5485890299e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.6514983825e+032.0580969831e+00 + 0.0000000000e+000.0000000000e+005.7230978661e-025.2968609272e+013.4518365323e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6340000000e+012.6890347258e-01 + 0.0000000000e+000.0000000000e+005.7425742574e-025.4125962596e+013.7876787679e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0120132013e+012.9075907591e-01 + 0.0000000000e+000.0000000000e+001.5582236842e-018.1867436744e+016.3234323432e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.0508250825e+015.6633663366e-01 + 0.0000000000e+000.0000000000e+004.2574257426e-012.5271177671e+042.0854825104e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5529040318e+031.1656178782e+01 + 0.0000000000e+000.0000000000e+007.4587458746e-022.5271177671e+041.0051023102e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9039803982e+051.2607590759e+02 + 0.0000000000e+000.0000000000e+006.4023362863e-026.8359893875e+031.0044158416e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9070288053e+051.2620099010e+02 + 0.0000000000e+000.0000000000e+005.3244739756e-026.7995354915e+031.0014495976e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9034754964e+051.2596692244e+02 + 0.0000000000e+000.0000000000e+005.3244739756e-026.7070188483e+039.8178095238e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8753111978e+051.2415732004e+02 + 0.0000000000e+000.0000000000e+005.9097909791e-026.3746863898e+039.3169767442e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7564917019e+051.1630658915e+02 + 0.0000000000e+000.0000000000e+005.6320891958e-024.9334622662e+035.5469306931e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0689747558e+057.1768206821e+01 + 0.0000000000e+000.0000000000e+006.3081683168e-024.7123998419e+022.7043495600e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5736303355e+022.2739872112e+00 + 0.0000000000e+000.0000000000e+007.4086378738e-021.3865029900e+021.3342967885e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3699199336e+021.2807973422e+00 + 0.0000000000e+000.0000000000e+006.7162901440e-025.5061606788e+023.2251322997e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1272980041e+022.7817299003e+00 + 0.0000000000e+000.0000000000e+007.8875496689e-024.4860548140e+027.6885581395e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8312599535e+026.0322458472e-01 + 0.0000000000e+000.0000000000e+006.9268442939e-024.4860548140e+027.6885581395e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8312599535e+026.0322458472e-01 + 0.0000000000e+000.0000000000e+006.4122923588e-023.5169468747e+022.2033486612e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1713946624e+021.8450419133e+00 + 0.0000000000e+000.0000000000e+006.6156512141e-023.1556292957e+022.1761128092e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1029733807e+032.1758672573e+00 + 0.0000000000e+000.0000000000e+007.5719158361e-021.6678738206e+031.0193113171e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1029733807e+038.7435314955e+00 + 0.0000000000e+000.0000000000e+005.7631735275e-021.6797376966e+031.0222037652e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6823096346e+028.7378294574e+00 + 0.0000000000e+000.0000000000e+006.3982281285e-021.6750647796e+031.0214983389e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.7095087486e+028.7618493909e+00 + 0.0000000000e+000.0000000000e+006.1221122112e-021.6675254345e+031.0174367437e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.7006646593e+028.7230487884e+00 + 0.0000000000e+000.0000000000e+005.3280499103e-021.6767717492e+031.0271023102e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.7414842684e+028.7607480748e+00 + 0.0000000000e+000.0000000000e+005.7656765677e-021.0159449124e+036.2244248306e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9882417774e+025.3093049766e+00 + 0.0000000000e+000.0000000000e+006.6184644780e-025.8755095080e+023.4428123010e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2943302957e+022.8921372532e+00 + 0.0000000000e+000.0000000000e+006.1789472912e-021.3829730454e+038.2845847176e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.9616660022e+027.0845625692e+00 + 0.0000000000e+000.0000000000e+006.3987884388e-028.4705582451e+025.2229377791e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1484988746e+024.4580406372e+00 + 0.0000000000e+000.0000000000e+006.4608737190e-028.6918439262e+025.4439997684e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4306247322e+024.7035715940e+00 + 0.0000000000e+000.0000000000e+003.5162410978e-011.0330347350e+036.3096138035e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.1959747156e+025.3730832754e+00 + 0.0000000000e+000.0000000000e+006.9839615541e-021.0919483942e+026.9906976744e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.8423344408e+015.8963455150e-01 + 0.0000000000e+000.0000000000e+007.6114826957e-025.3523821808e+013.2286400006e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6636552881e+012.6287129729e-01 + 0.0000000000e+000.0000000000e+005.0789036545e-025.0003410853e+013.3377630122e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4907032115e+012.7044296788e-01 + 0.0000000000e+000.0000000000e+005.9853578579e-025.4004739756e+013.5964562569e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9744451827e+012.9550387597e-01 + 0.0000000000e+000.0000000000e+005.1459161148e-024.4466912466e+022.6288617412e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5298979571e+022.1956301292e+00 + 0.0000000000e+000.0000000000e+005.2956810631e-024.4082075448e+022.6060100988e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5128147683e+022.1773368023e+00 + 0.0000000000e+000.0000000000e+005.5711295681e-025.0712625249e+013.2615780731e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5501392248e+012.6757940199e-01 + 0.0000000000e+000.0000000000e+001.1013193060e-012.5965923333e+029.3542945736e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1742423333e+028.9022325581e-01 + 0.0000000000e+000.0000000000e+001.7669233534e-014.8948909205e+022.8769468727e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.7653345975e+022.4110735099e+00 + 0.0000000000e+000.0000000000e+004.4760002316e-027.0768481848e+014.7128712871e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8892079208e+013.9618377627e-01 + 0.0000000000e+000.0000000000e+004.8349834983e-022.4640461525e+021.4548792774e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4757114469e+021.2273857912e+00 + 0.0000000000e+000.0000000000e+005.1786448382e-022.5919954316e+021.5201702275e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5369508193e+021.2850894563e+00 + 0.0000000000e+000.0000000000e+006.2346672167e-024.7871390481e+013.2754110937e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4671004719e+012.6863195530e-01 + 0.0000000000e+000.0000000000e+007.0292687163e-026.9053376358e+024.0699284768e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8004246689e+023.3681397351e+00 + 0.0000000000e+000.0000000000e+006.2200220022e-024.6357144592e+013.1977108168e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3760862501e+012.5791920530e-01 + 0.0000000000e+000.0000000000e+005.3852934962e-024.8164312941e+013.2353463161e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3906183711e+012.6146977612e-01 + 0.0000000000e+000.0000000000e+005.5280528053e-024.8891089109e+013.4983498350e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7523102310e+012.9125412541e-01 + 0.0000000000e+000.0000000000e+004.2816462567e-024.6863847562e+013.2133048173e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3327138049e+012.5944683284e-01 + 0.0000000000e+000.0000000000e+004.3166887417e-024.6248355263e+013.1585468415e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3217753387e+012.5728406722e-01 + 0.0000000000e+000.0000000000e+005.8780078179e-022.0876618605e+021.3443467700e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3464956537e+021.1172785530e+00 + 0.0000000000e+000.0000000000e+004.6553651185e-024.6538549280e+013.2528239203e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3452668882e+012.5642303433e-01 + 0.0000000000e+000.0000000000e+001.0598294574e-018.6493180509e+027.8807087486e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.0093781174e+037.6681838317e+00 + 0.0000000000e+000.0000000000e+001.0146976744e-017.6279133998e+039.7318405316e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8441059049e+051.2621106312e+02 + 0.0000000000e+000.0000000000e+004.2760620155e-015.3543067513e+037.4452432671e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5282324139e+051.0219777881e+02 + 0.0000000000e+000.0000000000e+001.9581926910e-014.6838531556e+031.2323628793e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4785730415e+041.7679430417e+01 + 0.0000000000e+000.0000000000e+008.1354672553e-029.8698471761e+025.8458471761e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0562573650e+035.1295681063e+00 + 0.0000000000e+000.0000000000e+001.8757475083e-014.1814866888e+034.4994352159e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.6624540221e+047.0009612403e+01 + 0.0000000000e+000.0000000000e+001.3901904762e-012.1183478616e+043.5849813953e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5382699092e+042.8953220377e+01 + 0.0000000000e+000.0000000000e+005.9251568845e-024.7854565457e+013.2915291529e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5871023102e+012.6644664466e-01 + 0.0000000000e+000.0000000000e+005.9499667774e-021.7366660724e+021.0976653747e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1654036279e+029.2395813953e-01 + 0.0000000000e+000.0000000000e+006.3122923588e-024.6753333333e+013.4000000000e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4496666667e+012.7000000000e-01 + 0.0000000000e+000.0000000000e+009.2870967269e-025.6273868232e+023.2950571678e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1304873450e+022.7637956261e+00 + 0.0000000000e+000.0000000000e+005.7807308970e-021.1200861286e+036.5078849750e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.0587529042e+025.4550695254e+00 + 0.0000000000e+000.0000000000e+005.3605020303e-021.1845756257e+036.8890143965e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.4446727575e+025.8016832780e+00 + 0.0000000000e+000.0000000000e+005.3548876812e-026.4497582597e+023.7959179544e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6026871266e+023.1702877116e+00 + 0.0000000000e+000.0000000000e+005.2657216685e-021.1135486157e+027.0420819491e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7835836102e+015.8405315615e-01 + 0.0000000000e+000.0000000000e+004.8274640089e-022.4364301864e+021.5090543005e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5968137973e+021.2832915098e+00 + 0.0000000000e+000.0000000000e+005.2800000000e-024.6004693023e+013.1560509413e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3263194906e+012.5921926910e-01 + 0.0000000000e+000.0000000000e+004.4441006601e-025.0694652814e+013.4684152626e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5561741105e+012.8561512072e-01 + 0.0000000000e+000.0000000000e+004.5458716924e-025.4565814081e+023.2041364136e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0236721672e+022.6546204620e+00 + 0.0000000000e+000.0000000000e+004.3139976249e-025.4565814081e+023.2041364136e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0236721672e+022.6546204620e+00 + 0.0000000000e+000.0000000000e+004.7821492676e-024.7886777409e+013.4338870432e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3535681063e+012.6309007014e-01 + 0.0000000000e+000.0000000000e+005.3480794702e-023.9286336802e+034.5223687048e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0534362392e+057.3446793250e+01 + 0.0000000000e+000.0000000000e+003.5196740250e-016.1326713979e+037.5023278549e+010.0000000000e+00NaN3.0088593577e-020.0000000000e+001.8112010005e+051.2107390904e+02 + 0.0000000000e+000.0000000000e+008.8528888889e-011.7253765205e+045.9982657807e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.3996686809e+059.9142117460e+01 + 0.0000000000e+000.0000000000e+004.1390180879e-014.1182100495e+045.2616744956e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8232953588e+044.0086920530e+01 + 0.0000000000e+000.0000000000e+002.4983388704e-016.0301254883e+045.8830323108e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3464337711e+044.3992873274e+01 + 0.0000000000e+000.0000000000e+002.5724186487e-016.1224593898e+041.0331212625e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0639797841e+051.1245149502e+02 + 0.0000000000e+000.0000000000e+001.9878814548e-016.6488600709e+048.6033275982e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1280573179e+059.9134182946e+01 + 0.0000000000e+000.0000000000e+001.9745012920e-017.0974559322e+041.0408450151e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+009.2141598466e+049.6304397043e+01 + 0.0000000000e+000.0000000000e+002.3872694403e-017.0054034801e+047.5273155556e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.3455015289e+046.1031022222e+01 + 0.0000000000e+000.0000000000e+002.6196013289e-017.0750764205e+047.2161328904e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0773317608e+045.9825116279e+01 + 0.0000000000e+000.0000000000e+002.8160575858e-017.0398044545e+046.5954152824e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9123221156e+044.8223758553e+01 + 0.0000000000e+000.0000000000e+003.0697674419e-021.1092426019e+027.4444291655e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.5012271457e+015.8213845680e-01 + 0.0000000000e+000.0000000000e+002.7543632337e-021.4753963462e+021.0017580838e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0024681525e+028.0616722771e-01 + 0.0000000000e+000.0000000000e+002.8017718715e-025.6823507734e+014.7725022552e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2723322259e+013.7125138427e-01 + 0.0000000000e+000.0000000000e+002.5430417128e-025.8172093023e+014.8034330011e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3420425733e+013.7923588040e-01 + 0.0000000000e+000.0000000000e+002.5459579181e-027.8864466224e+024.6767884828e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3848290144e+023.9225359911e+00 + 0.0000000000e+000.0000000000e+002.3510520487e-021.3764354889e+038.2899888889e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.8072086667e+027.0330888889e+00 + 0.0000000000e+000.0000000000e+002.3510520487e-022.0378766670e+021.3154977482e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2917573950e+021.0751955334e+00 + 0.0000000000e+000.0000000000e+002.0928755999e-021.0237890509e+027.3213554817e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7022772204e+015.9566267996e-01 + 0.0000000000e+000.0000000000e+002.0523914643e-025.8569563792e+015.0286028603e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.3398745875e+013.8050605061e-01 + 0.0000000000e+000.0000000000e+001.9559919808e-025.6342739274e+014.9662266227e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2119174917e+013.7619361936e-01 + 0.0000000000e+000.0000000000e+002.5574843669e-021.1240028509e+021.0990570175e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1017983553e+029.9688961988e-01 + 0.0000000000e+000.0000000000e+003.1239035088e-025.8851589152e+014.8859356001e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2612699938e+013.6457403306e-01 + 0.0000000000e+000.0000000000e+003.2123212321e-026.8163728262e+034.1381698186e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0283919281e+033.5589217474e+01 + 0.0000000000e+000.0000000000e+006.6637897342e-024.7663442276e+045.1758381644e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5953034851e+043.7088517783e+01 + 0.0000000000e+000.0000000000e+002.9700770077e-016.9739475221e+046.9889094798e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.4992295870e+045.8583505045e+01 + 0.0000000000e+000.0000000000e+005.1871406549e-017.3235684224e+049.4200938206e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.7949142898e+048.1707452051e+01 + 0.0000000000e+000.0000000000e+002.1376522702e-017.2578096471e+047.8426652049e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0849938095e+046.8497916501e+01 + 0.0000000000e+000.0000000000e+002.0621627907e-017.3330263802e+041.0144772979e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+002.8767434219e+048.2902990033e+01 + 0.0000000000e+000.0000000000e+008.4357777778e-017.5388368896e+049.9365105205e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.8747100825e+049.2749988926e+01 + 0.0000000000e+000.0000000000e+001.9821170051e-017.2390989081e+048.4106978944e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1347616456e+047.8520020462e+01 + 0.0000000000e+000.0000000000e+001.6170542636e-017.3357300066e+048.5275127353e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9807831694e+047.8157962348e+01 + 0.0000000000e+000.0000000000e+003.4302314581e-017.2635210992e+048.7474979648e+010.0000000000e+00NaN1.0797342193e-020.0000000000e+005.7870899288e+048.1182007217e+01 + 0.0000000000e+000.0000000000e+002.0381413806e-017.2767637837e+049.8581711000e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.1347615020e+049.1845472854e+01 + 0.0000000000e+000.0000000000e+002.0142506460e-017.3064175378e+041.2030608550e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1716532053e+051.1270526269e+02 + 0.0000000000e+000.0000000000e+002.5959736859e-017.1216381344e+047.8028724561e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9191998836e+046.7593706629e+01 + 0.0000000000e+000.0000000000e+001.9888319289e-016.9412571768e+045.9911812033e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6747954666e+044.2856104706e+01 + 0.0000000000e+000.0000000000e+001.1177989838e-017.2362044033e+014.2987612906e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7668290451e+013.5421240808e-01 + 0.0000000000e+000.0000000000e+001.1076978751e-016.7242418903e+014.2559471079e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.8160817555e+013.3474292166e-01 + 0.0000000000e+000.0000000000e+001.1193492705e-016.6724416218e+014.0493721412e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.8160817555e+013.3474292166e-01 + 0.0000000000e+000.0000000000e+001.0370114643e-016.4020356124e+013.9200484193e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.3155975913e+013.1858646720e-01 + 0.0000000000e+000.0000000000e+001.0275411094e-016.0363766502e+013.5424504950e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.5748834571e+012.8511963696e-01 + 0.0000000000e+000.0000000000e+001.0438626800e-015.9753661267e+013.7164769288e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9028116058e+012.9806009598e-01 + 0.0000000000e+000.0000000000e+001.0438626800e-016.4043546253e+014.0381188630e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.0580089922e+013.3011266150e-01 + 0.0000000000e+000.0000000000e+001.0211568502e-016.5087770468e+013.9613861386e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.5544049708e+013.2023102310e-01 + 0.0000000000e+000.0000000000e+001.2017072721e-011.2331086338e+021.1246702104e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1667345729e+021.0590237357e+00 + 0.0000000000e+000.0000000000e+001.0389280177e-016.8630631414e+014.2860668143e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.3765703950e+013.5297416021e-01 + 0.0000000000e+000.0000000000e+001.0161683278e-016.8630631414e+014.2860668143e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.3765703950e+013.4794333702e-01 + 0.0000000000e+000.0000000000e+001.0827707641e-016.1438461508e+022.9739902679e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.9264302656e+022.4977986183e+00 + 0.0000000000e+000.0000000000e+004.8150609081e-017.1870320740e+039.9098155376e+010.0000000000e+00NaN5.7364341085e-030.0000000000e+001.9063165035e+051.2874817657e+02 + 0.0000000000e+000.0000000000e+001.1207648579e+006.8645957165e+049.9098155376e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9063165035e+051.2874817657e+02 + 0.0000000000e+000.0000000000e+002.6450719823e-017.0284291960e+046.8153754153e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.9446629232e+034.5133754153e+01 + 0.0000000000e+000.0000000000e+006.5629501661e-017.3104301266e+049.4396240089e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4934676797e+049.6408979845e+01 + 0.0000000000e+000.0000000000e+003.0192894057e-017.6553554613e+041.3688637324e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5876727317e+051.4831901278e+02 + 0.0000000000e+000.0000000000e+001.9327260860e-017.3620413455e+049.3153986711e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.3749428904e+049.5776411960e+01 + 0.0000000000e+000.0000000000e+001.7811871539e-017.1231066011e+048.5228753749e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.1604969078e+047.7194263273e+01 + 0.0000000000e+000.0000000000e+003.1986710963e-017.2286631118e+041.1588066445e+020.0000000000e+00NaN1.0000000000e-020.0000000000e+001.2017797648e+051.1559455150e+02 + 0.0000000000e+000.0000000000e+003.5049833887e-017.0653606467e+048.1141333333e+010.0000000000e+00NaN1.6476716232e+000.0000000000e+004.4205871738e+047.3368147368e+01 + 0.0000000000e+000.0000000000e+003.0056478405e-014.6499985832e+038.7046859358e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5048043333e+037.0729925434e+00 + 0.0000000000e+000.0000000000e+001.0091162791e-012.1252381314e+021.2108211148e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2752996065e+021.0130844592e+00 + 0.0000000000e+000.0000000000e+009.9445699520e-027.9634378738e+024.8021926910e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7423823920e+024.0669435216e+00 + 0.0000000000e+000.0000000000e+001.0376522702e-015.4371343152e+013.7849420450e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7152000000e+013.0000000000e-01 + 0.0000000000e+000.0000000000e+009.7304782929e-021.0256742107e+031.0936346468e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.2163856571e+017.4860146091e-01 + 0.0000000000e+000.0000000000e+009.9507284768e-026.4194767003e+023.7693310078e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5681306150e+023.1547178295e+00 + 0.0000000000e+000.0000000000e+001.0551111111e-011.2162158874e+037.2853084621e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.8575193392e+026.1633383370e+00 + 0.0000000000e+000.0000000000e+001.0401974408e-017.0316476471e+024.3280344942e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1753869376e+023.6918009959e+00 + 0.0000000000e+000.0000000000e+001.0425742574e-017.1124013013e+024.3888802038e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2012492726e+023.7143654826e+00 + 0.0000000000e+000.0000000000e+001.0679867987e-011.2588643424e+037.7001211569e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.3562722219e+026.6319056149e+00 + 0.0000000000e+000.0000000000e+001.1155115512e-017.1292983498e+024.3689108911e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2452574257e+023.7612541254e+00 + 0.0000000000e+000.0000000000e+001.2087833149e-011.2761727959e+021.1927298634e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2415165921e+021.1420388335e+00 + 0.0000000000e+000.0000000000e+001.0404750831e-015.6294392433e+014.0753045404e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1533111849e+013.3621262458e-01 + 0.0000000000e+000.0000000000e+009.7085070349e-024.3960189045e+022.5971281339e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.5033797985e+022.1693807539e+00 + 0.0000000000e+000.0000000000e+009.0891089109e-023.7249215834e+035.0663593451e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0194469089e+056.8574964898e+01 + 0.0000000000e+000.0000000000e+004.1598864711e-011.1448390161e+034.9229612110e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0420798538e+034.4076331287e+00 + + + + MIN + 12 + + + 5.0000000000e-01 + + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 3.8445798772e-03 + 1.2136938681e-01 + 7.1205914061e-02 + 0 + + + 9.1150797342e+01 + 4.7615250974e+02 + 4.7615250974e+02 + 0 + + + 6.6336670260e-01 + 2.3721141449e+00 + 2.3721141449e+00 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + NaN + NaN + NaN + 4 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 6.7405116279e+01 + 1.5713499963e+03 + 1.5713499963e+03 + 0 + + + 4.8029900332e-01 + 2.0067809289e+00 + 2.0067809289e+00 + 0 + + + + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + 0.0000000000e+000.0000000000e+003.4950166113e-021.9367158272e+041.6213643411e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5253485714e+031.1256877076e+01 + 0.0000000000e+000.0000000000e+003.7430786268e-021.2860477736e+041.4788690935e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2446667635e+031.0449706460e+01 + 0.0000000000e+000.0000000000e+009.6400885936e-021.0004448383e+041.0924019638e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6608352673e+038.0773705426e+00 + 0.0000000000e+000.0000000000e+008.8327796235e-022.5267806866e+039.1688006865e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.8206043351e+026.4495240295e+00 + 0.0000000000e+000.0000000000e+008.8327796235e-022.9793102146e+021.5712188636e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8708708453e+021.1987510837e+00 + 0.0000000000e+000.0000000000e+001.4665190203e-018.0516935904e+015.1819668809e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9819811534e+024.6120085693e-01 + 0.0000000000e+000.0000000000e+001.4665190203e-018.3059450524e+014.0481457356e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.0158203347e+013.2487782989e-01 + 0.0000000000e+000.0000000000e+008.1408140814e-024.8255951233e+012.9891179578e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2743485756e+012.6153704186e-01 + 0.0000000000e+000.0000000000e+008.3362536912e-024.6287788779e+012.9042904290e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1823762376e+012.4686468647e-01 + 0.0000000000e+000.0000000000e+008.3944799085e-024.6019801980e+012.8382838284e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0892189219e+012.3432343234e-01 + 0.0000000000e+000.0000000000e+008.7105769788e-024.8093247604e+012.9981301749e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0999078694e+012.3736302907e-01 + 0.0000000000e+000.0000000000e+008.4538822303e-024.8315037129e+013.0575082508e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1613337459e+012.4312293729e-01 + 0.0000000000e+000.0000000000e+008.7591193330e-024.8220473988e+013.0573323780e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2099566108e+012.4745889063e-01 + 0.0000000000e+000.0000000000e+007.4944812362e-024.6661774915e+012.9546188936e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1179247981e+012.3907064751e-01 + 0.0000000000e+000.0000000000e+008.4344312190e-024.7760076301e+013.0743551126e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1557190528e+012.4262905840e-01 + 0.0000000000e+000.0000000000e+007.4319379845e-024.6360384496e+012.9568106312e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1737194832e+012.3973421927e-01 + 0.0000000000e+000.0000000000e+007.5035393672e-024.7978338870e+013.0376975717e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1201250110e+012.3751368653e-01 + 0.0000000000e+000.0000000000e+006.1535982340e-024.7631288889e+013.0065550446e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1243977778e+012.3705360351e-01 + 0.0000000000e+000.0000000000e+006.9807726269e-024.9523700000e+012.9485298013e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1223958841e+012.3600461425e-01 + 0.0000000000e+000.0000000000e+007.0062398823e-025.0687190968e+012.9023255814e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4664897215e+012.7470213343e-01 + 0.0000000000e+000.0000000000e+003.7603458425e-022.0549468889e+028.9931111111e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.9871125556e+027.9275555556e-01 + 0.0000000000e+000.0000000000e+001.1478547855e-017.9844390959e+022.1722177349e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0544410631e+032.2475903248e+00 + 0.0000000000e+000.0000000000e+002.2293609953e-018.2399626107e+023.5174902293e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.5288089272e+022.4782047942e+00 + 0.0000000000e+000.0000000000e+001.8761831423e-018.6821578947e+023.7881578947e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.0841184211e+023.3230263158e+00 + 0.0000000000e+000.0000000000e+001.6683190173e-011.2406121131e+035.3535741788e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9993562593e+034.5404338005e+00 + 0.0000000000e+000.0000000000e+005.2525024427e-025.0804932201e+021.8211572436e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.0289428527e+021.6532816823e+00 + 0.0000000000e+000.0000000000e+008.4468696936e-027.8219293333e+023.5833330390e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9072929007e+033.6110981604e+00 + 0.0000000000e+000.0000000000e+008.2192691030e-027.5070624585e+022.9130232558e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8563406645e+032.9419269103e+00 + 0.0000000000e+000.0000000000e+001.0058986601e-016.3124264703e+022.3313999692e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0936022866e+032.3581097592e+00 + 0.0000000000e+000.0000000000e+008.0546815985e-024.6083745866e+012.8481727575e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1215614618e+012.3920265781e-01 + 0.0000000000e+000.0000000000e+007.6014939165e-024.5885297573e+012.8111196673e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1092923808e+012.3795501382e-01 + 0.0000000000e+000.0000000000e+008.0155038760e-024.5324496124e+012.6962223053e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1110437064e+012.3774999450e-01 + 0.0000000000e+000.0000000000e+007.4390002420e-024.5762358804e+012.7966777409e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1503779015e+012.4216834246e-01 + 0.0000000000e+000.0000000000e+007.7962347730e-026.6025707641e+024.0623588040e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.9155956811e+023.4582502769e+00 + 0.0000000000e+000.0000000000e+008.0265780731e-026.3382832270e+023.8905677543e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.7706478955e+023.3359344129e+00 + 0.0000000000e+000.0000000000e+006.7918050941e-027.9473218719e+024.8977043409e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7104815912e+024.1931099426e+00 + 0.0000000000e+000.0000000000e+008.0210409745e-024.6946461684e+012.9430786268e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1492185430e+012.4333964049e-01 + 0.0000000000e+000.0000000000e+007.5223537436e-024.6177906977e+012.8762220120e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1485481728e+012.4320044297e-01 + 0.0000000000e+000.0000000000e+007.7763012182e-024.6094958197e+012.8308203707e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1373294317e+012.4014579804e-01 + 0.0000000000e+000.0000000000e+007.9734219269e-024.6837570717e+012.8699005522e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1622138127e+012.4273099968e-01 + 0.0000000000e+000.0000000000e+007.5630500550e-024.6877203947e+012.8753289474e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1808497807e+012.4671052632e-01 + 0.0000000000e+000.0000000000e+006.7722772277e-024.5973465347e+012.9874587459e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0802720167e+012.3722511725e-01 + 0.0000000000e+000.0000000000e+007.2847682119e-024.6148454746e+012.9040974529e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1619197231e+012.4279817826e-01 + 0.0000000000e+000.0000000000e+007.5342163355e-024.7280938190e+013.0199335548e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1366580273e+012.4324822336e-01 + 0.0000000000e+000.0000000000e+006.8648947951e-026.8514129568e+023.9220044297e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9277083895e+033.8831213101e+00 + 0.0000000000e+000.0000000000e+001.1156116844e-023.7545599187e+021.2871778399e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8310366791e+021.2549594802e+00 + 0.0000000000e+000.0000000000e+001.1069613430e-024.9234929177e+021.8371036545e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.1931505548e+021.8418637135e+00 + 0.0000000000e+000.0000000000e+003.7072598329e-024.0949003322e+021.2518272425e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.8092584982e+021.2862196382e+00 + 0.0000000000e+000.0000000000e+008.7031528459e-021.2376702658e+036.8224252492e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.9148060466e+037.3036544850e+00 + 0.0000000000e+000.0000000000e+003.1208857864e-021.5653427699e+029.9034862677e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2175323618e+029.1718224847e-01 + 0.0000000000e+000.0000000000e+003.4835537172e-023.0683654485e+021.6429894832e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.5410372115e+021.7171558382e+00 + 0.0000000000e+000.0000000000e+002.9080034909e-023.5819842123e+021.5422223567e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.7345691573e+021.3950987144e+00 + 0.0000000000e+000.0000000000e+006.1528239203e-023.2595569074e+021.8564546435e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.5525396427e+021.5692037579e+00 + 0.0000000000e+000.0000000000e+001.5332450331e-012.0088041792e+021.3204542254e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.5525396427e+021.4231639568e+00 + 0.0000000000e+000.0000000000e+001.5347729790e-011.2377359922e+028.8220996238e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5828415693e+027.3578524125e-01 + 0.0000000000e+000.0000000000e+007.6156291391e-024.6440588079e+012.9385382060e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2127923179e+012.4840095976e-01 + 0.0000000000e+000.0000000000e+008.0310077519e-024.6724000000e+012.8948888889e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1707630464e+012.4615555556e-01 + 0.0000000000e+000.0000000000e+008.4999779983e-024.6811073097e+012.8634551495e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1367540208e+012.4283697462e-01 + 0.0000000000e+000.0000000000e+007.5569509044e-024.5654540421e+012.7992380952e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1372406645e+012.4089213732e-01 + 0.0000000000e+000.0000000000e+008.0791509782e-024.6284137013e+012.8270893319e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0988408830e+012.3613899926e-01 + 0.0000000000e+000.0000000000e+008.3967349453e-024.5892815340e+012.8335548173e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1198708939e+012.3973421927e-01 + 0.0000000000e+000.0000000000e+007.7097895903e-024.3775267442e+012.6853488372e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8788958915e+012.3222015504e-01 + 0.0000000000e+000.0000000000e+008.3114617940e-024.6012080399e+012.8299428689e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1156146179e+012.3871539313e-01 + 0.0000000000e+000.0000000000e+007.9590932777e-024.6084289995e+012.8738665972e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0767102658e+012.3568601268e-01 + 0.0000000000e+000.0000000000e+006.4400440044e-024.4830691441e+012.8118811881e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0746909849e+012.3491749175e-01 + 0.0000000000e+000.0000000000e+007.0881644085e-024.5718846296e+012.7849313879e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0887986582e+012.3788290342e-01 + 0.0000000000e+000.0000000000e+006.7634763476e-024.5247920792e+012.8957095710e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0919395518e+012.3898297725e-01 + 0.0000000000e+000.0000000000e+007.5045849980e-024.6078713848e+012.8817421545e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0961361820e+012.3947513172e-01 + 0.0000000000e+000.0000000000e+008.2786933299e-025.2771377128e+013.2162725812e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6655085150e+012.7193065688e-01 + 0.0000000000e+000.0000000000e+006.9777987667e-023.9532432343e+023.3001320132e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8236738362e+034.4594719472e+00 + 0.0000000000e+000.0000000000e+002.4703717557e-011.5468941528e+031.0031627907e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8167217940e+038.9272425249e+00 + 0.0000000000e+000.0000000000e+009.7179563339e-021.9633950584e+031.0923098942e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.1979441066e+031.1782956921e+01 + 0.0000000000e+000.0000000000e+006.3122923588e-026.9900194906e+023.0293687708e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7307242525e+032.9272093023e+00 + 0.0000000000e+000.0000000000e+004.0442967885e-022.8969775894e+021.0226101545e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0248198146e+028.9148962472e-01 + 0.0000000000e+000.0000000000e+002.7131782946e-026.7349511027e+021.9916702723e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+008.1643331435e+021.7121634290e+00 + 0.0000000000e+000.0000000000e+002.8534539027e-023.3436510520e+021.2857032115e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5523843854e+021.1294352159e+00 + 0.0000000000e+000.0000000000e+001.7086378738e-018.5639873333e+024.1586189845e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2191052221e+034.1121501104e+00 + 0.0000000000e+000.0000000000e+007.9711111111e-022.6198123063e+021.0563394278e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0196689952e+029.6403753493e-01 + 0.0000000000e+000.0000000000e+008.2279377791e-024.9899688126e+013.4365019472e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3847595909e+012.6545939583e-01 + 0.0000000000e+000.0000000000e+007.6522702104e-024.6803111849e+012.9806274889e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1246362016e+012.4042790698e-01 + 0.0000000000e+000.0000000000e+006.9922480620e-024.6498117386e+012.8640807316e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1041007532e+012.3639978585e-01 + 0.0000000000e+000.0000000000e+007.0701781406e-024.6253995939e+012.8903654485e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1142857143e+012.3920265781e-01 + 0.0000000000e+000.0000000000e+007.1514348786e-024.5137589404e+012.8528211921e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0860270199e+012.3559337748e-01 + 0.0000000000e+000.0000000000e+007.5270105958e-021.2944970297e+037.7944554455e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.3151108911e+026.6260066007e+00 + 0.0000000000e+000.0000000000e+008.2905158937e-021.3095788366e+037.8643316832e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.4062063806e+026.7204840484e+00 + 0.0000000000e+000.0000000000e+008.0858375311e-027.0804985699e+024.1184158416e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.9233447745e+023.4381518152e+00 + 0.0000000000e+000.0000000000e+008.3531461699e-024.7342914676e+012.9421428985e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0910416232e+012.3821264692e-01 + 0.0000000000e+000.0000000000e+008.1176900585e-027.9678261236e+024.8023804716e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5938368747e+024.0373042600e+00 + 0.0000000000e+000.0000000000e+006.8893240339e-024.9792434710e+013.1802039559e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4640932653e+012.6538635014e-01 + 0.0000000000e+000.0000000000e+006.5426173242e-024.5407929125e+012.8744186047e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0898128974e+012.3613829545e-01 + 0.0000000000e+000.0000000000e+006.1078107811e-024.4498437844e+012.7765112038e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0693861386e+012.3445544554e-01 + 0.0000000000e+000.0000000000e+006.1666666667e-024.5217166667e+012.9316040829e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1056926473e+012.3679740776e-01 + 0.0000000000e+000.0000000000e+008.4983388704e-024.9423056478e+012.9066500187e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3696610562e+012.5276062866e-01 + 0.0000000000e+000.0000000000e+001.6544819720e-011.8037089304e+037.4945711702e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.4738531225e+037.9072388704e+00 + 0.0000000000e+000.0000000000e+001.5000000000e-015.4864328189e+022.4154746870e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.2773178247e+022.0902631405e+00 + 0.0000000000e+000.0000000000e+001.8963255814e-013.6894821486e+021.2874430464e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1797338153e+028.8011368653e-01 + 0.0000000000e+000.0000000000e+001.8235511259e-013.6894821486e+021.3041236203e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1797338153e+028.8011368653e-01 + 0.0000000000e+000.0000000000e+001.1333333333e-012.7803990627e+021.4284389782e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0841384629e+021.5065147081e+00 + 0.0000000000e+000.0000000000e+001.0343898117e-016.0135631746e+014.4957777778e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2145380952e+013.6822222222e-01 + 0.0000000000e+000.0000000000e+001.0179695350e-011.2095640871e+027.8153074935e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.9135884681e+015.5051827243e-01 + 0.0000000000e+000.0000000000e+003.4298462741e-026.9477579758e+014.2490649065e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.5293905391e+013.4283828383e-01 + 0.0000000000e+000.0000000000e+002.4283842858e-024.6418767877e+013.2487573099e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3172575850e+012.6216895374e-01 + 0.0000000000e+000.0000000000e+002.3993399340e-024.5250570610e+013.2208449134e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2416638730e+012.5847917029e-01 + 0.0000000000e+000.0000000000e+001.7259278559e-024.5491178348e+013.4177515778e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4369325025e+012.8047804123e-01 + 0.0000000000e+000.0000000000e+002.4852643159e-024.5379733585e+013.2334527532e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1984730111e+012.5100594928e-01 + 0.0000000000e+000.0000000000e+001.1410094957e-024.4595715289e+013.1514851485e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1842178218e+012.4662266227e-01 + 0.0000000000e+000.0000000000e+001.9241380828e-024.3899650613e+013.1455149502e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1574086379e+012.4421926910e-01 + 0.0000000000e+000.0000000000e+002.8728918322e-024.3852520120e+012.9877171270e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0896444691e+012.3537092525e-01 + 0.0000000000e+000.0000000000e+002.2931214174e-024.3057954916e+012.9687700356e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0947914044e+012.3726911756e-01 + 0.0000000000e+000.0000000000e+002.1694682185e-024.3141914296e+013.0168155449e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0963130001e+012.3679970371e-01 + 0.0000000000e+000.0000000000e+003.0299003322e-024.5543521595e+013.1162790698e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2349501661e+012.5182724252e-01 + 0.0000000000e+000.0000000000e+002.7191774292e-024.8397918051e+013.5563676633e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5705245136e+012.9108527132e-01 + 0.0000000000e+000.0000000000e+002.8205980066e-024.6059634551e+013.3342544718e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2692691030e+012.5858616972e-01 + 0.0000000000e+000.0000000000e+002.7629021730e-024.5608992835e+013.1366976744e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2568670290e+012.5474617940e-01 + 0.0000000000e+000.0000000000e+002.1373569583e-024.3774445007e+013.0607724069e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1663109356e+012.4638878499e-01 + 0.0000000000e+000.0000000000e+002.1373569583e-024.5732589147e+013.0608970100e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2519460354e+012.4560941307e-01 + 0.0000000000e+000.0000000000e+002.3228771155e-024.3903354528e+012.9597247976e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0980549080e+012.3611287712e-01 + 0.0000000000e+000.0000000000e+002.3228771155e-024.3791636130e+012.9954635762e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1489339588e+012.3770676968e-01 + 0.0000000000e+000.0000000000e+001.8334165653e-024.2638423332e+013.0304799230e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0849040842e+012.3747524752e-01 + 0.0000000000e+000.0000000000e+001.9357629842e-024.3375006080e+013.0142529385e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1034804803e+012.3765416015e-01 + 0.0000000000e+000.0000000000e+001.4191419142e-024.2973047305e+012.9108910891e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0696369637e+012.3454345435e-01 + 0.0000000000e+000.0000000000e+002.2116336634e-026.4043535155e+032.0854825104e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5529040318e+031.1656178782e+01 + 0.0000000000e+000.0000000000e+002.8387542702e-026.4215225563e+039.9479418389e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8793435293e+051.2563267041e+02 + 0.0000000000e+000.0000000000e+002.7882360604e-021.1419097700e+035.3620462046e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6298927393e+034.4227722772e+00 + 0.0000000000e+000.0000000000e+002.2834261072e-026.3746863898e+039.3169767442e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7564917019e+051.1630658915e+02 + 0.0000000000e+000.0000000000e+002.9801003127e-024.6445929303e+013.3133326820e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3800307126e+012.7164274651e-01 + 0.0000000000e+000.0000000000e+002.1027842916e-024.7785133099e+013.5935335968e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5843339811e+012.9671378322e-01 + 0.0000000000e+000.0000000000e+002.4202420242e-024.9330869268e+013.6486516415e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6056410276e+012.9903009380e-01 + 0.0000000000e+000.0000000000e+001.8726100636e-024.7481712614e+013.4753333333e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5818000000e+012.9391111111e-01 + 0.0000000000e+000.0000000000e+002.1714876338e-024.7750522222e+013.5046954596e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6055955556e+012.9772222222e-01 + 0.0000000000e+000.0000000000e+001.1125167763e-024.4839378738e+013.1707456626e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3006421634e+012.6169094923e-01 + 0.0000000000e+000.0000000000e+001.4085788114e-024.5570166113e+013.2566998893e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3140863787e+012.6248062016e-01 + 0.0000000000e+000.0000000000e+002.0993355482e-024.6480181322e+013.4047131783e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3600014027e+012.6768253968e-01 + 0.0000000000e+000.0000000000e+001.7677777778e-024.7169809967e+013.4109668874e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3552646431e+012.6780058867e-01 + 0.0000000000e+000.0000000000e+001.7626208933e-023.1556292957e+022.1761128092e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9673661130e+022.1758672573e+00 + 0.0000000000e+000.0000000000e+001.7592200147e-021.6258119690e+039.9193606497e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.3913540450e+028.4568679090e+00 + 0.0000000000e+000.0000000000e+002.3356404577e-021.6178795395e+039.9169723814e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.4620971404e+028.5128556540e+00 + 0.0000000000e+000.0000000000e+002.1675713624e-021.5984251990e+039.8019443721e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+009.3445476778e+028.4098433429e+00 + 0.0000000000e+000.0000000000e+002.7698454056e-021.0159449124e+036.2244248306e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+005.9882417774e+025.3093049766e+00 + 0.0000000000e+000.0000000000e+002.5453071623e-024.5567517225e+013.1997973482e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1619267486e+012.4811229807e-01 + 0.0000000000e+000.0000000000e+002.4510451045e-024.3705885589e+013.0392739274e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1261716172e+012.4192519252e-01 + 0.0000000000e+000.0000000000e+001.9374981604e-025.8755095080e+023.4428123010e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2943302957e+022.8921372532e+00 + 0.0000000000e+000.0000000000e+001.8742038678e-028.2556584547e+025.0858040160e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9694145916e+024.3265651214e+00 + 0.0000000000e+000.0000000000e+001.3726477911e-028.2700924657e+025.0626784784e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9895001129e+024.3407734063e+00 + 0.0000000000e+000.0000000000e+001.7517514909e-024.2316102498e+012.9744267848e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1185537534e+012.4114049563e-01 + 0.0000000000e+000.0000000000e+002.5545258495e-024.4269653827e+012.9471760797e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1174086379e+012.3867109635e-01 + 0.0000000000e+000.0000000000e+002.3758919862e-024.4118301550e+012.9999922481e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1592189922e+012.4316048565e-01 + 0.0000000000e+000.0000000000e+002.2466777409e-024.3473914729e+012.8961904762e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1488056735e+012.4215393134e-01 + 0.0000000000e+000.0000000000e+002.5647840532e-024.3985755556e+012.9472170714e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1349575791e+012.4149315673e-01 + 0.0000000000e+000.0000000000e+002.6091243561e-025.4004739756e+013.5964562569e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9744451827e+012.9550387597e-01 + 0.0000000000e+000.0000000000e+002.8908458193e-024.3059480795e+012.8210270401e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1560175497e+012.4231964093e-01 + 0.0000000000e+000.0000000000e+002.9104163458e-024.4251116409e+012.8524760854e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1173927520e+012.3870559235e-01 + 0.0000000000e+000.0000000000e+002.8803986711e-024.3579235734e+012.9295637060e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1234658020e+012.3987708375e-01 + 0.0000000000e+000.0000000000e+002.5431023102e-024.3647959296e+012.9703904571e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0865195155e+012.3523076133e-01 + 0.0000000000e+000.0000000000e+002.3377337734e-024.2278351572e+012.9949452840e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0766728620e+012.3694401019e-01 + 0.0000000000e+000.0000000000e+001.5883489665e-024.1519192939e+012.8917419374e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0690818134e+012.3528921313e-01 + 0.0000000000e+000.0000000000e+001.4979228186e-024.1429093929e+012.8981587632e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0932343234e+012.3647052863e-01 + 0.0000000000e+000.0000000000e+001.4120635748e-024.1648191767e+012.8061548260e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0059640040e+012.2702018557e-01 + 0.0000000000e+000.0000000000e+001.5498885415e-024.2170152097e+012.9223644404e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0704114411e+012.3458745875e-01 + 0.0000000000e+000.0000000000e+001.5498885415e-024.1931964312e+012.9173392200e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1105866887e+012.3784444444e-01 + 0.0000000000e+000.0000000000e+001.7927740142e-024.1931964312e+012.9173392200e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0949191419e+012.3810250184e-01 + 0.0000000000e+000.0000000000e+001.7927740142e-024.2206469515e+012.8812467431e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0900581140e+012.3599078658e-01 + 0.0000000000e+000.0000000000e+002.3828382838e-024.1828062938e+012.8550568873e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0503894389e+012.3227722772e-01 + 0.0000000000e+000.0000000000e+002.3850059348e-024.2746068660e+012.9047619048e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0815184377e+012.3444075305e-01 + 0.0000000000e+000.0000000000e+002.7478383314e-024.2994788527e+012.9145459579e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1298019500e+012.3567497231e-01 + 0.0000000000e+000.0000000000e+001.9584496124e-024.2916700000e+012.9145459579e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1093323873e+012.3567497231e-01 + 0.0000000000e+000.0000000000e+002.7076411960e-024.3433720930e+012.9968273525e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1735091124e+012.4339442477e-01 + 0.0000000000e+000.0000000000e+006.2636938926e-021.1221378452e+029.0183428307e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2839370553e+027.4103565891e-01 + 0.0000000000e+000.0000000000e+006.2636938926e-021.0567655857e+027.2384179544e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0117260218e+026.0532568065e-01 + 0.0000000000e+000.0000000000e+006.1422074566e-021.5358791528e+027.4194629014e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1405843300e+026.1137043189e-01 + 0.0000000000e+000.0000000000e+001.5397452935e-024.4478152318e+012.9603016924e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3642779550e+012.6570328486e-01 + 0.0000000000e+000.0000000000e+006.9102990033e-027.7078483333e+024.9497777778e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7851266667e+024.0802222222e+00 + 0.0000000000e+000.0000000000e+001.8000000000e-024.3259014570e+012.9675202355e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0944918617e+012.3680117734e-01 + 0.0000000000e+000.0000000000e+001.1355195705e-024.2631083681e+012.9383807255e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1436916759e+012.3868373804e-01 + 0.0000000000e+000.0000000000e+008.5796909492e-034.1883545107e+012.9133973510e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0814292691e+012.3355813953e-01 + 0.0000000000e+000.0000000000e+001.0429693516e-024.2968897714e+012.8965669989e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0725027685e+012.3325581395e-01 + 0.0000000000e+000.0000000000e+001.0963455150e-024.1466666667e+012.9579180509e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1165669989e+012.3627906977e-01 + 0.0000000000e+000.0000000000e+001.0930232558e-025.5068758616e+023.2460174327e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0655993730e+022.6879983939e+00 + 0.0000000000e+000.0000000000e+001.2292358804e-025.6990860465e+023.3589479513e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1970244740e+022.7970764120e+00 + 0.0000000000e+000.0000000000e+001.3394644782e-027.8176065559e+015.1024784053e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.0464207420e+014.2412469546e-01 + 0.0000000000e+000.0000000000e+001.3820598007e-024.2483134441e+012.9235880399e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0983690808e+012.3616980436e-01 + 0.0000000000e+000.0000000000e+001.6196751569e-024.1569179033e+012.9003912883e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1179737542e+012.3938870432e-01 + 0.0000000000e+000.0000000000e+001.6050568873e-024.2693688439e+012.8279698402e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0657033212e+012.3320431711e-01 + 0.0000000000e+000.0000000000e+001.7601760176e-024.1915291529e+012.9238409038e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0673780362e+012.3552190087e-01 + 0.0000000000e+000.0000000000e+002.0492878235e-024.3132713653e+013.0363036304e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1118811881e+012.3937641133e-01 + 0.0000000000e+000.0000000000e+001.4720847085e-024.2249566832e+013.0328411789e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0820176018e+012.3667766777e-01 + 0.0000000000e+000.0000000000e+001.4707973422e-024.2552265503e+012.9530093799e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0665393579e+012.3556279312e-01 + 0.0000000000e+000.0000000000e+009.2847242085e-034.3071760797e+012.9789276486e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1366812292e+012.4126688815e-01 + 0.0000000000e+000.0000000000e+005.3863134658e-035.3904897748e+022.2293111111e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2437212222e+032.2091897379e+00 + 0.0000000000e+000.0000000000e+003.2858619417e-021.5056116667e+021.0434156733e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0028305644e+028.3916666667e-01 + 0.0000000000e+000.0000000000e+001.4159222753e-013.1420595350e+031.2964206034e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2753525670e+031.1362057395e+01 + 0.0000000000e+000.0000000000e+001.6155363603e-011.7198084565e+031.2294750831e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.9457322259e+039.4279069767e+00 + 0.0000000000e+000.0000000000e+001.3794038391e-015.5969783389e+045.0185600000e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.0710201333e+033.4911200000e+01 + 0.0000000000e+000.0000000000e+001.0105647841e-013.7456673605e+045.0882325160e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.1615737984e+033.4869697073e+01 + 0.0000000000e+000.0000000000e+009.6345514950e-026.2364621274e+045.0667759419e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4262214950e+043.8249649953e+01 + 0.0000000000e+000.0000000000e+001.3227109635e-016.5022737744e+045.2919800664e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.0566714419e+043.8200719085e+01 + 0.0000000000e+000.0000000000e+001.6434775913e-016.7409437966e+045.8224751637e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7621179334e+044.4502139007e+01 + 0.0000000000e+000.0000000000e+004.7619047619e-045.5026411960e+014.6132890365e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.2536312292e+013.6355481728e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.2376420027e+014.3788182145e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.9715028786e+013.3628339677e-01 + 0.0000000000e+000.0000000000e+001.3333333333e-035.3880128710e+014.5027018107e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0256643418e+013.4827704561e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.3542677187e+014.4822739018e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0256643418e+013.4827704561e-01 + 0.0000000000e+000.0000000000e+009.7130242826e-045.3542677187e+014.4683879660e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0705440162e+013.5094389073e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.3779358915e+014.4683879660e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0705440162e+013.5125300849e-01 + 0.0000000000e+000.0000000000e+001.1810154525e-032.0378766670e+021.3154977482e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2917573950e+021.0751955334e+00 + 0.0000000000e+000.0000000000e+002.0111111111e-035.3981017829e+014.5145194996e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1112026578e+013.5800664452e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.3605042968e+014.5244473976e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1001917682e+013.5699704688e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.4455026952e+014.6101144334e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.1001917682e+013.5699704688e-01 + 0.0000000000e+000.0000000000e+001.6611661166e-035.3460785240e+014.5274850182e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.8625078057e+013.3456871345e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.0601402640e+014.2682068207e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6985478548e+013.1130913091e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.1708092105e+014.3672594233e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.7720381673e+013.2262021597e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+005.4385082508e+014.7214521452e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.0714191419e+013.5643564356e-01 + 0.0000000000e+000.0000000000e+003.5203520352e-046.4827551155e+023.8380198020e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.6296264026e+023.2055445545e+00 + 0.0000000000e+000.0000000000e+003.7640227839e-024.7663442276e+044.4269549027e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+005.6992441820e+033.1369010190e+01 + 0.0000000000e+000.0000000000e+001.3175536304e-016.9739475221e+045.8881503423e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7024581983e+044.2452761385e+01 + 0.0000000000e+000.0000000000e+001.5081081678e-011.4809074061e+039.1528913252e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.6255272647e+038.4115741602e+00 + 0.0000000000e+000.0000000000e+008.9647019134e-021.4809074061e+039.1528913252e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.6255272647e+038.4115741602e+00 + 0.0000000000e+000.0000000000e+001.6504983389e-017.1562681607e+047.0586867442e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.6007124809e+045.4293260465e+01 + 0.0000000000e+000.0000000000e+009.6686541550e-027.0427054655e+046.7610729801e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.1854947850e+045.5646001325e+01 + 0.0000000000e+000.0000000000e+009.2119867550e-026.9530597010e+046.8474418605e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4386999157e+045.6298167331e+01 + 0.0000000000e+000.0000000000e+008.0651531931e-027.0299347010e+047.4209884053e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.2789013147e+046.3853792359e+01 + 0.0000000000e+000.0000000000e+001.5160575858e-016.9815001595e+046.9740642303e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4919612625e+045.6252646733e+01 + 0.0000000000e+000.0000000000e+009.0865620852e-026.2191663167e+046.6164178126e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.9410606900e+045.2567206882e+01 + 0.0000000000e+000.0000000000e+001.5115765696e-016.8320510066e+045.7628961592e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.2151690453e+044.1229601696e+01 + 0.0000000000e+000.0000000000e+007.9386543918e-024.9908822882e+013.4105610561e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4315269527e+012.7760176018e-01 + 0.0000000000e+000.0000000000e+007.8955184992e-025.0363562077e+013.4672062272e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4504475638e+012.7831520323e-01 + 0.0000000000e+000.0000000000e+006.9720449019e-025.0046120846e+013.4637459470e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5314084737e+012.8888096375e-01 + 0.0000000000e+000.0000000000e+007.2145214521e-024.6901650165e+013.1458745875e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2703630363e+012.6050605061e-01 + 0.0000000000e+000.0000000000e+007.0460092062e-024.8917623762e+013.3089108911e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3419141914e+012.6924092409e-01 + 0.0000000000e+000.0000000000e+007.5039191419e-024.6467986799e+013.0769903306e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1695049505e+012.4761276128e-01 + 0.0000000000e+000.0000000000e+007.3507748126e-024.6093508914e+013.0768474198e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1938425901e+012.4900110375e-01 + 0.0000000000e+000.0000000000e+007.6128476821e-025.1216123841e+013.6697866078e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.6055526024e+012.9806009598e-01 + 0.0000000000e+000.0000000000e+006.7735148515e-024.8230810390e+013.3078404551e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3189072848e+012.6490066225e-01 + 0.0000000000e+000.0000000000e+007.3090033223e-025.1014950351e+013.5464008859e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5704983389e+012.9320044297e-01 + 0.0000000000e+000.0000000000e+006.8418272425e-025.1271666667e+013.4953355482e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5695012772e+012.9311568845e-01 + 0.0000000000e+000.0000000000e+005.8654042082e-024.9825807494e+013.5042919897e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5558385456e+012.9255695829e-01 + 0.0000000000e+000.0000000000e+001.6810631229e-024.8183057364e+013.2682170543e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3247508306e+012.6358803987e-01 + 0.0000000000e+000.0000000000e+002.0000000000e-033.3378363907e+021.6074039735e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+006.9423749338e+021.4138841060e+00 + 0.0000000000e+000.0000000000e+004.5756895705e-022.4898365497e+021.2634126862e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+001.7502953378e+029.0218972080e-01 + 0.0000000000e+000.0000000000e+001.3650055371e-016.5944890030e+045.3069231266e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8114573548e+033.4944573643e+01 + 0.0000000000e+000.0000000000e+001.4617940199e-016.6813764481e+045.6040398671e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+009.9446629232e+033.9275927667e+01 + 0.0000000000e+000.0000000000e+001.3661129568e-016.9919397243e+046.5200948714e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.4296411140e+045.1581925150e+01 + 0.0000000000e+000.0000000000e+006.8696990821e-026.8744021053e+045.9431158807e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5786015103e+044.2670652032e+01 + 0.0000000000e+000.0000000000e+006.9616336634e-026.8150344081e+046.1438448845e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.5817284455e+044.4290792079e+01 + 0.0000000000e+000.0000000000e+007.8212403101e-026.9688306878e+047.5469768217e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+002.8710791838e+046.5082234884e+01 + 0.0000000000e+000.0000000000e+001.3757475083e-018.8614229236e+023.5031229236e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+002.0029852159e+033.3278073090e+00 + 0.0000000000e+000.0000000000e+007.4462901440e-025.1811832082e+013.5946422154e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5058032377e+012.8357071376e-01 + 0.0000000000e+000.0000000000e+007.4772978959e-024.7099008639e+013.1855298380e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1987543692e+012.5017220010e-01 + 0.0000000000e+000.0000000000e+007.7442192691e-024.7898671096e+013.2475083056e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2216611296e+012.5198228128e-01 + 0.0000000000e+000.0000000000e+007.0549723145e-024.9458841085e+013.3838316722e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3607308970e+012.6851572536e-01 + 0.0000000000e+000.0000000000e+007.4942245495e-024.9582591362e+013.3608877815e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3827973237e+012.7286415652e-01 + 0.0000000000e+000.0000000000e+007.6367663344e-024.9242026578e+013.3556674025e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2879644966e+012.5915055188e-01 + 0.0000000000e+000.0000000000e+006.7596312512e-026.3245315556e+023.7072100074e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.5203125063e+023.1132856512e+00 + 0.0000000000e+000.0000000000e+007.9207920792e-026.7477360170e+024.1660891089e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0228612559e+023.5501585027e+00 + 0.0000000000e+000.0000000000e+007.7976810839e-026.8617420242e+024.2072497250e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0871580858e+023.6113201320e+00 + 0.0000000000e+000.0000000000e+006.2581820682e-026.8354411441e+024.2158415842e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0798930693e+023.6176897690e+00 + 0.0000000000e+000.0000000000e+007.3563705055e-024.7907973422e+013.1947496571e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3069767442e+012.6245847176e-01 + 0.0000000000e+000.0000000000e+007.1029457364e-024.7907973422e+013.1035525438e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.3069767442e+012.6016479285e-01 + 0.0000000000e+000.0000000000e+006.0660066007e-025.0037619130e+013.4629147125e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5266336634e+012.8987475083e-01 + 0.0000000000e+000.0000000000e+006.2354235424e-024.8023107738e+013.2640046899e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.2834585070e+012.6044815008e-01 + 0.0000000000e+000.0000000000e+001.4692982456e-034.6737718647e+013.1893564356e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1821860561e+012.4971534653e-01 + 0.0000000000e+000.0000000000e+003.8445798772e-039.1150797342e+016.6336670260e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+006.7405116279e+014.8029900332e-01 + + + + AVERAGE + 288 + + + 5.0000000000e-01 + + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 1.2362239508e-01 + 7.7442192691e-02 + 1.3351140642e+01 + 0 + + + 2.1092044177e+04 + 4.9458841085e+01 + 7.2509169225e+04 + 0 + + + 2.4530578705e+01 + 3.3838316722e-01 + 4.7655903654e+02 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + NaN + NaN + NaN + 160 + + + 1.7974537037e-02 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 1.5501621744e+04 + 4.4053214064e+01 + 2.6738366547e+05 + 0 + + + 2.1759790986e+01 + 2.6851572536e-01 + 4.5855998893e+02 + 0 + + + + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + 0.0000000000e+000.0000000000e+001.3921173214e-016.9137504171e+023.8134580236e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8917298570e+034.2698000299e+00 + 0.0000000000e+000.0000000000e+001.0137319128e-019.0800162893e+026.2630953036e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.5991369825e+037.4280770018e+00 + 0.0000000000e+000.0000000000e+001.2197670612e-011.0428830529e+036.0494018640e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+007.2084664956e+037.3490898406e+00 + 0.0000000000e+000.0000000000e+001.2278952984e-018.0229655821e+024.3076270646e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8165167691e+034.8258314303e+00 + 0.0000000000e+000.0000000000e+004.2839753899e-021.4931225526e+031.6999622062e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.0431542914e+042.0914358307e+01 + 0.0000000000e+000.0000000000e+004.2864911714e-025.1723990942e+023.1694368576e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+003.1485797188e+022.7013854902e+00 + 0.0000000000e+000.0000000000e+005.3496677741e-025.0991803348e+023.7552356343e+000.0000000000e+00NaN0.0000000000e+000.0000000000e+004.5762066534e+034.2637447705e+00 + 0.0000000000e+000.0000000000e+008.9578672993e-021.6343420769e+042.0009242971e+010.0000000000e+00NaN1.2731481481e-040.0000000000e+001.2623698153e+041.7966550250e+01 + 0.0000000000e+000.0000000000e+009.0231817677e-023.2492485625e+043.5927452688e+010.0000000000e+00NaN5.7870370370e-050.0000000000e+001.7180047917e+043.0099063204e+01 + 0.0000000000e+000.0000000000e+001.2362239508e-012.1092044177e+042.4530578705e+010.0000000000e+00NaN1.7974537037e-020.0000000000e+001.5501621744e+042.1759790986e+01 + + + + MAX + 288 + + + 5.0000000000e-01 + + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 1.1207648579e+00 + 7.7442192691e-02 + 4.1598864711e-01 + 0 + + + 7.6553554613e+04 + 4.9458841085e+01 + 3.7249215834e+03 + 0 + + + 1.3688637324e+02 + 3.3838316722e-01 + 5.0663593451e+01 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + NaN + NaN + NaN + 160 + + + 1.6476716232e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 1.9063165035e+05 + 4.4053214064e+01 + 1.0194469089e+05 + 0 + + + 1.4831901278e+02 + 2.6851572536e-01 + 6.8574964898e+01 + 0 + + + + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + 0.0000000000e+000.0000000000e+001.0837468155e+009.2456076412e+034.6984389946e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+008.7718432197e+046.6323041659e+01 + 0.0000000000e+000.0000000000e+003.4883720930e-011.0832143674e+046.6023244740e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.4110933960e+059.4101417497e+01 + 0.0000000000e+000.0000000000e+008.9232123212e-019.8683307973e+038.4868748616e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7050259927e+048.3184613100e+01 + 0.0000000000e+000.0000000000e+001.1624584718e+002.2010289285e+043.7876943522e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+007.7461525692e+046.0270143965e+01 + 0.0000000000e+000.0000000000e+004.2574257426e-012.5271177671e+041.0051023102e+020.0000000000e+00NaN0.0000000000e+000.0000000000e+001.9070288053e+051.2620099010e+02 + 0.0000000000e+000.0000000000e+003.5162410978e-011.6797376966e+031.0271023102e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.1029733807e+038.7618493909e+00 + 0.0000000000e+000.0000000000e+004.2760620155e-012.1183478616e+049.7318405316e+010.0000000000e+00NaN0.0000000000e+000.0000000000e+001.8441059049e+051.2621106312e+02 + 0.0000000000e+000.0000000000e+008.8528888889e-017.0974559322e+041.0408450151e+020.0000000000e+00NaN3.0088593577e-020.0000000000e+001.8112010005e+051.2107390904e+02 + 0.0000000000e+000.0000000000e+008.4357777778e-017.5388368896e+041.2030608550e+020.0000000000e+00NaN1.0797342193e-020.0000000000e+001.1716532053e+051.1270526269e+02 + 0.0000000000e+000.0000000000e+001.1207648579e+007.6553554613e+041.3688637324e+020.0000000000e+00NaN1.6476716232e+000.0000000000e+001.9063165035e+051.4831901278e+02 + + + + MIN + 288 + + + 5.0000000000e-01 + + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 2.0000000000e-03 + 7.7442192691e-02 + 1.4692982456e-03 + 0 + + + 4.6093508914e+01 + 4.9458841085e+01 + 4.6737718647e+01 + 0 + + + 3.0768474198e-01 + 3.3838316722e-01 + 3.1035525438e-01 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + NaN + NaN + NaN + 160 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 0.0000000000e+00 + 0.0000000000e+00 + 0.0000000000e+00 + 0 + + + 4.1695049505e+01 + 4.4053214064e+01 + 4.1821860561e+01 + 0 + + + 2.4761276128e-01 + 2.6851572536e-01 + 2.4971534653e-01 + 0 + + + + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN + 0.0000000000e+000.0000000000e+003.7603458425e-024.5324496124e+012.6962223053e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0892189219e+012.3432343234e-01 + 0.0000000000e+000.0000000000e+001.1069613430e-024.5762358804e+012.7966777409e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0802720167e+012.3722511725e-01 + 0.0000000000e+000.0000000000e+002.7131782946e-024.3775267442e+012.6853488372e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+003.8788958915e+012.3222015504e-01 + 0.0000000000e+000.0000000000e+001.7259278559e-024.4498437844e+012.7765112038e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0693861386e+012.3445544554e-01 + 0.0000000000e+000.0000000000e+001.1410094957e-024.2638423332e+012.9108910891e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0696369637e+012.3454345435e-01 + 0.0000000000e+000.0000000000e+001.1125167763e-024.2316102498e+012.8210270401e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1173927520e+012.3867109635e-01 + 0.0000000000e+000.0000000000e+008.5796909492e-034.1429093929e+012.8061548260e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0059640040e+012.2702018557e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+004.1466666667e+012.8279698402e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.0657033212e+012.3320431711e-01 + 0.0000000000e+000.0000000000e+000.0000000000e+004.9908822882e+013.4105610561e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.4315269527e+012.7760176018e-01 + 0.0000000000e+000.0000000000e+002.0000000000e-034.6093508914e+013.0768474198e-010.0000000000e+00NaN0.0000000000e+000.0000000000e+004.1695049505e+012.4761276128e-01 + + + diff --git a/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-tempA.xml b/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-tempA.xml new file mode 100644 index 000000000000..80e19adfb0ab --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-tempA.xml @@ -0,0 +1,91 @@ + + + + + 0003 + 300 + 1381503600 + + + temp + GAUGE + 600 + -2.7300000000e+02 + 5.0000000000e+03 + + + 3 + 0.0000000000e+00 + 0 + + + + + AVERAGE + 1 + + + 5.0000000000e-01 + + + + 3.0000000000e+00 + 0.0000000000e+00 + NaN + 0 + + + + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + -1.0000000000e+01 + -9.0000000000e+00 + -8.0000000000e+00 + -7.0000000000e+00 + -6.0000000000e+00 + -5.0000000000e+00 + -4.0000000000e+00 + -3.0000000000e+00 + -2.0000000000e+00 + -1.0000000000e+00 + 0.0000000000e+00 + 1.0000000000e+00 + 2.0000000000e+00 + 3.0000000000e+00 + + + diff --git a/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-tempB.xml b/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-tempB.xml new file mode 100644 index 000000000000..f8dd1a625e8d --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-tempB.xml @@ -0,0 +1,91 @@ + + + + + 0003 + 300 + 1381514100 + + + temp + GAUGE + 600 + -2.7300000000e+02 + 5.0000000000e+03 + + + 18 + 0.0000000000e+00 + 0 + + + + + AVERAGE + 1 + + + 5.0000000000e-01 + + + + 1.8000000000e+01 + NaN + NaN + 0 + + + + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + NaN + 5.0000000000e+00 + 6.0000000000e+00 + 7.0000000000e+00 + 8.0000000000e+00 + 9.0000000000e+00 + 1.0000000000e+01 + 1.1000000000e+01 + 1.2000000000e+01 + 1.3000000000e+01 + 1.4000000000e+01 + 1.5000000000e+01 + 1.6000000000e+01 + 1.7000000000e+01 + 1.8000000000e+01 + + + diff --git a/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-xport.xml b/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-xport.xml new file mode 100644 index 000000000000..7390b42a4fb7 --- /dev/null +++ b/opennms-rrd/opennms-rrd-model/src/test/resources/rrd-xport.xml @@ -0,0 +1,28 @@ + + + + 1206312900 + 300 + 1206316500 + 13 + 1 + + load average 5min + + + + 12063129001.9860000000e+01 + 1206313200NaN + 1206313500NaN + 12063138002.6000000000e+01 + 12063141002.1983333333e+01 + 12063144003.9480000000e+01 + 12063147004.5730000000e+01 + 12063150004.1146666667e+01 + 12063153003.8346666667e+01 + 12063156003.4950000000e+01 + 12063159003.7560000000e+01 + 12063162004.7846666667e+01 + 1206316500NaN + + diff --git a/opennms-rrd/opennms-rrd-model/src/test/resources/tempA.jrb b/opennms-rrd/opennms-rrd-model/src/test/resources/tempA.jrb new file mode 100644 index 000000000000..23ed21d83a15 Binary files /dev/null and b/opennms-rrd/opennms-rrd-model/src/test/resources/tempA.jrb differ diff --git a/opennms-rrd/opennms-rrd-model/src/test/resources/tempB.jrb b/opennms-rrd/opennms-rrd-model/src/test/resources/tempB.jrb new file mode 100644 index 000000000000..a1c7011913ca Binary files /dev/null and b/opennms-rrd/opennms-rrd-model/src/test/resources/tempB.jrb differ diff --git a/opennms-rrd/pom.xml b/opennms-rrd/pom.xml index f941f9a5f1d0..36f89e06a7fc 100644 --- a/opennms-rrd/pom.xml +++ b/opennms-rrd/pom.xml @@ -14,6 +14,7 @@ opennms-rrd-jrobin opennms-rrd-rrdtool opennms-rrd-tcp + opennms-rrd-model diff --git a/opennms-services/src/main/java/org/opennms/netmgt/collectd/JMXCollector.java b/opennms-services/src/main/java/org/opennms/netmgt/collectd/JMXCollector.java index c38784b00f6e..f89476dfdd91 100644 --- a/opennms-services/src/main/java/org/opennms/netmgt/collectd/JMXCollector.java +++ b/opennms-services/src/main/java/org/opennms/netmgt/collectd/JMXCollector.java @@ -50,6 +50,7 @@ import javax.management.openmbean.CompositeData; import org.opennms.core.db.DataSourceFactory; +import org.opennms.core.utils.AlphaNumeric; import org.opennms.core.utils.InetAddressUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -298,8 +299,8 @@ public CollectionSet collect(CollectionAgent agent, EventProxy eproxy, Map mbeans = nodeInfo.getMBeans(); String collDir = serviceName; - + boolean useMbeanForRrds = ParameterMap.getKeyedBoolean(map, "use-mbean-name-for-rrds", false); String port = ParameterMap.getKeyedString(map, "port", null); String friendlyName = ParameterMap.getKeyedString(map,"friendly-name", port); if (useFriendlyName) { @@ -333,10 +334,12 @@ public CollectionSet collect(CollectionAgent agent, EventProxy eproxy, Map iter = mbeans.values().iterator(); iter.hasNext();) { BeanInfo beanInfo = iter.next(); + String mbeanName = beanInfo.getMbeanName(); String objectName = beanInfo.getObjectName(); String excludeList = beanInfo.getExcludes(); //All JMX collected values are per node - AttributeGroupType attribGroupType=new AttributeGroupType(fixGroupName(objectName),"all"); + String obj = useMbeanForRrds ? mbeanName : objectName; + AttributeGroupType attribGroupType=new AttributeGroupType(fixGroupName(obj),"all"); List attribNames = beanInfo.getAttributeNames(); List compAttribNames = beanInfo.getCompositeAttributeNames(); @@ -511,7 +514,7 @@ private String fixGroupName(String objectName) { if (objectName == null) { return "NULL"; } - return objectName.replaceAll("[.:=,\\s]", "_"); + return AlphaNumeric.parseAndReplace(objectName, '_'); } /* diff --git a/opennms-services/src/main/java/org/opennms/netmgt/threshd/AbstractThresholdEvaluatorState.java b/opennms-services/src/main/java/org/opennms/netmgt/threshd/AbstractThresholdEvaluatorState.java index b91f116f83d2..8671be242342 100644 --- a/opennms-services/src/main/java/org/opennms/netmgt/threshd/AbstractThresholdEvaluatorState.java +++ b/opennms-services/src/main/java/org/opennms/netmgt/threshd/AbstractThresholdEvaluatorState.java @@ -35,7 +35,6 @@ import java.util.Map; import org.opennms.core.utils.InetAddressUtils; -import org.opennms.netmgt.model.OnmsResource; import org.opennms.netmgt.model.events.EventBuilder; import org.opennms.netmgt.xml.event.Event; import org.slf4j.Logger; @@ -114,17 +113,7 @@ protected Event createBasicEvent(String uei, Date date, double dsValue, Collecti bldr.addParam("instanceLabel", resource.getInstanceLabel() == null ? "null" : resource.getInstanceLabel()); // Add the resource ID required to call the Graph API. - // Inspired by DefaultKscReportService - String resourceType = resource.getResourceTypeName(); - String resourceLabel = resource.getInstanceLabel(); - if ("node".equals(resourceType)) { - resourceType = "nodeSnmp"; - resourceLabel = ""; - } - if ("if".equals(resourceType)) { - resourceType = "interfaceSnmp"; - } - bldr.addParam("resourceId", OnmsResource.createResourceId("node", Integer.toString(resource.getNodeId()), resourceType, resourceLabel)); + bldr.addParam("resourceId",resource.getResourceId()); // Add additional parameters if (additionalParams != null) { diff --git a/opennms-services/src/main/java/org/opennms/netmgt/threshd/CollectionResourceWrapper.java b/opennms-services/src/main/java/org/opennms/netmgt/threshd/CollectionResourceWrapper.java index 5fa2b33aed6a..535908a29452 100644 --- a/opennms-services/src/main/java/org/opennms/netmgt/threshd/CollectionResourceWrapper.java +++ b/opennms-services/src/main/java/org/opennms/netmgt/threshd/CollectionResourceWrapper.java @@ -38,7 +38,9 @@ import org.opennms.netmgt.collectd.IfInfo; import org.opennms.netmgt.config.collector.CollectionAttribute; import org.opennms.netmgt.config.collector.CollectionResource; +import org.opennms.netmgt.dao.support.DefaultResourceDao; import org.opennms.netmgt.dao.support.ResourceTypeUtils; +import org.opennms.netmgt.model.OnmsResource; import org.opennms.netmgt.model.RrdRepository; import org.opennms.netmgt.poller.LatencyCollectionResource; import org.slf4j.Logger; @@ -244,7 +246,36 @@ public String getInstanceLabel() { public String getResourceTypeName() { return m_resource != null ? m_resource.getResourceTypeName() : null; } - + + /** + *

getResourceId

+ *

Inspired by DefaultKscReportService

+ * + * @return a {@link java.lang.String} object. + */ + public String getResourceId() { + String resourceType = getResourceTypeName(); + String resourceLabel = getInstanceLabel(); + if ("node".equals(resourceType)) { + resourceType = "nodeSnmp"; + resourceLabel = ""; + } + if ("if".equals(resourceType)) { + resourceType = "interfaceSnmp"; + } + String parentResourceTypeName = "node"; + String parentResourceName = Integer.toString(getNodeId()); + // I can't find a better way to deal with this when storeByForeignSource is enabled + if (m_resource != null && m_resource.getParent() != null && m_resource.getParent().startsWith(DefaultResourceDao.FOREIGN_SOURCE_DIRECTORY)) { + String[] parts = m_resource.getParent().split(File.separator); + if (parts.length == 3) { + parentResourceTypeName = "nodeSource"; + parentResourceName = parts[1] + ":" + parts[2]; + } + } + return OnmsResource.createResourceId(parentResourceTypeName, parentResourceName, resourceType, resourceLabel); + } + /** *

getIfLabel

* @@ -434,10 +465,10 @@ public String getFieldValue(String ds) { value = ResourceTypeUtils.getStringProperty(resourceDirectory, ds); } } catch (Throwable e) { - LOG.info("getLabelValue: Can't get value for attribute {} for resource {}.", ds, m_resource, e); + LOG.info("getFieldValue: Can't get value for attribute {} for resource {}.", ds, m_resource, e); } if (value == null) { - LOG.debug("getLabelValue: The field {} is not a string property. Trying to parse it as numeric metric.", ds); + LOG.debug("getFieldValue: The field {} is not a string property. Trying to parse it as numeric metric.", ds); Double d = getAttributeValue(ds); if (d != null) value = d.toString(); diff --git a/opennms-services/src/test/java/org/opennms/netmgt/threshd/CollectionResourceWrapperTest.java b/opennms-services/src/test/java/org/opennms/netmgt/threshd/CollectionResourceWrapperTest.java index 9f044d4417a9..ba1775cfaf73 100644 --- a/opennms-services/src/test/java/org/opennms/netmgt/threshd/CollectionResourceWrapperTest.java +++ b/opennms-services/src/test/java/org/opennms/netmgt/threshd/CollectionResourceWrapperTest.java @@ -67,6 +67,7 @@ import org.opennms.netmgt.config.datacollection.PersistenceSelectorStrategy; import org.opennms.netmgt.config.datacollection.ResourceType; import org.opennms.netmgt.config.datacollection.StorageStrategy; +import org.opennms.netmgt.dao.support.DefaultResourceDao; import org.opennms.netmgt.mock.MockDataCollectionConfig; import org.opennms.netmgt.mock.MockNetwork; import org.opennms.netmgt.model.OnmsNode; @@ -361,20 +362,25 @@ public void testInterfaceResource() throws Exception { db.update("update snmpinterface set snmpifindex=?, snmpifname=?, snmpifdescr=? where id=?", ifIndex, ifName, ifName, 1); DataSourceFactory.setInstance(db); Vault.setDataSource(db); - + + // Create Mock Collection Agent + CollectionAgent agent = createCollectionAgent(); + // Create SnmpIfData OnmsNode node = new OnmsNode(); - node.setId(1); + node.setId(agent.getNodeId()); node.setLabel("testNode"); + node.setForeignSource(agent.getForeignSource()); + node.setForeignId(agent.getForeignId()); OnmsSnmpInterface snmpIface = new OnmsSnmpInterface(node, ifIndex); snmpIface.setIfDescr(ifName); snmpIface.setIfName(ifName); snmpIface.setIfAlias(ifName); snmpIface.setIfSpeed(10000000l); + snmpIface.setPhysAddr("001122334455"); SnmpIfData ifData = new SnmpIfData(snmpIface); // Creating IfResourceType - CollectionAgent agent = createCollectionAgent(); MockDataCollectionConfig dataCollectionConfig = new MockDataCollectionConfig(); OnmsSnmpCollection collection = new OnmsSnmpCollection(agent, new ServiceParameters(new HashMap()), dataCollectionConfig); IfResourceType resourceType = new IfResourceType(agent, collection); @@ -391,7 +397,7 @@ public void testInterfaceResource() throws Exception { // Validations Assert.assertEquals(node.getId().intValue(), wrapper.getNodeId()); Assert.assertEquals("127.0.0.1", wrapper.getHostAddress()); // Should be the address of the SNMP Agent (Bug 3808) - Assert.assertEquals("eth0", wrapper.getIfLabel()); + Assert.assertEquals("eth0-001122334455", wrapper.getIfLabel()); Assert.assertEquals("if", wrapper.getResourceTypeName()); Assert.assertEquals("SNMP", wrapper.getServiceName()); Assert.assertEquals(true, wrapper.isAnInterfaceResource()); @@ -400,7 +406,8 @@ public void testInterfaceResource() throws Exception { Assert.assertEquals(Integer.toString(ifIndex), wrapper.getIfIndex()); // IfLabel is called only once Assert.assertEquals(Integer.toString(ifIndex), wrapper.getIfIndex()); // IfLabel is called only once Assert.assertEquals("eth0", wrapper.getIfInfoValue("snmpifname")); // IfLabel is called only once - Assert.assertEquals("eth0", wrapper.getInstanceLabel()); + Assert.assertEquals("eth0-001122334455", wrapper.getInstanceLabel()); + Assert.assertEquals("nodeSource[JUnit%3AT001].interfaceSnmp[eth0-001122334455]", wrapper.getResourceId()); } @Test @@ -433,6 +440,43 @@ public void testGenericResource() throws Exception { Assert.assertEquals("opt", wrapper.getInstanceLabel()); } + @Test + public void testNumericFields() throws Exception { + CollectionAgent agent = createCollectionAgent(); + MockDataCollectionConfig dataCollectionConfig = new MockDataCollectionConfig(); + OnmsSnmpCollection collection = new OnmsSnmpCollection(agent, new ServiceParameters(new HashMap()), dataCollectionConfig); + ResourceType rt = new ResourceType(); + rt.setName("dskIndex"); + rt.setLabel("Disk Table Index (UCD-SNMP MIB)"); + StorageStrategy strategy = new StorageStrategy(); + strategy.setClazz("org.opennms.netmgt.dao.support.SiblingColumnStorageStrategy"); + strategy.addParameter(new Parameter("sibling-column-name", "ns-dskPath")); + strategy.addParameter(new Parameter("replace-first", "s/^-$/_root_fs/")); + strategy.addParameter(new Parameter("replace-all", "s/^-//")); + strategy.addParameter(new Parameter("replace-all", "s/\\s//")); + strategy.addParameter(new Parameter("replace-all","s/:\\\\.*//")); + rt.setStorageStrategy(strategy); + PersistenceSelectorStrategy pstrategy = new PersistenceSelectorStrategy(); + pstrategy.setClazz("org.opennms.netmgt.collectd.PersistAllSelectorStrategy"); + rt.setPersistenceSelectorStrategy(pstrategy); + + GenericIndexResourceType resourceType = new GenericIndexResourceType(agent, collection, rt); + + SnmpCollectionResource resource = new GenericIndexResource(resourceType, resourceType.getName(), new SnmpInstId(100)); + SnmpAttribute total = addAttributeToCollectionResource(resource, "ns-dskTotal", "gauge", "dskIndex", "10000"); + SnmpAttribute used = addAttributeToCollectionResource(resource, "ns-dskUsed", "gauge", "dskIndex", "5000"); + SnmpAttribute label = addAttributeToCollectionResource(resource, "ns-dskPath", "string", "dskIndex", "/opt"); + Map attributes = new HashMap(); + attributes.put(used.getName(), used); + attributes.put(total.getName(), total); + attributes.put(label.getName(), label); + + CollectionResourceWrapper wrapper = createWrapper(resource, attributes); + Assert.assertEquals("opt", wrapper.getInstanceLabel()); + Assert.assertEquals(new Double("10000.0"), wrapper.getAttributeValue(total.getName())); + Assert.assertEquals("10000.0", wrapper.getFieldValue(total.getName())); + } + private SnmpCollectionResource createNodeResource(CollectionAgent agent) { MockDataCollectionConfig dataCollectionConfig = new MockDataCollectionConfig(); OnmsSnmpCollection collection = new OnmsSnmpCollection(agent, new ServiceParameters(new HashMap()), dataCollectionConfig); @@ -455,7 +499,9 @@ private CollectionAgent createCollectionAgent() { EasyMock.expect(agent.getNodeId()).andReturn(1).anyTimes(); EasyMock.expect(agent.getHostAddress()).andReturn("127.0.0.1").anyTimes(); EasyMock.expect(agent.getSnmpInterfaceInfo((IfResourceType)EasyMock.anyObject())).andReturn(new HashSet()).anyTimes(); - EasyMock.expect(agent.getStorageDir()).andReturn(new File("target/snmp/rrd")).anyTimes(); + EasyMock.expect(agent.getForeignSource()).andReturn("JUnit").anyTimes(); + EasyMock.expect(agent.getForeignId()).andReturn("T001").anyTimes(); + EasyMock.expect(agent.getStorageDir()).andReturn(new File(DefaultResourceDao.FOREIGN_SOURCE_DIRECTORY + File.separator + "JUnit" + File.separator + "T001")).anyTimes(); EasyMock.replay(agent); return agent; } diff --git a/opennms-qosdaemon/LICENSE.txt b/opennms-tools/opennms-qosdaemon/LICENSE.txt similarity index 100% rename from opennms-qosdaemon/LICENSE.txt rename to opennms-tools/opennms-qosdaemon/LICENSE.txt diff --git a/opennms-qosdaemon/pom.xml b/opennms-tools/opennms-qosdaemon/pom.xml similarity index 100% rename from opennms-qosdaemon/pom.xml rename to opennms-tools/opennms-qosdaemon/pom.xml diff --git a/opennms-import/src/assembly/xsds.xml b/opennms-tools/opennms-qosdaemon/src/assembly/xsds.xml similarity index 100% rename from opennms-import/src/assembly/xsds.xml rename to opennms-tools/opennms-qosdaemon/src/assembly/xsds.xml diff --git a/opennms-qosdaemon/src/main/castor/QoSDConfiguration.xsd b/opennms-tools/opennms-qosdaemon/src/main/castor/QoSDConfiguration.xsd similarity index 100% rename from opennms-qosdaemon/src/main/castor/QoSDConfiguration.xsd rename to opennms-tools/opennms-qosdaemon/src/main/castor/QoSDConfiguration.xsd diff --git a/opennms-qosdaemon/src/main/castor/castorbuilder.properties b/opennms-tools/opennms-qosdaemon/src/main/castor/castorbuilder.properties similarity index 100% rename from opennms-qosdaemon/src/main/castor/castorbuilder.properties rename to opennms-tools/opennms-qosdaemon/src/main/castor/castorbuilder.properties diff --git a/opennms-qosdaemon/src/main/etc/QoSD-configuration.xml b/opennms-tools/opennms-qosdaemon/src/main/etc/QoSD-configuration.xml similarity index 100% rename from opennms-qosdaemon/src/main/etc/QoSD-configuration.xml rename to opennms-tools/opennms-qosdaemon/src/main/etc/QoSD-configuration.xml diff --git a/opennms-qosdaemon/src/main/etc/qosd.properties b/opennms-tools/opennms-qosdaemon/src/main/etc/qosd.properties similarity index 100% rename from opennms-qosdaemon/src/main/etc/qosd.properties rename to opennms-tools/opennms-qosdaemon/src/main/etc/qosd.properties diff --git a/opennms-qosdaemon/src/main/etc/qosdrx.properties b/opennms-tools/opennms-qosdaemon/src/main/etc/qosdrx.properties similarity index 100% rename from opennms-qosdaemon/src/main/etc/qosdrx.properties rename to opennms-tools/opennms-qosdaemon/src/main/etc/qosdrx.properties diff --git a/opennms-qosdaemon/src/main/java/org/opennms/README.txt b/opennms-tools/opennms-qosdaemon/src/main/java/org/opennms/README.txt similarity index 100% rename from opennms-qosdaemon/src/main/java/org/opennms/README.txt rename to opennms-tools/opennms-qosdaemon/src/main/java/org/opennms/README.txt diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OnmsAlarmOssjMapper.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OnmsAlarmOssjMapper.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OnmsAlarmOssjMapper.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OnmsAlarmOssjMapper.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OssDao.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OssDao.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OssDao.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OssDao.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OssDaoOpenNMSImpl.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OssDaoOpenNMSImpl.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OssDaoOpenNMSImpl.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OssDaoOpenNMSImpl.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OssDaoOpenNMSImplSingleton.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OssDaoOpenNMSImplSingleton.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OssDaoOpenNMSImplSingleton.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/OssDaoOpenNMSImplSingleton.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/package.html b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/package.html similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/package.html rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/dao/package.html diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/AlarmListConnectionManager.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/AlarmListConnectionManager.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/AlarmListConnectionManager.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/AlarmListConnectionManager.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/OpenNMSEventHandlerThread.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/OpenNMSEventHandlerThread.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/OpenNMSEventHandlerThread.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/OpenNMSEventHandlerThread.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/PropertiesLoader.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/PropertiesLoader.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/PropertiesLoader.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/PropertiesLoader.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/QoSD.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/QoSD.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/QoSD.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/QoSD.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/QoSDConfigFactory.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/QoSDConfigFactory.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/QoSDConfigFactory.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/QoSDConfigFactory.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/QoSDimpl2.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/QoSDimpl2.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/QoSDimpl2.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/QoSDimpl2.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/UEIHandler.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/UEIHandler.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/UEIHandler.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/UEIHandler.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/ejb/AlarmListConnectionManagerJ2eeImpl.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/ejb/AlarmListConnectionManagerJ2eeImpl.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/ejb/AlarmListConnectionManagerJ2eeImpl.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/ejb/AlarmListConnectionManagerJ2eeImpl.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/ejb/AlarmListJ2eeConnectionManagerThread.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/ejb/AlarmListJ2eeConnectionManagerThread.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/ejb/AlarmListJ2eeConnectionManagerThread.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/ejb/AlarmListJ2eeConnectionManagerThread.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/ejb/package.html b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/ejb/package.html similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/ejb/package.html rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/ejb/package.html diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/jmx/QoSD.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/jmx/QoSD.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/jmx/QoSD.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/jmx/QoSD.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/jmx/QoSDMBean.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/jmx/QoSDMBean.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/jmx/QoSDMBean.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/jmx/QoSDMBean.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/jmx/package.html b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/jmx/package.html similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/jmx/package.html rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/jmx/package.html diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/package.html b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/package.html similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/package.html rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/package.html diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/spring/AlarmListConnectionManagerSpringImpl.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/spring/AlarmListConnectionManagerSpringImpl.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/spring/AlarmListConnectionManagerSpringImpl.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/spring/AlarmListConnectionManagerSpringImpl.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/spring/package.html b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/spring/package.html similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/spring/package.html rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosd/spring/package.html diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/QoSDrx.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/QoSDrx.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/QoSDrx.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/QoSDrx.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/QoSDrxAlarmEventReceiverEventHandlerImpl2.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/QoSDrxAlarmEventReceiverEventHandlerImpl2.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/QoSDrxAlarmEventReceiverEventHandlerImpl2.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/QoSDrxAlarmEventReceiverEventHandlerImpl2.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/QoSDrxAlarmEventReceiverEventHandlerImplShell.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/QoSDrxAlarmEventReceiverEventHandlerImplShell.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/QoSDrxAlarmEventReceiverEventHandlerImplShell.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/QoSDrxAlarmEventReceiverEventHandlerImplShell.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/jmx/QoSDrx.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/jmx/QoSDrx.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/jmx/QoSDrx.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/jmx/QoSDrx.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/jmx/QoSDrxMBean.java b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/jmx/QoSDrxMBean.java similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/jmx/QoSDrxMBean.java rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/jmx/QoSDrxMBean.java diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/jmx/package.html b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/jmx/package.html similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/jmx/package.html rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/jmx/package.html diff --git a/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/package.html b/opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/package.html similarity index 100% rename from opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/package.html rename to opennms-tools/opennms-qosdaemon/src/main/java/org/openoss/opennms/spring/qosdrx/package.html diff --git a/opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosd/ossjTypeSpecificationApplicationContext.xml b/opennms-tools/opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosd/ossjTypeSpecificationApplicationContext.xml similarity index 100% rename from opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosd/ossjTypeSpecificationApplicationContext.xml rename to opennms-tools/opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosd/ossjTypeSpecificationApplicationContext.xml diff --git a/opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosd/qosd-j2ee-context.xml b/opennms-tools/opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosd/qosd-j2ee-context.xml similarity index 100% rename from opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosd/qosd-j2ee-context.xml rename to opennms-tools/opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosd/qosd-j2ee-context.xml diff --git a/opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosd/qosd-spring-context.xml b/opennms-tools/opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosd/qosd-spring-context.xml similarity index 100% rename from opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosd/qosd-spring-context.xml rename to opennms-tools/opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosd/qosd-spring-context.xml diff --git a/opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosdrx/qosdrx-spring-context.xml b/opennms-tools/opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosdrx/qosdrx-spring-context.xml similarity index 100% rename from opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosdrx/qosdrx-spring-context.xml rename to opennms-tools/opennms-qosdaemon/src/main/resources/org/openoss/opennms/spring/qosdrx/qosdrx-spring-context.xml diff --git a/opennms-qosdaemon/src/site/resources/PackageOverview.html b/opennms-tools/opennms-qosdaemon/src/site/resources/PackageOverview.html similarity index 100% rename from opennms-qosdaemon/src/site/resources/PackageOverview.html rename to opennms-tools/opennms-qosdaemon/src/site/resources/PackageOverview.html diff --git a/opennms-qosdaemon/src/site/resources/faq.html b/opennms-tools/opennms-qosdaemon/src/site/resources/faq.html similarity index 100% rename from opennms-qosdaemon/src/site/resources/faq.html rename to opennms-tools/opennms-qosdaemon/src/site/resources/faq.html diff --git a/opennms-qosdaemon/src/site/resources/qosdaemon.html b/opennms-tools/opennms-qosdaemon/src/site/resources/qosdaemon.html similarity index 100% rename from opennms-qosdaemon/src/site/resources/qosdaemon.html rename to opennms-tools/opennms-qosdaemon/src/site/resources/qosdaemon.html diff --git a/opennms-qosdaemon/src/site/resources/usage.html b/opennms-tools/opennms-qosdaemon/src/site/resources/usage.html similarity index 100% rename from opennms-qosdaemon/src/site/resources/usage.html rename to opennms-tools/opennms-qosdaemon/src/site/resources/usage.html diff --git a/opennms-qosdaemon/src/site/site.xml b/opennms-tools/opennms-qosdaemon/src/site/site.xml similarity index 100% rename from opennms-qosdaemon/src/site/site.xml rename to opennms-tools/opennms-qosdaemon/src/site/site.xml diff --git a/opennms-qosdaemon/src/test/resources/org/openoss/opennms/spring/qosd/QoSDTest-context.xml b/opennms-tools/opennms-qosdaemon/src/test/resources/org/openoss/opennms/spring/qosd/QoSDTest-context.xml similarity index 100% rename from opennms-qosdaemon/src/test/resources/org/openoss/opennms/spring/qosd/QoSDTest-context.xml rename to opennms-tools/opennms-qosdaemon/src/test/resources/org/openoss/opennms/spring/qosd/QoSDTest-context.xml diff --git a/opennms-qosdaemon/src/test/resources/qosd.properties b/opennms-tools/opennms-qosdaemon/src/test/resources/qosd.properties similarity index 100% rename from opennms-qosdaemon/src/test/resources/qosd.properties rename to opennms-tools/opennms-qosdaemon/src/test/resources/qosd.properties diff --git a/opennms-qosdaemon/src/test/resources/qosdrx.properties b/opennms-tools/opennms-qosdaemon/src/test/resources/qosdrx.properties similarity index 100% rename from opennms-qosdaemon/src/test/resources/qosdrx.properties rename to opennms-tools/opennms-qosdaemon/src/test/resources/qosdrx.properties diff --git a/opennms-tools/pom.xml b/opennms-tools/pom.xml index 69684aa3fb3a..324794f6b227 100644 --- a/opennms-tools/pom.xml +++ b/opennms-tools/pom.xml @@ -11,6 +11,7 @@ OpenNMS Tools opennms-eventd-stresser + opennms-qosdaemon opennms-rrd-stresser opennms-rrd-converter groovy-tools diff --git a/opennms-util/pom.xml b/opennms-util/pom.xml index 6c64978c3617..30f39d19e0ff 100644 --- a/opennms-util/pom.xml +++ b/opennms-util/pom.xml @@ -29,13 +29,17 @@ dnsjava-dependencies pom
+ + commons-io + commons-io + xalan serializer - - org.opennms.core - org.opennms.core.lib - + + org.opennms.core + org.opennms.core.lib + diff --git a/opennms-webapp/src/main/java/org/opennms/web/controller/ChooseResourceController.java b/opennms-webapp/src/main/java/org/opennms/web/controller/ChooseResourceController.java index c721b22a2a48..7eb798ed81e7 100644 --- a/opennms-webapp/src/main/java/org/opennms/web/controller/ChooseResourceController.java +++ b/opennms-webapp/src/main/java/org/opennms/web/controller/ChooseResourceController.java @@ -32,6 +32,8 @@ import javax.servlet.http.HttpServletResponse; import org.opennms.core.utils.WebSecurityUtils; +import org.opennms.netmgt.dao.api.NodeDao; +import org.opennms.netmgt.model.OnmsNode; import org.opennms.netmgt.model.OnmsResource; import org.opennms.web.servlet.MissingParameterException; import org.opennms.web.svclayer.ChooseResourceService; @@ -51,6 +53,7 @@ public class ChooseResourceController extends AbstractController implements InitializingBean { private ChooseResourceService m_chooseResourceService; private String m_defaultEndUrl; + private NodeDao m_nodeDao; /** {@inheritDoc} */ @Override @@ -69,7 +72,20 @@ protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpSer if (request.getParameter("parentResource") == null) { throw new MissingParameterException("parentResource", requiredParameters); } - + if (resourceType.equals("node") && Boolean.getBoolean("org.opennms.rrd.storeByForeignSource")) { + OnmsNode node = m_nodeDao.get(resource); + if (node != null && node.getForeignSource() != null && node.getForeignId() != null) { + resourceType = "nodeSource"; + resource = node.getForeignSource() + ':' + node.getForeignId(); + } + } + if (resourceType.equals("nodeSource") && !Boolean.getBoolean("org.opennms.rrd.storeByForeignSource")) { + OnmsNode node = m_nodeDao.get(resource); + if (node != null && node.getForeignSource() != null && node.getForeignId() != null) { + resourceType = "node"; + resource = node.getId().toString(); + } + } resourceId = OnmsResource.createResourceId(resourceType, resource); } @@ -98,6 +114,10 @@ public void afterPropertiesSet() { if (m_defaultEndUrl == null) { throw new IllegalStateException("defaultEndUrl property not set"); } + + if (m_nodeDao == null) { + throw new IllegalStateException("nodeDao property not set"); + } } /** @@ -136,4 +156,23 @@ public String getDefaultEndUrl() { public void setDefaultEndUrl(String defaultEndUrl) { m_defaultEndUrl = defaultEndUrl; } + + /** + *

getNodeDao

+ * + * @return a {@link org.opennms.netmgt.dao.NodeDao} object. + */ + public NodeDao getNodeDao() { + return m_nodeDao; + } + + /** + *

setNodeDao

+ * + * @param nodeDao a {@link org.opennms.netmgt.dao.NodeDao} object. + */ + public void setNodeDao(NodeDao nodeDao) { + this.m_nodeDao = nodeDao; + } + } diff --git a/opennms-webapp/src/main/java/org/opennms/web/controller/NavBarController.java b/opennms-webapp/src/main/java/org/opennms/web/controller/NavBarController.java index 7f589ae6c161..913603b1545c 100644 --- a/opennms-webapp/src/main/java/org/opennms/web/controller/NavBarController.java +++ b/opennms-webapp/src/main/java/org/opennms/web/controller/NavBarController.java @@ -103,6 +103,9 @@ public String getHeaderHtml(HttpServletRequest request) { } private String createHeaderHtml(HttpServletRequest request) { + /** + * Added javascript snippet to hide the header if not displayed in a toplevel window (iFrame). + */ return "" + "
" + - ""; + ""; } private String getNoticeStatus() { diff --git a/opennms-webapp/src/main/java/org/opennms/web/element/ElementUtil.java b/opennms-webapp/src/main/java/org/opennms/web/element/ElementUtil.java index 486424d76a84..be6136a7d6e4 100644 --- a/opennms-webapp/src/main/java/org/opennms/web/element/ElementUtil.java +++ b/opennms-webapp/src/main/java/org/opennms/web/element/ElementUtil.java @@ -591,30 +591,29 @@ public static OnmsNode getNodeByParams(HttpServletRequest request, ServletContex *

getNodeByParams

* * @param request a {@link javax.servlet.http.HttpServletRequest} object. - * @param nodeIdParam a {@link java.lang.String} object. + * @param nodeLookupParam a {@link java.lang.String} object. * @return a {@link OnmsNode} object. * @throws javax.servlet.ServletException if any. * @throws java.sql.SQLException if any. */ public static OnmsNode getNodeByParams(HttpServletRequest request, - String nodeIdParam, ServletContext servletContext) throws ServletException, SQLException { - if (request.getParameter(nodeIdParam) == null) { - throw new MissingParameterException(nodeIdParam, new String[] { "node" }); + String nodeLookupParam, ServletContext servletContext) throws ServletException, SQLException { + if (request.getParameter(nodeLookupParam) == null) { + throw new MissingParameterException(nodeLookupParam, new String[] { "node" }); } - String nodeIdString = request.getParameter(nodeIdParam); - - int nodeId; - - try { - nodeId = Integer.parseInt(nodeIdString); - } catch (NumberFormatException e) { - throw new ElementIdNotFoundException("Wrong data type for \"" - + nodeIdParam + "\", should be integer", nodeIdString, - "node", "element/node.jsp", "node", "element/nodeList.htm"); + String nodeLookupString = request.getParameter(nodeLookupParam); + if (!nodeLookupString.contains(":")) { + try { + Integer.parseInt(nodeLookupString); + } catch (NumberFormatException e) { + throw new ElementIdNotFoundException("Wrong data type for \"" + + nodeLookupString + "\", should be integer", nodeLookupString, + "node", "element/node.jsp", "node", "element/nodeList.htm"); + } } - OnmsNode node = NetworkElementFactory.getInstance(servletContext).getNode(nodeId); + OnmsNode node = NetworkElementFactory.getInstance(servletContext).getNode(nodeLookupString); if (node == null) { throw new ElementNotFoundException("No such node in database", "node", "element/node.jsp", "node", "element/nodeList.htm"); diff --git a/opennms-webapp/src/main/java/org/opennms/web/element/NetworkElementFactory.java b/opennms-webapp/src/main/java/org/opennms/web/element/NetworkElementFactory.java index 20e9fe6b5831..a94aef8890d4 100644 --- a/opennms-webapp/src/main/java/org/opennms/web/element/NetworkElementFactory.java +++ b/opennms-webapp/src/main/java/org/opennms/web/element/NetworkElementFactory.java @@ -210,17 +210,15 @@ public String getIpPrimaryAddress(int nodeId) { */ @Override public OnmsNode getNode(int nodeId) { - OnmsCriteria criteria = new OnmsCriteria(OnmsNode.class); - criteria.add(Restrictions.eq("id",nodeId)); - - List nodes = m_nodeDao.findMatching(criteria); - if(nodes.size() > 0 ) { - OnmsNode onmsNode = nodes.get(0); - return onmsNode; - }else { - return null; - } + return m_nodeDao.get(nodeId); + } + /* (non-Javadoc) + * @see org.opennms.web.element.NetworkElementFactoryInterface#getNode(string) + */ + @Override + public OnmsNode getNode(String lookupCriteria) { + return m_nodeDao.get(lookupCriteria); } /* (non-Javadoc) diff --git a/opennms-webapp/src/main/java/org/opennms/web/element/NetworkElementFactoryInterface.java b/opennms-webapp/src/main/java/org/opennms/web/element/NetworkElementFactoryInterface.java index ab742ff3a8dc..87393047204f 100644 --- a/opennms-webapp/src/main/java/org/opennms/web/element/NetworkElementFactoryInterface.java +++ b/opennms-webapp/src/main/java/org/opennms/web/element/NetworkElementFactoryInterface.java @@ -50,8 +50,25 @@ public interface NetworkElementFactoryInterface { */ String getIpPrimaryAddress(int nodeId); + /** + * Get a node based on it's node ID + * + * @return a {@link OnmsNode} object + * + * @param nodeId an int + */ OnmsNode getNode(int nodeId); + /** + * Get a node based on it's node ID or foreignSource:foreignId + * + * @return a {@link OnmsNode} object + * + * + * @param lookupCriteria the criteria, either the node ID, or a colon-separated string of foreignSource:foreignId + */ + OnmsNode getNode(String lookupCriteria); + /** * Returns all non-deleted nodes. * diff --git a/opennms-webapp/src/main/java/org/opennms/web/svclayer/ResourceService.java b/opennms-webapp/src/main/java/org/opennms/web/svclayer/ResourceService.java index 0a844dc3bb7b..085701e711b6 100644 --- a/opennms-webapp/src/main/java/org/opennms/web/svclayer/ResourceService.java +++ b/opennms-webapp/src/main/java/org/opennms/web/svclayer/ResourceService.java @@ -31,6 +31,7 @@ import java.io.File; import java.util.List; +import org.opennms.netmgt.model.OnmsNode; import org.opennms.netmgt.model.OnmsResource; import org.opennms.netmgt.model.PrefabGraph; import org.springframework.transaction.annotation.Transactional; @@ -74,6 +75,13 @@ public interface ResourceService { * @return a {@link java.util.List} object. */ public List findNodeSourceResources(); + /** + *

findNodeChildResources

+ * + * @param node a {@link org.opennms.netmgt.model.OnmsNode} object. + * @return a {@link java.util.List} object. + */ + public List findNodeChildResources(OnmsNode node); /** *

findNodeChildResources

* diff --git a/opennms-webapp/src/main/java/org/opennms/web/svclayer/support/DefaultResourceService.java b/opennms-webapp/src/main/java/org/opennms/web/svclayer/support/DefaultResourceService.java index 015d65c2695a..366dae81fb0b 100644 --- a/opennms-webapp/src/main/java/org/opennms/web/svclayer/support/DefaultResourceService.java +++ b/opennms-webapp/src/main/java/org/opennms/web/svclayer/support/DefaultResourceService.java @@ -38,6 +38,7 @@ import org.opennms.netmgt.EventConstants; import org.opennms.netmgt.dao.api.GraphDao; import org.opennms.netmgt.dao.api.ResourceDao; +import org.opennms.netmgt.model.OnmsNode; import org.opennms.netmgt.model.OnmsResource; import org.opennms.netmgt.model.PrefabGraph; import org.opennms.netmgt.model.RrdGraphAttribute; @@ -174,6 +175,20 @@ public List findTopLevelResources() { /** {@inheritDoc} */ @Override + public List findNodeChildResources(OnmsNode node) { + List resources = new ArrayList(); + if (node != null) { + if (Boolean.getBoolean("org.opennms.rrd.storeByForeignSource")) { + String source = node.getForeignSource() + ':' + node.getForeignId(); + resources.addAll(findNodeSourceChildResources(source)); + } else { + resources.addAll(findNodeChildResources(node.getId())); + } + } + return resources; + } + + /** {@inheritDoc} */ public List findNodeChildResources(int nodeId) { List resources = new ArrayList(); OnmsResource resource = m_resourceDao.getResourceById(OnmsResource.createResourceId("node", Integer.toString(nodeId))); @@ -241,7 +256,7 @@ public List findChildResources(OnmsResource resource, String... re return matchingChildResources; } - + private static OnmsResource checkLabelForQuotes(OnmsResource childResource) { String lbl = Util.convertToJsSafeString(childResource.getLabel()); diff --git a/opennms-webapp/src/main/java/org/opennms/web/tags/FavoriteTag.java b/opennms-webapp/src/main/java/org/opennms/web/tags/FavoriteTag.java index 375272063054..86c1d4f9f67b 100644 --- a/opennms-webapp/src/main/java/org/opennms/web/tags/FavoriteTag.java +++ b/opennms-webapp/src/main/java/org/opennms/web/tags/FavoriteTag.java @@ -132,6 +132,8 @@ public String getJavascript(FavoriteTag favoriteTag) { */ private static final String IMG_TEMPLATE = new String("{3}"); + private static final String BUTTON_TEMPLATE = new String(""); + private static final String JAVASCRIPT_TEMPLATE = "\n"; private static final String CREATE_FAVORITE_JAVASCRIPT_TEMPLATE = @@ -263,18 +265,16 @@ public int doStartTag() throws JspException { private String getImageString() { if (getFavorite() != null) { return MessageFormat.format( - IMG_TEMPLATE, - getDeselectAction().getDescription(), + BUTTON_TEMPLATE, getDeselectAction().getJavascriptCallback(this), - "images/star_filled.png", - " " + getFavorite().getName()); + getDeselectAction().getDescription(), + "remove filter"); } return MessageFormat.format( - IMG_TEMPLATE, - getSelectAction().getDescription(), + BUTTON_TEMPLATE, getSelectAction().getJavascriptCallback(this), - "images/star_empty.png", - ""); + getSelectAction().getDescription(), + "add filter"); } /** diff --git a/opennms-webapp/src/main/webapp/WEB-INF/applicationContext-spring-security.xml b/opennms-webapp/src/main/webapp/WEB-INF/applicationContext-spring-security.xml index d3a9aae169a1..eb6ede385747 100644 --- a/opennms-webapp/src/main/webapp/WEB-INF/applicationContext-spring-security.xml +++ b/opennms-webapp/src/main/webapp/WEB-INF/applicationContext-spring-security.xml @@ -34,7 +34,7 @@ - + @@ -68,10 +68,13 @@ - + - + + + + @@ -81,8 +84,28 @@ + + + + + + + + + + + + + + + + + + + - + diff --git a/opennms-webapp/src/main/webapp/WEB-INF/dispatcher-servlet.xml b/opennms-webapp/src/main/webapp/WEB-INF/dispatcher-servlet.xml index b63048febf12..9e6cddce93c3 100644 --- a/opennms-webapp/src/main/webapp/WEB-INF/dispatcher-servlet.xml +++ b/opennms-webapp/src/main/webapp/WEB-INF/dispatcher-servlet.xml @@ -607,6 +607,7 @@ + graph/results.htm diff --git a/opennms-webapp/src/main/webapp/WEB-INF/jsp/alarm/list.jsp b/opennms-webapp/src/main/webapp/WEB-INF/jsp/alarm/list.jsp index 98beb54c7e42..fa722300a45c 100644 --- a/opennms-webapp/src/main/webapp/WEB-INF/jsp/alarm/list.jsp +++ b/opennms-webapp/src/main/webapp/WEB-INF/jsp/alarm/list.jsp @@ -240,20 +240,10 @@ - - <% if( alarmCount > 0 ) { %> - <% String baseUrl = this.makeLink(callback, parms, favorite); %> - - - - - - - <% } %> - <% if( parms.getFilters().size() > 0 || AcknowledgeType.UNACKNOWLEDGED.toNormalizedAcknowledgeType().equals(parms.getAckType()) || AcknowledgeType.ACKNOWLEDGED.toNormalizedAcknowledgeType().equals(parms.getAckType()) ) { %> +

Favorites: - +

+

+ +

+
<% } %> + <% if( alarmCount > 0 ) { %> + <% String baseUrl = this.makeLink(callback, parms, favorite); %> + + + + + + + <% } %> + <% if( req.isUserInRole( Authentication.ROLE_ADMIN ) || !req.isUserInRole( Authentication.ROLE_READONLY ) ) { %>
" method="post" name="alarm_action_form"> "/>" /> diff --git a/opennms-webapp/src/main/webapp/WEB-INF/jsp/event/list.jsp b/opennms-webapp/src/main/webapp/WEB-INF/jsp/event/list.jsp index 690b9b787fcf..32e3e360ce86 100644 --- a/opennms-webapp/src/main/webapp/WEB-INF/jsp/event/list.jsp +++ b/opennms-webapp/src/main/webapp/WEB-INF/jsp/event/list.jsp @@ -221,26 +221,8 @@ - <% if( events.length > 0 ) { %> - <% String baseUrl = this.makeLink(callback, parms, favorite); %> - <% if ( eventCount == -1 ) { %> - - - - - - - <% } else { %> - - - - - - - <% } %> - <% } %> - <% if( parms.getFilters().size() > 0 || AcknowledgeType.UNACKNOWLEDGED.toNormalizedAcknowledgeType().equals(parms.getAckType()) || AcknowledgeType.ACKNOWLEDGED.toNormalizedAcknowledgeType().equals(parms.getAckType()) ) { %> +

Favorites: +

+

+ + - - -

+ +

+
<% } %> + <% if( events.length > 0 ) { %> + <% String baseUrl = this.makeLink(callback, parms, favorite); %> + <% if ( eventCount == -1 ) { %> + + + + + + + <% } else { %> + + + + + + + <% } %> + <% } %> + <% if( req.isUserInRole( Authentication.ROLE_ADMIN ) || !req.isUserInRole( Authentication.ROLE_READONLY ) ) { %> "/>" /> diff --git a/opennms-webapp/src/main/webapp/element/bridgenode.jsp b/opennms-webapp/src/main/webapp/element/bridgenode.jsp index 95eb53727753..5842eb7af244 100644 --- a/opennms-webapp/src/main/webapp/element/bridgenode.jsp +++ b/opennms-webapp/src/main/webapp/element/bridgenode.jsp @@ -88,6 +88,12 @@ //handle this WAY better, very awful throw new ServletException( "No such node in database" ); } + String parentRes = Integer.toString(nodeId); + String parentResType = "node"; + if (!(node_db.getForeignSource() == null) && !(node_db.getForeignId() == null)) { + parentRes = node_db.getForeignSource() + ":" + node_db.getForeignId(); + parentResType = "nodeSource"; + } //find the telnet interfaces, if any String telnetIp = null; @@ -159,11 +165,11 @@ <% } %> - <% if (m_resourceService.findNodeChildResources(nodeId).size() > 0) { %> + <% if (m_resourceService.findNodeChildResources(node_db).size() > 0) { %>
  • - - + + Resource Graphs diff --git a/opennms-webapp/src/main/webapp/element/interface.jsp b/opennms-webapp/src/main/webapp/element/interface.jsp index 20addf60f8ef..1ab51123fd28 100644 --- a/opennms-webapp/src/main/webapp/element/interface.jsp +++ b/opennms-webapp/src/main/webapp/element/interface.jsp @@ -39,6 +39,7 @@ org.opennms.netmgt.config.poller.Package, java.util.*, org.opennms.core.utils.SIUtils, + org.opennms.netmgt.model.OnmsNode, org.opennms.netmgt.model.OnmsResource, org.opennms.web.api.Util, org.opennms.web.api.Authentication, @@ -79,6 +80,7 @@ <% Interface intf_db = ElementUtil.getInterfaceByParams(request, getServletContext()); int nodeId = intf_db.getNodeId(); + OnmsNode node = NetworkElementFactory.getInstance(getServletContext()).getNode(nodeId); String ipAddr = intf_db.getIpAddress(); int ifIndex = -1; if (intf_db.getIfIndex() > 0) { @@ -196,7 +198,7 @@ function doDelete() { ifLabel = IfLabel.getIfLabel(nodeId, ipAddr); } - List resources = m_resourceService.findNodeChildResources(nodeId); + List resources = m_resourceService.findNodeChildResources(node); for (OnmsResource resource : resources) { if (resource.getName().equals(ipAddr) || resource.getName().equals(ifLabel)) { %> @@ -253,7 +255,7 @@ function doDelete() { - + diff --git a/opennms-webapp/src/main/webapp/element/linkednode.jsp b/opennms-webapp/src/main/webapp/element/linkednode.jsp index eeb0c32cc22c..a0859995d89a 100644 --- a/opennms-webapp/src/main/webapp/element/linkednode.jsp +++ b/opennms-webapp/src/main/webapp/element/linkednode.jsp @@ -111,6 +111,12 @@ if( node_db == null ) { throw new ElementNotFoundException("No such node in database", "node", "element/linkednode.jsp", "node", "element/nodeList.htm"); } + String parentRes = Integer.toString(nodeId); + String parentResType = "node"; + if (!(node_db.getForeignSource() == null) && !(node_db.getForeignId() == null)) { + parentRes = node_db.getForeignSource() + ":" + node_db.getForeignId(); + parentResType = "nodeSource"; + } //find the telnet interfaces, if any String telnetIp = null; @@ -231,11 +237,11 @@ <% } %> - <% if (m_resourceService.findNodeChildResources(nodeId).size() > 0) { %> + <% if (m_resourceService.findNodeChildResources(node_db).size() > 0) { %>
  • - - + + Resource Graphs diff --git a/opennms-webapp/src/main/webapp/element/node.jsp b/opennms-webapp/src/main/webapp/element/node.jsp index ba7e64c4ec12..7ac7e1a77705 100644 --- a/opennms-webapp/src/main/webapp/element/node.jsp +++ b/opennms-webapp/src/main/webapp/element/node.jsp @@ -162,7 +162,7 @@ nodeModel.put("statusSite", asset.getBuilding()); } - nodeModel.put("resources", m_resourceService.findNodeChildResources(nodeId)); + nodeModel.put("resources", m_resourceService.findNodeChildResources(node_db)); nodeModel.put("vlans", NetworkElementFactory.getInstance(getServletContext()).getVlansOnNode(nodeId)); nodeModel.put("criticalPath", PathOutageFactory.getCriticalPath(nodeId)); nodeModel.put("noCriticalPath", PathOutageFactory.NO_CRITICAL_PATH); @@ -404,11 +404,14 @@ - + + + - + +

    Node Interfaces

    @@ -489,7 +492,9 @@
    - + + + diff --git a/opennms-webapp/src/main/webapp/element/routeipnode.jsp b/opennms-webapp/src/main/webapp/element/routeipnode.jsp index 1f2aa7d88594..8922bf78c5bf 100644 --- a/opennms-webapp/src/main/webapp/element/routeipnode.jsp +++ b/opennms-webapp/src/main/webapp/element/routeipnode.jsp @@ -74,7 +74,17 @@ <% OnmsNode node_db = ElementUtil.getNodeByParams(request, getServletContext()); - int nodeId = node_db.getId(); + if (node_db == null) { + throw new ElementNotFoundException("No such node in database", "node", "element/routeipnode.jsp", "node", "element/nodeList.htm"); + } + int nodeId = node_db.getId(); + String parentRes = Integer.toString(nodeId); + String parentResType = "node"; + if (!(node_db.getForeignSource() == null) && !(node_db.getForeignId() == null)) { + parentRes = node_db.getForeignSource() + ":" + node_db.getForeignId(); + parentResType = "nodeSource"; + } + //find the telnet interfaces, if any String telnetIp = null; Service[] telnetServices = NetworkElementFactory.getInstance(getServletContext()).getServicesOnNode(nodeId, this.telnetServiceId); @@ -147,11 +157,11 @@ <% } %> - <% if (m_resourceService.findNodeChildResources(nodeId).size() > 0) { %> + <% if (m_resourceService.findNodeChildResources(node_db).size() > 0) { %>
  • - - + + Resource Graphs diff --git a/opennms-webapp/src/main/webapp/element/snmpinterface.jsp b/opennms-webapp/src/main/webapp/element/snmpinterface.jsp index 1ae6ef02ecc7..6ea48acf2b8b 100644 --- a/opennms-webapp/src/main/webapp/element/snmpinterface.jsp +++ b/opennms-webapp/src/main/webapp/element/snmpinterface.jsp @@ -36,6 +36,7 @@ org.opennms.netmgt.config.SnmpInterfacePollerConfigFactory, org.opennms.netmgt.config.SnmpInterfacePollerConfig, org.opennms.core.utils.SIUtils, + org.opennms.netmgt.model.OnmsNode, org.opennms.netmgt.model.OnmsResource, org.opennms.web.api.Util, org.opennms.web.api.Authentication, @@ -61,6 +62,7 @@ <% Interface intf_db = ElementUtil.getSnmpInterfaceByParams(request, getServletContext()); int nodeId = intf_db.getNodeId(); + OnmsNode node = NetworkElementFactory.getInstance(getServletContext()).getNode(nodeId); String ipAddr = intf_db.getIpAddress(); int ifIndex = -1; if (intf_db.getSnmpIfIndex() > 0) { @@ -136,9 +138,9 @@ function doDelete() { ifLabel = "no_ifLabel"; } - List resources = m_resourceService.findNodeChildResources(nodeId); + List resources = m_resourceService.findNodeChildResources(node); for (OnmsResource resource : resources) { - if (resource.getName().equals(ipAddr) || resource.getName().equals(ifLabel)) { + if (resource.getName().equals(ipAddr) || resource.getName().equals(ifLabel)) { %> @@ -171,7 +173,7 @@ function doDelete() {
  • Node<%=NetworkElementFactory.getInstance(getServletContext()).getNodeLabel(intf_db.getNodeId())%><%=node.getLabel()%>
    Polling Status
    - + diff --git a/opennms-webapp/src/main/webapp/includes/header.jsp b/opennms-webapp/src/main/webapp/includes/header.jsp index 00c772eac3f0..c40e407d75e9 100644 --- a/opennms-webapp/src/main/webapp/includes/header.jsp +++ b/opennms-webapp/src/main/webapp/includes/header.jsp @@ -220,6 +220,15 @@ final String baseHref = Util.calculateUrlBase( request ); +<%-- + Added javascript snippet to hide the header if not displayed in a toplevel window (iFrame). +--%> + + <%-- This
    tag is unmatched in this file (its matching tag is in the footer), so we hide it in a JSP code fragment so the Eclipse HTML diff --git a/opennms-webapp/src/main/webapp/index.jsp b/opennms-webapp/src/main/webapp/index.jsp index 7ba5607ebf12..3973d4d5add7 100644 --- a/opennms-webapp/src/main/webapp/index.jsp +++ b/opennms-webapp/src/main/webapp/index.jsp @@ -38,7 +38,7 @@
    - <% String showNodesWithProblems = System.getProperty("opennms.nodesWithProblems.show", "false"); + <% String showNodesWithProblems = System.getProperty("opennms.nodesWithProblems.show", "true"); if (Boolean.parseBoolean(showNodesWithProblems)) { %>
    diff --git a/opennms-webapp/src/main/webapp/login.jsp b/opennms-webapp/src/main/webapp/login.jsp index 4de7c1a0c5fa..95f3ca530144 100644 --- a/opennms-webapp/src/main/webapp/login.jsp +++ b/opennms-webapp/src/main/webapp/login.jsp @@ -60,6 +60,7 @@ --> +
    Node<%=NetworkElementFactory.getInstance(getServletContext()).getNodeLabel(intf_db.getNodeId())%><%=node.getLabel()%>
    Interface Index