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

: CMS145FHIRCADBBlockerTPMIorLVSD - JSON Representation

Draft as of 2026-09-19

Raw json | Download

{
  "resourceType" : "Library",
  "id" : "CMS145FHIRCADBBlockerTPMIorLVSD",
  "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.0.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\">library CMS145FHIRCADBBlockerTPMIorLVSD version '1.0.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 SupplementalDataElements version '6.1.000' called SDE\ninclude AHAOverall version '5.1.000' called AHA\n\ncodesystem &quot;SNOMEDCT&quot;: 'http://snomed.info/sct'\n\nvalueset &quot;Allergy to Beta Blocker Therapy&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1177'\nvalueset &quot;Arrhythmia&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.366'\nvalueset &quot;Asthma&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.362'\nvalueset &quot;Atrioventricular Block&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.367'\nvalueset &quot;Beta Blocker Therapy&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1174'\nvalueset &quot;Beta Blocker Therapy for LVSD&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1184'\nvalueset &quot;Beta Blocker Therapy Ingredient&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1493'\nvalueset &quot;Bradycardia&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.412'\nvalueset &quot;Cardiac Pacer&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1178.53'\nvalueset &quot;Cardiac Pacer in Situ&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.368'\nvalueset &quot;Cardiac Surgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.371'\nvalueset &quot;Care Services in Long Term Residential Facility&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1014'\nvalueset &quot;Coronary Artery Disease No MI&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.369'\nvalueset &quot;Ejection Fraction&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1134'\nvalueset &quot;Face-to-Face Interaction&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1048'\nvalueset &quot;Home Healthcare Services&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1016'\nvalueset &quot;Hypotension&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.370'\nvalueset &quot;Intolerance to Beta Blocker Therapy&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1178'\nvalueset &quot;Medical Reason&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1007'\nvalueset &quot;Moderate or Severe&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1092'\nvalueset &quot;Moderate or Severe LVSD&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1090'\nvalueset &quot;Myocardial Infarction&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.403'\nvalueset &quot;Nursing Facility Visit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1012'\nvalueset &quot;Office Visit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1001'\nvalueset &quot;Outpatient Consultation&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1008'\nvalueset &quot;Patient Provider Interaction&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1012'\nvalueset &quot;Patient Reason&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1008'\n// TODO: Remove this value set reference since it is not referenced in the logic\nvalueset &quot;System Reason&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1009'\n\ncode &quot;Substance with beta adrenergic receptor antagonist mechanism of action (substance)&quot;: '373254001' from &quot;SNOMEDCT&quot; display 'Substance with beta adrenergic receptor antagonist mechanism of action (substance)'\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;Denominator 2&quot;:\n  &quot;Initial Population&quot;\n    and exists &quot;Qualifying CAD Encounter and Prior MI&quot;\n\ndefine &quot;Has Atrioventricular Block with Qualifying CAD Encounter and Prior MI without Cardiac Pacer&quot;:\n  &quot;Has Atrioventricular Block with Qualifying CAD Encounter and Prior MI&quot;\n    and not &quot;Has Diagnosis of Cardiac Pacer in Situ with Qualifying CAD Encounter and Prior MI&quot;\n    and not &quot;Has Cardiac Pacer Device Implanted with Qualifying CAD Encounter and Prior MI&quot;\n\n/*\n* @code: Heart rate - 8867-4\n* @profile: http://hl7.org/fhir/us/core/StructureDefinition/us-core-heart-rate \n*/\n\n\ndefine &quot;Has Consecutive Heart Rates Less than 50 with Qualifying CAD Encounter and Prior MI&quot;:\n  exists ( from\n      // TODO: Consider best practice of always qualifying type names\n      [&quot;HeartRateProfile&quot;] HeartRateExam,\n      &quot;Qualifying CAD Encounter and Prior MI&quot; CADEncounterMI\n      let PriorHeartRateExam: Last([&quot;HeartRateProfile&quot;] MostRecentPriorHeartRateExam\n          where MostRecentPriorHeartRateExam.effective.toInterval() during CADEncounterMI.period\n            and MostRecentPriorHeartRateExam.status in { 'final', 'amended', 'corrected' }\n            and MostRecentPriorHeartRateExam.effective.toInterval() before HeartRateExam.effective.toInterval()\n          sort by start of effective.toInterval()\n      )\n      where HeartRateExam.effective.toInterval ( ) during CADEncounterMI.period\n        and HeartRateExam.status in { 'final', 'amended', 'corrected' }\n        and HeartRateExam.value &lt; 50 '/min'\n        and PriorHeartRateExam.value &lt; 50 '/min'\n  )\n\ndefine &quot;Numerator 1&quot;:\n  &quot;Has Beta Blocker Therapy for LVSD Ordered&quot;\n    or &quot;Is Currently Taking Beta Blocker Therapy for LVSD&quot;\n\ndefine &quot;Numerator 2&quot;:\n  &quot;Has Beta Blocker Therapy Ordered&quot;\n    or &quot;Is Currently Taking Beta Blocker Therapy&quot;\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 &quot;Has Cardiac Pacer Device Implanted with Qualifying CAD Encounter and Prior MI&quot;:\n  exists ( [Procedure: &quot;Cardiac Pacer&quot;] ImplantedCardiacPacer\n      with &quot;Qualifying CAD Encounter and Prior MI&quot; CADEncounterMI\n        such that ImplantedCardiacPacer.performed.toInterval ( ) starts before end of CADEncounterMI.period\n          and ImplantedCardiacPacer.status = 'completed'\n  )\n\ndefine &quot;Qualifying CAD Encounter and Prior MI&quot;:\n  &quot;Qualifying CAD Encounter&quot; EncounterWithCADProxy\n    with ( [FHIR.Condition: &quot;Myocardial Infarction&quot;] ) MyocardialInfarction\n      such that MyocardialInfarction.prevalenceInterval ( ) starts 3 years or less before day of start of EncounterWithCADProxy.period\n        and not exists AHA.&quot;Moderate or Severe LVSD Findings&quot;\n        and MyocardialInfarction.isVerified ( )\n\ndefine &quot;Denominator 1&quot;:\n  &quot;Initial Population&quot;\n    and exists &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;\n\ndefine &quot;Has Atrioventricular Block with Qualifying CAD Encounter and History of Moderate or Severe LVSD without Cardiac Pacer&quot;:\n  &quot;Has Atrioventricular Block with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;\n    and not &quot;Has Diagnosis of Cardiac Pacer in Situ with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;\n    and not &quot;Has Cardiac Pacer Device Implanted with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;\n\n/*\n* @code: Heart rate - 8867-4\n* @profile: http://hl7.org/fhir/us/core/StructureDefinition/us-core-heart-rate\n*/\n\n\ndefine &quot;Has Consecutive Heart Rates Less than 50 with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:\n  exists ( from\n      [&quot;HeartRateProfile&quot;] HeartRateExam,\n      &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; CADEncounterModerateOrSevereLVSD\n      let PriorHeartRateExam: Last([&quot;HeartRateProfile&quot;] MostRecentPriorHeartRateExam\n          where MostRecentPriorHeartRateExam.effective.toInterval() during CADEncounterModerateOrSevereLVSD.period\n            and MostRecentPriorHeartRateExam.status in { 'final', 'amended', 'corrected' }\n            and MostRecentPriorHeartRateExam.effective.toInterval() before HeartRateExam.effective.toInterval()\n          sort by start of effective.toInterval()\n      )\n      where HeartRateExam.effective.toInterval ( ) during CADEncounterModerateOrSevereLVSD.period\n        and HeartRateExam.status in { 'final', 'amended', 'corrected' }\n        and HeartRateExam.value &lt; 50 '/min'\n        and PriorHeartRateExam.value &lt; 50 '/min'\n  )\n\ndefine &quot;Has Cardiac Pacer Device Implanted with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:\n  exists ( [Procedure: &quot;Cardiac Pacer&quot;] ImplantedCardiacPacer\n      with &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; CADEncounterModerateOrSevereLVSD\n        such that ImplantedCardiacPacer.performed.toInterval ( ) starts before end of CADEncounterModerateOrSevereLVSD.period\n  )\n\ndefine &quot;Has Diagnosis of Cardiac Pacer in Situ with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:\n  exists ( [ConditionProblemsHealthConcerns: &quot;Cardiac Pacer in Situ&quot;] CardiacPacerDiagnosis\n      where CardiacPacerDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )\n  )\n\ndefine &quot;Has Diagnosis of Cardiac Pacer in Situ with Qualifying CAD Encounter and Prior MI&quot;:\n  exists ( [ConditionProblemsHealthConcerns: &quot;Cardiac Pacer in Situ&quot;] CardiacPacerDiagnosis\n      where CardiacPacerDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )\n  )\n\ndefine &quot;Has Allergy or Intolerance to Beta Blocker Therapy Ingredient with Qualifying CAD Encounter and Prior MI&quot;:\n  exists ( ( [AllergyIntolerance: &quot;Beta Blocker Therapy Ingredient&quot;]\n      union [AllergyIntolerance: &quot;Substance with beta adrenergic receptor antagonist mechanism of action (substance)&quot;] ) BetaBlockerAllergyIntolerance\n      where BetaBlockerAllergyIntolerance.overlapsAfterDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )\n  )\n\ndefine &quot;Has Beta Blocker Therapy for LVSD Ordered&quot;:\n  exists ( [MedicationRequest: medication in &quot;Beta Blocker Therapy for LVSD&quot;] BetaBlockerForLVSDOrdered\n      where BetaBlockerForLVSDOrdered.authoredDuringDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )\n  )\n\ndefine &quot;Has Beta Blocker Therapy Ordered&quot;:\n  exists ( [MedicationRequest: medication in &quot;Beta Blocker Therapy&quot;] BetaBlockerOrdered\n      where BetaBlockerOrdered.authoredDuringDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )\n  )\n\ndefine &quot;Is Currently Taking Beta Blocker Therapy&quot;:\n  exists ( [MedicationRequest: medication in &quot;Beta Blocker Therapy&quot;] ActiveBetaBlocker\n      with &quot;Qualifying CAD Encounter and Prior MI&quot; CADEncounterMI\n        such that First((collapse(ActiveBetaBlocker.dosageInstruction.timing.repeat.bounds DoseTime\n              return DoseTime.toInterval()\n          )) DrugPeriod\n            sort by start of $this\n        ) overlaps after day of CADEncounterMI.period\n      where ActiveBetaBlocker.status in { 'active', 'completed' }\n        and ActiveBetaBlocker.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n  )\n\ndefine &quot;Is Currently Taking Beta Blocker Therapy for LVSD&quot;:\n  exists ( [MedicationRequest: medication in &quot;Beta Blocker Therapy for LVSD&quot;] ActiveBetaBlockerForLVSD\n      with &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; CADEncounterModerateOrSevereLVSD\n        such that First((collapse(ActiveBetaBlockerForLVSD.dosageInstruction.timing.repeat.bounds DoseTime\n              return DoseTime.toInterval()\n          )) DrugPeriod\n            sort by start of $this\n        ) overlaps after day of CADEncounterModerateOrSevereLVSD.period\n      where ActiveBetaBlockerForLVSD.status in { 'active', 'completed' }\n        and ActiveBetaBlockerForLVSD.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n  )\n\ndefine &quot;Outpatient Encounter During Measurement Period&quot;:\n  ( [Encounter: &quot;Office Visit&quot;]\n    union [Encounter: &quot;Outpatient Consultation&quot;]\n    union [Encounter: &quot;Care Services in Long Term Residential Facility&quot;]\n    union [Encounter: &quot;Home Healthcare Services&quot;]\n    union [Encounter: &quot;Nursing Facility Visit&quot;] ) QualifyingEncounter\n    where QualifyingEncounter.period during day of &quot;Measurement Period&quot;\n      and QualifyingEncounter.status = 'finished'\n\ndefine &quot;Qualifying Encounter During Measurement Period&quot;:\n  ( [Encounter: &quot;Office Visit&quot;]\n    union [Encounter: &quot;Outpatient Consultation&quot;]\n    union [Encounter: &quot;Nursing Facility Visit&quot;]\n    union [Encounter: &quot;Care Services in Long Term Residential Facility&quot;]\n    union [Encounter: &quot;Home Healthcare Services&quot;]\n    union [Encounter: &quot;Patient Provider Interaction&quot;] ) ValidEncounter\n    where ValidEncounter.period during day of &quot;Measurement Period&quot;\n      and ValidEncounter.status = 'finished'\n\ndefine &quot;Coronary Artery Disease Encounter&quot;:\n  &quot;Outpatient Encounter During Measurement Period&quot; ValidQualifyingEncounter\n    with ( [ConditionProblemsHealthConcerns: &quot;Coronary Artery Disease No MI&quot;]\n      union [ConditionEncounterDiagnosis: &quot;Coronary Artery Disease No MI&quot;] ) CoronaryArteryDisease\n      such that CoronaryArteryDisease.overlapsDayOfEncounter ( ValidQualifyingEncounter )\n\ndefine &quot;Has Arrhythmia with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:\n  exists ( [ConditionProblemsHealthConcerns: &quot;Arrhythmia&quot;] ArrhythmiaDiagnosis\n      where ArrhythmiaDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )\n  )\n\ndefine &quot;Has Arrhythmia with Qualifying CAD Encounter and Prior MI&quot;:\n  exists ( [ConditionProblemsHealthConcerns: &quot;Arrhythmia&quot;] ArrhythmiaDiagnosis\n      where ArrhythmiaDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )\n  )\n\ndefine &quot;Has Asthma with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:\n  exists ( [ConditionProblemsHealthConcerns: &quot;Asthma&quot;] AsthmaDiagnosis\n      where AsthmaDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )\n  )\n\ndefine &quot;Has Asthma with Qualifying CAD Encounter and Prior MI&quot;:\n  exists ( [ConditionProblemsHealthConcerns: &quot;Asthma&quot;] AsthmaDiagnosis\n      where AsthmaDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )\n  )\n\ndefine &quot;Has Atrioventricular Block with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:\n  exists ( [ConditionProblemsHealthConcerns: &quot;Atrioventricular Block&quot;] AtrioventricularBlock\n      where AtrioventricularBlock.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )\n  )\n\ndefine &quot;Has Atrioventricular Block with Qualifying CAD Encounter and Prior MI&quot;:\n  exists ( [ConditionProblemsHealthConcerns: &quot;Atrioventricular Block&quot;] AtrioventricularBlockDiagnosis\n      where AtrioventricularBlockDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )\n  )\n\ndefine &quot;Has Bradycardia with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:\n  exists ( [ConditionProblemsHealthConcerns: &quot;Bradycardia&quot;] BradycardiaDiagnosis\n      where BradycardiaDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )\n  )\n\ndefine &quot;Has Bradycardia with Qualifying CAD Encounter and Prior MI&quot;:\n  exists ( [ConditionProblemsHealthConcerns: &quot;Bradycardia&quot;] BradycardiaDiagnosis\n      where BradycardiaDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )\n  )\n\ndefine &quot;Has Diagnosis of Allergy or Intolerance to Beta Blocker Therapy with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:\n  exists ( ( [ConditionProblemsHealthConcerns: &quot;Allergy to Beta Blocker Therapy&quot;]\n      union [ConditionProblemsHealthConcerns: &quot;Intolerance to Beta Blocker Therapy&quot;] ) BetaBlockerAllergyOrIntoleranceDiagnosis\n      where BetaBlockerAllergyOrIntoleranceDiagnosis.overlapsAfterDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )\n  )\n\ndefine &quot;Has Diagnosis of Allergy or Intolerance to Beta Blocker Therapy with Qualifying CAD Encounter and Prior MI&quot;:\n  exists ( ( [ConditionProblemsHealthConcerns: &quot;Allergy to Beta Blocker Therapy&quot;]\n      union [ConditionProblemsHealthConcerns: &quot;Intolerance to Beta Blocker Therapy&quot;] ) BetaBlockerAllergyOrIntoleranceDiagnosis\n      where BetaBlockerAllergyOrIntoleranceDiagnosis.overlapsAfterDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )\n  )\n\ndefine &quot;Has Hypotension with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:\n  exists ( [ConditionProblemsHealthConcerns: &quot;Hypotension&quot;] HypotensionDiagnosis\n      where HypotensionDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )\n  )\n\ndefine &quot;Has Hypotension with Qualifying CAD Encounter and Prior MI&quot;:\n  exists ( ( [ConditionProblemsHealthConcerns: &quot;Hypotension&quot;]\n      union [ConditionEncounterDiagnosis: &quot;Hypotension&quot;] ) HypotensionDiagnosis\n      where HypotensionDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )\n  )\n\ndefine &quot;Denominator Exceptions 1&quot;:\n  &quot;Has Arrhythmia with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;\n    or &quot;Has Asthma with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;\n    or &quot;Has Bradycardia with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;\n    or &quot;Has Hypotension with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;\n    or &quot;Has Consecutive Heart Rates Less than 50 with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;\n    or &quot;Has Allergy or Intolerance to Beta Blocker Therapy Ingredient with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;\n    or &quot;Has Diagnosis of Allergy or Intolerance to Beta Blocker Therapy with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;\n    or &quot;Has Medical or Patient Reason for Not Ordering Beta Blocker for LVSD&quot;\n    or &quot;Has Atrioventricular Block with Qualifying CAD Encounter and History of Moderate or Severe LVSD without Cardiac Pacer&quot;\n\ndefine &quot;Denominator Exceptions 2&quot;:\n  &quot;Has Arrhythmia with Qualifying CAD Encounter and Prior MI&quot;\n    or &quot;Has Asthma with Qualifying CAD Encounter and Prior MI&quot;\n    or &quot;Has Bradycardia with Qualifying CAD Encounter and Prior MI&quot;\n    or &quot;Has Hypotension with Qualifying CAD Encounter and Prior MI&quot;\n    or &quot;Has Consecutive Heart Rates Less than 50 with Qualifying CAD Encounter and Prior MI&quot;\n    or &quot;Has Allergy or Intolerance to Beta Blocker Therapy Ingredient with Qualifying CAD Encounter and Prior MI&quot;\n    or &quot;Has Diagnosis of Allergy or Intolerance to Beta Blocker Therapy with Qualifying CAD Encounter and Prior MI&quot;\n    or &quot;Has Medical or Patient Reason for Not Ordering Beta Blocker Therapy&quot;\n    or &quot;Has Atrioventricular Block with Qualifying CAD Encounter and Prior MI without Cardiac Pacer&quot;\n\ndefine &quot;Has Allergy or Intolerance to Beta Blocker Therapy Ingredient with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:\n  exists ( ( [AllergyIntolerance: &quot;Beta Blocker Therapy Ingredient&quot;]\n      union [AllergyIntolerance: &quot;Substance with beta adrenergic receptor antagonist mechanism of action (substance)&quot;] ) BetaBlockerAllergyIntolerance\n      where BetaBlockerAllergyIntolerance.overlapsAfterDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )\n  )\n\ndefine &quot;Has Medical or Patient Reason for Not Ordering Beta Blocker for LVSD&quot;:\n  exists ( [MedicationNotRequested: medication in &quot;Beta Blocker Therapy for LVSD&quot;] NoBetaBlockerForLVSDOrdered\n      with &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; LVSDVisit\n        such that NoBetaBlockerForLVSDOrdered.authoredOn during day of LVSDVisit.period\n      where NoBetaBlockerForLVSDOrdered.status in { 'active', 'completed' }\n        and NoBetaBlockerForLVSDOrdered.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n        and ( NoBetaBlockerForLVSDOrdered.reasonCode in &quot;Medical Reason&quot;\n            or NoBetaBlockerForLVSDOrdered.reasonCode in &quot;Patient Reason&quot;\n        )\n  )\n\ndefine &quot;Has Medical or Patient Reason for Not Ordering Beta Blocker Therapy&quot;:\n  exists ( [MedicationNotRequested: medication in &quot;Beta Blocker Therapy for LVSD&quot;] NoBetaBlockerForLVSDOrdered\n      with &quot;Qualifying CAD Encounter and Prior MI&quot; PriorMIVisit\n        such that NoBetaBlockerForLVSDOrdered.authoredOn during day of PriorMIVisit.period\n      where NoBetaBlockerForLVSDOrdered.status in { 'active', 'completed' }\n        and NoBetaBlockerForLVSDOrdered.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n        and ( NoBetaBlockerForLVSDOrdered.reasonCode in &quot;Medical Reason&quot;\n            or NoBetaBlockerForLVSDOrdered.reasonCode in &quot;Patient Reason&quot;\n        )\n  )\n\ndefine &quot;Initial Population&quot;:\n  AgeInYearsAt(date from start of &quot;Measurement Period&quot;) &gt;= 18\n    and exists ( &quot;Qualifying Encounter During Measurement Period&quot; Encounter1\n        with &quot;Qualifying Encounter During Measurement Period&quot; Encounter2\n          such that Encounter2.id !~ Encounter1.id\n    )\n    and exists &quot;Qualifying CAD Encounter&quot;\n\ndefine &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:\n  &quot;Qualifying CAD Encounter&quot; EncounterWithCADProxy\n    with AHA.&quot;Moderate or Severe LVSD Findings&quot; LVSDFindings\n      such that Coalesce(LVSDFindings.prevalenceInterval(), LVSDFindings.effective.toInterval()) starts before end of EncounterWithCADProxy.period\n\ndefine &quot;History of Cardiac Surgery Prior to Encounter&quot;:\n  &quot;Outpatient Encounter During Measurement Period&quot; ValidQualifyingEncounter\n    with [Procedure: &quot;Cardiac Surgery&quot;] CardiacSurgeryProcedure\n      such that CardiacSurgeryProcedure.performed.toInterval ( ) starts before end of ValidQualifyingEncounter.period\n        and CardiacSurgeryProcedure.status = 'completed'\n\ndefine &quot;Qualifying CAD Encounter&quot;:\n  &quot;Coronary Artery Disease Encounter&quot;\n    union &quot;History of Cardiac Surgery Prior to Encounter&quot;\n\ndefine fluent function overlapsDayOfEncounter(Diagnosis ConditionProblemsHealthConcerns, EncounterList List&lt;Encounter&gt;):\n  AnyTrue(EncounterList Visit\n      return Diagnosis.overlapsDayOfEncounter(Visit)\n  )\n\ndefine fluent function overlapsDayOfEncounter(Diagnosis ConditionProblemsHealthConcerns, TheEncounter Encounter):\n  TheEncounter Visit\n    where Diagnosis.isVerified ( )\n    return Diagnosis.prevalenceInterval ( ) overlaps day of Visit.period\n\ndefine fluent function overlapsAfterDayOfEncounter(Event Choice&lt;AllergyIntolerance, ConditionProblemsHealthConcerns&gt;, EncounterList List&lt;Encounter&gt;):\n  AnyTrue(EncounterList Visit\n      return\n      case\n        when Event is AllergyIntolerance then Interval[start of Event.onset.toInterval(), Event.lastOccurrence]overlaps after day of Visit.period\n          and(Event.clinicalStatus is null\n              or Event.clinicalStatus ~ FHIRCommon.&quot;allergy-active&quot;\n          )\n          and(Event.verificationStatus is null\n              or Event.verificationStatus ~ FHIRCommon.&quot;allergy-confirmed&quot;\n          )\n        when Event is ConditionProblemsHealthConcerns then Event.isVerified()\n          and Event.prevalenceInterval() overlaps after day of Visit.period \n        else false \n      end\n  )\n\ndefine fluent function authoredDuringDayOfEncounter(Order Choice&lt;MedicationRequest, MedicationNotRequested&gt;, EncounterList List&lt;Encounter&gt;):\n  AnyTrue(EncounterList Visit\n      return\n      case\n        when Order is MedicationRequest then Order.authoredOn during day of Visit.period\n          and Order.status in { 'active', 'completed' }\n          and Order.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n          and Order.doNotPerform is not true\n        when Order is MedicationNotRequested then Order.authoredOn during day of Visit.period\n          and Order.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' } \n        else false \n      end\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/CMS145FHIRCADBBlockerTPMIorLVSD",
  "version" : "1.0.000",
  "name" : "CMS145FHIRCADBBlockerTPMIorLVSD",
  "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" : "bGlicmFyeSBDTVMxNDVGSElSQ0FEQkJsb2NrZXJUUE1Jb3JMVlNEIHZlcnNpb24gJzEuMC4wMDAnCgp1c2luZyBVU1F1YWxpdHlDb3JlIHZlcnNpb24gJzAuMS4wLWNpYnVpbGQnCnVzaW5nIFVTQ29yZSB2ZXJzaW9uICc2LjEuMC1kZXJpdmVkJwp1c2luZyBGSElSIHZlcnNpb24gJzQuMC4xJwoKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkhlbHBlcnMgdmVyc2lvbiAnNC4wLjEnIGNhbGxlZCBGSElSSGVscGVycwppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSQ29tbW9uIHZlcnNpb24gJzIuMC4wJyBjYWxsZWQgRkhJUkNvbW1vbgppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5VU0NvcmVDb21tb24gdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUVsZW1lbnRzIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIFVTQ29yZUVsZW1lbnRzCgppbmNsdWRlIFN1cHBsZW1lbnRhbERhdGFFbGVtZW50cyB2ZXJzaW9uICc2LjEuMDAwJyBjYWxsZWQgU0RFCmluY2x1ZGUgQUhBT3ZlcmFsbCB2ZXJzaW9uICc1LjEuMDAwJyBjYWxsZWQgQUhBCgpjb2Rlc3lzdGVtICJTTk9NRURDVCI6ICdodHRwOi8vc25vbWVkLmluZm8vc2N0JwoKdmFsdWVzZXQgIkFsbGVyZ3kgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTE3NycKdmFsdWVzZXQgIkFycmh5dGhtaWEiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMzY2Jwp2YWx1ZXNldCAiQXN0aG1hIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjM2MicKdmFsdWVzZXQgIkF0cmlvdmVudHJpY3VsYXIgQmxvY2siOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMzY3Jwp2YWx1ZXNldCAiQmV0YSBCbG9ja2VyIFRoZXJhcHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTE3NCcKdmFsdWVzZXQgIkJldGEgQmxvY2tlciBUaGVyYXB5IGZvciBMVlNEIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjExODQnCnZhbHVlc2V0ICJCZXRhIEJsb2NrZXIgVGhlcmFweSBJbmdyZWRpZW50IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjE0OTMnCnZhbHVlc2V0ICJCcmFkeWNhcmRpYSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy40MTInCnZhbHVlc2V0ICJDYXJkaWFjIFBhY2VyIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTE3OC41MycKdmFsdWVzZXQgIkNhcmRpYWMgUGFjZXIgaW4gU2l0dSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4zNjgnCnZhbHVlc2V0ICJDYXJkaWFjIFN1cmdlcnkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMzcxJwp2YWx1ZXNldCAiQ2FyZSBTZXJ2aWNlcyBpbiBMb25nIFRlcm0gUmVzaWRlbnRpYWwgRmFjaWxpdHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwMTQnCnZhbHVlc2V0ICJDb3JvbmFyeSBBcnRlcnkgRGlzZWFzZSBObyBNSSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4zNjknCnZhbHVlc2V0ICJFamVjdGlvbiBGcmFjdGlvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xMTM0Jwp2YWx1ZXNldCAiRmFjZS10by1GYWNlIEludGVyYWN0aW9uIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDQ4Jwp2YWx1ZXNldCAiSG9tZSBIZWFsdGhjYXJlIFNlcnZpY2VzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDE2Jwp2YWx1ZXNldCAiSHlwb3RlbnNpb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMzcwJwp2YWx1ZXNldCAiSW50b2xlcmFuY2UgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTE3OCcKdmFsdWVzZXQgIk1lZGljYWwgUmVhc29uIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjEwMDcnCnZhbHVlc2V0ICJNb2RlcmF0ZSBvciBTZXZlcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTA5MicKdmFsdWVzZXQgIk1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjEwOTAnCnZhbHVlc2V0ICJNeW9jYXJkaWFsIEluZmFyY3Rpb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuNDAzJwp2YWx1ZXNldCAiTnVyc2luZyBGYWNpbGl0eSBWaXNpdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDEuMTIuMTAxMicKdmFsdWVzZXQgIk9mZmljZSBWaXNpdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDEuMTIuMTAwMScKdmFsdWVzZXQgIk91dHBhdGllbnQgQ29uc3VsdGF0aW9uIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDA4Jwp2YWx1ZXNldCAiUGF0aWVudCBQcm92aWRlciBJbnRlcmFjdGlvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xMDEyJwp2YWx1ZXNldCAiUGF0aWVudCBSZWFzb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTAwOCcKLy8gVE9ETzogUmVtb3ZlIHRoaXMgdmFsdWUgc2V0IHJlZmVyZW5jZSBzaW5jZSBpdCBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGUgbG9naWMKdmFsdWVzZXQgIlN5c3RlbSBSZWFzb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTAwOScKCmNvZGUgIlN1YnN0YW5jZSB3aXRoIGJldGEgYWRyZW5lcmdpYyByZWNlcHRvciBhbnRhZ29uaXN0IG1lY2hhbmlzbSBvZiBhY3Rpb24gKHN1YnN0YW5jZSkiOiAnMzczMjU0MDAxJyBmcm9tICJTTk9NRURDVCIgZGlzcGxheSAnU3Vic3RhbmNlIHdpdGggYmV0YSBhZHJlbmVyZ2ljIHJlY2VwdG9yIGFudGFnb25pc3QgbWVjaGFuaXNtIG9mIGFjdGlvbiAoc3Vic3RhbmNlKScKCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlVGltZT4KICBkZWZhdWx0IEludGVydmFsW0AyMDI2LTAxLTAxVDAwOjAwOjAwLjAwMFosIEAyMDI3LTAxLTAxVDAwOjAwOjAwLjAwMFopCgpjb250ZXh0IFBhdGllbnQKCmRlZmluZSAiRGVub21pbmF0b3IgMiI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIKICAgIGFuZCBleGlzdHMgIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCgpkZWZpbmUgIkhhcyBBdHJpb3ZlbnRyaWN1bGFyIEJsb2NrIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSB3aXRob3V0IENhcmRpYWMgUGFjZXIiOgogICJIYXMgQXRyaW92ZW50cmljdWxhciBCbG9jayB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBhbmQgbm90ICJIYXMgRGlhZ25vc2lzIG9mIENhcmRpYWMgUGFjZXIgaW4gU2l0dSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBhbmQgbm90ICJIYXMgQ2FyZGlhYyBQYWNlciBEZXZpY2UgSW1wbGFudGVkIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIKCi8qCiogQGNvZGU6IEhlYXJ0IHJhdGUgLSA4ODY3LTQKKiBAcHJvZmlsZTogaHR0cDovL2hsNy5vcmcvZmhpci91cy9jb3JlL1N0cnVjdHVyZURlZmluaXRpb24vdXMtY29yZS1oZWFydC1yYXRlIAoqLwoKCmRlZmluZSAiSGFzIENvbnNlY3V0aXZlIEhlYXJ0IFJhdGVzIExlc3MgdGhhbiA1MCB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiOgogIGV4aXN0cyAoIGZyb20KICAgICAgLy8gVE9ETzogQ29uc2lkZXIgYmVzdCBwcmFjdGljZSBvZiBhbHdheXMgcXVhbGlmeWluZyB0eXBlIG5hbWVzCiAgICAgIFsiSGVhcnRSYXRlUHJvZmlsZSJdIEhlYXJ0UmF0ZUV4YW0sCiAgICAgICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiBDQURFbmNvdW50ZXJNSQogICAgICBsZXQgUHJpb3JIZWFydFJhdGVFeGFtOiBMYXN0KFsiSGVhcnRSYXRlUHJvZmlsZSJdIE1vc3RSZWNlbnRQcmlvckhlYXJ0UmF0ZUV4YW0KICAgICAgICAgIHdoZXJlIE1vc3RSZWNlbnRQcmlvckhlYXJ0UmF0ZUV4YW0uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBkdXJpbmcgQ0FERW5jb3VudGVyTUkucGVyaW9kCiAgICAgICAgICAgIGFuZCBNb3N0UmVjZW50UHJpb3JIZWFydFJhdGVFeGFtLnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgICAgICBhbmQgTW9zdFJlY2VudFByaW9ySGVhcnRSYXRlRXhhbS5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIGJlZm9yZSBIZWFydFJhdGVFeGFtLmVmZmVjdGl2ZS50b0ludGVydmFsKCkKICAgICAgICAgIHNvcnQgYnkgc3RhcnQgb2YgZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKQogICAgICApCiAgICAgIHdoZXJlIEhlYXJ0UmF0ZUV4YW0uZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIGR1cmluZyBDQURFbmNvdW50ZXJNSS5wZXJpb2QKICAgICAgICBhbmQgSGVhcnRSYXRlRXhhbS5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgSGVhcnRSYXRlRXhhbS52YWx1ZSA8IDUwICcvbWluJwogICAgICAgIGFuZCBQcmlvckhlYXJ0UmF0ZUV4YW0udmFsdWUgPCA1MCAnL21pbicKICApCgpkZWZpbmUgIk51bWVyYXRvciAxIjoKICAiSGFzIEJldGEgQmxvY2tlciBUaGVyYXB5IGZvciBMVlNEIE9yZGVyZWQiCiAgICBvciAiSXMgQ3VycmVudGx5IFRha2luZyBCZXRhIEJsb2NrZXIgVGhlcmFweSBmb3IgTFZTRCIKCmRlZmluZSAiTnVtZXJhdG9yIDIiOgogICJIYXMgQmV0YSBCbG9ja2VyIFRoZXJhcHkgT3JkZXJlZCIKICAgIG9yICJJcyBDdXJyZW50bHkgVGFraW5nIEJldGEgQmxvY2tlciBUaGVyYXB5IgoKZGVmaW5lICJTREUgRXRobmljaXR5IjoKICBTREUuIlNERSBFdGhuaWNpdHkiCgpkZWZpbmUgIlNERSBQYXllciI6CiAgU0RFLiJTREUgUGF5ZXIiCgpkZWZpbmUgIlNERSBSYWNlIjoKICBTREUuIlNERSBSYWNlIgoKZGVmaW5lICJTREUgU2V4IjoKICBTREUuIlNERSBTZXgiCgpkZWZpbmUgIkhhcyBDYXJkaWFjIFBhY2VyIERldmljZSBJbXBsYW50ZWQgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCBbUHJvY2VkdXJlOiAiQ2FyZGlhYyBQYWNlciJdIEltcGxhbnRlZENhcmRpYWNQYWNlcgogICAgICB3aXRoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiBDQURFbmNvdW50ZXJNSQogICAgICAgIHN1Y2ggdGhhdCBJbXBsYW50ZWRDYXJkaWFjUGFjZXIucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIENBREVuY291bnRlck1JLnBlcmlvZAogICAgICAgICAgYW5kIEltcGxhbnRlZENhcmRpYWNQYWNlci5zdGF0dXMgPSAnY29tcGxldGVkJwogICkKCmRlZmluZSAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSI6CiAgIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciIgRW5jb3VudGVyV2l0aENBRFByb3h5CiAgICB3aXRoICggW0ZISVIuQ29uZGl0aW9uOiAiTXlvY2FyZGlhbCBJbmZhcmN0aW9uIl0gKSBNeW9jYXJkaWFsSW5mYXJjdGlvbgogICAgICBzdWNoIHRoYXQgTXlvY2FyZGlhbEluZmFyY3Rpb24ucHJldmFsZW5jZUludGVydmFsICggKSBzdGFydHMgMyB5ZWFycyBvciBsZXNzIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgRW5jb3VudGVyV2l0aENBRFByb3h5LnBlcmlvZAogICAgICAgIGFuZCBub3QgZXhpc3RzIEFIQS4iTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QgRmluZGluZ3MiCiAgICAgICAgYW5kIE15b2NhcmRpYWxJbmZhcmN0aW9uLmlzVmVyaWZpZWQgKCApCgpkZWZpbmUgIkRlbm9taW5hdG9yIDEiOgogICJJbml0aWFsIFBvcHVsYXRpb24iCiAgICBhbmQgZXhpc3RzICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCgpkZWZpbmUgIkhhcyBBdHJpb3ZlbnRyaWN1bGFyIEJsb2NrIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIHdpdGhvdXQgQ2FyZGlhYyBQYWNlciI6CiAgIkhhcyBBdHJpb3ZlbnRyaWN1bGFyIEJsb2NrIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIgogICAgYW5kIG5vdCAiSGFzIERpYWdub3NpcyBvZiBDYXJkaWFjIFBhY2VyIGluIFNpdHUgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBhbmQgbm90ICJIYXMgQ2FyZGlhYyBQYWNlciBEZXZpY2UgSW1wbGFudGVkIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIgoKLyoKKiBAY29kZTogSGVhcnQgcmF0ZSAtIDg4NjctNAoqIEBwcm9maWxlOiBodHRwOi8vaGw3Lm9yZy9maGlyL3VzL2NvcmUvU3RydWN0dXJlRGVmaW5pdGlvbi91cy1jb3JlLWhlYXJ0LXJhdGUKKi8KCgpkZWZpbmUgIkhhcyBDb25zZWN1dGl2ZSBIZWFydCBSYXRlcyBMZXNzIHRoYW4gNTAgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiOgogIGV4aXN0cyAoIGZyb20KICAgICAgWyJIZWFydFJhdGVQcm9maWxlIl0gSGVhcnRSYXRlRXhhbSwKICAgICAgIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgQ0FERW5jb3VudGVyTW9kZXJhdGVPclNldmVyZUxWU0QKICAgICAgbGV0IFByaW9ySGVhcnRSYXRlRXhhbTogTGFzdChbIkhlYXJ0UmF0ZVByb2ZpbGUiXSBNb3N0UmVjZW50UHJpb3JIZWFydFJhdGVFeGFtCiAgICAgICAgICB3aGVyZSBNb3N0UmVjZW50UHJpb3JIZWFydFJhdGVFeGFtLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgZHVyaW5nIENBREVuY291bnRlck1vZGVyYXRlT3JTZXZlcmVMVlNELnBlcmlvZAogICAgICAgICAgICBhbmQgTW9zdFJlY2VudFByaW9ySGVhcnRSYXRlRXhhbS5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICAgICAgYW5kIE1vc3RSZWNlbnRQcmlvckhlYXJ0UmF0ZUV4YW0uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBiZWZvcmUgSGVhcnRSYXRlRXhhbS5lZmZlY3RpdmUudG9JbnRlcnZhbCgpCiAgICAgICAgICBzb3J0IGJ5IHN0YXJ0IG9mIGVmZmVjdGl2ZS50b0ludGVydmFsKCkKICAgICAgKQogICAgICB3aGVyZSBIZWFydFJhdGVFeGFtLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBkdXJpbmcgQ0FERW5jb3VudGVyTW9kZXJhdGVPclNldmVyZUxWU0QucGVyaW9kCiAgICAgICAgYW5kIEhlYXJ0UmF0ZUV4YW0uc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIEhlYXJ0UmF0ZUV4YW0udmFsdWUgPCA1MCAnL21pbicKICAgICAgICBhbmQgUHJpb3JIZWFydFJhdGVFeGFtLnZhbHVlIDwgNTAgJy9taW4nCiAgKQoKZGVmaW5lICJIYXMgQ2FyZGlhYyBQYWNlciBEZXZpY2UgSW1wbGFudGVkIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjoKICBleGlzdHMgKCBbUHJvY2VkdXJlOiAiQ2FyZGlhYyBQYWNlciJdIEltcGxhbnRlZENhcmRpYWNQYWNlcgogICAgICB3aXRoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiIENBREVuY291bnRlck1vZGVyYXRlT3JTZXZlcmVMVlNECiAgICAgICAgc3VjaCB0aGF0IEltcGxhbnRlZENhcmRpYWNQYWNlci5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGJlZm9yZSBlbmQgb2YgQ0FERW5jb3VudGVyTW9kZXJhdGVPclNldmVyZUxWU0QucGVyaW9kCiAgKQoKZGVmaW5lICJIYXMgRGlhZ25vc2lzIG9mIENhcmRpYWMgUGFjZXIgaW4gU2l0dSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCI6CiAgZXhpc3RzICggW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM6ICJDYXJkaWFjIFBhY2VyIGluIFNpdHUiXSBDYXJkaWFjUGFjZXJEaWFnbm9zaXMKICAgICAgd2hlcmUgQ2FyZGlhY1BhY2VyRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiApCiAgKQoKZGVmaW5lICJIYXMgRGlhZ25vc2lzIG9mIENhcmRpYWMgUGFjZXIgaW4gU2l0dSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiOgogIGV4aXN0cyAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiQ2FyZGlhYyBQYWNlciBpbiBTaXR1Il0gQ2FyZGlhY1BhY2VyRGlhZ25vc2lzCiAgICAgIHdoZXJlIENhcmRpYWNQYWNlckRpYWdub3Npcy5vdmVybGFwc0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiICkKICApCgpkZWZpbmUgIkhhcyBBbGxlcmd5IG9yIEludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5IEluZ3JlZGllbnQgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCAoIFtBbGxlcmd5SW50b2xlcmFuY2U6ICJCZXRhIEJsb2NrZXIgVGhlcmFweSBJbmdyZWRpZW50Il0KICAgICAgdW5pb24gW0FsbGVyZ3lJbnRvbGVyYW5jZTogIlN1YnN0YW5jZSB3aXRoIGJldGEgYWRyZW5lcmdpYyByZWNlcHRvciBhbnRhZ29uaXN0IG1lY2hhbmlzbSBvZiBhY3Rpb24gKHN1YnN0YW5jZSkiXSApIEJldGFCbG9ja2VyQWxsZXJneUludG9sZXJhbmNlCiAgICAgIHdoZXJlIEJldGFCbG9ja2VyQWxsZXJneUludG9sZXJhbmNlLm92ZXJsYXBzQWZ0ZXJEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiApCiAgKQoKZGVmaW5lICJIYXMgQmV0YSBCbG9ja2VyIFRoZXJhcHkgZm9yIExWU0QgT3JkZXJlZCI6CiAgZXhpc3RzICggW01lZGljYXRpb25SZXF1ZXN0OiBtZWRpY2F0aW9uIGluICJCZXRhIEJsb2NrZXIgVGhlcmFweSBmb3IgTFZTRCJdIEJldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQKICAgICAgd2hlcmUgQmV0YUJsb2NrZXJGb3JMVlNET3JkZXJlZC5hdXRob3JlZER1cmluZ0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgKQogICkKCmRlZmluZSAiSGFzIEJldGEgQmxvY2tlciBUaGVyYXB5IE9yZGVyZWQiOgogIGV4aXN0cyAoIFtNZWRpY2F0aW9uUmVxdWVzdDogbWVkaWNhdGlvbiBpbiAiQmV0YSBCbG9ja2VyIFRoZXJhcHkiXSBCZXRhQmxvY2tlck9yZGVyZWQKICAgICAgd2hlcmUgQmV0YUJsb2NrZXJPcmRlcmVkLmF1dGhvcmVkRHVyaW5nRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIgKQogICkKCmRlZmluZSAiSXMgQ3VycmVudGx5IFRha2luZyBCZXRhIEJsb2NrZXIgVGhlcmFweSI6CiAgZXhpc3RzICggW01lZGljYXRpb25SZXF1ZXN0OiBtZWRpY2F0aW9uIGluICJCZXRhIEJsb2NrZXIgVGhlcmFweSJdIEFjdGl2ZUJldGFCbG9ja2VyCiAgICAgIHdpdGggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiIENBREVuY291bnRlck1JCiAgICAgICAgc3VjaCB0aGF0IEZpcnN0KChjb2xsYXBzZShBY3RpdmVCZXRhQmxvY2tlci5kb3NhZ2VJbnN0cnVjdGlvbi50aW1pbmcucmVwZWF0LmJvdW5kcyBEb3NlVGltZQogICAgICAgICAgICAgIHJldHVybiBEb3NlVGltZS50b0ludGVydmFsKCkKICAgICAgICAgICkpIERydWdQZXJpb2QKICAgICAgICAgICAgc29ydCBieSBzdGFydCBvZiAkdGhpcwogICAgICAgICkgb3ZlcmxhcHMgYWZ0ZXIgZGF5IG9mIENBREVuY291bnRlck1JLnBlcmlvZAogICAgICB3aGVyZSBBY3RpdmVCZXRhQmxvY2tlci5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgIGFuZCBBY3RpdmVCZXRhQmxvY2tlci5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICkKCmRlZmluZSAiSXMgQ3VycmVudGx5IFRha2luZyBCZXRhIEJsb2NrZXIgVGhlcmFweSBmb3IgTFZTRCI6CiAgZXhpc3RzICggW01lZGljYXRpb25SZXF1ZXN0OiBtZWRpY2F0aW9uIGluICJCZXRhIEJsb2NrZXIgVGhlcmFweSBmb3IgTFZTRCJdIEFjdGl2ZUJldGFCbG9ja2VyRm9yTFZTRAogICAgICB3aXRoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiIENBREVuY291bnRlck1vZGVyYXRlT3JTZXZlcmVMVlNECiAgICAgICAgc3VjaCB0aGF0IEZpcnN0KChjb2xsYXBzZShBY3RpdmVCZXRhQmxvY2tlckZvckxWU0QuZG9zYWdlSW5zdHJ1Y3Rpb24udGltaW5nLnJlcGVhdC5ib3VuZHMgRG9zZVRpbWUKICAgICAgICAgICAgICByZXR1cm4gRG9zZVRpbWUudG9JbnRlcnZhbCgpCiAgICAgICAgICApKSBEcnVnUGVyaW9kCiAgICAgICAgICAgIHNvcnQgYnkgc3RhcnQgb2YgJHRoaXMKICAgICAgICApIG92ZXJsYXBzIGFmdGVyIGRheSBvZiBDQURFbmNvdW50ZXJNb2RlcmF0ZU9yU2V2ZXJlTFZTRC5wZXJpb2QKICAgICAgd2hlcmUgQWN0aXZlQmV0YUJsb2NrZXJGb3JMVlNELnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICAgYW5kIEFjdGl2ZUJldGFCbG9ja2VyRm9yTFZTRC5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICkKCmRlZmluZSAiT3V0cGF0aWVudCBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgKCBbRW5jb3VudGVyOiAiT2ZmaWNlIFZpc2l0Il0KICAgIHVuaW9uIFtFbmNvdW50ZXI6ICJPdXRwYXRpZW50IENvbnN1bHRhdGlvbiJdCiAgICB1bmlvbiBbRW5jb3VudGVyOiAiQ2FyZSBTZXJ2aWNlcyBpbiBMb25nIFRlcm0gUmVzaWRlbnRpYWwgRmFjaWxpdHkiXQogICAgdW5pb24gW0VuY291bnRlcjogIkhvbWUgSGVhbHRoY2FyZSBTZXJ2aWNlcyJdCiAgICB1bmlvbiBbRW5jb3VudGVyOiAiTnVyc2luZyBGYWNpbGl0eSBWaXNpdCJdICkgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2hlcmUgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgUXVhbGlmeWluZ0VuY291bnRlci5zdGF0dXMgPSAnZmluaXNoZWQnCgpkZWZpbmUgIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICggW0VuY291bnRlcjogIk9mZmljZSBWaXNpdCJdCiAgICB1bmlvbiBbRW5jb3VudGVyOiAiT3V0cGF0aWVudCBDb25zdWx0YXRpb24iXQogICAgdW5pb24gW0VuY291bnRlcjogIk51cnNpbmcgRmFjaWxpdHkgVmlzaXQiXQogICAgdW5pb24gW0VuY291bnRlcjogIkNhcmUgU2VydmljZXMgaW4gTG9uZyBUZXJtIFJlc2lkZW50aWFsIEZhY2lsaXR5Il0KICAgIHVuaW9uIFtFbmNvdW50ZXI6ICJIb21lIEhlYWx0aGNhcmUgU2VydmljZXMiXQogICAgdW5pb24gW0VuY291bnRlcjogIlBhdGllbnQgUHJvdmlkZXIgSW50ZXJhY3Rpb24iXSApIFZhbGlkRW5jb3VudGVyCiAgICB3aGVyZSBWYWxpZEVuY291bnRlci5wZXJpb2QgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgVmFsaWRFbmNvdW50ZXIuc3RhdHVzID0gJ2ZpbmlzaGVkJwoKZGVmaW5lICJDb3JvbmFyeSBBcnRlcnkgRGlzZWFzZSBFbmNvdW50ZXIiOgogICJPdXRwYXRpZW50IEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBWYWxpZFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkNvcm9uYXJ5IEFydGVyeSBEaXNlYXNlIE5vIE1JIl0KICAgICAgdW5pb24gW0NvbmRpdGlvbkVuY291bnRlckRpYWdub3NpczogIkNvcm9uYXJ5IEFydGVyeSBEaXNlYXNlIE5vIE1JIl0gKSBDb3JvbmFyeUFydGVyeURpc2Vhc2UKICAgICAgc3VjaCB0aGF0IENvcm9uYXJ5QXJ0ZXJ5RGlzZWFzZS5vdmVybGFwc0RheU9mRW5jb3VudGVyICggVmFsaWRRdWFsaWZ5aW5nRW5jb3VudGVyICkKCmRlZmluZSAiSGFzIEFycmh5dGhtaWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiOgogIGV4aXN0cyAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiQXJyaHl0aG1pYSJdIEFycmh5dGhtaWFEaWFnbm9zaXMKICAgICAgd2hlcmUgQXJyaHl0aG1pYURpYWdub3Npcy5vdmVybGFwc0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgKQogICkKCmRlZmluZSAiSGFzIEFycmh5dGhtaWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFycmh5dGhtaWEiXSBBcnJoeXRobWlhRGlhZ25vc2lzCiAgICAgIHdoZXJlIEFycmh5dGhtaWFEaWFnbm9zaXMub3ZlcmxhcHNEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiApCiAgKQoKZGVmaW5lICJIYXMgQXN0aG1hIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFzdGhtYSJdIEFzdGhtYURpYWdub3NpcwogICAgICB3aGVyZSBBc3RobWFEaWFnbm9zaXMub3ZlcmxhcHNEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiICkKICApCgpkZWZpbmUgIkhhcyBBc3RobWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFzdGhtYSJdIEFzdGhtYURpYWdub3NpcwogICAgICB3aGVyZSBBc3RobWFEaWFnbm9zaXMub3ZlcmxhcHNEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiApCiAgKQoKZGVmaW5lICJIYXMgQXRyaW92ZW50cmljdWxhciBCbG9jayB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCI6CiAgZXhpc3RzICggW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM6ICJBdHJpb3ZlbnRyaWN1bGFyIEJsb2NrIl0gQXRyaW92ZW50cmljdWxhckJsb2NrCiAgICAgIHdoZXJlIEF0cmlvdmVudHJpY3VsYXJCbG9jay5vdmVybGFwc0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgKQogICkKCmRlZmluZSAiSGFzIEF0cmlvdmVudHJpY3VsYXIgQmxvY2sgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkF0cmlvdmVudHJpY3VsYXIgQmxvY2siXSBBdHJpb3ZlbnRyaWN1bGFyQmxvY2tEaWFnbm9zaXMKICAgICAgd2hlcmUgQXRyaW92ZW50cmljdWxhckJsb2NrRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIgKQogICkKCmRlZmluZSAiSGFzIEJyYWR5Y2FyZGlhIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkJyYWR5Y2FyZGlhIl0gQnJhZHljYXJkaWFEaWFnbm9zaXMKICAgICAgd2hlcmUgQnJhZHljYXJkaWFEaWFnbm9zaXMub3ZlcmxhcHNEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiICkKICApCgpkZWZpbmUgIkhhcyBCcmFkeWNhcmRpYSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiOgogIGV4aXN0cyAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiQnJhZHljYXJkaWEiXSBCcmFkeWNhcmRpYURpYWdub3NpcwogICAgICB3aGVyZSBCcmFkeWNhcmRpYURpYWdub3Npcy5vdmVybGFwc0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiICkKICApCgpkZWZpbmUgIkhhcyBEaWFnbm9zaXMgb2YgQWxsZXJneSBvciBJbnRvbGVyYW5jZSB0byBCZXRhIEJsb2NrZXIgVGhlcmFweSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCI6CiAgZXhpc3RzICggKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFsbGVyZ3kgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkiXQogICAgICB1bmlvbiBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5Il0gKSBCZXRhQmxvY2tlckFsbGVyZ3lPckludG9sZXJhbmNlRGlhZ25vc2lzCiAgICAgIHdoZXJlIEJldGFCbG9ja2VyQWxsZXJneU9ySW50b2xlcmFuY2VEaWFnbm9zaXMub3ZlcmxhcHNBZnRlckRheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgKQogICkKCmRlZmluZSAiSGFzIERpYWdub3NpcyBvZiBBbGxlcmd5IG9yIEludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5IHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSI6CiAgZXhpc3RzICggKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFsbGVyZ3kgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkiXQogICAgICB1bmlvbiBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5Il0gKSBCZXRhQmxvY2tlckFsbGVyZ3lPckludG9sZXJhbmNlRGlhZ25vc2lzCiAgICAgIHdoZXJlIEJldGFCbG9ja2VyQWxsZXJneU9ySW50b2xlcmFuY2VEaWFnbm9zaXMub3ZlcmxhcHNBZnRlckRheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiICkKICApCgpkZWZpbmUgIkhhcyBIeXBvdGVuc2lvbiB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCI6CiAgZXhpc3RzICggW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM6ICJIeXBvdGVuc2lvbiJdIEh5cG90ZW5zaW9uRGlhZ25vc2lzCiAgICAgIHdoZXJlIEh5cG90ZW5zaW9uRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiApCiAgKQoKZGVmaW5lICJIYXMgSHlwb3RlbnNpb24gd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiSHlwb3RlbnNpb24iXQogICAgICB1bmlvbiBbQ29uZGl0aW9uRW5jb3VudGVyRGlhZ25vc2lzOiAiSHlwb3RlbnNpb24iXSApIEh5cG90ZW5zaW9uRGlhZ25vc2lzCiAgICAgIHdoZXJlIEh5cG90ZW5zaW9uRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIgKQogICkKCmRlZmluZSAiRGVub21pbmF0b3IgRXhjZXB0aW9ucyAxIjoKICAiSGFzIEFycmh5dGhtaWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBvciAiSGFzIEFzdGhtYSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIKICAgIG9yICJIYXMgQnJhZHljYXJkaWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBvciAiSGFzIEh5cG90ZW5zaW9uIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIgogICAgb3IgIkhhcyBDb25zZWN1dGl2ZSBIZWFydCBSYXRlcyBMZXNzIHRoYW4gNTAgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBvciAiSGFzIEFsbGVyZ3kgb3IgSW50b2xlcmFuY2UgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkgSW5ncmVkaWVudCB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIKICAgIG9yICJIYXMgRGlhZ25vc2lzIG9mIEFsbGVyZ3kgb3IgSW50b2xlcmFuY2UgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBvciAiSGFzIE1lZGljYWwgb3IgUGF0aWVudCBSZWFzb24gZm9yIE5vdCBPcmRlcmluZyBCZXRhIEJsb2NrZXIgZm9yIExWU0QiCiAgICBvciAiSGFzIEF0cmlvdmVudHJpY3VsYXIgQmxvY2sgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0Qgd2l0aG91dCBDYXJkaWFjIFBhY2VyIgoKZGVmaW5lICJEZW5vbWluYXRvciBFeGNlcHRpb25zIDIiOgogICJIYXMgQXJyaHl0aG1pYSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBvciAiSGFzIEFzdGhtYSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBvciAiSGFzIEJyYWR5Y2FyZGlhIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIKICAgIG9yICJIYXMgSHlwb3RlbnNpb24gd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIgogICAgb3IgIkhhcyBDb25zZWN1dGl2ZSBIZWFydCBSYXRlcyBMZXNzIHRoYW4gNTAgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIgogICAgb3IgIkhhcyBBbGxlcmd5IG9yIEludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5IEluZ3JlZGllbnQgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIgogICAgb3IgIkhhcyBEaWFnbm9zaXMgb2YgQWxsZXJneSBvciBJbnRvbGVyYW5jZSB0byBCZXRhIEJsb2NrZXIgVGhlcmFweSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBvciAiSGFzIE1lZGljYWwgb3IgUGF0aWVudCBSZWFzb24gZm9yIE5vdCBPcmRlcmluZyBCZXRhIEJsb2NrZXIgVGhlcmFweSIKICAgIG9yICJIYXMgQXRyaW92ZW50cmljdWxhciBCbG9jayB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkgd2l0aG91dCBDYXJkaWFjIFBhY2VyIgoKZGVmaW5lICJIYXMgQWxsZXJneSBvciBJbnRvbGVyYW5jZSB0byBCZXRhIEJsb2NrZXIgVGhlcmFweSBJbmdyZWRpZW50IHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjoKICBleGlzdHMgKCAoIFtBbGxlcmd5SW50b2xlcmFuY2U6ICJCZXRhIEJsb2NrZXIgVGhlcmFweSBJbmdyZWRpZW50Il0KICAgICAgdW5pb24gW0FsbGVyZ3lJbnRvbGVyYW5jZTogIlN1YnN0YW5jZSB3aXRoIGJldGEgYWRyZW5lcmdpYyByZWNlcHRvciBhbnRhZ29uaXN0IG1lY2hhbmlzbSBvZiBhY3Rpb24gKHN1YnN0YW5jZSkiXSApIEJldGFCbG9ja2VyQWxsZXJneUludG9sZXJhbmNlCiAgICAgIHdoZXJlIEJldGFCbG9ja2VyQWxsZXJneUludG9sZXJhbmNlLm92ZXJsYXBzQWZ0ZXJEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiICkKICApCgpkZWZpbmUgIkhhcyBNZWRpY2FsIG9yIFBhdGllbnQgUmVhc29uIGZvciBOb3QgT3JkZXJpbmcgQmV0YSBCbG9ja2VyIGZvciBMVlNEIjoKICBleGlzdHMgKCBbTWVkaWNhdGlvbk5vdFJlcXVlc3RlZDogbWVkaWNhdGlvbiBpbiAiQmV0YSBCbG9ja2VyIFRoZXJhcHkgZm9yIExWU0QiXSBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQKICAgICAgd2l0aCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiBMVlNEVmlzaXQKICAgICAgICBzdWNoIHRoYXQgTm9CZXRhQmxvY2tlckZvckxWU0RPcmRlcmVkLmF1dGhvcmVkT24gZHVyaW5nIGRheSBvZiBMVlNEVmlzaXQucGVyaW9kCiAgICAgIHdoZXJlIE5vQmV0YUJsb2NrZXJGb3JMVlNET3JkZXJlZC5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgIGFuZCBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQuaW50ZW50IGluIHsgJ29yZGVyJywgJ29yaWdpbmFsLW9yZGVyJywgJ3JlZmxleC1vcmRlcicsICdmaWxsZXItb3JkZXInLCAnaW5zdGFuY2Utb3JkZXInIH0KICAgICAgICBhbmQgKCBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQucmVhc29uQ29kZSBpbiAiTWVkaWNhbCBSZWFzb24iCiAgICAgICAgICAgIG9yIE5vQmV0YUJsb2NrZXJGb3JMVlNET3JkZXJlZC5yZWFzb25Db2RlIGluICJQYXRpZW50IFJlYXNvbiIKICAgICAgICApCiAgKQoKZGVmaW5lICJIYXMgTWVkaWNhbCBvciBQYXRpZW50IFJlYXNvbiBmb3IgTm90IE9yZGVyaW5nIEJldGEgQmxvY2tlciBUaGVyYXB5IjoKICBleGlzdHMgKCBbTWVkaWNhdGlvbk5vdFJlcXVlc3RlZDogbWVkaWNhdGlvbiBpbiAiQmV0YSBCbG9ja2VyIFRoZXJhcHkgZm9yIExWU0QiXSBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQKICAgICAgd2l0aCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIgUHJpb3JNSVZpc2l0CiAgICAgICAgc3VjaCB0aGF0IE5vQmV0YUJsb2NrZXJGb3JMVlNET3JkZXJlZC5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgUHJpb3JNSVZpc2l0LnBlcmlvZAogICAgICB3aGVyZSBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICAgICBhbmQgTm9CZXRhQmxvY2tlckZvckxWU0RPcmRlcmVkLmludGVudCBpbiB7ICdvcmRlcicsICdvcmlnaW5hbC1vcmRlcicsICdyZWZsZXgtb3JkZXInLCAnZmlsbGVyLW9yZGVyJywgJ2luc3RhbmNlLW9yZGVyJyB9CiAgICAgICAgYW5kICggTm9CZXRhQmxvY2tlckZvckxWU0RPcmRlcmVkLnJlYXNvbkNvZGUgaW4gIk1lZGljYWwgUmVhc29uIgogICAgICAgICAgICBvciBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQucmVhc29uQ29kZSBpbiAiUGF0aWVudCBSZWFzb24iCiAgICAgICAgKQogICkKCmRlZmluZSAiSW5pdGlhbCBQb3B1bGF0aW9uIjoKICBBZ2VJblllYXJzQXQoZGF0ZSBmcm9tIHN0YXJ0IG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA+PSAxOAogICAgYW5kIGV4aXN0cyAoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBFbmNvdW50ZXIxCiAgICAgICAgd2l0aCAiUXVhbGlmeWluZyBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgRW5jb3VudGVyMgogICAgICAgICAgc3VjaCB0aGF0IEVuY291bnRlcjIuaWQgIX4gRW5jb3VudGVyMS5pZAogICAgKQogICAgYW5kIGV4aXN0cyAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIgoKZGVmaW5lICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiOgogICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIiIEVuY291bnRlcldpdGhDQURQcm94eQogICAgd2l0aCBBSEEuIk1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIEZpbmRpbmdzIiBMVlNERmluZGluZ3MKICAgICAgc3VjaCB0aGF0IENvYWxlc2NlKExWU0RGaW5kaW5ncy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSwgTFZTREZpbmRpbmdzLmVmZmVjdGl2ZS50b0ludGVydmFsKCkpIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIEVuY291bnRlcldpdGhDQURQcm94eS5wZXJpb2QKCmRlZmluZSAiSGlzdG9yeSBvZiBDYXJkaWFjIFN1cmdlcnkgUHJpb3IgdG8gRW5jb3VudGVyIjoKICAiT3V0cGF0aWVudCBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgVmFsaWRRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aXRoIFtQcm9jZWR1cmU6ICJDYXJkaWFjIFN1cmdlcnkiXSBDYXJkaWFjU3VyZ2VyeVByb2NlZHVyZQogICAgICBzdWNoIHRoYXQgQ2FyZGlhY1N1cmdlcnlQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIFZhbGlkUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgICBhbmQgQ2FyZGlhY1N1cmdlcnlQcm9jZWR1cmUuc3RhdHVzID0gJ2NvbXBsZXRlZCcKCmRlZmluZSAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIjoKICAiQ29yb25hcnkgQXJ0ZXJ5IERpc2Vhc2UgRW5jb3VudGVyIgogICAgdW5pb24gIkhpc3Rvcnkgb2YgQ2FyZGlhYyBTdXJnZXJ5IFByaW9yIHRvIEVuY291bnRlciIKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gb3ZlcmxhcHNEYXlPZkVuY291bnRlcihEaWFnbm9zaXMgQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJucywgRW5jb3VudGVyTGlzdCBMaXN0PEVuY291bnRlcj4pOgogIEFueVRydWUoRW5jb3VudGVyTGlzdCBWaXNpdAogICAgICByZXR1cm4gRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIoVmlzaXQpCiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBvdmVybGFwc0RheU9mRW5jb3VudGVyKERpYWdub3NpcyBDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zLCBUaGVFbmNvdW50ZXIgRW5jb3VudGVyKToKICBUaGVFbmNvdW50ZXIgVmlzaXQKICAgIHdoZXJlIERpYWdub3Npcy5pc1ZlcmlmaWVkICggKQogICAgcmV0dXJuIERpYWdub3Npcy5wcmV2YWxlbmNlSW50ZXJ2YWwgKCApIG92ZXJsYXBzIGRheSBvZiBWaXNpdC5wZXJpb2QKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gb3ZlcmxhcHNBZnRlckRheU9mRW5jb3VudGVyKEV2ZW50IENob2ljZTxBbGxlcmd5SW50b2xlcmFuY2UsIENvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM+LCBFbmNvdW50ZXJMaXN0IExpc3Q8RW5jb3VudGVyPik6CiAgQW55VHJ1ZShFbmNvdW50ZXJMaXN0IFZpc2l0CiAgICAgIHJldHVybgogICAgICBjYXNlCiAgICAgICAgd2hlbiBFdmVudCBpcyBBbGxlcmd5SW50b2xlcmFuY2UgdGhlbiBJbnRlcnZhbFtzdGFydCBvZiBFdmVudC5vbnNldC50b0ludGVydmFsKCksIEV2ZW50Lmxhc3RPY2N1cnJlbmNlXW92ZXJsYXBzIGFmdGVyIGRheSBvZiBWaXNpdC5wZXJpb2QKICAgICAgICAgIGFuZChFdmVudC5jbGluaWNhbFN0YXR1cyBpcyBudWxsCiAgICAgICAgICAgICAgb3IgRXZlbnQuY2xpbmljYWxTdGF0dXMgfiBGSElSQ29tbW9uLiJhbGxlcmd5LWFjdGl2ZSIKICAgICAgICAgICkKICAgICAgICAgIGFuZChFdmVudC52ZXJpZmljYXRpb25TdGF0dXMgaXMgbnVsbAogICAgICAgICAgICAgIG9yIEV2ZW50LnZlcmlmaWNhdGlvblN0YXR1cyB+IEZISVJDb21tb24uImFsbGVyZ3ktY29uZmlybWVkIgogICAgICAgICAgKQogICAgICAgIHdoZW4gRXZlbnQgaXMgQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJucyB0aGVuIEV2ZW50LmlzVmVyaWZpZWQoKQogICAgICAgICAgYW5kIEV2ZW50LnByZXZhbGVuY2VJbnRlcnZhbCgpIG92ZXJsYXBzIGFmdGVyIGRheSBvZiBWaXNpdC5wZXJpb2QgCiAgICAgICAgZWxzZSBmYWxzZSAKICAgICAgZW5kCiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBhdXRob3JlZER1cmluZ0RheU9mRW5jb3VudGVyKE9yZGVyIENob2ljZTxNZWRpY2F0aW9uUmVxdWVzdCwgTWVkaWNhdGlvbk5vdFJlcXVlc3RlZD4sIEVuY291bnRlckxpc3QgTGlzdDxFbmNvdW50ZXI+KToKICBBbnlUcnVlKEVuY291bnRlckxpc3QgVmlzaXQKICAgICAgcmV0dXJuCiAgICAgIGNhc2UKICAgICAgICB3aGVuIE9yZGVyIGlzIE1lZGljYXRpb25SZXF1ZXN0IHRoZW4gT3JkZXIuYXV0aG9yZWRPbiBkdXJpbmcgZGF5IG9mIFZpc2l0LnBlcmlvZAogICAgICAgICAgYW5kIE9yZGVyLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICAgICBhbmQgT3JkZXIuaW50ZW50IGluIHsgJ29yZGVyJywgJ29yaWdpbmFsLW9yZGVyJywgJ3JlZmxleC1vcmRlcicsICdmaWxsZXItb3JkZXInLCAnaW5zdGFuY2Utb3JkZXInIH0KICAgICAgICAgIGFuZCBPcmRlci5kb05vdFBlcmZvcm0gaXMgbm90IHRydWUKICAgICAgICB3aGVuIE9yZGVyIGlzIE1lZGljYXRpb25Ob3RSZXF1ZXN0ZWQgdGhlbiBPcmRlci5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgVmlzaXQucGVyaW9kCiAgICAgICAgICBhbmQgT3JkZXIuaW50ZW50IGluIHsgJ29yZGVyJywgJ29yaWdpbmFsLW9yZGVyJywgJ3JlZmxleC1vcmRlcicsICdmaWxsZXItb3JkZXInLCAnaW5zdGFuY2Utb3JkZXInIH0gCiAgICAgICAgZWxzZSBmYWxzZSAKICAgICAgZW5kCiAgKQ==",
      "url" : "https://madie.cms.gov/Library-CMS145FHIRCADBBlockerTPMIorLVSD.cql"
    }
  ]
}