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

: CMS108FHIRVTEProphylaxis - XML Representation

Active as of 2025-08-25

Raw xml | Download


<Library xmlns="http://hl7.org/fhir">
  <id value="CMS108FHIRVTEProphylaxis"/>
  <meta>
    <profile
             value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"/>
    <profile
             value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-computablelibrary"/>
    <profile
             value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"/>
    <profile
             value="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-executablelibrary"/>
    <profile
             value="http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"/>
    <profile
             value="http://hl7.org/fhir/uv/cql/StructureDefinition/elm-json-library"/>
    <profile
             value="http://hl7.org/fhir/uv/cql/StructureDefinition/elm-xml-library"/>
  </meta>
  <text>
    <status value="extensions"/>
    <div xmlns="http://www.w3.org/1999/xhtml">
  <table class="narrative-table">
    <tbody>
<tr>


<th colspan="2" scope="row" class="row-header"><a name="metadata"> </a>Metadata</th>


</tr>

<tr>


<th scope="row" class="row-header">Title</th>



<td class="content-container">CMS108FHIRVTEProphylaxis</td>


</tr>





<tr>


<th scope="row" class="row-header">Version</th>



<td class="content-container">1.1.000</td>


</tr>







  
<tr>


<th scope="row" class="row-header">Identifier</th>



<td class="content-container">CMS108FHIRVTEProphylaxis</td>


</tr>






















<tr>


<th scope="row" class="row-header">Topic</th>



<td class="content-container">FHIR
</td>


</tr>

<tr>


<th scope="row" class="row-header">Topic</th>



<td class="content-container">CQL
</td>


</tr>








<tr>


<th scope="row" class="row-header">Steward (Publisher)</th>



<td class="content-container">The Joint Commission</td>


</tr>







<tr>


<th scope="row" class="row-header">Description</th>



<td class="content-container"><div><p>CMS108FHIRVTEProphylaxis</p>
</div></td>


</tr>









<tr>


<th scope="row" class="row-header">Type</th>



<td class="content-container">
    <a href="http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html">http://terminology.hl7.org/CodeSystem/library-type</a>#logic-library


</td>


</tr>













<tr>


<th colspan="2" scope="row" class="row-header"><a name="parameters"> </a>Parameters</th>


</tr>


<tr>


<th scope="row" class="row-header">Parameter</th>



<td class="content-container">None</td>


</tr>








  <tr>


<th colspan="2" scope="row" class="row-header">Library Content</th>


</tr>
  
    
    <tr>
      <th scope="row" class="row-header">CQL Content</th>
      <td>
        <a name="cql-content"> </a>
        <pre style="border: none;" class="content-container highlight language-cql"><code class="language-cql">/*
NOTE: For use by March 2026 US Realm Connectathon participants for internal use only. Not for use or distribution in commercial products.
*/
library CMS108FHIRVTEProphylaxis version '1.1.000'

using USQualityCore version '0.1.0-cibuild'
using USCore version '6.1.0-derived'
using FHIR version '4.0.1'

include hl7.fhir.uv.cql.FHIRHelpers version '4.0.1' called FHIRHelpers
include hl7.fhir.uv.cql.FHIRCommon version '2.0.0' called FHIRCommon
include hl7.fhir.us.cql.USCoreCommon version '2.0.0-ballot' called USCommon

include CQMCommon version '5.1.000' called CQMCommon
include USQualityCoreCommon version '0.1.0-cibuild' called USQualityCoreCommon
include SupplementalDataElements version '6.1.000' called SDE
include TJCOverall version '9.1.000' called TJC
include VTE version '9.1.000' called VTE

codesystem &quot;LOINC&quot;: 'http://loinc.org'

code &quot;Risk for venous thromboembolism&quot;: '72136-5' from &quot;LOINC&quot; display 'Risk for venous thromboembolism'

valueset &quot;Application of Graduated Compression Stockings&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.66'
valueset &quot;Application of Intermittent Pneumatic Compression Devices&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.65'
valueset &quot;Application of Venous Foot Pumps&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.64'
valueset &quot;Atrial Fibrillation or Flutter&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.202'
valueset &quot;Comfort Measures&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45'
valueset &quot;Direct Thrombin Inhibitor&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.205'
valueset &quot;General or Neuraxial Anesthesia&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.1743'
valueset &quot;General Surgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.255'
valueset &quot;Glycoprotein IIb IIIa Inhibitors&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.41'
valueset &quot;Graduated compression stockings&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.256'
valueset &quot;Gynecological Surgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.257'
valueset &quot;Hemorrhagic Stroke&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.212'
valueset &quot;Ischemic Stroke&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.247'
valueset &quot;Hip Fracture Surgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.258'
valueset &quot;Hip Replacement Surgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.259'
valueset &quot;Injectable Factor Xa Inhibitor for VTE Prophylaxis&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.211'
valueset &quot;INR&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.213'
valueset &quot;Intensive Care Unit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1029.206'
valueset &quot;Intermittent pneumatic compression devices&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.214'
valueset &quot;Intracranial Neurosurgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.260'
valueset &quot;Intravenous route&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.222'
valueset &quot;Knee Replacement Surgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.261'
valueset &quot;Low Dose Unfractionated Heparin for VTE Prophylaxis&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.39'
valueset &quot;Low Molecular Weight Heparin for VTE Prophylaxis&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.219'
valueset &quot;Low Risk&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.400'
valueset &quot;Medical Reason For Not Providing Treatment&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.473'
valueset &quot;Mental Health Diagnoses&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.105.12.1004'
valueset &quot;Oral Factor Xa Inhibitor for VTE Prophylaxis or VTE Treatment&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.134'
valueset &quot;Patient Refusal&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.93'
valueset &quot;Rivaroxaban for VTE Prophylaxis&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.50'
valueset &quot;Subcutaneous route&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.223'
valueset &quot;Unfractionated Heparin&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.218'
valueset &quot;Urological Surgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.272'
valueset &quot;Venous foot pumps&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.230'
valueset &quot;Venous Thromboembolism&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.279'
valueset &quot;Warfarin&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.232'

parameter &quot;Measurement Period&quot; Interval&lt;DateTime&gt;
  default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)

context Patient

define &quot;SDE Ethnicity&quot;:
  SDE.&quot;SDE Ethnicity&quot;

define &quot;SDE Payer&quot;:
  SDE.&quot;SDE Payer&quot;

define &quot;SDE Race&quot;:
  SDE.&quot;SDE Race&quot;

define &quot;SDE Sex&quot;:
  SDE.&quot;SDE Sex&quot;

define &quot;Initial Population&quot;:
  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot;

define &quot;Denominator&quot;:
  &quot;Initial Population&quot;

define &quot;Denominator Exclusions&quot;:
  &quot;Encounter Less Than 2 Days&quot;
    union &quot;Encounter With ICU Location Stay 1 Day Or More&quot;
    union &quot;Encounter With Principal Diagnosis Of Mental Disorder Or Stroke&quot;
    union &quot;Encounter With Principal Procedure Of Selected Surgery&quot;
    union &quot;Encounter With Intervention Comfort Measures From Day Of Start Of Hospitalization To Day After Admission&quot;
    union &quot;Encounter With Intervention Comfort Measures On Day Of Or Day After Procedure&quot;

define &quot;Encounter Less Than 2 Days&quot;:
  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter
    where QualifyingEncounter.period.lengthInDays ( ) &lt; 2

define &quot;Encounter With ICU Location Stay 1 Day Or More&quot;:
  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter
    where exists ( QualifyingEncounter.location Location
        where Location.location.getLocation ( ).type in &quot;Intensive Care Unit&quot;
          and Location.period.lengthInDays ( ) &gt;= 1
          and Location.period starts on or after start of QualifyingEncounter.period
          and date from ( start of Location.period ) during ( start of QualifyingEncounter.period ).calendarDayOfOrDayAfter ( )
    )

define &quot;Encounter With Principal Diagnosis Of Mental Disorder Or Stroke&quot;:
  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter
    where QualifyingEncounter.hasPrincipalDiagnosisOf ( &quot;Mental Health Diagnoses&quot; )
      or QualifyingEncounter.hasPrincipalDiagnosisOf ( &quot;Hemorrhagic Stroke&quot; )
      or QualifyingEncounter.hasPrincipalDiagnosisOf ( &quot;Ischemic Stroke&quot; )

define &quot;Encounter With Principal Procedure Of Selected Surgery&quot;:
  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter
    where QualifyingEncounter.hasPrincipalProcedureOf ( &quot;General Surgery&quot; )
      or QualifyingEncounter.hasPrincipalProcedureOf ( &quot;Gynecological Surgery&quot; )
      or QualifyingEncounter.hasPrincipalProcedureOf ( &quot;Hip Fracture Surgery&quot; )
      or QualifyingEncounter.hasPrincipalProcedureOf ( &quot;Hip Replacement Surgery&quot; )
      or QualifyingEncounter.hasPrincipalProcedureOf ( &quot;Intracranial Neurosurgery&quot; )
      or QualifyingEncounter.hasPrincipalProcedureOf ( &quot;Knee Replacement Surgery&quot; )
      or QualifyingEncounter.hasPrincipalProcedureOf ( &quot;Urological Surgery&quot; )

define &quot;Intervention Comfort Measures&quot;:
  ( [&quot;ServiceRequest&quot;: &quot;Comfort Measures&quot;] InterventionRequest
      where InterventionRequest.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
        and InterventionRequest.status in { 'active', 'completed' }
  )
    union ( [&quot;Procedure&quot;: &quot;Comfort Measures&quot;] InterventionPerformed
        where InterventionPerformed.status in { 'completed', 'in-progress' }
    )

define &quot;Encounter With Intervention Comfort Measures On Day Of Or Day After Procedure&quot;:
  from
    VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,
    [&quot;Procedure&quot;: &quot;General or Neuraxial Anesthesia&quot;] AnesthesiaProcedure,
    &quot;Intervention Comfort Measures&quot; ComfortMeasure
    where AnesthesiaProcedure.status = 'completed'
      and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period
      and Coalesce(start of ComfortMeasure.performed.toInterval(), ComfortMeasure.authoredOn) during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )
    return QualifyingEncounter

define &quot;Encounter With Intervention Comfort Measures From Day Of Start Of Hospitalization To Day After Admission&quot;:
  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter
    with &quot;Intervention Comfort Measures&quot; ComfortMeasure
      such that Coalesce(start of ComfortMeasure.performed.toInterval(), ComfortMeasure.authoredOn) during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )

