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
| Active as of 2025-08-25 |
{
"resourceType" : "Library",
"id" : "CMS108FHIRVTEProphylaxis",
"meta" : {
"profile" : [
🔗 "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"🔗 ,
"http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-computablelibrary"🔗 ,
"http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"🔗 ,
"http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-executablelibrary"🔗 ,
"http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"🔗 ,
"http://hl7.org/fhir/uv/cql/StructureDefinition/elm-json-library"🔗 ,
"http://hl7.org/fhir/uv/cql/StructureDefinition/elm-xml-library"
]
},
"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<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Title</th>\n\n\n\n<td class=\"content-container\">CMS108FHIRVTEProphylaxis</td>\n\n\n</tr>\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<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Identifier</th>\n\n\n\n<td class=\"content-container\">CMS108FHIRVTEProphylaxis</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<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Topic</th>\n\n\n\n<td class=\"content-container\">FHIR\n</td>\n\n\n</tr>\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Topic</th>\n\n\n\n<td class=\"content-container\">CQL\n</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Steward (Publisher)</th>\n\n\n\n<td class=\"content-container\">The Joint Commission</td>\n\n\n</tr>\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Description</th>\n\n\n\n<td class=\"content-container\"><div><p>CMS108FHIRVTEProphylaxis</p>\n</div></td>\n\n\n</tr>\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 CMS108FHIRVTEProphylaxis 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 USCommon\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 TJCOverall version '9.1.000' called TJC\ninclude VTE version '9.1.000' called VTE\n\ncodesystem "LOINC": 'http://loinc.org'\n\ncode "Risk for venous thromboembolism": '72136-5' from "LOINC" display 'Risk for venous thromboembolism'\n\nvalueset "Application of Graduated Compression Stockings": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.66'\nvalueset "Application of Intermittent Pneumatic Compression Devices": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.65'\nvalueset "Application of Venous Foot Pumps": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.64'\nvalueset "Atrial Fibrillation or Flutter": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.202'\nvalueset "Comfort Measures": 'http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45'\nvalueset "Direct Thrombin Inhibitor": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.205'\nvalueset "General or Neuraxial Anesthesia": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.1743'\nvalueset "General Surgery": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.255'\nvalueset "Glycoprotein IIb IIIa Inhibitors": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.41'\nvalueset "Graduated compression stockings": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.256'\nvalueset "Gynecological Surgery": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.257'\nvalueset "Hemorrhagic Stroke": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.212'\nvalueset "Ischemic Stroke": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.247'\nvalueset "Hip Fracture Surgery": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.258'\nvalueset "Hip Replacement Surgery": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.259'\nvalueset "Injectable Factor Xa Inhibitor for VTE Prophylaxis": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.211'\nvalueset "INR": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.213'\nvalueset "Intensive Care Unit": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1029.206'\nvalueset "Intermittent pneumatic compression devices": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.214'\nvalueset "Intracranial Neurosurgery": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.260'\nvalueset "Intravenous route": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.222'\nvalueset "Knee Replacement Surgery": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.261'\nvalueset "Low Dose Unfractionated Heparin for VTE Prophylaxis": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.39'\nvalueset "Low Molecular Weight Heparin for VTE Prophylaxis": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.219'\nvalueset "Low Risk": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.400'\nvalueset "Medical Reason For Not Providing Treatment": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.473'\nvalueset "Mental Health Diagnoses": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.105.12.1004'\nvalueset "Oral Factor Xa Inhibitor for VTE Prophylaxis or VTE Treatment": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.134'\nvalueset "Patient Refusal": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.93'\nvalueset "Rivaroxaban for VTE Prophylaxis": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.50'\nvalueset "Subcutaneous route": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.223'\nvalueset "Unfractionated Heparin": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.218'\nvalueset "Urological Surgery": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.272'\nvalueset "Venous foot pumps": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.230'\nvalueset "Venous Thromboembolism": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.279'\nvalueset "Warfarin": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.232'\n\nparameter "Measurement Period" Interval<DateTime>\n default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)\n\ncontext Patient\n\ndefine "SDE Ethnicity":\n SDE."SDE Ethnicity"\n\ndefine "SDE Payer":\n SDE."SDE Payer"\n\ndefine "SDE Race":\n SDE."SDE Race"\n\ndefine "SDE Sex":\n SDE."SDE Sex"\n\ndefine "Initial Population":\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions"\n\ndefine "Denominator":\n "Initial Population"\n\ndefine "Denominator Exclusions":\n "Encounter Less Than 2 Days"\n union "Encounter With ICU Location Stay 1 Day Or More"\n union "Encounter With Principal Diagnosis Of Mental Disorder Or Stroke"\n union "Encounter With Principal Procedure Of Selected Surgery"\n union "Encounter With Intervention Comfort Measures From Day Of Start Of Hospitalization To Day After Admission"\n union "Encounter With Intervention Comfort Measures On Day Of Or Day After Procedure"\n\ndefine "Encounter Less Than 2 Days":\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter\n where QualifyingEncounter.period.lengthInDays ( ) < 2\n\ndefine "Encounter With ICU Location Stay 1 Day Or More":\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter\n where exists ( QualifyingEncounter.location Location\n where Location.location.getLocation ( ).type in "Intensive Care Unit"\n and Location.period.lengthInDays ( ) >= 1\n and Location.period starts on or after start of QualifyingEncounter.period\n and date from ( start of Location.period ) during ( start of QualifyingEncounter.period ).calendarDayOfOrDayAfter ( )\n )\n\ndefine "Encounter With Principal Diagnosis Of Mental Disorder Or Stroke":\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter\n where QualifyingEncounter.hasPrincipalDiagnosisOf ( "Mental Health Diagnoses" )\n or QualifyingEncounter.hasPrincipalDiagnosisOf ( "Hemorrhagic Stroke" )\n or QualifyingEncounter.hasPrincipalDiagnosisOf ( "Ischemic Stroke" )\n\ndefine "Encounter With Principal Procedure Of Selected Surgery":\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter\n where QualifyingEncounter.hasPrincipalProcedureOf ( "General Surgery" )\n or QualifyingEncounter.hasPrincipalProcedureOf ( "Gynecological Surgery" )\n or QualifyingEncounter.hasPrincipalProcedureOf ( "Hip Fracture Surgery" )\n or QualifyingEncounter.hasPrincipalProcedureOf ( "Hip Replacement Surgery" )\n or QualifyingEncounter.hasPrincipalProcedureOf ( "Intracranial Neurosurgery" )\n or QualifyingEncounter.hasPrincipalProcedureOf ( "Knee Replacement Surgery" )\n or QualifyingEncounter.hasPrincipalProcedureOf ( "Urological Surgery" )\n\ndefine "Intervention Comfort Measures":\n ( ["ServiceRequest": "Comfort Measures"] InterventionRequest\n where InterventionRequest.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n and InterventionRequest.status in { 'active', 'completed' }\n )\n union ( ["Procedure": "Comfort Measures"] InterventionPerformed\n where InterventionPerformed.status in { 'completed', 'in-progress' }\n )\n\ndefine "Encounter With Intervention Comfort Measures On Day Of Or Day After Procedure":\n from\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter,\n ["Procedure": "General or Neuraxial Anesthesia"] AnesthesiaProcedure,\n "Intervention Comfort Measures" ComfortMeasure\n where AnesthesiaProcedure.status = 'completed'\n and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period\n and Coalesce(start of ComfortMeasure.performed.toInterval(), ComfortMeasure.authoredOn) during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )\n return QualifyingEncounter\n\ndefine "Encounter With Intervention Comfort Measures From Day Of Start Of Hospitalization To Day After Admission":\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter\n with "Intervention Comfort Measures" ComfortMeasure\n such that Coalesce(start of ComfortMeasure.performed.toInterval(), ComfortMeasure.authoredOn) during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )\n\ndefine "Numerator":\n "Encounter With VTE Prophylaxis Received From Day Of Start Of Hospitalization To Day After Admission Or Procedure"\n union ( "Encounter With Medication Oral Factor Xa Inhibitor Administered On Day Of Or Day After Admission Or Procedure"\n intersect ( "Encounter With Prior Or Present Diagnosis Of Atrial Fibrillation Or Prior Diagnosis Of VTE"\n union "Encounter With Prior Or Present Procedure Of Hip Or Knee Replacement Surgery"\n )\n )\n union "Encounter With Low Risk For VTE Or Anticoagulant Administered"\n union "Encounter With No VTE Prophylaxis Due To Medical Reason"\n union "Encounter With No VTE Prophylaxis Due To Patient Refusal"\n\ndefine "Pharmacological or Mechanical VTE Prophylaxis Received":\n ( ["MedicationAdministration": "Low Dose Unfractionated Heparin for VTE Prophylaxis"] VTEMedication\n where VTEMedication.status = 'completed'\n and VTEMedication.dosage.route in "Subcutaneous route"\n )\n union ( ["MedicationAdministration": "Low Molecular Weight Heparin for VTE Prophylaxis"] LMWH\n where LMWH.status = 'completed'\n )\n union ( ["MedicationAdministration": "Injectable Factor Xa Inhibitor for VTE Prophylaxis"] FactorXa\n where FactorXa.status = 'completed'\n )\n union ( ["MedicationAdministration": "Warfarin"] WarfarinAdm\n where WarfarinAdm.status = 'completed'\n )\n union ( ["MedicationAdministration": "Rivaroxaban for VTE Prophylaxis"] Rivaroxaban\n where Rivaroxaban.status = 'completed'\n )\n union ( ( ["Procedure": "Application of Intermittent Pneumatic Compression Devices"]\n union ["Procedure": "Application of Venous Foot Pumps"]\n union ["Procedure": "Application of Graduated Compression Stockings"] ) DeviceApplied\n where DeviceApplied.status = 'completed'\n )\n\ndefine "Encounter With VTE Prophylaxis Received From Day Of Start Of Hospitalization To Day After Admission Or Procedure":\n ( from\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter,\n "Pharmacological or Mechanical VTE Prophylaxis Received" VTEProphylaxis\n where Coalesce(VTEProphylaxis.effective.toInterval(), VTEProphylaxis.performed.toInterval()) starts during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )\n return QualifyingEncounter\n )\n union ( from\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter,\n ["Procedure": "General or Neuraxial Anesthesia"] AnesthesiaProcedure,\n "Pharmacological or Mechanical VTE Prophylaxis Received" VTEProphylaxis\n where AnesthesiaProcedure.status = 'completed'\n and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period\n and Coalesce(VTEProphylaxis.effective.toInterval(), VTEProphylaxis.performed.toInterval()) starts during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )\n return QualifyingEncounter\n )\n\ndefine "Encounter With Medication Oral Factor Xa Inhibitor Administered On Day Of Or Day After Admission Or Procedure":\n ( from\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter,\n ["MedicationAdministration": "Oral Factor Xa Inhibitor for VTE Prophylaxis or VTE Treatment"] FactorXaMedication\n where FactorXaMedication.status = 'completed'\n and FactorXaMedication.effective.toInterval ( ) starts during day of ( start of QualifyingEncounter.period ).calendarDayOfOrDayAfter ( )\n return QualifyingEncounter\n )\n union ( from\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter,\n ["Procedure": "General or Neuraxial Anesthesia"] AnesthesiaProcedure,\n ["MedicationAdministration": "Oral Factor Xa Inhibitor for VTE Prophylaxis or VTE Treatment"] FactorXaMedication\n where FactorXaMedication.status = 'completed'\n and AnesthesiaProcedure.status = 'completed'\n and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period\n and FactorXaMedication.effective.toInterval ( ) starts during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )\n return QualifyingEncounter\n )\n\ndefine "Encounter With Prior Or Present Diagnosis Of Atrial Fibrillation Or Prior Diagnosis Of VTE":\n ( VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter\n with ["ConditionProblemsHealthConcerns": "Atrial Fibrillation or Flutter"] AtrialFibrillation\n such that AtrialFibrillation.verificationStatus is not null implies ( AtrialFibrillation.verificationStatus !~ FHIRCommon."refuted"\n and AtrialFibrillation.verificationStatus !~ FHIRCommon."entered-in-error"\n )\n and AtrialFibrillation.prevalenceInterval ( ) starts on or before end of QualifyingEncounter.period\n )\n union ( VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter\n where QualifyingEncounter.hasEncDiagnosisOf ( "Atrial Fibrillation or Flutter" )\n )\n union ( VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter\n with ["ConditionProblemsHealthConcerns": "Venous Thromboembolism"] VTEDiagnosis\n such that ( VTEDiagnosis.clinicalStatus ~ FHIRCommon."inactive"\n or VTEDiagnosis.clinicalStatus ~ FHIRCommon."remission"\n or VTEDiagnosis.clinicalStatus ~ FHIRCommon."resolved"\n )\n and VTEDiagnosis.verificationStatus is not null implies ( VTEDiagnosis.verificationStatus !~ FHIRCommon."refuted"\n and VTEDiagnosis.verificationStatus !~ FHIRCommon."entered-in-error"\n )\n and VTEDiagnosis.prevalenceInterval ( ) before start of QualifyingEncounter.period\n )\n\ndefine "Encounter With Prior Or Present Procedure Of Hip Or Knee Replacement Surgery":\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter\n with ( ["Procedure": "Hip Replacement Surgery"]\n union ["Procedure": "Knee Replacement Surgery"] ) HipKneeProcedure\n such that HipKneeProcedure.status = 'completed'\n and HipKneeProcedure.performed.toInterval ( ) starts on or before end of QualifyingEncounter.period\n\ndefine "Encounter With Low Risk For VTE Or Anticoagulant Administered":\n "Low Risk For VTE Or Anticoagulant Administered From Day Of Start Of Hospitalization To Day After Admission"\n union "Low Risk For VTE Or Anticoagulant Administered On Day Of Or Day After Procedure"\n\ndefine "Low Risk Indicator For VTE":\n ( ["SimpleObservation": "Risk for venous thromboembolism"] VTERiskAssessment\n where VTERiskAssessment.value as FHIR.CodeableConcept in "Low Risk"\n and VTERiskAssessment.status in { 'final', 'amended', 'corrected' }\n return {\n id: VTERiskAssessment.id,\n LowRiskDatetime: VTERiskAssessment.effective.earliest ( )\n }\n )\n union ( ["LaboratoryResultObservation": "INR"] INRLabTest\n where INRLabTest.value as Quantity > 3.0\n and INRLabTest.status in { 'final', 'amended', 'corrected' }\n return {\n id: INRLabTest.id,\n LowRiskDatetime: INRLabTest.issued\n }\n )\n union ( ( ( ["MedicationAdministration": "Unfractionated Heparin"] UnfractionatedHeparin\n where UnfractionatedHeparin.dosage.route in "Intravenous route"\n )\n union ["MedicationAdministration": "Direct Thrombin Inhibitor"]\n union ["MedicationAdministration": "Glycoprotein IIb IIIa Inhibitors"] ) AnticoagulantMedication\n where AnticoagulantMedication.status = 'completed'\n return {\n id: AnticoagulantMedication.id,\n LowRiskDatetime: start of AnticoagulantMedication.effective.toInterval ( )\n }\n )\n\ndefine "Low Risk For VTE Or Anticoagulant Administered From Day Of Start Of Hospitalization To Day After Admission":\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter\n with "Low Risk Indicator For VTE" LowRiskForVTE\n such that LowRiskForVTE.LowRiskDatetime during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )\n\ndefine "Low Risk For VTE Or Anticoagulant Administered On Day Of Or Day After Procedure":\n from\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter,\n ["Procedure": "General or Neuraxial Anesthesia"] AnesthesiaProcedure,\n "Low Risk Indicator For VTE" LowRiskForVTE\n where AnesthesiaProcedure.status = 'completed'\n and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period\n and LowRiskForVTE.LowRiskDatetime during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )\n return QualifyingEncounter\n\ndefine "Encounter With No VTE Prophylaxis Due To Medical Reason":\n ( "No VTE Prophylaxis Medication Due To Medical Reason From Day Of Start Of Hospitalization To Day After Admission"\n intersect "No Mechanical VTE Prophylaxis Due To Medical Reason From Day Of Start Of Hospitalization To Day After Admission"\n )\n union ( "No VTE Prophylaxis Medication Due To Medical Reason On Day Of Or Day After Procedure"\n intersect "No Mechanical VTE Prophylaxis Due To Medical Reason On Day Of Or Day After Procedure"\n )\n\ndefine "No VTE Prophylaxis Medication Due To Medical Reason From Day Of Start Of Hospitalization To Day After Admission":\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter\n with "No VTE Prophylaxis Medication Administered Or Ordered" NoVTEMedication\n such that NoVTEMedication.medicationStatusReason in "Medical Reason For Not Providing Treatment"\n and NoVTEMedication.authoredOn during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )\n\ndefine "No VTE Prophylaxis Medication Due To Medical Reason On Day Of Or Day After Procedure":\n from\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter,\n ["Procedure": "General or Neuraxial Anesthesia"] AnesthesiaProcedure,\n "No VTE Prophylaxis Medication Administered Or Ordered" NoVTEMedication\n where NoVTEMedication.medicationStatusReason in "Medical Reason For Not Providing Treatment"\n and AnesthesiaProcedure.status = 'completed'\n and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period\n and NoVTEMedication.authoredOn during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )\n return QualifyingEncounter\n\ndefine "No VTE Prophylaxis Medication Administered Or Ordered":\n ( ( [MedicationAdministrationNotDone: "Low Dose Unfractionated Heparin for VTE Prophylaxis"]\n union [MedicationAdministrationNotDone: "Low Molecular Weight Heparin for VTE Prophylaxis"]\n union [MedicationAdministrationNotDone: "Injectable Factor Xa Inhibitor for VTE Prophylaxis"]\n union [MedicationAdministrationNotDone: "Warfarin"]\n union [MedicationAdministrationNotDone: "Rivaroxaban for VTE Prophylaxis"] ) NoMedicationAdm\n return {\n id: NoMedicationAdm.id,\n medicationStatusReason: NoMedicationAdm.statusReason,\n authoredOn: NoMedicationAdm.recorded()\n }\n )\n union ( ( ["MedicationNotRequested": "Low Dose Unfractionated Heparin for VTE Prophylaxis"]\n union ["MedicationNotRequested": "Low Molecular Weight Heparin for VTE Prophylaxis"]\n union ["MedicationNotRequested": "Injectable Factor Xa Inhibitor for VTE Prophylaxis"]\n union ["MedicationNotRequested": "Warfarin"]\n union ["MedicationNotRequested": "Rivaroxaban for VTE Prophylaxis"] ) NoMedicationOrder\n where NoMedicationOrder.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n and NoMedicationOrder.status in { 'active', 'completed' }\n return {\n id: NoMedicationOrder.id,\n medicationStatusReason: NoMedicationOrder.reasonCode,\n authoredOn: NoMedicationOrder.authoredOn\n }\n )\n union ( from\n ( ["MedicationRequest": "Low Dose Unfractionated Heparin for VTE Prophylaxis"]\n union ["MedicationRequest": "Low Molecular Weight Heparin for VTE Prophylaxis"]\n union ["MedicationRequest": "Injectable Factor Xa Inhibitor for VTE Prophylaxis"]\n union ["MedicationRequest": "Warfarin"]\n union ["MedicationRequest": "Rivaroxaban for VTE Prophylaxis"] ) MedicationOrderReject,\n [TaskRejected] T\n where T.focus.references ( MedicationOrderReject )\n and T.code ~ USQualityCoreCommon."Fulfill"\n and MedicationOrderReject.status = 'active'\n return {\n id: MedicationOrderReject.id,\n medicationStatusReason: { T.statusReason },\n authoredOn: MedicationOrderReject.authoredOn\n }\n )\n\ndefine "No Mechanical VTE Prophylaxis Due To Medical Reason From Day Of Start Of Hospitalization To Day After Admission":\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter\n with "No Mechanical VTE Prophylaxis Performed Or Ordered" NoVTEDevice\n such that NoVTEDevice.requestStatusReason in "Medical Reason For Not Providing Treatment"\n and NoVTEDevice.authoredOn during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )\n\ndefine "No Mechanical VTE Prophylaxis Due To Medical Reason On Day Of Or Day After Procedure":\n from\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter,\n ["Procedure": "General or Neuraxial Anesthesia"] AnesthesiaProcedure,\n "No Mechanical VTE Prophylaxis Performed Or Ordered" NoVTEDevice\n where NoVTEDevice.requestStatusReason in "Medical Reason For Not Providing Treatment"\n and AnesthesiaProcedure.status = 'completed'\n and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period\n and NoVTEDevice.authoredOn during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )\n return QualifyingEncounter\n\ndefine "No Mechanical VTE Prophylaxis Performed Or Ordered":\n ( ( [ServiceNotRequested: "Venous foot pumps"]\n union [ServiceNotRequested: "Intermittent pneumatic compression devices"]\n union [ServiceNotRequested: "Graduated compression stockings"] ) DeviceNotOrder\n where DeviceNotOrder.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n return {\n id: DeviceNotOrder.id,\n requestStatusReason: DeviceNotOrder.reasonRefused(),\n authoredOn: DeviceNotOrder.authoredOn\n }\n )\n union ( from\n ( [ServiceRequest: "Venous foot pumps"]\n union [ServiceRequest: "Intermittent pneumatic compression devices"]\n union [ServiceRequest: "Graduated compression stockings"] ) DeviceOrderReject,\n [TaskRejected] T\n where DeviceOrderReject.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n and DeviceOrderReject.status = 'active'\n and T.focus.references ( DeviceOrderReject )\n and T.code ~ USQualityCoreCommon."Fulfill"\n return {\n id: DeviceOrderReject.id,\n requestStatusReason: T.statusReason,\n authoredOn: DeviceOrderReject.authoredOn\n }\n )\n union ( ( [ProcedureNotDone: "Application of Intermittent Pneumatic Compression Devices"]\n union [ProcedureNotDone: "Application of Venous Foot Pumps"]\n union [ProcedureNotDone: "Application of Graduated Compression Stockings"] ) DeviceNotApplied\n return {\n id: DeviceNotApplied.id,\n requestStatusReason: DeviceNotApplied.statusReason,\n authoredOn: DeviceNotApplied.performed\n }\n )\n\ndefine "Encounter With No VTE Prophylaxis Due To Patient Refusal":\n "No VTE Prophylaxis Due To Patient Refusal From Day Of Start Of Hospitalization To Day After Admission"\n union "No VTE Prophylaxis Due To Patient Refusal On Day Of Or Day After Procedure"\n\ndefine "No VTE Prophylaxis Due To Patient Refusal From Day Of Start Of Hospitalization To Day After Admission":\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter\n with "No Mechanical Or Pharmacological VTE Prophylaxis Due To Patient Refusal" PatientRefusal\n such that PatientRefusal.authoredOn during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )\n\ndefine "No Mechanical Or Pharmacological VTE Prophylaxis Due To Patient Refusal":\n ( "No VTE Prophylaxis Medication Administered Or Ordered" NoVTEMedication\n where exists ( NoVTEMedication.medicationStatusReason MedRsn\n where MedRsn in "Patient Refusal"\n )\n )\n union ( "No Mechanical VTE Prophylaxis Performed Or Ordered" NoVTEDevice\n where NoVTEDevice.requestStatusReason in "Patient Refusal"\n )\n\ndefine "No VTE Prophylaxis Due To Patient Refusal On Day Of Or Day After Procedure":\n from\n VTE."Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions" QualifyingEncounter,\n ["Procedure": "General or Neuraxial Anesthesia"] AnesthesiaProcedure,\n "No Mechanical Or Pharmacological VTE Prophylaxis Due To Patient Refusal" PatientRefusal\n where AnesthesiaProcedure.status = 'completed'\n and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period\n and PatientRefusal.authoredOn during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )\n return QualifyingEncounter\n\ndefine fluent function "fromDayOfStartOfHospitalizationToDayAfterAdmission"(Encounter Encounter):\n Interval[date from ( start of Encounter.hospitalizationWithObservation ( ) ), date from ( start of Encounter.period ) + 1 days]</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/CMS108FHIRVTEProphylaxis",
"identifier" : [
{
"use" : "official",
"system" : "https://madie.cms.gov/login",
"value" : "CMS108FHIRVTEProphylaxis"
}
],
"version" : "1.1.000",
"name" : "CMS108FHIRVTEProphylaxis",
"title" : "CMS108FHIRVTEProphylaxis",
"status" : "active",
"experimental" : false,
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/library-type",
"code" : "logic-library"
}
]
},
"date" : "2025-08-25T14:51:49+00:00",
"publisher" : "The Joint Commission",
"description" : "CMS108FHIRVTEProphylaxis",
"topic" : [
{
"text" : "FHIR"
},
{
"text" : "CQL"
}
],
"content" : [
{
"contentType" : "text/cql",
"data" : "LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVMxMDhGSElSVlRFUHJvcGh5bGF4aXMgdmVyc2lvbiAnMS4xLjAwMCcKCnVzaW5nIFVTUXVhbGl0eUNvcmUgdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcKdXNpbmcgVVNDb3JlIHZlcnNpb24gJzYuMS4wLWRlcml2ZWQnCnVzaW5nIEZISVIgdmVyc2lvbiAnNC4wLjEnCgppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMScgY2FsbGVkIEZISVJIZWxwZXJzCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJDb21tb24gdmVyc2lvbiAnMi4wLjAnIGNhbGxlZCBGSElSQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUNvbW1vbiB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvbW1vbgoKaW5jbHVkZSBDUU1Db21tb24gdmVyc2lvbiAnNS4xLjAwMCcgY2FsbGVkIENRTUNvbW1vbgppbmNsdWRlIFVTUXVhbGl0eUNvcmVDb21tb24gdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcgY2FsbGVkIFVTUXVhbGl0eUNvcmVDb21tb24KaW5jbHVkZSBTdXBwbGVtZW50YWxEYXRhRWxlbWVudHMgdmVyc2lvbiAnNi4xLjAwMCcgY2FsbGVkIFNERQppbmNsdWRlIFRKQ092ZXJhbGwgdmVyc2lvbiAnOS4xLjAwMCcgY2FsbGVkIFRKQwppbmNsdWRlIFZURSB2ZXJzaW9uICc5LjEuMDAwJyBjYWxsZWQgVlRFCgpjb2Rlc3lzdGVtICJMT0lOQyI6ICdodHRwOi8vbG9pbmMub3JnJwoKY29kZSAiUmlzayBmb3IgdmVub3VzIHRocm9tYm9lbWJvbGlzbSI6ICc3MjEzNi01JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnUmlzayBmb3IgdmVub3VzIHRocm9tYm9lbWJvbGlzbScKCnZhbHVlc2V0ICJBcHBsaWNhdGlvbiBvZiBHcmFkdWF0ZWQgQ29tcHJlc3Npb24gU3RvY2tpbmdzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTExMC42NicKdmFsdWVzZXQgIkFwcGxpY2F0aW9uIG9mIEludGVybWl0dGVudCBQbmV1bWF0aWMgQ29tcHJlc3Npb24gRGV2aWNlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExMTAuNjUnCnZhbHVlc2V0ICJBcHBsaWNhdGlvbiBvZiBWZW5vdXMgRm9vdCBQdW1wcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExMTAuNjQnCnZhbHVlc2V0ICJBdHJpYWwgRmlicmlsbGF0aW9uIG9yIEZsdXR0ZXIiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIwMicKdmFsdWVzZXQgIkNvbWZvcnQgTWVhc3VyZXMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzEuMy42LjEuNC4xLjMzODk1LjEuMy4wLjQ1Jwp2YWx1ZXNldCAiRGlyZWN0IFRocm9tYmluIEluaGliaXRvciI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjA1Jwp2YWx1ZXNldCAiR2VuZXJhbCBvciBOZXVyYXhpYWwgQW5lc3RoZXNpYSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy42NjYuNS4xNzQzJwp2YWx1ZXNldCAiR2VuZXJhbCBTdXJnZXJ5IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yNTUnCnZhbHVlc2V0ICJHbHljb3Byb3RlaW4gSUliIElJSWEgSW5oaWJpdG9ycyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEwNDUuNDEnCnZhbHVlc2V0ICJHcmFkdWF0ZWQgY29tcHJlc3Npb24gc3RvY2tpbmdzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yNTYnCnZhbHVlc2V0ICJHeW5lY29sb2dpY2FsIFN1cmdlcnkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjI1NycKdmFsdWVzZXQgIkhlbW9ycmhhZ2ljIFN0cm9rZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjEyJwp2YWx1ZXNldCAiSXNjaGVtaWMgU3Ryb2tlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yNDcnCnZhbHVlc2V0ICJIaXAgRnJhY3R1cmUgU3VyZ2VyeSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjU4Jwp2YWx1ZXNldCAiSGlwIFJlcGxhY2VtZW50IFN1cmdlcnkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjI1OScKdmFsdWVzZXQgIkluamVjdGFibGUgRmFjdG9yIFhhIEluaGliaXRvciBmb3IgVlRFIFByb3BoeWxheGlzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yMTEnCnZhbHVlc2V0ICJJTlIiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIxMycKdmFsdWVzZXQgIkludGVuc2l2ZSBDYXJlIFVuaXQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMDI5LjIwNicKdmFsdWVzZXQgIkludGVybWl0dGVudCBwbmV1bWF0aWMgY29tcHJlc3Npb24gZGV2aWNlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjE0Jwp2YWx1ZXNldCAiSW50cmFjcmFuaWFsIE5ldXJvc3VyZ2VyeSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjYwJwp2YWx1ZXNldCAiSW50cmF2ZW5vdXMgcm91dGUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIyMicKdmFsdWVzZXQgIktuZWUgUmVwbGFjZW1lbnQgU3VyZ2VyeSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjYxJwp2YWx1ZXNldCAiTG93IERvc2UgVW5mcmFjdGlvbmF0ZWQgSGVwYXJpbiBmb3IgVlRFIFByb3BoeWxheGlzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTA0NS4zOScKdmFsdWVzZXQgIkxvdyBNb2xlY3VsYXIgV2VpZ2h0IEhlcGFyaW4gZm9yIFZURSBQcm9waHlsYXhpcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjE5Jwp2YWx1ZXNldCAiTG93IFJpc2siOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjQwMCcKdmFsdWVzZXQgIk1lZGljYWwgUmVhc29uIEZvciBOb3QgUHJvdmlkaW5nIFRyZWF0bWVudCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuNDczJwp2YWx1ZXNldCAiTWVudGFsIEhlYWx0aCBEaWFnbm9zZXMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTA1LjEyLjEwMDQnCnZhbHVlc2V0ICJPcmFsIEZhY3RvciBYYSBJbmhpYml0b3IgZm9yIFZURSBQcm9waHlsYXhpcyBvciBWVEUgVHJlYXRtZW50IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4xMzQnCnZhbHVlc2V0ICJQYXRpZW50IFJlZnVzYWwiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjkzJwp2YWx1ZXNldCAiUml2YXJveGFiYW4gZm9yIFZURSBQcm9waHlsYXhpcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExMTAuNTAnCnZhbHVlc2V0ICJTdWJjdXRhbmVvdXMgcm91dGUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIyMycKdmFsdWVzZXQgIlVuZnJhY3Rpb25hdGVkIEhlcGFyaW4iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIxOCcKdmFsdWVzZXQgIlVyb2xvZ2ljYWwgU3VyZ2VyeSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjcyJwp2YWx1ZXNldCAiVmVub3VzIGZvb3QgcHVtcHMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIzMCcKdmFsdWVzZXQgIlZlbm91cyBUaHJvbWJvZW1ib2xpc20iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjI3OScKdmFsdWVzZXQgIldhcmZhcmluIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yMzInCgpwYXJhbWV0ZXIgIk1lYXN1cmVtZW50IFBlcmlvZCIgSW50ZXJ2YWw8RGF0ZVRpbWU+CiAgZGVmYXVsdCBJbnRlcnZhbFtAMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaLCBAMjAyNy0wMS0wMVQwMDowMDowMC4wMDBaKQoKY29udGV4dCBQYXRpZW50CgpkZWZpbmUgIlNERSBFdGhuaWNpdHkiOgogIFNERS4iU0RFIEV0aG5pY2l0eSIKCmRlZmluZSAiU0RFIFBheWVyIjoKICBTREUuIlNERSBQYXllciIKCmRlZmluZSAiU0RFIFJhY2UiOgogIFNERS4iU0RFIFJhY2UiCgpkZWZpbmUgIlNERSBTZXgiOgogIFNERS4iU0RFIFNleCIKCmRlZmluZSAiSW5pdGlhbCBQb3B1bGF0aW9uIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiCgpkZWZpbmUgIkRlbm9taW5hdG9yIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIgoKZGVmaW5lICJEZW5vbWluYXRvciBFeGNsdXNpb25zIjoKICAiRW5jb3VudGVyIExlc3MgVGhhbiAyIERheXMiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggSUNVIExvY2F0aW9uIFN0YXkgMSBEYXkgT3IgTW9yZSIKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBQcmluY2lwYWwgRGlhZ25vc2lzIE9mIE1lbnRhbCBEaXNvcmRlciBPciBTdHJva2UiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggUHJpbmNpcGFsIFByb2NlZHVyZSBPZiBTZWxlY3RlZCBTdXJnZXJ5IgogICAgdW5pb24gIkVuY291bnRlciBXaXRoIEludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIgogICAgdW5pb24gIkVuY291bnRlciBXaXRoIEludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgUHJvY2VkdXJlIgoKZGVmaW5lICJFbmNvdW50ZXIgTGVzcyBUaGFuIDIgRGF5cyI6CiAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZC5sZW5ndGhJbkRheXMgKCApIDwgMgoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBJQ1UgTG9jYXRpb24gU3RheSAxIERheSBPciBNb3JlIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdoZXJlIGV4aXN0cyAoIFF1YWxpZnlpbmdFbmNvdW50ZXIubG9jYXRpb24gTG9jYXRpb24KICAgICAgICB3aGVyZSBMb2NhdGlvbi5sb2NhdGlvbi5nZXRMb2NhdGlvbiAoICkudHlwZSBpbiAiSW50ZW5zaXZlIENhcmUgVW5pdCIKICAgICAgICAgIGFuZCBMb2NhdGlvbi5wZXJpb2QubGVuZ3RoSW5EYXlzICggKSA+PSAxCiAgICAgICAgICBhbmQgTG9jYXRpb24ucGVyaW9kIHN0YXJ0cyBvbiBvciBhZnRlciBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgYW5kIGRhdGUgZnJvbSAoIHN0YXJ0IG9mIExvY2F0aW9uLnBlcmlvZCApIGR1cmluZyAoIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kICkuY2FsZW5kYXJEYXlPZk9yRGF5QWZ0ZXIgKCApCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIFByaW5jaXBhbCBEaWFnbm9zaXMgT2YgTWVudGFsIERpc29yZGVyIE9yIFN0cm9rZSI6CiAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSBRdWFsaWZ5aW5nRW5jb3VudGVyLmhhc1ByaW5jaXBhbERpYWdub3Npc09mICggIk1lbnRhbCBIZWFsdGggRGlhZ25vc2VzIiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsRGlhZ25vc2lzT2YgKCAiSGVtb3JyaGFnaWMgU3Ryb2tlIiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsRGlhZ25vc2lzT2YgKCAiSXNjaGVtaWMgU3Ryb2tlIiApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIFByaW5jaXBhbCBQcm9jZWR1cmUgT2YgU2VsZWN0ZWQgU3VyZ2VyeSI6CiAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSBRdWFsaWZ5aW5nRW5jb3VudGVyLmhhc1ByaW5jaXBhbFByb2NlZHVyZU9mICggIkdlbmVyYWwgU3VyZ2VyeSIgKQogICAgICBvciBRdWFsaWZ5aW5nRW5jb3VudGVyLmhhc1ByaW5jaXBhbFByb2NlZHVyZU9mICggIkd5bmVjb2xvZ2ljYWwgU3VyZ2VyeSIgKQogICAgICBvciBRdWFsaWZ5aW5nRW5jb3VudGVyLmhhc1ByaW5jaXBhbFByb2NlZHVyZU9mICggIkhpcCBGcmFjdHVyZSBTdXJnZXJ5IiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsUHJvY2VkdXJlT2YgKCAiSGlwIFJlcGxhY2VtZW50IFN1cmdlcnkiICkKICAgICAgb3IgUXVhbGlmeWluZ0VuY291bnRlci5oYXNQcmluY2lwYWxQcm9jZWR1cmVPZiAoICJJbnRyYWNyYW5pYWwgTmV1cm9zdXJnZXJ5IiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsUHJvY2VkdXJlT2YgKCAiS25lZSBSZXBsYWNlbWVudCBTdXJnZXJ5IiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsUHJvY2VkdXJlT2YgKCAiVXJvbG9naWNhbCBTdXJnZXJ5IiApCgpkZWZpbmUgIkludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIjoKICAoIFsiU2VydmljZVJlcXVlc3QiOiAiQ29tZm9ydCBNZWFzdXJlcyJdIEludGVydmVudGlvblJlcXVlc3QKICAgICAgd2hlcmUgSW50ZXJ2ZW50aW9uUmVxdWVzdC5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICAgICAgIGFuZCBJbnRlcnZlbnRpb25SZXF1ZXN0LnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgKQogICAgdW5pb24gKCBbIlByb2NlZHVyZSI6ICJDb21mb3J0IE1lYXN1cmVzIl0gSW50ZXJ2ZW50aW9uUGVyZm9ybWVkCiAgICAgICAgd2hlcmUgSW50ZXJ2ZW50aW9uUGVyZm9ybWVkLnN0YXR1cyBpbiB7ICdjb21wbGV0ZWQnLCAnaW4tcHJvZ3Jlc3MnIH0KICAgICkKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggSW50ZXJ2ZW50aW9uIENvbWZvcnQgTWVhc3VyZXMgT24gRGF5IE9mIE9yIERheSBBZnRlciBQcm9jZWR1cmUiOgogIGZyb20KICAgIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlciwKICAgIFsiUHJvY2VkdXJlIjogIkdlbmVyYWwgb3IgTmV1cmF4aWFsIEFuZXN0aGVzaWEiXSBBbmVzdGhlc2lhUHJvY2VkdXJlLAogICAgIkludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIiBDb21mb3J0TWVhc3VyZQogICAgd2hlcmUgQW5lc3RoZXNpYVByb2NlZHVyZS5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgZW5kcyAxIGRheSBhZnRlciBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgYW5kIENvYWxlc2NlKHN0YXJ0IG9mIENvbWZvcnRNZWFzdXJlLnBlcmZvcm1lZC50b0ludGVydmFsKCksIENvbWZvcnRNZWFzdXJlLmF1dGhvcmVkT24pIGR1cmluZyBkYXkgb2YgKCBlbmQgb2YgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKS5jYWxlbmRhckRheU9mT3JEYXlBZnRlciAoICkKICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIEludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggIkludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIiBDb21mb3J0TWVhc3VyZQogICAgICBzdWNoIHRoYXQgQ29hbGVzY2Uoc3RhcnQgb2YgQ29tZm9ydE1lYXN1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwoKSwgQ29tZm9ydE1lYXN1cmUuYXV0aG9yZWRPbikgZHVyaW5nIGRheSBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmZyb21EYXlPZlN0YXJ0T2ZIb3NwaXRhbGl6YXRpb25Ub0RheUFmdGVyQWRtaXNzaW9uICggKQoKZGVmaW5lICJOdW1lcmF0b3IiOgogICJFbmNvdW50ZXIgV2l0aCBWVEUgUHJvcGh5bGF4aXMgUmVjZWl2ZWQgRnJvbSBEYXkgT2YgU3RhcnQgT2YgSG9zcGl0YWxpemF0aW9uIFRvIERheSBBZnRlciBBZG1pc3Npb24gT3IgUHJvY2VkdXJlIgogICAgdW5pb24gKCAiRW5jb3VudGVyIFdpdGggTWVkaWNhdGlvbiBPcmFsIEZhY3RvciBYYSBJbmhpYml0b3IgQWRtaW5pc3RlcmVkIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgQWRtaXNzaW9uIE9yIFByb2NlZHVyZSIKICAgICAgICBpbnRlcnNlY3QgKCAiRW5jb3VudGVyIFdpdGggUHJpb3IgT3IgUHJlc2VudCBEaWFnbm9zaXMgT2YgQXRyaWFsIEZpYnJpbGxhdGlvbiBPciBQcmlvciBEaWFnbm9zaXMgT2YgVlRFIgogICAgICAgICAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggUHJpb3IgT3IgUHJlc2VudCBQcm9jZWR1cmUgT2YgSGlwIE9yIEtuZWUgUmVwbGFjZW1lbnQgU3VyZ2VyeSIKICAgICAgICApCiAgICApCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggTG93IFJpc2sgRm9yIFZURSBPciBBbnRpY29hZ3VsYW50IEFkbWluaXN0ZXJlZCIKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIgogICAgdW5pb24gIkVuY291bnRlciBXaXRoIE5vIFZURSBQcm9waHlsYXhpcyBEdWUgVG8gUGF0aWVudCBSZWZ1c2FsIgoKZGVmaW5lICJQaGFybWFjb2xvZ2ljYWwgb3IgTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgUmVjZWl2ZWQiOgogICggWyJNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24iOiAiTG93IERvc2UgVW5mcmFjdGlvbmF0ZWQgSGVwYXJpbiBmb3IgVlRFIFByb3BoeWxheGlzIl0gVlRFTWVkaWNhdGlvbgogICAgICB3aGVyZSBWVEVNZWRpY2F0aW9uLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgYW5kIFZURU1lZGljYXRpb24uZG9zYWdlLnJvdXRlIGluICJTdWJjdXRhbmVvdXMgcm91dGUiCiAgKQogICAgdW5pb24gKCBbIk1lZGljYXRpb25BZG1pbmlzdHJhdGlvbiI6ICJMb3cgTW9sZWN1bGFyIFdlaWdodCBIZXBhcmluIGZvciBWVEUgUHJvcGh5bGF4aXMiXSBMTVdICiAgICAgICAgd2hlcmUgTE1XSC5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgKQogICAgdW5pb24gKCBbIk1lZGljYXRpb25BZG1pbmlzdHJhdGlvbiI6ICJJbmplY3RhYmxlIEZhY3RvciBYYSBJbmhpYml0b3IgZm9yIFZURSBQcm9waHlsYXhpcyJdIEZhY3RvclhhCiAgICAgICAgd2hlcmUgRmFjdG9yWGEuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICkKICAgIHVuaW9uICggWyJNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24iOiAiV2FyZmFyaW4iXSBXYXJmYXJpbkFkbQogICAgICAgIHdoZXJlIFdhcmZhcmluQWRtLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICApCiAgICB1bmlvbiAoIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIlJpdmFyb3hhYmFuIGZvciBWVEUgUHJvcGh5bGF4aXMiXSBSaXZhcm94YWJhbgogICAgICAgIHdoZXJlIFJpdmFyb3hhYmFuLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICApCiAgICB1bmlvbiAoICggWyJQcm9jZWR1cmUiOiAiQXBwbGljYXRpb24gb2YgSW50ZXJtaXR0ZW50IFBuZXVtYXRpYyBDb21wcmVzc2lvbiBEZXZpY2VzIl0KICAgICAgICB1bmlvbiBbIlByb2NlZHVyZSI6ICJBcHBsaWNhdGlvbiBvZiBWZW5vdXMgRm9vdCBQdW1wcyJdCiAgICAgICAgdW5pb24gWyJQcm9jZWR1cmUiOiAiQXBwbGljYXRpb24gb2YgR3JhZHVhdGVkIENvbXByZXNzaW9uIFN0b2NraW5ncyJdICkgRGV2aWNlQXBwbGllZAogICAgICAgIHdoZXJlIERldmljZUFwcGxpZWQuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICkKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggVlRFIFByb3BoeWxheGlzIFJlY2VpdmVkIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIE9yIFByb2NlZHVyZSI6CiAgKCBmcm9tCiAgICAgIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlciwKICAgICAgIlBoYXJtYWNvbG9naWNhbCBvciBNZWNoYW5pY2FsIFZURSBQcm9waHlsYXhpcyBSZWNlaXZlZCIgVlRFUHJvcGh5bGF4aXMKICAgICAgd2hlcmUgQ29hbGVzY2UoVlRFUHJvcGh5bGF4aXMuZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSwgVlRFUHJvcGh5bGF4aXMucGVyZm9ybWVkLnRvSW50ZXJ2YWwoKSkgc3RhcnRzIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5mcm9tRGF5T2ZTdGFydE9mSG9zcGl0YWxpemF0aW9uVG9EYXlBZnRlckFkbWlzc2lvbiAoICkKICAgICAgcmV0dXJuIFF1YWxpZnlpbmdFbmNvdW50ZXIKICApCiAgICB1bmlvbiAoIGZyb20KICAgICAgICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICAgICAgWyJQcm9jZWR1cmUiOiAiR2VuZXJhbCBvciBOZXVyYXhpYWwgQW5lc3RoZXNpYSJdIEFuZXN0aGVzaWFQcm9jZWR1cmUsCiAgICAgICAgIlBoYXJtYWNvbG9naWNhbCBvciBNZWNoYW5pY2FsIFZURSBQcm9waHlsYXhpcyBSZWNlaXZlZCIgVlRFUHJvcGh5bGF4aXMKICAgICAgICB3aGVyZSBBbmVzdGhlc2lhUHJvY2VkdXJlLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgZW5kcyAxIGRheSBhZnRlciBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgICAgIGFuZCBDb2FsZXNjZShWVEVQcm9waHlsYXhpcy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpLCBWVEVQcm9waHlsYXhpcy5wZXJmb3JtZWQudG9JbnRlcnZhbCgpKSBzdGFydHMgZHVyaW5nIGRheSBvZiAoIGVuZCBvZiBBbmVzdGhlc2lhUHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKSApLmNhbGVuZGFyRGF5T2ZPckRheUFmdGVyICggKQogICAgICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIE1lZGljYXRpb24gT3JhbCBGYWN0b3IgWGEgSW5oaWJpdG9yIEFkbWluaXN0ZXJlZCBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIEFkbWlzc2lvbiBPciBQcm9jZWR1cmUiOgogICggZnJvbQogICAgICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICAgIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIk9yYWwgRmFjdG9yIFhhIEluaGliaXRvciBmb3IgVlRFIFByb3BoeWxheGlzIG9yIFZURSBUcmVhdG1lbnQiXSBGYWN0b3JYYU1lZGljYXRpb24KICAgICAgd2hlcmUgRmFjdG9yWGFNZWRpY2F0aW9uLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgYW5kIEZhY3RvclhhTWVkaWNhdGlvbi5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBkYXkgb2YgKCBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZCApLmNhbGVuZGFyRGF5T2ZPckRheUFmdGVyICggKQogICAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgogICkKICAgIHVuaW9uICggZnJvbQogICAgICAgIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlciwKICAgICAgICBbIlByb2NlZHVyZSI6ICJHZW5lcmFsIG9yIE5ldXJheGlhbCBBbmVzdGhlc2lhIl0gQW5lc3RoZXNpYVByb2NlZHVyZSwKICAgICAgICBbIk1lZGljYXRpb25BZG1pbmlzdHJhdGlvbiI6ICJPcmFsIEZhY3RvciBYYSBJbmhpYml0b3IgZm9yIFZURSBQcm9waHlsYXhpcyBvciBWVEUgVHJlYXRtZW50Il0gRmFjdG9yWGFNZWRpY2F0aW9uCiAgICAgICAgd2hlcmUgRmFjdG9yWGFNZWRpY2F0aW9uLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICAgICAgYW5kIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGVuZHMgMSBkYXkgYWZ0ZXIgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICBhbmQgRmFjdG9yWGFNZWRpY2F0aW9uLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBzdGFydHMgZHVyaW5nIGRheSBvZiAoIGVuZCBvZiBBbmVzdGhlc2lhUHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKSApLmNhbGVuZGFyRGF5T2ZPckRheUFmdGVyICggKQogICAgICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIFByaW9yIE9yIFByZXNlbnQgRGlhZ25vc2lzIE9mIEF0cmlhbCBGaWJyaWxsYXRpb24gT3IgUHJpb3IgRGlhZ25vc2lzIE9mIFZURSI6CiAgKCBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgd2l0aCBbIkNvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnMiOiAiQXRyaWFsIEZpYnJpbGxhdGlvbiBvciBGbHV0dGVyIl0gQXRyaWFsRmlicmlsbGF0aW9uCiAgICAgICAgc3VjaCB0aGF0IEF0cmlhbEZpYnJpbGxhdGlvbi52ZXJpZmljYXRpb25TdGF0dXMgaXMgbm90IG51bGwgaW1wbGllcyAoIEF0cmlhbEZpYnJpbGxhdGlvbi52ZXJpZmljYXRpb25TdGF0dXMgIX4gRkhJUkNvbW1vbi4icmVmdXRlZCIKICAgICAgICAgICAgYW5kIEF0cmlhbEZpYnJpbGxhdGlvbi52ZXJpZmljYXRpb25TdGF0dXMgIX4gRkhJUkNvbW1vbi4iZW50ZXJlZC1pbi1lcnJvciIKICAgICAgICApCiAgICAgICAgICBhbmQgQXRyaWFsRmlicmlsbGF0aW9uLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgc3RhcnRzIG9uIG9yIGJlZm9yZSBlbmQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICApCiAgICB1bmlvbiAoIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgICAgIHdoZXJlIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzRW5jRGlhZ25vc2lzT2YgKCAiQXRyaWFsIEZpYnJpbGxhdGlvbiBvciBGbHV0dGVyIiApCiAgICApCiAgICB1bmlvbiAoIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgICAgIHdpdGggWyJDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zIjogIlZlbm91cyBUaHJvbWJvZW1ib2xpc20iXSBWVEVEaWFnbm9zaXMKICAgICAgICAgIHN1Y2ggdGhhdCAoIFZURURpYWdub3Npcy5jbGluaWNhbFN0YXR1cyB+IEZISVJDb21tb24uImluYWN0aXZlIgogICAgICAgICAgICAgIG9yIFZURURpYWdub3Npcy5jbGluaWNhbFN0YXR1cyB+IEZISVJDb21tb24uInJlbWlzc2lvbiIKICAgICAgICAgICAgICBvciBWVEVEaWFnbm9zaXMuY2xpbmljYWxTdGF0dXMgfiBGSElSQ29tbW9uLiJyZXNvbHZlZCIKICAgICAgICAgICkKICAgICAgICAgICAgYW5kIFZURURpYWdub3Npcy52ZXJpZmljYXRpb25TdGF0dXMgaXMgbm90IG51bGwgaW1wbGllcyAoIFZURURpYWdub3Npcy52ZXJpZmljYXRpb25TdGF0dXMgIX4gRkhJUkNvbW1vbi4icmVmdXRlZCIKICAgICAgICAgICAgICBhbmQgVlRFRGlhZ25vc2lzLnZlcmlmaWNhdGlvblN0YXR1cyAhfiBGSElSQ29tbW9uLiJlbnRlcmVkLWluLWVycm9yIgogICAgICAgICAgKQogICAgICAgICAgICBhbmQgVlRFRGlhZ25vc2lzLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgYmVmb3JlIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIFByaW9yIE9yIFByZXNlbnQgUHJvY2VkdXJlIE9mIEhpcCBPciBLbmVlIFJlcGxhY2VtZW50IFN1cmdlcnkiOgogIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2l0aCAoIFsiUHJvY2VkdXJlIjogIkhpcCBSZXBsYWNlbWVudCBTdXJnZXJ5Il0KICAgICAgdW5pb24gWyJQcm9jZWR1cmUiOiAiS25lZSBSZXBsYWNlbWVudCBTdXJnZXJ5Il0gKSBIaXBLbmVlUHJvY2VkdXJlCiAgICAgIHN1Y2ggdGhhdCBIaXBLbmVlUHJvY2VkdXJlLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgYW5kIEhpcEtuZWVQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBvbiBvciBiZWZvcmUgZW5kIG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIExvdyBSaXNrIEZvciBWVEUgT3IgQW50aWNvYWd1bGFudCBBZG1pbmlzdGVyZWQiOgogICJMb3cgUmlzayBGb3IgVlRFIE9yIEFudGljb2FndWxhbnQgQWRtaW5pc3RlcmVkIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIgogICAgdW5pb24gIkxvdyBSaXNrIEZvciBWVEUgT3IgQW50aWNvYWd1bGFudCBBZG1pbmlzdGVyZWQgT24gRGF5IE9mIE9yIERheSBBZnRlciBQcm9jZWR1cmUiCgpkZWZpbmUgIkxvdyBSaXNrIEluZGljYXRvciBGb3IgVlRFIjoKICAoIFsiU2ltcGxlT2JzZXJ2YXRpb24iOiAiUmlzayBmb3IgdmVub3VzIHRocm9tYm9lbWJvbGlzbSJdIFZURVJpc2tBc3Nlc3NtZW50CiAgICAgIHdoZXJlIFZURVJpc2tBc3Nlc3NtZW50LnZhbHVlIGFzIEZISVIuQ29kZWFibGVDb25jZXB0IGluICJMb3cgUmlzayIKICAgICAgICBhbmQgVlRFUmlza0Fzc2Vzc21lbnQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgIHJldHVybiB7CiAgICAgICAgaWQ6IFZURVJpc2tBc3Nlc3NtZW50LmlkLAogICAgICAgIExvd1Jpc2tEYXRldGltZTogVlRFUmlza0Fzc2Vzc21lbnQuZWZmZWN0aXZlLmVhcmxpZXN0ICggKQogICAgICB9CiAgKQogICAgdW5pb24gKCBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJJTlIiXSBJTlJMYWJUZXN0CiAgICAgICAgd2hlcmUgSU5STGFiVGVzdC52YWx1ZSBhcyBRdWFudGl0eSA+IDMuMAogICAgICAgICAgYW5kIElOUkxhYlRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGlkOiBJTlJMYWJUZXN0LmlkLAogICAgICAgICAgTG93Umlza0RhdGV0aW1lOiBJTlJMYWJUZXN0Lmlzc3VlZAogICAgICAgIH0KICAgICkKICAgIHVuaW9uICggKCAoIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIlVuZnJhY3Rpb25hdGVkIEhlcGFyaW4iXSBVbmZyYWN0aW9uYXRlZEhlcGFyaW4KICAgICAgICAgIHdoZXJlIFVuZnJhY3Rpb25hdGVkSGVwYXJpbi5kb3NhZ2Uucm91dGUgaW4gIkludHJhdmVub3VzIHJvdXRlIgogICAgICApCiAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24iOiAiRGlyZWN0IFRocm9tYmluIEluaGliaXRvciJdCiAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24iOiAiR2x5Y29wcm90ZWluIElJYiBJSUlhIEluaGliaXRvcnMiXSApIEFudGljb2FndWxhbnRNZWRpY2F0aW9uCiAgICAgICAgd2hlcmUgQW50aWNvYWd1bGFudE1lZGljYXRpb24uc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWQ6IEFudGljb2FndWxhbnRNZWRpY2F0aW9uLmlkLAogICAgICAgICAgTG93Umlza0RhdGV0aW1lOiBzdGFydCBvZiBBbnRpY29hZ3VsYW50TWVkaWNhdGlvbi5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkKICAgICAgICB9CiAgICApCgpkZWZpbmUgIkxvdyBSaXNrIEZvciBWVEUgT3IgQW50aWNvYWd1bGFudCBBZG1pbmlzdGVyZWQgRnJvbSBEYXkgT2YgU3RhcnQgT2YgSG9zcGl0YWxpemF0aW9uIFRvIERheSBBZnRlciBBZG1pc3Npb24iOgogIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2l0aCAiTG93IFJpc2sgSW5kaWNhdG9yIEZvciBWVEUiIExvd1Jpc2tGb3JWVEUKICAgICAgc3VjaCB0aGF0IExvd1Jpc2tGb3JWVEUuTG93Umlza0RhdGV0aW1lIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5mcm9tRGF5T2ZTdGFydE9mSG9zcGl0YWxpemF0aW9uVG9EYXlBZnRlckFkbWlzc2lvbiAoICkKCmRlZmluZSAiTG93IFJpc2sgRm9yIFZURSBPciBBbnRpY29hZ3VsYW50IEFkbWluaXN0ZXJlZCBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIFByb2NlZHVyZSI6CiAgZnJvbQogICAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyLAogICAgWyJQcm9jZWR1cmUiOiAiR2VuZXJhbCBvciBOZXVyYXhpYWwgQW5lc3RoZXNpYSJdIEFuZXN0aGVzaWFQcm9jZWR1cmUsCiAgICAiTG93IFJpc2sgSW5kaWNhdG9yIEZvciBWVEUiIExvd1Jpc2tGb3JWVEUKICAgIHdoZXJlIEFuZXN0aGVzaWFQcm9jZWR1cmUuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgYW5kIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGVuZHMgMSBkYXkgYWZ0ZXIgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgIGFuZCBMb3dSaXNrRm9yVlRFLkxvd1Jpc2tEYXRldGltZSBkdXJpbmcgZGF5IG9mICggZW5kIG9mIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApICkuY2FsZW5kYXJEYXlPZk9yRGF5QWZ0ZXIgKCApCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIjoKICAoICJObyBWVEUgUHJvcGh5bGF4aXMgTWVkaWNhdGlvbiBEdWUgVG8gTWVkaWNhbCBSZWFzb24gRnJvbSBEYXkgT2YgU3RhcnQgT2YgSG9zcGl0YWxpemF0aW9uIFRvIERheSBBZnRlciBBZG1pc3Npb24iCiAgICAgIGludGVyc2VjdCAiTm8gTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIgogICkKICAgIHVuaW9uICggIk5vIFZURSBQcm9waHlsYXhpcyBNZWRpY2F0aW9uIER1ZSBUbyBNZWRpY2FsIFJlYXNvbiBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIFByb2NlZHVyZSIKICAgICAgICBpbnRlcnNlY3QgIk5vIE1lY2hhbmljYWwgVlRFIFByb3BoeWxheGlzIER1ZSBUbyBNZWRpY2FsIFJlYXNvbiBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIFByb2NlZHVyZSIKICAgICkKCmRlZmluZSAiTm8gVlRFIFByb3BoeWxheGlzIE1lZGljYXRpb24gRHVlIFRvIE1lZGljYWwgUmVhc29uIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggIk5vIFZURSBQcm9waHlsYXhpcyBNZWRpY2F0aW9uIEFkbWluaXN0ZXJlZCBPciBPcmRlcmVkIiBOb1ZURU1lZGljYXRpb24KICAgICAgc3VjaCB0aGF0IE5vVlRFTWVkaWNhdGlvbi5tZWRpY2F0aW9uU3RhdHVzUmVhc29uIGluICJNZWRpY2FsIFJlYXNvbiBGb3IgTm90IFByb3ZpZGluZyBUcmVhdG1lbnQiCiAgICAgICAgYW5kIE5vVlRFTWVkaWNhdGlvbi5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5mcm9tRGF5T2ZTdGFydE9mSG9zcGl0YWxpemF0aW9uVG9EYXlBZnRlckFkbWlzc2lvbiAoICkKCmRlZmluZSAiTm8gVlRFIFByb3BoeWxheGlzIE1lZGljYXRpb24gRHVlIFRvIE1lZGljYWwgUmVhc29uIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgUHJvY2VkdXJlIjoKICBmcm9tCiAgICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICBbIlByb2NlZHVyZSI6ICJHZW5lcmFsIG9yIE5ldXJheGlhbCBBbmVzdGhlc2lhIl0gQW5lc3RoZXNpYVByb2NlZHVyZSwKICAgICJObyBWVEUgUHJvcGh5bGF4aXMgTWVkaWNhdGlvbiBBZG1pbmlzdGVyZWQgT3IgT3JkZXJlZCIgTm9WVEVNZWRpY2F0aW9uCiAgICB3aGVyZSBOb1ZURU1lZGljYXRpb24ubWVkaWNhdGlvblN0YXR1c1JlYXNvbiBpbiAiTWVkaWNhbCBSZWFzb24gRm9yIE5vdCBQcm92aWRpbmcgVHJlYXRtZW50IgogICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgZW5kcyAxIGRheSBhZnRlciBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgYW5kIE5vVlRFTWVkaWNhdGlvbi5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgKCBlbmQgb2YgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKS5jYWxlbmRhckRheU9mT3JEYXlBZnRlciAoICkKICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCgpkZWZpbmUgIk5vIFZURSBQcm9waHlsYXhpcyBNZWRpY2F0aW9uIEFkbWluaXN0ZXJlZCBPciBPcmRlcmVkIjoKICAoICggW01lZGljYXRpb25BZG1pbmlzdHJhdGlvbk5vdERvbmU6ICJMb3cgRG9zZSBVbmZyYWN0aW9uYXRlZCBIZXBhcmluIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICB1bmlvbiBbTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uTm90RG9uZTogIkxvdyBNb2xlY3VsYXIgV2VpZ2h0IEhlcGFyaW4gZm9yIFZURSBQcm9waHlsYXhpcyJdCiAgICAgIHVuaW9uIFtNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb25Ob3REb25lOiAiSW5qZWN0YWJsZSBGYWN0b3IgWGEgSW5oaWJpdG9yIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICB1bmlvbiBbTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uTm90RG9uZTogIldhcmZhcmluIl0KICAgICAgdW5pb24gW01lZGljYXRpb25BZG1pbmlzdHJhdGlvbk5vdERvbmU6ICJSaXZhcm94YWJhbiBmb3IgVlRFIFByb3BoeWxheGlzIl0gKSBOb01lZGljYXRpb25BZG0KICAgICAgcmV0dXJuIHsKICAgICAgICBpZDogTm9NZWRpY2F0aW9uQWRtLmlkLAogICAgICAgIG1lZGljYXRpb25TdGF0dXNSZWFzb246IE5vTWVkaWNhdGlvbkFkbS5zdGF0dXNSZWFzb24sCiAgICAgICAgYXV0aG9yZWRPbjogTm9NZWRpY2F0aW9uQWRtLnJlY29yZGVkKCkKICAgICAgfQogICkKICAgIHVuaW9uICggKCBbIk1lZGljYXRpb25Ob3RSZXF1ZXN0ZWQiOiAiTG93IERvc2UgVW5mcmFjdGlvbmF0ZWQgSGVwYXJpbiBmb3IgVlRFIFByb3BoeWxheGlzIl0KICAgICAgICB1bmlvbiBbIk1lZGljYXRpb25Ob3RSZXF1ZXN0ZWQiOiAiTG93IE1vbGVjdWxhciBXZWlnaHQgSGVwYXJpbiBmb3IgVlRFIFByb3BoeWxheGlzIl0KICAgICAgICB1bmlvbiBbIk1lZGljYXRpb25Ob3RSZXF1ZXN0ZWQiOiAiSW5qZWN0YWJsZSBGYWN0b3IgWGEgSW5oaWJpdG9yIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICAgIHVuaW9uIFsiTWVkaWNhdGlvbk5vdFJlcXVlc3RlZCI6ICJXYXJmYXJpbiJdCiAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uTm90UmVxdWVzdGVkIjogIlJpdmFyb3hhYmFuIGZvciBWVEUgUHJvcGh5bGF4aXMiXSApIE5vTWVkaWNhdGlvbk9yZGVyCiAgICAgICAgd2hlcmUgTm9NZWRpY2F0aW9uT3JkZXIuaW50ZW50IGluIHsgJ29yZGVyJywgJ29yaWdpbmFsLW9yZGVyJywgJ3JlZmxleC1vcmRlcicsICdmaWxsZXItb3JkZXInLCAnaW5zdGFuY2Utb3JkZXInIH0KICAgICAgICAgIGFuZCBOb01lZGljYXRpb25PcmRlci5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBpZDogTm9NZWRpY2F0aW9uT3JkZXIuaWQsCiAgICAgICAgICBtZWRpY2F0aW9uU3RhdHVzUmVhc29uOiBOb01lZGljYXRpb25PcmRlci5yZWFzb25Db2RlLAogICAgICAgICAgYXV0aG9yZWRPbjogTm9NZWRpY2F0aW9uT3JkZXIuYXV0aG9yZWRPbgogICAgICAgIH0KICAgICkKICAgIHVuaW9uICggZnJvbQogICAgICAgICggWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJMb3cgRG9zZSBVbmZyYWN0aW9uYXRlZCBIZXBhcmluIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJMb3cgTW9sZWN1bGFyIFdlaWdodCBIZXBhcmluIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJJbmplY3RhYmxlIEZhY3RvciBYYSBJbmhpYml0b3IgZm9yIFZURSBQcm9waHlsYXhpcyJdCiAgICAgICAgICB1bmlvbiBbIk1lZGljYXRpb25SZXF1ZXN0IjogIldhcmZhcmluIl0KICAgICAgICAgIHVuaW9uIFsiTWVkaWNhdGlvblJlcXVlc3QiOiAiUml2YXJveGFiYW4gZm9yIFZURSBQcm9waHlsYXhpcyJdICkgTWVkaWNhdGlvbk9yZGVyUmVqZWN0LAogICAgICAgIFtUYXNrUmVqZWN0ZWRdIFQKICAgICAgICB3aGVyZSBULmZvY3VzLnJlZmVyZW5jZXMgKCBNZWRpY2F0aW9uT3JkZXJSZWplY3QgKQogICAgICAgICAgYW5kIFQuY29kZSB+IFVTUXVhbGl0eUNvcmVDb21tb24uIkZ1bGZpbGwiCiAgICAgICAgICBhbmQgTWVkaWNhdGlvbk9yZGVyUmVqZWN0LnN0YXR1cyA9ICdhY3RpdmUnCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGlkOiBNZWRpY2F0aW9uT3JkZXJSZWplY3QuaWQsCiAgICAgICAgICBtZWRpY2F0aW9uU3RhdHVzUmVhc29uOiB7IFQuc3RhdHVzUmVhc29uIH0sCiAgICAgICAgICBhdXRob3JlZE9uOiBNZWRpY2F0aW9uT3JkZXJSZWplY3QuYXV0aG9yZWRPbgogICAgICAgIH0KICAgICkKCmRlZmluZSAiTm8gTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggIk5vIE1lY2hhbmljYWwgVlRFIFByb3BoeWxheGlzIFBlcmZvcm1lZCBPciBPcmRlcmVkIiBOb1ZURURldmljZQogICAgICBzdWNoIHRoYXQgTm9WVEVEZXZpY2UucmVxdWVzdFN0YXR1c1JlYXNvbiBpbiAiTWVkaWNhbCBSZWFzb24gRm9yIE5vdCBQcm92aWRpbmcgVHJlYXRtZW50IgogICAgICAgIGFuZCBOb1ZURURldmljZS5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5mcm9tRGF5T2ZTdGFydE9mSG9zcGl0YWxpemF0aW9uVG9EYXlBZnRlckFkbWlzc2lvbiAoICkKCmRlZmluZSAiTm8gTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgUHJvY2VkdXJlIjoKICBmcm9tCiAgICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICBbIlByb2NlZHVyZSI6ICJHZW5lcmFsIG9yIE5ldXJheGlhbCBBbmVzdGhlc2lhIl0gQW5lc3RoZXNpYVByb2NlZHVyZSwKICAgICJObyBNZWNoYW5pY2FsIFZURSBQcm9waHlsYXhpcyBQZXJmb3JtZWQgT3IgT3JkZXJlZCIgTm9WVEVEZXZpY2UKICAgIHdoZXJlIE5vVlRFRGV2aWNlLnJlcXVlc3RTdGF0dXNSZWFzb24gaW4gIk1lZGljYWwgUmVhc29uIEZvciBOb3QgUHJvdmlkaW5nIFRyZWF0bWVudCIKICAgICAgYW5kIEFuZXN0aGVzaWFQcm9jZWR1cmUuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgYW5kIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGVuZHMgMSBkYXkgYWZ0ZXIgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgIGFuZCBOb1ZURURldmljZS5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgKCBlbmQgb2YgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKS5jYWxlbmRhckRheU9mT3JEYXlBZnRlciAoICkKICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCgpkZWZpbmUgIk5vIE1lY2hhbmljYWwgVlRFIFByb3BoeWxheGlzIFBlcmZvcm1lZCBPciBPcmRlcmVkIjoKICAoICggW1NlcnZpY2VOb3RSZXF1ZXN0ZWQ6ICJWZW5vdXMgZm9vdCBwdW1wcyJdCiAgICAgIHVuaW9uIFtTZXJ2aWNlTm90UmVxdWVzdGVkOiAiSW50ZXJtaXR0ZW50IHBuZXVtYXRpYyBjb21wcmVzc2lvbiBkZXZpY2VzIl0KICAgICAgdW5pb24gW1NlcnZpY2VOb3RSZXF1ZXN0ZWQ6ICJHcmFkdWF0ZWQgY29tcHJlc3Npb24gc3RvY2tpbmdzIl0gKSBEZXZpY2VOb3RPcmRlcgogICAgICB3aGVyZSBEZXZpY2VOb3RPcmRlci5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICAgICByZXR1cm4gewogICAgICAgIGlkOiBEZXZpY2VOb3RPcmRlci5pZCwKICAgICAgICByZXF1ZXN0U3RhdHVzUmVhc29uOiBEZXZpY2VOb3RPcmRlci5yZWFzb25SZWZ1c2VkKCksCiAgICAgICAgYXV0aG9yZWRPbjogRGV2aWNlTm90T3JkZXIuYXV0aG9yZWRPbgogICAgICB9CiAgKQogICAgdW5pb24gKCBmcm9tCiAgICAgICAgKCBbU2VydmljZVJlcXVlc3Q6ICJWZW5vdXMgZm9vdCBwdW1wcyJdCiAgICAgICAgICB1bmlvbiBbU2VydmljZVJlcXVlc3Q6ICJJbnRlcm1pdHRlbnQgcG5ldW1hdGljIGNvbXByZXNzaW9uIGRldmljZXMiXQogICAgICAgICAgdW5pb24gW1NlcnZpY2VSZXF1ZXN0OiAiR3JhZHVhdGVkIGNvbXByZXNzaW9uIHN0b2NraW5ncyJdICkgRGV2aWNlT3JkZXJSZWplY3QsCiAgICAgICAgW1Rhc2tSZWplY3RlZF0gVAogICAgICAgIHdoZXJlIERldmljZU9yZGVyUmVqZWN0LmludGVudCBpbiB7ICdvcmRlcicsICdvcmlnaW5hbC1vcmRlcicsICdyZWZsZXgtb3JkZXInLCAnZmlsbGVyLW9yZGVyJywgJ2luc3RhbmNlLW9yZGVyJyB9CiAgICAgICAgICBhbmQgRGV2aWNlT3JkZXJSZWplY3Quc3RhdHVzID0gJ2FjdGl2ZScKICAgICAgICAgIGFuZCBULmZvY3VzLnJlZmVyZW5jZXMgKCBEZXZpY2VPcmRlclJlamVjdCApCiAgICAgICAgICBhbmQgVC5jb2RlIH4gVVNRdWFsaXR5Q29yZUNvbW1vbi4iRnVsZmlsbCIKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWQ6IERldmljZU9yZGVyUmVqZWN0LmlkLAogICAgICAgICAgcmVxdWVzdFN0YXR1c1JlYXNvbjogVC5zdGF0dXNSZWFzb24sCiAgICAgICAgICBhdXRob3JlZE9uOiBEZXZpY2VPcmRlclJlamVjdC5hdXRob3JlZE9uCiAgICAgICAgfQogICAgKQogICAgdW5pb24gKCAoIFtQcm9jZWR1cmVOb3REb25lOiAiQXBwbGljYXRpb24gb2YgSW50ZXJtaXR0ZW50IFBuZXVtYXRpYyBDb21wcmVzc2lvbiBEZXZpY2VzIl0KICAgICAgICB1bmlvbiBbUHJvY2VkdXJlTm90RG9uZTogIkFwcGxpY2F0aW9uIG9mIFZlbm91cyBGb290IFB1bXBzIl0KICAgICAgICB1bmlvbiBbUHJvY2VkdXJlTm90RG9uZTogIkFwcGxpY2F0aW9uIG9mIEdyYWR1YXRlZCBDb21wcmVzc2lvbiBTdG9ja2luZ3MiXSApIERldmljZU5vdEFwcGxpZWQKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWQ6IERldmljZU5vdEFwcGxpZWQuaWQsCiAgICAgICAgICByZXF1ZXN0U3RhdHVzUmVhc29uOiBEZXZpY2VOb3RBcHBsaWVkLnN0YXR1c1JlYXNvbiwKICAgICAgICAgIGF1dGhvcmVkT246IERldmljZU5vdEFwcGxpZWQucGVyZm9ybWVkCiAgICAgICAgfQogICAgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCI6CiAgIk5vIFZURSBQcm9waHlsYXhpcyBEdWUgVG8gUGF0aWVudCBSZWZ1c2FsIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIgogICAgdW5pb24gIk5vIFZURSBQcm9waHlsYXhpcyBEdWUgVG8gUGF0aWVudCBSZWZ1c2FsIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgUHJvY2VkdXJlIgoKZGVmaW5lICJObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCBGcm9tIERheSBPZiBTdGFydCBPZiBIb3NwaXRhbGl6YXRpb24gVG8gRGF5IEFmdGVyIEFkbWlzc2lvbiI6CiAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aXRoICJObyBNZWNoYW5pY2FsIE9yIFBoYXJtYWNvbG9naWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCIgUGF0aWVudFJlZnVzYWwKICAgICAgc3VjaCB0aGF0IFBhdGllbnRSZWZ1c2FsLmF1dGhvcmVkT24gZHVyaW5nIGRheSBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmZyb21EYXlPZlN0YXJ0T2ZIb3NwaXRhbGl6YXRpb25Ub0RheUFmdGVyQWRtaXNzaW9uICggKQoKZGVmaW5lICJObyBNZWNoYW5pY2FsIE9yIFBoYXJtYWNvbG9naWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCI6CiAgKCAiTm8gVlRFIFByb3BoeWxheGlzIE1lZGljYXRpb24gQWRtaW5pc3RlcmVkIE9yIE9yZGVyZWQiIE5vVlRFTWVkaWNhdGlvbgogICAgICB3aGVyZSBleGlzdHMgKCBOb1ZURU1lZGljYXRpb24ubWVkaWNhdGlvblN0YXR1c1JlYXNvbiBNZWRSc24KICAgICAgICAgIHdoZXJlIE1lZFJzbiBpbiAiUGF0aWVudCBSZWZ1c2FsIgogICAgICApCiAgKQogICAgdW5pb24gKCAiTm8gTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgUGVyZm9ybWVkIE9yIE9yZGVyZWQiIE5vVlRFRGV2aWNlCiAgICAgICAgd2hlcmUgTm9WVEVEZXZpY2UucmVxdWVzdFN0YXR1c1JlYXNvbiBpbiAiUGF0aWVudCBSZWZ1c2FsIgogICAgKQoKZGVmaW5lICJObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIFByb2NlZHVyZSI6CiAgZnJvbQogICAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyLAogICAgWyJQcm9jZWR1cmUiOiAiR2VuZXJhbCBvciBOZXVyYXhpYWwgQW5lc3RoZXNpYSJdIEFuZXN0aGVzaWFQcm9jZWR1cmUsCiAgICAiTm8gTWVjaGFuaWNhbCBPciBQaGFybWFjb2xvZ2ljYWwgVlRFIFByb3BoeWxheGlzIER1ZSBUbyBQYXRpZW50IFJlZnVzYWwiIFBhdGllbnRSZWZ1c2FsCiAgICB3aGVyZSBBbmVzdGhlc2lhUHJvY2VkdXJlLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgIGFuZCBBbmVzdGhlc2lhUHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKSBlbmRzIDEgZGF5IGFmdGVyIGRheSBvZiBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICBhbmQgUGF0aWVudFJlZnVzYWwuYXV0aG9yZWRPbiBkdXJpbmcgZGF5IG9mICggZW5kIG9mIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApICkuY2FsZW5kYXJEYXlPZk9yRGF5QWZ0ZXIgKCApCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiZnJvbURheU9mU3RhcnRPZkhvc3BpdGFsaXphdGlvblRvRGF5QWZ0ZXJBZG1pc3Npb24iKEVuY291bnRlciBFbmNvdW50ZXIpOgogIEludGVydmFsW2RhdGUgZnJvbSAoIHN0YXJ0IG9mIEVuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApICksIGRhdGUgZnJvbSAoIHN0YXJ0IG9mIEVuY291bnRlci5wZXJpb2QgKSArIDEgZGF5c10=",
"url" : "https://madie.cms.gov/Library-CMS108FHIRVTEProphylaxis.cql"
}
]
}