WHO Immunization Implementation Guide
1.0.0 - release
WHO Immunization Implementation Guide, published by WHO. This guide is not an authorized publication; it is the continuous build for version 1.0.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/WorldHealthOrganization/smart-immunizations/tree/132/merge and changes regularly. See the Directory of published versions
| Draft as of 2026-03-31 |
{
"resourceType" : "Library",
"id" : "IMMZIndicatorElements",
"meta" : {
"profile" : [
🔗 "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"🔗 ,
"http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"🔗 ,
"http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"🔗 ,
"http://hl7.org/fhir/uv/cql/StructureDefinition/cql-module"
]
},
"text" : {
"status" : "extensions",
"div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n<div>\n <table class=\"grid dict\">\n \n \n <tr>\n <th scope=\"row\"><b>Title: </b></th>\n <td style=\"padding-left: 4px;\">IMMZIndicatorElements</td>\n </tr>\n \n\n \n \n <tr>\n <th scope=\"row\"><b>Id: </b></th>\n <td style=\"padding-left: 4px;\">IMMZIndicatorElements</td>\n </tr>\n \n\n \n \n <tr>\n <th scope=\"row\"><b>Version: </b></th>\n <td style=\"padding-left: 4px;\">1.0.0</td>\n </tr>\n \n\n \n <tr>\n <th scope=\"row\"><b>Url: </b></th>\n <td style=\"padding-left: 4px;\"><a href=\"Library-IMMZIndicatorElements.html\">IMMZIndicatorElements</a></td>\n </tr>\n \n\n \n\n \n\n \n <tr>\n <th scope=\"row\"><b>Status: </b></th>\n <td style=\"padding-left: 4px;\">draft</td>\n </tr>\n \n\n \n <tr>\n <th scope=\"row\"><b>Experimental: </b></th>\n <td style=\"padding-left: 4px;\">true</td>\n </tr>\n \n\n \n <tr>\n <th scope=\"row\"><b>Type: </b></th>\n <td style=\"padding-left: 4px;\">\n \n \n \n <p style=\"margin-bottom: 5px;\">\n <b>system: </b> <span><a href=\"http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html\">http://terminology.hl7.org/CodeSystem/library-type</a></span>\n </p>\n \n \n <p style=\"margin-bottom: 5px;\">\n <b>code: </b> <span>logic-library</span>\n </p>\n \n \n \n \n \n </td>\n </tr>\n \n\n \n\n \n <tr>\n <th scope=\"row\"><b>Date: </b></th>\n <td style=\"padding-left: 4px;\">2026-03-31 13:54:17+0000</td>\n </tr>\n \n\n \n <tr>\n <th scope=\"row\"><b>Publisher: </b></th>\n <td style=\"padding-left: 4px;\">WHO</td>\n </tr>\n \n\n \n <tr>\n <th scope=\"row\"><b>Description: </b></th>\n <td style=\"padding-left: 4px;\"><div><p>This library defines indicator-based elements and terminologies used throughout the Immunization CPG indicators</p>\n</div></td>\n </tr>\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n\n \n <tr>\n <th scope=\"row\"><b>Related Artifacts: </b></th>\n <td style=\"padding-left: 4px;\">\n \n \n \n <p><b>Dependencies</b></p>\n <ul>\n \n <li><a href=\"Library-WHOConcepts.html\">WHOConcepts</a></li>\n \n <li><a href=\"Library-WHOCommon.html\">WHOCommon</a></li>\n \n <li><a href=\"Library-IMMZConcepts.html\">IMMZConcepts</a></li>\n \n <li><a href=\"Library-IMMZAgeConcepts.html\">IMMZAgeConcepts</a></li>\n \n <li><a href=\"Library-IMMZCommon.html\">IMMZCommon</a></li>\n \n <li><a href=\"Library-IMMZElements.html\">IMMZElements</a></li>\n \n <li><a href=\"http://hl7.org/fhir/R4/codesystem-administrative-gender.html\">AdministrativeGender</a></li>\n \n </ul>\n \n \n \n \n \n </td>\n </tr>\n \n\n \n <tr>\n <th scope=\"row\"><b>Parameters: </b></th>\n <td style=\"padding-left: 4px;\">\n <table class=\"grid-dict\">\n <tr><th><b>Name</b></th><th><b>Type</b></th><th><b>Min</b></th><th><b>Max</b></th><th><b>In/Out</b></th></tr>\n \n <tr><th>Measurement Period</th><th>Period</th><th>0</th><th>1</th><th>In</th></tr>\n \n <tr><th>Patient</th><th>Patient</th><th>0</th><th>1</th><th>Out</th></tr>\n \n <tr><th>Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n \n <tr><th>Newborn By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n \n <tr><th>Infant By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n \n <tr><th>Toddler By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n \n <tr><th>Child By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n \n <tr><th>Adolescent By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n \n <tr><th>By Age Group Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n \n <tr><th>By Administrative Gender Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n \n <tr><th>By Geographic Region Stratifier</th><th>string</th><th>0</th><th>1</th><th>Out</th></tr>\n \n <tr><th>Patient Deceased During Measurement Period</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n \n <tr><th>Patient Born During Measurement Period</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n \n <tr><th>Patient Under 12 Months Old During Measurement Period</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n \n <tr><th>Patient Under 2 Years Old During Measurement Period</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n \n <tr><th>Doses Administered to Patient During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>\n \n <tr><th>Adverse Events During Measurement Period</th><th>AdverseEvent</th><th>0</th><th>*</th><th>Out</th></tr>\n \n <tr><th>Immunizations And Adverse Events During Measurement Period</th><th>Resource</th><th>0</th><th>*</th><th>Out</th></tr>\n \n <tr><th>Pentavalent Doses Administered to Patient</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>\n \n <tr><th>Pentavalent Doses Administered to Patient During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>\n \n <tr><th>Measles and Rubella Doses Administered to Patient</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>\n \n <tr><th>Measles and Rubella Doses Administered to Patient During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>\n \n <tr><th>COVID-19 Doses Administered to Patient During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>\n \n <tr><th>Adverse Events for Immunization</th><th>AdverseEvent</th><th>0</th><th>*</th><th>Out</th></tr>\n \n <tr><th>Immunizations with Adverse Events During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>\n \n <tr><th>Adverse Event Reactions During Measurement Period</th><th>AdverseEvent</th><th>0</th><th>*</th><th>Out</th></tr>\n \n </table>\n </td>\n </tr>\n \n\n \n <tr>\n <th scope=\"row\"><b>Data Requirements:</b></th>\n <td style=\"padding-left: 4px;\">\n <table class=\"grid-dict\">\n <tr><th><b>Type</b></th><th><b>Profile</b></th><th><b>MS</b></th><th><b>Code Filter</b></th></tr>\n \n <tr>\n <th>AdverseEvent</th>\n <th>http://hl7.org/fhir/StructureDefinition/AdverseEvent</th>\n <th/>\n <th>\n \n </th>\n </tr>\n \n <tr>\n <th>AdverseEvent</th>\n <th>http://hl7.org/fhir/StructureDefinition/AdverseEvent</th>\n <th/>\n <th>\n \n </th>\n </tr>\n \n <tr>\n <th>Location</th>\n <th>http://hl7.org/fhir/StructureDefinition/Location</th>\n <th/>\n <th>\n \n </th>\n </tr>\n \n <tr>\n <th>Location</th>\n <th>http://hl7.org/fhir/StructureDefinition/Location</th>\n <th/>\n <th>\n \n </th>\n </tr>\n \n </table>\n </td>\n </tr>\n \n\n \n \n <tr>\n <td colspan=\"2\">\n <table>\n <tr><th><a id=\"cql-content\"><b>Content: </b></a> text/cql</th></tr>\n <tr><td><pre><code class=\"language-cql\">/**\n * Immunization Indicator Elements by Patients as Context\n */\n\nlibrary IMMZIndicatorElements\n\nusing FHIR version '4.0.1'\n\ninclude FHIRHelpers version '4.0.1'\n\ninclude WHOConcepts\ninclude WHOCommon called WC\n\ninclude IMMZConcepts called Concepts\ninclude IMMZAgeConcepts called Age\ninclude IMMZCommon called Common\ninclude IMMZElements called Elements\n\n\n\ncodesystem "Administrative Gender Codes": 'http://hl7.org/fhir/administrative-gender'\ncode "Males" : 'male' from "Administrative Gender Codes" display 'Males'\ncode "Females" : 'female' from "Administrative Gender Codes" display 'Females'\ncode "Other" : 'other' from "Administrative Gender Codes" display 'Other/NA'\n\nparameter "Measurement Period" Interval<Date> default Interval[@2025-01-01, @2025-12-31]\n\ncontext Patient\n\n/*\n@stratifier: Age in Years\n*/\ndefine "Age Stratifier":\n case\n when AgeInYearsAt(end of "Measurement Period") < 1 then Age."P0Y--P1Y"\n when AgeInYearsAt(end of "Measurement Period") < 2 then Age."P1Y--P2Y"\n when AgeInYearsAt(end of "Measurement Period") < 3 then Age."P2Y--P3Y"\n when AgeInYearsAt(end of "Measurement Period") < 4 then Age."P3Y--P4Y"\n when AgeInYearsAt(end of "Measurement Period") < 5 then Age."P4Y--P5Y"\n when AgeInYearsAt(end of "Measurement Period") < 6 then Age."P5Y--P6Y"\n when AgeInYearsAt(end of "Measurement Period") < 7 then Age."P6Y--P7Y"\n when AgeInYearsAt(end of "Measurement Period") < 8 then Age."P7Y--P8Y"\n when AgeInYearsAt(end of "Measurement Period") < 9 then Age."P8Y--P9Y"\n when AgeInYearsAt(end of "Measurement Period") < 10 then Age."P9Y--P10Y"\n when AgeInYearsAt(end of "Measurement Period") < 11 then Age."P10Y--P11Y"\n when AgeInYearsAt(end of "Measurement Period") < 12 then Age."P11Y--P12Y"\n when AgeInYearsAt(end of "Measurement Period") < 13 then Age."P12Y--P13Y"\n when AgeInYearsAt(end of "Measurement Period") < 14 then Age."P13Y--P14Y"\n when AgeInYearsAt(end of "Measurement Period") < 15 then Age."P14Y--P15Y"\n when AgeInYearsAt(end of "Measurement Period") < 16 then Age."P15Y--P16Y"\n when AgeInYearsAt(end of "Measurement Period") < 17 then Age."P16Y--P17Y"\n when AgeInYearsAt(end of "Measurement Period") < 18 then Age."P17Y--P18Y"\n when AgeInYearsAt(end of "Measurement Period") < 19 then Age."P18Y--P19Y"\n when AgeInYearsAt(end of "Measurement Period") < 20 then Age."P19Y--P20Y"\n when AgeInYearsAt(end of "Measurement Period") < 21 then Age."P20Y--P21Y"\n when AgeInYearsAt(end of "Measurement Period") < 22 then Age."P21Y--P22Y"\n when AgeInYearsAt(end of "Measurement Period") < 23 then Age."P22Y--P23Y"\n when AgeInYearsAt(end of "Measurement Period") < 24 then Age."P23Y--P24Y"\n when AgeInYearsAt(end of "Measurement Period") < 25 then Age."P24Y--P25Y"\n when AgeInYearsAt(end of "Measurement Period") < 26 then Age."P25Y--P26Y"\n when AgeInYearsAt(end of "Measurement Period") < 27 then Age."P26Y--P27Y"\n when AgeInYearsAt(end of "Measurement Period") < 28 then Age."P27Y--P28Y"\n when AgeInYearsAt(end of "Measurement Period") < 29 then Age."P28Y--P29Y"\n when AgeInYearsAt(end of "Measurement Period") < 30 then Age."P29Y--P30Y"\n when AgeInYearsAt(end of "Measurement Period") < 31 then Age."P30Y--P31Y"\n when AgeInYearsAt(end of "Measurement Period") < 32 then Age."P31Y--P32Y"\n when AgeInYearsAt(end of "Measurement Period") < 33 then Age."P32Y--P33Y"\n when AgeInYearsAt(end of "Measurement Period") < 34 then Age."P33Y--P34Y"\n when AgeInYearsAt(end of "Measurement Period") < 35 then Age."P34Y--P35Y"\n when AgeInYearsAt(end of "Measurement Period") < 36 then Age."P35Y--P36Y"\n when AgeInYearsAt(end of "Measurement Period") < 37 then Age."P36Y--P37Y"\n when AgeInYearsAt(end of "Measurement Period") < 38 then Age."P37Y--P38Y"\n when AgeInYearsAt(end of "Measurement Period") < 39 then Age."P38Y--P39Y"\n when AgeInYearsAt(end of "Measurement Period") < 40 then Age."P39Y--P40Y"\n when AgeInYearsAt(end of "Measurement Period") < 41 then Age."P40Y--P41Y"\n when AgeInYearsAt(end of "Measurement Period") < 42 then Age."P41Y--P42Y"\n when AgeInYearsAt(end of "Measurement Period") < 43 then Age."P42Y--P43Y"\n when AgeInYearsAt(end of "Measurement Period") < 44 then Age."P43Y--P44Y"\n when AgeInYearsAt(end of "Measurement Period") < 45 then Age."P44Y--P45Y"\n when AgeInYearsAt(end of "Measurement Period") < 46 then Age."P45Y--P46Y"\n when AgeInYearsAt(end of "Measurement Period") < 47 then Age."P46Y--P47Y"\n when AgeInYearsAt(end of "Measurement Period") < 48 then Age."P47Y--P48Y"\n when AgeInYearsAt(end of "Measurement Period") < 49 then Age."P48Y--P49Y"\n when AgeInYearsAt(end of "Measurement Period") < 50 then Age."P49Y--P50Y"\n when AgeInYearsAt(end of "Measurement Period") < 51 then Age."P50Y--P51Y"\n when AgeInYearsAt(end of "Measurement Period") < 52 then Age."P51Y--P52Y"\n when AgeInYearsAt(end of "Measurement Period") < 53 then Age."P52Y--P53Y"\n when AgeInYearsAt(end of "Measurement Period") < 54 then Age."P53Y--P54Y"\n when AgeInYearsAt(end of "Measurement Period") < 55 then Age."P54Y--P55Y"\n when AgeInYearsAt(end of "Measurement Period") < 56 then Age."P55Y--P56Y"\n when AgeInYearsAt(end of "Measurement Period") < 57 then Age."P56Y--P57Y"\n when AgeInYearsAt(end of "Measurement Period") < 58 then Age."P57Y--P58Y"\n when AgeInYearsAt(end of "Measurement Period") < 59 then Age."P58Y--P59Y"\n when AgeInYearsAt(end of "Measurement Period") < 60 then Age."P59Y--P60Y"\n when AgeInYearsAt(end of "Measurement Period") < 61 then Age."P60Y--P61Y"\n when AgeInYearsAt(end of "Measurement Period") < 62 then Age."P61Y--P62Y"\n when AgeInYearsAt(end of "Measurement Period") < 63 then Age."P62Y--P63Y"\n when AgeInYearsAt(end of "Measurement Period") < 64 then Age."P63Y--P64Y"\n when AgeInYearsAt(end of "Measurement Period") < 65 then Age."P64Y--P65Y"\n when AgeInYearsAt(end of "Measurement Period") < 66 then Age."P65Y--P66Y"\n when AgeInYearsAt(end of "Measurement Period") < 67 then Age."P66Y--P67Y"\n when AgeInYearsAt(end of "Measurement Period") < 68 then Age."P67Y--P68Y"\n when AgeInYearsAt(end of "Measurement Period") < 69 then Age."P68Y--P69Y"\n when AgeInYearsAt(end of "Measurement Period") < 70 then Age."P69Y--P70Y"\n when AgeInYearsAt(end of "Measurement Period") < 71 then Age."P70Y--P71Y"\n when AgeInYearsAt(end of "Measurement Period") < 72 then Age."P71Y--P72Y"\n when AgeInYearsAt(end of "Measurement Period") < 73 then Age."P72Y--P73Y"\n when AgeInYearsAt(end of "Measurement Period") < 74 then Age."P73Y--P74Y"\n when AgeInYearsAt(end of "Measurement Period") < 75 then Age."P74Y--P75Y"\n when AgeInYearsAt(end of "Measurement Period") < 76 then Age."P75Y--P76Y"\n when AgeInYearsAt(end of "Measurement Period") < 77 then Age."P76Y--P77Y"\n when AgeInYearsAt(end of "Measurement Period") < 78 then Age."P77Y--P78Y"\n when AgeInYearsAt(end of "Measurement Period") < 79 then Age."P78Y--P79Y"\n when AgeInYearsAt(end of "Measurement Period") < 80 then Age."P79Y--P80Y"\n when AgeInYearsAt(end of "Measurement Period") < 81 then Age."P80Y--P81Y"\n when AgeInYearsAt(end of "Measurement Period") < 82 then Age."P81Y--P82Y"\n when AgeInYearsAt(end of "Measurement Period") < 83 then Age."P82Y--P83Y"\n when AgeInYearsAt(end of "Measurement Period") < 84 then Age."P83Y--P84Y"\n when AgeInYearsAt(end of "Measurement Period") < 85 then Age."P84Y--P85Y"\n when AgeInYearsAt(end of "Measurement Period") < 86 then Age."P85Y--P86Y"\n when AgeInYearsAt(end of "Measurement Period") < 87 then Age."P86Y--P87Y"\n when AgeInYearsAt(end of "Measurement Period") < 88 then Age."P87Y--P88Y"\n when AgeInYearsAt(end of "Measurement Period") < 89 then Age."P88Y--P89Y"\n when AgeInYearsAt(end of "Measurement Period") < 90 then Age."P89Y--P90Y"\n when AgeInYearsAt(end of "Measurement Period") < 91 then Age."P90Y--P91Y"\n when AgeInYearsAt(end of "Measurement Period") < 92 then Age."P91Y--P92Y"\n when AgeInYearsAt(end of "Measurement Period") < 93 then Age."P92Y--P93Y"\n when AgeInYearsAt(end of "Measurement Period") < 94 then Age."P93Y--P94Y"\n when AgeInYearsAt(end of "Measurement Period") < 95 then Age."P94Y--P95Y"\n when AgeInYearsAt(end of "Measurement Period") < 96 then Age."P95Y--P96Y"\n when AgeInYearsAt(end of "Measurement Period") < 97 then Age."P96Y--P97Y"\n when AgeInYearsAt(end of "Measurement Period") < 98 then Age."P97Y--P98Y"\n when AgeInYearsAt(end of "Measurement Period") < 99 then Age."P98Y--P99Y"\n when AgeInYearsAt(end of "Measurement Period") < 100 then Age."P99Y--P100Y"\n when AgeInYearsAt(end of "Measurement Period") >= 100 then Age."P100Y--P9999Y"\n else null\n end\n\n/* \n@stratifier: Infant disaggregations by age\n*/\ndefine "Newborn By Age Stratifier":\n case \n when AgeInHoursAt(end of "Measurement Period") <= 24 then Age."PT0H--PT24H"\n when AgeInWeeksAt(end of "Measurement Period") <= 2 then Age."PT24H--P2W"\n when AgeInWeeksAt(end of "Measurement Period") > 2 then Age."P2W--P9999Y"\n else null\n end\n\n/*\n@stratifier: Infant disaggregations by age\n*/\ndefine "Infant By Age Stratifier":\n case \n when AgeInYearsAt(end of "Measurement Period") < 1 then Age."P0Y--P1Y"\n when AgeInYearsAt(end of "Measurement Period") >= 1 then Age."P1Y--P9999Y"\n else null\n end\n\n/* \n@stratifier: Toddler By Age Stratifiers\n*/\ndefine "Toddler By Age Stratifier":\n case \n when AgeInYearsAt(end of "Measurement Period") < 1 then Age."P0Y--P1Y"\n when AgeInYearsAt(end of "Measurement Period") < 2 then Age."P1Y--P2Y"\n when AgeInYearsAt(end of "Measurement Period") >= 2 then Age."P2Y--P9999Y"\n else null\n end\n\n/* \n@stratifier: Child By Age Stratifiers\n*/\ndefine "Child By Age Stratifier":\n case \n when AgeInYearsAt(end of "Measurement Period") < 1 then Age."P0Y--P1Y"\n when AgeInYearsAt(end of "Measurement Period") < 3 then Age."P1Y--P3Y"\n when AgeInYearsAt(end of "Measurement Period") < 6 then Age."P3Y--P6Y"\n when AgeInYearsAt(end of "Measurement Period") < 13 then Age."P6Y--P13Y"\n when AgeInYearsAt(end of "Measurement Period") >= 13 then Age."P13Y--P9999Y"\n else null\n end\n\n/* \n@stratifier: Adolescent By Age Stratifiers\n*/\ndefine "Adolescent By Age Stratifier":\n case \n when AgeInYearsAt(end of "Measurement Period") < 9 then Age."P0Y--P9Y"\n when AgeInYearsAt(end of "Measurement Period") <= 14 then Age."P9Y--P15Y"\n when AgeInYearsAt(end of "Measurement Period") > 14 then Age."P15Y--P9999Y"\n else null\n end\n\n/*\n@stratifier: Age Group Stratifier\n*/\ndefine "By Age Group Stratifier":\n case \n when AgeInYearsAt(end of "Measurement Period") < 18 then Age."P0Y--P18Y"\n when AgeInYearsAt(end of "Measurement Period") < 30 then Age."P18Y--P30Y"\n when AgeInYearsAt(end of "Measurement Period") < 50 then Age."P30Y--P50Y"\n when AgeInYearsAt(end of "Measurement Period") < 70 then Age."P50Y--P70Y"\n when AgeInYearsAt(end of "Measurement Period") >= 70 then Age."P70Y--P9999Y"\n else null\n end\n\n/*\n@stratifier: By Administrative Gender of Patient Stratifier\n*/\ndefine "By Administrative Gender Stratifier":\n case \n when Patient.gender = 'male' then "Males"\n when Patient.gender = 'female' then "Females"\n else "Other"\n end\n\n/*\n@stratifier: By Geographic Region of Patient Stratifier\n*/\ndefine "By Geographic Region Stratifier":\n First(Patient.address A where A.use in { 'home' }).state\n\n/** \n * @dataElement Patient is deceased\n */\ndefine "Patient Deceased During Measurement Period":\n case \n when Patient.deceased is FHIR.boolean then Patient.deceased as FHIR.boolean\n when Patient.deceased is FHIR.dateTime then Patient.deceased as FHIR.dateTime before end of "Measurement Period"\n else false\n end\n\n/** \n * Patient was born during measurement period\n */\ndefine "Patient Born During Measurement Period":\n Patient.birthDate during "Measurement Period"\n\n/** \n * Patient is < 12 months old at the end of the measurement period\n */\ndefine "Patient Under 12 Months Old During Measurement Period":\n Patient.birthDate less than 12 months before end of "Measurement Period"\n\n/** \n * Patient is < 12 years old at the end of the measurement period\n */\ndefine "Patient Under 2 Years Old During Measurement Period":\n Patient.birthDate less than 2 years before end of "Measurement Period"\n\n/** \n * @define Doses which were administered during the measurement period\n */\ndefine "Doses Administered to Patient During Measurement Period":\n Elements."Doses Administered to Patient" I\n where I.occurrence.toInterval() starts during "Measurement Period"\n\ndefine "Adverse Events During Measurement Period":\n [AdverseEvent] AE\n where AE.date.toInterval() starts during "Measurement Period"\n/*\n [Observation: WHOConcepts."Adverse Events"] O\n where O.effective.toInterval() during "Measurement Period"\n*/\n\ndefine "Immunizations And Adverse Events During Measurement Period":\n from\n "Doses Administered to Patient During Measurement Period" I,\n "Adverse Events During Measurement Period" O\n where I.reaction.detail.references(O)\n return { immunization: I, adverseEvent: O }\n\ndefine "Pentavalent Doses Administered to Patient":\n Elements."Doses Administered to Patient" I \n where I.vaccineCode in Concepts."Pentavalent vaccines"\n\ndefine "Pentavalent Doses Administered to Patient During Measurement Period":\n "Pentavalent Doses Administered to Patient" I\n where I.occurrence.toInterval() starts during "Measurement Period"\n\ndefine "Measles and Rubella Doses Administered to Patient":\n Elements."Doses Administered to Patient" I \n where I.vaccineCode in Concepts."Measles and rubella-containing vaccines"\n\ndefine "Measles and Rubella Doses Administered to Patient During Measurement Period":\n "Measles and Rubella Doses Administered to Patient" I\n where I.occurrence.toInterval() starts during "Measurement Period"\n\ndefine "COVID-19 Doses Administered to Patient During Measurement Period":\n "Doses Administered to Patient During Measurement Period" I \n where I.vaccineCode in Concepts."COVID-19 vaccines"\n\ndefine "Adverse Events for Immunization":\n [AdverseEvent] AE\n where AE.actuality = 'actual'\n\n/** \n * @define Adverse events for immunizations which occurred during (or observed) during measurement period\n */\ndefine "Immunizations with Adverse Events During Measurement Period":\n "Immunizations And Adverse Events During Measurement Period" I\n return I.immunization\n\n/** \n * @define Adverse events for immunizations which occurred during (or observed) during measurement period\n */\ndefine "Adverse Event Reactions During Measurement Period":\n "Immunizations And Adverse Events During Measurement Period" I\n return I.adverseEvent\n\n/** \n * @function\n * @param immunization The immunization record for which the location should be retrieved\n * @return FHIR.address The location that the immunization event occurred\n */\ndefine function GetGeographicRegionForImmunization(immunization Immunization):\n (\n [Location] L\n where immunization.location.references(L)\n ).only().address.state\n\n/** \n * @function\n * @param immunization The immunization record for which the location should be retrieved\n * @return FHIR.name The name of the location that the immunization event occurred\n */\ndefine function GetLocationNameForImmunization(immunization Immunization):\n (\n [Location] L\n where immunization.location.references(L)\n ).only().name\n</code></pre></td></tr>\n </table>\n </td>\n </tr>\n \n \n \n </table>\n</div>\n</div>"
},
"extension" : [
{
"url" : "http://hl7.org/fhir/StructureDefinition/cqf-knowledgeCapability",
"valueCode" : "computable"
}
],
"url" : "http://smart.who.int/immunizations-measles/Library/IMMZIndicatorElements",
"version" : "1.0.0",
"name" : "IMMZIndicatorElements",
"title" : "IMMZIndicatorElements",
"status" : "draft",
"experimental" : true,
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/library-type",
"code" : "logic-library"
}
]
},
"date" : "2026-03-31T13:54:17+00:00",
"publisher" : "WHO",
"contact" : [
{
"name" : "WHO",
"telecom" : [
{
"system" : "url",
"value" : "http://who.int"
}
]
}
],
"description" : "This library defines indicator-based elements and terminologies used throughout the Immunization CPG indicators",
"relatedArtifact" : [
{
"type" : "depends-on",
"display" : "Library WHOConcepts",
"resource" : "http://smart.who.int/immunizations/Library/WHOConcepts"
},
{
"type" : "depends-on",
"display" : "Library WC",
"resource" : "http://smart.who.int/immunizations/Library/WHOCommon"
},
{
"type" : "depends-on",
"display" : "Library Concepts",
"resource" : "http://smart.who.int/immunizations/Library/IMMZConcepts"
},
{
"type" : "depends-on",
"display" : "Library Age",
"resource" : "http://smart.who.int/immunizations/Library/IMMZAgeConcepts"
},
{
"type" : "depends-on",
"display" : "Library Common",
"resource" : "http://smart.who.int/immunizations/Library/IMMZCommon"
},
{
"type" : "depends-on",
"display" : "Library Elements",
"resource" : "http://smart.who.int/immunizations/Library/IMMZElements"
},
{
"type" : "depends-on",
"display" : "Code System Administrative Gender Codes",
"resource" : "http://hl7.org/fhir/administrative-gender"
}
],
"parameter" : [
{
"name" : "Measurement Period",
"use" : "in",
"min" : 0,
"max" : "1",
"type" : "Period"
},
{
"name" : "Patient",
"use" : "out",
"min" : 0,
"max" : "1",
"type" : "Patient"
},
{
"name" : "Age Stratifier",
"use" : "out",
"min" : 0,
"max" : "1",
"type" : "Coding"
},
{
"name" : "Newborn By Age Stratifier",
"use" : "out",
"min" : 0,
"max" : "1",
"type" : "Coding"
},
{
"name" : "Infant By Age Stratifier",
"use" : "out",
"min" : 0,
"max" : "1",
"type" : "Coding"
},
{
"name" : "Toddler By Age Stratifier",
"use" : "out",
"min" : 0,
"max" : "1",
"type" : "Coding"
},
{
"name" : "Child By Age Stratifier",
"use" : "out",
"min" : 0,
"max" : "1",
"type" : "Coding"
},
{
"name" : "Adolescent By Age Stratifier",
"use" : "out",
"min" : 0,
"max" : "1",
"type" : "Coding"
},
{
"name" : "By Age Group Stratifier",
"use" : "out",
"min" : 0,
"max" : "1",
"type" : "Coding"
},
{
"name" : "By Administrative Gender Stratifier",
"use" : "out",
"min" : 0,
"max" : "1",
"type" : "Coding"
},
{
"name" : "By Geographic Region Stratifier",
"use" : "out",
"min" : 0,
"max" : "1",
"type" : "string"
},
{
"name" : "Patient Deceased During Measurement Period",
"use" : "out",
"min" : 0,
"max" : "1",
"type" : "boolean"
},
{
"name" : "Patient Born During Measurement Period",
"use" : "out",
"min" : 0,
"max" : "1",
"type" : "boolean"
},
{
"name" : "Patient Under 12 Months Old During Measurement Period",
"use" : "out",
"min" : 0,
"max" : "1",
"type" : "boolean"
},
{
"name" : "Patient Under 2 Years Old During Measurement Period",
"use" : "out",
"min" : 0,
"max" : "1",
"type" : "boolean"
},
{
"name" : "Doses Administered to Patient During Measurement Period",
"use" : "out",
"min" : 0,
"max" : "*",
"type" : "Immunization"
},
{
"name" : "Adverse Events During Measurement Period",
"use" : "out",
"min" : 0,
"max" : "*",
"type" : "AdverseEvent"
},
{
"name" : "Immunizations And Adverse Events During Measurement Period",
"use" : "out",
"min" : 0,
"max" : "*",
"type" : "Resource"
},
{
"name" : "Pentavalent Doses Administered to Patient",
"use" : "out",
"min" : 0,
"max" : "*",
"type" : "Immunization"
},
{
"name" : "Pentavalent Doses Administered to Patient During Measurement Period",
"use" : "out",
"min" : 0,
"max" : "*",
"type" : "Immunization"
},
{
"name" : "Measles and Rubella Doses Administered to Patient",
"use" : "out",
"min" : 0,
"max" : "*",
"type" : "Immunization"
},
{
"name" : "Measles and Rubella Doses Administered to Patient During Measurement Period",
"use" : "out",
"min" : 0,
"max" : "*",
"type" : "Immunization"
},
{
"name" : "COVID-19 Doses Administered to Patient During Measurement Period",
"use" : "out",
"min" : 0,
"max" : "*",
"type" : "Immunization"
},
{
"name" : "Adverse Events for Immunization",
"use" : "out",
"min" : 0,
"max" : "*",
"type" : "AdverseEvent"
},
{
"name" : "Immunizations with Adverse Events During Measurement Period",
"use" : "out",
"min" : 0,
"max" : "*",
"type" : "Immunization"
},
{
"name" : "Adverse Event Reactions During Measurement Period",
"use" : "out",
"min" : 0,
"max" : "*",
"type" : "AdverseEvent"
}
],
"dataRequirement" : [
{
"type" : "AdverseEvent",
"profile" : [
🔗 "http://hl7.org/fhir/StructureDefinition/AdverseEvent"
]
},
{
"type" : "AdverseEvent",
"profile" : [
🔗 "http://hl7.org/fhir/StructureDefinition/AdverseEvent"
]
},
{
"type" : "Location",
"profile" : [
🔗 "http://hl7.org/fhir/StructureDefinition/Location"
]
},
{
"type" : "Location",
"profile" : [
🔗 "http://hl7.org/fhir/StructureDefinition/Location"
]
}
],
"content" : [
{
"contentType" : "text/cql",
"data" : "LyoqCiAqIEltbXVuaXphdGlvbiBJbmRpY2F0b3IgRWxlbWVudHMgYnkgUGF0aWVudHMgYXMgQ29udGV4dAogKi8KCmxpYnJhcnkgSU1NWkluZGljYXRvckVsZW1lbnRzCgp1c2luZyBGSElSIHZlcnNpb24gJzQuMC4xJwoKaW5jbHVkZSBGSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMScKCmluY2x1ZGUgV0hPQ29uY2VwdHMKaW5jbHVkZSBXSE9Db21tb24gY2FsbGVkIFdDCgppbmNsdWRlIElNTVpDb25jZXB0cyBjYWxsZWQgQ29uY2VwdHMKaW5jbHVkZSBJTU1aQWdlQ29uY2VwdHMgY2FsbGVkIEFnZQppbmNsdWRlIElNTVpDb21tb24gY2FsbGVkIENvbW1vbgppbmNsdWRlIElNTVpFbGVtZW50cyBjYWxsZWQgRWxlbWVudHMKCgoKY29kZXN5c3RlbSAiQWRtaW5pc3RyYXRpdmUgR2VuZGVyIENvZGVzIjogJ2h0dHA6Ly9obDcub3JnL2ZoaXIvYWRtaW5pc3RyYXRpdmUtZ2VuZGVyJwpjb2RlICJNYWxlcyIgOiAnbWFsZScgZnJvbSAiQWRtaW5pc3RyYXRpdmUgR2VuZGVyIENvZGVzIiBkaXNwbGF5ICdNYWxlcycKY29kZSAiRmVtYWxlcyIgOiAnZmVtYWxlJyBmcm9tICJBZG1pbmlzdHJhdGl2ZSBHZW5kZXIgQ29kZXMiIGRpc3BsYXkgJ0ZlbWFsZXMnCmNvZGUgIk90aGVyIiA6ICdvdGhlcicgZnJvbSAiQWRtaW5pc3RyYXRpdmUgR2VuZGVyIENvZGVzIiBkaXNwbGF5ICdPdGhlci9OQScKCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlPiBkZWZhdWx0IEludGVydmFsW0AyMDI1LTAxLTAxLCBAMjAyNS0xMi0zMV0KCmNvbnRleHQgUGF0aWVudAoKLyoKQHN0cmF0aWZpZXI6IEFnZSBpbiBZZWFycwoqLwpkZWZpbmUgIkFnZSBTdHJhdGlmaWVyIjoKICBjYXNlCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMSB0aGVuIEFnZS4iUDBZLS1QMVkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMiB0aGVuIEFnZS4iUDFZLS1QMlkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMyB0aGVuIEFnZS4iUDJZLS1QM1kiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNCB0aGVuIEFnZS4iUDNZLS1QNFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNSB0aGVuIEFnZS4iUDRZLS1QNVkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNiB0aGVuIEFnZS4iUDVZLS1QNlkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNyB0aGVuIEFnZS4iUDZZLS1QN1kiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgOCB0aGVuIEFnZS4iUDdZLS1QOFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgOSB0aGVuIEFnZS4iUDhZLS1QOVkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMTAgdGhlbiBBZ2UuIlA5WS0tUDEwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxMSB0aGVuIEFnZS4iUDEwWS0tUDExWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxMiB0aGVuIEFnZS4iUDExWS0tUDEyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxMyB0aGVuIEFnZS4iUDEyWS0tUDEzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxNCB0aGVuIEFnZS4iUDEzWS0tUDE0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxNSB0aGVuIEFnZS4iUDE0WS0tUDE1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxNiB0aGVuIEFnZS4iUDE1WS0tUDE2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxNyB0aGVuIEFnZS4iUDE2WS0tUDE3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxOCB0aGVuIEFnZS4iUDE3WS0tUDE4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxOSB0aGVuIEFnZS4iUDE4WS0tUDE5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyMCB0aGVuIEFnZS4iUDE5WS0tUDIwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyMSB0aGVuIEFnZS4iUDIwWS0tUDIxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyMiB0aGVuIEFnZS4iUDIxWS0tUDIyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyMyB0aGVuIEFnZS4iUDIyWS0tUDIzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyNCB0aGVuIEFnZS4iUDIzWS0tUDI0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyNSB0aGVuIEFnZS4iUDI0WS0tUDI1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyNiB0aGVuIEFnZS4iUDI1WS0tUDI2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyNyB0aGVuIEFnZS4iUDI2WS0tUDI3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyOCB0aGVuIEFnZS4iUDI3WS0tUDI4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyOSB0aGVuIEFnZS4iUDI4WS0tUDI5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzMCB0aGVuIEFnZS4iUDI5WS0tUDMwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzMSB0aGVuIEFnZS4iUDMwWS0tUDMxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzMiB0aGVuIEFnZS4iUDMxWS0tUDMyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzMyB0aGVuIEFnZS4iUDMyWS0tUDMzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzNCB0aGVuIEFnZS4iUDMzWS0tUDM0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzNSB0aGVuIEFnZS4iUDM0WS0tUDM1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzNiB0aGVuIEFnZS4iUDM1WS0tUDM2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzNyB0aGVuIEFnZS4iUDM2WS0tUDM3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzOCB0aGVuIEFnZS4iUDM3WS0tUDM4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzOSB0aGVuIEFnZS4iUDM4WS0tUDM5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0MCB0aGVuIEFnZS4iUDM5WS0tUDQwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0MSB0aGVuIEFnZS4iUDQwWS0tUDQxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0MiB0aGVuIEFnZS4iUDQxWS0tUDQyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0MyB0aGVuIEFnZS4iUDQyWS0tUDQzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0NCB0aGVuIEFnZS4iUDQzWS0tUDQ0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0NSB0aGVuIEFnZS4iUDQ0WS0tUDQ1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0NiB0aGVuIEFnZS4iUDQ1WS0tUDQ2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0NyB0aGVuIEFnZS4iUDQ2WS0tUDQ3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0OCB0aGVuIEFnZS4iUDQ3WS0tUDQ4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0OSB0aGVuIEFnZS4iUDQ4WS0tUDQ5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1MCB0aGVuIEFnZS4iUDQ5WS0tUDUwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1MSB0aGVuIEFnZS4iUDUwWS0tUDUxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1MiB0aGVuIEFnZS4iUDUxWS0tUDUyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1MyB0aGVuIEFnZS4iUDUyWS0tUDUzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1NCB0aGVuIEFnZS4iUDUzWS0tUDU0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1NSB0aGVuIEFnZS4iUDU0WS0tUDU1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1NiB0aGVuIEFnZS4iUDU1WS0tUDU2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1NyB0aGVuIEFnZS4iUDU2WS0tUDU3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1OCB0aGVuIEFnZS4iUDU3WS0tUDU4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1OSB0aGVuIEFnZS4iUDU4WS0tUDU5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2MCB0aGVuIEFnZS4iUDU5WS0tUDYwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2MSB0aGVuIEFnZS4iUDYwWS0tUDYxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2MiB0aGVuIEFnZS4iUDYxWS0tUDYyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2MyB0aGVuIEFnZS4iUDYyWS0tUDYzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2NCB0aGVuIEFnZS4iUDYzWS0tUDY0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2NSB0aGVuIEFnZS4iUDY0WS0tUDY1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2NiB0aGVuIEFnZS4iUDY1WS0tUDY2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2NyB0aGVuIEFnZS4iUDY2WS0tUDY3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2OCB0aGVuIEFnZS4iUDY3WS0tUDY4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2OSB0aGVuIEFnZS4iUDY4WS0tUDY5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3MCB0aGVuIEFnZS4iUDY5WS0tUDcwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3MSB0aGVuIEFnZS4iUDcwWS0tUDcxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3MiB0aGVuIEFnZS4iUDcxWS0tUDcyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3MyB0aGVuIEFnZS4iUDcyWS0tUDczWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3NCB0aGVuIEFnZS4iUDczWS0tUDc0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3NSB0aGVuIEFnZS4iUDc0WS0tUDc1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3NiB0aGVuIEFnZS4iUDc1WS0tUDc2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3NyB0aGVuIEFnZS4iUDc2WS0tUDc3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3OCB0aGVuIEFnZS4iUDc3WS0tUDc4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3OSB0aGVuIEFnZS4iUDc4WS0tUDc5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4MCB0aGVuIEFnZS4iUDc5WS0tUDgwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4MSB0aGVuIEFnZS4iUDgwWS0tUDgxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4MiB0aGVuIEFnZS4iUDgxWS0tUDgyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4MyB0aGVuIEFnZS4iUDgyWS0tUDgzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4NCB0aGVuIEFnZS4iUDgzWS0tUDg0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4NSB0aGVuIEFnZS4iUDg0WS0tUDg1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4NiB0aGVuIEFnZS4iUDg1WS0tUDg2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4NyB0aGVuIEFnZS4iUDg2WS0tUDg3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4OCB0aGVuIEFnZS4iUDg3WS0tUDg4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4OSB0aGVuIEFnZS4iUDg4WS0tUDg5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5MCB0aGVuIEFnZS4iUDg5WS0tUDkwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5MSB0aGVuIEFnZS4iUDkwWS0tUDkxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5MiB0aGVuIEFnZS4iUDkxWS0tUDkyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5MyB0aGVuIEFnZS4iUDkyWS0tUDkzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5NCB0aGVuIEFnZS4iUDkzWS0tUDk0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5NSB0aGVuIEFnZS4iUDk0WS0tUDk1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5NiB0aGVuIEFnZS4iUDk1WS0tUDk2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5NyB0aGVuIEFnZS4iUDk2WS0tUDk3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5OCB0aGVuIEFnZS4iUDk3WS0tUDk4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5OSB0aGVuIEFnZS4iUDk4WS0tUDk5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxMDAgdGhlbiBBZ2UuIlA5OVktLVAxMDBZIgogICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA+PSAxMDAgdGhlbiBBZ2UuIlAxMDBZLS1QOTk5OVkiCiAgICBlbHNlIG51bGwKICBlbmQKCi8qIApAc3RyYXRpZmllcjogSW5mYW50IGRpc2FnZ3JlZ2F0aW9ucyBieSBhZ2UKKi8KZGVmaW5lICJOZXdib3JuIEJ5IEFnZSBTdHJhdGlmaWVyIjoKICAgIGNhc2UgCiAgICAgICAgd2hlbiBBZ2VJbkhvdXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8PSAyNCB0aGVuIEFnZS4iUFQwSC0tUFQyNEgiCiAgICAgICAgd2hlbiBBZ2VJbldlZWtzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8PSAyIHRoZW4gQWdlLiJQVDI0SC0tUDJXIgogICAgICAgIHdoZW4gQWdlSW5XZWVrc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPiAyIHRoZW4gQWdlLiJQMlctLVA5OTk5WSIKICAgICAgICBlbHNlIG51bGwKICAgIGVuZAoKLyoKQHN0cmF0aWZpZXI6IEluZmFudCBkaXNhZ2dyZWdhdGlvbnMgYnkgYWdlCiovCmRlZmluZSAiSW5mYW50IEJ5IEFnZSBTdHJhdGlmaWVyIjoKICAgIGNhc2UgCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDEgdGhlbiBBZ2UuIlAwWS0tUDFZIgogICAgICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPj0gMSB0aGVuIEFnZS4iUDFZLS1QOTk5OVkiCiAgICAgICAgZWxzZSBudWxsCiAgICBlbmQKCi8qIApAc3RyYXRpZmllcjogVG9kZGxlciBCeSBBZ2UgU3RyYXRpZmllcnMKKi8KZGVmaW5lICJUb2RkbGVyIEJ5IEFnZSBTdHJhdGlmaWVyIjoKICAgIGNhc2UgCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDEgdGhlbiBBZ2UuIlAwWS0tUDFZIgogICAgICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyIHRoZW4gQWdlLiJQMVktLVAyWSIKICAgICAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpID49IDIgdGhlbiBBZ2UuIlAyWS0tUDk5OTlZIgogICAgICAgIGVsc2UgbnVsbAogICAgZW5kCgovKiAKQHN0cmF0aWZpZXI6IENoaWxkIEJ5IEFnZSBTdHJhdGlmaWVycwoqLwpkZWZpbmUgIkNoaWxkIEJ5IEFnZSBTdHJhdGlmaWVyIjoKICAgIGNhc2UgCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDEgdGhlbiBBZ2UuIlAwWS0tUDFZIgogICAgICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzIHRoZW4gQWdlLiJQMVktLVAzWSIKICAgICAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNiB0aGVuIEFnZS4iUDNZLS1QNlkiCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDEzIHRoZW4gQWdlLiJQNlktLVAxM1kiCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA+PSAxMyB0aGVuIEFnZS4iUDEzWS0tUDk5OTlZIgogICAgICAgIGVsc2UgbnVsbAogICAgZW5kCgovKiAKQHN0cmF0aWZpZXI6IEFkb2xlc2NlbnQgQnkgQWdlIFN0cmF0aWZpZXJzCiovCmRlZmluZSAiQWRvbGVzY2VudCBCeSBBZ2UgU3RyYXRpZmllciI6CiAgICBjYXNlIAogICAgICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5IHRoZW4gQWdlLiJQMFktLVA5WSIKICAgICAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDw9IDE0IHRoZW4gQWdlLiJQOVktLVAxNVkiCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA+IDE0IHRoZW4gQWdlLiJQMTVZLS1QOTk5OVkiCiAgICAgICAgZWxzZSBudWxsCiAgICBlbmQKCi8qCkBzdHJhdGlmaWVyOiBBZ2UgR3JvdXAgU3RyYXRpZmllcgoqLwpkZWZpbmUgIkJ5IEFnZSBHcm91cCBTdHJhdGlmaWVyIjoKICBjYXNlIAogICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDE4IHRoZW4gQWdlLiJQMFktLVAxOFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMzAgdGhlbiBBZ2UuIlAxOFktLVAzMFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNTAgdGhlbiBBZ2UuIlAzMFktLVA1MFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNzAgdGhlbiBBZ2UuIlA1MFktLVA3MFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpID49IDcwIHRoZW4gQWdlLiJQNzBZLS1QOTk5OVkiCiAgICBlbHNlIG51bGwKICBlbmQKCi8qCkBzdHJhdGlmaWVyOiBCeSBBZG1pbmlzdHJhdGl2ZSBHZW5kZXIgb2YgUGF0aWVudCBTdHJhdGlmaWVyCiovCmRlZmluZSAiQnkgQWRtaW5pc3RyYXRpdmUgR2VuZGVyIFN0cmF0aWZpZXIiOgogICAgY2FzZSAKICAgICAgICB3aGVuIFBhdGllbnQuZ2VuZGVyID0gJ21hbGUnIHRoZW4gIk1hbGVzIgogICAgICAgIHdoZW4gUGF0aWVudC5nZW5kZXIgPSAnZmVtYWxlJyB0aGVuICJGZW1hbGVzIgogICAgICAgIGVsc2UgIk90aGVyIgogICAgZW5kCgovKgpAc3RyYXRpZmllcjogQnkgR2VvZ3JhcGhpYyBSZWdpb24gb2YgUGF0aWVudCBTdHJhdGlmaWVyCiovCmRlZmluZSAiQnkgR2VvZ3JhcGhpYyBSZWdpb24gU3RyYXRpZmllciI6CiAgICBGaXJzdChQYXRpZW50LmFkZHJlc3MgQSB3aGVyZSBBLnVzZSBpbiB7ICdob21lJyB9KS5zdGF0ZQoKLyoqIAogKiBAZGF0YUVsZW1lbnQgUGF0aWVudCBpcyBkZWNlYXNlZAogKi8KZGVmaW5lICJQYXRpZW50IERlY2Vhc2VkIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogIGNhc2UgCiAgICB3aGVuIFBhdGllbnQuZGVjZWFzZWQgaXMgRkhJUi5ib29sZWFuIHRoZW4gUGF0aWVudC5kZWNlYXNlZCBhcyBGSElSLmJvb2xlYW4KICAgIHdoZW4gUGF0aWVudC5kZWNlYXNlZCBpcyBGSElSLmRhdGVUaW1lIHRoZW4gUGF0aWVudC5kZWNlYXNlZCBhcyBGSElSLmRhdGVUaW1lIGJlZm9yZSBlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIKICAgIGVsc2UgZmFsc2UKICBlbmQKCi8qKiAKICogUGF0aWVudCB3YXMgYm9ybiBkdXJpbmcgbWVhc3VyZW1lbnQgcGVyaW9kCiAqLwpkZWZpbmUgIlBhdGllbnQgQm9ybiBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIjoKICAgIFBhdGllbnQuYmlydGhEYXRlIGR1cmluZyAiTWVhc3VyZW1lbnQgUGVyaW9kIgoKLyoqIAogKiBQYXRpZW50IGlzIDwgMTIgbW9udGhzIG9sZCBhdCB0aGUgZW5kIG9mIHRoZSBtZWFzdXJlbWVudCBwZXJpb2QKICovCmRlZmluZSAiUGF0aWVudCBVbmRlciAxMiBNb250aHMgT2xkIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICAgUGF0aWVudC5iaXJ0aERhdGUgbGVzcyB0aGFuIDEyIG1vbnRocyBiZWZvcmUgZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCgovKiogCiAqIFBhdGllbnQgaXMgPCAxMiB5ZWFycyBvbGQgYXQgdGhlIGVuZCBvZiB0aGUgbWVhc3VyZW1lbnQgcGVyaW9kCiAqLwpkZWZpbmUgIlBhdGllbnQgVW5kZXIgMiBZZWFycyBPbGQgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgICBQYXRpZW50LmJpcnRoRGF0ZSBsZXNzIHRoYW4gMiB5ZWFycyBiZWZvcmUgZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCgovKiogCiAqIEBkZWZpbmUgRG9zZXMgd2hpY2ggd2VyZSBhZG1pbmlzdGVyZWQgZHVyaW5nIHRoZSBtZWFzdXJlbWVudCBwZXJpb2QKICovCmRlZmluZSAiRG9zZXMgQWRtaW5pc3RlcmVkIHRvIFBhdGllbnQgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgRWxlbWVudHMuIkRvc2VzIEFkbWluaXN0ZXJlZCB0byBQYXRpZW50IiAgSQogICAgd2hlcmUgSS5vY2N1cnJlbmNlLnRvSW50ZXJ2YWwoKSBzdGFydHMgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCgpkZWZpbmUgIkFkdmVyc2UgRXZlbnRzIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogIFtBZHZlcnNlRXZlbnRdIEFFCiAgICB3aGVyZSBBRS5kYXRlLnRvSW50ZXJ2YWwoKSBzdGFydHMgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCi8qCiAgW09ic2VydmF0aW9uOiBXSE9Db25jZXB0cy4iQWR2ZXJzZSBFdmVudHMiXSBPCiAgICB3aGVyZSBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCiovCgpkZWZpbmUgIkltbXVuaXphdGlvbnMgQW5kIEFkdmVyc2UgRXZlbnRzIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogIGZyb20KICAgICJEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBJLAogICAgIkFkdmVyc2UgRXZlbnRzIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIE8KICB3aGVyZSBJLnJlYWN0aW9uLmRldGFpbC5yZWZlcmVuY2VzKE8pCiAgcmV0dXJuIHsgaW1tdW5pemF0aW9uOiBJLCBhZHZlcnNlRXZlbnQ6IE8gfQoKZGVmaW5lICJQZW50YXZhbGVudCBEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCI6CiAgRWxlbWVudHMuIkRvc2VzIEFkbWluaXN0ZXJlZCB0byBQYXRpZW50IiBJIAogICAgd2hlcmUgSS52YWNjaW5lQ29kZSBpbiBDb25jZXB0cy4iUGVudGF2YWxlbnQgdmFjY2luZXMiCgpkZWZpbmUgIlBlbnRhdmFsZW50IERvc2VzIEFkbWluaXN0ZXJlZCB0byBQYXRpZW50IER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICJQZW50YXZhbGVudCBEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCIgSQogICAgd2hlcmUgSS5vY2N1cnJlbmNlLnRvSW50ZXJ2YWwoKSBzdGFydHMgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCgpkZWZpbmUgIk1lYXNsZXMgYW5kIFJ1YmVsbGEgRG9zZXMgQWRtaW5pc3RlcmVkIHRvIFBhdGllbnQiOgogIEVsZW1lbnRzLiJEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCIgSSAKICAgIHdoZXJlIEkudmFjY2luZUNvZGUgaW4gQ29uY2VwdHMuIk1lYXNsZXMgYW5kIHJ1YmVsbGEtY29udGFpbmluZyB2YWNjaW5lcyIKCmRlZmluZSAiTWVhc2xlcyBhbmQgUnViZWxsYSBEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIjoKICAiTWVhc2xlcyBhbmQgUnViZWxsYSBEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCIgSQogICAgd2hlcmUgSS5vY2N1cnJlbmNlLnRvSW50ZXJ2YWwoKSBzdGFydHMgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCgpkZWZpbmUgIkNPVklELTE5IERvc2VzIEFkbWluaXN0ZXJlZCB0byBQYXRpZW50IER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICJEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBJIAogICAgd2hlcmUgSS52YWNjaW5lQ29kZSBpbiBDb25jZXB0cy4iQ09WSUQtMTkgdmFjY2luZXMiCgpkZWZpbmUgIkFkdmVyc2UgRXZlbnRzIGZvciBJbW11bml6YXRpb24iOgogIFtBZHZlcnNlRXZlbnRdIEFFCiAgICB3aGVyZSBBRS5hY3R1YWxpdHkgPSAnYWN0dWFsJwoKLyoqIAogKiBAZGVmaW5lIEFkdmVyc2UgZXZlbnRzIGZvciBpbW11bml6YXRpb25zIHdoaWNoIG9jY3VycmVkIGR1cmluZyAob3Igb2JzZXJ2ZWQpIGR1cmluZyBtZWFzdXJlbWVudCBwZXJpb2QKICovCmRlZmluZSAiSW1tdW5pemF0aW9ucyB3aXRoIEFkdmVyc2UgRXZlbnRzIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICJJbW11bml6YXRpb25zIEFuZCBBZHZlcnNlIEV2ZW50cyBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBJCiAgICByZXR1cm4gSS5pbW11bml6YXRpb24KCi8qKiAKICogQGRlZmluZSBBZHZlcnNlIGV2ZW50cyBmb3IgaW1tdW5pemF0aW9ucyB3aGljaCBvY2N1cnJlZCBkdXJpbmcgKG9yIG9ic2VydmVkKSBkdXJpbmcgbWVhc3VyZW1lbnQgcGVyaW9kCiAqLwpkZWZpbmUgIkFkdmVyc2UgRXZlbnQgUmVhY3Rpb25zIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICJJbW11bml6YXRpb25zIEFuZCBBZHZlcnNlIEV2ZW50cyBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBJCiAgICByZXR1cm4gSS5hZHZlcnNlRXZlbnQKCi8qKiAKICogQGZ1bmN0aW9uCiAqIEBwYXJhbSBpbW11bml6YXRpb24gVGhlIGltbXVuaXphdGlvbiByZWNvcmQgZm9yIHdoaWNoIHRoZSBsb2NhdGlvbiBzaG91bGQgYmUgcmV0cmlldmVkCiAqIEByZXR1cm4gRkhJUi5hZGRyZXNzIFRoZSBsb2NhdGlvbiB0aGF0IHRoZSBpbW11bml6YXRpb24gZXZlbnQgb2NjdXJyZWQKICovCmRlZmluZSBmdW5jdGlvbiBHZXRHZW9ncmFwaGljUmVnaW9uRm9ySW1tdW5pemF0aW9uKGltbXVuaXphdGlvbiBJbW11bml6YXRpb24pOgogICgKICAgIFtMb2NhdGlvbl0gTAogICAgICAgIHdoZXJlIGltbXVuaXphdGlvbi5sb2NhdGlvbi5yZWZlcmVuY2VzKEwpCiAgKS5vbmx5KCkuYWRkcmVzcy5zdGF0ZQoKLyoqIAogKiBAZnVuY3Rpb24KICogQHBhcmFtIGltbXVuaXphdGlvbiBUaGUgaW1tdW5pemF0aW9uIHJlY29yZCBmb3Igd2hpY2ggdGhlIGxvY2F0aW9uIHNob3VsZCBiZSByZXRyaWV2ZWQKICogQHJldHVybiBGSElSLm5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2F0aW9uIHRoYXQgdGhlIGltbXVuaXphdGlvbiBldmVudCBvY2N1cnJlZAogKi8KZGVmaW5lIGZ1bmN0aW9uIEdldExvY2F0aW9uTmFtZUZvckltbXVuaXphdGlvbihpbW11bml6YXRpb24gSW1tdW5pemF0aW9uKToKICAoCiAgICBbTG9jYXRpb25dIEwKICAgICAgICB3aGVyZSBpbW11bml6YXRpb24ubG9jYXRpb24ucmVmZXJlbmNlcyhMKQogICkub25seSgpLm5hbWUK"
}
]
}