define &quot;Numerator&quot;:
  &quot;Encounter With VTE Prophylaxis Received From Day Of Start Of Hospitalization To Day After Admission Or Procedure&quot;
    union ( &quot;Encounter With Medication Oral Factor Xa Inhibitor Administered On Day Of Or Day After Admission Or Procedure&quot;
        intersect ( &quot;Encounter With Prior Or Present Diagnosis Of Atrial Fibrillation Or Prior Diagnosis Of VTE&quot;
            union &quot;Encounter With Prior Or Present Procedure Of Hip Or Knee Replacement Surgery&quot;
        )
    )
    union &quot;Encounter With Low Risk For VTE Or Anticoagulant Administered&quot;
    union &quot;Encounter With No VTE Prophylaxis Due To Medical Reason&quot;
    union &quot;Encounter With No VTE Prophylaxis Due To Patient Refusal&quot;

define &quot;Pharmacological or Mechanical VTE Prophylaxis Received&quot;:
  ( [&quot;MedicationAdministration&quot;: &quot;Low Dose Unfractionated Heparin for VTE Prophylaxis&quot;] VTEMedication
      where VTEMedication.status = 'completed'
        and VTEMedication.dosage.route in &quot;Subcutaneous route&quot;
  )
    union ( [&quot;MedicationAdministration&quot;: &quot;Low Molecular Weight Heparin for VTE Prophylaxis&quot;] LMWH
        where LMWH.status = 'completed'
    )
    union ( [&quot;MedicationAdministration&quot;: &quot;Injectable Factor Xa Inhibitor for VTE Prophylaxis&quot;] FactorXa
        where FactorXa.status = 'completed'
    )
    union ( [&quot;MedicationAdministration&quot;: &quot;Warfarin&quot;] WarfarinAdm
        where WarfarinAdm.status = 'completed'
    )
    union ( [&quot;MedicationAdministration&quot;: &quot;Rivaroxaban for VTE Prophylaxis&quot;] Rivaroxaban
        where Rivaroxaban.status = 'completed'
    )
    union ( ( [&quot;Procedure&quot;: &quot;Application of Intermittent Pneumatic Compression Devices&quot;]
        union [&quot;Procedure&quot;: &quot;Application of Venous Foot Pumps&quot;]
        union [&quot;Procedure&quot;: &quot;Application of Graduated Compression Stockings&quot;] ) DeviceApplied
        where DeviceApplied.status = 'completed'
    )

define &quot;Encounter With VTE Prophylaxis Received From Day Of Start Of Hospitalization To Day After Admission Or Procedure&quot;:
  ( from
      VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,
      &quot;Pharmacological or Mechanical VTE Prophylaxis Received&quot; VTEProphylaxis
      where Coalesce(VTEProphylaxis.effective.toInterval(), VTEProphylaxis.performed.toInterval()) starts during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )
      return QualifyingEncounter
  )
    union ( from
        VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,
        [&quot;Procedure&quot;: &quot;General or Neuraxial Anesthesia&quot;] AnesthesiaProcedure,
        &quot;Pharmacological or Mechanical VTE Prophylaxis Received&quot; VTEProphylaxis
        where AnesthesiaProcedure.status = 'completed'
          and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period
          and Coalesce(VTEProphylaxis.effective.toInterval(), VTEProphylaxis.performed.toInterval()) starts during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )
        return QualifyingEncounter
    )

define &quot;Encounter With Medication Oral Factor Xa Inhibitor Administered On Day Of Or Day After Admission Or Procedure&quot;:
  ( from
      VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,
      [&quot;MedicationAdministration&quot;: &quot;Oral Factor Xa Inhibitor for VTE Prophylaxis or VTE Treatment&quot;] FactorXaMedication
      where FactorXaMedication.status = 'completed'
        and FactorXaMedication.effective.toInterval ( ) starts during day of ( start of QualifyingEncounter.period ).calendarDayOfOrDayAfter ( )
      return QualifyingEncounter
  )
    union ( from
        VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,
        [&quot;Procedure&quot;: &quot;General or Neuraxial Anesthesia&quot;] AnesthesiaProcedure,
        [&quot;MedicationAdministration&quot;: &quot;Oral Factor Xa Inhibitor for VTE Prophylaxis or VTE Treatment&quot;] FactorXaMedication
        where FactorXaMedication.status = 'completed'
          and AnesthesiaProcedure.status = 'completed'
          and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period
          and FactorXaMedication.effective.toInterval ( ) starts during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )
        return QualifyingEncounter
    )

define &quot;Encounter With Prior Or Present Diagnosis Of Atrial Fibrillation Or Prior Diagnosis Of VTE&quot;:
  ( VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter
      with [&quot;ConditionProblemsHealthConcerns&quot;: &quot;Atrial Fibrillation or Flutter&quot;] AtrialFibrillation
        such that AtrialFibrillation.verificationStatus is not null implies ( AtrialFibrillation.verificationStatus !~ FHIRCommon.&quot;refuted&quot;
            and AtrialFibrillation.verificationStatus !~ FHIRCommon.&quot;entered-in-error&quot;
        )
          and AtrialFibrillation.prevalenceInterval ( ) starts on or before end of QualifyingEncounter.period
  )
    union ( VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter
        where QualifyingEncounter.hasEncDiagnosisOf ( &quot;Atrial Fibrillation or Flutter&quot; )
    )
    union ( VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter
        with [&quot;ConditionProblemsHealthConcerns&quot;: &quot;Venous Thromboembolism&quot;] VTEDiagnosis
          such that ( VTEDiagnosis.clinicalStatus ~ FHIRCommon.&quot;inactive&quot;
              or VTEDiagnosis.clinicalStatus ~ FHIRCommon.&quot;remission&quot;
              or VTEDiagnosis.clinicalStatus ~ FHIRCommon.&quot;resolved&quot;
          )
            and VTEDiagnosis.verificationStatus is not null implies ( VTEDiagnosis.verificationStatus !~ FHIRCommon.&quot;refuted&quot;
              and VTEDiagnosis.verificationStatus !~ FHIRCommon.&quot;entered-in-error&quot;
          )
            and VTEDiagnosis.prevalenceInterval ( ) before start of QualifyingEncounter.period
    )

define &quot;Encounter With Prior Or Present Procedure Of Hip Or Knee Replacement Surgery&quot;:
  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter
    with ( [&quot;Procedure&quot;: &quot;Hip Replacement Surgery&quot;]
      union [&quot;Procedure&quot;: &quot;Knee Replacement Surgery&quot;] ) HipKneeProcedure
      such that HipKneeProcedure.status = 'completed'
        and HipKneeProcedure.performed.toInterval ( ) starts on or before end of QualifyingEncounter.period

define &quot;Encounter With Low Risk For VTE Or Anticoagulant Administered&quot;:
  &quot;Low Risk For VTE Or Anticoagulant Administered From Day Of Start Of Hospitalization To Day After Admission&quot;
    union &quot;Low Risk For VTE Or Anticoagulant Administered On Day Of Or Day After Procedure&quot;

define &quot;Low Risk Indicator For VTE&quot;:
  ( [&quot;SimpleObservation&quot;: &quot;Risk for venous thromboembolism&quot;] VTERiskAssessment
      where VTERiskAssessment.value as FHIR.CodeableConcept in &quot;Low Risk&quot;
        and VTERiskAssessment.status in { 'final', 'amended', 'corrected' }
      return {
        id: VTERiskAssessment.id,
        LowRiskDatetime: VTERiskAssessment.effective.earliest ( )
      }
  )
    union ( [&quot;LaboratoryResultObservation&quot;: &quot;INR&quot;] INRLabTest
        where INRLabTest.value as Quantity &gt; 3.0
          and INRLabTest.status in { 'final', 'amended', 'corrected' }
        return {
          id: INRLabTest.id,
          LowRiskDatetime: INRLabTest.issued
        }
    )
    union ( ( ( [&quot;MedicationAdministration&quot;: &quot;Unfractionated Heparin&quot;] UnfractionatedHeparin
          where UnfractionatedHeparin.dosage.route in &quot;Intravenous route&quot;
      )
        union [&quot;MedicationAdministration&quot;: &quot;Direct Thrombin Inhibitor&quot;]
        union [&quot;MedicationAdministration&quot;: &quot;Glycoprotein IIb IIIa Inhibitors&quot;] ) AnticoagulantMedication
        where AnticoagulantMedication.status = 'completed'
        return {
          id: AnticoagulantMedication.id,
          LowRiskDatetime: start of AnticoagulantMedication.effective.toInterval ( )
        }
    )

define &quot;Low Risk For VTE Or Anticoagulant Administered From Day Of Start Of Hospitalization To Day After Admission&quot;:
  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter
    with &quot;Low Risk Indicator For VTE&quot; LowRiskForVTE
      such that LowRiskForVTE.LowRiskDatetime during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )

define &quot;Low Risk For VTE Or Anticoagulant Administered On Day Of Or Day After Procedure&quot;:
  from
    VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,
    [&quot;Procedure&quot;: &quot;General or Neuraxial Anesthesia&quot;] AnesthesiaProcedure,
    &quot;Low Risk Indicator For VTE&quot; LowRiskForVTE
    where AnesthesiaProcedure.status = 'completed'
      and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period
      and LowRiskForVTE.LowRiskDatetime during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )
    return QualifyingEncounter

define &quot;Encounter With No VTE Prophylaxis Due To Medical Reason&quot;:
  ( &quot;No VTE Prophylaxis Medication Due To Medical Reason From Day Of Start Of Hospitalization To Day After Admission&quot;
      intersect &quot;No Mechanical VTE Prophylaxis Due To Medical Reason From Day Of Start Of Hospitalization To Day After Admission&quot;
  )
    union ( &quot;No VTE Prophylaxis Medication Due To Medical Reason On Day Of Or Day After Procedure&quot;
        intersect &quot;No Mechanical VTE Prophylaxis Due To Medical Reason On Day Of Or Day After Procedure&quot;
    )

define &quot;No VTE Prophylaxis Medication Due To Medical Reason From Day Of Start Of Hospitalization To Day After Admission&quot;:
  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter
    with &quot;No VTE Prophylaxis Medication Administered Or Ordered&quot; NoVTEMedication
      such that NoVTEMedication.medicationStatusReason in &quot;Medical Reason For Not Providing Treatment&quot;
        and NoVTEMedication.authoredOn during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )

