eCQM QICore Content Implementation Guide
2025.0.0 - CI Build
eCQM QICore Content Implementation Guide, published by cqframework. This guide is not an authorized publication; it is the continuous build for version 2025.0.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/cqframework/ecqm-content-qicore-2025/ and changes regularly. See the Directory of published versions
Active as of 2025-05-23 |
<Library xmlns="http://hl7.org/fhir">
<id value="CMS871HHHyperFHIR"/>
<meta>
<profile
value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"/>
<profile
value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-computablelibrary"/>
<profile
value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"/>
<profile
value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-executablelibrary"/>
<profile
value="http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"/>
<profile
value="http://hl7.org/fhir/uv/cql/StructureDefinition/elm-json-library"/>
<profile
value="http://hl7.org/fhir/uv/cql/StructureDefinition/elm-xml-library"/>
</meta>
<language value="en"/>
<text>
<status value="extensions"/>
<div xmlns="http://www.w3.org/1999/xhtml">
<table class="grid dict">
<tr>
<th scope="row">
<b>Title: </b>
</th>
<td style="padding-left: 4px;">CMS871HHHyperFHIR</td>
</tr>
<tr>
<th scope="row">
<b>Id: </b>
</th>
<td style="padding-left: 4px;">CMS871HHHyperFHIR</td>
</tr>
<tr>
<th scope="row">
<b>Version: </b>
</th>
<td style="padding-left: 4px;">0.3.000</td>
</tr>
<tr>
<th scope="row">
<b>Url: </b>
</th>
<td style="padding-left: 4px;">https://madie.cms.gov/Library/CMS871HHHyperFHIR</td>
</tr>
<tr>
<th scope="row">
<b> official </b>
</th>
<td style="padding-left: 4px;">
<p style="margin-bottom: 5px;">
<span>CMS871HHHyperFHIR</span>
</p>
</td>
</tr>
<tr>
<th scope="row">
<b>Type: </b>
</th>
<td style="padding-left: 4px;">
<p style="margin-bottom: 5px;">
<b>system: </b>
<span>http://terminology.hl7.org/CodeSystem/library-type</span>
</p>
<p style="margin-bottom: 5px;">
<b>code: </b>
<span>logic-library</span>
</p>
</td>
</tr>
<tr>
<th scope="row">
<b>Date: </b>
</th>
<td style="padding-left: 4px;">2025-05-23T20:52:30+00:00</td>
</tr>
<tr>
<th scope="row">
<b>Publisher: </b>
</th>
<td style="padding-left: 4px;">Centers for Medicare & Medicaid Services (CMS)</td>
</tr>
<tr>
<th scope="row">
<b>Description: </b>
</th>
<td style="padding-left: 4px;">CMS871HHHyperFHIR</td>
</tr>
<tr>
<th scope="row">
<b>Related Artifacts: </b>
</th>
<td style="padding-left: 4px;">
<p>
<b>Dependencies</b>
</p>
<ul>
<li>https://madie.cms.gov/Library/SupplementalDataElements|5.1.000</li>
<li>https://madie.cms.gov/Library/FHIRHelpers|4.4.000</li>
<li>https://madie.cms.gov/Library/CQMCommon|4.1.000</li>
<li>https://madie.cms.gov/Library/QICoreCommon|4.0.000</li>
<li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307</li>
<li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.103.12.1001</li>
<li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1196.394</li>
<li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.34</li>
<li>http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45</li>
<li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.209</li>
<li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.207</li>
</ul>
</td>
</tr>
<tr>
<th scope="row">
<b>Data Requirements:</b>
</th>
<td style="padding-left: 4px;">
<table class="grid-dict">
<tr>
<th>
<b>Type</b>
</th>
<th>
<b>Profile</b>
</th>
<th>
<b>MS</b>
</th>
<th>
<b>Code Filter</b>
</th>
</tr>
<tr>
<th>Patient</th>
<th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-patient</th>
<th>;;</th>
<th> </th>
</tr>
<tr>
<th>MedicationAdministration</th>
<th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-medicationadministration</th>
<th>;</th>
<th>
<b>code filter: </b>
<br/>
<span style="padding-left: 4px;">
<b>path: </b>
<span>medication</span>
</span>
<br/>
<span style="padding-left: 4px;">
<b>value set: </b>
<span>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1196.394</span>
</span>
</th>
</tr>
<tr>
<th>MedicationAdministration</th>
<th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-medicationadministration</th>
<th>;</th>
<th> </th>
</tr>
<tr>
<th>Medication</th>
<th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-medication</th>
<th>;;</th>
<th> </th>
</tr>
<tr>
<th>Observation</th>
<th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-observation-lab</th>
<th>;;;;;;;</th>
<th>
<b>code filter: </b>
<br/>
<span style="padding-left: 4px;">
<b>path: </b>
<span>code</span>
</span>
<br/>
<span style="padding-left: 4px;">
<b>value set: </b>
<span>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.34</span>
</span>
</th>
</tr>
<tr>
<th>ServiceRequest</th>
<th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-servicerequest</th>
<th>;</th>
<th>
<b>code filter: </b>
<br/>
<span style="padding-left: 4px;">
<b>path: </b>
<span>code</span>
</span>
<br/>
<span style="padding-left: 4px;">
<b>value set: </b>
<span>http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45</span>
</span>
</th>
</tr>
<tr>
<th>Procedure</th>
<th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-procedure</th>
<th>;</th>
<th>
<b>code filter: </b>
<br/>
<span style="padding-left: 4px;">
<b>path: </b>
<span>code</span>
</span>
<br/>
<span style="padding-left: 4px;">
<b>value set: </b>
<span>http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45</span>
</span>
</th>
</tr>
<tr>
<th>Coverage</th>
<th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-coverage</th>
<th>;;</th>
<th>
<b>code filter: </b>
<br/>
<span style="padding-left: 4px;">
<b>path: </b>
<span>type</span>
</span>
<br/>
<span style="padding-left: 4px;">
<b>value set: </b>
<span>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.4.11.3591</span>
</span>
</th>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="2">
<table>
<tr>
<th>
<a id="cql-content">
<b>Content: </b>
</a> text/cql
</th>
</tr>
<tr>
<td>
<pre><code class="language-cql">library CMS871HHHyperFHIR version '0.3.000'
using QICore version '6.0.0'
include FHIRHelpers version '4.4.000' called FHIRHelpers
include SupplementalDataElements version '5.1.000' called SDE
include CQMCommon version '4.1.000' called CQMCommon
include QICoreCommon version '4.0.000' called QICoreCommon
include CumulativeMedicationDuration version '5.0.000' called CMD
codesystem "LOINC": 'http://loinc.org'
valueset "birth date": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.560.100.4'
valueset "Comfort Measures": 'http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45'
valueset "Diabetes": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.103.12.1001'
valueset "Discharged to Health Care Facility for Hospice Care": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.207'
valueset "Discharged to Home for Hospice Care": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.209'
valueset "Encounter Inpatient": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307'
valueset "Glucose Lab Test Mass Per Volume": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.34'
valueset "Hypoglycemics Treatment Medications": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1196.394'
code "Birth date": '21112-8' from "LOINC" display 'Birth date'
parameter "Measurement Period" Interval<DateTime>
context Patient
/***/
define "Comfort Measures Care":
["ServiceRequest": "Comfort Measures"]
union ["Procedure": "Comfort Measures"]
define "Days in Hospitalization":
"Measurement Population" EligibleInpatientHospitalization
let period: CQMCommon."HospitalizationWithObservation" ( EligibleInpatientHospitalization ),
relevantPeriod: "Hospital Days Max 10"(period)
return Tuple {
encounter: EligibleInpatientHospitalization,
hospitalizationPeriod: period,
relevantPeriod: relevantPeriod,
relevantDays: "Days In Period"(relevantPeriod)
}
define "Days with Glucose Results":
"Days in Hospitalization" InpatientHospitalDays
return Tuple {
encounter: InpatientHospitalDays.encounter,
relevantPeriod: InpatientHospitalDays.relevantPeriod,
relevantDays: ( InpatientHospitalDays.relevantDays EncounterDay
return Tuple {
dayNumber: EncounterDay.dayNumber,
dayPeriod: EncounterDay.dayPeriod,
hasSevereResult: exists ( ["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest
where GlucoseTest.status in { 'final', 'amended', 'corrected' }
and GlucoseTest.value > 300 'mg/dL'
and QICoreCommon."Earliest" ( GlucoseTest.effective ) during EncounterDay.dayPeriod
),
hasElevatedResult: exists ( ["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest
where GlucoseTest.status in { 'final', 'amended', 'corrected' }
and GlucoseTest.value >= 200 'mg/dL'
and QICoreCommon."Earliest" ( GlucoseTest.effective ) during EncounterDay.dayPeriod
),
hasNoGlucoseTest: not exists ( ["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest
where GlucoseTest.status in { 'final', 'amended', 'corrected' }
and QICoreCommon."Earliest" ( GlucoseTest.effective ) during EncounterDay.dayPeriod
)
}
)
}
/*# hyper days uses "Relevant Encounters With Glucose Result Days" to find if hyper event on each day. Skips 1st day in 'RelevantDays`. Returns boolean based on: Today high result OR Today no result AND Yesterday high result AND 2 days ago high result*/
define "Days with Hyperglycemic Events":
"Days with Glucose Results" EncounterWithResultDays
let eligibleEventDays: EncounterWithResultDays.relevantDays EncounterDay
where EncounterDay.dayNumber > 1
return Tuple {
dayIndex: EncounterDay.dayNumber,
dayPeriod: EncounterDay.dayPeriod,
hasHyperglycemicEvent: ( EncounterDay.hasSevereResult
or ( EncounterDay.hasNoGlucoseTest
and EncounterWithResultDays.relevantDays[EncounterDay.dayNumber - 2].hasElevatedResult
and EncounterWithResultDays.relevantDays[EncounterDay.dayNumber - 3].hasElevatedResult
)
)
}
return Tuple {
encounter: EncounterWithResultDays.encounter,
relevantPeriod: EncounterWithResultDays.relevantPeriod,
eligibleEventDays: eligibleEventDays
}
define "Denominator":
"Initial Population"
define "Denominator Exclusions":
"Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care"
define "Encounter with Comfort Measures during Hospitalization":
"Initial Population" InpatientHospitalization
with "Comfort Measures Care" ComfortCare
such that Coalesce(ComfortCare.performed.toInterval(), ComfortCare.authoredOn.toInterval()) during CQMCommon."HospitalizationWithObservation" ( InpatientHospitalization )
define "Encounter with Discharge for Hospice Care":
"Initial Population" InpatientHospitalization
where InpatientHospitalization.hospitalization.dischargeDisposition in "Discharged to Home for Hospice Care"
or InpatientHospitalization.hospitalization.dischargeDisposition in "Discharged to Health Care Facility for Hospice Care"
define "Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care":
"Encounter with Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start"
union "Encounter with Comfort Measures during Hospitalization"
union "Encounter with Discharge for Hospice Care"
/**
* Using the already calculated pairing of hospitalization periods with encounters, filter on ones with
* any elevated (>= 200) blood glucose reading during the hospitalization*/
define "Encounter with Elevated Glucose Greater Than or Equal to 200":
"Encounter with Hospitalization Period" Hospitalization
with ["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest
such that QICoreCommon."Earliest" ( GlucoseTest.effective ) during Hospitalization.hospitalizationPeriod
and GlucoseTest.status in { 'final', 'amended', 'corrected' }
//and GlucoseTest.status != 'cancelled'
and GlucoseTest.value >= 200 'mg/dL'
return Hospitalization.encounter
/**
* Using the already calculated pairing of hospitalization periods with encounters, filter on ones with
* diabetes and return the encounter.*/
define "Encounter with Existing Diabetes Diagnosis":
"Encounter with Hospitalization Period" Hospitalization
with ["ConditionEncounterDiagnosis": "Diabetes"] Diabetes
such that ( QICoreCommon."ToPrevalenceInterval" ( Diabetes ) starts before end of Hospitalization.hospitalizationPeriod )
return Hospitalization.encounter
define "Encounter with Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start":
from
"Initial Population" InpatientHospitalization,
"Initial Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start" EarlyGlucoseResult
where EarlyGlucoseResult.value as Quantity > 600 'mg/dL'
and EarlyGlucoseResult.status in { 'final', 'amended', 'corrected' }
and QICoreCommon."Earliest" ( EarlyGlucoseResult.effective ) during Interval[( start of CQMCommon."HospitalizationWithObservation" ( InpatientHospitalization ) - 1 hour ), ( start of CQMCommon."HospitalizationWithObservation" ( InpatientHospitalization ) + 6 hours )]
return InpatientHospitalization
/**
* Create paring of encounters to hospitalization period so this calculation can be inspected and the result
* can be reused, making the logic faster.*/
define "Encounter with Hospitalization Period":
"Qualifying Encounter" QualifyingHospitalization
return Tuple {
encounter: QualifyingHospitalization,
hospitalizationPeriod: CQMCommon."HospitalizationWithObservation" ( QualifyingHospitalization )
}
/***/
define "Encounter with Hyperglycemic Events":
"Days with Hyperglycemic Events" HyperglycemicEventDays
where exists ( HyperglycemicEventDays.eligibleEventDays EligibleEventDay
where EligibleEventDay.hasHyperglycemicEvent
)
return HyperglycemicEventDays.encounter
/**
* Using the already calculated pairing of hospitalization periods with encounters, filter on ones with
* hypoglycemic medicatons and return the encounter.*/
define "Encounter with Hypoglycemic Medication":
from
"Encounter with Hospitalization Period" Hospitalization,
["MedicationAdministration": "Hypoglycemics Treatment Medications"] HypoglycemicMed
where HypoglycemicMed.status in { 'completed', 'in-progress' }
//and HypoglycemicMed.status != 'not-done'
and QICoreCommon."ToInterval" ( HypoglycemicMed.effective ) during Hospitalization.hospitalizationPeriod
return Hospitalization.encounter
define "Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start":
from
"Initial Population" InpatientHospitalization,
["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest
let HospitalizationInterval: CQMCommon."HospitalizationWithObservation" ( InpatientHospitalization ),
GlucoseTestTime: QICoreCommon."Earliest" ( GlucoseTest.effective )
where GlucoseTest.value as Quantity > 600 'mg/dL'
and GlucoseTest.status in { 'final', 'amended', 'corrected' }
and GlucoseTestTime during Interval[( start of HospitalizationInterval - 1 hour ), ( start of HospitalizationInterval + 6 hours )]
return GlucoseTest
define "Glucose Tests Earlier Than Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start":
from
"Initial Population" InpatientHospitalization,
"Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start" GlucoseResult600,
["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] EarlierGlucoseTest
let HospitalizationInterval: CQMCommon."HospitalizationWithObservation" ( InpatientHospitalization ),
GlucoseTest600Time: QICoreCommon."Earliest" ( GlucoseResult600.effective ),
EarlierGlucoseTestTime: QICoreCommon."Earliest" ( EarlierGlucoseTest.effective )
where GlucoseTest600Time during Interval[( start of HospitalizationInterval - 1 hour ), ( start of HospitalizationInterval + 6 hour )]
and EarlierGlucoseTestTime during Interval[( start of HospitalizationInterval - 1 hour ), GlucoseTest600Time )
and EarlierGlucoseTest.id !~ GlucoseResult600.id
return GlucoseResult600
define "Initial Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start":
"Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start" GlucoseResult600
where not ( GlucoseResult600.id in "Glucose Tests Earlier Than Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start".id )
define "Initial Population":
"Encounter with Existing Diabetes Diagnosis"
union "Encounter with Hypoglycemic Medication"
union "Encounter with Elevated Glucose Greater Than or Equal to 200"
define "Measurement Population":
"Denominator"
define "Numerator":
"Encounter with Hyperglycemic Events"
define "Numerator Exclusions":
"Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care"
define "Qualifying Encounter":
["Encounter": "Encounter Inpatient"] InpatientEncounter
where AgeInYearsAt(date from start of InpatientEncounter.period) >= 18
and InpatientEncounter.period ends during day of "Measurement Period"
and InpatientEncounter.status = 'finished'
define "SDE Ethnicity":
SDE."SDE Ethnicity"
define "SDE Payer":
SDE."SDE Payer"
define "SDE Race":
SDE."SDE Race"
define "SDE Sex":
SDE."SDE Sex"
/**
* Crops an interval to a maximum length of 10 days.*/
define function "Hospital Days Max 10"(Period Interval<DateTime>):
Interval[start of Period, Min({
end of Period, start of Period + 10 days }
)]
/**
* Creates a list of integers from 1 to how many days are in the interval. Note, this wont create an index for
* the final day if it is less than 24 hours. This also includes the first 24 hour period.*/
define function "Interval To Day Numbers"(Period Interval<DateTime>):
( expand { Interval[1, duration in days between start of Period and end of Period]} ) DayExpand
return end of DayExpand
/**
* Counts the number of eligible days in an encounter. This simply filters and counts the data built in
* "Relevant Encounters With Hyperglycemic Event Days".*/
define function "Denominator Observations"(QualifyingEncounter Encounter):
if QualifyingEncounter.id in "Denominator Exclusions".id then singleton from ( "Days with Hyperglycemic Events" EncounterWithEventDays
where EncounterWithEventDays.encounter = QualifyingEncounter
return 0
)
else singleton from ( "Days with Hyperglycemic Events" EncounterWithEventDays
where EncounterWithEventDays.encounter = QualifyingEncounter
return Count(EncounterWithEventDays.eligibleEventDays)
)
/**
* Counts the number of eligible days with a hyperglycemic event in an encounter. This simply filters and counts the data built in
* "Relevant Encounters With Hyperglycemic Event Days".*/
define function "Numerator Observations"(QualifyingEncounter Encounter):
if QualifyingEncounter.id in "Denominator Exclusions".id then singleton from ( "Days with Hyperglycemic Events" EncounterWithEventDays
where EncounterWithEventDays.encounter = QualifyingEncounter
return 0
)
else singleton from ( "Days with Hyperglycemic Events" EncounterWithEventDays
where EncounterWithEventDays.encounter = QualifyingEncounter
return Count(EncounterWithEventDays.eligibleEventDays EligibleEventDay
where EligibleEventDay.hasHyperglycemicEvent
)
)
/**
* Creates a list of 24 hour long intervals in an interval paired with the index (1 indexed) to which 24 hour interval it is.*/
define function "Days In Period"(Period Interval<DateTime>):
( "Interval To Day Numbers"(Period) ) DayNumber
let startPeriod: start of Period + ( 24 hours * ( DayNumber - 1 ) ),
endPeriod: if ( hours between startPeriod and end of Period < 24 ) then startPeriod
else start of Period + ( 24 hours * DayNumber )
return Tuple {
dayNumber: DayNumber,
dayPeriod: Interval[startPeriod, endPeriod )
}</code></pre>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</text>
<contained>
<Parameters>
<id value="options"/>
<parameter>
<name value="translatorVersion"/>
<valueString value="3.25.0"/>
</parameter>
<parameter>
<name value="option"/>
<valueString value="EnableAnnotations"/>
</parameter>
<parameter>
<name value="option"/>
<valueString value="EnableLocators"/>
</parameter>
<parameter>
<name value="option"/>
<valueString value="DisableListDemotion"/>
</parameter>
<parameter>
<name value="option"/>
<valueString value="DisableListPromotion"/>
</parameter>
<parameter>
<name value="format"/>
<valueString value="JSON"/>
</parameter>
<parameter>
<name value="format"/>
<valueString value="XML"/>
</parameter>
<parameter>
<name value="analyzeDataRequirements"/>
<valueBoolean value="false"/>
</parameter>
<parameter>
<name value="collapseDataRequirements"/>
<valueBoolean value="false"/>
</parameter>
<parameter>
<name value="compatibilityLevel"/>
<valueString value="1.5"/>
</parameter>
<parameter>
<name value="enableCqlOnly"/>
<valueBoolean value="false"/>
</parameter>
<parameter>
<name value="errorLevel"/>
<valueString value="Info"/>
</parameter>
<parameter>
<name value="signatureLevel"/>
<valueString value="Overloads"/>
</parameter>
<parameter>
<name value="validateUnits"/>
<valueBoolean value="true"/>
</parameter>
<parameter>
<name value="verifyOnly"/>
<valueBoolean value="false"/>
</parameter>
</Parameters>
</contained>
<extension
url="http://hl7.org/fhir/StructureDefinition/cqf-directReferenceCode">
<valueCoding>
<system value="http://loinc.org"/>
<code value="21112-8"/>
<display value="Birth date"/>
</valueCoding>
</extension>
<extension url="http://hl7.org/fhir/StructureDefinition/cqf-cqlOptions">
<valueReference>
<reference value="#options"/>
</valueReference>
</extension>
<url value="https://madie.cms.gov/Library/CMS871HHHyperFHIR"/>
<identifier>
<use value="official"/>
<system value="https://madie.cms.gov/login"/>
<value value="CMS871HHHyperFHIR"/>
</identifier>
<version value="0.3.000"/>
<name value="CMS871HHHyperFHIR"/>
<title value="CMS871HHHyperFHIR"/>
<status value="active"/>
<experimental value="false"/>
<type>
<coding>
<system value="http://terminology.hl7.org/CodeSystem/library-type"/>
<code value="logic-library"/>
</coding>
</type>
<date value="2025-05-23T20:52:30+00:00"/>
<publisher value="Centers for Medicare & Medicaid Services (CMS)"/>
<description value="CMS871HHHyperFHIR"/>
<content>
<contentType value="text/cql"/>
<data
value="bGlicmFyeSBDTVM4NzFISEh5cGVyRkhJUiB2ZXJzaW9uICcwLjMuMDAwJw0KDQp1c2luZyBRSUNvcmUgdmVyc2lvbiAnNi4wLjAnDQoNCmluY2x1ZGUgRkhJUkhlbHBlcnMgdmVyc2lvbiAnNC40LjAwMCcgY2FsbGVkIEZISVJIZWxwZXJzDQppbmNsdWRlIFN1cHBsZW1lbnRhbERhdGFFbGVtZW50cyB2ZXJzaW9uICc1LjEuMDAwJyBjYWxsZWQgU0RFDQppbmNsdWRlIENRTUNvbW1vbiB2ZXJzaW9uICc0LjEuMDAwJyBjYWxsZWQgQ1FNQ29tbW9uDQppbmNsdWRlIFFJQ29yZUNvbW1vbiB2ZXJzaW9uICc0LjAuMDAwJyBjYWxsZWQgUUlDb3JlQ29tbW9uDQppbmNsdWRlIEN1bXVsYXRpdmVNZWRpY2F0aW9uRHVyYXRpb24gdmVyc2lvbiAnNS4wLjAwMCcgY2FsbGVkIENNRA0KDQpjb2Rlc3lzdGVtICJMT0lOQyI6ICdodHRwOi8vbG9pbmMub3JnJw0KDQp2YWx1ZXNldCAiYmlydGggZGF0ZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41NjAuMTAwLjQnDQp2YWx1ZXNldCAiQ29tZm9ydCBNZWFzdXJlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMS4zLjYuMS40LjEuMzM4OTUuMS4zLjAuNDUnDQp2YWx1ZXNldCAiRGlhYmV0ZXMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAzLjEyLjEwMDEnDQp2YWx1ZXNldCAiRGlzY2hhcmdlZCB0byBIZWFsdGggQ2FyZSBGYWNpbGl0eSBmb3IgSG9zcGljZSBDYXJlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yMDcnDQp2YWx1ZXNldCAiRGlzY2hhcmdlZCB0byBIb21lIGZvciBIb3NwaWNlIENhcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIwOScNCnZhbHVlc2V0ICJFbmNvdW50ZXIgSW5wYXRpZW50IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjY2Ni41LjMwNycNCnZhbHVlc2V0ICJHbHVjb3NlIExhYiBUZXN0IE1hc3MgUGVyIFZvbHVtZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMzQnDQp2YWx1ZXNldCAiSHlwb2dseWNlbWljcyBUcmVhdG1lbnQgTWVkaWNhdGlvbnMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMTk2LjM5NCcNCg0KY29kZSAiQmlydGggZGF0ZSI6ICcyMTExMi04JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnQmlydGggZGF0ZScNCg0KcGFyYW1ldGVyICJNZWFzdXJlbWVudCBQZXJpb2QiIEludGVydmFsPERhdGVUaW1lPg0KDQpjb250ZXh0IFBhdGllbnQNCg0KLyoqKi8NCg0KDQpkZWZpbmUgIkNvbWZvcnQgTWVhc3VyZXMgQ2FyZSI6DQogIFsiU2VydmljZVJlcXVlc3QiOiAiQ29tZm9ydCBNZWFzdXJlcyJdDQogICAgdW5pb24gWyJQcm9jZWR1cmUiOiAiQ29tZm9ydCBNZWFzdXJlcyJdDQoNCmRlZmluZSAiRGF5cyBpbiBIb3NwaXRhbGl6YXRpb24iOg0KICAiTWVhc3VyZW1lbnQgUG9wdWxhdGlvbiIgRWxpZ2libGVJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24NCiAgICBsZXQgcGVyaW9kOiBDUU1Db21tb24uIkhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiIgKCBFbGlnaWJsZUlucGF0aWVudEhvc3BpdGFsaXphdGlvbiApLA0KICAgIHJlbGV2YW50UGVyaW9kOiAiSG9zcGl0YWwgRGF5cyBNYXggMTAiKHBlcmlvZCkNCiAgICByZXR1cm4gVHVwbGUgew0KICAgICAgZW5jb3VudGVyOiBFbGlnaWJsZUlucGF0aWVudEhvc3BpdGFsaXphdGlvbiwNCiAgICAgIGhvc3BpdGFsaXphdGlvblBlcmlvZDogcGVyaW9kLA0KICAgICAgcmVsZXZhbnRQZXJpb2Q6IHJlbGV2YW50UGVyaW9kLA0KICAgICAgcmVsZXZhbnREYXlzOiAiRGF5cyBJbiBQZXJpb2QiKHJlbGV2YW50UGVyaW9kKQ0KICAgIH0NCg0KZGVmaW5lICJEYXlzIHdpdGggR2x1Y29zZSBSZXN1bHRzIjoNCiAgIkRheXMgaW4gSG9zcGl0YWxpemF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbERheXMNCiAgICByZXR1cm4gVHVwbGUgew0KICAgICAgZW5jb3VudGVyOiBJbnBhdGllbnRIb3NwaXRhbERheXMuZW5jb3VudGVyLA0KICAgICAgcmVsZXZhbnRQZXJpb2Q6IElucGF0aWVudEhvc3BpdGFsRGF5cy5yZWxldmFudFBlcmlvZCwNCiAgICAgIHJlbGV2YW50RGF5czogKCBJbnBhdGllbnRIb3NwaXRhbERheXMucmVsZXZhbnREYXlzIEVuY291bnRlckRheQ0KICAgICAgICAgIHJldHVybiBUdXBsZSB7DQogICAgICAgICAgICBkYXlOdW1iZXI6IEVuY291bnRlckRheS5kYXlOdW1iZXIsDQogICAgICAgICAgICBkYXlQZXJpb2Q6IEVuY291bnRlckRheS5kYXlQZXJpb2QsDQogICAgICAgICAgICBoYXNTZXZlcmVSZXN1bHQ6IGV4aXN0cyAoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gR2x1Y29zZVRlc3QNCiAgICAgICAgICAgICAgICB3aGVyZSBHbHVjb3NlVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICAgICAgICAgICAgICAgIGFuZCBHbHVjb3NlVGVzdC52YWx1ZSA+IDMwMCAnbWcvZEwnDQogICAgICAgICAgICAgICAgICBhbmQgUUlDb3JlQ29tbW9uLiJFYXJsaWVzdCIgKCBHbHVjb3NlVGVzdC5lZmZlY3RpdmUgKSBkdXJpbmcgRW5jb3VudGVyRGF5LmRheVBlcmlvZA0KICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIGhhc0VsZXZhdGVkUmVzdWx0OiBleGlzdHMgKCBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJHbHVjb3NlIExhYiBUZXN0IE1hc3MgUGVyIFZvbHVtZSJdIEdsdWNvc2VUZXN0DQogICAgICAgICAgICAgICAgd2hlcmUgR2x1Y29zZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9DQogICAgICAgICAgICAgICAgICBhbmQgR2x1Y29zZVRlc3QudmFsdWUgPj0gMjAwICdtZy9kTCcNCiAgICAgICAgICAgICAgICAgIGFuZCBRSUNvcmVDb21tb24uIkVhcmxpZXN0IiAoIEdsdWNvc2VUZXN0LmVmZmVjdGl2ZSApIGR1cmluZyBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kDQogICAgICAgICAgICApLA0KICAgICAgICAgICAgaGFzTm9HbHVjb3NlVGVzdDogbm90IGV4aXN0cyAoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gR2x1Y29zZVRlc3QNCiAgICAgICAgICAgICAgICB3aGVyZSBHbHVjb3NlVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICAgICAgICAgICAgICAgIGFuZCBRSUNvcmVDb21tb24uIkVhcmxpZXN0IiAoIEdsdWNvc2VUZXN0LmVmZmVjdGl2ZSApIGR1cmluZyBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kDQogICAgICAgICAgICApDQogICAgICAgICAgfQ0KICAgICAgKQ0KICAgIH0NCg0KLyojIGh5cGVyIGRheXMgdXNlcyAiUmVsZXZhbnQgRW5jb3VudGVycyBXaXRoIEdsdWNvc2UgUmVzdWx0IERheXMiIHRvIGZpbmQgaWYgaHlwZXIgZXZlbnQgb24gZWFjaCBkYXkuIFNraXBzIDFzdCBkYXkgaW4gJ1JlbGV2YW50RGF5c2AuIFJldHVybnMgYm9vbGVhbiBiYXNlZCBvbjogVG9kYXkgaGlnaCByZXN1bHQgT1IgVG9kYXkgbm8gcmVzdWx0IEFORCBZZXN0ZXJkYXkgaGlnaCByZXN1bHQgQU5EIDIgZGF5cyBhZ28gaGlnaCByZXN1bHQqLw0KDQoNCmRlZmluZSAiRGF5cyB3aXRoIEh5cGVyZ2x5Y2VtaWMgRXZlbnRzIjoNCiAgIkRheXMgd2l0aCBHbHVjb3NlIFJlc3VsdHMiIEVuY291bnRlcldpdGhSZXN1bHREYXlzDQogICAgbGV0IGVsaWdpYmxlRXZlbnREYXlzOiBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cy5yZWxldmFudERheXMgRW5jb3VudGVyRGF5DQogICAgICB3aGVyZSBFbmNvdW50ZXJEYXkuZGF5TnVtYmVyID4gMQ0KICAgICAgcmV0dXJuIFR1cGxlIHsNCiAgICAgICAgZGF5SW5kZXg6IEVuY291bnRlckRheS5kYXlOdW1iZXIsDQogICAgICAgIGRheVBlcmlvZDogRW5jb3VudGVyRGF5LmRheVBlcmlvZCwNCiAgICAgICAgaGFzSHlwZXJnbHljZW1pY0V2ZW50OiAoIEVuY291bnRlckRheS5oYXNTZXZlcmVSZXN1bHQNCiAgICAgICAgICAgIG9yICggRW5jb3VudGVyRGF5Lmhhc05vR2x1Y29zZVRlc3QNCiAgICAgICAgICAgICAgICBhbmQgRW5jb3VudGVyV2l0aFJlc3VsdERheXMucmVsZXZhbnREYXlzW0VuY291bnRlckRheS5kYXlOdW1iZXIgLSAyXS5oYXNFbGV2YXRlZFJlc3VsdA0KICAgICAgICAgICAgICAgIGFuZCBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cy5yZWxldmFudERheXNbRW5jb3VudGVyRGF5LmRheU51bWJlciAtIDNdLmhhc0VsZXZhdGVkUmVzdWx0DQogICAgICAgICAgICApDQogICAgICAgICkNCiAgICAgIH0NCiAgICByZXR1cm4gVHVwbGUgew0KICAgICAgZW5jb3VudGVyOiBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cy5lbmNvdW50ZXIsDQogICAgICByZWxldmFudFBlcmlvZDogRW5jb3VudGVyV2l0aFJlc3VsdERheXMucmVsZXZhbnRQZXJpb2QsDQogICAgICBlbGlnaWJsZUV2ZW50RGF5czogZWxpZ2libGVFdmVudERheXMNCiAgICB9DQoNCmRlZmluZSAiRGVub21pbmF0b3IiOg0KICAiSW5pdGlhbCBQb3B1bGF0aW9uIg0KDQpkZWZpbmUgIkRlbm9taW5hdG9yIEV4Y2x1c2lvbnMiOg0KICAiRW5jb3VudGVyIHdpdGggRWFybHkgR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIG9yIHdpdGggQ29tZm9ydCBvciBIb3NwaWNlIENhcmUiDQoNCmRlZmluZSAiRW5jb3VudGVyIHdpdGggQ29tZm9ydCBNZWFzdXJlcyBkdXJpbmcgSG9zcGl0YWxpemF0aW9uIjoNCiAgIkluaXRpYWwgUG9wdWxhdGlvbiIgSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uDQogICAgd2l0aCAiQ29tZm9ydCBNZWFzdXJlcyBDYXJlIiBDb21mb3J0Q2FyZQ0KICAgICAgc3VjaCB0aGF0IENvYWxlc2NlKENvbWZvcnRDYXJlLnBlcmZvcm1lZC50b0ludGVydmFsKCksIENvbWZvcnRDYXJlLmF1dGhvcmVkT24udG9JbnRlcnZhbCgpKSBkdXJpbmcgQ1FNQ29tbW9uLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iICggSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uICkNCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBEaXNjaGFyZ2UgZm9yIEhvc3BpY2UgQ2FyZSI6DQogICJJbml0aWFsIFBvcHVsYXRpb24iIElucGF0aWVudEhvc3BpdGFsaXphdGlvbg0KICAgIHdoZXJlIElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb24uZGlzY2hhcmdlRGlzcG9zaXRpb24gaW4gIkRpc2NoYXJnZWQgdG8gSG9tZSBmb3IgSG9zcGljZSBDYXJlIg0KICAgICAgb3IgSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvbi5kaXNjaGFyZ2VEaXNwb3NpdGlvbiBpbiAiRGlzY2hhcmdlZCB0byBIZWFsdGggQ2FyZSBGYWNpbGl0eSBmb3IgSG9zcGljZSBDYXJlIg0KDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIEVhcmx5IEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCBvciB3aXRoIENvbWZvcnQgb3IgSG9zcGljZSBDYXJlIjoNCiAgIkVuY291bnRlciB3aXRoIEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCINCiAgICB1bmlvbiAiRW5jb3VudGVyIHdpdGggQ29tZm9ydCBNZWFzdXJlcyBkdXJpbmcgSG9zcGl0YWxpemF0aW9uIg0KICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBEaXNjaGFyZ2UgZm9yIEhvc3BpY2UgQ2FyZSINCg0KDQovKioNCiAqIFVzaW5nIHRoZSBhbHJlYWR5IGNhbGN1bGF0ZWQgcGFpcmluZyBvZiBob3NwaXRhbGl6YXRpb24gcGVyaW9kcyB3aXRoIGVuY291bnRlcnMsIGZpbHRlciBvbiBvbmVzIHdpdGggDQogKiBhbnkgZWxldmF0ZWQgKD49IDIwMCkgYmxvb2QgZ2x1Y29zZSByZWFkaW5nIGR1cmluZyB0aGUgaG9zcGl0YWxpemF0aW9uKi8NCg0KDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIEVsZXZhdGVkIEdsdWNvc2UgR3JlYXRlciBUaGFuIG9yIEVxdWFsIHRvIDIwMCI6DQogICJFbmNvdW50ZXIgd2l0aCBIb3NwaXRhbGl6YXRpb24gUGVyaW9kIiBIb3NwaXRhbGl6YXRpb24NCiAgICB3aXRoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gR2x1Y29zZVRlc3QNCiAgICAgIHN1Y2ggdGhhdCBRSUNvcmVDb21tb24uIkVhcmxpZXN0IiAoIEdsdWNvc2VUZXN0LmVmZmVjdGl2ZSApIGR1cmluZyBIb3NwaXRhbGl6YXRpb24uaG9zcGl0YWxpemF0aW9uUGVyaW9kDQogICAgICAgIGFuZCBHbHVjb3NlVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICAgICAgICAgIC8vYW5kIEdsdWNvc2VUZXN0LnN0YXR1cyAhPSAnY2FuY2VsbGVkJw0KICAgICAgICANCiAgICAgICAgYW5kIEdsdWNvc2VUZXN0LnZhbHVlID49IDIwMCAnbWcvZEwnDQogICAgcmV0dXJuIEhvc3BpdGFsaXphdGlvbi5lbmNvdW50ZXINCg0KLyoqDQogKiBVc2luZyB0aGUgYWxyZWFkeSBjYWxjdWxhdGVkIHBhaXJpbmcgb2YgaG9zcGl0YWxpemF0aW9uIHBlcmlvZHMgd2l0aCBlbmNvdW50ZXJzLCBmaWx0ZXIgb24gb25lcyB3aXRoIA0KICogZGlhYmV0ZXMgYW5kIHJldHVybiB0aGUgZW5jb3VudGVyLiovDQoNCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBFeGlzdGluZyBEaWFiZXRlcyBEaWFnbm9zaXMiOg0KICAiRW5jb3VudGVyIHdpdGggSG9zcGl0YWxpemF0aW9uIFBlcmlvZCIgSG9zcGl0YWxpemF0aW9uDQogICAgd2l0aCBbIkNvbmRpdGlvbkVuY291bnRlckRpYWdub3NpcyI6ICJEaWFiZXRlcyJdIERpYWJldGVzDQogICAgICBzdWNoIHRoYXQgKCBRSUNvcmVDb21tb24uIlRvUHJldmFsZW5jZUludGVydmFsIiAoIERpYWJldGVzICkgc3RhcnRzIGJlZm9yZSBlbmQgb2YgSG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvblBlcmlvZCApDQogICAgcmV0dXJuIEhvc3BpdGFsaXphdGlvbi5lbmNvdW50ZXINCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBHbHVjb3NlIEdyZWF0ZXIgVGhhbiA2MDAgd2l0aGluIDEgSG91ciBQcmlvciBUbyBhbmQgNiBIb3VycyBBZnRlciBFbmNvdW50ZXIgU3RhcnQiOg0KICBmcm9tDQogICAgIkluaXRpYWwgUG9wdWxhdGlvbiIgSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLA0KICAgICJJbml0aWFsIEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCIgRWFybHlHbHVjb3NlUmVzdWx0DQogICAgd2hlcmUgRWFybHlHbHVjb3NlUmVzdWx0LnZhbHVlIGFzIFF1YW50aXR5ID4gNjAwICdtZy9kTCcNCiAgICAgIGFuZCBFYXJseUdsdWNvc2VSZXN1bHQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9DQogICAgICBhbmQgUUlDb3JlQ29tbW9uLiJFYXJsaWVzdCIgKCBFYXJseUdsdWNvc2VSZXN1bHQuZWZmZWN0aXZlICkgZHVyaW5nIEludGVydmFsWyggc3RhcnQgb2YgQ1FNQ29tbW9uLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iICggSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uICkgLSAxIGhvdXIgKSwgKCBzdGFydCBvZiBDUU1Db21tb24uIkhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiIgKCBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24gKSArIDYgaG91cnMgKV0NCiAgICByZXR1cm4gSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uDQoNCg0KLyoqDQogKiBDcmVhdGUgcGFyaW5nIG9mIGVuY291bnRlcnMgdG8gaG9zcGl0YWxpemF0aW9uIHBlcmlvZCBzbyB0aGlzIGNhbGN1bGF0aW9uIGNhbiBiZSBpbnNwZWN0ZWQgYW5kIHRoZSByZXN1bHQgDQogKiBjYW4gYmUgcmV1c2VkLCBtYWtpbmcgdGhlIGxvZ2ljIGZhc3Rlci4qLw0KDQoNCmRlZmluZSAiRW5jb3VudGVyIHdpdGggSG9zcGl0YWxpemF0aW9uIFBlcmlvZCI6DQogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgUXVhbGlmeWluZ0hvc3BpdGFsaXphdGlvbg0KICAgIHJldHVybiBUdXBsZSB7DQogICAgICBlbmNvdW50ZXI6IFF1YWxpZnlpbmdIb3NwaXRhbGl6YXRpb24sDQogICAgICBob3NwaXRhbGl6YXRpb25QZXJpb2Q6IENRTUNvbW1vbi4iSG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uIiAoIFF1YWxpZnlpbmdIb3NwaXRhbGl6YXRpb24gKQ0KICAgIH0NCg0KLyoqKi8NCg0KDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIEh5cGVyZ2x5Y2VtaWMgRXZlbnRzIjoNCiAgIkRheXMgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyIgSHlwZXJnbHljZW1pY0V2ZW50RGF5cw0KICAgIHdoZXJlIGV4aXN0cyAoIEh5cGVyZ2x5Y2VtaWNFdmVudERheXMuZWxpZ2libGVFdmVudERheXMgRWxpZ2libGVFdmVudERheQ0KICAgICAgICB3aGVyZSBFbGlnaWJsZUV2ZW50RGF5Lmhhc0h5cGVyZ2x5Y2VtaWNFdmVudA0KICAgICkNCiAgICByZXR1cm4gSHlwZXJnbHljZW1pY0V2ZW50RGF5cy5lbmNvdW50ZXINCg0KLyoqDQogKiBVc2luZyB0aGUgYWxyZWFkeSBjYWxjdWxhdGVkIHBhaXJpbmcgb2YgaG9zcGl0YWxpemF0aW9uIHBlcmlvZHMgd2l0aCBlbmNvdW50ZXJzLCBmaWx0ZXIgb24gb25lcyB3aXRoIA0KICogaHlwb2dseWNlbWljIG1lZGljYXRvbnMgYW5kIHJldHVybiB0aGUgZW5jb3VudGVyLiovDQoNCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBIeXBvZ2x5Y2VtaWMgTWVkaWNhdGlvbiI6DQogIGZyb20NCiAgICAiRW5jb3VudGVyIHdpdGggSG9zcGl0YWxpemF0aW9uIFBlcmlvZCIgSG9zcGl0YWxpemF0aW9uLA0KICAgIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIkh5cG9nbHljZW1pY3MgVHJlYXRtZW50IE1lZGljYXRpb25zIl0gSHlwb2dseWNlbWljTWVkDQogICAgd2hlcmUgSHlwb2dseWNlbWljTWVkLnN0YXR1cyBpbiB7ICdjb21wbGV0ZWQnLCAnaW4tcHJvZ3Jlc3MnIH0NCiAgICAgICAgICAvL2FuZCBIeXBvZ2x5Y2VtaWNNZWQuc3RhdHVzICE9ICdub3QtZG9uZScNCiAgICAgIA0KICAgICAgYW5kIFFJQ29yZUNvbW1vbi4iVG9JbnRlcnZhbCIgKCBIeXBvZ2x5Y2VtaWNNZWQuZWZmZWN0aXZlICkgZHVyaW5nIEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25QZXJpb2QNCiAgICByZXR1cm4gSG9zcGl0YWxpemF0aW9uLmVuY291bnRlcg0KDQpkZWZpbmUgIkdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCI6DQogIGZyb20NCiAgICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24sDQogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiR2x1Y29zZSBMYWIgVGVzdCBNYXNzIFBlciBWb2x1bWUiXSBHbHVjb3NlVGVzdA0KICAgIGxldCBIb3NwaXRhbGl6YXRpb25JbnRlcnZhbDogQ1FNQ29tbW9uLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iICggSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uICksDQogICAgR2x1Y29zZVRlc3RUaW1lOiBRSUNvcmVDb21tb24uIkVhcmxpZXN0IiAoIEdsdWNvc2VUZXN0LmVmZmVjdGl2ZSApDQogICAgd2hlcmUgR2x1Y29zZVRlc3QudmFsdWUgYXMgUXVhbnRpdHkgPiA2MDAgJ21nL2RMJw0KICAgICAgYW5kIEdsdWNvc2VUZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQ0KICAgICAgYW5kIEdsdWNvc2VUZXN0VGltZSBkdXJpbmcgSW50ZXJ2YWxbKCBzdGFydCBvZiBIb3NwaXRhbGl6YXRpb25JbnRlcnZhbCAtIDEgaG91ciApLCAoIHN0YXJ0IG9mIEhvc3BpdGFsaXphdGlvbkludGVydmFsICsgNiBob3VycyApXQ0KICAgIHJldHVybiBHbHVjb3NlVGVzdA0KDQpkZWZpbmUgIkdsdWNvc2UgVGVzdHMgRWFybGllciBUaGFuIEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCI6DQogIGZyb20NCiAgICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24sDQogICAgIkdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCIgR2x1Y29zZVJlc3VsdDYwMCwNCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJHbHVjb3NlIExhYiBUZXN0IE1hc3MgUGVyIFZvbHVtZSJdIEVhcmxpZXJHbHVjb3NlVGVzdA0KICAgIGxldCBIb3NwaXRhbGl6YXRpb25JbnRlcnZhbDogQ1FNQ29tbW9uLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iICggSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uICksDQogICAgR2x1Y29zZVRlc3Q2MDBUaW1lOiBRSUNvcmVDb21tb24uIkVhcmxpZXN0IiAoIEdsdWNvc2VSZXN1bHQ2MDAuZWZmZWN0aXZlICksDQogICAgRWFybGllckdsdWNvc2VUZXN0VGltZTogUUlDb3JlQ29tbW9uLiJFYXJsaWVzdCIgKCBFYXJsaWVyR2x1Y29zZVRlc3QuZWZmZWN0aXZlICkNCiAgICB3aGVyZSBHbHVjb3NlVGVzdDYwMFRpbWUgZHVyaW5nIEludGVydmFsWyggc3RhcnQgb2YgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWwgLSAxIGhvdXIgKSwgKCBzdGFydCBvZiBIb3NwaXRhbGl6YXRpb25JbnRlcnZhbCArIDYgaG91ciApXQ0KICAgICAgYW5kIEVhcmxpZXJHbHVjb3NlVGVzdFRpbWUgZHVyaW5nIEludGVydmFsWyggc3RhcnQgb2YgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWwgLSAxIGhvdXIgKSwgR2x1Y29zZVRlc3Q2MDBUaW1lICkNCiAgICAgIGFuZCBFYXJsaWVyR2x1Y29zZVRlc3QuaWQgIX4gR2x1Y29zZVJlc3VsdDYwMC5pZA0KICAgIHJldHVybiBHbHVjb3NlUmVzdWx0NjAwDQoNCmRlZmluZSAiSW5pdGlhbCBHbHVjb3NlIEdyZWF0ZXIgVGhhbiA2MDAgd2l0aGluIDEgSG91ciBQcmlvciBUbyBhbmQgNiBIb3VycyBBZnRlciBFbmNvdW50ZXIgU3RhcnQiOg0KICAiR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0IiBHbHVjb3NlUmVzdWx0NjAwDQogICAgd2hlcmUgbm90ICggR2x1Y29zZVJlc3VsdDYwMC5pZCBpbiAiR2x1Y29zZSBUZXN0cyBFYXJsaWVyIFRoYW4gR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0Ii5pZCApDQoNCmRlZmluZSAiSW5pdGlhbCBQb3B1bGF0aW9uIjoNCiAgIkVuY291bnRlciB3aXRoIEV4aXN0aW5nIERpYWJldGVzIERpYWdub3NpcyINCiAgICB1bmlvbiAiRW5jb3VudGVyIHdpdGggSHlwb2dseWNlbWljIE1lZGljYXRpb24iDQogICAgdW5pb24gIkVuY291bnRlciB3aXRoIEVsZXZhdGVkIEdsdWNvc2UgR3JlYXRlciBUaGFuIG9yIEVxdWFsIHRvIDIwMCINCg0KZGVmaW5lICJNZWFzdXJlbWVudCBQb3B1bGF0aW9uIjoNCiAgIkRlbm9taW5hdG9yIg0KDQpkZWZpbmUgIk51bWVyYXRvciI6DQogICJFbmNvdW50ZXIgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyINCg0KZGVmaW5lICJOdW1lcmF0b3IgRXhjbHVzaW9ucyI6DQogICJFbmNvdW50ZXIgd2l0aCBFYXJseSBHbHVjb3NlIEdyZWF0ZXIgVGhhbiA2MDAgb3Igd2l0aCBDb21mb3J0IG9yIEhvc3BpY2UgQ2FyZSINCg0KZGVmaW5lICJRdWFsaWZ5aW5nIEVuY291bnRlciI6DQogIFsiRW5jb3VudGVyIjogIkVuY291bnRlciBJbnBhdGllbnQiXSBJbnBhdGllbnRFbmNvdW50ZXINCiAgICB3aGVyZSBBZ2VJblllYXJzQXQoZGF0ZSBmcm9tIHN0YXJ0IG9mIElucGF0aWVudEVuY291bnRlci5wZXJpb2QpID49IDE4DQogICAgICBhbmQgSW5wYXRpZW50RW5jb3VudGVyLnBlcmlvZCBlbmRzIGR1cmluZyBkYXkgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCINCiAgICAgIGFuZCBJbnBhdGllbnRFbmNvdW50ZXIuc3RhdHVzID0gJ2ZpbmlzaGVkJw0KDQpkZWZpbmUgIlNERSBFdGhuaWNpdHkiOg0KICBTREUuIlNERSBFdGhuaWNpdHkiDQoNCmRlZmluZSAiU0RFIFBheWVyIjoNCiAgU0RFLiJTREUgUGF5ZXIiDQoNCmRlZmluZSAiU0RFIFJhY2UiOg0KICBTREUuIlNERSBSYWNlIg0KDQpkZWZpbmUgIlNERSBTZXgiOg0KICBTREUuIlNERSBTZXgiDQoNCi8qKg0KICogQ3JvcHMgYW4gaW50ZXJ2YWwgdG8gYSBtYXhpbXVtIGxlbmd0aCBvZiAxMCBkYXlzLiovDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJIb3NwaXRhbCBEYXlzIE1heCAxMCIoUGVyaW9kIEludGVydmFsPERhdGVUaW1lPik6DQogIEludGVydmFsW3N0YXJ0IG9mIFBlcmlvZCwgTWluKHsgDQogICAgZW5kIG9mIFBlcmlvZCwgc3RhcnQgb2YgUGVyaW9kICsgMTAgZGF5cyB9DQogICldDQoNCi8qKg0KICogQ3JlYXRlcyBhIGxpc3Qgb2YgaW50ZWdlcnMgZnJvbSAxIHRvIGhvdyBtYW55IGRheXMgYXJlIGluIHRoZSBpbnRlcnZhbC4gTm90ZSwgdGhpcyB3b250IGNyZWF0ZSBhbiBpbmRleCBmb3INCiAqIHRoZSBmaW5hbCBkYXkgaWYgaXQgaXMgbGVzcyB0aGFuIDI0IGhvdXJzLiBUaGlzIGFsc28gaW5jbHVkZXMgdGhlIGZpcnN0IDI0IGhvdXIgcGVyaW9kLiovDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJJbnRlcnZhbCBUbyBEYXkgTnVtYmVycyIoUGVyaW9kIEludGVydmFsPERhdGVUaW1lPik6DQogICggZXhwYW5kIHsgSW50ZXJ2YWxbMSwgZHVyYXRpb24gaW4gZGF5cyBiZXR3ZWVuIHN0YXJ0IG9mIFBlcmlvZCBhbmQgZW5kIG9mIFBlcmlvZF19ICkgRGF5RXhwYW5kDQogICAgcmV0dXJuIGVuZCBvZiBEYXlFeHBhbmQNCg0KLyoqDQogKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGlnaWJsZSBkYXlzIGluIGFuIGVuY291bnRlci4gVGhpcyBzaW1wbHkgZmlsdGVycyBhbmQgY291bnRzIHRoZSBkYXRhIGJ1aWx0IGluDQogKiAiUmVsZXZhbnQgRW5jb3VudGVycyBXaXRoIEh5cGVyZ2x5Y2VtaWMgRXZlbnQgRGF5cyIuKi8NCg0KDQpkZWZpbmUgZnVuY3Rpb24gIkRlbm9taW5hdG9yIE9ic2VydmF0aW9ucyIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOg0KICBpZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkIGluICJEZW5vbWluYXRvciBFeGNsdXNpb25zIi5pZCB0aGVuIHNpbmdsZXRvbiBmcm9tICggIkRheXMgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyIgRW5jb3VudGVyV2l0aEV2ZW50RGF5cw0KICAgICAgd2hlcmUgRW5jb3VudGVyV2l0aEV2ZW50RGF5cy5lbmNvdW50ZXIgPSBRdWFsaWZ5aW5nRW5jb3VudGVyDQogICAgICByZXR1cm4gMA0KICApIA0KICAgIGVsc2Ugc2luZ2xldG9uIGZyb20gKCAiRGF5cyB3aXRoIEh5cGVyZ2x5Y2VtaWMgRXZlbnRzIiBFbmNvdW50ZXJXaXRoRXZlbnREYXlzDQogICAgICB3aGVyZSBFbmNvdW50ZXJXaXRoRXZlbnREYXlzLmVuY291bnRlciA9IFF1YWxpZnlpbmdFbmNvdW50ZXINCiAgICAgIHJldHVybiBDb3VudChFbmNvdW50ZXJXaXRoRXZlbnREYXlzLmVsaWdpYmxlRXZlbnREYXlzKQ0KICApDQoNCi8qKg0KICogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxpZ2libGUgZGF5cyB3aXRoIGEgaHlwZXJnbHljZW1pYyBldmVudCBpbiBhbiBlbmNvdW50ZXIuIFRoaXMgc2ltcGx5IGZpbHRlcnMgYW5kIGNvdW50cyB0aGUgZGF0YSBidWlsdCBpbg0KICogIlJlbGV2YW50IEVuY291bnRlcnMgV2l0aCBIeXBlcmdseWNlbWljIEV2ZW50IERheXMiLiovDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJOdW1lcmF0b3IgT2JzZXJ2YXRpb25zIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogIGlmIFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQgaW4gIkRlbm9taW5hdG9yIEV4Y2x1c2lvbnMiLmlkIHRoZW4gc2luZ2xldG9uIGZyb20gKCAiRGF5cyB3aXRoIEh5cGVyZ2x5Y2VtaWMgRXZlbnRzIiBFbmNvdW50ZXJXaXRoRXZlbnREYXlzDQogICAgICB3aGVyZSBFbmNvdW50ZXJXaXRoRXZlbnREYXlzLmVuY291bnRlciA9IFF1YWxpZnlpbmdFbmNvdW50ZXINCiAgICAgIHJldHVybiAwDQogICkgDQogICAgZWxzZSBzaW5nbGV0b24gZnJvbSAoICJEYXlzIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiIEVuY291bnRlcldpdGhFdmVudERheXMNCiAgICAgIHdoZXJlIEVuY291bnRlcldpdGhFdmVudERheXMuZW5jb3VudGVyID0gUXVhbGlmeWluZ0VuY291bnRlcg0KICAgICAgcmV0dXJuIENvdW50KEVuY291bnRlcldpdGhFdmVudERheXMuZWxpZ2libGVFdmVudERheXMgRWxpZ2libGVFdmVudERheQ0KICAgICAgICAgIHdoZXJlIEVsaWdpYmxlRXZlbnREYXkuaGFzSHlwZXJnbHljZW1pY0V2ZW50DQogICAgICApDQogICkNCg0KLyoqDQogKiBDcmVhdGVzIGEgbGlzdCBvZiAyNCBob3VyIGxvbmcgaW50ZXJ2YWxzIGluIGFuIGludGVydmFsIHBhaXJlZCB3aXRoIHRoZSBpbmRleCAoMSBpbmRleGVkKSB0byB3aGljaCAyNCBob3VyIGludGVydmFsIGl0IGlzLiovDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJEYXlzIEluIFBlcmlvZCIoUGVyaW9kIEludGVydmFsPERhdGVUaW1lPik6DQogICggIkludGVydmFsIFRvIERheSBOdW1iZXJzIihQZXJpb2QpICkgRGF5TnVtYmVyDQogICAgbGV0IHN0YXJ0UGVyaW9kOiBzdGFydCBvZiBQZXJpb2QgKyAoIDI0IGhvdXJzICogKCBEYXlOdW1iZXIgLSAxICkgKSwNCiAgICBlbmRQZXJpb2Q6IGlmICggaG91cnMgYmV0d2VlbiBzdGFydFBlcmlvZCBhbmQgZW5kIG9mIFBlcmlvZCA8IDI0ICkgdGhlbiBzdGFydFBlcmlvZCANCiAgICAgIGVsc2Ugc3RhcnQgb2YgUGVyaW9kICsgKCAyNCBob3VycyAqIERheU51bWJlciApDQogICAgcmV0dXJuIFR1cGxlIHsNCiAgICAgIGRheU51bWJlcjogRGF5TnVtYmVyLA0KICAgICAgZGF5UGVyaW9kOiBJbnRlcnZhbFtzdGFydFBlcmlvZCwgZW5kUGVyaW9kICkNCiAgICB9"/>
</content>
</Library>