aboutsummaryrefslogtreecommitdiff
path: root/connector/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'connector/src/main')
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/MsSpecificEidasNodeSpringResourceProvider.java54
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/MsSpecificSpringBootApplicationContextInitializer.java82
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/SpringBootApplicationInitializer.java105
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/attributes/AuthBlockAttributeBuilder.java68
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/attributes/EidasBindAttributeBuilder.java64
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/builder/PvpSubjectNameGenerator.java40
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/config/MsConnectorMessageSource.java21
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/config/PvpEndPointConfiguration.java158
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/config/PvpMetadataConfiguration.java269
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/controller/ProcessEngineSignalController.java59
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/controller/Pvp2SProfileEndpoint.java80
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/health/Saml2MetadataHealthIndicator.java44
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/processes/CountrySelectionProcessImpl.java68
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/processes/tasks/EvaluateCountrySelectionTask.java83
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/processes/tasks/GenerateCountrySelectionFrameTask.java84
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/provider/PvpEndPointCredentialProvider.java97
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/provider/PvpMetadataConfigurationFactory.java51
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/provider/PvpMetadataProvider.java183
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/verification/AuthnRequestValidator.java382
-rw-r--r--connector/src/main/resources/META-INF/services/at.gv.egiz.components.spring.api.SpringResourceProvider1
-rw-r--r--connector/src/main/resources/META-INF/services/at.gv.egiz.eaaf.core.api.idp.IAttributeBuilder2
-rw-r--r--connector/src/main/resources/META-INF/services/at.gv.egiz.eaaf.core.api.idp.auth.modules.AuthModule1
-rw-r--r--connector/src/main/resources/application.properties288
-rw-r--r--connector/src/main/resources/applicationContext.xml45
-rw-r--r--connector/src/main/resources/logback.xml30
-rw-r--r--connector/src/main/resources/processes/CountrySelection.process.xml29
-rw-r--r--connector/src/main/resources/properties/external_statuscodes_map.properties76
-rw-r--r--connector/src/main/resources/properties/messages.properties131
-rw-r--r--connector/src/main/resources/properties/messages_de.properties132
-rw-r--r--connector/src/main/resources/properties/status_messages_en.properties75
-rw-r--r--connector/src/main/resources/specific_eIDAS_connector.beans.xml75
-rw-r--r--connector/src/main/resources/templates/countrySelection.html269
-rw-r--r--connector/src/main/resources/templates/eidas_node_forward.html36
-rw-r--r--connector/src/main/resources/templates/error_message.html37
-rw-r--r--connector/src/main/resources/templates/language_selection.html15
-rw-r--r--connector/src/main/resources/templates/other_login_method.html90
-rw-r--r--connector/src/main/resources/templates/pvp2_post_binding.html36
-rw-r--r--connector/src/main/resources/templates/residency.html251
-rw-r--r--connector/src/main/resources/tomcat.properties15
-rw-r--r--connector/src/main/webapp/WEB-INF/web.xml22
-rw-r--r--connector/src/main/webapp/autocommit.js5
-rw-r--r--connector/src/main/webapp/css/css_country.css62
-rw-r--r--connector/src/main/webapp/css/css_error.css26
-rw-r--r--connector/src/main/webapp/img/ajax-loader.gifbin673 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Belgium-EU_.pngbin1886 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Belgium-EU_gray.pngbin1903 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Bulgaria-EU_.pngbin2152 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Bulgaria-EU_gray.pngbin1649 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Croatia-EU_.pngbin5354 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Croatia-EU_gray.pngbin5177 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Cyprus-EU_.pngbin4848 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Cyprus-EU_gray.pngbin4826 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/CzechRepublic-EU_.pngbin3191 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/CzechRepublic-EU_gray.pngbin2335 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Denmark-EU_.pngbin2326 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Denmark-EU_gray.pngbin1794 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Estonia-EU_.pngbin1664 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Estonia-EU_gray.pngbin1630 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Finland-EU_.pngbin2061 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Finland-EU_gray.pngbin2065 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/France-EU_.pngbin2124 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/France-EU_gray.pngbin2119 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Germany-EU_gray.pngbin2420 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Greece-EU_.pngbin2443 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Greece-EU_gray.pngbin2433 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Hungary-EU_.pngbin1817 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Hungary-EU_gray.pngbin1803 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Iceland.pngbin1922 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Iceland_gray.pngbin1921 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Ireland-EU_.pngbin2072 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Ireland-EU_gray.pngbin1558 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Italy-EU_.pngbin1708 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Italy-EU_gray.pngbin1697 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Latvia-EU_.pngbin1558 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Latvia-EU_gray.pngbin1560 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Lichtenstein.pngbin13536 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Lichtenstein_gray.pngbin13536 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Lithuania-EU_.pngbin1860 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Lithuania-EU_gray.pngbin1846 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Luxembourg-EU_.pngbin1720 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Luxembourg-EU_gray.pngbin1678 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Malta-EU_.pngbin2554 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Malta-EU_gray.pngbin2523 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Poland-EU_.pngbin1617 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Poland-EU_gray.pngbin1604 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Portugal-EU_.pngbin4661 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Portugal-EU_gray.pngbin4702 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Romania-EU_.pngbin1662 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Romania-EU_gray.pngbin1615 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Slovakia-EU_.pngbin4376 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Slovakia-EU_gray.pngbin4408 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Slovenia-EU_.pngbin3021 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Slovenia-EU_gray.pngbin3034 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Spain-EU_.pngbin4226 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Spain-EU_gray.pngbin4205 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Sweden-EU_.pngbin2031 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/Sweden-EU_gray.pngbin2035 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/TestLoginLogo.pngbin1777 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/TheNetherlands-EU_.pngbin1900 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/TheNetherlands-EU_gray.pngbin1899 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/UnitedKingdom-EU_.pngbin4158 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/UnitedKingdom-EU_gray.pngbin4175 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/countries_eu_gray.pngbin2420 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/demo.pngbin2191 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/countries/germany-eu_.pngbin2441 -> 0 bytes
-rw-r--r--connector/src/main/webapp/img/globus_eu.pngbin301722 -> 0 bytes
-rw-r--r--connector/src/main/webapp/index.html24
-rw-r--r--connector/src/main/webapp/js/jquery-3.6.0.min.js2
-rw-r--r--connector/src/main/webapp/js/js_country.js42
109 files changed, 0 insertions, 3809 deletions
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/MsSpecificEidasNodeSpringResourceProvider.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/MsSpecificEidasNodeSpringResourceProvider.java
deleted file mode 100644
index 45e5c7d4..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/MsSpecificEidasNodeSpringResourceProvider.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
- */
-
-package at.asitplus.eidas.specific.connector;
-
-import org.springframework.core.io.ClassPathResource;
-import org.springframework.core.io.Resource;
-
-import at.gv.egiz.components.spring.api.SpringResourceProvider;
-
-public class MsSpecificEidasNodeSpringResourceProvider implements SpringResourceProvider {
-
- @Override
- public Resource[] getResourcesToLoad() {
- final ClassPathResource generic =
- new ClassPathResource("/applicationContext.xml", MsSpecificEidasNodeSpringResourceProvider.class);
- final ClassPathResource msEidasNode = new ClassPathResource(
- "/specific_eIDAS_connector.beans.xml", MsSpecificEidasNodeSpringResourceProvider.class);
-
- return new Resource[] { generic, msEidasNode};
-
- }
-
- @Override
- public String[] getPackagesToScan() {
- return null;
- }
-
- @Override
- public String getName() {
- return "MS-specific eIDAS-Connector SpringResourceProvider";
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/MsSpecificSpringBootApplicationContextInitializer.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/MsSpecificSpringBootApplicationContextInitializer.java
deleted file mode 100644
index 399d1286..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/MsSpecificSpringBootApplicationContextInitializer.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package at.asitplus.eidas.specific.connector;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Properties;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.core.env.MutablePropertySources;
-import org.springframework.core.env.PropertiesPropertySource;
-
-import at.gv.egiz.components.spring.api.SpringBootApplicationContextInitializer;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class MsSpecificSpringBootApplicationContextInitializer extends
- SpringBootApplicationContextInitializer {
-
- private static final String SYSTEMD_PROP_NAME = "eidas.ms.configuration";
- private static final String PATH_FILE_PREFIX = "file:";
-
- @Override
- public void initialize(ConfigurableApplicationContext applicationContext) {
- String configPath = System.getProperty(SYSTEMD_PROP_NAME);
- if (StringUtils.isNotEmpty(configPath)) {
- log.debug("Find configuration-source from SystemD Property: '{}' ...", SYSTEMD_PROP_NAME);
- if (configPath.startsWith(PATH_FILE_PREFIX)) {
- configPath = configPath.substring(PATH_FILE_PREFIX.length());
-
- }
- injectConfiguration(configPath, applicationContext);
-
- } else {
- log.info("Find NO SystemD Property: '{}' Maybe no configuration available", SYSTEMD_PROP_NAME);
-
- }
-
- super.initialize(applicationContext);
-
- }
-
- private void injectConfiguration(String configPath, ConfigurableApplicationContext applicationContext) {
- InputStream is = null;
- try {
- Path path = Paths.get(configPath);
- if (Files.exists(path)) {
- File file = new File(configPath);
- Properties props = new Properties();
- is = new FileInputStream(file);
- props.load(is);
- MutablePropertySources sources = applicationContext.getEnvironment().getPropertySources();
- sources.addFirst(new PropertiesPropertySource(SYSTEMD_PROP_NAME, props));
- log.info("Set configuration-source from SystemD-Property: {}", SYSTEMD_PROP_NAME);
-
- } else {
- log.error("Configuration from SystemD Property: '{}' at Location: {} DOES NOT exist",
- SYSTEMD_PROP_NAME, configPath);
-
- }
-
- } catch (IOException e) {
- log.error("Configuration from SystemD Property: '{}' at Location: {} CAN NOT be loaded",
- SYSTEMD_PROP_NAME, configPath, e);
-
- } finally {
- try {
- if (is != null) {
- is.close();
-
- }
- } catch (IOException e) {
- log.error("Can not close InputStream of configLoader: {}", configPath, e);
-
- }
- }
- }
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/SpringBootApplicationInitializer.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/SpringBootApplicationInitializer.java
deleted file mode 100644
index 6616db23..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/SpringBootApplicationInitializer.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package at.asitplus.eidas.specific.connector;
-
-import org.opensaml.core.config.InitializationException;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.builder.SpringApplicationBuilder;
-import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
-import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.web.context.WebApplicationContext;
-
-import at.gv.egiz.eaaf.core.api.IStatusMessenger;
-import at.gv.egiz.eaaf.core.impl.logging.LogMessageProviderFactory;
-import at.gv.egiz.eaaf.core.impl.logging.SimpleStatusMessager;
-import at.gv.egiz.eaaf.modules.pvp2.impl.opensaml.initialize.EaafOpenSaml3xInitializer;
-import lombok.extern.slf4j.Slf4j;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-
-@Slf4j
-@SpringBootApplication(scanBasePackages = {
- "at.asitplus.eidas.specific.connector",
- "at.gv.egiz.eaaf.utils.springboot.ajp"
- })
-public class SpringBootApplicationInitializer extends SpringBootServletInitializer {
-
- private static ConfigurableApplicationContext ctx;
-
- /**
- * Starts MS-specific eIDAS-Implementation SpringBoot application.
- *
- * @param args Starting parameters
- * @throws Throwable In case of a start-up error
- */
- public static void main(final String[] args) throws Throwable {
- try {
- log.info("=============== Initializing Spring-Boot context! ===============");
- LogMessageProviderFactory.setStatusMessager(new SimpleStatusMessager());
- final SpringApplication springApp =
- new SpringApplication(SpringBootApplicationInitializer.class);
- springApp.addInitializers(new MsSpecificSpringBootApplicationContextInitializer());
-
- log.info("Bootstrap openSAML .... ");
- EaafOpenSaml3xInitializer.eaafInitialize();
-
- log.debug("Run SpringBoot initialization process ... ");
- ctx = springApp.run(args);
-
- // initialize status messenger
- LogMessageProviderFactory.setStatusMessager(ctx.getBean(IStatusMessenger.class));
-
- log.info("Initialization of MS-specific eIDAS-Connector finished.");
-
- } catch (final Throwable e) {
- log.error("MS-specific eIDAS-Connector initialization FAILED!", e);
- throw e;
-
- }
-
- }
-
-
- protected SpringApplicationBuilder createSpringApplicationBuilder() {
- try {
- log.info("Bootstrap openSAML .... ");
- EaafOpenSaml3xInitializer.eaafInitialize();
-
- } catch (InitializationException | ComponentInitializationException e) {
- throw new RuntimeException(e);
-
- }
-
- SpringApplicationBuilder builder = new SpringApplicationBuilder();
- builder.initializers(new MsSpecificSpringBootApplicationContextInitializer());
- return builder;
-
- }
-
- protected WebApplicationContext run(SpringApplication application) {
- WebApplicationContext internalContext = (WebApplicationContext) application.run();
-
- // initialize status messenger
- LogMessageProviderFactory.setStatusMessager(internalContext.getBean(IStatusMessenger.class));
-
- log.info("Initialization of MS-specific eIDAS-Connector finished.");
-
- return internalContext;
- }
-
- /**
- * Stops SpringBoot application of MS-specific eIDAS-Implementation.
- *
- */
- public static void exit() {
- if (ctx != null) {
- log.info("Stopping SpringBoot application ... ");
- SpringApplication.exit(ctx, () -> 0);
- ctx = null;
-
- } else {
- log.info("No SpringBoot context. Nothing todo");
-
- }
-
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/attributes/AuthBlockAttributeBuilder.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/attributes/AuthBlockAttributeBuilder.java
deleted file mode 100644
index 17eb0704..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/attributes/AuthBlockAttributeBuilder.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2017 Graz University of Technology EAAF-Core Components has been developed in a
- * cooperation between EGIZ, A-SIT Plus, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by the European
- * Commission - subsequent versions of the EUPL (the "Licence"); You may not use this work except in
- * compliance with the Licence. You may obtain a copy of the Licence at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the Licence
- * is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the Licence for the specific language governing permissions and limitations under
- * the Licence.
- *
- * This product combines work with different licenses. See the "NOTICE" text file for details on the
- * various modules and licenses. The "NOTICE" text file is part of the distribution. Any derivative
- * works that you distribute must include a readable copy of the "NOTICE" text file.
- */
-
-package at.asitplus.eidas.specific.connector.attributes;
-
-import static at.gv.egiz.eaaf.core.api.data.ExtendedPvpAttributeDefinitions.EID_AUTHBLOCK_SIGNED_FRIENDLY_NAME;
-import static at.gv.egiz.eaaf.core.api.data.ExtendedPvpAttributeDefinitions.EID_AUTHBLOCK_SIGNED_NAME;
-
-import java.nio.charset.StandardCharsets;
-import java.util.Base64;
-
-import org.apache.commons.lang3.StringUtils;
-
-import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
-import at.gv.egiz.eaaf.core.api.idp.IAttributeGenerator;
-import at.gv.egiz.eaaf.core.api.idp.IAuthData;
-import at.gv.egiz.eaaf.core.api.idp.IPvpAttributeBuilder;
-import at.gv.egiz.eaaf.core.api.idp.ISpConfiguration;
-import at.gv.egiz.eaaf.core.exceptions.AttributeBuilderException;
-import at.gv.egiz.eaaf.core.exceptions.UnavailableAttributeException;
-import at.gv.egiz.eaaf.core.impl.idp.builder.attributes.PvpMetadata;
-
-
-@PvpMetadata
-public class AuthBlockAttributeBuilder implements IPvpAttributeBuilder {
-
- @Override
- public String getName() {
- return EID_AUTHBLOCK_SIGNED_NAME;
- }
-
- @Override
- public <ATT> ATT build(final ISpConfiguration oaParam, final IAuthData authData,
- final IAttributeGenerator<ATT> g) throws AttributeBuilderException {
-
- String authBlock = authData.getGenericData(MsEidasNodeConstants.AUTH_DATA_SZR_AUTHBLOCK, String.class);
- if (StringUtils.isNotEmpty(authBlock)) {
- return g.buildStringAttribute(EID_AUTHBLOCK_SIGNED_FRIENDLY_NAME, EID_AUTHBLOCK_SIGNED_NAME,
- Base64.getEncoder().encodeToString(authBlock.getBytes(StandardCharsets.UTF_8)));
-
- } else {
- throw new UnavailableAttributeException(EID_AUTHBLOCK_SIGNED_NAME);
- }
-
- }
-
- @Override
- public <ATT> ATT buildEmpty(final IAttributeGenerator<ATT> g) {
- return g.buildEmptyAttribute(EID_AUTHBLOCK_SIGNED_FRIENDLY_NAME, EID_AUTHBLOCK_SIGNED_NAME);
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/attributes/EidasBindAttributeBuilder.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/attributes/EidasBindAttributeBuilder.java
deleted file mode 100644
index 18eb74f8..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/attributes/EidasBindAttributeBuilder.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2017 Graz University of Technology EAAF-Core Components has been developed in a
- * cooperation between EGIZ, A-SIT Plus, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by the European
- * Commission - subsequent versions of the EUPL (the "Licence"); You may not use this work except in
- * compliance with the Licence. You may obtain a copy of the Licence at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the Licence
- * is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the Licence for the specific language governing permissions and limitations under
- * the Licence.
- *
- * This product combines work with different licenses. See the "NOTICE" text file for details on the
- * various modules and licenses. The "NOTICE" text file is part of the distribution. Any derivative
- * works that you distribute must include a readable copy of the "NOTICE" text file.
- */
-
-package at.asitplus.eidas.specific.connector.attributes;
-
-import static at.gv.egiz.eaaf.core.api.data.ExtendedPvpAttributeDefinitions.EID_EIDBIND_FRIENDLY_NAME;
-import static at.gv.egiz.eaaf.core.api.data.ExtendedPvpAttributeDefinitions.EID_EIDBIND_NAME;
-
-import org.apache.commons.lang3.StringUtils;
-
-import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
-import at.gv.egiz.eaaf.core.api.idp.IAttributeGenerator;
-import at.gv.egiz.eaaf.core.api.idp.IAuthData;
-import at.gv.egiz.eaaf.core.api.idp.IPvpAttributeBuilder;
-import at.gv.egiz.eaaf.core.api.idp.ISpConfiguration;
-import at.gv.egiz.eaaf.core.exceptions.AttributeBuilderException;
-import at.gv.egiz.eaaf.core.exceptions.UnavailableAttributeException;
-import at.gv.egiz.eaaf.core.impl.idp.builder.attributes.PvpMetadata;
-
-@PvpMetadata
-public class EidasBindAttributeBuilder implements IPvpAttributeBuilder {
-
-
- @Override
- public String getName() {
- return EID_EIDBIND_NAME;
- }
-
- @Override
- public <ATT> ATT build(final ISpConfiguration oaParam, final IAuthData authData,
- final IAttributeGenerator<ATT> g) throws AttributeBuilderException {
-
- String eidasBind = authData.getGenericData(MsEidasNodeConstants.AUTH_DATA_EIDAS_BIND, String.class);
- if (StringUtils.isNotEmpty(eidasBind)) {
- return g.buildStringAttribute(EID_EIDBIND_FRIENDLY_NAME, EID_EIDBIND_NAME, eidasBind);
-
- } else {
- throw new UnavailableAttributeException(EID_EIDBIND_NAME);
- }
-
- }
-
- @Override
- public <ATT> ATT buildEmpty(final IAttributeGenerator<ATT> g) {
- return g.buildEmptyAttribute(EID_EIDBIND_FRIENDLY_NAME, EID_EIDBIND_NAME);
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/builder/PvpSubjectNameGenerator.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/builder/PvpSubjectNameGenerator.java
deleted file mode 100644
index d4e97433..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/builder/PvpSubjectNameGenerator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
-*/
-
-package at.asitplus.eidas.specific.connector.builder;
-
-import at.gv.egiz.eaaf.core.api.idp.IAuthData;
-import at.gv.egiz.eaaf.core.api.idp.ISpConfiguration;
-import at.gv.egiz.eaaf.core.impl.data.Pair;
-import at.gv.egiz.eaaf.modules.pvp2.exception.Pvp2Exception;
-import at.gv.egiz.eaaf.modules.pvp2.idp.api.builder.ISubjectNameIdGenerator;
-
-public class PvpSubjectNameGenerator implements ISubjectNameIdGenerator {
-
- @Override
- public Pair<String, String> generateSubjectNameId(IAuthData authData, ISpConfiguration spConfig)
- throws Pvp2Exception {
- return Pair.newInstance(authData.getBpk(), authData.getBpkType());
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/config/MsConnectorMessageSource.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/config/MsConnectorMessageSource.java
deleted file mode 100644
index 59df6375..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/config/MsConnectorMessageSource.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package at.asitplus.eidas.specific.connector.config;
-
-import java.util.Arrays;
-import java.util.List;
-
-import at.gv.egiz.eaaf.core.api.logging.IMessageSourceLocation;
-
-/**
- * Inject eIDAS Connector specific messages into Spring based message-source.
- *
- * @author tlenz
- *
- */
-public class MsConnectorMessageSource implements IMessageSourceLocation {
-
- @Override
- public List<String> getMessageSourceLocation() {
- return Arrays.asList("classpath:/properties/messages");
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/config/PvpEndPointConfiguration.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/config/PvpEndPointConfiguration.java
deleted file mode 100644
index 81c37bd0..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/config/PvpEndPointConfiguration.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
-*/
-
-package at.asitplus.eidas.specific.connector.config;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-import org.opensaml.saml.saml2.metadata.ContactPerson;
-import org.opensaml.saml.saml2.metadata.ContactPersonTypeEnumeration;
-import org.opensaml.saml.saml2.metadata.EmailAddress;
-import org.opensaml.saml.saml2.metadata.GivenName;
-import org.opensaml.saml.saml2.metadata.Organization;
-import org.opensaml.saml.saml2.metadata.OrganizationDisplayName;
-import org.opensaml.saml.saml2.metadata.OrganizationName;
-import org.opensaml.saml.saml2.metadata.OrganizationURL;
-import org.opensaml.saml.saml2.metadata.SurName;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
-import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
-import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;
-import at.gv.egiz.eaaf.core.exceptions.EaafException;
-import at.gv.egiz.eaaf.modules.pvp2.api.IPvp2BasicConfiguration;
-import at.gv.egiz.eaaf.modules.pvp2.impl.utils.Saml2Utils;
-
-@Service("PVPEndPointConfiguration")
-public class PvpEndPointConfiguration implements IPvp2BasicConfiguration {
- private static final Logger log = LoggerFactory.getLogger(PvpEndPointConfiguration.class);
-
- private static final String DEFAULT_XML_LANG = "en";
-
- @Autowired(required = true)
- IConfiguration basicConfiguration;
-
- @Override
- public String getIdpEntityId(String authUrl) throws EaafException {
- return removePostFix(authUrl) + MsEidasNodeConstants.ENDPOINT_PVP_METADATA;
-
- }
-
- @Override
- public String getIdpSsoPostService(String authUrl) throws EaafException {
- return removePostFix(authUrl) + MsEidasNodeConstants.ENDPOINT_PVP_POST;
-
- }
-
- @Override
- public String getIdpSsoRedirectService(String authUrl) throws EaafException {
- return removePostFix(authUrl) + MsEidasNodeConstants.ENDPOINT_PVP_REDIRECT;
-
- }
-
- @Override
- public String getIdpSsoSoapService(String extractAuthUrlFromRequest) throws EaafException {
- log.warn("PVP S-Profile End-Point does NOT support SOAP Binding");
- return null;
-
- }
-
- @Override
- public List<ContactPerson> getIdpContacts() throws EaafException {
- final ContactPerson contactPerson = Saml2Utils.createSamlObject(ContactPerson.class);
- final GivenName givenName = Saml2Utils.createSamlObject(GivenName.class);
- final SurName surname = Saml2Utils.createSamlObject(SurName.class);
- final EmailAddress emailAddress = Saml2Utils.createSamlObject(EmailAddress.class);
-
- givenName.setValue(getAndVerifyFromConfiguration(
- MsEidasNodeConstants.CONFIG_PROPS_METADATA_CONTACT_GIVENNAME));
- surname.setValue(getAndVerifyFromConfiguration(
- MsEidasNodeConstants.CONFIG_PROPS_METADATA_CONTACT_SURNAME));
- emailAddress.setURI(getAndVerifyFromConfiguration(
- MsEidasNodeConstants.CONFIG_PROPS_METADATA_CONTACT_EMAIL));
-
- contactPerson.setType(ContactPersonTypeEnumeration.TECHNICAL);
- contactPerson.setGivenName(givenName);
- contactPerson.setSurName(surname);
- contactPerson.getEmailAddresses().add(emailAddress);
-
- return Arrays.asList(contactPerson);
-
- }
-
- @Override
- public Organization getIdpOrganisation() throws EaafException {
- final Organization organisation = Saml2Utils.createSamlObject(Organization.class);
- final OrganizationName orgName = Saml2Utils.createSamlObject(OrganizationName.class);
- final OrganizationDisplayName orgDisplayName = Saml2Utils.createSamlObject(OrganizationDisplayName.class);
- final OrganizationURL orgUrl = Saml2Utils.createSamlObject(OrganizationURL.class);
-
- orgName.setXMLLang(DEFAULT_XML_LANG);
- orgName.setValue(getAndVerifyFromConfiguration(
- MsEidasNodeConstants.CONFIG_PROPS_METADATA_ORGANISATION_NAME));
-
- orgDisplayName.setXMLLang(DEFAULT_XML_LANG);
- orgDisplayName.setValue(getAndVerifyFromConfiguration(
- MsEidasNodeConstants.CONFIG_PROPS_METADATA_ORGANISATION_FRIENDLYNAME));
-
- orgUrl.setXMLLang(DEFAULT_XML_LANG);
- orgUrl.setURI(getAndVerifyFromConfiguration(
- MsEidasNodeConstants.CONFIG_PROPS_METADATA_ORGANISATION_URL));
-
-
- organisation.getOrganizationNames().add(orgName);
- organisation.getDisplayNames().add(orgDisplayName);
- organisation.getURLs().add(orgUrl);
-
- return organisation;
- }
-
- @Override
- public IConfiguration getBasicConfiguration() {
- return basicConfiguration;
- }
-
- private String removePostFix(String url) {
- if (url != null && url.endsWith("/")) {
- return url.substring(0, url.length() - 1);
- } else {
- return url;
- }
- }
-
- private String getAndVerifyFromConfiguration(String configKey) throws EaafConfigurationException {
- final String value = basicConfiguration.getBasicConfiguration(configKey);
- if (StringUtils.isEmpty(value)) {
- throw new EaafConfigurationException("config.08",
- new Object[] {configKey});
-
- }
-
- return value;
- }
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/config/PvpMetadataConfiguration.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/config/PvpMetadataConfiguration.java
deleted file mode 100644
index e83fd4cf..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/config/PvpMetadataConfiguration.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
-*/
-
-package at.asitplus.eidas.specific.connector.config;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.opensaml.saml.saml2.core.Attribute;
-import org.opensaml.saml.saml2.core.NameIDType;
-import org.opensaml.saml.saml2.metadata.ContactPerson;
-import org.opensaml.saml.saml2.metadata.Organization;
-import org.opensaml.saml.saml2.metadata.RequestedAttribute;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
-import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
-import at.gv.egiz.eaaf.core.exceptions.EaafException;
-import at.gv.egiz.eaaf.modules.pvp2.api.IPvp2BasicConfiguration;
-import at.gv.egiz.eaaf.modules.pvp2.api.credential.EaafX509Credential;
-import at.gv.egiz.eaaf.modules.pvp2.api.metadata.IPvpMetadataBuilderConfiguration;
-import at.gv.egiz.eaaf.modules.pvp2.api.utils.IPvp2CredentialProvider;
-import at.gv.egiz.eaaf.modules.pvp2.exception.CredentialsNotAvailableException;
-import at.gv.egiz.eaaf.modules.pvp2.impl.builder.PvpAttributeBuilder;
-
-public class PvpMetadataConfiguration implements IPvpMetadataBuilderConfiguration {
- private static final Logger log = LoggerFactory.getLogger(PvpMetadataConfiguration.class);
-
- private final IConfiguration basicConfig;
- private final String authUrl;
- private final IPvp2CredentialProvider pvpIdpCredentials;
- private final IPvp2BasicConfiguration pvpBasicConfig;
-
- /**
- * Configuration object to create PVP2 S-Profile metadata.
- *
- * @param basicConfig Application configuration
- * @param authUrl Public-URL Prefix of the application
- * @param pvpBasicConfig PVP2 configuration object
- * @param pvpIdpCredentials2 PVP2 credentials
- */
- public PvpMetadataConfiguration(IConfiguration basicConfig, String authUrl,
- IPvp2BasicConfiguration pvpBasicConfig, IPvp2CredentialProvider pvpIdpCredentials2) {
- this.authUrl = authUrl;
- this.pvpIdpCredentials = pvpIdpCredentials2;
- this.basicConfig = basicConfig;
- this.pvpBasicConfig = pvpBasicConfig;
-
- }
-
- @Override
- public String getSpNameForLogging() {
- return "PVP2 S-Profile IDP";
- }
-
- @Override
- public int getMetadataValidUntil() {
- return Integer.parseInt(basicConfig.getBasicConfiguration(
- MsEidasNodeConstants.PROP_CONFIG_PVP2_METADATA_VALIDITY,
- String.valueOf(MsEidasNodeConstants.DEFAULT_PVP_METADATA_VALIDITY)));
-
- }
-
- @Override
- public boolean buildEntitiesDescriptorAsRootElement() {
- return false;
-
- }
-
- @Override
- public boolean buildIdpSsoDescriptor() {
- return true;
-
- }
-
- @Override
- public boolean buildSpSsoDescriptor() {
- return false;
-
- }
-
- @Override
- public String getEntityID() {
- try {
- return pvpBasicConfig.getIdpEntityId(authUrl);
-
- } catch (final EaafException e) {
- log.error("Can NOT build PVP metadata configuration.", e);
- throw new RuntimeException("Can NOT build PVP metadata configuration.");
-
- }
-
- }
-
- @Override
- public String getEntityFriendlyName() {
- return null;
-
- }
-
- @Override
- public List<ContactPerson> getContactPersonInformation() {
- try {
- return pvpBasicConfig.getIdpContacts();
-
- } catch (final EaafException e) {
- log.error("Can NOT build PVP metadata configuration.", e);
- throw new RuntimeException("Can NOT build PVP metadata configuration.");
-
- }
-
- }
-
- @Override
- public Organization getOrgansiationInformation() {
- try {
- return pvpBasicConfig.getIdpOrganisation();
-
- } catch (final EaafException e) {
- log.error("Can NOT build PVP metadata configuration.", e);
- throw new RuntimeException("Can NOT build PVP metadata configuration.");
-
- }
- }
-
- @Override
- public EaafX509Credential getMetadataSigningCredentials() throws CredentialsNotAvailableException {
- return pvpIdpCredentials.getMetaDataSigningCredential();
-
- }
-
- @Override
- public EaafX509Credential getRequestorResponseSigningCredentials() throws CredentialsNotAvailableException {
- return pvpIdpCredentials.getMessageSigningCredential();
-
- }
-
- @Override
- public EaafX509Credential getEncryptionCredentials() throws CredentialsNotAvailableException {
- return null;
-
- }
-
- @Override
- public String getIdpWebSsoPostBindingUrl() {
- try {
- return pvpBasicConfig.getIdpSsoPostService(authUrl);
-
- } catch (final EaafException e) {
- log.error("Can NOT build PVP metadata configuration.", e);
- throw new RuntimeException("Can NOT build PVP metadata configuration.");
-
- }
-
- }
-
- @Override
- public String getIdpWebSsoRedirectBindingUrl() {
- try {
- return pvpBasicConfig.getIdpSsoRedirectService(authUrl);
-
- } catch (final EaafException e) {
- log.error("Can NOT build PVP metadata configuration.", e);
- throw new RuntimeException("Can NOT build PVP metadata configuration.");
-
- }
- }
-
- @Override
- public String getIdpSloPostBindingUrl() {
- return null;
-
- }
-
- @Override
- public String getIdpSloRedirectBindingUrl() {
- return null;
-
- }
-
- @Override
- public String getSpAssertionConsumerServicePostBindingUrl() {
- return null;
-
- }
-
- @Override
- public String getSpAssertionConsumerServiceRedirectBindingUrl() {
- return null;
-
- }
-
- @Override
- public String getSpSloPostBindingUrl() {
- return null;
-
- }
-
- @Override
- public String getSpSloRedirectBindingUrl() {
- return null;
-
- }
-
- @Override
- public String getSpSloSoapBindingUrl() {
- return null;
-
- }
-
- @Override
- public List<Attribute> getIdpPossibleAttributes() {
- return PvpAttributeBuilder.buildSupportedEmptyAttributes();
-
- }
-
- @Override
- public List<String> getIdpPossibleNameIdTypes() {
- return Arrays.asList(NameIDType.PERSISTENT,
- NameIDType.TRANSIENT,
- NameIDType.UNSPECIFIED);
- }
-
- @Override
- public List<RequestedAttribute> getSpRequiredAttributes() {
- return null;
-
- }
-
- @Override
- public List<String> getSpAllowedNameIdTypes() {
- return null;
-
- }
-
- @Override
- public boolean wantAssertionSigned() {
- return false;
-
- }
-
- @Override
- public boolean wantAuthnRequestSigned() {
- return true;
-
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/controller/ProcessEngineSignalController.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/controller/ProcessEngineSignalController.java
deleted file mode 100644
index f360185b..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/controller/ProcessEngineSignalController.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
- */
-
-package at.asitplus.eidas.specific.connector.controller;
-
-import java.io.IOException;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
-import at.gv.egiz.eaaf.core.exceptions.EaafException;
-import at.gv.egiz.eaaf.core.impl.idp.controller.AbstractProcessEngineSignalController;
-
-/**
- * Default process-engine signaling controller.
- *
- * @author tlenz
- *
- */
-@Controller
-public class ProcessEngineSignalController extends AbstractProcessEngineSignalController {
-
- @RequestMapping(value = {
- MsEidasNodeConstants.ENDPOINT_COUNTRYSELECTION,
- MsEidasNodeConstants.ENDPOINT_OTHER_LOGIN_METHOD_SELECTION,
- MsEidasNodeConstants.ENDPOINT_RESIDENCY_INPUT
- },
- method = { RequestMethod.POST, RequestMethod.GET })
- public void performGenericAuthenticationProcess(HttpServletRequest req, HttpServletResponse resp)
- throws IOException, EaafException {
- signalProcessManagement(req, resp);
-
- }
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/controller/Pvp2SProfileEndpoint.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/controller/Pvp2SProfileEndpoint.java
deleted file mode 100644
index 923864cc..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/controller/Pvp2SProfileEndpoint.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
-*/
-
-package at.asitplus.eidas.specific.connector.controller;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
-import at.gv.egiz.eaaf.core.exceptions.EaafException;
-import at.gv.egiz.eaaf.modules.pvp2.idp.impl.AbstractPvp2XProtocol;
-import at.gv.egiz.eaaf.modules.pvp2.idp.impl.PvpSProfilePendingRequest;
-
-@Controller
-public class Pvp2SProfileEndpoint extends AbstractPvp2XProtocol {
-
- public static final String NAME = Pvp2SProfileEndpoint.class.getName();
- public static final String PROTOCOL_ID = "pvp2-s";
-
- @RequestMapping(value = MsEidasNodeConstants.ENDPOINT_PVP_METADATA, method = { RequestMethod.POST,
- RequestMethod.GET })
- public void pvpMetadataRequest(HttpServletRequest req, HttpServletResponse resp) throws EaafException {
- super.pvpMetadataRequest(req, resp);
-
- }
-
- @RequestMapping(value = MsEidasNodeConstants.ENDPOINT_PVP_POST, method = { RequestMethod.POST })
- public void pvpIdpPostRequest(HttpServletRequest req, HttpServletResponse resp) throws EaafException {
- super.pvpIdpPostRequest(req, resp);
-
- }
-
- @RequestMapping(value = MsEidasNodeConstants.ENDPOINT_PVP_REDIRECT, method = { RequestMethod.GET })
- public void pvpIdpRedirecttRequest(HttpServletRequest req, HttpServletResponse resp) throws EaafException {
- super.pvpIdpRedirecttRequest(req, resp);
-
- }
-
- @Override
- public String getAuthProtocolIdentifier() {
- return PROTOCOL_ID;
- }
-
- @Override
- public String getName() {
- return NAME;
- }
-
- @Override
- protected boolean childPreProcess(HttpServletRequest arg0, HttpServletResponse arg1,
- PvpSProfilePendingRequest arg2)
- throws Throwable {
- return false;
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/health/Saml2MetadataHealthIndicator.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/health/Saml2MetadataHealthIndicator.java
deleted file mode 100644
index 592231b0..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/health/Saml2MetadataHealthIndicator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package at.asitplus.eidas.specific.connector.health;
-
-import javax.xml.transform.TransformerFactoryConfigurationError;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.actuate.health.Health;
-import org.springframework.boot.actuate.health.HealthIndicator;
-
-import at.gv.egiz.eaaf.modules.pvp2.api.metadata.IPvpMetadataBuilderConfiguration;
-import at.gv.egiz.eaaf.modules.pvp2.api.metadata.IPvpMetadataConfigurationFactory;
-import at.gv.egiz.eaaf.modules.pvp2.impl.builder.PvpMetadataBuilder;
-import at.gv.egiz.eaaf.modules.pvp2.impl.utils.AbstractCredentialProvider;
-import lombok.Setter;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class Saml2MetadataHealthIndicator implements HealthIndicator {
-
- @Autowired
- private PvpMetadataBuilder metadatabuilder;
- @Autowired
- private IPvpMetadataConfigurationFactory configFactory;
-
- @Setter
- private AbstractCredentialProvider pvpIdpCredentials;
-
- @Override
- public Health health() {
- try {
- // build metadata
- final IPvpMetadataBuilderConfiguration metadataConfig =
- configFactory.generateMetadataBuilderConfiguration(
- "http://localhost/monitoring",
- pvpIdpCredentials);
- metadatabuilder.buildPvpMetadata(metadataConfig);
- return Health.up().build();
-
- } catch (Exception | TransformerFactoryConfigurationError e) {
- return Health.down().down(e).build();
-
- }
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/processes/CountrySelectionProcessImpl.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/processes/CountrySelectionProcessImpl.java
deleted file mode 100644
index 2ec86f53..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/processes/CountrySelectionProcessImpl.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
-*/
-
-package at.asitplus.eidas.specific.connector.processes;
-
-import org.apache.commons.lang3.StringUtils;
-
-import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
-import at.gv.egiz.eaaf.core.api.IRequest;
-import at.gv.egiz.eaaf.core.api.idp.auth.modules.AuthModule;
-import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
-
-/**
- * Auth-Process selector for User's country selection.
- *
- * @author tlenz
- *
- */
-public class CountrySelectionProcessImpl implements AuthModule {
-
- @Override
- public int getPriority() {
- return 0;
-
- }
-
- @Override
- public String selectProcess(ExecutionContext context, IRequest pendingReq) {
- final Object selectedCountryObj = context.get(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY);
- if (selectedCountryObj != null && selectedCountryObj instanceof String) {
- final String selectedCountry = (String) selectedCountryObj;
- if (StringUtils.isNotEmpty(selectedCountry)) {
- return null;
- }
-
- }
-
- return "CountrySelectionProcess";
-
- }
-
- @Override
- public String[] getProcessDefinitions() {
- return new String[] { "classpath:processes/CountrySelection.process.xml" };
-
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/processes/tasks/EvaluateCountrySelectionTask.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/processes/tasks/EvaluateCountrySelectionTask.java
deleted file mode 100644
index b2c5c51d..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/processes/tasks/EvaluateCountrySelectionTask.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
-*/
-
-package at.asitplus.eidas.specific.connector.processes.tasks;
-
-import java.util.Enumeration;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.lang.StringEscapeUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
-import at.gv.egiz.eaaf.core.api.data.EaafConstants;
-import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
-import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
-import at.gv.egiz.eaaf.core.impl.idp.controller.tasks.AbstractLocaleAuthServletTask;
-
-/**
- * Evaluate the User's country selection.
- *
- * @author tlenz
- *
- */
-@Component("EvaluateCountrySelectionTask")
-public class EvaluateCountrySelectionTask extends AbstractLocaleAuthServletTask {
- private static final Logger log = LoggerFactory.getLogger(EvaluateCountrySelectionTask.class);
-
- @Override
- public void executeWithLocale(ExecutionContext executionContext, HttpServletRequest request,
- HttpServletResponse response)
- throws TaskExecutionException {
- try {
-
- // set parameter execution context
- final Enumeration<String> reqParamNames = request.getParameterNames();
- while (reqParamNames.hasMoreElements()) {
- final String paramName = reqParamNames.nextElement();
- if (StringUtils.isNotEmpty(paramName)
- && !EaafConstants.PROCESS_ENGINE_PENDINGREQUESTID.equalsIgnoreCase(paramName)) {
- for (final String el : MsEidasNodeConstants.COUNTRY_SELECTION_PARAM_WHITELIST) {
- if (el.equalsIgnoreCase(paramName)) {
- executionContext.put(paramName,
- StringEscapeUtils.escapeHtml(request.getParameter(paramName)));
- }
- }
- }
- }
-
- log.info("Country selection finished. Starting auth. process for country ... ");
-
- } catch (final Exception e) {
- log.warn("EvaluateBKUSelectionTask has an internal error", e);
- throw new TaskExecutionException(pendingReq, e.getMessage(), e);
-
- }
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/processes/tasks/GenerateCountrySelectionFrameTask.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/processes/tasks/GenerateCountrySelectionFrameTask.java
deleted file mode 100644
index 57a4c19a..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/processes/tasks/GenerateCountrySelectionFrameTask.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
-*/
-
-package at.asitplus.eidas.specific.connector.processes.tasks;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import at.asitplus.eidas.specific.core.MsConnectorEventCodes;
-import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
-import at.asitplus.eidas.specific.core.gui.StaticGuiBuilderConfiguration;
-import at.gv.egiz.eaaf.core.api.gui.IGuiBuilderConfiguration;
-import at.gv.egiz.eaaf.core.api.gui.ISpringMvcGuiFormBuilder;
-import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
-import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
-import at.gv.egiz.eaaf.core.exceptions.EaafException;
-import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
-import at.gv.egiz.eaaf.core.impl.idp.controller.tasks.AbstractLocaleAuthServletTask;
-
-/**
- * Create country-selection page.
- *
- * @author tlenz
- *
- */
-@Component("GenerateCountrySelectionFrameTask")
-public class GenerateCountrySelectionFrameTask extends AbstractLocaleAuthServletTask {
-
- @Autowired
- ISpringMvcGuiFormBuilder guiBuilder;
- @Autowired
- IConfiguration basicConfig;
-
-
- @Override
- public void executeWithLocale(ExecutionContext executionContext, HttpServletRequest request,
- HttpServletResponse response) throws TaskExecutionException {
- try {
- revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.STARTING_COUNTRY_SELECTION);
-
- final IGuiBuilderConfiguration config = new StaticGuiBuilderConfiguration(
- basicConfig,
- pendingReq,
- basicConfig.getBasicConfiguration(
- MsEidasNodeConstants.PROP_CONFIG_WEBCONTENT_TEMPLATES_CCSELECTION,
- MsEidasNodeConstants.TEMPLATE_HTML_COUNTRYSELECTION),
- MsEidasNodeConstants.ENDPOINT_COUNTRYSELECTION,
- resourceLoader);
-
- guiBuilder.build(request, response, config, "BKU-Selection form");
-
- } catch (final Exception e) {
- throw new TaskExecutionException(pendingReq,
- "Can not build GUI. Msg:" + e.getMessage(),
- new EaafException("gui.00", new Object[] { e.getMessage() }, e));
-
- }
-
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/provider/PvpEndPointCredentialProvider.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/provider/PvpEndPointCredentialProvider.java
deleted file mode 100644
index 98e88eff..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/provider/PvpEndPointCredentialProvider.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
-*/
-
-package at.asitplus.eidas.specific.connector.provider;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
-import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
-import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;
-import at.gv.egiz.eaaf.core.impl.credential.KeyStoreConfiguration;
-import at.gv.egiz.eaaf.core.impl.credential.KeyStoreConfiguration.KeyStoreType;
-import at.gv.egiz.eaaf.modules.pvp2.impl.utils.AbstractCredentialProvider;
-
-public class PvpEndPointCredentialProvider extends AbstractCredentialProvider {
-
- @Autowired(required = true)
- IConfiguration basicConfiguration;
-
- @Override
- public KeyStoreConfiguration getBasicKeyStoreConfig() throws EaafConfigurationException {
- final KeyStoreConfiguration keyStoreConfig = new KeyStoreConfiguration();
- keyStoreConfig.setFriendlyName("PVP2 S-Profile EndPoint");
- keyStoreConfig.setKeyStoreType(
- basicConfiguration.getBasicConfiguration(MsEidasNodeConstants.CONFIG_PROPS_KEYSTORE_TYPE,
- KeyStoreType.PKCS12.getKeyStoreType()));
- keyStoreConfig.setKeyStoreName(
- basicConfiguration.getBasicConfiguration(MsEidasNodeConstants.CONFIG_PROPS_KEYSTORE_NAME));
- keyStoreConfig.setSoftKeyStoreFilePath(basicConfiguration.getBasicConfiguration(
- MsEidasNodeConstants.PROP_CONFIG_PVP2_KEYSTORE_PATH));
- keyStoreConfig.setSoftKeyStorePassword(
- basicConfiguration.getBasicConfiguration(MsEidasNodeConstants.PROP_CONFIG_PVP2_KEYSTORE_PASSWORD));
-
- keyStoreConfig.validate();
-
- return keyStoreConfig;
- }
-
-
- @Override
- public String getMetadataKeyAlias() {
- return basicConfiguration.getBasicConfiguration(MsEidasNodeConstants.PROP_CONFIG_PVP2_KEY_METADATA_ALIAS);
- }
-
- @Override
- public String getMetadataKeyPassword() {
- return basicConfiguration.getBasicConfiguration(
- MsEidasNodeConstants.PROP_CONFIG_PVP2_KEY_METADATA_PASSWORD);
-
- }
-
- @Override
- public String getSignatureKeyAlias() {
- return basicConfiguration.getBasicConfiguration(MsEidasNodeConstants.PROP_CONFIG_PVP2_KEY_SIGNING_ALIAS);
-
- }
-
- @Override
- public String getSignatureKeyPassword() {
- return basicConfiguration.getBasicConfiguration(
- MsEidasNodeConstants.PROP_CONFIG_PVP2_KEY_SIGNING_PASSWORD);
-
- }
-
- @Override
- public String getEncryptionKeyAlias() {
- return null;
-
- }
-
- @Override
- public String getEncryptionKeyPassword() {
- return null;
-
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/provider/PvpMetadataConfigurationFactory.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/provider/PvpMetadataConfigurationFactory.java
deleted file mode 100644
index e8bc4eb8..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/provider/PvpMetadataConfigurationFactory.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
-*/
-
-package at.asitplus.eidas.specific.connector.provider;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import at.asitplus.eidas.specific.connector.config.PvpMetadataConfiguration;
-import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
-import at.gv.egiz.eaaf.modules.pvp2.api.IPvp2BasicConfiguration;
-import at.gv.egiz.eaaf.modules.pvp2.api.metadata.IPvpMetadataBuilderConfiguration;
-import at.gv.egiz.eaaf.modules.pvp2.api.metadata.IPvpMetadataConfigurationFactory;
-import at.gv.egiz.eaaf.modules.pvp2.api.utils.IPvp2CredentialProvider;
-
-@Service("PVPMetadataConfigurationFactory")
-public class PvpMetadataConfigurationFactory implements IPvpMetadataConfigurationFactory {
-
- @Autowired
- private IConfiguration basicConfig;
- @Autowired
- private IPvp2BasicConfiguration pvpBasicConfig;
-
- @Override
- public IPvpMetadataBuilderConfiguration generateMetadataBuilderConfiguration(String authUrl,
- IPvp2CredentialProvider pvpIdpCredentials) {
- return new PvpMetadataConfiguration(basicConfig, authUrl, pvpBasicConfig, pvpIdpCredentials);
-
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/provider/PvpMetadataProvider.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/provider/PvpMetadataProvider.java
deleted file mode 100644
index 6161c271..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/provider/PvpMetadataProvider.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
-*/
-
-package at.asitplus.eidas.specific.connector.provider;
-
-import java.io.IOException;
-import java.security.KeyStore;
-import java.security.Provider;
-import java.security.cert.CertificateException;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-import org.opensaml.saml.metadata.resolver.MetadataResolver;
-import org.opensaml.saml.metadata.resolver.filter.MetadataFilter;
-import org.opensaml.saml.metadata.resolver.filter.MetadataFilterChain;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
-import at.gv.egiz.eaaf.core.api.idp.IConfigurationWithSP;
-import at.gv.egiz.eaaf.core.api.idp.ISpConfiguration;
-import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;
-import at.gv.egiz.eaaf.core.exceptions.EaafException;
-import at.gv.egiz.eaaf.core.impl.credential.EaafKeyStoreFactory;
-import at.gv.egiz.eaaf.core.impl.credential.KeyStoreConfiguration;
-import at.gv.egiz.eaaf.core.impl.credential.KeyStoreConfiguration.KeyStoreType;
-import at.gv.egiz.eaaf.core.impl.data.Pair;
-import at.gv.egiz.eaaf.core.impl.http.IHttpClientFactory;
-import at.gv.egiz.eaaf.modules.pvp2.exception.Pvp2MetadataException;
-import at.gv.egiz.eaaf.modules.pvp2.impl.metadata.AbstractChainingMetadataProvider;
-import at.gv.egiz.eaaf.modules.pvp2.impl.metadata.PvpMetadataResolverFactory;
-import at.gv.egiz.eaaf.modules.pvp2.impl.validation.metadata.PvpEntityCategoryFilter;
-import at.gv.egiz.eaaf.modules.pvp2.impl.validation.metadata.SchemaValidationFilter;
-import at.gv.egiz.eaaf.modules.pvp2.impl.validation.metadata.SimpleMetadataSignatureVerificationFilter;
-
-@Service("PVPMetadataProvider")
-public class PvpMetadataProvider extends AbstractChainingMetadataProvider {
- private static final Logger log = LoggerFactory.getLogger(PvpMetadataProvider.class);
-
- private static final String PROVIDER_ID_PATTERN = "eIDAS resolver: {0}";
-
- @Autowired(required = true)
- IConfigurationWithSP basicConfig;
- @Autowired
- private PvpMetadataResolverFactory metadataProviderFactory;
- @Autowired
- private IHttpClientFactory httpClientFactory;
-
- @Autowired
- private EaafKeyStoreFactory keyStoreFactory;
-
-
- @Override
- protected String getMetadataUrl(String entityId) throws EaafConfigurationException {
- final ISpConfiguration spConfig = basicConfig.getServiceProviderConfiguration(entityId);
- if (spConfig != null) {
- String metadataUrl = entityId;
-
- final String metadataUrlFromConfig = spConfig.getConfigurationValue(
- MsEidasNodeConstants.PROP_CONFIG_SP_PVP2_METADATA_URL);
- if (StringUtils.isNotEmpty(metadataUrlFromConfig)) {
- log.debug("Use metdataURL from configuration for EntityId: " + entityId);
- metadataUrl = metadataUrlFromConfig;
-
- }
-
- return metadataUrl;
-
- } else {
- log.info("No ServiceProvider with entityId: " + entityId + " in configuration.");
- }
-
- return null;
- }
-
- @Override
- protected MetadataResolver createNewMetadataProvider(String entityId)
- throws EaafConfigurationException, IOException, CertificateException {
- final ISpConfiguration spConfig = basicConfig.getServiceProviderConfiguration(entityId);
- if (spConfig != null) {
- try {
- String metadataUrl = spConfig.getConfigurationValue(
- MsEidasNodeConstants.PROP_CONFIG_SP_PVP2_METADATA_URL);
- if (StringUtils.isEmpty(metadataUrl)) {
- log.debug("Use EntityId: " + entityId + " instead of explicite metadataURL ... ");
- metadataUrl = entityId;
-
- }
-
- KeyStoreConfiguration keyStoreConfig = new KeyStoreConfiguration();
- keyStoreConfig.setFriendlyName(MessageFormat.format(PROVIDER_ID_PATTERN, entityId));
- keyStoreConfig.setKeyStoreType(KeyStoreType.JKS);
- keyStoreConfig.setSoftKeyStoreFilePath(
- spConfig.getConfigurationValue(MsEidasNodeConstants.PROP_CONFIG_SP_PVP2_METADATA_TRUSTSTORE));
- keyStoreConfig.setSoftKeyStorePassword(spConfig.getConfigurationValue(
- MsEidasNodeConstants.PROP_CONFIG_SP_PVP2_METADATA_TRUSTSTORE_PASSWORD));
-
- keyStoreConfig.validate();
-
- Pair<KeyStore, Provider> keyStore = keyStoreFactory.buildNewKeyStore(keyStoreConfig);
-
- final List<MetadataFilter> filterList = new ArrayList<>();
- filterList.add(new SchemaValidationFilter(true));
- filterList.add(new SimpleMetadataSignatureVerificationFilter(
- keyStore.getFirst(), entityId));
- filterList.add(new PvpEntityCategoryFilter(
- basicConfig.getBasicConfigurationBoolean(MsEidasNodeConstants.PROP_CONFIG_PVP_ENABLE_ENTITYCATEGORIES,
- true)));
-
- final MetadataFilterChain filter = new MetadataFilterChain();
- filter.setFilters(filterList);
-
- try {
- return metadataProviderFactory.createMetadataProvider(getMetadataUrl(entityId),
- filter,
- MessageFormat.format(PROVIDER_ID_PATTERN, entityId),
- httpClientFactory.getHttpClient());
-
- } catch (final Pvp2MetadataException e) {
- log.info("Can NOT build metadata provider for entityId: {}", entityId);
- throw new EaafConfigurationException("module.eidasauth.04",
- new Object[] { entityId, e.getMessage() }, e);
-
- }
-
- } catch (final EaafException e) {
- log.info("Can NOT initialize Metadata signature-verification filter. Reason: " + e.getMessage());
- throw new EaafConfigurationException("config.27",
- new Object[] { "Can NOT initialize Metadata signature-verification filter. Reason: " + e
- .getMessage() }, e);
-
- }
-
- } else {
- log.info("No ServiceProvider with entityId: " + entityId + " in configuration.");
- }
-
- return null;
- }
-
- @Override
- protected List<String> getAllMetadataUrlsFromConfiguration() throws EaafConfigurationException {
- return Collections.emptyList();
- }
-
- @Override
- protected String getMetadataProviderId() {
- return "Service-provider chainging metadata provider";
-
- }
-
- @Override
- public void doDestroy() {
- this.fullyDestroy();
-
- }
-
-}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/verification/AuthnRequestValidator.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/verification/AuthnRequestValidator.java
deleted file mode 100644
index 23702264..00000000
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/verification/AuthnRequestValidator.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
-*/
-
-package at.asitplus.eidas.specific.connector.verification;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.lang3.StringUtils;
-import org.opensaml.core.xml.XMLObject;
-import org.opensaml.saml.saml2.core.AuthnContextClassRef;
-import org.opensaml.saml.saml2.core.AuthnContextComparisonTypeEnumeration;
-import org.opensaml.saml.saml2.core.AuthnRequest;
-import org.opensaml.saml.saml2.core.NameIDPolicy;
-import org.opensaml.saml.saml2.core.NameIDType;
-import org.opensaml.saml.saml2.core.RequestedAuthnContext;
-import org.opensaml.saml.saml2.core.Scoping;
-import org.opensaml.saml.saml2.metadata.SPSSODescriptor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
-import at.asitplus.eidas.specific.core.config.ServiceProviderConfiguration;
-import at.gv.egiz.eaaf.core.api.IRequest;
-import at.gv.egiz.eaaf.core.api.data.EaafConstants;
-import at.gv.egiz.eaaf.core.api.data.ExtendedPvpAttributeDefinitions;
-import at.gv.egiz.eaaf.core.api.data.PvpAttributeDefinitions;
-import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
-import at.gv.egiz.eaaf.core.exceptions.AuthnRequestValidatorException;
-import at.gv.egiz.eaaf.core.exceptions.EaafException;
-import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
-import at.gv.egiz.eaaf.core.impl.idp.controller.protocols.RequestImpl;
-import at.gv.egiz.eaaf.core.impl.utils.TransactionIdUtils;
-import at.gv.egiz.eaaf.modules.pvp2.api.reqattr.EaafRequestedAttribute;
-import at.gv.egiz.eaaf.modules.pvp2.api.reqattr.EaafRequestedAttributes;
-import at.gv.egiz.eaaf.modules.pvp2.api.validation.IAuthnRequestPostProcessor;
-import at.gv.egiz.eaaf.modules.pvp2.exception.NameIdFormatNotSupportedException;
-import eu.eidas.auth.commons.protocol.eidas.LevelOfAssurance;
-
-public class AuthnRequestValidator implements IAuthnRequestPostProcessor {
-
- private static final Logger log = LoggerFactory.getLogger(AuthnRequestValidator.class);
-
- @Autowired(required = true)
- private IConfiguration basicConfig;
-
- @Override
- public void process(HttpServletRequest httpReq, IRequest pendingReq, AuthnRequest authnReq,
- SPSSODescriptor spSsoDescriptor) throws AuthnRequestValidatorException {
- try {
- // validate NameIDPolicy
- final NameIDPolicy nameIdPolicy = authnReq.getNameIDPolicy();
- if (nameIdPolicy != null) {
- final String nameIdFormat = nameIdPolicy.getFormat();
- if (nameIdFormat != null) {
- if (!(NameIDType.TRANSIENT.equals(nameIdFormat)
- || NameIDType.PERSISTENT.equals(nameIdFormat))) {
-
- throw new NameIdFormatNotSupportedException(nameIdFormat);
-
- }
-
- } else {
- log.trace("Find NameIDPolicy, but NameIDFormat is 'null'");
- }
- } else {
- log.trace("AuthnRequest includes no 'NameIDPolicy'");
- }
-
- // post-process RequesterId
- final String spEntityId = extractScopeRequsterId(authnReq);
- if (StringUtils.isEmpty(spEntityId)) {
- log.info("NO service-provider entityID in Authn. request. Stop authn. process ... ");
- throw new AuthnRequestValidatorException("pvp2.22",
- new Object[] { "NO relaying-party entityID in Authn. request" }, pendingReq);
-
- } else {
- pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, spEntityId);
- }
-
- // post-process ProviderName
- final String providerName = authnReq.getProviderName();
- if (StringUtils.isEmpty(providerName)) {
- log.info("Authn. request contains NO SP friendlyName");
- } else {
- pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_PROVIDERNAME, providerName);
- }
-
- // post-process requested LoA
- postprocessLoaLevel(pendingReq, authnReq);
-
- // post-process requested LoA comparison-level
- pendingReq.getServiceProviderConfiguration(ServiceProviderConfiguration.class).setLoAMachtingMode(
- extractComparisonLevel(authnReq));
-
- // extract information from requested attributes
- extractFromRequestedAttriutes(pendingReq, authnReq);
-
- } catch (final EaafStorageException e) {
- log.info("Can NOT store Authn. Req. data into pendingRequest.", e);
- throw new AuthnRequestValidatorException("internal.02", null, e);
-
- }
-
- }
-
- private void extractFromRequestedAttriutes(IRequest pendingReq, AuthnRequest authnReq)
- throws AuthnRequestValidatorException, EaafStorageException {
- // validate and process requested attributes
- boolean sectorDetected = false;
-
- final ServiceProviderConfiguration spConfig = pendingReq.getServiceProviderConfiguration(
- ServiceProviderConfiguration.class);
-
- if (authnReq.getExtensions() != null) {
- final List<XMLObject> requestedAttributes = authnReq.getExtensions().getUnknownXMLObjects();
- for (final XMLObject reqAttrObj : requestedAttributes) {
- if (reqAttrObj instanceof EaafRequestedAttributes) {
- final EaafRequestedAttributes reqAttr = (EaafRequestedAttributes) reqAttrObj;
- if (reqAttr.getAttributes() != null && reqAttr.getAttributes().size() != 0) {
- for (final EaafRequestedAttribute el : reqAttr.getAttributes()) {
- log.trace("Processing req. attribute '" + el.getName() + "' ... ");
- if (el.getName().equals(PvpAttributeDefinitions.EID_SECTOR_FOR_IDENTIFIER_NAME)) {
- sectorDetected = extractBpkTargetIdentifier(el, spConfig);
-
- } else if (el.getName().equals(ExtendedPvpAttributeDefinitions.EID_TRANSACTION_ID_NAME)) {
- extractUniqueTransactionId(el, pendingReq);
-
- } else if (el.getName().equals(MsEidasNodeConstants.EID_BINDING_PUBLIC_KEY_NAME)) {
- extractBindingPublicKey(el, pendingReq);
-
- } else {
- log.debug("Ignore req. attribute: " + el.getName());
-
- }
- }
-
- } else {
- log.debug("No requested Attributes in Authn. Request");
-
- }
-
- } else {
- log.info("Ignore unknown requested attribute: " + reqAttrObj.getElementQName().toString());
-
- }
- }
- }
-
- if (!sectorDetected) {
- log.warn("Authn.Req validation FAILED. Reason: Contains NO or NO VALID target-sector information.");
- throw new AuthnRequestValidatorException("pvp2.22", new Object[] {
- "NO or NO VALID target-sector information" });
-
- }
-
- }
-
- private void extractBindingPublicKey(EaafRequestedAttribute el, IRequest pendingReq)
- throws EaafStorageException {
- if (el.getAttributeValues() != null && el.getAttributeValues().size() == 1) {
- final String bindingPubKey = el.getAttributeValues().get(0).getDOM().getTextContent();
- pendingReq.setRawDataToTransaction(MsEidasNodeConstants.EID_BINDING_PUBLIC_KEY_NAME, bindingPubKey);
- log.info("Find Binding Public-Key. eIDAS authentication will be used to create an ID Austria Binding");
-
- } else {
- log.warn(
- "Req. attribute '{}' contains NO or MORE THEN ONE attribute-values. Ignore full req. attribute",
- el.getName());
-
- }
- }
-
- /**
- * Extract unique transactionId from AuthnRequest.
- *
- * @param el Requested attribute from AuthnRequest
- * @param pendingReq Current pendingRequest object (has to be of type
- * {@link RequestImpl})
- * @return <code>true</code> if transactionId extraction was successful,
- * otherwise <code>false</code>
- */
- private boolean extractUniqueTransactionId(EaafRequestedAttribute el, IRequest pendingReq) {
- if (!(pendingReq instanceof RequestImpl)) {
- log.warn(
- "Can NOT set unique transactionId from AuthnRequest,because 'PendingRequest' is NOT from Type: {}",
- RequestImpl.class.getName());
-
- } else {
- if (el.getAttributeValues() != null && el.getAttributeValues().size() == 1) {
- final String transactionId = el.getAttributeValues().get(0).getDOM().getTextContent();
- ((RequestImpl) pendingReq).setUniqueTransactionIdentifier(transactionId);
- log.info("Find transactionId: {} from requesting service. Replace old id: {} ",
- transactionId, TransactionIdUtils.getTransactionId());
- TransactionIdUtils.setTransactionId(transactionId);
-
- return true;
-
- } else {
- log.warn(
- "Req. attribute '{}' contains NO or MORE THEN ONE attribute-values. Ignore full req. attribute",
- el.getName());
-
- }
-
- }
-
- return false;
- }
-
- /**
- * Extract the bPK target from requested attribute.
- *
- * @param el Requested attribute from AuthnRequest
- * @param spConfig Service-Provider configuration for current process
- * @return <code>true</code> if bPK target extraction was successful, otherwise
- * <code>false</code>
- */
- private boolean extractBpkTargetIdentifier(EaafRequestedAttribute el,
- ServiceProviderConfiguration spConfig) {
- if (el.getAttributeValues() != null && el.getAttributeValues().size() == 1) {
- final String sectorId = el.getAttributeValues().get(0).getDOM().getTextContent();
- try {
- spConfig.setBpkTargetIdentifier(sectorId);
- return true;
-
- } catch (final EaafException e) {
- log.warn("Requested sector: " + sectorId + " DOES NOT match to allowed sectors for SP: "
- + spConfig.getUniqueIdentifier());
- }
-
- } else {
- log.warn("Req. attribute '" + el.getName()
- + "' contains NO or MORE THEN ONE attribute-values. Ignore full req. attribute");
- }
-
- return false;
-
- }
-
- private void postprocessLoaLevel(IRequest pendingReq, AuthnRequest authnReq)
- throws AuthnRequestValidatorException {
- final List<String> reqLoA = extractLoA(authnReq);
- log.trace("SP requests LoA with: {}", String.join(", ", reqLoA));
-
- LevelOfAssurance minimumLoAFromConfig = LevelOfAssurance.fromString(basicConfig.getBasicConfiguration(
- MsEidasNodeConstants.PROP_EIDAS_REQUEST_LOA_MINIMUM_LEVEL,
- EaafConstants.EIDAS_LOA_HIGH));
- if (minimumLoAFromConfig == null) {
- log.warn("Can not load minimum LoA from configuration. Use LoA: {} as default",
- EaafConstants.EIDAS_LOA_HIGH);
- minimumLoAFromConfig = LevelOfAssurance.HIGH;
-
- }
-
- log.trace("Validate requested LoA to connector configuration minimum LoA: {} ...",
- minimumLoAFromConfig);
- final List<String> allowedLoA = new ArrayList<>();
- for (final String loa : reqLoA) {
- try {
- final LevelOfAssurance intLoa = LevelOfAssurance.fromString(loa);
- String selectedLoA = EaafConstants.EIDAS_LOA_HIGH;
- if (intLoa != null
- && intLoa.numericValue() <= minimumLoAFromConfig.numericValue()) {
- log.info("Client: {} requested LoA: {} will be upgraded to: {}",
- pendingReq.getServiceProviderConfiguration().getUniqueIdentifier(),
- loa,
- minimumLoAFromConfig);
- selectedLoA = minimumLoAFromConfig.getValue();
-
- }
-
- if (!allowedLoA.contains(selectedLoA)) {
- log.debug("Allow LoA: {} for Client: {}",
- selectedLoA,
- pendingReq.getServiceProviderConfiguration().getUniqueIdentifier());
- allowedLoA.add(selectedLoA);
-
- }
-
- } catch (final IllegalArgumentException e) {
- log.warn("LoA: {} is currently NOT supported and it will be ignored.", loa);
-
- }
-
- }
-
- pendingReq.getServiceProviderConfiguration(ServiceProviderConfiguration.class).setRequiredLoA(
- allowedLoA);
-
- }
-
- private String extractComparisonLevel(AuthnRequest authnReq) {
- if (authnReq.getRequestedAuthnContext() != null) {
- final RequestedAuthnContext authContext = authnReq.getRequestedAuthnContext();
- return authContext.getComparison().toString();
-
- }
-
- return null;
- }
-
- private List<String> extractLoA(AuthnRequest authnReq) throws AuthnRequestValidatorException {
- final List<String> result = new ArrayList<>();
- if (authnReq.getRequestedAuthnContext() != null) {
- final RequestedAuthnContext authContext = authnReq.getRequestedAuthnContext();
- if (authContext.getComparison().equals(AuthnContextComparisonTypeEnumeration.MINIMUM)) {
- if (authContext.getAuthnContextClassRefs().isEmpty()) {
- log.debug("Authn. Req. contains no requested LoA");
-
- } else if (authContext.getAuthnContextClassRefs().size() > 1) {
- log.info("Authn. Req. contains MORE THAN ONE requested LoA, but "
- + AuthnContextComparisonTypeEnumeration.MINIMUM + " allows only one");
- throw new AuthnRequestValidatorException("pvp2.22",
- new Object[] { "Authn. Req. contains MORE THAN ONE requested LoA, but "
- + AuthnContextComparisonTypeEnumeration.MINIMUM + " allows only one" });
-
- } else {
- result.add(authContext.getAuthnContextClassRefs().get(0).getAuthnContextClassRef());
- }
-
- } else if (authContext.getComparison().equals(AuthnContextComparisonTypeEnumeration.EXACT)) {
- for (final AuthnContextClassRef el : authContext.getAuthnContextClassRefs()) {
- result.add(el.getAuthnContextClassRef());
- }
-
- } else {
- log.info("Currently only '" + AuthnContextComparisonTypeEnumeration.MINIMUM + "' and '"
- + AuthnContextComparisonTypeEnumeration.EXACT + "' are supported");
- throw new AuthnRequestValidatorException("pvp2.22",
- new Object[] { "Currently only '" + AuthnContextComparisonTypeEnumeration.MINIMUM + "' and '"
- + AuthnContextComparisonTypeEnumeration.EXACT + "' are supported" });
-
- }
-
- }
-
- return result;
- }
-
- private String extractScopeRequsterId(AuthnRequest authnReq) {
- if (authnReq.getScoping() != null) {
- final Scoping scoping = authnReq.getScoping();
- if (scoping.getRequesterIDs() != null
- && scoping.getRequesterIDs().size() > 0) {
- if (scoping.getRequesterIDs().size() == 1) {
- return scoping.getRequesterIDs().get(0).getRequesterID();
- } else {
- log.info("Authn. request contains more than on RequesterIDs! Only use first one");
- return scoping.getRequesterIDs().get(0).getRequesterID();
-
- }
- }
- }
-
- return null;
- }
-
-}
diff --git a/connector/src/main/resources/META-INF/services/at.gv.egiz.components.spring.api.SpringResourceProvider b/connector/src/main/resources/META-INF/services/at.gv.egiz.components.spring.api.SpringResourceProvider
deleted file mode 100644
index 4c2aef74..00000000
--- a/connector/src/main/resources/META-INF/services/at.gv.egiz.components.spring.api.SpringResourceProvider
+++ /dev/null
@@ -1 +0,0 @@
-at.asitplus.eidas.specific.connector.MsSpecificEidasNodeSpringResourceProvider \ No newline at end of file
diff --git a/connector/src/main/resources/META-INF/services/at.gv.egiz.eaaf.core.api.idp.IAttributeBuilder b/connector/src/main/resources/META-INF/services/at.gv.egiz.eaaf.core.api.idp.IAttributeBuilder
deleted file mode 100644
index 8508cc4b..00000000
--- a/connector/src/main/resources/META-INF/services/at.gv.egiz.eaaf.core.api.idp.IAttributeBuilder
+++ /dev/null
@@ -1,2 +0,0 @@
-at.asitplus.eidas.specific.connector.attributes.AuthBlockAttributeBuilder
-at.asitplus.eidas.specific.connector.attributes.EidasBindAttributeBuilder
diff --git a/connector/src/main/resources/META-INF/services/at.gv.egiz.eaaf.core.api.idp.auth.modules.AuthModule b/connector/src/main/resources/META-INF/services/at.gv.egiz.eaaf.core.api.idp.auth.modules.AuthModule
deleted file mode 100644
index 146191c0..00000000
--- a/connector/src/main/resources/META-INF/services/at.gv.egiz.eaaf.core.api.idp.auth.modules.AuthModule
+++ /dev/null
@@ -1 +0,0 @@
-at.asitplus.eidas.specific.connector.processes.CountrySelectionProcessImpl \ No newline at end of file
diff --git a/connector/src/main/resources/application.properties b/connector/src/main/resources/application.properties
deleted file mode 100644
index 700f4d74..00000000
--- a/connector/src/main/resources/application.properties
+++ /dev/null
@@ -1,288 +0,0 @@
-## Set Spring-Boot profile-configuration to 2.3 style
-spring.config.use-legacy-processing=true
-
-## ApplicationServer configuration
-server.servlet.contextPath=/ms_connector
-#server.port=7080
-
-app.build.artifactId=ms_connector
-
-
-
-#############################################################################
-## SpringBoot Admin client
-spring.boot.admin.client.enabled=false
-
-#############################################################################
-## SpringBoot Actuator
-management.endpoints.web.exposure.include=health,info
-
-#############################################################################
-## Common parts of MS-speccific eIDAS application configuration
-
-#eidas.ms.context.url.prefix=
-eidas.ms.context.url.request.validation=false
-#eidas.ms.configRootDir=file:/.../config/
-eidas.ms.context.use.clustermode=true
-eidas.ms.core.logging.level.info.errorcodes=auth.21
-
-##Monitoring
-eidas.ms.monitoring.eIDASNode.metadata.url=
-
-
-##Specific logger configuration
-eidas.ms.technicallog.write.MDS.into.techlog=true
-eidas.ms.revisionlog.write.MDS.into.revisionlog=true
-eidas.ms.revisionlog.logIPAddressOfUser=true
-
-
-##Directory for static Web content
-eidas.ms.webcontent.static.directory=webcontent/
-eidas.ms.webcontent.templates=templates/
-eidas.ms.webcontent.properties=properties/messages
-eidas.ms.webcontent.templates.countryselection=countrySelection.html
-
-
-## extended validation of pending-request Id's
-eidas.ms.core.pendingrequestid.maxlifetime=300
-eidas.ms.core.pendingrequestid.digist.algorithm=HmacSHA256
-#eidas.ms.core.pendingrequestid.digist.secret=pendingReqIdSecret
-
-
-## HTTP-client defaults
-eidas.ms.client.http.connection.timeout.socket=15
-eidas.ms.client.http.connection.timeout.connection=15
-eidas.ms.client.http.connection.timeout.request=15
-
-
-## Common PVP2 S-Profile (SAML2) configuration
-#eidas.ms.pvp2.metadata.organisation.name=JUnit
-#eidas.ms.pvp2.metadata.organisation.friendyname=For testing with jUnit
-#eidas.ms.pvp2.metadata.organisation.url=http://junit.test
-#eidas.ms.pvp2.metadata.contact.givenname=Max
-#eidas.ms.pvp2.metadata.contact.surname=Mustermann
-#eidas.ms.pvp2.metadata.contact.email=max@junit.test
-
-##only for advanced config
-eidas.ms.configuration.pvp.scheme.validation=true
-eidas.ms.configuration.pvp.enable.entitycategories=false
-
-
-
-#############################################################################
-## MS-speccific eIDAS-Connector configuration
-
-## eIDAS Ref. Implementation connector ###
-eidas.ms.auth.eIDAS.node_v2.entityId=ownSpecificConnector
-eidas.ms.auth.eIDAS.eid.testidentity.default=false
-
-#eidas.ms.auth.eIDAS.node_v2.forward.endpoint=
-eidas.ms.auth.eIDAS.node_v2.forward.method=POST
-eidas.ms.auth.eIDAS.node_v2.countrycode=AT
-eidas.ms.auth.eIDAS.node_v2.publicSectorTargets=urn:publicid:gv.at:cdid\+.*
-
-## use SAML2 requestId as transactionIdentifier to mitigate problems with SAML2 relaystate
-eidas.ms.auth.eIDAS.node_v2.workarounds.useRequestIdAsTransactionIdentifier=true
-
-## use hashed version of unique SP-Identifier as requesterId
-eidas.ms.auth.eIDAS.node_v2.requesterId.useHashedForm=true
-
-## user static requesterId for all SP's in case of LU
-eidas.ms.auth.eIDAS.node_v2.requesterId.lu.useStaticRequesterForAll=true
-
-
-## set provider name for all public SPs
-eidas.ms.auth.eIDAS.node_v2.workarounds.addAlwaysProviderName=false
-
-## set NameIdPolicy to 'unspecified' as work-around for DE Middleware v1.2.x
-eidas.ms.auth.eIDAS.node_v2.requested.nameIdFormat=urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
-
-eidas.ms.auth.eIDAS.node_v2.loa.requested.minimum=http://eidas.europa.eu/LoA/high
-
-#eidas.ms.auth.eIDAS.szrclient.useTestService=true
-#eidas.ms.auth.eIDAS.szrclient.endpoint.prod=
-#eidas.ms.auth.eIDAS.szrclient.endpoint.test=http://localhost:1234/demoszr
-#eidas.ms.auth.eIDAS.szrclient.ssl.keyStore.type=jks
-#eidas.ms.auth.eIDAS.szrclient.ssl.keyStore.path=keys/junit.jks
-#eidas.ms.auth.eIDAS.szrclient.ssl.keyStore.password=password
-#eidas.ms.auth.eIDAS.szrclient.ssl.key.alias=
-#eidas.ms.auth.eIDAS.szrclient.ssl.key.password=
-
-#eidas.ms.auth.eIDAS.szrclient.ssl.trustStore.type=
-#eidas.ms.auth.eIDAS.szrclient.ssl.trustStore.path=
-#eidas.ms.auth.eIDAS.szrclient.ssl.trustStore.password=
-eidas.ms.auth.eIDAS.szrclient.timeout.connection=15
-eidas.ms.auth.eIDAS.szrclient.timeout.response=30
-eidas.ms.auth.eIDAS.szrclient.params.vkz=
-
-eidas.ms.auth.eIDAS.szrclient.params.useSZRForbPKCalculation=false
-eidas.ms.auth.eIDAS.szrclient.eidasbind.mds.inject=false
-
-
-# tech. AuthBlock signing for E-ID process
-#eidas.ms.auth.eIDAS.authblock.keystore.password=f/+saJBc3a}*/T^s
-#eidas.ms.auth.eIDAS.authblock.keystore.friendlyName=connectorkeypair
-#eidas.ms.auth.eIDAS.authblock.keystore.path=keys/teststore.jks
-#eidas.ms.auth.eIDAS.authblock.keystore.type=jks
-#eidas.ms.auth.eIDAS.authblock.key.alias=connectorkeypair
-#eidas.ms.auth.eIDAS.authblock.key.password=f/+saJBc3a}*/T^s
-
-
-
-#### matching######
-# ZMR communication
-#eidas.ms.auth.eIDAS.zmrclient.endpoint=http://localhost:1234/demozmr
-#eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.type=jks
-#eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.path=keys/junit.jks
-#eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.password=password
-#eidas.ms.auth.eIDAS.zmrclient.ssl.key.alias=
-#eidas.ms.auth.eIDAS.zmrclient.ssl.key.password=
-
-#eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.type=
-#eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.path=
-#eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.password=
-
-eidas.ms.auth.eIDAS.zmrclient.timeout.connection=15
-eidas.ms.auth.eIDAS.zmrclient.timeout.response=30
-
-#eidas.ms.auth.eIDAS.zmrclient.req.organisation.behoerdennr=jUnit123456
-eidas.ms.auth.eIDAS.zmrclient.req.update.reason.code=PERS_AENDERN
-eidas.ms.auth.eIDAS.zmrclient.req.update.reason.text=KITT for eIDAS Matching
-eidas.ms.auth.eIDAS.zmrclient.debug.logfullmessages=false
-
-
-# ERnP communication
-#eidas.ms.auth.eIDAS.ernpclient.endpoint=http://localhost:1718/demoernp
-#eidas.ms.auth.eIDAS.ernpclient.req.organisation.behoerdennr=jUnit123456
-#eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.type=jks
-#eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.path=../keystore/junit_test.jks
-#eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.password=password
-#eidas.ms.auth.eIDAS.ernpclient.ssl.key.alias=meta
-#eidas.ms.auth.eIDAS.ernpclient.ssl.key.password=password
-
-# SAML2 ID Austria client for matching
-#eidas.ms.modules.idaustriaclient.keystore.type=jks
-#eidas.ms.modules.idaustriaclient.keystore.path=
-#eidas.ms.modules.idaustriaclient.keystore.password=
-#eidas.ms.modules.idaustriaclient.metadata.sign.alias=
-#eidas.ms.modules.idaustriaclient.metadata.sign.password=
-#eidas.ms.modules.idaustriaclient.request.sign.alias=
-#eidas.ms.modules.idaustriaclient.request.sign.password=
-#eidas.ms.modules.idaustriaclient.response.encryption.alias=
-#eidas.ms.modules.idaustriaclient.response.encryption.password=
-
-#eidas.ms.modules.idaustriaclient.truststore.type=jks
-#eidas.ms.modules.idaustriaclient.truststore.path=
-#eidas.ms.modules.idaustriaclient.truststore.password=
-
-#eidas.ms.modules.idaustriaclient.idaustria.idp.entityId=
-#eidas.ms.modules.idaustriaclient.idaustria.idp.metadataUrl=
-
-
-
-
-
-#Raw eIDAS Id data storage
-eidas.ms.auth.eIDAS.szrclient.workarounds.eidmapping.revisionlog.active=true
-eidas.ms.auth.eIDAS.szrclient.workarounds.use.getidentitylink.for.ida=true
-
-eidas.ms.auth.eIDAS.szrclient.params.setPlaceOfBirthIfAvailable=true
-eidas.ms.auth.eIDAS.szrclient.params.setBirthNameIfAvailable=true
-
-eidas.ms.auth.eIDAS.szrclient.debug.logfullmessages=false
-eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution=false
-
-
-##without mandates
-eidas.ms.auth.eIDAS.node_v2.attributes.requested.onlynatural.0=PersonIdentifier,true
-eidas.ms.auth.eIDAS.node_v2.attributes.requested.onlynatural.1=FamilyName,true
-eidas.ms.auth.eIDAS.node_v2.attributes.requested.onlynatural.2=FirstName,true
-eidas.ms.auth.eIDAS.node_v2.attributes.requested.onlynatural.3=DateOfBirth,true
-
-eidas.ms.auth.eIDAS.node_v2.attributes.requested.de.onlynatural.4=PlaceOfBirth,false
-eidas.ms.auth.eIDAS.node_v2.attributes.requested.de.onlynatural.5=BirthName,false
-eidas.ms.auth.eIDAS.node_v2.attributes.requested.de.onlynatural.6=Gender,false
-eidas.ms.auth.eIDAS.node_v2.attributes.requested.de.onlynatural.7=CurrentAddress,false
-
-##with mandates ---- NOT FULLY SUPPORTED AT THE MOMENT -----
-eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.0=PersonIdentifier,true
-eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.1=FamilyName,true
-eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.2=FirstName,true
-eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.3=DateOfBirth,true
-eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.4=LegalPerson,true
-eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.5=LegalName,true
-
-
-## PVP2 S-Profile end-point configuration
-#eidas.ms.pvp2.keystore.type=jks
-#eidas.ms.pvp2.keystore.path=keys/junit.jks
-#eidas.ms.pvp2.keystore.password=password
-#eidas.ms.pvp2.key.metadata.alias=meta
-#eidas.ms.pvp2.key.metadata.password=password
-#eidas.ms.pvp2.key.signing.alias=sig
-#eidas.ms.pvp2.key.signing.password=password
-eidas.ms.pvp2.metadata.validity=24
-
-
-## Service Provider configuration
-#eidas.ms.sp.0.uniqueID=https://demo.egiz.gv.at/demoportal_moaid-2.0/sp/eidas/metadata
-#eidas.ms.sp.0.pvp2.metadata.truststore=keys/junit.jks
-#eidas.ms.sp.0.pvp2.metadata.truststore.password=password
-#eidas.ms.sp.0.friendlyName=jUnit test
-#eidas.ms.sp.0.pvp2.metadata.url=
-#eidas.ms.sp.0.policy.allowed.requested.targets=.*
-#eidas.ms.sp.0.policy.hasBaseIdTransferRestriction=false
-
-
-##only for advanced config
-eidas.ms.configuration.sp.disableRegistrationRequirement=false
-
-
-
-#############################################################################
-## MS-speccific eIDAS-Proxy-Service configuration
-
-#### eIDAS ms-specific Proxy-Service configuration
-eidas.ms.auth.eIDAS.node_v2.proxy.entityId=ownSpecificProxy
-#eidas.ms.auth.eIDAS.node_v2.proxy.forward.endpoint=
-
-# Mandate configuration
-eidas.ms.auth.eIDAS.proxy.mandates.enabled=false
-#eidas.ms.auth.eIDAS.proxy.mandates.profiles.natural.default=
-#eidas.ms.auth.eIDAS.proxy.mandates.profiles.legal.default=
-
-
-## special foreign eIDAS-Connector configuration
-#eidas.ms.connector.0.uniqueID=https://demo.egiz.gv.at/demoportal_moaid-2.0/sp/eidas/metadata
-#eidas.ms.connector.0.countryCode=CC
-#eidas.ms.connector.0.mandates.enabled=false
-#eidas.ms.connector.0.mandates.natural=
-#eidas.ms.connector.0.mandates.legal=
-#eidas.ms.connector.0.auth.idaustria.entityId=
-
-
-## PVP2 S-Profile communication with ID Austria System
-# EntityId and optional metadata of ID Austria System
-#eidas.ms.modules.idaustriaauth.idp.entityId=
-#eidas.ms.modules.idaustriaauth.idp.metadataUrl=
-
-# SAML2 client configuration
-eidas.ms.modules.idaustriaauth.keystore.type=jks
-#eidas.ms.modules.idaustriaauth.keystore.name=
-#eidas.ms.modules.idaustriaauth.keystore.path=
-#eidas.ms.modules.idaustriaauth.keystore.password=
-#eidas.ms.modules.idaustriaauth.metadata.sign.alias=
-#eidas.ms.modules.idaustriaauth.metadata.sign.password=
-#eidas.ms.modules.idaustriaauth.request.sign.alias=
-#eidas.ms.modules.idaustriaauth.request.sign.password=
-#eidas.ms.modules.idaustriaauth.response.encryption.alias=
-#eidas.ms.modules.idaustriaauth.response.encryption.password=
-
-# TrustStore to validate SAML2 metadata from ID Austria
-#eidas.ms.modules.idaustriaauth.truststore.type=jks
-#eidas.ms.modules.idaustriaauth.truststore.name=
-#eidas.ms.modules.idaustriaauth.truststore.path=
-#eidas.ms.modules.idaustriaauth.truststore.password=
-
-
-
diff --git a/connector/src/main/resources/applicationContext.xml b/connector/src/main/resources/applicationContext.xml
deleted file mode 100644
index 5c5e245c..00000000
--- a/connector/src/main/resources/applicationContext.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx.xsd">
-
- <context:annotation-config />
- <context:component-scan base-package="at.gv.egiz.eaaf.utils.springboot.ajp"/>
-
- <mvc:interceptors>
- <bean
- class="at.asitplus.eidas.specific.core.interceptor.WebFrontEndSecurityInterceptor" />
- <bean
- class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
- <property name="paramName" value="lang" />
- </bean>
- </mvc:interceptors>
-
- <bean id="springContextClosingHandler"
- class="at.asitplus.eidas.specific.core.SpringContextCloseHandler" />
-
- <bean class="at.asitplus.eidas.specific.core.controller.DataBinderControllerAdvice" />
-
- <beans profile="deprecatedConfig">
- <bean id="BasicMSSpecificNodeConfig"
- class="at.asitplus.eidas.specific.core.config.BasicConfigurationProvider">
- <constructor-arg value="#{systemProperties['eidas.ms.configuration']}" />
- </bean>
- </beans>
- <beans profile="!deprecatedConfig">
- <bean id="springBootMsSpecificNodeConfig"
- class="at.asitplus.eidas.specific.core.config.SpringBootBasicConfigurationProvider" />
-
- </beans>
-
-</beans>
diff --git a/connector/src/main/resources/logback.xml b/connector/src/main/resources/logback.xml
deleted file mode 100644
index 9679d9e4..00000000
--- a/connector/src/main/resources/logback.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- For assistance related to logback-translator or configuration -->
-<!-- files in general, please contact the logback user mailing list -->
-<!-- at http://www.qos.ch/mailman/listinfo/logback-user -->
-<!-- -->
-<!-- For professional support please see -->
-<!-- http://www.qos.ch/shop/products/professionalSupport -->
-<!-- -->
-<configuration>
- <appender name="console"
- class="ch.qos.logback.core.ConsoleAppender">
- <encoder>
- <pattern>%5p | %d{dd HH:mm:ss,SSS} | %20c | %10t | %m%n</pattern>
- </encoder>
- </appender>
- <logger name="at.gv.egiz.eaaf" level="info">
- <appender-ref ref="console" />
- </logger>
- <logger name="eu.eidas" additivity="false" level="info">
- <appender-ref ref="console" />
- </logger>
- <logger name="at.gv.egiz.eidas.specific" additivity="false"
- level="info">
- <appender-ref ref="console" />
- </logger>
- <root level="info">
- <appender-ref ref="console" />
- </root>
-</configuration>
diff --git a/connector/src/main/resources/processes/CountrySelection.process.xml b/connector/src/main/resources/processes/CountrySelection.process.xml
deleted file mode 100644
index 9c76e9a9..00000000
--- a/connector/src/main/resources/processes/CountrySelection.process.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<pd:ProcessDefinition id="CountrySelectionProcess"
- xmlns:pd="http://reference.e-government.gv.at/namespace/moa/process/definition/v1">
-
- <pd:Task id="initializeCountrySelection"
- class="GenerateCountrySelectionFrameTask" />
- <pd:Task id="parseCountrySelection"
- class="EvaluateCountrySelectionTask" async="true" />
- <pd:Task id="restartAuthProzessManagement"
- class="RestartAuthProzessManagement" />
-
- <pd:StartEvent id="start" />
-
- <pd:Transition from="start"
- to="initializeCountrySelection" />
- <pd:Transition from="initializeCountrySelection"
- to="parseCountrySelection" />
-
- <pd:Transition from="parseCountrySelection"
- to="initializeCountrySelection"
- conditionExpression="ctx['changeLanguage']" />
- <pd:Transition from="parseCountrySelection"
- to="restartAuthProzessManagement" />
- <pd:Transition from="restartAuthProzessManagement"
- to="end" />
-
- <pd:EndEvent id="end" />
-
-</pd:ProcessDefinition>
diff --git a/connector/src/main/resources/properties/external_statuscodes_map.properties b/connector/src/main/resources/properties/external_statuscodes_map.properties
deleted file mode 100644
index a0951dfb..00000000
--- a/connector/src/main/resources/properties/external_statuscodes_map.properties
+++ /dev/null
@@ -1,76 +0,0 @@
-eidas.00=1302
-eidas.01=1302
-eidas.02=1301
-eidas.03=1300
-eidas.04=1100
-eidas.05=1302
-eidas.06=1302
-eidas.07=1302
-
-config.01=9099
-config.03=9099
-config.18=9099
-config.24=9099
-
-
-ernb.00=4601
-ernb.01=4601
-ernb.02=4600
-ernb.03=4602
-
-auth.00=1100
-
-auth.21=1005
-auth.26=1100
-auth.28=1100
-
-auth.37=1101
-auth.38=1101
-auth.39=1099
-
-process.01=9105
-process.02=9104
-process.03=9104
-process.04=9105
-
-builder.00=9102
-builder.11=1099
-
-parser.01=1101
-
-gui.00=9103
-
-pvp2.01=6100
-pvp2.02=6100
-pvp2.05=6105
-pvp2.07=6104
-pvp2.09=6199
-pvp2.10=6100
-pvp2.11=6105
-pvp2.12=6105
-pvp2.13=6199
-pvp2.14=6199
-pvp2.15=6103
-pvp2.16=6101
-pvp2.17=6102
-pvp2.20=6103
-pvp2.21=6104
-pvp2.22=6105
-pvp2.23=6105
-pvp2.24=6105
-pvp2.26=6103
-pvp2.27=6199
-pvp2.28=6105
-
-
-internal.00=9105
-internal.01=9199
-internal.02=9101
-internal.03=9199
-internal.04=9101
-internal.05=9106
-internal.06=9106
-
-config.08=9008
-config.27=9008
-config.30=9008 \ No newline at end of file
diff --git a/connector/src/main/resources/properties/messages.properties b/connector/src/main/resources/properties/messages.properties
deleted file mode 100644
index a2aaf95d..00000000
--- a/connector/src/main/resources/properties/messages.properties
+++ /dev/null
@@ -1,131 +0,0 @@
-####### GUI elements ####
-gui.general.language.selection.title=Language selection
-gui.general.language.selection.de=Deutsch
-gui.general.language.selection.en=English
-
-##Errorpage template
-gui.errorpage.msg.title=Authentication error arise
-gui.errorpage.msg.information=The authentication stops on account of a process error:
-gui.errorpage.msg.errorcode=Error Code:
-gui.errorpage.msg.errormsg=Error Message:
-gui.errorpage.msg.stacktrace=Stacktrace:
-
-##Country-Selection page
-gui.countryselection.title=eIDAS-Login Countryselection
-gui.countryselection.logo.bmi.alt=Logo BMI
-gui.countryselection.link.bmi=Mainpage BMI
-gui.countryselection.header1=Federal Ministry of Internal Affairs
-gui.countryselection.header2=Austrian Central eIDAS Node
-gui.countryselection.header3=Operated by Federal Ministry of Internal Affairs
-gui.countryselection.header.selection=Select your country
-gui.countryselection.cancel=Cancel
-gui.countryselection.notsupportedinfo=If you cannot find your country in this list then your electronic identity (eID) is not yet supported.
-
-gui.countryselection.infos.general.header=Information on Logins with European eIDs
-gui.countryselection.infos.general.link.1=eIDAS regulation of the European Union
-gui.countryselection.infos.general.link.2=Austrian Supplementary Register for Natural Persons (ERnP)
-gui.countryselection.infos.general.part.1=This is the central eIDAS node of the Republic of Austria, operated by the
-gui.countryselection.infos.general.part.2=It enables logins at Austrian online services using an electronic identity (eID) of another EU member state. You have been redirected to this page, as you have initiated a login to an online service using the option "EU Login".
-gui.countryselection.infos.general.part.3=The central eIDAS node of the Republic of Austria allows you to login to Austrian online services using the eID of your home country. This way, compliance with the
-gui.countryselection.infos.general.part.4=, which regulates the mutual cross-border acceptance of national eIDs, is achieved. The mutual cross-border acceptance of national eIDs is implemented successively within the EU. Currently, the central eIDAS node of the Republic of Austria supports logins using the eID systems of the Member States mentioned above. More Member States will be added according to availability of their respective eID solutions.
-gui.countryselection.infos.general.part.5=After selecting your home country on this page, you are forwarded to the familiar login environment of the selected member state. There, you can login with your eID as usual. After successful completion of the login process, you are automatically forwarded and logged in to the online service, from which you have been redirected to this page. During your first login, your eID data is also registered in the
-gui.countryselection.infos.general.part.6=This ensures that you will also be successfully and uniquely identified in subsequent logins at Austrian online services.
-
-gui.countryselection.country.be=Belgium
-gui.countryselection.country.be.logo.alt=Belgium-eID
-gui.countryselection.country.hr=Croatia
-gui.countryselection.country.hr.logo.alt=Croatia-eID
-gui.countryselection.country.cy=Cyprus
-gui.countryselection.country.cy.logo.alt=Cyprus-eID
-gui.countryselection.country.cz=Czech Republic
-gui.countryselection.country.cz.logo.alt=Czech Republic-eID
-gui.countryselection.country.ee=Estonia
-gui.countryselection.country.ee.logo.alt=Estonia-eID
-gui.countryselection.country.de=Germany
-gui.countryselection.country.de.logo.alt=German-eID
-gui.countryselection.country.is=Iceland
-gui.countryselection.country.is.logo.alt=Iceland-eID
-gui.countryselection.country.it=Italy
-gui.countryselection.country.it.logo.alt=Italy-eID
-<<<<<<< HEAD
-gui.countryselection.country.li=Lichtenstein
-gui.countryselection.country.li.logo.alt=Lichtensteinische-eID
-=======
->>>>>>> 1ad67c91820de1c7f2b2541f8e39752baac197d2
-gui.countryselection.country.lt=Lithuania
-gui.countryselection.country.lt.logo.alt=Lithuania-eID
-gui.countryselection.country.lv=Latvia
-gui.countryselection.country.lv.logo.alt=Latvia-eID
-gui.countryselection.country.nl=Netherlands
-gui.countryselection.country.nl.logo.alt=Netherlands-eID
-gui.countryselection.country.pl=Poland
-gui.countryselection.country.pl.logo.alt=Poland-eID
-gui.countryselection.country.pt=Portugal
-gui.countryselection.country.pt.logo.alt=Portugal-eID
-gui.countryselection.country.si=Slovenia
-gui.countryselection.country.si.logo.alt=Slovenia-eID
-gui.countryselection.country.es=SSpain
-gui.countryselection.country.es.logo.alt=Spain-eID
-
-gui.countryselection.country.bg=Bulgaria
-gui.countryselection.country.bg.logo.alt=Bulgaria-eID
-gui.countryselection.country.dk=Denmark
-gui.countryselection.country.dk.logo.alt=Denmark-eID
-gui.countryselection.country.fi=Finland
-gui.countryselection.country.fi.logo.alt=Finland-eID
-gui.countryselection.country.fr=France
-gui.countryselection.country.fr.logo.alt=France-eID
-gui.countryselection.country.gr=Greece
-gui.countryselection.country.gr.logo.alt=Greece-eID
-gui.countryselection.country.hu=Hungary
-gui.countryselection.country.hu.logo.alt=Hungary-eID
-gui.countryselection.country.ir=Ireland
-gui.countryselection.country.ir.logo.alt=Ireland-eID
-gui.countryselection.country.lu=Luxembourg
-gui.countryselection.country.lu.logo.alt=Luxembourg-eID
-gui.countryselection.country.mt=Malta
-gui.countryselection.country.mt.logo.alt=Malta-eID
-gui.countryselection.country.ro=Romania
-gui.countryselection.country.ro.logo.alt=Romania-eID
-gui.countryselection.country.sk=Slovakia
-gui.countryselection.country.sk.logo.alt=Slovakia-eID
-gui.countryselection.country.se=Sweden
-gui.countryselection.country.se.logo.alt=Sweden-eID
-gui.countryselection.country.uk=United Kingdom
-gui.countryselection.country.uk.logo.alt=United Kingdom-eID
-
-gui.countryselection.country.testcountry=TestCountry
-gui.countryselection.country.testcountry.logo.alt=Testcountry-eID
-
-gui.countryselection.mode.prod=Production
-gui.countryselection.mode.qs=QS
-gui.countryselection.mode.test=Test
-gui.countryselection.mode.dev=Development
-
-##Other Login Methods page
-gui.otherlogin.title=eIDAS-Login Other Login Methods
-gui.otherlogin.header.selection=Select an alternative login method
-gui.otherlogin.hs=Mobile Signature ("Handy-Signatur")
-gui.otherlogin.eidas=Alternative eIDAS ID
-gui.otherlogin.none=No alternative login methods
-gui.otherlogin.cancel=Cancel
-
-##Austrian Residency page
-gui.residency.title=Austrian Residency
-gui.residency.header.selection=Search for your Austrian Residency
-gui.residency.header.help=You can search for the address that you have been registered at in the past. Please enter a \
- postcode, municipality or village first to start the search.
-gui.residency.header.inputinvalid=Be sure to enter a value for Municipality or Village
-gui.residency.cancel=Cancel
-gui.residency.search=Search
-gui.residency.clear=Clear
-gui.residency.proceed=Proceed
-gui.residency.updated=Updated your input
-gui.residency.found=Found {0} results, click on one result to refine your search
-gui.residency.unique=Unique result found, please proceed
-gui.residency.error=Error on Backend Call
-gui.residency.input.postleitzahl=Postcode
-gui.residency.input.municipality=Municipality
-gui.residency.input.village=Village
-gui.residency.input.street=Street
-gui.residency.input.number=Number \ No newline at end of file
diff --git a/connector/src/main/resources/properties/messages_de.properties b/connector/src/main/resources/properties/messages_de.properties
deleted file mode 100644
index 187b7b37..00000000
--- a/connector/src/main/resources/properties/messages_de.properties
+++ /dev/null
@@ -1,132 +0,0 @@
-####### GUI elements ####
-gui.general.language.selection.title=Sprachauswahl
-gui.general.language.selection.de=Deutsch
-gui.general.language.selection.en=English
-
-##Errorpage template
-gui.errorpage.msg.title=Es ist ein Fehler aufgetreten
-gui.errorpage.msg.information=Der Anmeldevorgang wurde aufgrund eines Fehlers beendet:
-gui.errorpage.msg.errorcode=Fehlercode :
-gui.errorpage.msg.errormsg=Fehlermeldung:
-gui.errorpage.msg.stacktrace=Stacktrace:
-
-##Country-Selection page
-gui.countryselection.title=eIDAS-Login Länderauswahl
-gui.countryselection.logo.bmi.alt=Logo BMI
-gui.countryselection.link.bmi=Startseite BMI
-gui.countryselection.header1=Bundesministerium für Inneres
-gui.countryselection.header2=Zentraler eIDAS Knoten der Republik Österreich
-gui.countryselection.header3=Betrieben durch das Bundesministerium für Inneres
-gui.countryselection.header.selection=Wählen Sie Ihr Land
-gui.countryselection.cancel=Abbrechen
-gui.countryselection.notsupportedinfo=Wenn Sie Ihr Land in dieser Aufzählung nicht entdecken, dann wird Ihre elektronische Identität (eID) leider noch nicht unterstützt.
-
-gui.countryselection.infos.general.header=Information zur Anmeldung über Europäische eIDs
-gui.countryselection.infos.general.link.1=eIDAS-Verordnung der Europäischen Union
-gui.countryselection.infos.general.link.2=Ergänzungsregister für natürliche Personen (ERnP)
-gui.countryselection.infos.general.part.1=Sie befinden sich am zentralen eIDAS-Knoten der Republik Österreich. Dieser wird vom Österreichischen
-gui.countryselection.infos.general.part.2=betrieben und ermöglicht eine Anmeldungen zu österreichischen Online-Anwendungen unter Verwendung einer elektronischen Identität (eID) anderer EU-Mitgliedstaaten. Sie wurden hierher weitergeleitet, da Sie in einer Online-Anwendung eine Anmeldung via EU-Login initiiert haben.
-gui.countryselection.infos.general.part.3=Der zentrale eIDAS-Knoten der Republik Österreich ermöglicht Ihnen eine Anmeldung zu österreichischen Online-Anwendungen mit der eID Ihres Herkunftsstaates. Damit werden die Vorgaben der
-gui.countryselection.infos.general.part.4=erfüllt, die eine staatenübergreifende Akzeptanz nationaler eIDs vorsieht. Die wechselseitige Anerkennung nationaler eIDs erfolgt in der EU schrittweise. Aktuell unterstützt der zentrale eIDAS-Knoten der Republik Österreich Anmeldungen mit den eID-Systemen der oben angeführten Mitgliedstaaten. Diese Liste wird laufend erweitert.
-gui.countryselection.infos.general.part.5=Nachdem Sie auf dieser Seite einen Mitgliedsstaat ausgewählt haben, werden Sie an die gewohnte Anmeldeumgebung des jeweiligen Mitgliedsstaats weitergeleitet. Dort können Sie sich mit Ihrer eID wie gewohnt anmelden. Haben Sie den Anmeldeprozess erfolgreich abgeschlossen, werden Sie automatisch an die Online-Anwendung, von der aus Sie auf diese Auswahlseite gelangt sind, weitergeleitet und dort mit den Identitätsdaten Ihrer eID angemeldet. Gleichzeitig werden Sie bei Ihrer ersten Anmeldung auf diesem Weg mit Ihren eID-Daten in das österreichische
-gui.countryselection.infos.general.part.6=eingetragen. Damit wird sichergestellt, dass Sie auch im Rahmen zukünftiger Anmeldeprozesse zu österreichischen Online-Anwendungen erfolgreich und eindeutig identifiziert werden können.
-
-
-gui.countryselection.country.be=Belgien
-gui.countryselection.country.be.logo.alt=Belgische-eID
-gui.countryselection.country.hr=Kroatien
-gui.countryselection.country.hr.logo.alt=Kroatische-eID
-gui.countryselection.country.cy=Zypern
-gui.countryselection.country.cy.logo.alt=Zypriotische-eID
-gui.countryselection.country.cz=Tschechische Republik
-gui.countryselection.country.cz.logo.alt=Tschechische Republik-eID
-gui.countryselection.country.ee=Estland
-gui.countryselection.country.ee.logo.alt=Estländische-eID
-gui.countryselection.country.de=Deutschland
-gui.countryselection.country.de.logo.alt=Deutsche-eID
-gui.countryselection.country.is=Island
-gui.countryselection.country.is.logo.alt=Isländische-eID
-gui.countryselection.country.it=Italien
-gui.countryselection.country.it.logo.alt=Italienische-eID
-<<<<<<< HEAD
-gui.countryselection.country.li=Lichtenstein
-gui.countryselection.country.li.logo.alt=Lichtensteinische-eID
-=======
->>>>>>> 1ad67c91820de1c7f2b2541f8e39752baac197d2
-gui.countryselection.country.lt=Litauen
-gui.countryselection.country.lt.logo.alt=Litauische-eID
-gui.countryselection.country.lv=Lettland
-gui.countryselection.country.lv.logo.alt=Lettländische-eID
-gui.countryselection.country.nl=Niederlande
-gui.countryselection.country.nl.logo.alt=Niederländische-eID
-gui.countryselection.country.pl=Polen
-gui.countryselection.country.pl.logo.alt=Polnische-eID
-gui.countryselection.country.pt=Portugal
-gui.countryselection.country.pt.logo.alt=Portugisische-eID
-gui.countryselection.country.si=Slovenien
-gui.countryselection.country.si.logo.alt=Slovenische-eID
-gui.countryselection.country.es=Spanien
-gui.countryselection.country.es.logo.alt=Spanische-eID
-
-gui.countryselection.country.bg=Bulgarien
-gui.countryselection.country.bg.logo.alt=Bulgarische-eID
-gui.countryselection.country.dk=Dänemark
-gui.countryselection.country.dk.logo.alt=Dänische-eID
-gui.countryselection.country.fi=Finnland
-gui.countryselection.country.fi.logo.alt=Finische-eID
-gui.countryselection.country.fr=Frankreich
-gui.countryselection.country.fr.logo.alt=Französiche-eID
-gui.countryselection.country.gr=Grichenland
-gui.countryselection.country.gr.logo.alt=Grichische-eID
-gui.countryselection.country.hu=Ungarn
-gui.countryselection.country.hu.logo.alt=Ungarische-eID
-gui.countryselection.country.ir=Irland
-gui.countryselection.country.ir.logo.alt=Irische-eID
-gui.countryselection.country.lu=Luxenburg
-gui.countryselection.country.lu.logo.alt=Luxenburgische-eID
-gui.countryselection.country.mt=Malta
-gui.countryselection.country.mt.logo.alt=Malta-eID
-gui.countryselection.country.ro=Romänien
-gui.countryselection.country.ro.logo.alt=Romänische-eID
-gui.countryselection.country.sk=Slovakei
-gui.countryselection.country.sk.logo.alt=Slovakische-eID
-gui.countryselection.country.se=Schweden
-gui.countryselection.country.se.logo.alt=Schwedische-eID
-gui.countryselection.country.uk=Großbritanien
-gui.countryselection.country.uk.logo.alt=Britische-eID
-
-gui.countryselection.country.testcountry=Testland
-gui.countryselection.country.testcountry.logo.alt=Testland-eID
-
-gui.countryselection.mode.prod=Produktion
-gui.countryselection.mode.qs=Qualitätsicherung
-gui.countryselection.mode.test=Test
-gui.countryselection.mode.dev=Development
-
-##Other Login Methods page
-gui.otherlogin.title=eIDAS-Login Alternative Anmeldemethoden
-gui.otherlogin.header.selection=Wählen Sie eine alternative Anmeldemethode
-gui.otherlogin.hs=Handy-Signatur
-gui.otherlogin.eidas=Alternativer eIDAS Login
-gui.otherlogin.none=Keine
-gui.otherlogin.cancel=Abbrechen
-
-##Austrian Residency page
-gui.residency.title=Österreichischer Wohnsitz
-gui.residency.header.selection=Suche nach Österreichischem Wohnsitz
-gui.residency.header.help=Hier können Sie nach einem Wohnsitze in Österreich suchen. Bitte geben Sie zuerst eine \
- Postleitzahl, Gemeinde oder Ortschaft ein um die Suche zu starten.
-gui.residency.header.inputinvalid=Bitte geben Sie einen Wert für Gemeinde oder Ortschaft ein
-gui.residency.cancel=Abbrechen
-gui.residency.search=Suche
-gui.residency.clear=Löschen
-gui.residency.proceed=Fortfahren
-gui.residency.updated=Eingabe aktualisiert
-gui.residency.found={0} Ergebnisse gefunden, klicken Sie auf ein Ergebnis um die Suche zu verfeinern
-gui.residency.unique=Eindeutiges Ergebnis gefunden, bitte fortfahren
-gui.residency.error=Fehler bei Addresssuche
-gui.residency.input.postleitzahl=PLZ
-gui.residency.input.municipality=Gemeinde
-gui.residency.input.village=Ortschaft
-gui.residency.input.street=Straße
-gui.residency.input.number=Nummer \ No newline at end of file
diff --git a/connector/src/main/resources/properties/status_messages_en.properties b/connector/src/main/resources/properties/status_messages_en.properties
deleted file mode 100644
index f07a8705..00000000
--- a/connector/src/main/resources/properties/status_messages_en.properties
+++ /dev/null
@@ -1,75 +0,0 @@
-eidas.00=eIDAS Attribute {0} not found. Can not finish authentication process
-eidas.01=NO eIDAS response-message found. Can not finish authentication process
-eidas.02=eIDAS response-message contains an error. ErrorCode: {0}, ErrorMsg: {1}
-eidas.03=No CitizenCountry available. Can not start eIDAS authentication process
-eidas.04=Request contains no sessionToken. Authentication process stops
-eidas.05=Received eIDAS response-message is not valid. Reason: {0}
-eidas.06=LoA from eIDAS response-message {0} does not match to requested LoA
-eidas.07=eIDAS Response attribute-validation FAILED. Attribute:{0} Reason: {1}.
-
-
-config.01=No configuration-file parameter found. Maybe Java SystemD parameter is missing
-config.03=Can not load configuration from path {0} (See logs for more details)
-config.18=Configuration file {0} is not available on filesystem
-config.24=Configuration file {1} does not start with {0} prefix.
-
-
-ernb.00=Receive no identity-link from SZR
-ernb.01=Receive no bPK from SZR
-ernb.02=SZR response contains an error. ErrorMsg: {0}
-ernb.03=Post-processing of eIDAS attributes failed. Reason: {0}
-
-auth.00=Service provider: {0} is unknown
-auth.21=The authentication process was stopped by user
-auth.26=No transaction identifier
-auth.28=Found no active transaction with Id: {0}. Maybe, the transaction was removed after timeout
-auth.37=Requested bPK-Target: {0} does not match allowed targets for service provider: {1}
-auth.38=Passive authentication was requested but user as no active session
-auth.39=Error: '{0}' in post-processing of authentication data. Can not finish authentication process
-
-process.01=Can not execute authentication process
-process.02=Find no applicable authentication process for transaction with Id: {0}
-process.03=Can not resume the authentication process. Reason: {0}
-process.04=Can not execute authentication process. Problem with an internal state
-
-builder.00=Can not generate data structure "{0}": {1}
-builder.11=Error: '{0}' in post-processing of authentication data. Can not finish authentication process
-
-parser.01=Error during eID-data processing. Reason: {0}
-
-gui.00=Can not build GUI component. Reason: {0}
-
-pvp2.01=General error during SAML2 response encoding
-pvp2.02=SAML2 attribute contains an wrong encoded value
-pvp2.05=LoA from SAML2 Authn. request: {0} is not supported
-pvp2.07=SAML2 Authn. request contains is not signed
-pvp2.09=SAML2 request contains an unsupported operation. (OperationId: {0})
-pvp2.10=SAML2 Attribute: {0} is not available
-pvp2.11=SAML2 Binding: {0} is not supported
-pvp2.12=SAML2 NameID Format {0} is not supported
-pvp2.13=Internal server error during SAML2 processing
-pvp2.14=SAML2 authentication not available
-pvp2.15=No SAML2 metadata available or metadata processing failed
-pvp2.16=Encryption of SAML2 assertion failed
-pvp2.17=LoA from SAML2 Authn. request: {1} does not match to authenticated LoA: {0} by using matching-mode: {2}
-pvp2.20=SAML2 Authn. request contains an unknown or empty EntityID.
-pvp2.21=Signature validation of SAML2 Authn. request failed. Reason: {0}
-pvp2.22=Validation of SAML2 Authn. request failed. Reason: {0}
-pvp2.23=Validation of SAML2 Authn. request failed. Reason: AssertionConsumerServiceURL {0} is not valid.
-pvp2.24=General error during SAML2 Auth. request pre-processing. Reason: {0}
-pvp2.26=SAML2 metadata validation failed. Reason: {0}
-pvp2.27=General error during SAML2 metadata generation
-pvp2.28=Validation of SAML2 Authn. request failed. Reason: AssertionConsumerServiceIndex {0} is not valid.
-
-
-internal.00=The authentication process stops by reason of an internal problem
-internal.01=The LogOut process stops by reason of an internal problem
-internal.02=Internal error. Can not access data cache.
-internal.03=Internal error. Can not initialize a cryptographic method.
-internal.04=Internal error. Can not access data cache (Reason: {0}).
-internal.05=Internal error. Can not access SQLite database for identity-data storage (Reason: {0})
-internal.06=Internal error. Can not query SQLite database for identity-data storage (Reason: {0})
-
-config.08=Configuration value: {0} is missing.
-config.27=Configuration parameter processing failed. Reason: {0}
-config.30=External configuration not found. File: {0}
diff --git a/connector/src/main/resources/specific_eIDAS_connector.beans.xml b/connector/src/main/resources/specific_eIDAS_connector.beans.xml
deleted file mode 100644
index 9861a7c6..00000000
--- a/connector/src/main/resources/specific_eIDAS_connector.beans.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
- http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
-
-
- <import resource="specific_eIDAS_core.beans.xml"/>
-
- <bean id="msConnectorMessageSource"
- class="at.asitplus.eidas.specific.connector.config.MsConnectorMessageSource" />
-
- <bean id="processEngineSignalController"
- class="at.asitplus.eidas.specific.connector.controller.ProcessEngineSignalController" />
-
- <bean id="saml2MetadataGeneration"
- class="at.asitplus.eidas.specific.connector.health.Saml2MetadataHealthIndicator">
- <property name="pvpIdpCredentials" ref="PVPEndPointCredentialProvider" />
- </bean>
-
- <bean id="PVPEndPointConfiguration"
- class="at.asitplus.eidas.specific.connector.config.PvpEndPointConfiguration" />
-
- <bean id="PVPEndPointCredentialProvider"
- class="at.asitplus.eidas.specific.connector.provider.PvpEndPointCredentialProvider" />
-
- <bean id="PVPMetadataConfigurationFactory"
- class="at.asitplus.eidas.specific.connector.provider.PvpMetadataConfigurationFactory" />
-
- <bean id="pvp2SProfileEndpoint"
- class="at.asitplus.eidas.specific.connector.controller.Pvp2SProfileEndpoint">
- <property name="pvpIdpCredentials" ref="PVPEndPointCredentialProvider" />
- <property name="metadataProvider" ref="PVPMetadataProvider" />
- </bean>
-
- <bean id="AuthnRequestValidator"
- class="at.asitplus.eidas.specific.connector.verification.AuthnRequestValidator" />
-
- <!-- bean id="SAMLVerificationEngine"
- class="at.gv.egiz.eaaf.modules.pvp2.impl.verification.SamlVerificationEngine" /-->
-
- <bean id="pvpMetadataService"
- class="at.gv.egiz.eaaf.modules.pvp2.idp.impl.MetadataAction">
- <property name="pvpIdpCredentials" ref="PVPEndPointCredentialProvider" />
- </bean>
-
- <bean id="PVPAuthenticationRequestAction"
- class="at.gv.egiz.eaaf.modules.pvp2.idp.impl.AuthenticationAction">
- <property name="pvpIdpCredentials" ref="PVPEndPointCredentialProvider" />
- <property name="metadataProvider" ref="PVPMetadataProvider" />
- </bean>
-
- <bean id="PVPMetadataProvider"
- class="at.asitplus.eidas.specific.connector.provider.PvpMetadataProvider" />
-
- <bean id="PVPSubjectNameGenerator"
- class="at.asitplus.eidas.specific.connector.builder.PvpSubjectNameGenerator" />
-
- <!-- Tasks -->
- <bean id="GenerateCountrySelectionFrameTask"
- class="at.asitplus.eidas.specific.connector.processes.tasks.GenerateCountrySelectionFrameTask"
- scope="prototype" />
-
- <bean id="EvaluateCountrySelectionTask"
- class="at.asitplus.eidas.specific.connector.processes.tasks.EvaluateCountrySelectionTask"
- scope="prototype" />
-
-</beans> \ No newline at end of file
diff --git a/connector/src/main/resources/templates/countrySelection.html b/connector/src/main/resources/templates/countrySelection.html
deleted file mode 100644
index 14457210..00000000
--- a/connector/src/main/resources/templates/countrySelection.html
+++ /dev/null
@@ -1,269 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org"
- xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
- layout:decorator="fragments/base"
- th:with="lang=${#locale.language}" th:lang="${lang}">
-<head>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="stylesheet" href="../../webapp/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
- <script type="text/javascript" src="../../webapp/js/js_country.js"
- th:attr="src=@{/static/js/js_country.js}"></script>
- <title th:text="#{gui.countryselection.title}">eIDAS-Login Länderauswahl</title>
-</head>
-<body>
-<div class="header container">
- <div class="titlebar">
- <div>
- <a href="https://www.bmi.gv.at/" target="_blank" title="Home">
- <img class="toplogo img-responsive" src="/static/BMI.png" alt="Logo BMI"
- th:attr="alt=#{gui.countryselection.logo.bmi.alt}">
- <h1 class="hidden" th:text="#{gui.countryselection.header1}"> Bundesministerium für Inneres </h1>
- </a>
- </div>
- <ul class="nav_oben">
- <li>
- <div class="languageselection" th:include="language_selection :: selectlanguage">
- LanguageSelectionBlock
- </div>
- </li>
- &nbsp; &nbsp;
- <li><a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.link.bmi}"> Startseite
- BMI </a></li>
- </ul>
- </div>
-</div>
-<div class="content">
- <div class="subtitle">
- <h1 th:text="#{gui.countryselection.header2}"> Zentraler eIDAS Knoten der Republik Österreich </h1>
- <h2 th:text="#{gui.countryselection.header3}"> Betrieben durch das Bundesministerium für Inneres </h2>
- </div>
-
- <h1 th:text="#{gui.countryselection.header.selection}"> Wählen Sie Ihr Land / Select your country </h1>
-
- <div id="country">
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="../../webapp/img/countries/germany-eu_.png" alt="Germany-eID"
- th:attr="src=@{/img/countries/germany-eu_.png},alt=#{gui.countryselection.country.de.logo.alt}"/></a>
- <input type="submit" role="button" value="Deutschland / Germany"
- th:attr="value=#{gui.countryselection.country.de}"/>
- <input type="hidden" name="selectedCountry" value="DE">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
- <select id="testEnvironment" name="selectedEnvironment">
- <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
- <option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
- <option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
- <option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
- </select>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="../../webapp/img/countries/Belgium-EU_gray.png" alt="Belgium-eID"
- th:attr="src=@{img/countries/Belgium-EU_gray.png},alt=#{gui.countryselection.country.be.logo.alt}"/></a>
- <input type="submit" value="Belgium" th:attr="value=#{gui.countryselection.country.be}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/Bulgaria-EU_gray.png"
- alt="Bulgaria-eID"
- th:attr="src=@{/img/countries/Bulgaria-EU_gray.png},alt=#{gui.countryselection.country.bg.logo.alt}"/></a>
- <input type="submit" value="Bulgaria" th:attr="value=#{gui.countryselection.country.bg}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="../../webapp/img/countries/Croatia-EU_gray.png" alt="Croatia-eID"
- th:attr="src=@{/img/countries/Croatia-EU_gray.png},alt=#{gui.countryselection.country.hr.logo.alt}"/></a>
- <input type="submit" value="Croatia" th:attr="value=#{gui.countryselection.country.hr}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/Cyprus-EU_gray.png" alt="Cyprus-eID"
- th:attr="src=@{/img/countries/Cyprus-EU_gray.png},alt=#{gui.countryselection.country.cy.logo.alt}"/></a>
- <input type="submit" value="Cyprus" th:attr="value=#{gui.countryselection.country.cy}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="../../webapp/img/countries/CzechRepublic-EU_gray.png"
- alt="CzechRepublic-eID"
- th:attr="src=@{/img/countries/CzechRepublic-EU_gray.png},alt=#{gui.countryselection.country.cz.logo.alt}"/></a>
- <input type="submit" value="CzechRepublic" th:attr="value=#{gui.countryselection.country.cz}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/Denmark-EU_gray.png" alt="Denmark-eID"
- th:attr="src=@{/img/countries/Denmark-EU_gray.png},alt=#{gui.countryselection.country.dk.logo.alt}"/></a>
- <input type="submit" value="Denmark" th:attr="value=#{gui.countryselection.country.dk}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="../../webapp/img/countries/Estonia-EU_gray.png" alt="Estonia-eID"
- th:attr="src=@{/img/countries/Estonia-EU_gray.png},alt=#{gui.countryselection.country.ee.logo.alt}"/></a>
- <input type="submit" value="Estonia" th:attr="value=#{gui.countryselection.country.ee}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/Finland-EU_gray.png" alt="Finland-eID"
- th:attr="src=@{/img/countries/Finland-EU_gray.png},alt=#{gui.countryselection.country.fi.logo.alt}"/></a>
- <input type="submit" value="Finland" th:attr="value=#{gui.countryselection.country.fi}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/France-EU_gray.png" alt="France-eID"
- th:attr="src=@{/img/countries/France-EU_gray.png},alt=#{gui.countryselection.country.fr.logo.alt}"/></a>
- <input type="submit" value="France" th:attr="value=#{gui.countryselection.country.fr}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/Greece-EU_gray.png" alt="Greece-eID"
- th:attr="src=@{/img/countries/Greece-EU_gray.png},alt=#{gui.countryselection.country.gr.logo.alt}"/></a>
- <input type="submit" value="Greece" th:attr="value=#{gui.countryselection.country.gr}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/Hungary-EU_gray.png" alt="Hungary-eID"
- th:attr="src=@{/img/countries/Hungary-EU_gray.png},alt=#{gui.countryselection.country.hu.logo.alt}"/></a>
- <input type="submit" value="Hungary" th:attr="value=#{gui.countryselection.country.hu}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/Ireland-EU_gray.png" alt="Ireland-eID"
- th:attr="src=@{/img/countries/Ireland-EU_gray.png},alt=#{gui.countryselection.country.ir.logo.alt}"/></a>
- <input type="submit" value="Ireland" th:attr="value=#{gui.countryselection.country.ir}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="../../webapp/img/countries/Italy-EU_gray.png" alt="Italy-eID"
- th:attr="src=@{/img/countries/Italy-EU_gray.png},alt=#{gui.countryselection.country.it.logo.alt}"/></a>
- <input type="submit" value="Italy" th:attr="value=#{gui.countryselection.country.it}">
- <select id="testEnvironment" name="selectedEnvironment">
- <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
- <option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
- <option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
- <option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
- </select>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/Latvia-EU_gray.png" alt="Latvia-eID"
- th:attr="src=@{/img/countries/Latvia-EU_gray.png},alt=#{gui.countryselection.country.lv.logo.alt}"/></a>
- <input type="submit" value="Latvia" th:attr="value=#{gui.countryselection.country.lv}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/Luxembourg-EU_gray.png"
- alt="Luxembourg-eID"
- th:attr="src=@{/img/countries/Luxembourg-EU_gray.png},alt=#{gui.countryselection.country.lu.logo.alt}"/></a>
- <input type="submit" value="Luxembourg" th:attr="value=#{gui.countryselection.country.lu}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/Malta-EU_gray.png" alt="Malta-eID"
- th:attr="src=@{/img/countries/Malta-EU_gray.png},alt=#{gui.countryselection.country.mt.logo.alt}"/></a>
- <input type="submit" value="Malta" th:attr="value=#{gui.countryselection.country.mt}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="../../webapp/img/countries/Poland-EU_gray.png" alt="Poland-eID"
- th:attr="src=@{/img/countries/Poland-EU_gray.png},alt=#{gui.countryselection.country.pl.logo.alt}"/></a>
- <input type="submit" value="Poland" th:attr="value=#{gui.countryselection.country.pl}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="../../webapp/img/countries/Portugal-EU_gray.png" alt="Portugal-eID"
- th:attr="src=@{/img/countries/Portugal-EU_gray.png},alt=#{gui.countryselection.country.pt.logo.alt}"/></a>
- <input type="submit" value="Portugal" th:attr="value=#{gui.countryselection.country.pt}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/Romania-EU_gray.png" alt="Romania-eID"
- th:attr="src=@{/img/countries/Romania-EU_gray.png},alt=#{gui.countryselection.country.ro.logo.alt}"/></a>
- <input type="submit" value="Romania" th:attr="value=#{gui.countryselection.country.ro}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/Slovakia-EU_gray.png"
- alt="Slovakia-eID"
- th:attr="src=@{/img/countries/Slovakia-EU_gray.png},alt=#{gui.countryselection.country.sk.logo.alt}"/></a>
- <input type="submit" value="Slovakia" th:attr="value=#{gui.countryselection.country.sk}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="../../webapp/img/countries/Slovenia-EU_gray.png" alt="Slovenia-eID"
- th:attr="src=@{/img/countries/Slovenia-EU_gray.png},alt=#{gui.countryselection.country.si.logo.alt}"/></a>
- <input type="submit" value="Slovenia" th:attr="value=#{gui.countryselection.country.si}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="../../webapp/img/countries/Spain-EU_gray.png" alt="Spain-eID"
- th:attr="src=@{/img/countries/Spain-EU_gray.png},alt=#{gui.countryselection.country.es.logo.alt}"/></a>
- <input type="submit" value="Spain" th:attr="value=#{gui.countryselection.country.es}">
- <select id="testEnvironment" name="selectedEnvironment">
- <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
- <option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
- <option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
- <option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
- </select>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/Sweden-EU_gray.png" alt="Sweden-eID"
- th:attr="src=@{/img/countries/Sweden-EU_gray.png},alt=#{gui.countryselection.country.se.logo.alt}"/></a>
- <input type="submit" value="Sweden" th:attr="value=#{gui.countryselection.country.se}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="../../webapp/img/countries/TheNetherlands-EU_gray.jpg"
- alt="TheNetherlands-eID"
- th:attr="src=@{/img/countries/TheNetherlands-EU_gray.jpg},alt=#{gui.countryselection.country.nl.logo.alt}"/></a>
- <input type="submit" value="Netherlands" th:attr="value=#{gui.countryselection.country.nl}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="../../webapp/img/countries/UnitedKingdom-EU_gray.png"
- alt="UnitedKingdom-eID"
- th:attr="src=@{/img/countries/UnitedKingdom-EU_gray.png},alt=#{gui.countryselection.country.uk.logo.alt}"/></a>
- <input type="submit" value="United Kingdom" th:attr="value=#{gui.countryselection.country.uk}" disabled>
- </form>
-
- </div>
-
- <!-- Abbrechen Button -->
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <input type="submit" class="btn btn-outline-primary btn-block" value="Abbrechen/Cancel"
- th:attr="value=#{gui.countryselection.cancel}">
- <input type="hidden" name="stopAuthProcess" value="true">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
- </form>
-
- <p th:text="#{gui.countryselection.notsupportedinfo}">Wenn Sie Ihr Land in dieser Aufzählung nicht entdecken
- ... </p>
-
- <h2 th:text="#{gui.countryselection.infos.general.header}"> Information zur Anmeldung über Europäische eIDs </h2>
- <p>
- <span th:text="#{gui.countryselection.infos.general.part.1}"> first part </span>
- <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.header1}"> Bundesministerium
- für Inneres </a>
- <span th:text="#{gui.countryselection.infos.general.part.2}"> second part </span>
- </p>
-
- <p>
- <span th:text="#{gui.countryselection.infos.general.part.3}"> third part </span>
- <a href="https://eur-lex.europa.eu/legal-content/DE/TXT/HTML/?uri=CELEX:32014R0910&from=DE" target="_blank"
- th:text="#{gui.countryselection.infos.general.link.1}"> eIDAS-Verordnung der Europäischen Union </a>
- <span th:text="#{gui.countryselection.infos.general.part.4}"> fourth part </span>
- </p>
-
- <p>
- <span th:text="#{gui.countryselection.infos.general.part.5}"> fived part </span>
- <a href="https://www.dsb.gv.at/-/das-erganzungsregister-fur-naturliche-personen-ernp-" target="_blank"
- th:text="#{gui.countryselection.infos.general.link.2}"></a>
- <span th:text="#{gui.countryselection.infos.general.part.6}"> sixed part </span>
- </p>
-
-</div>
-<footer>
- <div class="copyright">&copy; BUNDESMINISTERIUM FÃœR INNERES</div>
- <div></div>
-</footer>
-</body>
-</html>
diff --git a/connector/src/main/resources/templates/eidas_node_forward.html b/connector/src/main/resources/templates/eidas_node_forward.html
deleted file mode 100644
index 3cd30d36..00000000
--- a/connector/src/main/resources/templates/eidas_node_forward.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org"
- xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
- layout:decorator="fragments/base"
- th:with="lang=${#locale.language}" th:lang="${lang}">
-<head>
- <script src="../../webapp/autocommit.js"
- th:attr="src=@{/autocommit.js}"></script>
-</head>
-<body>
- <noscript>
- <p>
- <strong>Note:</strong> Since your browser does not support
- JavaScript, you must press the Continue button once to proceed.
- </p>
- </noscript>
-
- <div id="alert">Your login is being processed. Thank you for
- waiting.</div>
-
- <form action="${endPoint}" method="post" target="_parent"
- th:attr="action=@{${endPoint}}">
- <div>
- <input type="hidden" name="${tokenName}" value="${tokenValue}"
- th:attr="value=${tokenValue},name=${tokenName}" />
- </div>
- <noscript>
- <div>
- <p>Your browser does not support JavaScript. Click the button to continuing the process .</p>
- <input type="submit" value="Continue" />
- </div>
- </noscript>
- </form>
-
-</body>
-</html> \ No newline at end of file
diff --git a/connector/src/main/resources/templates/error_message.html b/connector/src/main/resources/templates/error_message.html
deleted file mode 100644
index c5f1ebb3..00000000
--- a/connector/src/main/resources/templates/error_message.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE HTML>
-<html xmlns:th="http://www.thymeleaf.org"
- xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
- layout:decorator="fragments/base"
- th:with="lang=${#locale.language}" th:lang="${lang}">
-
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <link rel="stylesheet" href="../../webapp/css/css_error.css" th:href="@{/css/css_error.css}" />
-
- <title th:text="#{gui.errorpage.msg.title}">An error arise ... </title>
-</head>
-
-<body>
- <div id="page">
- <div id="page1" class="case selected-case" role="main">
- <h2 class="OA_header" role="heading">Authentication error arise</h2>
-
- <div class="hell" role="application" >
- <h2 class="OA_header" role="heading" th:text="#{gui.errorpage.msg.title}">Error Header</h2>
-
- <div id="alert_area" class="hell" role="application" >
- <p th:text="#{gui.errorpage.msg.information}">Error Information</p>
- <br/>
- <p><b th:text="#{gui.errorpage.msg.errorcode}">Code :</b> <span th:text="${errorCode}"></span></p>
- <p><b th:text="#{gui.errorpage.msg.errormsg}">Msg :</b > <span th:text="${#messages.msgWithParams('__${errorCode}__', '__${errorParams}__')}"></span></p>
- </div>
- <!-- errorMsg -->
- </div>
-
- <div th:if="${stacktrace}">
- <p><b th:text="#{gui.errorpage.msg.stacktrace}">fullError</b> <span th:text="${stacktrace}"></span></p>
- </div>
-
- </div>
- </div>
-</body>
-</html> \ No newline at end of file
diff --git a/connector/src/main/resources/templates/language_selection.html b/connector/src/main/resources/templates/language_selection.html
deleted file mode 100644
index a268eb17..00000000
--- a/connector/src/main/resources/templates/language_selection.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"
- xmlns:th="http://www.thymeleaf.org">
-
- <body>
-
- <div th:fragment="selectlanguage">
- <a th:href="@{|${submitEndpoint}?pendingid=${pendingid}|(lang='de')}" th:text="#{gui.general.language.selection.de}">Spache1</a>
- <span>&nbsp; &nbsp; </span>
- <a th:href="@{|${submitEndpoint}?pendingid=${pendingid}|(lang='en')}" th:text="#{gui.general.language.selection.en}">Spache2</a>
- </div>
-
- </body>
-
-</html> \ No newline at end of file
diff --git a/connector/src/main/resources/templates/other_login_method.html b/connector/src/main/resources/templates/other_login_method.html
deleted file mode 100644
index e5f03712..00000000
--- a/connector/src/main/resources/templates/other_login_method.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org"
- xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
- layout:decorator="fragments/base"
- th:with="lang=${#locale.language}" th:lang="${lang}">
-<head>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="stylesheet" href="../../webapp/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
- <title th:text="#{gui.otherlogin.title}">eIDAS-Login Other Login Methods</title>
- <style>
- .block {
- width: 100%;
- }
- button {
- padding: 0.5em;
- margin: 0.5em;
- width: 20em;
- }
- </style>
-</head>
-<body>
-<div class="header container">
- <div class="titlebar">
- <div>
- <a href="https://www.bmi.gv.at/" target="_blank" title="Home">
- <img class="toplogo img-responsive" src="/static/BMI.png" alt="Logo BMI"
- th:attr="alt=#{gui.countryselection.logo.bmi.alt}">
- <h1 class="hidden" th:text="#{gui.countryselection.header1}"> Bundesministerium für Inneres </h1>
- </a>
- </div>
- <ul class="nav_oben">
- <li>
- <div class="languageselection" th:include="language_selection :: selectlanguage">
- LanguageSelectionBlock
- </div>
- </li>
- &nbsp; &nbsp;
- <li>
- <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.link.bmi}">Startseite
- BMI </a>
- </li>
- </ul>
- </div>
-</div>
-<div class="content">
- <div class="subtitle">
- <h1 th:text="#{gui.countryselection.header2}"> Zentraler eIDAS Knoten der Republik Österreich </h1>
- <h2 th:text="#{gui.countryselection.header3}"> Betrieben durch das Bundesministerium für Inneres </h2>
- </div>
-
- <h1 th:text="#{gui.otherlogin.header.selection}"> Select an alternative login method </h1>
-
- <div id="otherlogin" class="block">
- <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <button type="submit" role="button" value="Handy-Signatur / Mobile Signature"
- th:text="#{gui.otherlogin.hs}">A
- </button>
- <input type="hidden" name="loginSelection" value="MOBILE_PHONE_SIGNATURE_LOGIN">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
- </form>
- <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <button type="submit" role="button" value="Andere eIDAS ID" th:text="#{gui.otherlogin.eidas}">B
- </button>
- <input type="hidden" name="loginSelection" value="EIDAS_LOGIN">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
- </form>
- <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <button type="submit" role="button" value="Keine weitere HS / eIDAS"
- th:text="#{gui.otherlogin.none}">C
- </button>
- <input type="hidden" name="loginSelection" value="NO_OTHER_LOGIN">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
- </form>
- </div>
-
- <!-- Abbrechen Button -->
- <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <button type="submit" value="Abbrechen/Cancel" th:text="#{gui.otherlogin.cancel}"></button>
- <input type="hidden" name="stopAuthProcess" value="true">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
- </form>
-
-</div>
-<footer>
- <div class="copyright">&copy; BUNDESMINISTERIUM FÃœR INNERES</div>
- <div></div>
-</footer>
-</body>
-</html>
diff --git a/connector/src/main/resources/templates/pvp2_post_binding.html b/connector/src/main/resources/templates/pvp2_post_binding.html
deleted file mode 100644
index 06b9b494..00000000
--- a/connector/src/main/resources/templates/pvp2_post_binding.html
+++ /dev/null
@@ -1,36 +0,0 @@
-## ## Velocity Template for SAML 2 HTTP-POST binding ## ## Velocity
-##context may contain the following properties ## action - String - the
-##action URL for the form ## RelayState - String - the relay state for the
-##message ## SAMLRequest - String - the Base64 encoded SAML Request ##
-##SAMLResponse - String - the Base64 encoded SAML Response
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<head>
- <script src="/autocommit.js"></script>
-</head>
-<body>
- <noscript>
- <p>
- <strong>Note:</strong> Since your browser does not support
- JavaScript, you must press the Continue button once to proceed.
- </p>
- </noscript>
-
- <div id="alert">Your login is being processed. Thank you for
- waiting.</div>
-
- <form action="${action}" method="post" target="_parent">
- <div>
- #if($RelayState) <input type="hidden" name="RelayState" value="${RelayState}"/> #end
- #if($SAMLRequest) <input type="hidden" name="SAMLRequest" value="${SAMLRequest}" /> #end
- #if($SAMLResponse) <input type="hidden" name="SAMLResponse" value="${SAMLResponse}" /> #end
- </div>
- <noscript>
- <div>
- <input type="submit" value="Continue" />
- </div>
- </noscript>
- </form>
-
-</body>
-</html> \ No newline at end of file
diff --git a/connector/src/main/resources/templates/residency.html b/connector/src/main/resources/templates/residency.html
deleted file mode 100644
index 6e266449..00000000
--- a/connector/src/main/resources/templates/residency.html
+++ /dev/null
@@ -1,251 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org"
- xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
- layout:decorator="fragments/base"
- th:with="lang=${#locale.language}" th:lang="${lang}">
-<head>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="stylesheet" href="../../webapp/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
- <script type="text/javascript" src="../../webapp/js/jquery-3.6.0.js"
- th:attr="src=@{/static/js/jquery-3.6.0.min.js}"></script>
- <title th:text="#{gui.residency.title}">Österreichischer Wohnsitz</title>
- <script type="text/javascript" th:inline="javascript">
- $(document).ready(function () {
- $("#textResult").hide();
- $("#tableResult").hide();
- $("#loading").hide();
- $.ajaxSetup({
- beforeSend: function () {
- $("#loading").show();
- },
- complete: function () {
- $("#loading").hide();
- }
- });
- $("#inputForm input[type='text']").keyup(function (event) {
- if (event.keyCode === 13) {
- $("#buttonSearch").click();
- }
- });
- });
-
- function search() {
- let updatedText = /*[[#{gui.residency.updated}]]*/ 'Updated text';
- let errorText = /*[[#{gui.residency.error}]]*/ 'Error';
- let foundText = /*[[#{gui.residency.found}]]*/ 'Found {0}';
- let uniqueText = /*[[#{gui.residency.unique}]]*/ 'Unique';
- let invalidInputText = /*[[#{gui.residency.header.inputinvalid}]]*/ 'Invalid';
- if (!$("#inputForm #inputMunicipality").val().trim() && !$("#inputForm #inputPostleitzahl").val().trim() &&
- !$("#inputForm #inputVillage").val().trim()) {
- $("#textResult").show().text(invalidInputText);
- return;
- }
- $.ajax({
- type: "POST",
- url: "http://localhost:8080/ms_connector/residency/search",
- data: $("#inputForm").serialize()
- }).done(function (data, textStatus, jqXHR) {
- if (data["resultCount"] === 1) {
- $("#textResult").show().text(uniqueText);
- $("#tableResult tbody").empty();
- $("#tableResult").hide();
- $("#inputForm #inputPostleitzahl").val(data["results"][0]["postleitzahl"]);
- $("#inputForm #inputMunicipality").val(data["results"][0]["municipality"]);
- $("#inputForm #inputVillage").val(data["results"][0]["village"]);
- $("#inputForm #inputStreet").val(data["results"][0]["street"]);
- $("#inputForm #inputNumber").val(data["results"][0]["number"]);
- return;
- }
- $("#textResult").show().text(foundText.replace("{0}", data["resultCount"]));
- $("#tableResult").show();
- $("#tableResult tbody").empty();
- $.each(data.results, function (i, output) {
- $("#tableResult tbody")
- .append($("<tr>")
- .append($("<td>").text(output["postleitzahl"] !== null ? output["postleitzahl"] : "").css("text-align", "right"))
- .append($("<td>").text(output["municipality"] !== null ? output["municipality"] : ""))
- .append($("<td>").text(output["village"] !== null ? output["village"] : ""))
- .append($("<td>").text(output["street"] !== null ? output["street"] : ""))
- .append($("<td>").text(output["number"] !== null ? output["number"] : "").css("text-align", "right"))
- .css("cursor", "pointer").click(function () {
- $("#inputForm #inputPostleitzahl").val($(this).children("td:nth-child(1)").text());
- $("#inputForm #inputMunicipality").val($(this).children("td:nth-child(2)").text());
- $("#inputForm #inputVillage").val($(this).children("td:nth-child(3)").text());
- $("#inputForm #inputStreet").val($(this).children("td:nth-child(4)").text());
- $("#inputForm #inputNumber").val($(this).children("td:nth-child(5)").text());
- $("#textResult").show().text(updatedText);
- search();
- })
- );
- })
- if (data.results.length === 0) {
- $("#tableResult").hide();
- }
- }).fail(function (jqXHR, textStatus, errorThrown) {
- $("#textResult").show().text(errorText);
- })
- }
-
- function clearInput() {
- $("#inputForm #inputMunicipality").val("");
- $("#inputForm #inputVillage").val("");
- $("#inputForm #inputStreet").val("");
- $("#inputForm #inputNumber").val("");
- $("#textResult").hide();
- $("#tableResult").hide();
- }
- </script>
- <style>
- #residency label {
- width: 10em;
- display: inline-block;
- margin-bottom: 0.5em;
- }
-
- #residency input {
- width: 15em;
- display: inline-block;
- margin-bottom: 0.5em;
- }
-
- #result {
- margin-bottom: 4em;
- }
-
- button {
- padding: 0.5em;
- margin: 0.5em;
- width: 8em;
- }
-
- .block {
- width: 100%;
- }
-
- #tableResult td, #tableResult th {
- padding: 1em 0.5em;
- }
-
- #tableResult a {
- text-decoration: underline;
- }
-
- #tableResult {
- border-collapse: collapse;
- }
-
- #tableResult tr {
- border-bottom: 1px solid black;
- }
- </style>
-</head>
-
-<body>
-<div class="header container">
- <div class="titlebar">
- <div>
- <a href="https://www.bmi.gv.at/" target="_blank" title="Home">
- <img class="toplogo img-responsive" src="/static/BMI.png" alt="Logo BMI"
- th:attr="alt=#{gui.countryselection.logo.bmi.alt}">
- <h1 class="hidden" th:text="#{gui.countryselection.header1}"> Bundesministerium für Inneres </h1>
- </a>
- </div>
- <ul class="nav_oben">
- <li>
- <div class="languageselection" th:include="language_selection :: selectlanguage">
- LanguageSelectionBlock
- </div>
- </li>
- &nbsp; &nbsp;
- <li>
- <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.link.bmi}">Startseite
- BMI </a>
- </li>
- </ul>
- </div>
-</div>
-<div class="content">
- <div class="subtitle">
- <h1 th:text="#{gui.countryselection.header2}"> Zentraler eIDAS Knoten der Republik Österreich </h1>
- <h2 th:text="#{gui.countryselection.header3}"> Betrieben durch das Bundesministerium für Inneres </h2>
- </div>
-
- <h1 th:text="#{gui.residency.header.selection}">Search your Austrian Residency</h1>
-
- <div id="residency">
- <form id="inputForm" method="post" action="$contextPath$submitEndpoint"
- th:attr="action=@{${submitEndpoint}}">
- <div><p th:text="#{gui.residency.header.help}">Please enter a postcode, municipality or village first</p>
- </div>
- <div>
- <label for="inputPostleitzahl" th:text="#{gui.residency.input.postleitzahl}">Postleitzahl</label>
- <input type="text" id="inputPostleitzahl" name="postleitzahl" value=""/>
- </div>
- <div>
- <label for="inputMunicipality" th:text="#{gui.residency.input.municipality}">Municipality</label>
- <input type="text" id="inputMunicipality" name="municipality" value=""/>
- </div>
- <div>
- <label for="inputVillage" th:text="#{gui.residency.input.village}">Village</label>
- <input type="text" id="inputVillage" name="village" value=""/>
- </div>
- <div>
- <label for="inputStreet" th:text="#{gui.residency.input.street}">Street</label>
- <input type="text" id="inputStreet" name="street" value=""/>
- </div>
- <div>
- <label for="inputNumber" th:text="#{gui.residency.input.number}">Number</label>
- <input type="text" id="inputNumber" name="number" value=""/>
- </div>
- <div class="block">
- <button type="button" id="buttonSearch" onclick="search()" th:text="#{gui.residency.search}">
- Search
- </button>
- <button type="button" id="buttonClear" onclick="clearInput()" th:text="#{gui.residency.clear}">
- Clear
- </button>
- <button type="button" id="buttonProceed" th:text="#{gui.residency.proceed}">Proceed</button>
- </div>
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
- </form>
- </div>
-
- <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <button type="submit" value="Abbrechen/Cancel" th:text="#{gui.residency.cancel}">Cancel</button>
- <input type="hidden" name="stopAuthProcess" value="true">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
- </form>
-
- <div>
- <img id="loading" src="../../webapp/img/ajax-loader.gif"
- th:attr="src=@{/static/img/ajax-loader.gif}" style="display: none"/>
- </div>
-
- <div id="result">
- <div>
- <p><span id="textResult" style="display: none"></span></p>
- </div>
- <table id="tableResult" style="display: none">
- <thead>
- <tr>
- <th th:text="#{gui.residency.input.postleitzahl}" style="text-align: right">Postcode</th>
- <th th:text="#{gui.residency.input.municipality}">Municipality</th>
- <th th:text="#{gui.residency.input.village}">Village</th>
- <th th:text="#{gui.residency.input.street}">Street</th>
- <th th:text="#{gui.residency.input.number}" style="text-align: right">Number</th>
- </tr>
- </thead>
- <tbody>
-
- </tbody>
- </table>
- </div>
-
-</div>
-<footer>
- <div class="copyright">&copy; BUNDESMINISTERIUM FÃœR INNERES</div>
- <div></div>
-</footer>
-</body>
-</html>
diff --git a/connector/src/main/resources/tomcat.properties b/connector/src/main/resources/tomcat.properties
deleted file mode 100644
index 38ab5a64..00000000
--- a/connector/src/main/resources/tomcat.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-tomcat.ajp.enabled=true
-#tomcat.ajp.port=41009
-#tomcat.ajp.additionalAttributes.secretrequired=true
-#tomcat.ajp.additionalAttributes.secret=
-
-server.tomcat.accesslog.buffered=false
-server.tomcat.accesslog.prefix=tomcat-access_log
-server.tomcat.accesslog.directory=logs/
-server.tomcat.accesslog.enabled=true
-server.tomcat.accesslog.file-date-format=.yyyy-MM-dd
-server.tomcat.accesslog.pattern=common
-server.tomcat.accesslog.rename-on-rotate=false
-server.tomcat.accesslog.request-attributes-enabled=true
-server.tomcat.accesslog.rotate=true
-server.tomcat.accesslog.suffix=.log \ No newline at end of file
diff --git a/connector/src/main/webapp/WEB-INF/web.xml b/connector/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index d5425ad4..00000000
--- a/connector/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_0.xsd"
- version="3.0">
-
- <display-name>AT eIDAS connector</display-name>
- <description>MS specific eIDAS connector to national eID infrastructure</description>
-
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- </welcome-file-list>
-
- <session-config>
- <session-timeout>5</session-timeout>
- </session-config>
-
- <error-page>
- <error-code>500</error-code>
- <location>/errorpage.jsp</location>
- </error-page>
-
-</web-app>
diff --git a/connector/src/main/webapp/autocommit.js b/connector/src/main/webapp/autocommit.js
deleted file mode 100644
index d21a5651..00000000
--- a/connector/src/main/webapp/autocommit.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function autoCommmit() {
- document.forms[0].submit();
-}
-
-document.addEventListener('DOMContentLoaded', autoCommmit); \ No newline at end of file
diff --git a/connector/src/main/webapp/css/css_country.css b/connector/src/main/webapp/css/css_country.css
deleted file mode 100644
index 297f0366..00000000
--- a/connector/src/main/webapp/css/css_country.css
+++ /dev/null
@@ -1,62 +0,0 @@
-@charset "utf-8";
- body {
- background-image: url(img/globus_eu.png);
- background-repeat: no-repeat;
- background-attachment: fixed;
- background-position: top;
- background-color: #F9F9F9;
- font-family: Arial, Helvetica, sans-serif;
- }
- #page {
- padding-top: 2%;
- padding-left: 10%;
- }
-
- #country {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- align-items: center;
- }
-
- .block {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- cursor: pointer;
- text-decoration: none;
- padding-right:2%;
- width: 250px;
- }
-
- .countryimage {
- width:50px;
- height:50px;
- padding-right: 2%;
- padding-bottom: 4%;
- }
-
- input[type=button], input[type=submit], input[type=reset] {
- display:flex;
- background-color:transparent;
- border:none;
- color: black;
- text-decoration: none;
- cursor: pointer;
- }
- #testEnvironment {
- border: none;
- color: black;
- padding: 10px 20px;
- text-decoration: none;
- margin: 4px 2px;
- height: 3%;
- display: inline-block;
- vertical-align: middle;
- width: 40%;
- }
- #button{
- background-color: transparent;
- border:none;
- }
- \ No newline at end of file
diff --git a/connector/src/main/webapp/css/css_error.css b/connector/src/main/webapp/css/css_error.css
deleted file mode 100644
index d772df43..00000000
--- a/connector/src/main/webapp/css/css_error.css
+++ /dev/null
@@ -1,26 +0,0 @@
-@charset "utf-8";
- body {
- padding-left: 5%;
- background-color: #F9F9F9;
- }
- #page {
- padding-top: 2%;
- padding-right: 10%;
- padding-left: 5%;
- }
-
- .OA_header {
- font-size: 2.1em;
- padding-top:1%;
- margin-bottom: 1%;
- margin-top: 1%;
-
- }
-
- #alert_area {
- float:left;
- width: 100%;
- }
-
-
-
diff --git a/connector/src/main/webapp/img/ajax-loader.gif b/connector/src/main/webapp/img/ajax-loader.gif
deleted file mode 100644
index f2a1bc0c..00000000
--- a/connector/src/main/webapp/img/ajax-loader.gif
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Belgium-EU_.png b/connector/src/main/webapp/img/countries/Belgium-EU_.png
deleted file mode 100644
index 6ca01ceb..00000000
--- a/connector/src/main/webapp/img/countries/Belgium-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Belgium-EU_gray.png b/connector/src/main/webapp/img/countries/Belgium-EU_gray.png
deleted file mode 100644
index 347ba4c7..00000000
--- a/connector/src/main/webapp/img/countries/Belgium-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Bulgaria-EU_.png b/connector/src/main/webapp/img/countries/Bulgaria-EU_.png
deleted file mode 100644
index 9f317227..00000000
--- a/connector/src/main/webapp/img/countries/Bulgaria-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Bulgaria-EU_gray.png b/connector/src/main/webapp/img/countries/Bulgaria-EU_gray.png
deleted file mode 100644
index 2f3dac9d..00000000
--- a/connector/src/main/webapp/img/countries/Bulgaria-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Croatia-EU_.png b/connector/src/main/webapp/img/countries/Croatia-EU_.png
deleted file mode 100644
index cdace013..00000000
--- a/connector/src/main/webapp/img/countries/Croatia-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Croatia-EU_gray.png b/connector/src/main/webapp/img/countries/Croatia-EU_gray.png
deleted file mode 100644
index 26ca185a..00000000
--- a/connector/src/main/webapp/img/countries/Croatia-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Cyprus-EU_.png b/connector/src/main/webapp/img/countries/Cyprus-EU_.png
deleted file mode 100644
index 0af033d9..00000000
--- a/connector/src/main/webapp/img/countries/Cyprus-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Cyprus-EU_gray.png b/connector/src/main/webapp/img/countries/Cyprus-EU_gray.png
deleted file mode 100644
index ee7ee3dc..00000000
--- a/connector/src/main/webapp/img/countries/Cyprus-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/CzechRepublic-EU_.png b/connector/src/main/webapp/img/countries/CzechRepublic-EU_.png
deleted file mode 100644
index 150b80b4..00000000
--- a/connector/src/main/webapp/img/countries/CzechRepublic-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/CzechRepublic-EU_gray.png b/connector/src/main/webapp/img/countries/CzechRepublic-EU_gray.png
deleted file mode 100644
index e517a757..00000000
--- a/connector/src/main/webapp/img/countries/CzechRepublic-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Denmark-EU_.png b/connector/src/main/webapp/img/countries/Denmark-EU_.png
deleted file mode 100644
index 9ab8f949..00000000
--- a/connector/src/main/webapp/img/countries/Denmark-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Denmark-EU_gray.png b/connector/src/main/webapp/img/countries/Denmark-EU_gray.png
deleted file mode 100644
index 82a8eebc..00000000
--- a/connector/src/main/webapp/img/countries/Denmark-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Estonia-EU_.png b/connector/src/main/webapp/img/countries/Estonia-EU_.png
deleted file mode 100644
index a7d403bf..00000000
--- a/connector/src/main/webapp/img/countries/Estonia-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Estonia-EU_gray.png b/connector/src/main/webapp/img/countries/Estonia-EU_gray.png
deleted file mode 100644
index 1633b424..00000000
--- a/connector/src/main/webapp/img/countries/Estonia-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Finland-EU_.png b/connector/src/main/webapp/img/countries/Finland-EU_.png
deleted file mode 100644
index 3f4e2e01..00000000
--- a/connector/src/main/webapp/img/countries/Finland-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Finland-EU_gray.png b/connector/src/main/webapp/img/countries/Finland-EU_gray.png
deleted file mode 100644
index bdd5831c..00000000
--- a/connector/src/main/webapp/img/countries/Finland-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/France-EU_.png b/connector/src/main/webapp/img/countries/France-EU_.png
deleted file mode 100644
index eaee2254..00000000
--- a/connector/src/main/webapp/img/countries/France-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/France-EU_gray.png b/connector/src/main/webapp/img/countries/France-EU_gray.png
deleted file mode 100644
index 242e278d..00000000
--- a/connector/src/main/webapp/img/countries/France-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Germany-EU_gray.png b/connector/src/main/webapp/img/countries/Germany-EU_gray.png
deleted file mode 100644
index e68fe8a5..00000000
--- a/connector/src/main/webapp/img/countries/Germany-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Greece-EU_.png b/connector/src/main/webapp/img/countries/Greece-EU_.png
deleted file mode 100644
index 929cc294..00000000
--- a/connector/src/main/webapp/img/countries/Greece-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Greece-EU_gray.png b/connector/src/main/webapp/img/countries/Greece-EU_gray.png
deleted file mode 100644
index 4b1d1230..00000000
--- a/connector/src/main/webapp/img/countries/Greece-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Hungary-EU_.png b/connector/src/main/webapp/img/countries/Hungary-EU_.png
deleted file mode 100644
index b60be10e..00000000
--- a/connector/src/main/webapp/img/countries/Hungary-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Hungary-EU_gray.png b/connector/src/main/webapp/img/countries/Hungary-EU_gray.png
deleted file mode 100644
index fbb2c959..00000000
--- a/connector/src/main/webapp/img/countries/Hungary-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Iceland.png b/connector/src/main/webapp/img/countries/Iceland.png
deleted file mode 100644
index 18b13341..00000000
--- a/connector/src/main/webapp/img/countries/Iceland.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Iceland_gray.png b/connector/src/main/webapp/img/countries/Iceland_gray.png
deleted file mode 100644
index 6b1ebb97..00000000
--- a/connector/src/main/webapp/img/countries/Iceland_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Ireland-EU_.png b/connector/src/main/webapp/img/countries/Ireland-EU_.png
deleted file mode 100644
index 16a3f970..00000000
--- a/connector/src/main/webapp/img/countries/Ireland-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Ireland-EU_gray.png b/connector/src/main/webapp/img/countries/Ireland-EU_gray.png
deleted file mode 100644
index 23ad027e..00000000
--- a/connector/src/main/webapp/img/countries/Ireland-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Italy-EU_.png b/connector/src/main/webapp/img/countries/Italy-EU_.png
deleted file mode 100644
index 5f2cb3ec..00000000
--- a/connector/src/main/webapp/img/countries/Italy-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Italy-EU_gray.png b/connector/src/main/webapp/img/countries/Italy-EU_gray.png
deleted file mode 100644
index 8c34ac5b..00000000
--- a/connector/src/main/webapp/img/countries/Italy-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Latvia-EU_.png b/connector/src/main/webapp/img/countries/Latvia-EU_.png
deleted file mode 100644
index da290d21..00000000
--- a/connector/src/main/webapp/img/countries/Latvia-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Latvia-EU_gray.png b/connector/src/main/webapp/img/countries/Latvia-EU_gray.png
deleted file mode 100644
index d3734a43..00000000
--- a/connector/src/main/webapp/img/countries/Latvia-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Lichtenstein.png b/connector/src/main/webapp/img/countries/Lichtenstein.png
deleted file mode 100644
index 09755c7f..00000000
--- a/connector/src/main/webapp/img/countries/Lichtenstein.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Lichtenstein_gray.png b/connector/src/main/webapp/img/countries/Lichtenstein_gray.png
deleted file mode 100644
index 09755c7f..00000000
--- a/connector/src/main/webapp/img/countries/Lichtenstein_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Lithuania-EU_.png b/connector/src/main/webapp/img/countries/Lithuania-EU_.png
deleted file mode 100644
index 14e633f0..00000000
--- a/connector/src/main/webapp/img/countries/Lithuania-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Lithuania-EU_gray.png b/connector/src/main/webapp/img/countries/Lithuania-EU_gray.png
deleted file mode 100644
index 62d2e0c8..00000000
--- a/connector/src/main/webapp/img/countries/Lithuania-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Luxembourg-EU_.png b/connector/src/main/webapp/img/countries/Luxembourg-EU_.png
deleted file mode 100644
index a89db9c2..00000000
--- a/connector/src/main/webapp/img/countries/Luxembourg-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Luxembourg-EU_gray.png b/connector/src/main/webapp/img/countries/Luxembourg-EU_gray.png
deleted file mode 100644
index 8804c4f3..00000000
--- a/connector/src/main/webapp/img/countries/Luxembourg-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Malta-EU_.png b/connector/src/main/webapp/img/countries/Malta-EU_.png
deleted file mode 100644
index cabe7926..00000000
--- a/connector/src/main/webapp/img/countries/Malta-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Malta-EU_gray.png b/connector/src/main/webapp/img/countries/Malta-EU_gray.png
deleted file mode 100644
index 55c03aa0..00000000
--- a/connector/src/main/webapp/img/countries/Malta-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Poland-EU_.png b/connector/src/main/webapp/img/countries/Poland-EU_.png
deleted file mode 100644
index e734ac63..00000000
--- a/connector/src/main/webapp/img/countries/Poland-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Poland-EU_gray.png b/connector/src/main/webapp/img/countries/Poland-EU_gray.png
deleted file mode 100644
index f9faac55..00000000
--- a/connector/src/main/webapp/img/countries/Poland-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Portugal-EU_.png b/connector/src/main/webapp/img/countries/Portugal-EU_.png
deleted file mode 100644
index 017e7a19..00000000
--- a/connector/src/main/webapp/img/countries/Portugal-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Portugal-EU_gray.png b/connector/src/main/webapp/img/countries/Portugal-EU_gray.png
deleted file mode 100644
index ada526b8..00000000
--- a/connector/src/main/webapp/img/countries/Portugal-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Romania-EU_.png b/connector/src/main/webapp/img/countries/Romania-EU_.png
deleted file mode 100644
index 0a84f406..00000000
--- a/connector/src/main/webapp/img/countries/Romania-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Romania-EU_gray.png b/connector/src/main/webapp/img/countries/Romania-EU_gray.png
deleted file mode 100644
index 4bf3e2e6..00000000
--- a/connector/src/main/webapp/img/countries/Romania-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Slovakia-EU_.png b/connector/src/main/webapp/img/countries/Slovakia-EU_.png
deleted file mode 100644
index 38748a1a..00000000
--- a/connector/src/main/webapp/img/countries/Slovakia-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Slovakia-EU_gray.png b/connector/src/main/webapp/img/countries/Slovakia-EU_gray.png
deleted file mode 100644
index e2e41760..00000000
--- a/connector/src/main/webapp/img/countries/Slovakia-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Slovenia-EU_.png b/connector/src/main/webapp/img/countries/Slovenia-EU_.png
deleted file mode 100644
index d1946b0b..00000000
--- a/connector/src/main/webapp/img/countries/Slovenia-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Slovenia-EU_gray.png b/connector/src/main/webapp/img/countries/Slovenia-EU_gray.png
deleted file mode 100644
index b96eed00..00000000
--- a/connector/src/main/webapp/img/countries/Slovenia-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Spain-EU_.png b/connector/src/main/webapp/img/countries/Spain-EU_.png
deleted file mode 100644
index f3b66e25..00000000
--- a/connector/src/main/webapp/img/countries/Spain-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Spain-EU_gray.png b/connector/src/main/webapp/img/countries/Spain-EU_gray.png
deleted file mode 100644
index f951c8bf..00000000
--- a/connector/src/main/webapp/img/countries/Spain-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Sweden-EU_.png b/connector/src/main/webapp/img/countries/Sweden-EU_.png
deleted file mode 100644
index 5e936083..00000000
--- a/connector/src/main/webapp/img/countries/Sweden-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/Sweden-EU_gray.png b/connector/src/main/webapp/img/countries/Sweden-EU_gray.png
deleted file mode 100644
index e3fe0c6a..00000000
--- a/connector/src/main/webapp/img/countries/Sweden-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/TestLoginLogo.png b/connector/src/main/webapp/img/countries/TestLoginLogo.png
deleted file mode 100644
index ba4cca6c..00000000
--- a/connector/src/main/webapp/img/countries/TestLoginLogo.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/TheNetherlands-EU_.png b/connector/src/main/webapp/img/countries/TheNetherlands-EU_.png
deleted file mode 100644
index 791614a7..00000000
--- a/connector/src/main/webapp/img/countries/TheNetherlands-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/TheNetherlands-EU_gray.png b/connector/src/main/webapp/img/countries/TheNetherlands-EU_gray.png
deleted file mode 100644
index a25133a6..00000000
--- a/connector/src/main/webapp/img/countries/TheNetherlands-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/UnitedKingdom-EU_.png b/connector/src/main/webapp/img/countries/UnitedKingdom-EU_.png
deleted file mode 100644
index f1217cc0..00000000
--- a/connector/src/main/webapp/img/countries/UnitedKingdom-EU_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/UnitedKingdom-EU_gray.png b/connector/src/main/webapp/img/countries/UnitedKingdom-EU_gray.png
deleted file mode 100644
index 501bd200..00000000
--- a/connector/src/main/webapp/img/countries/UnitedKingdom-EU_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/countries_eu_gray.png b/connector/src/main/webapp/img/countries/countries_eu_gray.png
deleted file mode 100644
index e68fe8a5..00000000
--- a/connector/src/main/webapp/img/countries/countries_eu_gray.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/demo.png b/connector/src/main/webapp/img/countries/demo.png
deleted file mode 100644
index 7e9d6be9..00000000
--- a/connector/src/main/webapp/img/countries/demo.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/countries/germany-eu_.png b/connector/src/main/webapp/img/countries/germany-eu_.png
deleted file mode 100644
index 788776b9..00000000
--- a/connector/src/main/webapp/img/countries/germany-eu_.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/img/globus_eu.png b/connector/src/main/webapp/img/globus_eu.png
deleted file mode 100644
index 7ac30cec..00000000
--- a/connector/src/main/webapp/img/globus_eu.png
+++ /dev/null
Binary files differ
diff --git a/connector/src/main/webapp/index.html b/connector/src/main/webapp/index.html
deleted file mode 100644
index 55370ebe..00000000
--- a/connector/src/main/webapp/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<head>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <link rel="stylesheet" href="css/css_error.css" />
-
- <title>Austrian specific eIDAS-Connector</title>
-</head>
-
-<body>
- <div id="page">
- <div id="page1" class="case selected-case" role="main">
- <h2 class="OA_header" role="heading">Austrian specific eIDAS-Connector</h2>
-
- <div class="hell" role="application" >
- <p>Your are on the Austrian specific eIDAS-Connector.
- <br><br>
- This service acts as a national gateway to eIDAS proxy-services and can by only used in combination with Austrian online applications. </p>
-
- </div>
-
- </div>
- </div>
-</body>
-</html> \ No newline at end of file
diff --git a/connector/src/main/webapp/js/jquery-3.6.0.min.js b/connector/src/main/webapp/js/jquery-3.6.0.min.js
deleted file mode 100644
index c4c6022f..00000000
--- a/connector/src/main/webapp/js/jquery-3.6.0.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/connector/src/main/webapp/js/js_country.js b/connector/src/main/webapp/js/js_country.js
deleted file mode 100644
index 5dcea90e..00000000
--- a/connector/src/main/webapp/js/js_country.js
+++ /dev/null
@@ -1,42 +0,0 @@
-function clickCountryFlag(element) {
- if (!element) return false;
-
- var form = element.target.closest("form");
-
- if (!form) return false;
-
- form.submit();
- return false;
-}
-
-
-/* Set JS events by EventListener to prevent problems with CSP*/
-document.addEventListener("DOMContentLoaded", function(event) {
-
- /* Element.closest polyfill - https://developer.mozilla.org/en-US/docs/Web/API/Element/closest License: public domain*/
- if (!Element.prototype.matches)
- Element.prototype.matches = Element.prototype.msMatchesSelector ||
- Element.prototype.webkitMatchesSelector;
-
- if (!Element.prototype.closest)
- Element.prototype.closest = function(s) {
- var el = this;
- if (!document.documentElement.contains(el)) return null;
- do {
- if (el.matches(s)) return el;
- el = el.parentElement || el.parentNode;
- } while (el !== null && el.nodeType === 1);
- return null;
- };
-
- /* set Click events by EventListener to prevent JavaScript in HTML which can be a problem with CSP*/
- var allFlags = document.getElementsByClassName("countryimage");
- for (i=0;i<allFlags.length;i++) {
- if(allFlags[i].getAttribute("disabled") == null) {
- allFlags[i].closest("a").addEventListener('click', clickCountryFlag, false);
- }
- }
-});
-
-
-