define &quot;No VTE Prophylaxis Medication Due To Medical Reason On Day Of Or Day After Procedure&quot;:
  from
    VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,
    [&quot;Procedure&quot;: &quot;General or Neuraxial Anesthesia&quot;] AnesthesiaProcedure,
    &quot;No VTE Prophylaxis Medication Administered Or Ordered&quot; NoVTEMedication
    where NoVTEMedication.medicationStatusReason in &quot;Medical Reason For Not Providing Treatment&quot;
      and AnesthesiaProcedure.status = 'completed'
      and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period
      and NoVTEMedication.authoredOn during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )
    return QualifyingEncounter

define &quot;No VTE Prophylaxis Medication Administered Or Ordered&quot;:
  ( ( [MedicationAdministrationNotDone: &quot;Low Dose Unfractionated Heparin for VTE Prophylaxis&quot;]
      union [MedicationAdministrationNotDone: &quot;Low Molecular Weight Heparin for VTE Prophylaxis&quot;]
      union [MedicationAdministrationNotDone: &quot;Injectable Factor Xa Inhibitor for VTE Prophylaxis&quot;]
      union [MedicationAdministrationNotDone: &quot;Warfarin&quot;]
      union [MedicationAdministrationNotDone: &quot;Rivaroxaban for VTE Prophylaxis&quot;] ) NoMedicationAdm
      return {
        id: NoMedicationAdm.id,
        medicationStatusReason: NoMedicationAdm.statusReason,
        authoredOn: NoMedicationAdm.recorded()
      }
  )
    union ( ( [&quot;MedicationNotRequested&quot;: &quot;Low Dose Unfractionated Heparin for VTE Prophylaxis&quot;]
        union [&quot;MedicationNotRequested&quot;: &quot;Low Molecular Weight Heparin for VTE Prophylaxis&quot;]
        union [&quot;MedicationNotRequested&quot;: &quot;Injectable Factor Xa Inhibitor for VTE Prophylaxis&quot;]
        union [&quot;MedicationNotRequested&quot;: &quot;Warfarin&quot;]
        union [&quot;MedicationNotRequested&quot;: &quot;Rivaroxaban for VTE Prophylaxis&quot;] ) NoMedicationOrder
        where NoMedicationOrder.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
          and NoMedicationOrder.status in { 'active', 'completed' }
        return {
          id: NoMedicationOrder.id,
          medicationStatusReason: NoMedicationOrder.reasonCode,
          authoredOn: NoMedicationOrder.authoredOn
        }
    )
    union ( from
        ( [&quot;MedicationRequest&quot;: &quot;Low Dose Unfractionated Heparin for VTE Prophylaxis&quot;]
          union [&quot;MedicationRequest&quot;: &quot;Low Molecular Weight Heparin for VTE Prophylaxis&quot;]
          union [&quot;MedicationRequest&quot;: &quot;Injectable Factor Xa Inhibitor for VTE Prophylaxis&quot;]
          union [&quot;MedicationRequest&quot;: &quot;Warfarin&quot;]
          union [&quot;MedicationRequest&quot;: &quot;Rivaroxaban for VTE Prophylaxis&quot;] ) MedicationOrderReject,
        [TaskRejected] T
        where T.focus.references ( MedicationOrderReject )
          and T.code ~ USQualityCoreCommon.&quot;Fulfill&quot;
          and MedicationOrderReject.status = 'active'
        return {
          id: MedicationOrderReject.id,
          medicationStatusReason: { T.statusReason },
          authoredOn: MedicationOrderReject.authoredOn
        }
    )

define &quot;No Mechanical VTE Prophylaxis Due To Medical Reason From Day Of Start Of Hospitalization To Day After Admission&quot;:
  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter
    with &quot;No Mechanical VTE Prophylaxis Performed Or Ordered&quot; NoVTEDevice
      such that NoVTEDevice.requestStatusReason in &quot;Medical Reason For Not Providing Treatment&quot;
        and NoVTEDevice.authoredOn during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )

define &quot;No Mechanical VTE Prophylaxis Due To Medical Reason On Day Of Or Day After Procedure&quot;:
  from
    VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,
    [&quot;Procedure&quot;: &quot;General or Neuraxial Anesthesia&quot;] AnesthesiaProcedure,
    &quot;No Mechanical VTE Prophylaxis Performed Or Ordered&quot; NoVTEDevice
    where NoVTEDevice.requestStatusReason in &quot;Medical Reason For Not Providing Treatment&quot;
      and AnesthesiaProcedure.status = 'completed'
      and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period
      and NoVTEDevice.authoredOn during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )
    return QualifyingEncounter

define &quot;No Mechanical VTE Prophylaxis Performed Or Ordered&quot;:
  ( ( [ServiceNotRequested: &quot;Venous foot pumps&quot;]
      union [ServiceNotRequested: &quot;Intermittent pneumatic compression devices&quot;]
      union [ServiceNotRequested: &quot;Graduated compression stockings&quot;] ) DeviceNotOrder
      where DeviceNotOrder.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
      return {
        id: DeviceNotOrder.id,
        requestStatusReason: DeviceNotOrder.reasonRefused(),
        authoredOn: DeviceNotOrder.authoredOn
      }
  )
    union ( from
        ( [ServiceRequest: &quot;Venous foot pumps&quot;]
          union [ServiceRequest: &quot;Intermittent pneumatic compression devices&quot;]
          union [ServiceRequest: &quot;Graduated compression stockings&quot;] ) DeviceOrderReject,
        [TaskRejected] T
        where DeviceOrderReject.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
          and DeviceOrderReject.status = 'active'
          and T.focus.references ( DeviceOrderReject )
          and T.code ~ USQualityCoreCommon.&quot;Fulfill&quot;
        return {
          id: DeviceOrderReject.id,
          requestStatusReason: T.statusReason,
          authoredOn: DeviceOrderReject.authoredOn
        }
    )
    union ( ( [ProcedureNotDone: &quot;Application of Intermittent Pneumatic Compression Devices&quot;]
        union [ProcedureNotDone: &quot;Application of Venous Foot Pumps&quot;]
        union [ProcedureNotDone: &quot;Application of Graduated Compression Stockings&quot;] ) DeviceNotApplied
        return {
          id: DeviceNotApplied.id,
          requestStatusReason: DeviceNotApplied.statusReason,
          authoredOn: DeviceNotApplied.performed
        }
    )

define &quot;Encounter With No VTE Prophylaxis Due To Patient Refusal&quot;:
  &quot;No VTE Prophylaxis Due To Patient Refusal From Day Of Start Of Hospitalization To Day After Admission&quot;
    union &quot;No VTE Prophylaxis Due To Patient Refusal On Day Of Or Day After Procedure&quot;

define &quot;No VTE Prophylaxis Due To Patient Refusal From Day Of Start Of Hospitalization To Day After Admission&quot;:
  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter
    with &quot;No Mechanical Or Pharmacological VTE Prophylaxis Due To Patient Refusal&quot; PatientRefusal
      such that PatientRefusal.authoredOn during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )

define &quot;No Mechanical Or Pharmacological VTE Prophylaxis Due To Patient Refusal&quot;:
  ( &quot;No VTE Prophylaxis Medication Administered Or Ordered&quot; NoVTEMedication
      where exists ( NoVTEMedication.medicationStatusReason MedRsn
          where MedRsn in &quot;Patient Refusal&quot;
      )
  )
    union ( &quot;No Mechanical VTE Prophylaxis Performed Or Ordered&quot; NoVTEDevice
        where NoVTEDevice.requestStatusReason in &quot;Patient Refusal&quot;
    )

define &quot;No VTE Prophylaxis Due To Patient Refusal On Day Of Or Day After Procedure&quot;:
  from
    VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,
    [&quot;Procedure&quot;: &quot;General or Neuraxial Anesthesia&quot;] AnesthesiaProcedure,
    &quot;No Mechanical Or Pharmacological VTE Prophylaxis Due To Patient Refusal&quot; PatientRefusal
    where AnesthesiaProcedure.status = 'completed'
      and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period
      and PatientRefusal.authoredOn during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )
    return QualifyingEncounter

define fluent function &quot;fromDayOfStartOfHospitalizationToDayAfterAdmission&quot;(Encounter Encounter):
  Interval[date from ( start of Encounter.hospitalizationWithObservation ( ) ), date from ( start of Encounter.period ) + 1 days]</code></pre>
      </td>
    </tr>
    
  



<tr>
  <th colspan="2" scope="row" class="row-header">Generated using version 0.5.6 of the sample-content-ig Liquid templates</th>
</tr>

    </tbody>
  </table>
