Draft dQM CMS Content Implementation Guide
2025.1.0 - CI Build

Draft dQM CMS Content Implementation Guide, published by cqframework. This guide is not an authorized publication; it is the continuous build for version 2025.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/cqframework/dqm-content-cms-2025/ and changes regularly. See the Directory of published versions

: CMS871FHIRHHHyper - JSON Representation

Draft as of 2026-09-19

Raw json | Download

{
  "resourceType" : "Library",
  "id" : "CMS871FHIRHHHyper",
  "text" : {
    "status" : "extensions",
    "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n  <table class=\"narrative-table\">\n    <tbody>\n<tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\"><a name=\"metadata\"> </a>Metadata</th>\n\n\n</tr>\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Version</th>\n\n\n\n<td class=\"content-container\">1.1.000</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Status</th>\n\n\n\n<td class=\"content-container\">Draft</td>\n\n\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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Type</th>\n\n\n\n<td class=\"content-container\">\n    <a href=\"http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html\">http://terminology.hl7.org/CodeSystem/library-type</a>#logic-library\n\n\n</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\"><a name=\"parameters\"> </a>Parameters</th>\n\n\n</tr>\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Parameter</th>\n\n\n\n<td class=\"content-container\">None</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n  <tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\">Library Content</th>\n\n\n</tr>\n  \n    \n    <tr>\n      <th scope=\"row\" class=\"row-header\">CQL Content</th>\n      <td>\n        <a name=\"cql-content\"> </a>\n        <pre style=\"border: none;\" class=\"content-container highlight language-cql\"><code class=\"language-cql\">/*\nNOTE: For use by March 2026 US Realm Connectathon participants for internal use only. Not for use or distribution in commercial products.\n*/\nlibrary CMS871FHIRHHHyper version '1.1.000'\n\nusing USQualityCore version '0.1.0-cibuild'\nusing USCore version '6.1.0-derived'\nusing FHIR version '4.0.1'\n\ninclude hl7.fhir.uv.cql.FHIRHelpers version '4.0.1' called FHIRHelpers\ninclude hl7.fhir.uv.cql.FHIRCommon version '2.0.0' called FHIRCommon\ninclude hl7.fhir.us.cql.USCoreCommon version '2.0.0-ballot' called USCoreCommon\ninclude hl7.fhir.us.cql.USCoreElements version '2.0.0-ballot' called USCoreElements\n\ninclude CQMCommon version '5.1.000' called CQMCommon\ninclude USQualityCoreCommon version '0.1.0-cibuild' called USQualityCoreCommon\ninclude SupplementalDataElements version '6.1.000' called SDE\ninclude Status version '2.1.000' called Status\n\nvalueset &quot;Comfort Measures&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45'\nvalueset &quot;Diabetes&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.103.12.1001'\nvalueset &quot;Discharged to Health Care Facility for Hospice Care&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.207'\nvalueset &quot;Discharged to Home for Hospice Care&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.209'\nvalueset &quot;Encounter Inpatient&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307'\nvalueset &quot;Glucose Lab Test Mass Per Volume&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.34'\nvalueset &quot;Hypoglycemics Treatment Medications&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1196.394'\n\nparameter &quot;Measurement Period&quot; Interval&lt;DateTime&gt;\n  default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)\n\ncontext Patient\n\ndefine &quot;Comfort Measures Care&quot;:\n  ( [&quot;Procedure&quot;: &quot;Comfort Measures&quot;] ProcedureCM\n      where ProcedureCM.status = 'completed'\n  )\n    union ( [&quot;ServiceRequest&quot;: &quot;Comfort Measures&quot;] ServiceReq\n        where ServiceReq.status in { 'active', 'completed' }\n    )\n\ndefine &quot;Days in Hospitalization&quot;:\n  &quot;Measurement Population&quot; EligibleInpatientHospitalization\n    let period: EligibleInpatientHospitalization.hospitalizationWithObservation ( ),\n    relevantPeriod: period.hospitalDaysMax10 ( )\n    return Tuple {\n      encounter: EligibleInpatientHospitalization,\n      hospitalizationPeriod: period,\n      relevantPeriod: relevantPeriod,\n      relevantDays: relevantPeriod.daysInPeriod ( )\n    }\n\ndefine &quot;Days with Glucose Results&quot;:\n  &quot;Days in Hospitalization&quot; InpatientHospitalDays\n    return Tuple {\n      encounter: InpatientHospitalDays.encounter,\n      relevantPeriod: InpatientHospitalDays.relevantPeriod,\n      relevantDays: ( InpatientHospitalDays.relevantDays EncounterDay\n          return Tuple {\n            dayNumber: EncounterDay.dayIndex,\n            dayPeriod: EncounterDay.dayPeriod,\n            hasSevereResult: exists ( [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest\n                where GlucoseTest.status in { 'final', 'amended', 'corrected' }\n                  and GlucoseTest.value &gt; 300 'mg/dL'\n                  and GlucoseTest.effective.earliest ( ) during EncounterDay.dayPeriod\n            ),\n            hasElevatedResult: exists ( [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest\n                where GlucoseTest.status in { 'final', 'amended', 'corrected' }\n                  and GlucoseTest.value &gt;= 200 'mg/dL'\n                  and GlucoseTest.effective.earliest ( ) during EncounterDay.dayPeriod\n            ),\n            hasNoGlucoseTest: not exists ( [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest\n                where GlucoseTest.status in { 'final', 'amended', 'corrected' }\n                  and GlucoseTest.effective.earliest ( ) during EncounterDay.dayPeriod\n            )\n          }\n      )\n    }\n\ndefine &quot;Days with Hyperglycemic Events&quot;:\n  &quot;Days with Glucose Results&quot; EncounterWithResultDays\n    let eligibleEventDays: EncounterWithResultDays.relevantDays EncounterDay\n      where EncounterDay.dayNumber &gt; 1\n      return Tuple {\n        dayIndex: EncounterDay.dayNumber,\n        dayPeriod: EncounterDay.dayPeriod,\n        hasHyperglycemicEvent: ( EncounterDay.hasSevereResult\n            or ( EncounterDay.hasNoGlucoseTest\n                and EncounterWithResultDays.relevantDays[EncounterDay.dayNumber - 2].hasElevatedResult\n                and EncounterWithResultDays.relevantDays[EncounterDay.dayNumber - 3].hasElevatedResult\n            )\n        )\n      }\n    return Tuple {\n      encounter: EncounterWithResultDays.encounter,\n      relevantPeriod: EncounterWithResultDays.relevantPeriod,\n      eligibleEventDays: eligibleEventDays\n    }\n\ndefine &quot;Denominator&quot;:\n  &quot;Initial Population&quot;\n\ndefine &quot;Denominator Exclusions&quot;:\n  &quot;Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care&quot;\n\ndefine &quot;Encounter with Comfort Measures during Hospitalization&quot;:\n  &quot;Initial Population&quot; InpatientHospitalization\n    with &quot;Comfort Measures Care&quot; ComfortCare\n      such that Coalesce(ComfortCare.performed.toInterval(), ComfortCare.authoredOn.toInterval()) starts during InpatientHospitalization.hospitalizationWithObservation ( )\n\ndefine &quot;Encounter with Discharge for Hospice Care&quot;:\n  &quot;Initial Population&quot; InpatientHospitalization\n    where InpatientHospitalization.hospitalization.dischargeDisposition in &quot;Discharged to Home for Hospice Care&quot;\n      or InpatientHospitalization.hospitalization.dischargeDisposition in &quot;Discharged to Health Care Facility for Hospice Care&quot;\n\ndefine &quot;Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care&quot;:\n  &quot;Encounter with Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;\n    union &quot;Encounter with Comfort Measures during Hospitalization&quot;\n    union &quot;Encounter with Discharge for Hospice Care&quot;\n\ndefine &quot;Encounter with Elevated Glucose Greater Than or Equal to 200&quot;:\n  &quot;Encounter with Hospitalization Period&quot; Hospitalization\n    with [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest\n      such that GlucoseTest.effective.earliest ( ) during Hospitalization.hospitalizationPeriod\n        and GlucoseTest.status in { 'final', 'amended', 'corrected' }\n        and GlucoseTest.value &gt;= 200 'mg/dL'\n    return Hospitalization.encounter\n\ndefine &quot;Encounter with Existing Diabetes Diagnosis&quot;:\n  &quot;Encounter with Hospitalization Period&quot; Hospitalization\n    with ( ( [ConditionEncounterDiagnosis: &quot;Diabetes&quot;] DiabetesEncounter\n        where ( Hospitalization.encounter.reasonReference.references ( DiabetesEncounter )\n            or Hospitalization.encounter.reasonCode in &quot;Diabetes&quot;\n        )\n          and DiabetesEncounter.prevalenceInterval ( ) starts before end of Hospitalization.hospitalizationPeriod\n    )\n      union ( [ConditionProblemsHealthConcerns: &quot;Diabetes&quot;] DiabetesProblem\n          where DiabetesProblem.verificationStatus is not null implies ( DiabetesProblem.verificationStatus ~ Status.&quot;confirmed&quot;\n              or DiabetesProblem.verificationStatus ~ Status.&quot;unconfirmed&quot;\n              or DiabetesProblem.verificationStatus ~ Status.&quot;provisional&quot;\n              or DiabetesProblem.verificationStatus ~ Status.&quot;differential&quot;\n          )\n            and DiabetesProblem.prevalenceInterval ( ) starts before end of Hospitalization.hospitalizationPeriod\n      ) ) DiabetesCondition\n      such that DiabetesCondition.subject.reference = Hospitalization.encounter.subject.reference\n    return Hospitalization.encounter\n\ndefine &quot;Encounter with Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;:\n  from\n    &quot;Initial Population&quot; InpatientHospitalization,\n    &quot;Initial Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot; EarlyGlucoseResult\n    where EarlyGlucoseResult.value as Quantity &gt; 600 'mg/dL'\n      and EarlyGlucoseResult.status in { 'final', 'amended', 'corrected' }\n      and EarlyGlucoseResult.effective.earliest ( ) during Interval[( start of InpatientHospitalization.hospitalizationWithObservation ( ) - 1 hour ), ( start of InpatientHospitalization.hospitalizationWithObservation ( ) + 6 hours )]\n    return InpatientHospitalization\n\ndefine &quot;Encounter with Hospitalization Period&quot;:\n  &quot;Qualifying Encounter&quot; QualifyingHospitalization\n    return Tuple {\n      encounter: QualifyingHospitalization,\n      hospitalizationPeriod: QualifyingHospitalization.hospitalizationWithObservation ( )\n    }\n\ndefine &quot;Encounter with Hyperglycemic Events&quot;:\n  &quot;Days with Hyperglycemic Events&quot; HyperglycemicEventDays\n    where exists ( HyperglycemicEventDays.eligibleEventDays EligibleEventDay\n        where EligibleEventDay.hasHyperglycemicEvent\n    )\n    return HyperglycemicEventDays.encounter\n\ndefine &quot;Encounter with Hypoglycemic Medication&quot;:\n  from\n    &quot;Encounter with Hospitalization Period&quot; Hospitalization,\n    [&quot;MedicationAdministration&quot;: &quot;Hypoglycemics Treatment Medications&quot;] HypoglycemicMed\n    where HypoglycemicMed.status in { 'completed', 'in-progress' }\n      and HypoglycemicMed.effective.toInterval ( ) during Hospitalization.hospitalizationPeriod\n    return Hospitalization.encounter\n\ndefine &quot;Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;:\n  from\n    &quot;Initial Population&quot; InpatientHospitalization,\n    [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] GlucoseTest\n    let HospitalizationInterval: InpatientHospitalization.hospitalizationWithObservation ( ),\n    GlucoseTestTime: GlucoseTest.effective.earliest ( )\n    where GlucoseTest.value as Quantity &gt; 600 'mg/dL'\n      and GlucoseTest.status in { 'final', 'amended', 'corrected' }\n      and GlucoseTestTime during Interval[( start of HospitalizationInterval - 1 hour ), ( start of HospitalizationInterval + 6 hours )]\n    return GlucoseTest\n\ndefine &quot;Glucose Tests Earlier Than Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;:\n  from\n    &quot;Initial Population&quot; InpatientHospitalization,\n    &quot;Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot; GlucoseResult600,\n    [&quot;LaboratoryResultObservation&quot;: &quot;Glucose Lab Test Mass Per Volume&quot;] EarlierGlucoseTest\n    let HospitalizationInterval: InpatientHospitalization.hospitalizationWithObservation ( ),\n    GlucoseTest600Time: GlucoseResult600.effective.earliest ( ),\n    EarlierGlucoseTestTime: EarlierGlucoseTest.effective.earliest ( )\n    where GlucoseTest600Time during Interval[( start of HospitalizationInterval - 1 hour ), ( start of HospitalizationInterval + 6 hour )]\n      and EarlierGlucoseTestTime during Interval[( start of HospitalizationInterval - 1 hour ), GlucoseTest600Time )\n      and EarlierGlucoseTest.id !~ GlucoseResult600.id\n    return GlucoseResult600\n\ndefine &quot;Initial Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;:\n  &quot;Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot; GlucoseResult600\n    where not ( GlucoseResult600.id in &quot;Glucose Tests Earlier Than Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start&quot;.id )\n\ndefine &quot;Initial Population&quot;:\n  &quot;Encounter with Existing Diabetes Diagnosis&quot;\n    union &quot;Encounter with Hypoglycemic Medication&quot;\n    union &quot;Encounter with Elevated Glucose Greater Than or Equal to 200&quot;\n\ndefine &quot;Measurement Population&quot;:\n  &quot;Denominator&quot;\n\ndefine &quot;Numerator&quot;:\n  &quot;Encounter with Hyperglycemic Events&quot;\n\ndefine &quot;Numerator Exclusions&quot;:\n  &quot;Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care&quot;\n\ndefine &quot;Qualifying Encounter&quot;:\n  [&quot;Encounter&quot;: &quot;Encounter Inpatient&quot;] InpatientEncounter\n    where AgeInYearsAt(date from start of InpatientEncounter.period) &gt;= 18\n      and InpatientEncounter.period ends during day of &quot;Measurement Period&quot;\n      and InpatientEncounter.status = 'finished'\n\ndefine &quot;SDE Ethnicity&quot;:\n  SDE.&quot;SDE Ethnicity&quot;\n\ndefine &quot;SDE Payer&quot;:\n  SDE.&quot;SDE Payer&quot;\n\ndefine &quot;SDE Race&quot;:\n  SDE.&quot;SDE Race&quot;\n\ndefine &quot;SDE Sex&quot;:\n  SDE.&quot;SDE Sex&quot;\n\ndefine fluent function hospitalDaysMax10(Period Interval&lt;DateTime&gt;):\n  Interval[start of Period, Min({ \n    end of Period, start of Period + 10 days }\n  )]\n\ndefine function &quot;Denominator Observations&quot;(QualifyingEncounter Encounter):\n  if QualifyingEncounter.id in &quot;Denominator Exclusions&quot;.id then singleton from ( &quot;Days with Hyperglycemic Events&quot; EncounterWithEventDays\n      where EncounterWithEventDays.encounter = QualifyingEncounter\n      return 0\n  ) \n    else singleton from ( &quot;Days with Hyperglycemic Events&quot; EncounterWithEventDays\n      where EncounterWithEventDays.encounter = QualifyingEncounter\n      return Count(EncounterWithEventDays.eligibleEventDays)\n  )\n\ndefine function &quot;Numerator Observations&quot;(QualifyingEncounter Encounter):\n  if QualifyingEncounter.id in &quot;Denominator Exclusions&quot;.id then singleton from ( &quot;Days with Hyperglycemic Events&quot; EncounterWithEventDays\n      where EncounterWithEventDays.encounter = QualifyingEncounter\n      return 0\n  ) \n    else singleton from ( &quot;Days with Hyperglycemic Events&quot; EncounterWithEventDays\n      where EncounterWithEventDays.encounter = QualifyingEncounter\n      return Count(EncounterWithEventDays.eligibleEventDays EligibleEventDay\n          where EligibleEventDay.hasHyperglycemicEvent\n      )\n  )</code></pre>\n      </td>\n    </tr>\n    \n  \n\n\n\n<tr>\n  <th colspan=\"2\" scope=\"row\" class=\"row-header\">Generated using version 0.5.6 of the sample-content-ig Liquid templates</th>\n</tr>\n\n    </tbody>\n  </table>\n</div>"
  },
  "extension" : [
    {
      "url" : "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-softwaresystem",
      "valueReference" : {
        "reference" : "Device/cqf-tooling"
      }
    }
  ],
  "url" : "https://madie.cms.gov/Library/CMS871FHIRHHHyper",
  "version" : "1.1.000",
  "name" : "CMS871FHIRHHHyper",
  "status" : "draft",
  "type" : {
    "coding" : [
      {
        "system" : "http://terminology.hl7.org/CodeSystem/library-type",
        "code" : "logic-library"
      }
    ]
  },
  "date" : "2026-09-19T16:31:14+00:00",
  "content" : [
    {
      "contentType" : "text/cql",
      "data" : "LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVM4NzFGSElSSEhIeXBlciB2ZXJzaW9uICcxLjEuMDAwJwoKdXNpbmcgVVNRdWFsaXR5Q29yZSB2ZXJzaW9uICcwLjEuMC1jaWJ1aWxkJwp1c2luZyBVU0NvcmUgdmVyc2lvbiAnNi4xLjAtZGVyaXZlZCcKdXNpbmcgRkhJUiB2ZXJzaW9uICc0LjAuMScKCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJIZWxwZXJzIHZlcnNpb24gJzQuMC4xJyBjYWxsZWQgRkhJUkhlbHBlcnMKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkNvbW1vbiB2ZXJzaW9uICcyLjAuMCcgY2FsbGVkIEZISVJDb21tb24KaW5jbHVkZSBobDcuZmhpci51cy5jcWwuVVNDb3JlQ29tbW9uIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIFVTQ29yZUNvbW1vbgppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5VU0NvcmVFbGVtZW50cyB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvcmVFbGVtZW50cwoKaW5jbHVkZSBDUU1Db21tb24gdmVyc2lvbiAnNS4xLjAwMCcgY2FsbGVkIENRTUNvbW1vbgppbmNsdWRlIFVTUXVhbGl0eUNvcmVDb21tb24gdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcgY2FsbGVkIFVTUXVhbGl0eUNvcmVDb21tb24KaW5jbHVkZSBTdXBwbGVtZW50YWxEYXRhRWxlbWVudHMgdmVyc2lvbiAnNi4xLjAwMCcgY2FsbGVkIFNERQppbmNsdWRlIFN0YXR1cyB2ZXJzaW9uICcyLjEuMDAwJyBjYWxsZWQgU3RhdHVzCgp2YWx1ZXNldCAiQ29tZm9ydCBNZWFzdXJlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMS4zLjYuMS40LjEuMzM4OTUuMS4zLjAuNDUnCnZhbHVlc2V0ICJEaWFiZXRlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDMuMTIuMTAwMScKdmFsdWVzZXQgIkRpc2NoYXJnZWQgdG8gSGVhbHRoIENhcmUgRmFjaWxpdHkgZm9yIEhvc3BpY2UgQ2FyZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjA3Jwp2YWx1ZXNldCAiRGlzY2hhcmdlZCB0byBIb21lIGZvciBIb3NwaWNlIENhcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIwOScKdmFsdWVzZXQgIkVuY291bnRlciBJbnBhdGllbnQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNjY2LjUuMzA3Jwp2YWx1ZXNldCAiR2x1Y29zZSBMYWIgVGVzdCBNYXNzIFBlciBWb2x1bWUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjM0Jwp2YWx1ZXNldCAiSHlwb2dseWNlbWljcyBUcmVhdG1lbnQgTWVkaWNhdGlvbnMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMTk2LjM5NCcKCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlVGltZT4KICBkZWZhdWx0IEludGVydmFsW0AyMDI2LTAxLTAxVDAwOjAwOjAwLjAwMFosIEAyMDI3LTAxLTAxVDAwOjAwOjAwLjAwMFopCgpjb250ZXh0IFBhdGllbnQKCmRlZmluZSAiQ29tZm9ydCBNZWFzdXJlcyBDYXJlIjoKICAoIFsiUHJvY2VkdXJlIjogIkNvbWZvcnQgTWVhc3VyZXMiXSBQcm9jZWR1cmVDTQogICAgICB3aGVyZSBQcm9jZWR1cmVDTS5zdGF0dXMgPSAnY29tcGxldGVkJwogICkKICAgIHVuaW9uICggWyJTZXJ2aWNlUmVxdWVzdCI6ICJDb21mb3J0IE1lYXN1cmVzIl0gU2VydmljZVJlcQogICAgICAgIHdoZXJlIFNlcnZpY2VSZXEuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICkKCmRlZmluZSAiRGF5cyBpbiBIb3NwaXRhbGl6YXRpb24iOgogICJNZWFzdXJlbWVudCBQb3B1bGF0aW9uIiBFbGlnaWJsZUlucGF0aWVudEhvc3BpdGFsaXphdGlvbgogICAgbGV0IHBlcmlvZDogRWxpZ2libGVJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24uaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKSwKICAgIHJlbGV2YW50UGVyaW9kOiBwZXJpb2QuaG9zcGl0YWxEYXlzTWF4MTAgKCApCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXI6IEVsaWdpYmxlSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLAogICAgICBob3NwaXRhbGl6YXRpb25QZXJpb2Q6IHBlcmlvZCwKICAgICAgcmVsZXZhbnRQZXJpb2Q6IHJlbGV2YW50UGVyaW9kLAogICAgICByZWxldmFudERheXM6IHJlbGV2YW50UGVyaW9kLmRheXNJblBlcmlvZCAoICkKICAgIH0KCmRlZmluZSAiRGF5cyB3aXRoIEdsdWNvc2UgUmVzdWx0cyI6CiAgIkRheXMgaW4gSG9zcGl0YWxpemF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbERheXMKICAgIHJldHVybiBUdXBsZSB7CiAgICAgIGVuY291bnRlcjogSW5wYXRpZW50SG9zcGl0YWxEYXlzLmVuY291bnRlciwKICAgICAgcmVsZXZhbnRQZXJpb2Q6IElucGF0aWVudEhvc3BpdGFsRGF5cy5yZWxldmFudFBlcmlvZCwKICAgICAgcmVsZXZhbnREYXlzOiAoIElucGF0aWVudEhvc3BpdGFsRGF5cy5yZWxldmFudERheXMgRW5jb3VudGVyRGF5CiAgICAgICAgICByZXR1cm4gVHVwbGUgewogICAgICAgICAgICBkYXlOdW1iZXI6IEVuY291bnRlckRheS5kYXlJbmRleCwKICAgICAgICAgICAgZGF5UGVyaW9kOiBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kLAogICAgICAgICAgICBoYXNTZXZlcmVSZXN1bHQ6IGV4aXN0cyAoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gR2x1Y29zZVRlc3QKICAgICAgICAgICAgICAgIHdoZXJlIEdsdWNvc2VUZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgICAgICAgICAgICBhbmQgR2x1Y29zZVRlc3QudmFsdWUgPiAzMDAgJ21nL2RMJwogICAgICAgICAgICAgICAgICBhbmQgR2x1Y29zZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSBkdXJpbmcgRW5jb3VudGVyRGF5LmRheVBlcmlvZAogICAgICAgICAgICApLAogICAgICAgICAgICBoYXNFbGV2YXRlZFJlc3VsdDogZXhpc3RzICggWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiR2x1Y29zZSBMYWIgVGVzdCBNYXNzIFBlciBWb2x1bWUiXSBHbHVjb3NlVGVzdAogICAgICAgICAgICAgICAgd2hlcmUgR2x1Y29zZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgICAgICAgICAgIGFuZCBHbHVjb3NlVGVzdC52YWx1ZSA+PSAyMDAgJ21nL2RMJwogICAgICAgICAgICAgICAgICBhbmQgR2x1Y29zZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSBkdXJpbmcgRW5jb3VudGVyRGF5LmRheVBlcmlvZAogICAgICAgICAgICApLAogICAgICAgICAgICBoYXNOb0dsdWNvc2VUZXN0OiBub3QgZXhpc3RzICggWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiR2x1Y29zZSBMYWIgVGVzdCBNYXNzIFBlciBWb2x1bWUiXSBHbHVjb3NlVGVzdAogICAgICAgICAgICAgICAgd2hlcmUgR2x1Y29zZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgICAgICAgICAgIGFuZCBHbHVjb3NlVGVzdC5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kCiAgICAgICAgICAgICkKICAgICAgICAgIH0KICAgICAgKQogICAgfQoKZGVmaW5lICJEYXlzIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiOgogICJEYXlzIHdpdGggR2x1Y29zZSBSZXN1bHRzIiBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cwogICAgbGV0IGVsaWdpYmxlRXZlbnREYXlzOiBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cy5yZWxldmFudERheXMgRW5jb3VudGVyRGF5CiAgICAgIHdoZXJlIEVuY291bnRlckRheS5kYXlOdW1iZXIgPiAxCiAgICAgIHJldHVybiBUdXBsZSB7CiAgICAgICAgZGF5SW5kZXg6IEVuY291bnRlckRheS5kYXlOdW1iZXIsCiAgICAgICAgZGF5UGVyaW9kOiBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kLAogICAgICAgIGhhc0h5cGVyZ2x5Y2VtaWNFdmVudDogKCBFbmNvdW50ZXJEYXkuaGFzU2V2ZXJlUmVzdWx0CiAgICAgICAgICAgIG9yICggRW5jb3VudGVyRGF5Lmhhc05vR2x1Y29zZVRlc3QKICAgICAgICAgICAgICAgIGFuZCBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cy5yZWxldmFudERheXNbRW5jb3VudGVyRGF5LmRheU51bWJlciAtIDJdLmhhc0VsZXZhdGVkUmVzdWx0CiAgICAgICAgICAgICAgICBhbmQgRW5jb3VudGVyV2l0aFJlc3VsdERheXMucmVsZXZhbnREYXlzW0VuY291bnRlckRheS5kYXlOdW1iZXIgLSAzXS5oYXNFbGV2YXRlZFJlc3VsdAogICAgICAgICAgICApCiAgICAgICAgKQogICAgICB9CiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXI6IEVuY291bnRlcldpdGhSZXN1bHREYXlzLmVuY291bnRlciwKICAgICAgcmVsZXZhbnRQZXJpb2Q6IEVuY291bnRlcldpdGhSZXN1bHREYXlzLnJlbGV2YW50UGVyaW9kLAogICAgICBlbGlnaWJsZUV2ZW50RGF5czogZWxpZ2libGVFdmVudERheXMKICAgIH0KCmRlZmluZSAiRGVub21pbmF0b3IiOgogICJJbml0aWFsIFBvcHVsYXRpb24iCgpkZWZpbmUgIkRlbm9taW5hdG9yIEV4Y2x1c2lvbnMiOgogICJFbmNvdW50ZXIgd2l0aCBFYXJseSBHbHVjb3NlIEdyZWF0ZXIgVGhhbiA2MDAgb3Igd2l0aCBDb21mb3J0IG9yIEhvc3BpY2UgQ2FyZSIKCmRlZmluZSAiRW5jb3VudGVyIHdpdGggQ29tZm9ydCBNZWFzdXJlcyBkdXJpbmcgSG9zcGl0YWxpemF0aW9uIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24KICAgIHdpdGggIkNvbWZvcnQgTWVhc3VyZXMgQ2FyZSIgQ29tZm9ydENhcmUKICAgICAgc3VjaCB0aGF0IENvYWxlc2NlKENvbWZvcnRDYXJlLnBlcmZvcm1lZC50b0ludGVydmFsKCksIENvbWZvcnRDYXJlLmF1dGhvcmVkT24udG9JbnRlcnZhbCgpKSBzdGFydHMgZHVyaW5nIElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCgpkZWZpbmUgIkVuY291bnRlciB3aXRoIERpc2NoYXJnZSBmb3IgSG9zcGljZSBDYXJlIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24KICAgIHdoZXJlIElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb24uZGlzY2hhcmdlRGlzcG9zaXRpb24gaW4gIkRpc2NoYXJnZWQgdG8gSG9tZSBmb3IgSG9zcGljZSBDYXJlIgogICAgICBvciBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24uaG9zcGl0YWxpemF0aW9uLmRpc2NoYXJnZURpc3Bvc2l0aW9uIGluICJEaXNjaGFyZ2VkIHRvIEhlYWx0aCBDYXJlIEZhY2lsaXR5IGZvciBIb3NwaWNlIENhcmUiCgpkZWZpbmUgIkVuY291bnRlciB3aXRoIEVhcmx5IEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCBvciB3aXRoIENvbWZvcnQgb3IgSG9zcGljZSBDYXJlIjoKICAiRW5jb3VudGVyIHdpdGggR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0IgogICAgdW5pb24gIkVuY291bnRlciB3aXRoIENvbWZvcnQgTWVhc3VyZXMgZHVyaW5nIEhvc3BpdGFsaXphdGlvbiIKICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBEaXNjaGFyZ2UgZm9yIEhvc3BpY2UgQ2FyZSIKCmRlZmluZSAiRW5jb3VudGVyIHdpdGggRWxldmF0ZWQgR2x1Y29zZSBHcmVhdGVyIFRoYW4gb3IgRXF1YWwgdG8gMjAwIjoKICAiRW5jb3VudGVyIHdpdGggSG9zcGl0YWxpemF0aW9uIFBlcmlvZCIgSG9zcGl0YWxpemF0aW9uCiAgICB3aXRoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gR2x1Y29zZVRlc3QKICAgICAgc3VjaCB0aGF0IEdsdWNvc2VUZXN0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICkgZHVyaW5nIEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25QZXJpb2QKICAgICAgICBhbmQgR2x1Y29zZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIEdsdWNvc2VUZXN0LnZhbHVlID49IDIwMCAnbWcvZEwnCiAgICByZXR1cm4gSG9zcGl0YWxpemF0aW9uLmVuY291bnRlcgoKZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBFeGlzdGluZyBEaWFiZXRlcyBEaWFnbm9zaXMiOgogICJFbmNvdW50ZXIgd2l0aCBIb3NwaXRhbGl6YXRpb24gUGVyaW9kIiBIb3NwaXRhbGl6YXRpb24KICAgIHdpdGggKCAoIFtDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXM6ICJEaWFiZXRlcyJdIERpYWJldGVzRW5jb3VudGVyCiAgICAgICAgd2hlcmUgKCBIb3NwaXRhbGl6YXRpb24uZW5jb3VudGVyLnJlYXNvblJlZmVyZW5jZS5yZWZlcmVuY2VzICggRGlhYmV0ZXNFbmNvdW50ZXIgKQogICAgICAgICAgICBvciBIb3NwaXRhbGl6YXRpb24uZW5jb3VudGVyLnJlYXNvbkNvZGUgaW4gIkRpYWJldGVzIgogICAgICAgICkKICAgICAgICAgIGFuZCBEaWFiZXRlc0VuY291bnRlci5wcmV2YWxlbmNlSW50ZXJ2YWwgKCApIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25QZXJpb2QKICAgICkKICAgICAgdW5pb24gKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkRpYWJldGVzIl0gRGlhYmV0ZXNQcm9ibGVtCiAgICAgICAgICB3aGVyZSBEaWFiZXRlc1Byb2JsZW0udmVyaWZpY2F0aW9uU3RhdHVzIGlzIG5vdCBudWxsIGltcGxpZXMgKCBEaWFiZXRlc1Byb2JsZW0udmVyaWZpY2F0aW9uU3RhdHVzIH4gU3RhdHVzLiJjb25maXJtZWQiCiAgICAgICAgICAgICAgb3IgRGlhYmV0ZXNQcm9ibGVtLnZlcmlmaWNhdGlvblN0YXR1cyB+IFN0YXR1cy4idW5jb25maXJtZWQiCiAgICAgICAgICAgICAgb3IgRGlhYmV0ZXNQcm9ibGVtLnZlcmlmaWNhdGlvblN0YXR1cyB+IFN0YXR1cy4icHJvdmlzaW9uYWwiCiAgICAgICAgICAgICAgb3IgRGlhYmV0ZXNQcm9ibGVtLnZlcmlmaWNhdGlvblN0YXR1cyB+IFN0YXR1cy4iZGlmZmVyZW50aWFsIgogICAgICAgICAgKQogICAgICAgICAgICBhbmQgRGlhYmV0ZXNQcm9ibGVtLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgc3RhcnRzIGJlZm9yZSBlbmQgb2YgSG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvblBlcmlvZAogICAgICApICkgRGlhYmV0ZXNDb25kaXRpb24KICAgICAgc3VjaCB0aGF0IERpYWJldGVzQ29uZGl0aW9uLnN1YmplY3QucmVmZXJlbmNlID0gSG9zcGl0YWxpemF0aW9uLmVuY291bnRlci5zdWJqZWN0LnJlZmVyZW5jZQogICAgcmV0dXJuIEhvc3BpdGFsaXphdGlvbi5lbmNvdW50ZXIKCmRlZmluZSAiRW5jb3VudGVyIHdpdGggR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0IjoKICBmcm9tCiAgICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24sCiAgICAiSW5pdGlhbCBHbHVjb3NlIEdyZWF0ZXIgVGhhbiA2MDAgd2l0aGluIDEgSG91ciBQcmlvciBUbyBhbmQgNiBIb3VycyBBZnRlciBFbmNvdW50ZXIgU3RhcnQiIEVhcmx5R2x1Y29zZVJlc3VsdAogICAgd2hlcmUgRWFybHlHbHVjb3NlUmVzdWx0LnZhbHVlIGFzIFF1YW50aXR5ID4gNjAwICdtZy9kTCcKICAgICAgYW5kIEVhcmx5R2x1Y29zZVJlc3VsdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgYW5kIEVhcmx5R2x1Y29zZVJlc3VsdC5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBJbnRlcnZhbFsoIHN0YXJ0IG9mIElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApIC0gMSBob3VyICksICggc3RhcnQgb2YgSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkgKyA2IGhvdXJzICldCiAgICByZXR1cm4gSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uCgpkZWZpbmUgIkVuY291bnRlciB3aXRoIEhvc3BpdGFsaXphdGlvbiBQZXJpb2QiOgogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgUXVhbGlmeWluZ0hvc3BpdGFsaXphdGlvbgogICAgcmV0dXJuIFR1cGxlIHsKICAgICAgZW5jb3VudGVyOiBRdWFsaWZ5aW5nSG9zcGl0YWxpemF0aW9uLAogICAgICBob3NwaXRhbGl6YXRpb25QZXJpb2Q6IFF1YWxpZnlpbmdIb3NwaXRhbGl6YXRpb24uaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQogICAgfQoKZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyI6CiAgIkRheXMgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyIgSHlwZXJnbHljZW1pY0V2ZW50RGF5cwogICAgd2hlcmUgZXhpc3RzICggSHlwZXJnbHljZW1pY0V2ZW50RGF5cy5lbGlnaWJsZUV2ZW50RGF5cyBFbGlnaWJsZUV2ZW50RGF5CiAgICAgICAgd2hlcmUgRWxpZ2libGVFdmVudERheS5oYXNIeXBlcmdseWNlbWljRXZlbnQKICAgICkKICAgIHJldHVybiBIeXBlcmdseWNlbWljRXZlbnREYXlzLmVuY291bnRlcgoKZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBIeXBvZ2x5Y2VtaWMgTWVkaWNhdGlvbiI6CiAgZnJvbQogICAgIkVuY291bnRlciB3aXRoIEhvc3BpdGFsaXphdGlvbiBQZXJpb2QiIEhvc3BpdGFsaXphdGlvbiwKICAgIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIkh5cG9nbHljZW1pY3MgVHJlYXRtZW50IE1lZGljYXRpb25zIl0gSHlwb2dseWNlbWljTWVkCiAgICB3aGVyZSBIeXBvZ2x5Y2VtaWNNZWQuc3RhdHVzIGluIHsgJ2NvbXBsZXRlZCcsICdpbi1wcm9ncmVzcycgfQogICAgICBhbmQgSHlwb2dseWNlbWljTWVkLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBkdXJpbmcgSG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvblBlcmlvZAogICAgcmV0dXJuIEhvc3BpdGFsaXphdGlvbi5lbmNvdW50ZXIKCmRlZmluZSAiR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0IjoKICBmcm9tCiAgICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24sCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJHbHVjb3NlIExhYiBUZXN0IE1hc3MgUGVyIFZvbHVtZSJdIEdsdWNvc2VUZXN0CiAgICBsZXQgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWw6IElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApLAogICAgR2x1Y29zZVRlc3RUaW1lOiBHbHVjb3NlVGVzdC5lZmZlY3RpdmUuZWFybGllc3QgKCApCiAgICB3aGVyZSBHbHVjb3NlVGVzdC52YWx1ZSBhcyBRdWFudGl0eSA+IDYwMCAnbWcvZEwnCiAgICAgIGFuZCBHbHVjb3NlVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgYW5kIEdsdWNvc2VUZXN0VGltZSBkdXJpbmcgSW50ZXJ2YWxbKCBzdGFydCBvZiBIb3NwaXRhbGl6YXRpb25JbnRlcnZhbCAtIDEgaG91ciApLCAoIHN0YXJ0IG9mIEhvc3BpdGFsaXphdGlvbkludGVydmFsICsgNiBob3VycyApXQogICAgcmV0dXJuIEdsdWNvc2VUZXN0CgpkZWZpbmUgIkdsdWNvc2UgVGVzdHMgRWFybGllciBUaGFuIEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCI6CiAgZnJvbQogICAgIkluaXRpYWwgUG9wdWxhdGlvbiIgSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLAogICAgIkdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCIgR2x1Y29zZVJlc3VsdDYwMCwKICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gRWFybGllckdsdWNvc2VUZXN0CiAgICBsZXQgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWw6IElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApLAogICAgR2x1Y29zZVRlc3Q2MDBUaW1lOiBHbHVjb3NlUmVzdWx0NjAwLmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksCiAgICBFYXJsaWVyR2x1Y29zZVRlc3RUaW1lOiBFYXJsaWVyR2x1Y29zZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKQogICAgd2hlcmUgR2x1Y29zZVRlc3Q2MDBUaW1lIGR1cmluZyBJbnRlcnZhbFsoIHN0YXJ0IG9mIEhvc3BpdGFsaXphdGlvbkludGVydmFsIC0gMSBob3VyICksICggc3RhcnQgb2YgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWwgKyA2IGhvdXIgKV0KICAgICAgYW5kIEVhcmxpZXJHbHVjb3NlVGVzdFRpbWUgZHVyaW5nIEludGVydmFsWyggc3RhcnQgb2YgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWwgLSAxIGhvdXIgKSwgR2x1Y29zZVRlc3Q2MDBUaW1lICkKICAgICAgYW5kIEVhcmxpZXJHbHVjb3NlVGVzdC5pZCAhfiBHbHVjb3NlUmVzdWx0NjAwLmlkCiAgICByZXR1cm4gR2x1Y29zZVJlc3VsdDYwMAoKZGVmaW5lICJJbml0aWFsIEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCI6CiAgIkdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCIgR2x1Y29zZVJlc3VsdDYwMAogICAgd2hlcmUgbm90ICggR2x1Y29zZVJlc3VsdDYwMC5pZCBpbiAiR2x1Y29zZSBUZXN0cyBFYXJsaWVyIFRoYW4gR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0Ii5pZCApCgpkZWZpbmUgIkluaXRpYWwgUG9wdWxhdGlvbiI6CiAgIkVuY291bnRlciB3aXRoIEV4aXN0aW5nIERpYWJldGVzIERpYWdub3NpcyIKICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBIeXBvZ2x5Y2VtaWMgTWVkaWNhdGlvbiIKICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBFbGV2YXRlZCBHbHVjb3NlIEdyZWF0ZXIgVGhhbiBvciBFcXVhbCB0byAyMDAiCgpkZWZpbmUgIk1lYXN1cmVtZW50IFBvcHVsYXRpb24iOgogICJEZW5vbWluYXRvciIKCmRlZmluZSAiTnVtZXJhdG9yIjoKICAiRW5jb3VudGVyIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiCgpkZWZpbmUgIk51bWVyYXRvciBFeGNsdXNpb25zIjoKICAiRW5jb3VudGVyIHdpdGggRWFybHkgR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIG9yIHdpdGggQ29tZm9ydCBvciBIb3NwaWNlIENhcmUiCgpkZWZpbmUgIlF1YWxpZnlpbmcgRW5jb3VudGVyIjoKICBbIkVuY291bnRlciI6ICJFbmNvdW50ZXIgSW5wYXRpZW50Il0gSW5wYXRpZW50RW5jb3VudGVyCiAgICB3aGVyZSBBZ2VJblllYXJzQXQoZGF0ZSBmcm9tIHN0YXJ0IG9mIElucGF0aWVudEVuY291bnRlci5wZXJpb2QpID49IDE4CiAgICAgIGFuZCBJbnBhdGllbnRFbmNvdW50ZXIucGVyaW9kIGVuZHMgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgSW5wYXRpZW50RW5jb3VudGVyLnN0YXR1cyA9ICdmaW5pc2hlZCcKCmRlZmluZSAiU0RFIEV0aG5pY2l0eSI6CiAgU0RFLiJTREUgRXRobmljaXR5IgoKZGVmaW5lICJTREUgUGF5ZXIiOgogIFNERS4iU0RFIFBheWVyIgoKZGVmaW5lICJTREUgUmFjZSI6CiAgU0RFLiJTREUgUmFjZSIKCmRlZmluZSAiU0RFIFNleCI6CiAgU0RFLiJTREUgU2V4IgoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBob3NwaXRhbERheXNNYXgxMChQZXJpb2QgSW50ZXJ2YWw8RGF0ZVRpbWU+KToKICBJbnRlcnZhbFtzdGFydCBvZiBQZXJpb2QsIE1pbih7IAogICAgZW5kIG9mIFBlcmlvZCwgc3RhcnQgb2YgUGVyaW9kICsgMTAgZGF5cyB9CiAgKV0KCmRlZmluZSBmdW5jdGlvbiAiRGVub21pbmF0b3IgT2JzZXJ2YXRpb25zIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgaWYgUXVhbGlmeWluZ0VuY291bnRlci5pZCBpbiAiRGVub21pbmF0b3IgRXhjbHVzaW9ucyIuaWQgdGhlbiBzaW5nbGV0b24gZnJvbSAoICJEYXlzIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiIEVuY291bnRlcldpdGhFdmVudERheXMKICAgICAgd2hlcmUgRW5jb3VudGVyV2l0aEV2ZW50RGF5cy5lbmNvdW50ZXIgPSBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHJldHVybiAwCiAgKSAKICAgIGVsc2Ugc2luZ2xldG9uIGZyb20gKCAiRGF5cyB3aXRoIEh5cGVyZ2x5Y2VtaWMgRXZlbnRzIiBFbmNvdW50ZXJXaXRoRXZlbnREYXlzCiAgICAgIHdoZXJlIEVuY291bnRlcldpdGhFdmVudERheXMuZW5jb3VudGVyID0gUXVhbGlmeWluZ0VuY291bnRlcgogICAgICByZXR1cm4gQ291bnQoRW5jb3VudGVyV2l0aEV2ZW50RGF5cy5lbGlnaWJsZUV2ZW50RGF5cykKICApCgpkZWZpbmUgZnVuY3Rpb24gIk51bWVyYXRvciBPYnNlcnZhdGlvbnMiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBpZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkIGluICJEZW5vbWluYXRvciBFeGNsdXNpb25zIi5pZCB0aGVuIHNpbmdsZXRvbiBmcm9tICggIkRheXMgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyIgRW5jb3VudGVyV2l0aEV2ZW50RGF5cwogICAgICB3aGVyZSBFbmNvdW50ZXJXaXRoRXZlbnREYXlzLmVuY291bnRlciA9IFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgcmV0dXJuIDAKICApIAogICAgZWxzZSBzaW5nbGV0b24gZnJvbSAoICJEYXlzIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiIEVuY291bnRlcldpdGhFdmVudERheXMKICAgICAgd2hlcmUgRW5jb3VudGVyV2l0aEV2ZW50RGF5cy5lbmNvdW50ZXIgPSBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHJldHVybiBDb3VudChFbmNvdW50ZXJXaXRoRXZlbnREYXlzLmVsaWdpYmxlRXZlbnREYXlzIEVsaWdpYmxlRXZlbnREYXkKICAgICAgICAgIHdoZXJlIEVsaWdpYmxlRXZlbnREYXkuaGFzSHlwZXJnbHljZW1pY0V2ZW50CiAgICAgICkKICAp",
      "url" : "https://madie.cms.gov/Library-CMS871FHIRHHHyper.cql"
    }
  ]
}