Concurrency Bug in TED Preview Validation API #1083
-
A concurrency bug has been identified in the TED Preview Validation API. This issue occurs only when two validation requests are sent simultaneously with different subtypes. When performing validations in parallel, the responses do not always match the expected subtypes, unlike sequential execution which works correctly. Here is the code that verifies the bug: package com.example;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.util.List;
import java.util.regex.Pattern;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.fail;
public class AppTest {
private record ValidationRequest(String notice, String language, String validationMode) {
}
private record NoticeValidation(String base64, String subtype) {
}
private static final String API_URL = "https://cvs.preview.ted.europa.eu/v1/notices/validation";
private static final String API_KEY = "api_key";
private static final String NOTICE_SDK1_8_SUBTYPE4 = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPFByaW9ySW5mb3JtYXRpb25Ob3RpY2UgeG1sbnM9InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOlByaW9ySW5mb3JtYXRpb25Ob3RpY2UtMiIKICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6Y2FjPSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpDb21tb25BZ2dyZWdhdGVDb21wb25lbnRzLTIiCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOmNiYz0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6Q29tbW9uQmFzaWNDb21wb25lbnRzLTIiCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOmVmYWM9Imh0dHA6Ly9kYXRhLmV1cm9wYS5ldS9wMjcvZWZvcm1zLXVibC1leHRlbnNpb24tYWdncmVnYXRlLWNvbXBvbmVudHMvMSIKICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6ZWZiYz0iaHR0cDovL2RhdGEuZXVyb3BhLmV1L3AyNy9lZm9ybXMtdWJsLWV4dGVuc2lvbi1iYXNpYy1jb21wb25lbnRzLzEiCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOmVmZXh0PSJodHRwOi8vZGF0YS5ldXJvcGEuZXUvcDI3L2Vmb3Jtcy11YmwtZXh0ZW5zaW9ucy8xIgogICAgICAgICAgICAgICAgICAgICAgICB4bWxuczpleHQ9InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkNvbW1vbkV4dGVuc2lvbkNvbXBvbmVudHMtMiIKICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+CiAgIDxleHQ6VUJMRXh0ZW5zaW9ucz4KICAgICAgPGV4dDpVQkxFeHRlbnNpb24+CiAgICAgICAgIDxleHQ6RXh0ZW5zaW9uQ29udGVudD4KICAgICAgICAgICAgPGVmZXh0OkVmb3Jtc0V4dGVuc2lvbj4KICAgICAgICAgICAgICAgPGVmYWM6Tm90aWNlU3ViVHlwZT4KICAgICAgICAgICAgICAgICAgPGNiYzpTdWJUeXBlQ29kZSBsaXN0TmFtZT0ibm90aWNlLXN1YnR5cGUiPjQ8L2NiYzpTdWJUeXBlQ29kZT4KICAgICAgICAgICAgICAgPC9lZmFjOk5vdGljZVN1YlR5cGU+CiAgICAgICAgICAgICAgIDxlZmFjOk9yZ2FuaXphdGlvbnM+CiAgICAgICAgICAgICAgICAgIDxlZmFjOk9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICAgPGVmYWM6Q29tcGFueT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpXZWJzaXRlVVJJPmh0dHBzOi8vd3d3LnBhcnR5d2Vic2l0ZXVyaTEyMzQuY29tPC9jYmM6V2Vic2l0ZVVSST4KICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpFbmRwb2ludElEPmh0dHBzOi8vZW5kcG9pbnR1cmkxMjM0LmNvbTwvY2JjOkVuZHBvaW50SUQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJvcmdhbml6YXRpb24iPk9SRy0wMDAxPC9jYmM6SUQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6UGFydHlOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOk5hbWUgbGFuZ3VhZ2VJRD0iRU5HIj5QYXJ0eU5hbWUxMjM0PC9jYmM6TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6UGFydHlOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOlBvc3RhbEFkZHJlc3M+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6U3RyZWV0TmFtZT5QYXJ0eU5hbWVTdHJlZXROYW1lMTIzNDwvY2JjOlN0cmVldE5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6Q2l0eU5hbWU+Q2l0eTEyMzQ8L2NiYzpDaXR5TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpQb3N0YWxab25lPkFCQzEyMzwvY2JjOlBvc3RhbFpvbmU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6Q291bnRyeVN1YmVudGl0eUNvZGUgbGlzdE5hbWU9Im51dHMiPkRFNDAxPC9jYmM6Q291bnRyeVN1YmVudGl0eUNvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6Q291bnRyeT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpJZGVudGlmaWNhdGlvbkNvZGUgbGlzdE5hbWU9ImNvdW50cnkiPkRFVTwvY2JjOklkZW50aWZpY2F0aW9uQ29kZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6Q291bnRyeT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpQYXJ0eUxlZ2FsRW50aXR5PgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOkNvbXBhbnlJRD5QYXJ0eUxlZ2FsRW50aXR5Q0lEMTIzNDwvY2JjOkNvbXBhbnlJRD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6UGFydHlMZWdhbEVudGl0eT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpQYXJ0eUxlZ2FsRW50aXR5PgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOkNvbXBhbnlJRD5QYXJ0eUxlZ2FsRW50aXR5Q0lEMTIzNDwvY2JjOkNvbXBhbnlJRD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6UGFydHlMZWdhbEVudGl0eT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpDb250YWN0PgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOk5hbWU+Q29udGFjdG5hbWUxMjM0PC9jYmM6TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpUZWxlcGhvbmU+MTIzNDU2Nzg5PC9jYmM6VGVsZXBob25lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOlRlbGVmYXg+MTIzNDU2Nzg5OTwvY2JjOlRlbGVmYXg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6RWxlY3Ryb25pY01haWw+Y29udGFjdEBleGFtcGxlLmNvbTwvY2JjOkVsZWN0cm9uaWNNYWlsPgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpDb250YWN0PgogICAgICAgICAgICAgICAgICAgICA8L2VmYWM6Q29tcGFueT4KICAgICAgICAgICAgICAgICAgPC9lZmFjOk9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgPGVmYWM6T3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICAgICA8ZWZhYzpDb21wYW55PgogICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOldlYnNpdGVVUkk+aHR0cHM6Ly9hcHBlYWwtZXhhbXBsZS5jb208L2NiYzpXZWJzaXRlVVJJPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6SUQgc2NoZW1lTmFtZT0ib3JnYW5pemF0aW9uIj5PUkctMDAwMjwvY2JjOklEPgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOlBhcnR5TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpOYW1lIGxhbmd1YWdlSUQ9IkVORyI+QXBwZWFsUmVjZWl2ZXJQYXJ0eSBOYW1lPC9jYmM6TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6UGFydHlOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOlBvc3RhbEFkZHJlc3M+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6U3RyZWV0TmFtZT5Tb21lIHN0cmVldDwvY2JjOlN0cmVldE5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6Q2l0eU5hbWU+QXBwZWFsQ2l0eTwvY2JjOkNpdHlOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOlBvc3RhbFpvbmU+MTIzNTQ8L2NiYzpQb3N0YWxab25lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOkNvdW50cnlTdWJlbnRpdHlDb2RlIGxpc3ROYW1lPSJudXRzIj5ERTExMzwvY2JjOkNvdW50cnlTdWJlbnRpdHlDb2RlPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOkNvdW50cnk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6SWRlbnRpZmljYXRpb25Db2RlIGxpc3ROYW1lPSJjb3VudHJ5Ij5ERVU8L2NiYzpJZGVudGlmaWNhdGlvbkNvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOkNvdW50cnk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOlBvc3RhbEFkZHJlc3M+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6UGFydHlMZWdhbEVudGl0eT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpDb21wYW55SUQ+MTIzIDQ1NiA3ODk8L2NiYzpDb21wYW55SUQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOlBhcnR5TGVnYWxFbnRpdHk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6Q29udGFjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpUZWxlcGhvbmU+MTIzNDU2Nzg5PC9jYmM6VGVsZXBob25lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOlRlbGVmYXg+MTIzNDU2Nzg5OTwvY2JjOlRlbGVmYXg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6RWxlY3Ryb25pY01haWw+Y29udGFjdEBleGFtcGxlLmNvbTwvY2JjOkVsZWN0cm9uaWNNYWlsPgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpDb250YWN0PgogICAgICAgICAgICAgICAgICAgICA8L2VmYWM6Q29tcGFueT4KICAgICAgICAgICAgICAgICAgPC9lZmFjOk9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgPGVmYWM6T3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICAgICA8ZWZhYzpDb21wYW55PgogICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOldlYnNpdGVVUkk+aHR0cHM6Ly9lc2VuZGVyY29ycC5ldTwvY2JjOldlYnNpdGVVUkk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJvcmdhbml6YXRpb24iPk9SRy0wMDAzPC9jYmM6SUQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6UGFydHlOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOk5hbWUgbGFuZ3VhZ2VJRD0iRU5HIj5lU2VuZENvcnA8L2NiYzpOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpQYXJ0eU5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpDaXR5TmFtZT5MdXhlbWJvdXJnPC9jYmM6Q2l0eU5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6UG9zdGFsWm9uZT4yOTg1PC9jYmM6UG9zdGFsWm9uZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpDb3VudHJ5U3ViZW50aXR5Q29kZSBsaXN0TmFtZT0ibnV0cyI+TFUwMDA8L2NiYzpDb3VudHJ5U3ViZW50aXR5Q29kZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOklkZW50aWZpY2F0aW9uQ29kZSBsaXN0TmFtZT0iY291bnRyeSI+TFVYPC9jYmM6SWRlbnRpZmljYXRpb25Db2RlPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpDb3VudHJ5PgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpQb3N0YWxBZGRyZXNzPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOlBhcnR5TGVnYWxFbnRpdHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6Q29tcGFueUlEPjExMSAyMjIgMzMzPC9jYmM6Q29tcGFueUlEPgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpQYXJ0eUxlZ2FsRW50aXR5PgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOkNvbnRhY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6VGVsZXBob25lPiszNTIgMTIzNDU2Nzg5PC9jYmM6VGVsZXBob25lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOlRlbGVmYXg+KzM1MiAxMjM0NTY3ODk5PC9jYmM6VGVsZWZheD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpFbGVjdHJvbmljTWFpbD5lc2VuZGVyQGV4YW1wbGUuY29tPC9jYmM6RWxlY3Ryb25pY01haWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOkNvbnRhY3Q+CiAgICAgICAgICAgICAgICAgICAgIDwvZWZhYzpDb21wYW55PgogICAgICAgICAgICAgICAgICA8L2VmYWM6T3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICA8L2VmYWM6T3JnYW5pemF0aW9ucz4KICAgICAgICAgICAgPC9lZmV4dDpFZm9ybXNFeHRlbnNpb24+CiAgICAgICAgIDwvZXh0OkV4dGVuc2lvbkNvbnRlbnQ+CiAgICAgIDwvZXh0OlVCTEV4dGVuc2lvbj4KICAgPC9leHQ6VUJMRXh0ZW5zaW9ucz4KICAgPGNiYzpVQkxWZXJzaW9uSUQ+Mi4zPC9jYmM6VUJMVmVyc2lvbklEPgogICA8Y2JjOkN1c3RvbWl6YXRpb25JRD5lZm9ybXMtc2RrLTEuODwvY2JjOkN1c3RvbWl6YXRpb25JRD4KICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJub3RpY2UtaWQiPmRjZDYxN2YwLTg2MjctNDM0ZC04ZmM0LWE1MTYyZmJmYzBlYTwvY2JjOklEPgogICA8Y2JjOklzc3VlRGF0ZT4yMDI0LTEyLTA0LTAxOjAwPC9jYmM6SXNzdWVEYXRlPgogICA8Y2JjOklzc3VlVGltZT4xMzowOTo1Ny0wMTowMDwvY2JjOklzc3VlVGltZT4KICAgPGNiYzpWZXJzaW9uSUQ+MDE8L2NiYzpWZXJzaW9uSUQ+CiAgIDxjYmM6UGxhbm5lZERhdGU+MjAyNS0wMi0wNC0wMTowMDwvY2JjOlBsYW5uZWREYXRlPgogICA8Y2JjOlJlZ3VsYXRvcnlEb21haW4+MzIwMTRMMDAyNDwvY2JjOlJlZ3VsYXRvcnlEb21haW4+CiAgIDxjYmM6Tm90aWNlVHlwZUNvZGUgbGlzdE5hbWU9InBsYW5uaW5nIj5waW4tb25seTwvY2JjOk5vdGljZVR5cGVDb2RlPgogICA8Y2JjOk5vdGljZUxhbmd1YWdlQ29kZT5FTkc8L2NiYzpOb3RpY2VMYW5ndWFnZUNvZGU+CiAgIDxjYWM6Q29udHJhY3RpbmdQYXJ0eT4KICAgICAgPGNhYzpDb250cmFjdGluZ1BhcnR5VHlwZT4KICAgICAgICAgPGNiYzpQYXJ0eVR5cGVDb2RlIGxpc3ROYW1lPSJidXllci1sZWdhbC10eXBlIj5ldS1pbnMtYm9kLWFnPC9jYmM6UGFydHlUeXBlQ29kZT4KICAgICAgPC9jYWM6Q29udHJhY3RpbmdQYXJ0eVR5cGU+CiAgICAgIDxjYWM6Q29udHJhY3RpbmdBY3Rpdml0eT4KICAgICAgICAgPGNiYzpBY3Rpdml0eVR5cGVDb2RlIGxpc3ROYW1lPSJhdXRob3JpdHktYWN0aXZpdHkiPmdlbi1wdWI8L2NiYzpBY3Rpdml0eVR5cGVDb2RlPgogICAgICA8L2NhYzpDb250cmFjdGluZ0FjdGl2aXR5PgogICAgICA8Y2FjOlBhcnR5PgogICAgICAgICA8Y2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgIDxjYmM6SUQgc2NoZW1lTmFtZT0ib3JnYW5pemF0aW9uIj5PUkctMDAwMTwvY2JjOklEPgogICAgICAgICA8L2NhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICAgICA8Y2FjOlNlcnZpY2VQcm92aWRlclBhcnR5PgogICAgICAgICAgICA8Y2JjOlNlcnZpY2VUeXBlQ29kZSBsaXN0TmFtZT0ib3JnYW5pc2F0aW9uLXJvbGUiPnRlZC1lc2VuPC9jYmM6U2VydmljZVR5cGVDb2RlPgogICAgICAgICAgICA8Y2FjOlBhcnR5PgogICAgICAgICAgICAgICA8Y2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgICAgICAgIDxjYmM6SUQgc2NoZW1lTmFtZT0ib3JnYW5pemF0aW9uIj5PUkctMDAwMzwvY2JjOklEPgogICAgICAgICAgICAgICA8L2NhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICAgICAgICA8L2NhYzpQYXJ0eT4KICAgICAgICAgPC9jYWM6U2VydmljZVByb3ZpZGVyUGFydHk+CiAgICAgIDwvY2FjOlBhcnR5PgogICA8L2NhYzpDb250cmFjdGluZ1BhcnR5PgogICA8Y2FjOlByb2N1cmVtZW50UHJvamVjdD4KICAgICAgPGNiYzpJRD5Qcm9QcklEMTIzNDwvY2JjOklEPgogICAgICA8Y2JjOk5hbWUgbGFuZ3VhZ2VJRD0iRU5HIj5Qcm9Qck5hbWUxMjM0PC9jYmM6TmFtZT4KICAgICAgPGNiYzpEZXNjcmlwdGlvbiBsYW5ndWFnZUlEPSJFTkciPlByUHJEZXNjYmxhYmxhPC9jYmM6RGVzY3JpcHRpb24+CiAgICAgIDxjYmM6UHJvY3VyZW1lbnRUeXBlQ29kZSBsaXN0TmFtZT0iY29udHJhY3QtbmF0dXJlIj5zZXJ2aWNlczwvY2JjOlByb2N1cmVtZW50VHlwZUNvZGU+CiAgICAgIDxjYmM6Tm90ZSBsYW5ndWFnZUlEPSJFTkciPk5vdGVibGFibGFibGE8L2NiYzpOb3RlPgogICAgICA8Y2JjOlNNRVN1aXRhYmxlSW5kaWNhdG9yPnRydWU8L2NiYzpTTUVTdWl0YWJsZUluZGljYXRvcj4KICAgICAgPGNhYzpSZXF1ZXN0ZWRUZW5kZXJUb3RhbD4KICAgICAgICAgPGNiYzpFc3RpbWF0ZWRPdmVyYWxsQ29udHJhY3RBbW91bnQgY3VycmVuY3lJRD0iRVVSIj4xMDAwMDA8L2NiYzpFc3RpbWF0ZWRPdmVyYWxsQ29udHJhY3RBbW91bnQ+CiAgICAgIDwvY2FjOlJlcXVlc3RlZFRlbmRlclRvdGFsPgogICAgICA8Y2FjOk1haW5Db21tb2RpdHlDbGFzc2lmaWNhdGlvbj4KICAgICAgICAgPGNiYzpJdGVtQ2xhc3NpZmljYXRpb25Db2RlIGxpc3ROYW1lPSJjcHYiPjcyMDAwMDAwPC9jYmM6SXRlbUNsYXNzaWZpY2F0aW9uQ29kZT4KICAgICAgPC9jYWM6TWFpbkNvbW1vZGl0eUNsYXNzaWZpY2F0aW9uPgogICAgICA8Y2FjOlJlYWxpemVkTG9jYXRpb24+CiAgICAgICAgIDxjYmM6RGVzY3JpcHRpb24gbGFuZ3VhZ2VJRD0iRU5HIj5SZWFsaXplZExvY0Rlc2MxMjM0PC9jYmM6RGVzY3JpcHRpb24+CiAgICAgICAgIDxjYWM6QWRkcmVzcz4KICAgICAgICAgICAgPGNiYzpTdHJlZXROYW1lPlJlYWxpemVkTG9jU3RyZWV0MTIzNDwvY2JjOlN0cmVldE5hbWU+CiAgICAgICAgICAgIDxjYmM6QWRkaXRpb25hbFN0cmVldE5hbWU+UmVhbGl6ZWRMb2NBZGRpdGlvbmFsU3RyZWV0MTIzNDwvY2JjOkFkZGl0aW9uYWxTdHJlZXROYW1lPgogICAgICAgICAgICA8Y2JjOkNpdHlOYW1lPlJlYWxpemVkTG9jQ2l0eTEyMzQ8L2NiYzpDaXR5TmFtZT4KICAgICAgICAgICAgPGNiYzpQb3N0YWxab25lPlJlYWxpemVkTG9jUG9zdGFsWm9uZTEyMzQ8L2NiYzpQb3N0YWxab25lPgogICAgICAgICAgICA8Y2JjOkNvdW50cnlTdWJlbnRpdHlDb2RlIGxpc3ROYW1lPSJudXRzIj5ERTEyMzwvY2JjOkNvdW50cnlTdWJlbnRpdHlDb2RlPgogICAgICAgICAgICA8Y2FjOkFkZHJlc3NMaW5lPgogICAgICAgICAgICAgICA8Y2JjOkxpbmU+UmVhbGl6ZWRMb2NBZGRyZXNzTGluZTEyMzQ8L2NiYzpMaW5lPgogICAgICAgICAgICA8L2NhYzpBZGRyZXNzTGluZT4KICAgICAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgICAgICA8Y2JjOklkZW50aWZpY2F0aW9uQ29kZSBsaXN0TmFtZT0iY291bnRyeSI+REVVPC9jYmM6SWRlbnRpZmljYXRpb25Db2RlPgogICAgICAgICAgICA8L2NhYzpDb3VudHJ5PgogICAgICAgICA8L2NhYzpBZGRyZXNzPgogICAgICA8L2NhYzpSZWFsaXplZExvY2F0aW9uPgogICA8L2NhYzpQcm9jdXJlbWVudFByb2plY3Q+CiAgIDxjYWM6UHJvY3VyZW1lbnRQcm9qZWN0TG90PgogICAgICA8Y2JjOklEIHNjaGVtZU5hbWU9IlBhcnQiPlBBUi0wMDAwPC9jYmM6SUQ+CiAgICAgIDxjYWM6VGVuZGVyaW5nVGVybXM+CiAgICAgICAgIDxjYWM6QWRkaXRpb25hbEluZm9ybWF0aW9uUGFydHk+CiAgICAgICAgICAgIDxjYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJvcmdhbml6YXRpb24iPk9SRy0wMDAxPC9jYmM6SUQ+CiAgICAgICAgICAgIDwvY2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgIDwvY2FjOkFkZGl0aW9uYWxJbmZvcm1hdGlvblBhcnR5PgogICAgICAgICA8Y2FjOlRlbmRlclJlY2lwaWVudFBhcnR5PgogICAgICAgICAgICA8Y2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgICAgIDxjYmM6SUQgc2NoZW1lTmFtZT0ib3JnYW5pemF0aW9uIj5PUkctMDAwMTwvY2JjOklEPgogICAgICAgICAgICA8L2NhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICAgICA8L2NhYzpUZW5kZXJSZWNpcGllbnRQYXJ0eT4KICAgICAgICAgPGNhYzpBcHBlYWxUZXJtcz4KICAgICAgICAgICAgPGNhYzpBcHBlYWxJbmZvcm1hdGlvblBhcnR5PgogICAgICAgICAgICAgICA8Y2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgICAgICAgIDxjYmM6SUQgc2NoZW1lTmFtZT0ib3JnYW5pemF0aW9uIj5PUkctMDAwMTwvY2JjOklEPgogICAgICAgICAgICAgICA8L2NhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICAgICAgICA8L2NhYzpBcHBlYWxJbmZvcm1hdGlvblBhcnR5PgogICAgICAgICAgICA8Y2FjOkFwcGVhbFJlY2VpdmVyUGFydHk+CiAgICAgICAgICAgICAgIDxjYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJvcmdhbml6YXRpb24iPk9SRy0wMDAyPC9jYmM6SUQ+CiAgICAgICAgICAgICAgIDwvY2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgIDwvY2FjOkFwcGVhbFJlY2VpdmVyUGFydHk+CiAgICAgICAgICAgIDxjYWM6TWVkaWF0aW9uUGFydHk+CiAgICAgICAgICAgICAgIDxjYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJvcmdhbml6YXRpb24iPk9SRy0wMDAyPC9jYmM6SUQ+CiAgICAgICAgICAgICAgIDwvY2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgIDwvY2FjOk1lZGlhdGlvblBhcnR5PgogICAgICAgICA8L2NhYzpBcHBlYWxUZXJtcz4KICAgICAgPC9jYWM6VGVuZGVyaW5nVGVybXM+CiAgICAgIDxjYWM6UHJvY3VyZW1lbnRQcm9qZWN0PgogICAgICAgICA8Y2JjOk5hbWUgbGFuZ3VhZ2VJRD0iRU5HIj5Qcm9Qck5hbWUxMjM0LTE8L2NiYzpOYW1lPgogICAgICAgICA8Y2JjOkRlc2NyaXB0aW9uIGxhbmd1YWdlSUQ9IkVORyI+UHJQckRlc2NibGFibGE8L2NiYzpEZXNjcmlwdGlvbj4KICAgICAgICAgPGNiYzpQcm9jdXJlbWVudFR5cGVDb2RlIGxpc3ROYW1lPSJjb250cmFjdC1uYXR1cmUiPnNlcnZpY2VzPC9jYmM6UHJvY3VyZW1lbnRUeXBlQ29kZT4KICAgICAgICAgPGNhYzpNYWluQ29tbW9kaXR5Q2xhc3NpZmljYXRpb24+CiAgICAgICAgICAgIDxjYmM6SXRlbUNsYXNzaWZpY2F0aW9uQ29kZSBsaXN0TmFtZT0iY3B2Ij41MDAwMDAwMDwvY2JjOkl0ZW1DbGFzc2lmaWNhdGlvbkNvZGU+CiAgICAgICAgIDwvY2FjOk1haW5Db21tb2RpdHlDbGFzc2lmaWNhdGlvbj4KICAgICAgICAgPGNhYzpSZWFsaXplZExvY2F0aW9uPgogICAgICAgICAgICA8Y2JjOkRlc2NyaXB0aW9uIGxhbmd1YWdlSUQ9IkVORyI+UmVhbGl6ZWRMb2NEZXNjMTIzNDwvY2JjOkRlc2NyaXB0aW9uPgogICAgICAgICAgICA8Y2FjOkFkZHJlc3M+CiAgICAgICAgICAgICAgIDxjYmM6U3RyZWV0TmFtZT5SZWFsaXplZExvY1N0cmVldDEyMzQ8L2NiYzpTdHJlZXROYW1lPgogICAgICAgICAgICAgICA8Y2JjOkFkZGl0aW9uYWxTdHJlZXROYW1lPlJlYWxpemVkTG9jQWRkaXRpb25hbFN0cmVldDEyMzQ8L2NiYzpBZGRpdGlvbmFsU3RyZWV0TmFtZT4KICAgICAgICAgICAgICAgPGNiYzpDaXR5TmFtZT5SZWFsaXplZExvY0NpdHkxMjM0PC9jYmM6Q2l0eU5hbWU+CiAgICAgICAgICAgICAgIDxjYmM6UG9zdGFsWm9uZT5SZWFsaXplZExvY1Bvc3RhbFpvbmUxMjM0PC9jYmM6UG9zdGFsWm9uZT4KICAgICAgICAgICAgICAgPGNiYzpDb3VudHJ5U3ViZW50aXR5Q29kZSBsaXN0TmFtZT0ibnV0cyI+REUxMjM8L2NiYzpDb3VudHJ5U3ViZW50aXR5Q29kZT4KICAgICAgICAgICAgICAgPGNhYzpBZGRyZXNzTGluZT4KICAgICAgICAgICAgICAgICAgPGNiYzpMaW5lPlJlYWxpemVkTG9jQWRkcmVzc0xpbmUxMjM0PC9jYmM6TGluZT4KICAgICAgICAgICAgICAgPC9jYWM6QWRkcmVzc0xpbmU+CiAgICAgICAgICAgICAgIDxjYWM6Q291bnRyeT4KICAgICAgICAgICAgICAgICAgPGNiYzpJZGVudGlmaWNhdGlvbkNvZGUgbGlzdE5hbWU9ImNvdW50cnkiPkRFVTwvY2JjOklkZW50aWZpY2F0aW9uQ29kZT4KICAgICAgICAgICAgICAgPC9jYWM6Q291bnRyeT4KICAgICAgICAgICAgPC9jYWM6QWRkcmVzcz4KICAgICAgICAgPC9jYWM6UmVhbGl6ZWRMb2NhdGlvbj4KICAgICAgPC9jYWM6UHJvY3VyZW1lbnRQcm9qZWN0PgogICA8L2NhYzpQcm9jdXJlbWVudFByb2plY3RMb3Q+CjwvUHJpb3JJbmZvcm1hdGlvbk5vdGljZT4K";
private static final String NOTICE_SDK1_8_SUBTYPE25 = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPENvbnRyYWN0QXdhcmROb3RpY2UgeG1sbnM9InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkNvbnRyYWN0QXdhcmROb3RpY2UtMiIKICAgICAgICAgICAgICAgICAgICAgeG1sbnM6Y2FjPSJ1cm46b2FzaXM6bmFtZXM6c3BlY2lmaWNhdGlvbjp1Ymw6c2NoZW1hOnhzZDpDb21tb25BZ2dyZWdhdGVDb21wb25lbnRzLTIiCiAgICAgICAgICAgICAgICAgICAgIHhtbG5zOmNiYz0idXJuOm9hc2lzOm5hbWVzOnNwZWNpZmljYXRpb246dWJsOnNjaGVtYTp4c2Q6Q29tbW9uQmFzaWNDb21wb25lbnRzLTIiCiAgICAgICAgICAgICAgICAgICAgIHhtbG5zOmVmYWM9Imh0dHA6Ly9kYXRhLmV1cm9wYS5ldS9wMjcvZWZvcm1zLXVibC1leHRlbnNpb24tYWdncmVnYXRlLWNvbXBvbmVudHMvMSIKICAgICAgICAgICAgICAgICAgICAgeG1sbnM6ZWZiYz0iaHR0cDovL2RhdGEuZXVyb3BhLmV1L3AyNy9lZm9ybXMtdWJsLWV4dGVuc2lvbi1iYXNpYy1jb21wb25lbnRzLzEiCiAgICAgICAgICAgICAgICAgICAgIHhtbG5zOmVmZXh0PSJodHRwOi8vZGF0YS5ldXJvcGEuZXUvcDI3L2Vmb3Jtcy11YmwtZXh0ZW5zaW9ucy8xIgogICAgICAgICAgICAgICAgICAgICB4bWxuczpleHQ9InVybjpvYXNpczpuYW1lczpzcGVjaWZpY2F0aW9uOnVibDpzY2hlbWE6eHNkOkNvbW1vbkV4dGVuc2lvbkNvbXBvbmVudHMtMiIKICAgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+CiAgIDxleHQ6VUJMRXh0ZW5zaW9ucz4KICAgICAgPGV4dDpVQkxFeHRlbnNpb24+CiAgICAgICAgIDxleHQ6RXh0ZW5zaW9uQ29udGVudD4KICAgICAgICAgICAgPGVmZXh0OkVmb3Jtc0V4dGVuc2lvbj4KICAgICAgICAgICAgICAgPGVmYWM6Tm90aWNlUmVzdWx0PgogICAgICAgICAgICAgICAgICA8Y2JjOlRvdGFsQW1vdW50IGN1cnJlbmN5SUQ9IkVVUiI+MzUwMDAwPC9jYmM6VG90YWxBbW91bnQ+CiAgICAgICAgICAgICAgICAgIDxlZmFjOkxvdFJlc3VsdD4KICAgICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJyZXN1bHQiPlJFUy0wMDAxPC9jYmM6SUQ+CiAgICAgICAgICAgICAgICAgICAgIDxlZmFjOkxvdFRlbmRlcj4KICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJ0ZW5kZXIiPlRFTi0wMDAxPC9jYmM6SUQ+CiAgICAgICAgICAgICAgICAgICAgIDwvZWZhYzpMb3RUZW5kZXI+CiAgICAgICAgICAgICAgICAgICAgIDxlZmFjOlNldHRsZWRDb250cmFjdD4KICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJjb250cmFjdCI+Q09OLTAwMDE8L2NiYzpJRD4KICAgICAgICAgICAgICAgICAgICAgPC9lZmFjOlNldHRsZWRDb250cmFjdD4KICAgICAgICAgICAgICAgICAgICAgPGVmYWM6VGVuZGVyTG90PgogICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZU5hbWU9IkxvdCI+TE9ULTAwMDA8L2NiYzpJRD4KICAgICAgICAgICAgICAgICAgICAgPC9lZmFjOlRlbmRlckxvdD4KICAgICAgICAgICAgICAgICAgPC9lZmFjOkxvdFJlc3VsdD4KICAgICAgICAgICAgICAgICAgPGVmYWM6TG90VGVuZGVyPgogICAgICAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZU5hbWU9InRlbmRlciI+VEVOLTAwMDE8L2NiYzpJRD4KICAgICAgICAgICAgICAgICAgICAgPGVmYWM6U3ViY29udHJhY3RpbmdUZXJtPgogICAgICAgICAgICAgICAgICAgICAgICA8ZWZiYzpUZXJtQ29kZSBsaXN0TmFtZT0iYXBwbGljYWJpbGl0eSI+bm90LWtub3duPC9lZmJjOlRlcm1Db2RlPgogICAgICAgICAgICAgICAgICAgICA8L2VmYWM6U3ViY29udHJhY3RpbmdUZXJtPgogICAgICAgICAgICAgICAgICAgICA8ZWZhYzpUZW5kZXJpbmdQYXJ0eT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJ0ZW5kZXJpbmctcGFydHkiPlRQQS0wMDAxPC9jYmM6SUQ+CiAgICAgICAgICAgICAgICAgICAgIDwvZWZhYzpUZW5kZXJpbmdQYXJ0eT4KICAgICAgICAgICAgICAgICAgICAgPGVmYWM6VGVuZGVyTG90PgogICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZU5hbWU9IkxvdCI+TE9ULTAwMDA8L2NiYzpJRD4KICAgICAgICAgICAgICAgICAgICAgPC9lZmFjOlRlbmRlckxvdD4KICAgICAgICAgICAgICAgICAgICAgPGVmYWM6VGVuZGVyUmVmZXJlbmNlPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOklEPkZHSCBBQkMtMjAyMC0wMjwvY2JjOklEPgogICAgICAgICAgICAgICAgICAgICA8L2VmYWM6VGVuZGVyUmVmZXJlbmNlPgogICAgICAgICAgICAgICAgICA8L2VmYWM6TG90VGVuZGVyPgogICAgICAgICAgICAgICAgICA8ZWZhYzpTZXR0bGVkQ29udHJhY3Q+CiAgICAgICAgICAgICAgICAgICAgIDxjYmM6SUQgc2NoZW1lTmFtZT0iY29udHJhY3QiPkNPTi0wMDAxPC9jYmM6SUQ+CiAgICAgICAgICAgICAgICAgICAgIDxjYmM6QXdhcmREYXRlPjIwMjAtMDQtMTUrMDI6MDA8L2NiYzpBd2FyZERhdGU+CiAgICAgICAgICAgICAgICAgICAgIDxjYmM6VGl0bGUgbGFuZ3VhZ2VJRD0iRU5HIj5TdXBwbHkgb2YgUHJvZmlsaW5nIEJlZHMgd2l0aCBBY2Nlc3NvcmllcywgUHJlc3N1cmUgUmVsaWV2aW5nIE1hdHRyZXNzZXMgYW5kIEN1c2hpb25zPC9jYmM6VGl0bGU+CiAgICAgICAgICAgICAgICAgICAgIDxlZmFjOkNvbnRyYWN0UmVmZXJlbmNlPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOklEPlJOIEFBVC0zNDUvMDIvU0M8L2NiYzpJRD4KICAgICAgICAgICAgICAgICAgICAgPC9lZmFjOkNvbnRyYWN0UmVmZXJlbmNlPgogICAgICAgICAgICAgICAgICAgICA8ZWZhYzpMb3RUZW5kZXI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6SUQgc2NoZW1lTmFtZT0idGVuZGVyIj5URU4tMDAwMTwvY2JjOklEPgogICAgICAgICAgICAgICAgICAgICA8L2VmYWM6TG90VGVuZGVyPgogICAgICAgICAgICAgICAgICA8L2VmYWM6U2V0dGxlZENvbnRyYWN0PgogICAgICAgICAgICAgICAgICA8ZWZhYzpUZW5kZXJpbmdQYXJ0eT4KICAgICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJ0ZW5kZXJpbmctcGFydHkiPlRQQS0wMDAxPC9jYmM6SUQ+CiAgICAgICAgICAgICAgICAgICAgIDxlZmFjOlRlbmRlcmVyPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZU5hbWU9Im9yZ2FuaXphdGlvbiI+T1JHLTAwMDQ8L2NiYzpJRD4KICAgICAgICAgICAgICAgICAgICAgICAgPGVmYmM6R3JvdXBMZWFkSW5kaWNhdG9yPmZhbHNlPC9lZmJjOkdyb3VwTGVhZEluZGljYXRvcj4KICAgICAgICAgICAgICAgICAgICAgPC9lZmFjOlRlbmRlcmVyPgogICAgICAgICAgICAgICAgICAgICA8ZWZhYzpUZW5kZXJlcj4KICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJvcmdhbml6YXRpb24iPk9SRy0wMDA1PC9jYmM6SUQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxlZmJjOkdyb3VwTGVhZEluZGljYXRvcj5mYWxzZTwvZWZiYzpHcm91cExlYWRJbmRpY2F0b3I+CiAgICAgICAgICAgICAgICAgICAgIDwvZWZhYzpUZW5kZXJlcj4KICAgICAgICAgICAgICAgICAgICAgPGVmYWM6VGVuZGVyZXI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6SUQgc2NoZW1lTmFtZT0ib3JnYW5pemF0aW9uIj5PUkctMDAwNjwvY2JjOklEPgogICAgICAgICAgICAgICAgICAgICAgICA8ZWZiYzpHcm91cExlYWRJbmRpY2F0b3I+dHJ1ZTwvZWZiYzpHcm91cExlYWRJbmRpY2F0b3I+CiAgICAgICAgICAgICAgICAgICAgIDwvZWZhYzpUZW5kZXJlcj4KICAgICAgICAgICAgICAgICAgPC9lZmFjOlRlbmRlcmluZ1BhcnR5PgogICAgICAgICAgICAgICA8L2VmYWM6Tm90aWNlUmVzdWx0PgogICAgICAgICAgICAgICA8ZWZhYzpOb3RpY2VTdWJUeXBlPgogICAgICAgICAgICAgICAgICA8Y2JjOlN1YlR5cGVDb2RlIGxpc3ROYW1lPSJub3RpY2Utc3VidHlwZSI+MjU8L2NiYzpTdWJUeXBlQ29kZT4KICAgICAgICAgICAgICAgPC9lZmFjOk5vdGljZVN1YlR5cGU+CiAgICAgICAgICAgICAgIDxlZmFjOk9yZ2FuaXphdGlvbnM+CiAgICAgICAgICAgICAgICAgIDxlZmFjOk9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICAgPGVmYWM6Q29tcGFueT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpXZWJzaXRlVVJJPmh0dHBzOi8vd3d3Lm1pZGRsZXNicm91Z2guZ292LnVrPC9jYmM6V2Vic2l0ZVVSST4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZU5hbWU9Im9yZ2FuaXphdGlvbiI+T1JHLTAwMDE8L2NiYzpJRD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpQYXJ0eU5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6TmFtZSBsYW5ndWFnZUlEPSJFTkciPk1pZGRsZXNicm91Z2ggQ291bmNpbDwvY2JjOk5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOlBhcnR5TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpQb3N0YWxBZGRyZXNzPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOlN0cmVldE5hbWU+Q2l2aWMgQ2VudHJlPC9jYmM6U3RyZWV0TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpDaXR5TmFtZT5NaWRkbGVzYnJvdWdoPC9jYmM6Q2l0eU5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6UG9zdGFsWm9uZT5UUzEgOUZaPC9jYmM6UG9zdGFsWm9uZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpDb3VudHJ5U3ViZW50aXR5Q29kZSBsaXN0TmFtZT0ibnV0cyI+VUtDMTE8L2NiYzpDb3VudHJ5U3ViZW50aXR5Q29kZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOklkZW50aWZpY2F0aW9uQ29kZSBsaXN0TmFtZT0iY291bnRyeSI+R0JSPC9jYmM6SWRlbnRpZmljYXRpb25Db2RlPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpDb3VudHJ5PgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpQb3N0YWxBZGRyZXNzPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOlBhcnR5TGVnYWxFbnRpdHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6Q29tcGFueUlEPmJ1eWVyaWQwMTwvY2JjOkNvbXBhbnlJRD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6UGFydHlMZWdhbEVudGl0eT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpDb250YWN0PgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOk5hbWU+UHJvY3VyZW1lbnQgZGl2aXNpb248L2NiYzpOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOlRlbGVwaG9uZT4rNDQgMTY0MjcyOTE3NzwvY2JjOlRlbGVwaG9uZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpUZWxlZmF4Pis0NCAxNjQyNzI5MTc3OTwvY2JjOlRlbGVmYXg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6RWxlY3Ryb25pY01haWw+cHJvY3VyZW1lbnRAbWlkZGxlc2Jyb3VnaC5nb3YudWs8L2NiYzpFbGVjdHJvbmljTWFpbD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6Q29udGFjdD4KICAgICAgICAgICAgICAgICAgICAgPC9lZmFjOkNvbXBhbnk+CiAgICAgICAgICAgICAgICAgICAgIDxlZmFjOlRvdWNoUG9pbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6V2Vic2l0ZVVSST5odHRwczovL3d3dy5taWRkbGVzYnJvdWdoLmdvdi51azwvY2JjOldlYnNpdGVVUkk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJ0b3VjaHBvaW50Ij5UUE8tMDAwMTwvY2JjOklEPgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOlBhcnR5TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpOYW1lIGxhbmd1YWdlSUQ9IkVORyI+Q29udHJhY3QgYW5kIENvbW1pc3Npb25pbmcgVW5pdDwvY2JjOk5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOlBhcnR5TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpQb3N0YWxBZGRyZXNzPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOlN0cmVldE5hbWU+Q2l2aWMgQ2VudHJlPC9jYmM6U3RyZWV0TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpDaXR5TmFtZT5NaWRkbGVzYnJvdWdoPC9jYmM6Q2l0eU5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6UG9zdGFsWm9uZT5UUzEgOUZaPC9jYmM6UG9zdGFsWm9uZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpDb3VudHJ5U3ViZW50aXR5Q29kZSBsaXN0TmFtZT0ibnV0cyI+VUtDMTE8L2NiYzpDb3VudHJ5U3ViZW50aXR5Q29kZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOklkZW50aWZpY2F0aW9uQ29kZSBsaXN0TmFtZT0iY291bnRyeSI+R0JSPC9jYmM6SWRlbnRpZmljYXRpb25Db2RlPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpDb3VudHJ5PgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpQb3N0YWxBZGRyZXNzPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOkNvbnRhY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6VGVsZXBob25lPigrNDQpMzQ1Njc4OTA8L2NiYzpUZWxlcGhvbmU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6VGVsZWZheD4oKzQ0KTM0NTY3ODkwOTwvY2JjOlRlbGVmYXg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6RWxlY3Ryb25pY01haWw+Y29udHJhY3RhbmRjb21taXNzaW9uaW5ndW5pdEBtaWRkbGVzYnJvdWdoLmdvdi51azwvY2JjOkVsZWN0cm9uaWNNYWlsPgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpDb250YWN0PgogICAgICAgICAgICAgICAgICAgICA8L2VmYWM6VG91Y2hQb2ludD4KICAgICAgICAgICAgICAgICAgPC9lZmFjOk9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgPGVmYWM6T3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICAgICA8ZWZhYzpDb21wYW55PgogICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOldlYnNpdGVVUkk+aHR0cHM6Ly9leGFtcGxlLW1lZGlhdG9yLmV1PC9jYmM6V2Vic2l0ZVVSST4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZU5hbWU9Im9yZ2FuaXphdGlvbiI+T1JHLTAwMDI8L2NiYzpJRD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpQYXJ0eU5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6TmFtZSBsYW5ndWFnZUlEPSJFTkciPkV4YW1wbGUgTWVkaWF0b3I8L2NiYzpOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpQYXJ0eU5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpTdHJlZXROYW1lPlNvbWUgU3RyZWV0PC9jYmM6U3RyZWV0TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpDaXR5TmFtZT5FeGFtcGxlIENpdHk8L2NiYzpDaXR5TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpQb3N0YWxab25lPkFCQzEyMzwvY2JjOlBvc3RhbFpvbmU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6Q291bnRyeVN1YmVudGl0eUNvZGUgbGlzdE5hbWU9Im51dHMiPlVLQzExPC9jYmM6Q291bnRyeVN1YmVudGl0eUNvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6Q291bnRyeT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpJZGVudGlmaWNhdGlvbkNvZGUgbGlzdE5hbWU9ImNvdW50cnkiPkdCUjwvY2JjOklkZW50aWZpY2F0aW9uQ29kZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6Q291bnRyeT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpQYXJ0eUxlZ2FsRW50aXR5PgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOkNvbXBhbnlJRCBzY2hlbWVOYW1lPSJhYmMiPjExMSAxMTEgMTExPC9jYmM6Q29tcGFueUlEPgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpQYXJ0eUxlZ2FsRW50aXR5PgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOkNvbnRhY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6VGVsZXBob25lPisxMjMgNDU2IDc4OTwvY2JjOlRlbGVwaG9uZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpUZWxlZmF4PisxMjMgNDU2IDc4OTk8L2NiYzpUZWxlZmF4PgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOkVsZWN0cm9uaWNNYWlsPmNvbnRhY3RAZXhhbXBsZS1tZWRpYXRvci5jb208L2NiYzpFbGVjdHJvbmljTWFpbD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6Q29udGFjdD4KICAgICAgICAgICAgICAgICAgICAgPC9lZmFjOkNvbXBhbnk+CiAgICAgICAgICAgICAgICAgIDwvZWZhYzpPcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICAgIDxlZmFjOk9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICAgPGVmYWM6Q29tcGFueT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpXZWJzaXRlVVJJPmh0dHBzOi8vZXNlbmRlcmNvcnAuZXU8L2NiYzpXZWJzaXRlVVJJPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6SUQgc2NoZW1lTmFtZT0ib3JnYW5pemF0aW9uIj5PUkctMDAwMzwvY2JjOklEPgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOlBhcnR5TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpOYW1lIGxhbmd1YWdlSUQ9IkVORyI+ZVNlbmRDb3JwPC9jYmM6TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6UGFydHlOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOlBvc3RhbEFkZHJlc3M+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6Q2l0eU5hbWU+THV4ZW1ib3VyZzwvY2JjOkNpdHlOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOlBvc3RhbFpvbmU+Mjk4NTwvY2JjOlBvc3RhbFpvbmU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6Q291bnRyeVN1YmVudGl0eUNvZGUgbGlzdE5hbWU9Im51dHMiPkxVMDAwPC9jYmM6Q291bnRyeVN1YmVudGl0eUNvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6Q291bnRyeT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpJZGVudGlmaWNhdGlvbkNvZGUgbGlzdE5hbWU9ImNvdW50cnkiPkxVWDwvY2JjOklkZW50aWZpY2F0aW9uQ29kZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6Q291bnRyeT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpQYXJ0eUxlZ2FsRW50aXR5PgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOkNvbXBhbnlJRD4xMTEgMjIyIDMzMzwvY2JjOkNvbXBhbnlJRD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6UGFydHlMZWdhbEVudGl0eT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpDb250YWN0PgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOlRlbGVwaG9uZT4rMzUyIDEyMzQ1Njc4OTwvY2JjOlRlbGVwaG9uZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpUZWxlZmF4PiszNTIgMTIzNDU2Nzg5OTwvY2JjOlRlbGVmYXg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6RWxlY3Ryb25pY01haWw+ZXNlbmRlckBleGFtcGxlLmNvbTwvY2JjOkVsZWN0cm9uaWNNYWlsPgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpDb250YWN0PgogICAgICAgICAgICAgICAgICAgICA8L2VmYWM6Q29tcGFueT4KICAgICAgICAgICAgICAgICAgPC9lZmFjOk9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgPGVmYWM6T3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICAgICA8ZWZiYzpMaXN0ZWRPblJlZ3VsYXRlZE1hcmtldEluZGljYXRvcj5mYWxzZTwvZWZiYzpMaXN0ZWRPblJlZ3VsYXRlZE1hcmtldEluZGljYXRvcj4KICAgICAgICAgICAgICAgICAgICAgPGVmYWM6VWx0aW1hdGVCZW5lZmljaWFsT3duZXI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6SUQgc2NoZW1lTmFtZT0idWJvIj5VQk8tMDAwMTwvY2JjOklEPgogICAgICAgICAgICAgICAgICAgICA8L2VmYWM6VWx0aW1hdGVCZW5lZmljaWFsT3duZXI+CiAgICAgICAgICAgICAgICAgICAgIDxlZmFjOkNvbXBhbnk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6V2Vic2l0ZVVSST5odHRwczovL2V4YW1wbGUuY29tPC9jYmM6V2Vic2l0ZVVSST4KICAgICAgICAgICAgICAgICAgICAgICAgPGVmYmM6Q29tcGFueVNpemVDb2RlIGxpc3ROYW1lPSJlY29ub21pYy1vcGVyYXRvci1zaXplIj5zbWFsbDwvZWZiYzpDb21wYW55U2l6ZUNvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJvcmdhbml6YXRpb24iPk9SRy0wMDA0PC9jYmM6SUQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6UGFydHlOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOk5hbWUgbGFuZ3VhZ2VJRD0iRU5HIj5EaXJlY3QgSGVhbHRoY2FyZSBTZXJ2aWNlcyBMdGQ8L2NiYzpOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpQYXJ0eU5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6UG9zdGFsQWRkcmVzcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpDaXR5TmFtZT5DYWVycGhpbGx5PC9jYmM6Q2l0eU5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6UG9zdGFsWm9uZT5BQkMxMjM8L2NiYzpQb3N0YWxab25lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOkNvdW50cnlTdWJlbnRpdHlDb2RlIGxpc3ROYW1lPSJudXRzIj5VS0MxMTwvY2JjOkNvdW50cnlTdWJlbnRpdHlDb2RlPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOkNvdW50cnk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6SWRlbnRpZmljYXRpb25Db2RlIGxpc3ROYW1lPSJjb3VudHJ5Ij5HQlI8L2NiYzpJZGVudGlmaWNhdGlvbkNvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOkNvdW50cnk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOlBvc3RhbEFkZHJlc3M+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6Q29udGFjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpUZWxlcGhvbmU+KzQ0IDEyMTIxMjEyMTI8L2NiYzpUZWxlcGhvbmU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6VGVsZWZheD4rNDQgMTIxMjEyMTIxMjk8L2NiYzpUZWxlZmF4PgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOkVsZWN0cm9uaWNNYWlsPmNvbnRhY3RAZXhhbXBsZS5jb208L2NiYzpFbGVjdHJvbmljTWFpbD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6Q29udGFjdD4KICAgICAgICAgICAgICAgICAgICAgPC9lZmFjOkNvbXBhbnk+CiAgICAgICAgICAgICAgICAgIDwvZWZhYzpPcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICAgIDxlZmFjOk9yZ2FuaXphdGlvbj4KICAgICAgICAgICAgICAgICAgICAgPGVmYmM6TGlzdGVkT25SZWd1bGF0ZWRNYXJrZXRJbmRpY2F0b3I+ZmFsc2U8L2VmYmM6TGlzdGVkT25SZWd1bGF0ZWRNYXJrZXRJbmRpY2F0b3I+CiAgICAgICAgICAgICAgICAgICAgIDxlZmFjOlVsdGltYXRlQmVuZWZpY2lhbE93bmVyPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZU5hbWU9InVibyI+VUJPLTAwMDI8L2NiYzpJRD4KICAgICAgICAgICAgICAgICAgICAgPC9lZmFjOlVsdGltYXRlQmVuZWZpY2lhbE93bmVyPgogICAgICAgICAgICAgICAgICAgICA8ZWZhYzpDb21wYW55PgogICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOldlYnNpdGVVUkk+aHR0cHM6Ly9leGFtcGxlLmNvbTwvY2JjOldlYnNpdGVVUkk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxlZmJjOkNvbXBhbnlTaXplQ29kZSBsaXN0TmFtZT0iZWNvbm9taWMtb3BlcmF0b3Itc2l6ZSI+c21hbGw8L2VmYmM6Q29tcGFueVNpemVDb2RlPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6SUQgc2NoZW1lTmFtZT0ib3JnYW5pemF0aW9uIj5PUkctMDAwNTwvY2JjOklEPgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOlBhcnR5TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpOYW1lIGxhbmd1YWdlSUQ9IkVORyI+SGFydmVzdCBIZWFsdGhjYXJlIEx0ZDwvY2JjOk5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOlBhcnR5TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpQb3N0YWxBZGRyZXNzPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOkNpdHlOYW1lPlJvdGhlcmhhbTwvY2JjOkNpdHlOYW1lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOlBvc3RhbFpvbmU+QUJDMTIzPC9jYmM6UG9zdGFsWm9uZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpDb3VudHJ5U3ViZW50aXR5Q29kZSBsaXN0TmFtZT0ibnV0cyI+VUtDMTE8L2NiYzpDb3VudHJ5U3ViZW50aXR5Q29kZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpDb3VudHJ5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOklkZW50aWZpY2F0aW9uQ29kZSBsaXN0TmFtZT0iY291bnRyeSI+R0JSPC9jYmM6SWRlbnRpZmljYXRpb25Db2RlPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpDb3VudHJ5PgogICAgICAgICAgICAgICAgICAgICAgICA8L2NhYzpQb3N0YWxBZGRyZXNzPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOkNvbnRhY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6VGVsZXBob25lPis0NCAyMzIzMjMyMzIzPC9jYmM6VGVsZXBob25lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOlRlbGVmYXg+KzQ0IDIzMjMyMzIzMjM5PC9jYmM6VGVsZWZheD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpFbGVjdHJvbmljTWFpbD5jb250YWN0QGV4YW1wbGUuY29tPC9jYmM6RWxlY3Ryb25pY01haWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOkNvbnRhY3Q+CiAgICAgICAgICAgICAgICAgICAgIDwvZWZhYzpDb21wYW55PgogICAgICAgICAgICAgICAgICA8L2VmYWM6T3JnYW5pemF0aW9uPgogICAgICAgICAgICAgICAgICA8ZWZhYzpPcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICAgICAgIDxlZmJjOkxpc3RlZE9uUmVndWxhdGVkTWFya2V0SW5kaWNhdG9yPmZhbHNlPC9lZmJjOkxpc3RlZE9uUmVndWxhdGVkTWFya2V0SW5kaWNhdG9yPgogICAgICAgICAgICAgICAgICAgICA8ZWZhYzpVbHRpbWF0ZUJlbmVmaWNpYWxPd25lcj4KICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJ1Ym8iPlVCTy0wMDAzPC9jYmM6SUQ+CiAgICAgICAgICAgICAgICAgICAgIDwvZWZhYzpVbHRpbWF0ZUJlbmVmaWNpYWxPd25lcj4KICAgICAgICAgICAgICAgICAgICAgPGVmYWM6Q29tcGFueT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpXZWJzaXRlVVJJPmh0dHBzOi8vZXhhbXBsZS5jb208L2NiYzpXZWJzaXRlVVJJPgogICAgICAgICAgICAgICAgICAgICAgICA8ZWZiYzpDb21wYW55U2l6ZUNvZGUgbGlzdE5hbWU9ImVjb25vbWljLW9wZXJhdG9yLXNpemUiPmxhcmdlPC9lZmJjOkNvbXBhbnlTaXplQ29kZT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZU5hbWU9Im9yZ2FuaXphdGlvbiI+T1JHLTAwMDY8L2NiYzpJRD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpQYXJ0eU5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6TmFtZSBsYW5ndWFnZUlEPSJFTkciPkludmFjYXJlIEx0ZDwvY2JjOk5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOlBhcnR5TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNhYzpQb3N0YWxBZGRyZXNzPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOkNpdHlOYW1lPkJyaWRnZW5kPC9jYmM6Q2l0eU5hbWU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6UG9zdGFsWm9uZT5BQkMxMjM8L2NiYzpQb3N0YWxab25lPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOkNvdW50cnlTdWJlbnRpdHlDb2RlIGxpc3ROYW1lPSJudXRzIj5VS0MxMTwvY2JjOkNvdW50cnlTdWJlbnRpdHlDb2RlPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FjOkNvdW50cnk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6SWRlbnRpZmljYXRpb25Db2RlIGxpc3ROYW1lPSJjb3VudHJ5Ij5HQlI8L2NiYzpJZGVudGlmaWNhdGlvbkNvZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOkNvdW50cnk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FjOlBvc3RhbEFkZHJlc3M+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYWM6Q29udGFjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpUZWxlcGhvbmU+KzQ0IDQ1NDU0NTQ1NDU8L2NiYzpUZWxlcGhvbmU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6VGVsZWZheD4rNDQgNDU0NTQ1NDU0NTk8L2NiYzpUZWxlZmF4PgogICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOkVsZWN0cm9uaWNNYWlsPmNvbnRhY3RAZXhhbXBsZS5jb208L2NiYzpFbGVjdHJvbmljTWFpbD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jYWM6Q29udGFjdD4KICAgICAgICAgICAgICAgICAgICAgPC9lZmFjOkNvbXBhbnk+CiAgICAgICAgICAgICAgICAgIDwvZWZhYzpPcmdhbml6YXRpb24+CiAgICAgICAgICAgICAgICAgIDxlZmFjOlVsdGltYXRlQmVuZWZpY2lhbE93bmVyPgogICAgICAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZU5hbWU9InVibyI+VUJPLTAwMDE8L2NiYzpJRD4KICAgICAgICAgICAgICAgICAgICAgPGVmYWM6TmF0aW9uYWxpdHk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjYmM6TmF0aW9uYWxpdHlJRD5HQlI8L2NiYzpOYXRpb25hbGl0eUlEPgogICAgICAgICAgICAgICAgICAgICA8L2VmYWM6TmF0aW9uYWxpdHk+CiAgICAgICAgICAgICAgICAgIDwvZWZhYzpVbHRpbWF0ZUJlbmVmaWNpYWxPd25lcj4KICAgICAgICAgICAgICAgICAgPGVmYWM6VWx0aW1hdGVCZW5lZmljaWFsT3duZXI+CiAgICAgICAgICAgICAgICAgICAgIDxjYmM6SUQgc2NoZW1lTmFtZT0idWJvIj5VQk8tMDAwMjwvY2JjOklEPgogICAgICAgICAgICAgICAgICAgICA8ZWZhYzpOYXRpb25hbGl0eT4KICAgICAgICAgICAgICAgICAgICAgICAgPGNiYzpOYXRpb25hbGl0eUlEPkdCUjwvY2JjOk5hdGlvbmFsaXR5SUQ+CiAgICAgICAgICAgICAgICAgICAgIDwvZWZhYzpOYXRpb25hbGl0eT4KICAgICAgICAgICAgICAgICAgPC9lZmFjOlVsdGltYXRlQmVuZWZpY2lhbE93bmVyPgogICAgICAgICAgICAgICAgICA8ZWZhYzpVbHRpbWF0ZUJlbmVmaWNpYWxPd25lcj4KICAgICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJ1Ym8iPlVCTy0wMDAzPC9jYmM6SUQ+CiAgICAgICAgICAgICAgICAgICAgIDxlZmFjOk5hdGlvbmFsaXR5PgogICAgICAgICAgICAgICAgICAgICAgICA8Y2JjOk5hdGlvbmFsaXR5SUQ+R0JSPC9jYmM6TmF0aW9uYWxpdHlJRD4KICAgICAgICAgICAgICAgICAgICAgPC9lZmFjOk5hdGlvbmFsaXR5PgogICAgICAgICAgICAgICAgICA8L2VmYWM6VWx0aW1hdGVCZW5lZmljaWFsT3duZXI+CiAgICAgICAgICAgICAgIDwvZWZhYzpPcmdhbml6YXRpb25zPgogICAgICAgICAgICA8L2VmZXh0OkVmb3Jtc0V4dGVuc2lvbj4KICAgICAgICAgPC9leHQ6RXh0ZW5zaW9uQ29udGVudD4KICAgICAgPC9leHQ6VUJMRXh0ZW5zaW9uPgogICA8L2V4dDpVQkxFeHRlbnNpb25zPgogICA8Y2JjOlVCTFZlcnNpb25JRD4yLjM8L2NiYzpVQkxWZXJzaW9uSUQ+CiAgIDxjYmM6Q3VzdG9taXphdGlvbklEPmVmb3Jtcy1zZGstMS44PC9jYmM6Q3VzdG9taXphdGlvbklEPgogICA8Y2JjOklEIHNjaGVtZU5hbWU9Im5vdGljZS1pZCI+YWIzNWExM2EtNmZiNi00M2NjLWEyN2ItYWYzNDc4ZmRjMTc1PC9jYmM6SUQ+CiAgIDxjYmM6Q29udHJhY3RGb2xkZXJJRD5hYjM1YTEzYS02ZmI2LTQzY2MtYTI3Yi1hZjM0NzhmZGMxNzU8L2NiYzpDb250cmFjdEZvbGRlcklEPgogICA8Y2JjOklzc3VlRGF0ZT4yMDI0LTEyLTA0KzAxOjAwPC9jYmM6SXNzdWVEYXRlPgogICA8Y2JjOklzc3VlVGltZT4xMzowOTo1OCswMTowMDwvY2JjOklzc3VlVGltZT4KICAgPGNiYzpWZXJzaW9uSUQ+MDE8L2NiYzpWZXJzaW9uSUQ+CiAgIDxjYmM6UmVndWxhdG9yeURvbWFpbj4zMjAxNEwwMDI0PC9jYmM6UmVndWxhdG9yeURvbWFpbj4KICAgPGNiYzpOb3RpY2VUeXBlQ29kZSBsaXN0TmFtZT0iZGlyLWF3YS1wcmUiPnZlYXQ8L2NiYzpOb3RpY2VUeXBlQ29kZT4KICAgPGNiYzpOb3RpY2VMYW5ndWFnZUNvZGU+RU5HPC9jYmM6Tm90aWNlTGFuZ3VhZ2VDb2RlPgogICA8Y2FjOkNvbnRyYWN0aW5nUGFydHk+CiAgICAgIDxjYWM6Q29udHJhY3RpbmdQYXJ0eVR5cGU+CiAgICAgICAgIDxjYmM6UGFydHlUeXBlQ29kZSBsaXN0TmFtZT0iYnV5ZXItbGVnYWwtdHlwZSI+bGE8L2NiYzpQYXJ0eVR5cGVDb2RlPgogICAgICA8L2NhYzpDb250cmFjdGluZ1BhcnR5VHlwZT4KICAgICAgPGNhYzpDb250cmFjdGluZ0FjdGl2aXR5PgogICAgICAgICA8Y2JjOkFjdGl2aXR5VHlwZUNvZGUgbGlzdE5hbWU9ImF1dGhvcml0eS1hY3Rpdml0eSI+Z2VuLXB1YjwvY2JjOkFjdGl2aXR5VHlwZUNvZGU+CiAgICAgIDwvY2FjOkNvbnRyYWN0aW5nQWN0aXZpdHk+CiAgICAgIDxjYWM6UGFydHk+CiAgICAgICAgIDxjYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJvcmdhbml6YXRpb24iPk9SRy0wMDAxPC9jYmM6SUQ+CiAgICAgICAgIDwvY2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgIDxjYWM6U2VydmljZVByb3ZpZGVyUGFydHk+CiAgICAgICAgICAgIDxjYmM6U2VydmljZVR5cGVDb2RlIGxpc3ROYW1lPSJvcmdhbmlzYXRpb24tcm9sZSI+dGVkLWVzZW48L2NiYzpTZXJ2aWNlVHlwZUNvZGU+CiAgICAgICAgICAgIDxjYWM6UGFydHk+CiAgICAgICAgICAgICAgIDxjYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJvcmdhbml6YXRpb24iPk9SRy0wMDAzPC9jYmM6SUQ+CiAgICAgICAgICAgICAgIDwvY2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgIDwvY2FjOlBhcnR5PgogICAgICAgICA8L2NhYzpTZXJ2aWNlUHJvdmlkZXJQYXJ0eT4KICAgICAgPC9jYWM6UGFydHk+CiAgIDwvY2FjOkNvbnRyYWN0aW5nUGFydHk+CiAgIDxjYWM6VGVuZGVyaW5nUHJvY2Vzcz4KICAgICAgPGNiYzpQcm9jZWR1cmVDb2RlIGxpc3ROYW1lPSJwcm9jdXJlbWVudC1wcm9jZWR1cmUtdHlwZSI+bmVnLXdvLWNhbGw8L2NiYzpQcm9jZWR1cmVDb2RlPgogICAgICA8Y2FjOlByb2Nlc3NKdXN0aWZpY2F0aW9uPgogICAgICAgICA8Y2JjOlByb2Nlc3NSZWFzb25Db2RlIGxpc3ROYW1lPSJkaXJlY3QtYXdhcmQtanVzdGlmaWNhdGlvbiI+dXJnZW5jeTwvY2JjOlByb2Nlc3NSZWFzb25Db2RlPgogICAgICAgICA8Y2JjOlByb2Nlc3NSZWFzb24gbGFuZ3VhZ2VJRD0iRU5HIj5UaGUgcHJvY3VyZW1lbnQgZmFsbHMgd2l0aGluIHRoZSByZW1pdCBvZiByZWd1bGF0aW9uIDMyKDIpKGMpIG9mIHRoZSBQdWJsaWMgQ29udHJhY3QgUmVndWxhdGlvbnMgMjAxNSwgbmFtZWx5IGZvciByZWFzb25zIG9mIGV4dHJlbWUgdXJnZW5jeSBicm91Z2h0IGFib3V0IGJ5IGV2ZW50cyB1bmZvcmVzZWVhYmxlIGJ5IHRoZSBjb250cmFjdGluZyBhdXRob3JpdHkuCgkJCVRoZSBjdXJyZW50IGNvbnRyYWN0IGV4cGlyZXMgb24gMzAgU2VwdGVtYmVyIDIwMjAuCgkJCUR1ZSB0byB0aGUgQ292aWQtMTkgb3V0YnJlYWssIHRoZSBDb3VuY2lsIGlzIGhhdmluZyB0byBkZWxheSBzb21lIG9mIGl0cyBwcm9jdXJlbWVudCBhY3Rpdml0eSBpbiBvcmRlciB0byBmYWNpbGl0YXRlIGl0cyByb2xlIGluIGRlYWxpbmcgd2l0aCB0aGUgb3V0YnJlYWssIGludm9sdmluZyBzb21lIGVtZXJnZW5jeSBtZWFzdXJlcywgd2l0aCBzdGFmZiBvdGhlcndpc2UgZW5nYWdlZCBpbiBwcm9jdXJpbmcgbW9yZSB2aXRhbCBzZXJ2aWNlcyBpbiB0aGUgY3VycmVudCBjbGltYXRlLgoJCQlGb2xsb3dpbmcgdGhlIGd1aWRhbmNlIG9mIOKAmFByb2N1cmVtZW50IFBvbGljeSBOb3RlIOKAlCBSZXNwb25kaW5nIHRvIENvdmlkLTE5IChJbmZvcm1hdGlvbiBub3RlIFBQTiAwMS8yMDogTWFyY2ggMjAyMCnigJkKCQkJVGhlIENvdW5jaWwgY29uc2lkZXJzIHRoZSBhYm92ZSB0byBiZSBsZWdhbCBhbmQgYXBwcm9wcmlhdGUgdW5kZXIgdGhlIGN1cnJlbnQgY2lyY3Vtc3RhbmNlcyBhbmQganVzdGlmaWVkIHVuZGVyIFJlZ3VsYXRpb24gMzIgb2YgdGhlIFB1YmxpYyBDb250cmFjdCBSZWd1bGF0aW9ucyAyMDE1LCBpbiB0aGF0IGl0IGlzIGZvciByZWFzb25zIG9mIGV4dHJlbWUgdXJnZW5jeSBicm91Z2h0IGFib3V0IGJ5IGV2ZW50cyB1bmZvcmVzZWVhYmxlIHRvIHRoZSBDb3VuY2lsIGFuZCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzIGFzIHNldCBvdXQgdW5kZXIgUmVndWxhdGlvbiA3MigxKSBhbGxvd2luZyBmb3IgdGhlIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udHJhY3Qgd2l0aG91dCBhIG5ldyBwcm9jdXJlbWVudCBwcm9jZWR1cmUgaW4gdGhhdCB0aGUgZm9sbG93aW5nIGNyaXRlcmlhIGFyZSBhbGwgYmVpbmcgbWV0OgoJCQkoaSkgdGhlIG5lZWQgZm9yIG1vZGlmaWNhdGlvbiBoYXMgYmVlbiBicm91Z2h0IGFib3V0IGJ5IGNpcmN1bXN0YW5jZXMgd2hpY2ggYSBkaWxpZ2VudCBjb250cmFjdGluZyBhdXRob3JpdHkgY291bGQgbm90IGhhdmUgZm9yZXNlZW47CgkJCShpaSkgdGhlIG1vZGlmaWNhdGlvbiBkb2VzIG5vdCBhbHRlciB0aGUgb3ZlcmFsbCBuYXR1cmUgb2YgdGhlIGNvbnRyYWN0OwoJCQkoaWlpKSBhbnkgaW5jcmVhc2UgaW4gcHJpY2UgZG9lcyBub3QgZXhjZWVkIDUwICUgb2YgdGhlIHZhbHVlIG9mIHRoZSBvcmlnaW5hbCBjb250cmFjdCBvciBmcmFtZXdvcmsgYWdyZWVtZW50LgoJCQlUaGUgQ291bmNpbCBoYXMgcmVsaWVkIG9uIFJlZ3VsYXRpb24gNzIoMSkoYykgYW5kIGlzIGV4dGVuZGluZyB0aGUgY3VycmVudCBjb250cmFjdCBmb3IgYSBwZXJpb2Qgb2YgNiBtb250aHMgdW50aWwgMzEgTWFyY2ggMjAyMSBhbmQgYW50aWNpcGF0ZXMgcmUtcHJvY3VyaW5nIHRoZSBzZXJ2aWNlIGFuZCBhIG5ldyBjb250cmFjdCBiZWluZyBpbiBwbGFjZSBhcyBmcm9tIDEgQXByaWwgMjAyMS4KCQkJVGhlIGV4dGVuc2lvbiBvZiA2IG1vbnRocyBoYXMgYmVlbiBsaW1pdGVkIHRvIHdoYXQgaXMgYWJzb2x1dGVseSBuZWNlc3NhcnkgdG8gYWRkcmVzcyB0aGUgdW5mb3Jlc2VlYWJsZSBjaXJjdW1zdGFuY2UuPC9jYmM6UHJvY2Vzc1JlYXNvbj4KICAgICAgPC9jYWM6UHJvY2Vzc0p1c3RpZmljYXRpb24+CiAgIDwvY2FjOlRlbmRlcmluZ1Byb2Nlc3M+CiAgIDxjYWM6UHJvY3VyZW1lbnRQcm9qZWN0PgogICAgICA8Y2JjOklEPkROMTQwMDcwPC9jYmM6SUQ+CiAgICAgIDxjYmM6TmFtZSBsYW5ndWFnZUlEPSJFTkciPlN1cHBseSBvZiBQcm9maWxpbmcgQmVkcyB3aXRoIEFjY2Vzc29yaWVzLCBQcmVzc3VyZSBSZWxpZXZpbmcgTWF0dHJlc3NlcyBhbmQgQ3VzaGlvbnM8L2NiYzpOYW1lPgogICAgICA8Y2JjOkRlc2NyaXB0aW9uIGxhbmd1YWdlSUQ9IkVORyI+QmVkcyBhcmUgdG8gYmUgdXNlZCBpbiBhIGNvbW11bml0eSBzZXR0aW5nIGFuZCBtdXN0IGJlIGVsZWN0cmljYWxseSBwb3dlcmVkIHdpdGggYSByYW5nZSBvZiBiZWQgcmFpbHMsIGJlZCByYWlsIGJ1bXBlcnMgYW5kIGdyYWIgaGFuZGxlcy4gQmVkcyBzaXplIHRvIHJhbmdlIGZyb20gc2luZ2xlIHRvIGJhcmlhdHJpYyBtYXR0cmVzc2VzIG11c3QgYmUgc3VwcGxpZWQgaW4gYSByYW5nZSBvZiBzaXplcyB1cCB0byBhbmQgaW5jbHVkaW5nIGtpbmcgc2l6ZS4gTWF0dHJlc3NlcyBhcmUgdG8gYmUgc3VwcGxpZWQgaW4gdGhlIHJhbmdlIGxpc3RlZCBiZWxvdzoKCQlGb2FtIFZpc2NvL0dlbCBIeWJyaWQgKEZvYW0vQWlyKSBBbHRlcm5hdGluZyBBaXIuPC9jYmM6RGVzY3JpcHRpb24+CiAgICAgIDxjYmM6UHJvY3VyZW1lbnRUeXBlQ29kZSBsaXN0TmFtZT0iY29udHJhY3QtbmF0dXJlIj5zdXBwbGllczwvY2JjOlByb2N1cmVtZW50VHlwZUNvZGU+CiAgICAgIDxjYmM6Tm90ZSBsYW5ndWFnZUlEPSJFTkciPlRoZSBjdXJyZW50IGNvbnRyYWN0IGV4cGlyZXMgb24gMzAgU2VwdGVtYmVyIDIwMjAuCgkJRHVlIHRvIHRoZSBDb3ZpZC0xOSBvdXRicmVhaywgdGhlIENvdW5jaWwgaXMgaGF2aW5nIHRvIGRlbGF5IHNvbWUgb2YgaXRzIHByb2N1cmVtZW50IGFjdGl2aXR5IGluIG9yZGVyIHRvIGZhY2lsaXRhdGUgaXRzIHJvbGUgaW4gZGVhbGluZyB3aXRoIHRoZSBvdXRicmVhaywgaW52b2x2aW5nIHNvbWUgZW1lcmdlbmN5IG1lYXN1cmVzLCB3aXRoIHN0YWZmIG90aGVyd2lzZSBlbmdhZ2VkIGluIHByb2N1cmluZyBtb3JlIHZpdGFsIHNlcnZpY2VzIGluIHRoZSBjdXJyZW50IGNsaW1hdGUuCgkJRm9sbG93aW5nIHRoZSBndWlkYW5jZSBvZiDigJhQcm9jdXJlbWVudCBQb2xpY3kgTm90ZSDigJQgUmVzcG9uZGluZyB0byBDb3ZpZC0xOSAoSW5mb3JtYXRpb24gbm90ZSBQUE4gMDEvMjA6IE1hcmNoIDIwMjAp4oCZLgoJCVRoZSBDb3VuY2lsIGNvbnNpZGVycyB0aGUgYWJvdmUgdG8gYmUgbGVnYWwgYW5kIGFwcHJvcHJpYXRlIHVuZGVyIHRoZSBjdXJyZW50IGNpcmN1bXN0YW5jZXMgYW5kIGp1c3RpZmllZCB1bmRlciBSZWd1bGF0aW9uIDMyIG9mIHRoZSBQdWJsaWMgQ29udHJhY3QgUmVndWxhdGlvbnMgMjAxNSwgaW4gdGhhdCBpdCBpcyBmb3IgcmVhc29ucyBvZiBleHRyZW1lIHVyZ2VuY3kgYnJvdWdodCBhYm91dCBieSBldmVudHMgdW5mb3Jlc2VlYWJsZSB0byB0aGUgQ291bmNpbCBhbmQgbWVldHMgdGhlIHJlcXVpcmVtZW50cyBhcyBzZXQgb3V0IHVuZGVyIFJlZ3VsYXRpb24gNzIoMSkgYWxsb3dpbmcgZm9yIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRyYWN0IHdpdGhvdXQgYSBuZXcgcHJvY3VyZW1lbnQgcHJvY2VkdXJlIGluIHRoYXQgdGhlIGZvbGxvd2luZyBjcml0ZXJpYSBhcmUgYWxsIGJlaW5nIG1ldDoKCQkoaSkgdGhlIG5lZWQgZm9yIG1vZGlmaWNhdGlvbiBoYXMgYmVlbiBicm91Z2h0IGFib3V0IGJ5IGNpcmN1bXN0YW5jZXMgd2hpY2ggYSBkaWxpZ2VudCBjb250cmFjdGluZyBhdXRob3JpdHkgY291bGQgbm90IGhhdmUgZm9yZXNlZW47CgkJKGlpKSB0aGUgbW9kaWZpY2F0aW9uIGRvZXMgbm90IGFsdGVyIHRoZSBvdmVyYWxsIG5hdHVyZSBvZiB0aGUgY29udHJhY3Q7CgkJKGlpaSkgYW55IGluY3JlYXNlIGluIHByaWNlIGRvZXMgbm90IGV4Y2VlZCA1MCAlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgY29udHJhY3Qgb3IgZnJhbWV3b3JrIGFncmVlbWVudC4KCQlUaGUgQ291bmNpbCBoYXMgcmVsaWVkIG9uIFJlZ3VsYXRpb24gNzIoMSkoYykgYW5kIGlzIGV4dGVuZGluZyB0aGUgY3VycmVudCBjb250cmFjdCBmb3IgYSBwZXJpb2Qgb2YgNiBtb250aHMgdW50aWwgMzEgTWFyY2ggMjAyMSBhbmQgYW50aWNpcGF0ZXMgcmUtcHJvY3VyaW5nIHRoZSBzZXJ2aWNlIGFuZCBhIG5ldyBjb250cmFjdCBiZWluZyBpbiBwbGFjZSBhcyBmcm9tIDEgQXByaWwgMjAyMS4KCQlUaGUgZXh0ZW5zaW9uIG9mIDYgbW9udGhzIGhhcyBiZWVuIGxpbWl0ZWQgdG8gd2hhdCBpcyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSB0byBhZGRyZXNzIHRoZSB1bmZvcmVzZWVhYmxlIGNpcmN1bXN0YW5jZS48L2NiYzpOb3RlPgogICAgICA8Y2FjOk1haW5Db21tb2RpdHlDbGFzc2lmaWNhdGlvbj4KICAgICAgICAgPGNiYzpJdGVtQ2xhc3NpZmljYXRpb25Db2RlIGxpc3ROYW1lPSJjcHYiPjMzMDAwMDAwPC9jYmM6SXRlbUNsYXNzaWZpY2F0aW9uQ29kZT4KICAgICAgPC9jYWM6TWFpbkNvbW1vZGl0eUNsYXNzaWZpY2F0aW9uPgogICAgICA8Y2FjOlJlYWxpemVkTG9jYXRpb24+CiAgICAgICAgIDxjYmM6RGVzY3JpcHRpb24gbGFuZ3VhZ2VJRD0iRU5HIj5UZWVzIFZhbGxleTwvY2JjOkRlc2NyaXB0aW9uPgogICAgICAgICA8Y2FjOkFkZHJlc3M+CiAgICAgICAgICAgIDxjYmM6Q291bnRyeVN1YmVudGl0eUNvZGUgbGlzdE5hbWU9Im51dHMiPlVLQzExPC9jYmM6Q291bnRyeVN1YmVudGl0eUNvZGU+CiAgICAgICAgICAgIDxjYWM6Q291bnRyeT4KICAgICAgICAgICAgICAgPGNiYzpJZGVudGlmaWNhdGlvbkNvZGUgbGlzdE5hbWU9ImNvdW50cnkiPkdCUjwvY2JjOklkZW50aWZpY2F0aW9uQ29kZT4KICAgICAgICAgICAgPC9jYWM6Q291bnRyeT4KICAgICAgICAgPC9jYWM6QWRkcmVzcz4KICAgICAgPC9jYWM6UmVhbGl6ZWRMb2NhdGlvbj4KICAgPC9jYWM6UHJvY3VyZW1lbnRQcm9qZWN0PgogICA8Y2FjOlByb2N1cmVtZW50UHJvamVjdExvdD4KICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJMb3QiPkxPVC0wMDAwPC9jYmM6SUQ+CiAgICAgIDxjYWM6VGVuZGVyaW5nVGVybXM+CiAgICAgICAgIDxjYWM6QXBwZWFsVGVybXM+CiAgICAgICAgICAgIDxjYWM6QXBwZWFsSW5mb3JtYXRpb25QYXJ0eT4KICAgICAgICAgICAgICAgPGNhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZU5hbWU9InRvdWNocG9pbnQiPlRQTy0wMDAxPC9jYmM6SUQ+CiAgICAgICAgICAgICAgIDwvY2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgIDwvY2FjOkFwcGVhbEluZm9ybWF0aW9uUGFydHk+CiAgICAgICAgICAgIDxjYWM6QXBwZWFsUmVjZWl2ZXJQYXJ0eT4KICAgICAgICAgICAgICAgPGNhYzpQYXJ0eUlkZW50aWZpY2F0aW9uPgogICAgICAgICAgICAgICAgICA8Y2JjOklEIHNjaGVtZU5hbWU9InRvdWNocG9pbnQiPlRQTy0wMDAxPC9jYmM6SUQ+CiAgICAgICAgICAgICAgIDwvY2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgIDwvY2FjOkFwcGVhbFJlY2VpdmVyUGFydHk+CiAgICAgICAgICAgIDxjYWM6TWVkaWF0aW9uUGFydHk+CiAgICAgICAgICAgICAgIDxjYWM6UGFydHlJZGVudGlmaWNhdGlvbj4KICAgICAgICAgICAgICAgICAgPGNiYzpJRCBzY2hlbWVOYW1lPSJvcmdhbml6YXRpb24iPk9SRy0wMDAyPC9jYmM6SUQ+CiAgICAgICAgICAgICAgIDwvY2FjOlBhcnR5SWRlbnRpZmljYXRpb24+CiAgICAgICAgICAgIDwvY2FjOk1lZGlhdGlvblBhcnR5PgogICAgICAgICA8L2NhYzpBcHBlYWxUZXJtcz4KICAgICAgPC9jYWM6VGVuZGVyaW5nVGVybXM+CiAgICAgIDxjYWM6VGVuZGVyaW5nUHJvY2Vzcz4KICAgICAgICAgPGNiYzpHb3Zlcm5tZW50QWdyZWVtZW50Q29uc3RyYWludEluZGljYXRvcj5mYWxzZTwvY2JjOkdvdmVybm1lbnRBZ3JlZW1lbnRDb25zdHJhaW50SW5kaWNhdG9yPgogICAgICA8L2NhYzpUZW5kZXJpbmdQcm9jZXNzPgogICAgICA8Y2FjOlByb2N1cmVtZW50UHJvamVjdD4KICAgICAgICAgPGNiYzpJRD4xPC9jYmM6SUQ+CiAgICAgICAgIDxjYmM6TmFtZSBsYW5ndWFnZUlEPSJFTkciPkROMTQwMDcwPC9jYmM6TmFtZT4KICAgICAgICAgPGNiYzpEZXNjcmlwdGlvbiBsYW5ndWFnZUlEPSJFTkciPkJlZHMgYXJlIHRvIGJlIHVzZWQgaW4gYSBjb21tdW5pdHkgc2V0dGluZyBhbmQgbXVzdCBiZSBlbGVjdHJpY2FsbHkgcG93ZXJlZCB3aXRoIGEgcmFuZ2Ugb2YgYmVkIHJhaWxzLCBiZWQgcmFpbCBidW1wZXJzIGFuZCBncmFiIGhhbmRsZXMuIEJlZHMgc2l6ZSB0byByYW5nZSBmcm9tIHNpbmdsZSB0byBiYXJpYXRyaWMgbWF0dHJlc3NlcyBtdXN0IGJlIHN1cHBsaWVkIGluIGEgcmFuZ2Ugb2Ygc2l6ZXMgdXAgdG8gYW5kIGluY2x1ZGluZyBraW5nIHNpemUuIE1hdHRyZXNzZXMgYXJlIHRvIGJlIHN1cHBsaWVkIGluIHRoZSByYW5nZSBsaXN0ZWQgYmVsb3c6CgkJCUZvYW0gVmlzY28vR2VsIEh5YnJpZCAoRm9hbS9BaXIpIEFsdGVybmF0aW5nIEFpci48L2NiYzpEZXNjcmlwdGlvbj4KICAgICAgICAgPGNiYzpQcm9jdXJlbWVudFR5cGVDb2RlIGxpc3ROYW1lPSJjb250cmFjdC1uYXR1cmUiPnN1cHBsaWVzPC9jYmM6UHJvY3VyZW1lbnRUeXBlQ29kZT4KICAgICAgICAgPGNhYzpNYWluQ29tbW9kaXR5Q2xhc3NpZmljYXRpb24+CiAgICAgICAgICAgIDxjYmM6SXRlbUNsYXNzaWZpY2F0aW9uQ29kZSBsaXN0TmFtZT0iY3B2Ij4zMzAwMDAwMDwvY2JjOkl0ZW1DbGFzc2lmaWNhdGlvbkNvZGU+CiAgICAgICAgIDwvY2FjOk1haW5Db21tb2RpdHlDbGFzc2lmaWNhdGlvbj4KICAgICAgPC9jYWM6UHJvY3VyZW1lbnRQcm9qZWN0PgogICA8L2NhYzpQcm9jdXJlbWVudFByb2plY3RMb3Q+CiAgIDxjYWM6VGVuZGVyUmVzdWx0PgogICAgICA8Y2JjOkF3YXJkRGF0ZT4yMDAwLTAxLTAxWjwvY2JjOkF3YXJkRGF0ZT4KICAgPC9jYWM6VGVuZGVyUmVzdWx0Pgo8L0NvbnRyYWN0QXdhcmROb3RpY2U+Cg==";
private static final List<NoticeValidation> NOTICES = List.of(
new NoticeValidation(NOTICE_SDK1_8_SUBTYPE4, "4"),
new NoticeValidation(NOTICE_SDK1_8_SUBTYPE25, "25")
);
@Test
void test() {
NOTICES.forEach(notice -> {
try {
String response = getValidationResponse(new ValidationRequest(
notice.base64(),
"fr",
"dynamic"
));
var isValid = validateResponse(response, notice.subtype());
assertThat(isValid).as("Validation for subtype " + notice.subtype()).isTrue();
} catch (IOException e) {
fail("Error while validating notice with subtype " + notice.subtype() + ": " + e.getMessage());
}
});
}
@Test
void parallelTest() {
NOTICES.parallelStream().forEach(notice -> {
try {
String response = getValidationResponse(new ValidationRequest(
notice.base64(),
"fr",
"dynamic"
));
var isValid = validateResponse(response, notice.subtype());
assertThat(isValid).as("Validation for subtype " + notice.subtype()).isTrue();
} catch (IOException e) {
fail("Error while validating notice with subtype " + notice.subtype() + ": " + e.getMessage());
}
});
}
private String getValidationResponse(ValidationRequest validationRequest) throws IOException {
String jsonBody = new ObjectMapper().writeValueAsString(validationRequest);
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(jsonBody, mediaType);
Request request = new Request.Builder()
.url(API_URL)
.post(body)
.addHeader("X-API-Key", API_KEY)
.addHeader("Content-Type", "application/json")
.build();
try (var response = new OkHttpClient.Builder().build().newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("Error during request: " + response);
}
var responseBody = response.body();
if (responseBody != null) {
return responseBody.string();
}
throw new IOException("Empty response body");
}
}
private boolean validateResponse(String response, String expectedSubtype) {
String regex = "noticeSubType = '(\\d+)'";
Pattern pattern = Pattern.compile(regex);
var matcher = pattern.matcher(response);
while (matcher.find()) {
String subtype = matcher.group(1).trim();
if (!subtype.equals(expectedSubtype)) {
return false;
}
}
return true;
}
} maven dependencies : <dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.11.3</version>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.26.3</version>
</dependency>
</dependencies> Thank you for your attention. I am available to provide more information if needed. |
Beta Was this translation helpful? Give feedback.
Replies: 4 comments 2 replies
-
parallel.txt : Contains the SVRL results when validation requests are sent in parallel (subType 4 & 25) |
Beta Was this translation helpful? Give feedback.
-
Thanks for the detailled report ! This will be resolved in the next version. Please note that it only affects validations with SDK version 1.9 or below. In SDK 1.10 and later, the schematron rules have a different structure that does not trigger this bug. We had hoped this would not be noticeable, due to the lower usage in Preview. We will update the section at https://docs.ted.europa.eu/eforms-common/preview/index.html#_ted_central_validation_service to mention this issue. Sorry for the trouble ! (This is not an issue with the SDK itself, so I'll convert this to a discussion. It might be useful there, in case other people encounter this issue). |
Beta Was this translation helpful? Give feedback.
-
@bertrand-lorentz The release SDK1.13 production date is set to february 5th. Is there any risk that the concurrency bug aslo affect your production environnment after this date ? Do you have any release date set for the next Validation Service version ? Thanks |
Beta Was this translation helpful? Give feedback.
-
Hello, |
Beta Was this translation helpful? Give feedback.
Thanks for the detailled report !
This is indeed a problem with the version of the Validation Service currently in the Preview environment. The version in Production is not affected.
This will be resolved in the next version.
Please note that it only affects validations with SDK version 1.9 or below. In SDK 1.10 and later, the schematron rules have a different structure that does not trigger this bug.
We had hoped this would not be noticeable, due to the lower usage in Preview.
And we didn't want to rollback to the previous version in Preview, as this would have prevented the use of the newly released SDK 1.13.0.
We will update the section at https://docs.ted.europa.eu/eforms-common/previ…