</div>
  </text>
  <extension
             url="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-softwaresystem">
    <valueReference>
      <reference value="Device/cqf-tooling"/>
    </valueReference>
  </extension>
  <url value="https://madie.cms.gov/Library/CMS108FHIRVTEProphylaxis"/>
  <identifier>
    <use value="official"/>
    <system value="https://madie.cms.gov/login"/>
    <value value="CMS108FHIRVTEProphylaxis"/>
  </identifier>
  <version value="1.1.000"/>
  <name value="CMS108FHIRVTEProphylaxis"/>
  <title value="CMS108FHIRVTEProphylaxis"/>
  <status value="active"/>
  <experimental value="false"/>
  <type>
    <coding>
      <system value="http://terminology.hl7.org/CodeSystem/library-type"/>
      <code value="logic-library"/>
    </coding>
  </type>
  <date value="2025-08-25T14:51:49+00:00"/>
  <publisher value="The Joint Commission"/>
  <description value="CMS108FHIRVTEProphylaxis"/>
  <topic>
    <text value="FHIR"/>
  </topic>
  <topic>
    <text value="CQL"/>
  </topic>
  <content>
    <contentType value="text/cql"/>
    <data
          value="LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVMxMDhGSElSVlRFUHJvcGh5bGF4aXMgdmVyc2lvbiAnMS4xLjAwMCcKCnVzaW5nIFVTUXVhbGl0eUNvcmUgdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcKdXNpbmcgVVNDb3JlIHZlcnNpb24gJzYuMS4wLWRlcml2ZWQnCnVzaW5nIEZISVIgdmVyc2lvbiAnNC4wLjEnCgppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMScgY2FsbGVkIEZISVJIZWxwZXJzCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJDb21tb24gdmVyc2lvbiAnMi4wLjAnIGNhbGxlZCBGSElSQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUNvbW1vbiB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvbW1vbgoKaW5jbHVkZSBDUU1Db21tb24gdmVyc2lvbiAnNS4xLjAwMCcgY2FsbGVkIENRTUNvbW1vbgppbmNsdWRlIFVTUXVhbGl0eUNvcmVDb21tb24gdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcgY2FsbGVkIFVTUXVhbGl0eUNvcmVDb21tb24KaW5jbHVkZSBTdXBwbGVtZW50YWxEYXRhRWxlbWVudHMgdmVyc2lvbiAnNi4xLjAwMCcgY2FsbGVkIFNERQppbmNsdWRlIFRKQ092ZXJhbGwgdmVyc2lvbiAnOS4xLjAwMCcgY2FsbGVkIFRKQwppbmNsdWRlIFZURSB2ZXJzaW9uICc5LjEuMDAwJyBjYWxsZWQgVlRFCgpjb2Rlc3lzdGVtICJMT0lOQyI6ICdodHRwOi8vbG9pbmMub3JnJwoKY29kZSAiUmlzayBmb3IgdmVub3VzIHRocm9tYm9lbWJvbGlzbSI6ICc3MjEzNi01JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnUmlzayBmb3IgdmVub3VzIHRocm9tYm9lbWJvbGlzbScKCnZhbHVlc2V0ICJBcHBsaWNhdGlvbiBvZiBHcmFkdWF0ZWQgQ29tcHJlc3Npb24gU3RvY2tpbmdzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTExMC42NicKdmFsdWVzZXQgIkFwcGxpY2F0aW9uIG9mIEludGVybWl0dGVudCBQbmV1bWF0aWMgQ29tcHJlc3Npb24gRGV2aWNlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExMTAuNjUnCnZhbHVlc2V0ICJBcHBsaWNhdGlvbiBvZiBWZW5vdXMgRm9vdCBQdW1wcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExMTAuNjQnCnZhbHVlc2V0ICJBdHJpYWwgRmlicmlsbGF0aW9uIG9yIEZsdXR0ZXIiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIwMicKdmFsdWVzZXQgIkNvbWZvcnQgTWVhc3VyZXMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzEuMy42LjEuNC4xLjMzODk1LjEuMy4wLjQ1Jwp2YWx1ZXNldCAiRGlyZWN0IFRocm9tYmluIEluaGliaXRvciI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjA1Jwp2YWx1ZXNldCAiR2VuZXJhbCBvciBOZXVyYXhpYWwgQW5lc3RoZXNpYSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy42NjYuNS4xNzQzJwp2YWx1ZXNldCAiR2VuZXJhbCBTdXJnZXJ5IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yNTUnCnZhbHVlc2V0ICJHbHljb3Byb3RlaW4gSUliIElJSWEgSW5oaWJpdG9ycyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEwNDUuNDEnCnZhbHVlc2V0ICJHcmFkdWF0ZWQgY29tcHJlc3Npb24gc3RvY2tpbmdzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yNTYnCnZhbHVlc2V0ICJHeW5lY29sb2dpY2FsIFN1cmdlcnkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjI1NycKdmFsdWVzZXQgIkhlbW9ycmhhZ2ljIFN0cm9rZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjEyJwp2YWx1ZXNldCAiSXNjaGVtaWMgU3Ryb2tlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yNDcnCnZhbHVlc2V0ICJIaXAgRnJhY3R1cmUgU3VyZ2VyeSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjU4Jwp2YWx1ZXNldCAiSGlwIFJlcGxhY2VtZW50IFN1cmdlcnkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjI1OScKdmFsdWVzZXQgIkluamVjdGFibGUgRmFjdG9yIFhhIEluaGliaXRvciBmb3IgVlRFIFByb3BoeWxheGlzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yMTEnCnZhbHVlc2V0ICJJTlIiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIxMycKdmFsdWVzZXQgIkludGVuc2l2ZSBDYXJlIFVuaXQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMDI5LjIwNicKdmFsdWVzZXQgIkludGVybWl0dGVudCBwbmV1bWF0aWMgY29tcHJlc3Npb24gZGV2aWNlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjE0Jwp2YWx1ZXNldCAiSW50cmFjcmFuaWFsIE5ldXJvc3VyZ2VyeSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjYwJwp2YWx1ZXNldCAiSW50cmF2ZW5vdXMgcm91dGUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIyMicKdmFsdWVzZXQgIktuZWUgUmVwbGFjZW1lbnQgU3VyZ2VyeSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjYxJwp2YWx1ZXNldCAiTG93IERvc2UgVW5mcmFjdGlvbmF0ZWQgSGVwYXJpbiBmb3IgVlRFIFByb3BoeWxheGlzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTA0NS4zOScKdmFsdWVzZXQgIkxvdyBNb2xlY3VsYXIgV2VpZ2h0IEhlcGFyaW4gZm9yIFZURSBQcm9waHlsYXhpcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjE5Jwp2YWx1ZXNldCAiTG93IFJpc2siOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjQwMCcKdmFsdWVzZXQgIk1lZGljYWwgUmVhc29uIEZvciBOb3QgUHJvdmlkaW5nIFRyZWF0bWVudCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuNDczJwp2YWx1ZXNldCAiTWVudGFsIEhlYWx0aCBEaWFnbm9zZXMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTA1LjEyLjEwMDQnCnZhbHVlc2V0ICJPcmFsIEZhY3RvciBYYSBJbmhpYml0b3IgZm9yIFZURSBQcm9waHlsYXhpcyBvciBWVEUgVHJlYXRtZW50IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4xMzQnCnZhbHVlc2V0ICJQYXRpZW50IFJlZnVzYWwiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjkzJwp2YWx1ZXNldCAiUml2YXJveGFiYW4gZm9yIFZURSBQcm9waHlsYXhpcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExMTAuNTAnCnZhbHVlc2V0ICJTdWJjdXRhbmVvdXMgcm91dGUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIyMycKdmFsdWVzZXQgIlVuZnJhY3Rpb25hdGVkIEhlcGFyaW4iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIxOCcKdmFsdWVzZXQgIlVyb2xvZ2ljYWwgU3VyZ2VyeSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjcyJwp2YWx1ZXNldCAiVmVub3VzIGZvb3QgcHVtcHMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIzMCcKdmFsdWVzZXQgIlZlbm91cyBUaHJvbWJvZW1ib2xpc20iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjI3OScKdmFsdWVzZXQgIldhcmZhcmluIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yMzInCgpwYXJhbWV0ZXIgIk1lYXN1cmVtZW50IFBlcmlvZCIgSW50ZXJ2YWw8RGF0ZVRpbWU+CiAgZGVmYXVsdCBJbnRlcnZhbFtAMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaLCBAMjAyNy0wMS0wMVQwMDowMDowMC4wMDBaKQoKY29udGV4dCBQYXRpZW50CgpkZWZpbmUgIlNERSBFdGhuaWNpdHkiOgogIFNERS4iU0RFIEV0aG5pY2l0eSIKCmRlZmluZSAiU0RFIFBheWVyIjoKICBTREUuIlNERSBQYXllciIKCmRlZmluZSAiU0RFIFJhY2UiOgogIFNERS4iU0RFIFJhY2UiCgpkZWZpbmUgIlNERSBTZXgiOgogIFNERS4iU0RFIFNleCIKCmRlZmluZSAiSW5pdGlhbCBQb3B1bGF0aW9uIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiCgpkZWZpbmUgIkRlbm9taW5hdG9yIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIgoKZGVmaW5lICJEZW5vbWluYXRvciBFeGNsdXNpb25zIjoKICAiRW5jb3VudGVyIExlc3MgVGhhbiAyIERheXMiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggSUNVIExvY2F0aW9uIFN0YXkgMSBEYXkgT3IgTW9yZSIKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBQcmluY2lwYWwgRGlhZ25vc2lzIE9mIE1lbnRhbCBEaXNvcmRlciBPciBTdHJva2UiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggUHJpbmNpcGFsIFByb2NlZHVyZSBPZiBTZWxlY3RlZCBTdXJnZXJ5IgogICAgdW5pb24gIkVuY291bnRlciBXaXRoIEludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIgogICAgdW5pb24gIkVuY291bnRlciBXaXRoIEludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgUHJvY2VkdXJlIgoKZGVmaW5lICJFbmNvdW50ZXIgTGVzcyBUaGFuIDIgRGF5cyI6CiAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZC5sZW5ndGhJbkRheXMgKCApIDwgMgoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBJQ1UgTG9jYXRpb24gU3RheSAxIERheSBPciBNb3JlIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdoZXJlIGV4aXN0cyAoIFF1YWxpZnlpbmdFbmNvdW50ZXIubG9jYXRpb24gTG9jYXRpb24KICAgICAgICB3aGVyZSBMb2NhdGlvbi5sb2NhdGlvbi5nZXRMb2NhdGlvbiAoICkudHlwZSBpbiAiSW50ZW5zaXZlIENhcmUgVW5pdCIKICAgICAgICAgIGFuZCBMb2NhdGlvbi5wZXJpb2QubGVuZ3RoSW5EYXlzICggKSA+PSAxCiAgICAgICAgICBhbmQgTG9jYXRpb24ucGVyaW9kIHN0YXJ0cyBvbiBvciBhZnRlciBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgYW5kIGRhdGUgZnJvbSAoIHN0YXJ0IG9mIExvY2F0aW9uLnBlcmlvZCApIGR1cmluZyAoIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kICkuY2FsZW5kYXJEYXlPZk9yRGF5QWZ0ZXIgKCApCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIFByaW5jaXBhbCBEaWFnbm9zaXMgT2YgTWVudGFsIERpc29yZGVyIE9yIFN0cm9rZSI6CiAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSBRdWFsaWZ5aW5nRW5jb3VudGVyLmhhc1ByaW5jaXBhbERpYWdub3Npc09mICggIk1lbnRhbCBIZWFsdGggRGlhZ25vc2VzIiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsRGlhZ25vc2lzT2YgKCAiSGVtb3JyaGFnaWMgU3Ryb2tlIiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsRGlhZ25vc2lzT2YgKCAiSXNjaGVtaWMgU3Ryb2tlIiApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIFByaW5jaXBhbCBQcm9jZWR1cmUgT2YgU2VsZWN0ZWQgU3VyZ2VyeSI6CiAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSBRdWFsaWZ5aW5nRW5jb3VudGVyLmhhc1ByaW5jaXBhbFByb2NlZHVyZU9mICggIkdlbmVyYWwgU3VyZ2VyeSIgKQogICAgICBvciBRdWFsaWZ5aW5nRW5jb3VudGVyLmhhc1ByaW5jaXBhbFByb2NlZHVyZU9mICggIkd5bmVjb2xvZ2ljYWwgU3VyZ2VyeSIgKQogICAgICBvciBRdWFsaWZ5aW5nRW5jb3VudGVyLmhhc1ByaW5jaXBhbFByb2NlZHVyZU9mICggIkhpcCBGcmFjdHVyZSBTdXJnZXJ5IiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsUHJvY2VkdXJlT2YgKCAiSGlwIFJlcGxhY2VtZW50IFN1cmdlcnkiICkKICAgICAgb3IgUXVhbGlmeWluZ0VuY291bnRlci5oYXNQcmluY2lwYWxQcm9jZWR1cmVPZiAoICJJbnRyYWNyYW5pYWwgTmV1cm9zdXJnZXJ5IiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsUHJvY2VkdXJlT2YgKCAiS25lZSBSZXBsYWNlbWVudCBTdXJnZXJ5IiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsUHJvY2VkdXJlT2YgKCAiVXJvbG9naWNhbCBTdXJnZXJ5IiApCgpkZWZpbmUgIkludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIjoKICAoIFsiU2VydmljZVJlcXVlc3QiOiAiQ29tZm9ydCBNZWFzdXJlcyJdIEludGVydmVudGlvblJlcXVlc3QKICAgICAgd2hlcmUgSW50ZXJ2ZW50aW9uUmVxdWVzdC5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICAgICAgIGFuZCBJbnRlcnZlbnRpb25SZXF1ZXN0LnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgKQogICAgdW5pb24gKCBbIlByb2NlZHVyZSI6ICJDb21mb3J0IE1lYXN1cmVzIl0gSW50ZXJ2ZW50aW9uUGVyZm9ybWVkCiAgICAgICAgd2hlcmUgSW50ZXJ2ZW50aW9uUGVyZm9ybWVkLnN0YXR1cyBpbiB7ICdjb21wbGV0ZWQnLCAnaW4tcHJvZ3Jlc3MnIH0KICAgICkKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggSW50ZXJ2ZW50aW9uIENvbWZvcnQgTWVhc3VyZXMgT24gRGF5IE9mIE9yIERheSBBZnRlciBQcm9jZWR1cmUiOgogIGZyb20KICAgIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlciwKICAgIFsiUHJvY2VkdXJlIjogIkdlbmVyYWwgb3IgTmV1cmF4aWFsIEFuZXN0aGVzaWEiXSBBbmVzdGhlc2lhUHJvY2VkdXJlLAogICAgIkludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIiBDb21mb3J0TWVhc3VyZQogICAgd2hlcmUgQW5lc3RoZXNpYVByb2NlZHVyZS5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgZW5kcyAxIGRheSBhZnRlciBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgYW5kIENvYWxlc2NlKHN0YXJ0IG9mIENvbWZvcnRNZWFzdXJlLnBlcmZvcm1lZC50b0ludGVydmFsKCksIENvbWZvcnRNZWFzdXJlLmF1dGhvcmVkT24pIGR1cmluZyBkYXkgb2YgKCBlbmQgb2YgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKS5jYWxlbmRhckRheU9mT3JEYXlBZnRlciAoICkKICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIEludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggIkludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIiBDb21mb3J0TWVhc3VyZQogICAgICBzdWNoIHRoYXQgQ29hbGVzY2Uoc3RhcnQgb2YgQ29tZm9ydE1lYXN1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwoKSwgQ29tZm9ydE1lYXN1cmUuYXV0aG9yZWRPbikgZHVyaW5nIGRheSBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmZyb21EYXlPZlN0YXJ0T2ZIb3NwaXRhbGl6YXRpb25Ub0RheUFmdGVyQWRtaXNzaW9uICggKQoKZGVmaW5lICJOdW1lcmF0b3IiOgogICJFbmNvdW50ZXIgV2l0aCBWVEUgUHJvcGh5bGF4aXMgUmVjZWl2ZWQgRnJvbSBEYXkgT2YgU3RhcnQgT2YgSG9zcGl0YWxpemF0aW9uIFRvIERheSBBZnRlciBBZG1pc3Npb24gT3IgUHJvY2VkdXJlIgogICAgdW5pb24gKCAiRW5jb3VudGVyIFdpdGggTWVkaWNhdGlvbiBPcmFsIEZhY3RvciBYYSBJbmhpYml0b3IgQWRtaW5pc3RlcmVkIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgQWRtaXNzaW9uIE9yIFByb2NlZHVyZSIKICAgICAgICBpbnRlcnNlY3QgKCAiRW5jb3VudGVyIFdpdGggUHJpb3IgT3IgUHJlc2VudCBEaWFnbm9zaXMgT2YgQXRyaWFsIEZpYnJpbGxhdGlvbiBPciBQcmlvciBEaWFnbm9zaXMgT2YgVlRFIgogICAgICAgICAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggUHJpb3IgT3IgUHJlc2VudCBQcm9jZWR1cmUgT2YgSGlwIE9yIEtuZWUgUmVwbGFjZW1lbnQgU3VyZ2VyeSIKICAgICAgICApCiAgICApCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggTG93IFJpc2sgRm9yIFZURSBPciBBbnRpY29hZ3VsYW50IEFkbWluaXN0ZXJlZCIKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIgogICAgdW5pb24gIkVuY291bnRlciBXaXRoIE5vIFZURSBQcm9waHlsYXhpcyBEdWUgVG8gUGF0aWVudCBSZWZ1c2FsIgoKZGVmaW5lICJQaGFybWFjb2xvZ2ljYWwgb3IgTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgUmVjZWl2ZWQiOgogICggWyJNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24iOiAiTG93IERvc2UgVW5mcmFjdGlvbmF0ZWQgSGVwYXJpbiBmb3IgVlRFIFByb3BoeWxheGlzIl0gVlRFTWVkaWNhdGlvbgogICAgICB3aGVyZSBWVEVNZWRpY2F0aW9uLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgYW5kIFZURU1lZGljYXRpb24uZG9zYWdlLnJvdXRlIGluICJTdWJjdXRhbmVvdXMgcm91dGUiCiAgKQogICAgdW5pb24gKCBbIk1lZGljYXRpb25BZG1pbmlzdHJhdGlvbiI6ICJMb3cgTW9sZWN1bGFyIFdlaWdodCBIZXBhcmluIGZvciBWVEUgUHJvcGh5bGF4aXMiXSBMTVdICiAgICAgICAgd2hlcmUgTE1XSC5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgKQogICAgdW5pb24gKCBbIk1lZGljYXRpb25BZG1pbmlzdHJhdGlvbiI6ICJJbmplY3RhYmxlIEZhY3RvciBYYSBJbmhpYml0b3IgZm9yIFZURSBQcm9waHlsYXhpcyJdIEZhY3RvclhhCiAgICAgICAgd2hlcmUgRmFjdG9yWGEuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICkKICAgIHVuaW9uICggWyJNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24iOiAiV2FyZmFyaW4iXSBXYXJmYXJpbkFkbQogICAgICAgIHdoZXJlIFdhcmZhcmluQWRtLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICApCiAgICB1bmlvbiAoIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIlJpdmFyb3hhYmFuIGZvciBWVEUgUHJvcGh5bGF4aXMiXSBSaXZhcm94YWJhbgogICAgICAgIHdoZXJlIFJpdmFyb3hhYmFuLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICApCiAgICB1bmlvbiAoICggWyJQcm9jZWR1cmUiOiAiQXBwbGljYXRpb24gb2YgSW50ZXJtaXR0ZW50IFBuZXVtYXRpYyBDb21wcmVzc2lvbiBEZXZpY2VzIl0KICAgICAgICB1bmlvbiBbIlByb2NlZHVyZSI6ICJBcHBsaWNhdGlvbiBvZiBWZW5vdXMgRm9vdCBQdW1wcyJdCiAgICAgICAgdW5pb24gWyJQcm9jZWR1cmUiOiAiQXBwbGljYXRpb24gb2YgR3JhZHVhdGVkIENvbXByZXNzaW9uIFN0b2NraW5ncyJdICkgRGV2aWNlQXBwbGllZAogICAgICAgIHdoZXJlIERldmljZUFwcGxpZWQuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICkKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggVlRFIFByb3BoeWxheGlzIFJlY2VpdmVkIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIE9yIFByb2NlZHVyZSI6CiAgKCBmcm9tCiAgICAgIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlciwKICAgICAgIlBoYXJtYWNvbG9naWNhbCBvciBNZWNoYW5pY2FsIFZURSBQcm9waHlsYXhpcyBSZWNlaXZlZCIgVlRFUHJvcGh5bGF4aXMKICAgICAgd2hlcmUgQ29hbGVzY2UoVlRFUHJvcGh5bGF4aXMuZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSwgVlRFUHJvcGh5bGF4aXMucGVyZm9ybWVkLnRvSW50ZXJ2YWwoKSkgc3RhcnRzIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5mcm9tRGF5T2ZTdGFydE9mSG9zcGl0YWxpemF0aW9uVG9EYXlBZnRlckFkbWlzc2lvbiAoICkKICAgICAgcmV0dXJuIFF1YWxpZnlpbmdFbmNvdW50ZXIKICApCiAgICB1bmlvbiAoIGZyb20KICAgICAgICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICAgICAgWyJQcm9jZWR1cmUiOiAiR2VuZXJhbCBvciBOZXVyYXhpYWwgQW5lc3RoZXNpYSJdIEFuZXN0aGVzaWFQcm9jZWR1cmUsCiAgICAgICAgIlBoYXJtYWNvbG9naWNhbCBvciBNZWNoYW5pY2FsIFZURSBQcm9waHlsYXhpcyBSZWNlaXZlZCIgVlRFUHJvcGh5bGF4aXMKICAgICAgICB3aGVyZSBBbmVzdGhlc2lhUHJvY2VkdXJlLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgZW5kcyAxIGRheSBhZnRlciBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgICAgIGFuZCBDb2FsZXNjZShWVEVQcm9waHlsYXhpcy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpLCBWVEVQcm9waHlsYXhpcy5wZXJmb3JtZWQudG9JbnRlcnZhbCgpKSBzdGFydHMgZHVyaW5nIGRheSBvZiAoIGVuZCBvZiBBbmVzdGhlc2lhUHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKSApLmNhbGVuZGFyRGF5T2ZPckRheUFmdGVyICggKQogICAgICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIE1lZGljYXRpb24gT3JhbCBGYWN0b3IgWGEgSW5oaWJpdG9yIEFkbWluaXN0ZXJlZCBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIEFkbWlzc2lvbiBPciBQcm9jZWR1cmUiOgogICggZnJvbQogICAgICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICAgIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIk9yYWwgRmFjdG9yIFhhIEluaGliaXRvciBmb3IgVlRFIFByb3BoeWxheGlzIG9yIFZURSBUcmVhdG1lbnQiXSBGYWN0b3JYYU1lZGljYXRpb24KICAgICAgd2hlcmUgRmFjdG9yWGFNZWRpY2F0aW9uLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgYW5kIEZhY3RvclhhTWVkaWNhdGlvbi5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBkYXkgb2YgKCBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZCApLmNhbGVuZGFyRGF5T2ZPckRheUFmdGVyICggKQogICAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgogICkKICAgIHVuaW9uICggZnJvbQogICAgICAgIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlciwKICAgICAgICBbIlByb2NlZHVyZSI6ICJHZW5lcmFsIG9yIE5ldXJheGlhbCBBbmVzdGhlc2lhIl0gQW5lc3RoZXNpYVByb2NlZHVyZSwKICAgICAgICBbIk1lZGljYXRpb25BZG1pbmlzdHJhdGlvbiI6ICJPcmFsIEZhY3RvciBYYSBJbmhpYml0b3IgZm9yIFZURSBQcm9waHlsYXhpcyBvciBWVEUgVHJlYXRtZW50Il0gRmFjdG9yWGFNZWRpY2F0aW9uCiAgICAgICAgd2hlcmUgRmFjdG9yWGFNZWRpY2F0aW9uLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICAgICAgYW5kIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGVuZHMgMSBkYXkgYWZ0ZXIgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICBhbmQgRmFjdG9yWGFNZWRpY2F0aW9uLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBzdGFydHMgZHVyaW5nIGRheSBvZiAoIGVuZCBvZiBBbmVzdGhlc2lhUHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKSApLmNhbGVuZGFyRGF5T2ZPckRheUFmdGVyICggKQogICAgICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIFByaW9yIE9yIFByZXNlbnQgRGlhZ25vc2lzIE9mIEF0cmlhbCBGaWJyaWxsYXRpb24gT3IgUHJpb3IgRGlhZ25vc2lzIE9mIFZURSI6CiAgKCBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgd2l0aCBbIkNvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnMiOiAiQXRyaWFsIEZpYnJpbGxhdGlvbiBvciBGbHV0dGVyIl0gQXRyaWFsRmlicmlsbGF0aW9uCiAgICAgICAgc3VjaCB0aGF0IEF0cmlhbEZpYnJpbGxhdGlvbi52ZXJpZmljYXRpb25TdGF0dXMgaXMgbm90IG51bGwgaW1wbGllcyAoIEF0cmlhbEZpYnJpbGxhdGlvbi52ZXJpZmljYXRpb25TdGF0dXMgIX4gRkhJUkNvbW1vbi4icmVmdXRlZCIKICAgICAgICAgICAgYW5kIEF0cmlhbEZpYnJpbGxhdGlvbi52ZXJpZmljYXRpb25TdGF0dXMgIX4gRkhJUkNvbW1vbi4iZW50ZXJlZC1pbi1lcnJvciIKICAgICAgICApCiAgICAgICAgICBhbmQgQXRyaWFsRmlicmlsbGF0aW9uLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgc3RhcnRzIG9uIG9yIGJlZm9yZSBlbmQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICApCiAgICB1bmlvbiAoIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgICAgIHdoZXJlIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzRW5jRGlhZ25vc2lzT2YgKCAiQXRyaWFsIEZpYnJpbGxhdGlvbiBvciBGbHV0dGVyIiApCiAgICApCiAgICB1bmlvbiAoIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgICAgIHdpdGggWyJDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zIjogIlZlbm91cyBUaHJvbWJvZW1ib2xpc20iXSBWVEVEaWFnbm9zaXMKICAgICAgICAgIHN1Y2ggdGhhdCAoIFZURURpYWdub3Npcy5jbGluaWNhbFN0YXR1cyB+IEZISVJDb21tb24uImluYWN0aXZlIgogICAgICAgICAgICAgIG9yIFZURURpYWdub3Npcy5jbGluaWNhbFN0YXR1cyB+IEZISVJDb21tb24uInJlbWlzc2lvbiIKICAgICAgICAgICAgICBvciBWVEVEaWFnbm9zaXMuY2xpbmljYWxTdGF0dXMgfiBGSElSQ29tbW9uLiJyZXNvbHZlZCIKICAgICAgICAgICkKICAgICAgICAgICAgYW5kIFZURURpYWdub3Npcy52ZXJpZmljYXRpb25TdGF0dXMgaXMgbm90IG51bGwgaW1wbGllcyAoIFZURURpYWdub3Npcy52ZXJpZmljYXRpb25TdGF0dXMgIX4gRkhJUkNvbW1vbi4icmVmdXRlZCIKICAgICAgICAgICAgICBhbmQgVlRFRGlhZ25vc2lzLnZlcmlmaWNhdGlvblN0YXR1cyAhfiBGSElSQ29tbW9uLiJlbnRlcmVkLWluLWVycm9yIgogICAgICAgICAgKQogICAgICAgICAgICBhbmQgVlRFRGlhZ25vc2lzLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgYmVmb3JlIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIFByaW9yIE9yIFByZXNlbnQgUHJvY2VkdXJlIE9mIEhpcCBPciBLbmVlIFJlcGxhY2VtZW50IFN1cmdlcnkiOgogIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2l0aCAoIFsiUHJvY2VkdXJlIjogIkhpcCBSZXBsYWNlbWVudCBTdXJnZXJ5Il0KICAgICAgdW5pb24gWyJQcm9jZWR1cmUiOiAiS25lZSBSZXBsYWNlbWVudCBTdXJnZXJ5Il0gKSBIaXBLbmVlUHJvY2VkdXJlCiAgICAgIHN1Y2ggdGhhdCBIaXBLbmVlUHJvY2VkdXJlLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgYW5kIEhpcEtuZWVQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBvbiBvciBiZWZvcmUgZW5kIG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIExvdyBSaXNrIEZvciBWVEUgT3IgQW50aWNvYWd1bGFudCBBZG1pbmlzdGVyZWQiOgogICJMb3cgUmlzayBGb3IgVlRFIE9yIEFudGljb2FndWxhbnQgQWRtaW5pc3RlcmVkIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIgogICAgdW5pb24gIkxvdyBSaXNrIEZvciBWVEUgT3IgQW50aWNvYWd1bGFudCBBZG1pbmlzdGVyZWQgT24gRGF5IE9mIE9yIERheSBBZnRlciBQcm9jZWR1cmUiCgpkZWZpbmUgIkxvdyBSaXNrIEluZGljYXRvciBGb3IgVlRFIjoKICAoIFsiU2ltcGxlT2JzZXJ2YXRpb24iOiAiUmlzayBmb3IgdmVub3VzIHRocm9tYm9lbWJvbGlzbSJdIFZURVJpc2tBc3Nlc3NtZW50CiAgICAgIHdoZXJlIFZURVJpc2tBc3Nlc3NtZW50LnZhbHVlIGFzIEZISVIuQ29kZWFibGVDb25jZXB0IGluICJMb3cgUmlzayIKICAgICAgICBhbmQgVlRFUmlza0Fzc2Vzc21lbnQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgIHJldHVybiB7CiAgICAgICAgaWQ6IFZURVJpc2tBc3Nlc3NtZW50LmlkLAogICAgICAgIExvd1Jpc2tEYXRldGltZTogVlRFUmlza0Fzc2Vzc21lbnQuZWZmZWN0aXZlLmVhcmxpZXN0ICggKQogICAgICB9CiAgKQogICAgdW5pb24gKCBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJJTlIiXSBJTlJMYWJUZXN0CiAgICAgICAgd2hlcmUgSU5STGFiVGVzdC52YWx1ZSBhcyBRdWFudGl0eSA+IDMuMAogICAgICAgICAgYW5kIElOUkxhYlRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGlkOiBJTlJMYWJUZXN0LmlkLAogICAgICAgICAgTG93Umlza0RhdGV0aW1lOiBJTlJMYWJUZXN0Lmlzc3VlZAogICAgICAgIH0KICAgICkKICAgIHVuaW9uICggKCAoIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIlVuZnJhY3Rpb25hdGVkIEhlcGFyaW4iXSBVbmZyYWN0aW9uYXRlZEhlcGFyaW4KICAgICAgICAgIHdoZXJlIFVuZnJhY3Rpb25hdGVkSGVwYXJpbi5kb3NhZ2Uucm91dGUgaW4gIkludHJhdmVub3VzIHJvdXRlIgogICAgICApCiAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24iOiAiRGlyZWN0IFRocm9tYmluIEluaGliaXRvciJdCiAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24iOiAiR2x5Y29wcm90ZWluIElJYiBJSUlhIEluaGliaXRvcnMiXSApIEFudGljb2FndWxhbnRNZWRpY2F0aW9uCiAgICAgICAgd2hlcmUgQW50aWNvYWd1bGFudE1lZGljYXRpb24uc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWQ6IEFudGljb2FndWxhbnRNZWRpY2F0aW9uLmlkLAogICAgICAgICAgTG93Umlza0RhdGV0aW1lOiBzdGFydCBvZiBBbnRpY29hZ3VsYW50TWVkaWNhdGlvbi5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkKICAgICAgICB9CiAgICApCgpkZWZpbmUgIkxvdyBSaXNrIEZvciBWVEUgT3IgQW50aWNvYWd1bGFudCBBZG1pbmlzdGVyZWQgRnJvbSBEYXkgT2YgU3RhcnQgT2YgSG9zcGl0YWxpemF0aW9uIFRvIERheSBBZnRlciBBZG1pc3Npb24iOgogIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2l0aCAiTG93IFJpc2sgSW5kaWNhdG9yIEZvciBWVEUiIExvd1Jpc2tGb3JWVEUKICAgICAgc3VjaCB0aGF0IExvd1Jpc2tGb3JWVEUuTG93Umlza0RhdGV0aW1lIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5mcm9tRGF5T2ZTdGFydE9mSG9zcGl0YWxpemF0aW9uVG9EYXlBZnRlckFkbWlzc2lvbiAoICkKCmRlZmluZSAiTG93IFJpc2sgRm9yIFZURSBPciBBbnRpY29hZ3VsYW50IEFkbWluaXN0ZXJlZCBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIFByb2NlZHVyZSI6CiAgZnJvbQogICAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyLAogICAgWyJQcm9jZWR1cmUiOiAiR2VuZXJhbCBvciBOZXVyYXhpYWwgQW5lc3RoZXNpYSJdIEFuZXN0aGVzaWFQcm9jZWR1cmUsCiAgICAiTG93IFJpc2sgSW5kaWNhdG9yIEZvciBWVEUiIExvd1Jpc2tGb3JWVEUKICAgIHdoZXJlIEFuZXN0aGVzaWFQcm9jZWR1cmUuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgYW5kIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGVuZHMgMSBkYXkgYWZ0ZXIgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgIGFuZCBMb3dSaXNrRm9yVlRFLkxvd1Jpc2tEYXRldGltZSBkdXJpbmcgZGF5IG9mICggZW5kIG9mIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApICkuY2FsZW5kYXJEYXlPZk9yRGF5QWZ0ZXIgKCApCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIjoKICAoICJObyBWVEUgUHJvcGh5bGF4aXMgTWVkaWNhdGlvbiBEdWUgVG8gTWVkaWNhbCBSZWFzb24gRnJvbSBEYXkgT2YgU3RhcnQgT2YgSG9zcGl0YWxpemF0aW9uIFRvIERheSBBZnRlciBBZG1pc3Npb24iCiAgICAgIGludGVyc2VjdCAiTm8gTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIgogICkKICAgIHVuaW9uICggIk5vIFZURSBQcm9waHlsYXhpcyBNZWRpY2F0aW9uIER1ZSBUbyBNZWRpY2FsIFJlYXNvbiBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIFByb2NlZHVyZSIKICAgICAgICBpbnRlcnNlY3QgIk5vIE1lY2hhbmljYWwgVlRFIFByb3BoeWxheGlzIER1ZSBUbyBNZWRpY2FsIFJlYXNvbiBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIFByb2NlZHVyZSIKICAgICkKCmRlZmluZSAiTm8gVlRFIFByb3BoeWxheGlzIE1lZGljYXRpb24gRHVlIFRvIE1lZGljYWwgUmVhc29uIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggIk5vIFZURSBQcm9waHlsYXhpcyBNZWRpY2F0aW9uIEFkbWluaXN0ZXJlZCBPciBPcmRlcmVkIiBOb1ZURU1lZGljYXRpb24KICAgICAgc3VjaCB0aGF0IE5vVlRFTWVkaWNhdGlvbi5tZWRpY2F0aW9uU3RhdHVzUmVhc29uIGluICJNZWRpY2FsIFJlYXNvbiBGb3IgTm90IFByb3ZpZGluZyBUcmVhdG1lbnQiCiAgICAgICAgYW5kIE5vVlRFTWVkaWNhdGlvbi5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5mcm9tRGF5T2ZTdGFydE9mSG9zcGl0YWxpemF0aW9uVG9EYXlBZnRlckFkbWlzc2lvbiAoICkKCmRlZmluZSAiTm8gVlRFIFByb3BoeWxheGlzIE1lZGljYXRpb24gRHVlIFRvIE1lZGljYWwgUmVhc29uIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgUHJvY2VkdXJlIjoKICBmcm9tCiAgICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICBbIlByb2NlZHVyZSI6ICJHZW5lcmFsIG9yIE5ldXJheGlhbCBBbmVzdGhlc2lhIl0gQW5lc3RoZXNpYVByb2NlZHVyZSwKICAgICJObyBWVEUgUHJvcGh5bGF4aXMgTWVkaWNhdGlvbiBBZG1pbmlzdGVyZWQgT3IgT3JkZXJlZCIgTm9WVEVNZWRpY2F0aW9uCiAgICB3aGVyZSBOb1ZURU1lZGljYXRpb24ubWVkaWNhdGlvblN0YXR1c1JlYXNvbiBpbiAiTWVkaWNhbCBSZWFzb24gRm9yIE5vdCBQcm92aWRpbmcgVHJlYXRtZW50IgogICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgZW5kcyAxIGRheSBhZnRlciBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgYW5kIE5vVlRFTWVkaWNhdGlvbi5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgKCBlbmQgb2YgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKS5jYWxlbmRhckRheU9mT3JEYXlBZnRlciAoICkKICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCgpkZWZpbmUgIk5vIFZURSBQcm9waHlsYXhpcyBNZWRpY2F0aW9uIEFkbWluaXN0ZXJlZCBPciBPcmRlcmVkIjoKICAoICggW01lZGljYXRpb25BZG1pbmlzdHJhdGlvbk5vdERvbmU6ICJMb3cgRG9zZSBVbmZyYWN0aW9uYXRlZCBIZXBhcmluIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICB1bmlvbiBbTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uTm90RG9uZTogIkxvdyBNb2xlY3VsYXIgV2VpZ2h0IEhlcGFyaW4gZm9yIFZURSBQcm9waHlsYXhpcyJdCiAgICAgIHVuaW9uIFtNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb25Ob3REb25lOiAiSW5qZWN0YWJsZSBGYWN0b3IgWGEgSW5oaWJpdG9yIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICB1bmlvbiBbTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uTm90RG9uZTogIldhcmZhcmluIl0KICAgICAgdW5pb24gW01lZGljYXRpb25BZG1pbmlzdHJhdGlvbk5vdERvbmU6ICJSaXZhcm94YWJhbiBmb3IgVlRFIFByb3BoeWxheGlzIl0gKSBOb01lZGljYXRpb25BZG0KICAgICAgcmV0dXJuIHsKICAgICAgICBpZDogTm9NZWRpY2F0aW9uQWRtLmlkLAogICAgICAgIG1lZGljYXRpb25TdGF0dXNSZWFzb246IE5vTWVkaWNhdGlvbkFkbS5zdGF0dXNSZWFzb24sCiAgICAgICAgYXV0aG9yZWRPbjogTm9NZWRpY2F0aW9uQWRtLnJlY29yZGVkKCkKICAgICAgfQogICkKICAgIHVuaW9uICggKCBbIk1lZGljYXRpb25Ob3RSZXF1ZXN0ZWQiOiAiTG93IERvc2UgVW5mcmFjdGlvbmF0ZWQgSGVwYXJpbiBmb3IgVlRFIFByb3BoeWxheGlzIl0KICAgICAgICB1bmlvbiBbIk1lZGljYXRpb25Ob3RSZXF1ZXN0ZWQiOiAiTG93IE1vbGVjdWxhciBXZWlnaHQgSGVwYXJpbiBmb3IgVlRFIFByb3BoeWxheGlzIl0KICAgICAgICB1bmlvbiBbIk1lZGljYXRpb25Ob3RSZXF1ZXN0ZWQiOiAiSW5qZWN0YWJsZSBGYWN0b3IgWGEgSW5oaWJpdG9yIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICAgIHVuaW9uIFsiTWVkaWNhdGlvbk5vdFJlcXVlc3RlZCI6ICJXYXJmYXJpbiJdCiAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uTm90UmVxdWVzdGVkIjogIlJpdmFyb3hhYmFuIGZvciBWVEUgUHJvcGh5bGF4aXMiXSApIE5vTWVkaWNhdGlvbk9yZGVyCiAgICAgICAgd2hlcmUgTm9NZWRpY2F0aW9uT3JkZXIuaW50ZW50IGluIHsgJ29yZGVyJywgJ29yaWdpbmFsLW9yZGVyJywgJ3JlZmxleC1vcmRlcicsICdmaWxsZXItb3JkZXInLCAnaW5zdGFuY2Utb3JkZXInIH0KICAgICAgICAgIGFuZCBOb01lZGljYXRpb25PcmRlci5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBpZDogTm9NZWRpY2F0aW9uT3JkZXIuaWQsCiAgICAgICAgICBtZWRpY2F0aW9uU3RhdHVzUmVhc29uOiBOb01lZGljYXRpb25PcmRlci5yZWFzb25Db2RlLAogICAgICAgICAgYXV0aG9yZWRPbjogTm9NZWRpY2F0aW9uT3JkZXIuYXV0aG9yZWRPbgogICAgICAgIH0KICAgICkKICAgIHVuaW9uICggZnJvbQogICAgICAgICggWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJMb3cgRG9zZSBVbmZyYWN0aW9uYXRlZCBIZXBhcmluIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJMb3cgTW9sZWN1bGFyIFdlaWdodCBIZXBhcmluIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJJbmplY3RhYmxlIEZhY3RvciBYYSBJbmhpYml0b3IgZm9yIFZURSBQcm9waHlsYXhpcyJdCiAgICAgICAgICB1bmlvbiBbIk1lZGljYXRpb25SZXF1ZXN0IjogIldhcmZhcmluIl0KICAgICAgICAgIHVuaW9uIFsiTWVkaWNhdGlvblJlcXVlc3QiOiAiUml2YXJveGFiYW4gZm9yIFZURSBQcm9waHlsYXhpcyJdICkgTWVkaWNhdGlvbk9yZGVyUmVqZWN0LAogICAgICAgIFtUYXNrUmVqZWN0ZWRdIFQKICAgICAgICB3aGVyZSBULmZvY3VzLnJlZmVyZW5jZXMgKCBNZWRpY2F0aW9uT3JkZXJSZWplY3QgKQogICAgICAgICAgYW5kIFQuY29kZSB+IFVTUXVhbGl0eUNvcmVDb21tb24uIkZ1bGZpbGwiCiAgICAgICAgICBhbmQgTWVkaWNhdGlvbk9yZGVyUmVqZWN0LnN0YXR1cyA9ICdhY3RpdmUnCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGlkOiBNZWRpY2F0aW9uT3JkZXJSZWplY3QuaWQsCiAgICAgICAgICBtZWRpY2F0aW9uU3RhdHVzUmVhc29uOiB7IFQuc3RhdHVzUmVhc29uIH0sCiAgICAgICAgICBhdXRob3JlZE9uOiBNZWRpY2F0aW9uT3JkZXJSZWplY3QuYXV0aG9yZWRPbgogICAgICAgIH0KICAgICkKCmRlZmluZSAiTm8gTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggIk5vIE1lY2hhbmljYWwgVlRFIFByb3BoeWxheGlzIFBlcmZvcm1lZCBPciBPcmRlcmVkIiBOb1ZURURldmljZQogICAgICBzdWNoIHRoYXQgTm9WVEVEZXZpY2UucmVxdWVzdFN0YXR1c1JlYXNvbiBpbiAiTWVkaWNhbCBSZWFzb24gRm9yIE5vdCBQcm92aWRpbmcgVHJlYXRtZW50IgogICAgICAgIGFuZCBOb1ZURURldmljZS5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5mcm9tRGF5T2ZTdGFydE9mSG9zcGl0YWxpemF0aW9uVG9EYXlBZnRlckFkbWlzc2lvbiAoICkKCmRlZmluZSAiTm8gTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgUHJvY2VkdXJlIjoKICBmcm9tCiAgICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICBbIlByb2NlZHVyZSI6ICJHZW5lcmFsIG9yIE5ldXJheGlhbCBBbmVzdGhlc2lhIl0gQW5lc3RoZXNpYVByb2NlZHVyZSwKICAgICJObyBNZWNoYW5pY2FsIFZURSBQcm9waHlsYXhpcyBQZXJmb3JtZWQgT3IgT3JkZXJlZCIgTm9WVEVEZXZpY2UKICAgIHdoZXJlIE5vVlRFRGV2aWNlLnJlcXVlc3RTdGF0dXNSZWFzb24gaW4gIk1lZGljYWwgUmVhc29uIEZvciBOb3QgUHJvdmlkaW5nIFRyZWF0bWVudCIKICAgICAgYW5kIEFuZXN0aGVzaWFQcm9jZWR1cmUuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgYW5kIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGVuZHMgMSBkYXkgYWZ0ZXIgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgIGFuZCBOb1ZURURldmljZS5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgKCBlbmQgb2YgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKS5jYWxlbmRhckRheU9mT3JEYXlBZnRlciAoICkKICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCgpkZWZpbmUgIk5vIE1lY2hhbmljYWwgVlRFIFByb3BoeWxheGlzIFBlcmZvcm1lZCBPciBPcmRlcmVkIjoKICAoICggW1NlcnZpY2VOb3RSZXF1ZXN0ZWQ6ICJWZW5vdXMgZm9vdCBwdW1wcyJdCiAgICAgIHVuaW9uIFtTZXJ2aWNlTm90UmVxdWVzdGVkOiAiSW50ZXJtaXR0ZW50IHBuZXVtYXRpYyBjb21wcmVzc2lvbiBkZXZpY2VzIl0KICAgICAgdW5pb24gW1NlcnZpY2VOb3RSZXF1ZXN0ZWQ6ICJHcmFkdWF0ZWQgY29tcHJlc3Npb24gc3RvY2tpbmdzIl0gKSBEZXZpY2VOb3RPcmRlcgogICAgICB3aGVyZSBEZXZpY2VOb3RPcmRlci5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICAgICByZXR1cm4gewogICAgICAgIGlkOiBEZXZpY2VOb3RPcmRlci5pZCwKICAgICAgICByZXF1ZXN0U3RhdHVzUmVhc29uOiBEZXZpY2VOb3RPcmRlci5yZWFzb25SZWZ1c2VkKCksCiAgICAgICAgYXV0aG9yZWRPbjogRGV2aWNlTm90T3JkZXIuYXV0aG9yZWRPbgogICAgICB9CiAgKQogICAgdW5pb24gKCBmcm9tCiAgICAgICAgKCBbU2VydmljZVJlcXVlc3Q6ICJWZW5vdXMgZm9vdCBwdW1wcyJdCiAgICAgICAgICB1bmlvbiBbU2VydmljZVJlcXVlc3Q6ICJJbnRlcm1pdHRlbnQgcG5ldW1hdGljIGNvbXByZXNzaW9uIGRldmljZXMiXQogICAgICAgICAgdW5pb24gW1NlcnZpY2VSZXF1ZXN0OiAiR3JhZHVhdGVkIGNvbXByZXNzaW9uIHN0b2NraW5ncyJdICkgRGV2aWNlT3JkZXJSZWplY3QsCiAgICAgICAgW1Rhc2tSZWplY3RlZF0gVAogICAgICAgIHdoZXJlIERldmljZU9yZGVyUmVqZWN0LmludGVudCBpbiB7ICdvcmRlcicsICdvcmlnaW5hbC1vcmRlcicsICdyZWZsZXgtb3JkZXInLCAnZmlsbGVyLW9yZGVyJywgJ2luc3RhbmNlLW9yZGVyJyB9CiAgICAgICAgICBhbmQgRGV2aWNlT3JkZXJSZWplY3Quc3RhdHVzID0gJ2FjdGl2ZScKICAgICAgICAgIGFuZCBULmZvY3VzLnJlZmVyZW5jZXMgKCBEZXZpY2VPcmRlclJlamVjdCApCiAgICAgICAgICBhbmQgVC5jb2RlIH4gVVNRdWFsaXR5Q29yZUNvbW1vbi4iRnVsZmlsbCIKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWQ6IERldmljZU9yZGVyUmVqZWN0LmlkLAogICAgICAgICAgcmVxdWVzdFN0YXR1c1JlYXNvbjogVC5zdGF0dXNSZWFzb24sCiAgICAgICAgICBhdXRob3JlZE9uOiBEZXZpY2VPcmRlclJlamVjdC5hdXRob3JlZE9uCiAgICAgICAgfQogICAgKQogICAgdW5pb24gKCAoIFtQcm9jZWR1cmVOb3REb25lOiAiQXBwbGljYXRpb24gb2YgSW50ZXJtaXR0ZW50IFBuZXVtYXRpYyBDb21wcmVzc2lvbiBEZXZpY2VzIl0KICAgICAgICB1bmlvbiBbUHJvY2VkdXJlTm90RG9uZTogIkFwcGxpY2F0aW9uIG9mIFZlbm91cyBGb290IFB1bXBzIl0KICAgICAgICB1bmlvbiBbUHJvY2VkdXJlTm90RG9uZTogIkFwcGxpY2F0aW9uIG9mIEdyYWR1YXRlZCBDb21wcmVzc2lvbiBTdG9ja2luZ3MiXSApIERldmljZU5vdEFwcGxpZWQKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWQ6IERldmljZU5vdEFwcGxpZWQuaWQsCiAgICAgICAgICByZXF1ZXN0U3RhdHVzUmVhc29uOiBEZXZpY2VOb3RBcHBsaWVkLnN0YXR1c1JlYXNvbiwKICAgICAgICAgIGF1dGhvcmVkT246IERldmljZU5vdEFwcGxpZWQucGVyZm9ybWVkCiAgICAgICAgfQogICAgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCI6CiAgIk5vIFZURSBQcm9waHlsYXhpcyBEdWUgVG8gUGF0aWVudCBSZWZ1c2FsIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIgogICAgdW5pb24gIk5vIFZURSBQcm9waHlsYXhpcyBEdWUgVG8gUGF0aWVudCBSZWZ1c2FsIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgUHJvY2VkdXJlIgoKZGVmaW5lICJObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCBGcm9tIERheSBPZiBTdGFydCBPZiBIb3NwaXRhbGl6YXRpb24gVG8gRGF5IEFmdGVyIEFkbWlzc2lvbiI6CiAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aXRoICJObyBNZWNoYW5pY2FsIE9yIFBoYXJtYWNvbG9naWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCIgUGF0aWVudFJlZnVzYWwKICAgICAgc3VjaCB0aGF0IFBhdGllbnRSZWZ1c2FsLmF1dGhvcmVkT24gZHVyaW5nIGRheSBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmZyb21EYXlPZlN0YXJ0T2ZIb3NwaXRhbGl6YXRpb25Ub0RheUFmdGVyQWRtaXNzaW9uICggKQoKZGVmaW5lICJObyBNZWNoYW5pY2FsIE9yIFBoYXJtYWNvbG9naWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCI6CiAgKCAiTm8gVlRFIFByb3BoeWxheGlzIE1lZGljYXRpb24gQWRtaW5pc3RlcmVkIE9yIE9yZGVyZWQiIE5vVlRFTWVkaWNhdGlvbgogICAgICB3aGVyZSBleGlzdHMgKCBOb1ZURU1lZGljYXRpb24ubWVkaWNhdGlvblN0YXR1c1JlYXNvbiBNZWRSc24KICAgICAgICAgIHdoZXJlIE1lZFJzbiBpbiAiUGF0aWVudCBSZWZ1c2FsIgogICAgICApCiAgKQogICAgdW5pb24gKCAiTm8gTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgUGVyZm9ybWVkIE9yIE9yZGVyZWQiIE5vVlRFRGV2aWNlCiAgICAgICAgd2hlcmUgTm9WVEVEZXZpY2UucmVxdWVzdFN0YXR1c1JlYXNvbiBpbiAiUGF0aWVudCBSZWZ1c2FsIgogICAgKQoKZGVmaW5lICJObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIFByb2NlZHVyZSI6CiAgZnJvbQogICAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyLAogICAgWyJQcm9jZWR1cmUiOiAiR2VuZXJhbCBvciBOZXVyYXhpYWwgQW5lc3RoZXNpYSJdIEFuZXN0aGVzaWFQcm9jZWR1cmUsCiAgICAiTm8gTWVjaGFuaWNhbCBPciBQaGFybWFjb2xvZ2ljYWwgVlRFIFByb3BoeWxheGlzIER1ZSBUbyBQYXRpZW50IFJlZnVzYWwiIFBhdGllbnRSZWZ1c2FsCiAgICB3aGVyZSBBbmVzdGhlc2lhUHJvY2VkdXJlLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgIGFuZCBBbmVzdGhlc2lhUHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKSBlbmRzIDEgZGF5IGFmdGVyIGRheSBvZiBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICBhbmQgUGF0aWVudFJlZnVzYWwuYXV0aG9yZWRPbiBkdXJpbmcgZGF5IG9mICggZW5kIG9mIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApICkuY2FsZW5kYXJEYXlPZk9yRGF5QWZ0ZXIgKCApCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiZnJvbURheU9mU3RhcnRPZkhvc3BpdGFsaXphdGlvblRvRGF5QWZ0ZXJBZG1pc3Npb24iKEVuY291bnRlciBFbmNvdW50ZXIpOgogIEludGVydmFsW2RhdGUgZnJvbSAoIHN0YXJ0IG9mIEVuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApICksIGRhdGUgZnJvbSAoIHN0YXJ0IG9mIEVuY291bnRlci5wZXJpb2QgKSArIDEgZGF5c10="/>
    <url value="https://madie.cms.gov/Library-CMS108FHIRVTEProphylaxis.cql"/>
  </content>
</Library>