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

: CMS986FHIRMalnutritionScore - XML Representation

Draft as of 2026-09-19

Raw xml | Download


<Library xmlns="http://hl7.org/fhir">
  <id value="CMS986FHIRMalnutritionScore"/>
  <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">Version</th>



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


</tr>
















<tr>


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



<td class="content-container">Draft</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 CMS986FHIRMalnutritionScore 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 USCoreCommon
include hl7.fhir.us.cql.USCoreElements version '2.0.0-ballot' called USCoreElements

include USQualityCoreCommon version '0.1.0-cibuild' called USQualityCoreCommon
include SupplementalDataElements version '6.1.000' called SDE
include Status version '2.1.000' called Status
include CQMCommon version '5.1.000' called CQMCommon

valueset &quot;Encounter Inpatient&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307'
valueset &quot;Hospice Status&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1095.101'
valueset &quot;Hospice Care Referral or Admission&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1116.365'
valueset &quot;Dietitian Referral&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1095.91'
valueset &quot;Malnutrition Diagnosis&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1095.55'
valueset &quot;Malnutrition Risk Screening&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1095.92'
valueset &quot;Malnutrition Screening Finding of At Risk Result&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1095.89'
valueset &quot;Malnutrition Screening Finding of Not At Risk Result&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1095.34'
valueset &quot;Nutrition Assessment&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1095.21'
valueset &quot;Nutrition Assessment Status Finding of Moderately Malnourished&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1095.47'
valueset &quot;Nutrition Assessment Status Finding of Well Nourished or Not Malnourished or Mildly Malnourished&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1095.96'
valueset &quot;Nutrition Assessment Status Finding of Severely Malnourished&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1095.43'
valueset &quot;Nutrition Care Plan&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1095.93'

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 Type&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;Measure Population&quot;:
  &quot;Initial Population&quot;

define &quot;Initial Population&quot;:
  [Encounter: &quot;Encounter Inpatient&quot;] EncounterInpatient
    where EncounterInpatient.period ends during day of &quot;Measurement Period&quot;
      and AgeInYearsAt(date from start of EncounterInpatient.period) &gt;= 18
      and ( duration in hours of EncounterInpatient.period &gt;= 24 )
      and EncounterInpatient.status = 'finished'

define &quot;Measure Population Exclusion&quot;:
  &quot;Encounters with Discharge for Hospice Care&quot;
    union &quot;Encounters with Hospice during Eligible Encounter&quot;

define &quot;Encounters with Discharge for Hospice Care&quot;:
  &quot;Measure Population&quot; QualifyingEncounter
    where QualifyingEncounter.hospitalization.dischargeDisposition in &quot;Hospice Care Referral or Admission&quot;

/*define &quot;Intervention Hospice Care&quot;:
    ( [&quot;ServiceRequest&quot;: &quot;Hospice Status&quot;] HospiceStatusOrder
    where HospiceStatusOrder.status in { 'active', 'completed', 'on-hold' }
        and HospiceStatusOrder.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
  )
    union ( [&quot;Procedure&quot;: &quot;Hospice Status&quot;] HospiceStatusPerformed
            where HospiceStatusPerformed.status in { 'completed', 'in-progress' } 
           )

define &quot;Encounters with Hospice during Eligible Encounter&quot;:
    &quot;Measure Population&quot; QualifyingEncounter
    with &quot;Intervention Hospice Care&quot; HospiceStatus
            such that Coalesce (start of HospiceStatus.performed.toInterval(), HospiceStatus.authoredOn) during day of QualifyingEncounter.hospitalizationWithObservation ( )
*/
//Testing definitions based on Codev comment



define &quot;Intervention Hospice Care&quot;:
  ( [&quot;ServiceRequest&quot;: &quot;Hospice Status&quot;] HospiceStatusOrder
      where HospiceStatusOrder.status in { 'active', 'completed', 'on-hold' }
        and HospiceStatusOrder.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
      return HospiceStatusOrder.authoredOn
  )
    union ( [&quot;Procedure&quot;: &quot;Hospice Status&quot;] HospiceStatusPerformed
        where HospiceStatusPerformed.status in { 'completed', 'in-progress' }
        return start of HospiceStatusPerformed.performed.toInterval ( )
    )

define &quot;Encounters with Hospice during Eligible Encounter&quot;:
  &quot;Measure Population&quot; QualifyingEncounter
    with &quot;Intervention Hospice Care&quot; HospiceStatusDate
      such that HospiceStatusDate during day of QualifyingEncounter.hospitalizationWithObservation ( )

/*define &quot;Intervention Dietitian Referral&quot;:
( [&quot;ServiceRequest&quot;: &quot;Dietitian Referral&quot;] DietitianReferralOrder
    where DietitianReferralOrder.status in { 'active', 'completed', 'on-hold' }
        and DietitianReferralOrder.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
  
  )
    union ( [&quot;Procedure&quot;: &quot;Dietitian Referral&quot;] DietitianReferralPerformed
            where DietitianReferralPerformed.status in { 'completed', 'in-progress' } 
           )

define &quot;Encounters with Dietitian Referral&quot;:
    &quot;Measure Population&quot; QualifyingEncounter
    with &quot;Intervention Dietitian Referral&quot; DietitianReferral
            such that Coalesce (start of DietitianReferral.performed.toInterval(), DietitianReferral.authoredOn) during day of QualifyingEncounter.hospitalizationWithObservation ( )
*/
//New definition from Codev comments



define &quot;Intervention Dietitian Referral&quot;:
  ( [&quot;ServiceRequest&quot;: &quot;Dietitian Referral&quot;] DietitianReferralOrder
      where DietitianReferralOrder.status in { 'active', 'completed', 'on-hold' }
        and DietitianReferralOrder.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
      return DietitianReferralOrder.authoredOn
  )
    union ( [&quot;Procedure&quot;: &quot;Dietitian Referral&quot;] DietitianReferralPerformed
        where DietitianReferralPerformed.status in { 'completed', 'in-progress' }
        return start of DietitianReferralPerformed.performed.toInterval ( )
    )

define &quot;Encounters with Dietitian Referral&quot;:
  &quot;Measure Population&quot; QualifyingEncounter
    with &quot;Intervention Dietitian Referral&quot; DietitianReferralDate
      such that DietitianReferralDate during day of QualifyingEncounter.hospitalizationWithObservation ( )

define &quot;Encounters with Malnutrition Risk Screening&quot;:
  &quot;Encounters with Malnutrition Risk Screening Not At Risk&quot;
    union &quot;Encounters with Malnutrition Risk Screening At Risk&quot;

define &quot;Encounters with Malnutrition Risk Screening or with Dietitian Referral&quot;:
  &quot;Encounters with Malnutrition Risk Screening&quot;
    union &quot;Encounters with Dietitian Referral&quot;

define &quot;Encounters with Malnutrition Risk Screening Not At Risk&quot;:
  &quot;Measure Population&quot; QualifyingEncounter
    with [&quot;ObservationScreeningAssessment&quot;: &quot;Malnutrition Risk Screening&quot;] MalnutritionRiskScreening
      such that MalnutritionRiskScreening.status in { 'final', 'amended', 'corrected' }
        and MalnutritionRiskScreening.effective.toInterval ( ) during QualifyingEncounter.hospitalizationWithObservation ( )
        and ( MalnutritionRiskScreening.value as FHIR.CodeableConcept in &quot;Malnutrition Screening Finding of Not At Risk Result&quot; )

define &quot;Encounters with Malnutrition Not At Risk Screening and without Dietitian Referral&quot;:
  &quot;Encounters with Malnutrition Risk Screening Not At Risk&quot;
    except &quot;Encounters with Dietitian Referral&quot;

define &quot;Encounters with Malnutrition Risk Screening At Risk&quot;:
  &quot;Measure Population&quot; QualifyingEncounter
    with [&quot;ObservationScreeningAssessment&quot;: &quot;Malnutrition Risk Screening&quot;] MalnutritionRiskScreening
      such that MalnutritionRiskScreening.status in { 'final', 'amended', 'corrected' }
        and MalnutritionRiskScreening.effective.toInterval ( ) during QualifyingEncounter.hospitalizationWithObservation ( )
        and ( MalnutritionRiskScreening.value as FHIR.CodeableConcept in &quot;Malnutrition Screening Finding of At Risk Result&quot; )

define &quot;Encounters with Malnutrition Risk Screening At Risk or with Dietitian Referral&quot;:
  &quot;Encounters with Malnutrition Risk Screening At Risk&quot;
    union &quot;Encounters with Dietitian Referral&quot;
   

/*define function &quot;Last Nutrition Assessment Day During Encounter&quot;(QualifyingEncounter Encounter):
  Max(&quot;Nutrition Assessment Performed&quot; NutritionAssessmentTuple
    where NutritionAssessmentTuple.HospEncId = QualifyingEncounter.id
    return NutritionAssessmentTuple.NutrAssessTimingLatest
  )

define &quot;Nutrition Assessment Performed&quot;:
    from
    &quot;Measure Population&quot; QualifyingEncounter,
    [&quot;ObservationScreeningAssessment&quot;: &quot;Nutrition Assessment&quot;] NutritionAssessment
        where NutritionAssessment.status in { 'final', 'amended', 'corrected' }
            and NutritionAssessment.effective.toInterval ( ) during QualifyingEncounter.hospitalizationWithObservation ( )
            and NutritionAssessment.value is not null
            return Tuple {
        HospEncId: QualifyingEncounter.id,
        NutrAssessTimingLatest: NutritionAssessment.effective.latest()
        }
*/
//Test definition per CODev feedback



define function &quot;Last Nutrition Assessment Day During Encounter&quot;(QualifyingEncounter Encounter):
  Max([&quot;ObservationScreeningAssessment&quot;: &quot;Nutrition Assessment&quot;] NutritionAssessment
      where NutritionAssessment.status in { 'final', 'amended', 'corrected' }
        and NutritionAssessment.effective.toInterval() during QualifyingEncounter.hospitalizationWithObservation()
        and NutritionAssessment.value is not null
      return NutritionAssessment.effective.latest()
  )

define &quot;Encounter With Most Recent Nutrition Assessment And Identified Status&quot;:
  &quot;Encounters with Malnutrition Risk Screening At Risk or with Dietitian Referral&quot; QualifyingEncounter
    with [&quot;ObservationScreeningAssessment&quot;: &quot;Nutrition Assessment&quot;] NutritionAssessment
      such that ( NutritionAssessment.status in { 'final', 'amended', 'corrected' }
          and NutritionAssessment.effective.toInterval ( ) during QualifyingEncounter.hospitalizationWithObservation ( )
          and ( NutritionAssessment.value as FHIR.CodeableConcept in &quot;Nutrition Assessment Status Finding of Well Nourished or Not Malnourished or Mildly Malnourished&quot;
              or ( NutritionAssessment.value as FHIR.CodeableConcept in &quot;Nutrition Assessment Status Finding of Moderately Malnourished&quot; )
              or ( NutritionAssessment.value as FHIR.CodeableConcept in &quot;Nutrition Assessment Status Finding of Severely Malnourished&quot; )
          )
          and NutritionAssessment.effective.latest ( ) same day as &quot;Last Nutrition Assessment Day During Encounter&quot;(QualifyingEncounter)
      )

define &quot;Encounter With Most Recent Nutrition Assessment Status of Moderately Or Severely Malnourished&quot;:
  &quot;Measure Population&quot; QualifyingEncounter
    with [&quot;ObservationScreeningAssessment&quot;: &quot;Nutrition Assessment&quot;] NutritionAssessment
      such that NutritionAssessment.status in { 'final', 'amended', 'corrected' }
        and NutritionAssessment.effective.toInterval ( ) during QualifyingEncounter.hospitalizationWithObservation ( )
        and ( NutritionAssessment.value as FHIR.CodeableConcept in &quot;Nutrition Assessment Status Finding of Moderately Malnourished&quot;
            or NutritionAssessment.value as FHIR.CodeableConcept in &quot;Nutrition Assessment Status Finding of Severely Malnourished&quot;
        )
        and NutritionAssessment.effective.latest ( ) same day as &quot;Last Nutrition Assessment Day During Encounter&quot;(QualifyingEncounter)

define &quot;Encounter With Most Recent Nutrition Assessment Status of Not or Mildly Malnourished&quot;:
  &quot;Measure Population&quot; QualifyingEncounter
    with [&quot;ObservationScreeningAssessment&quot;: &quot;Nutrition Assessment&quot;] NutritionAssessment
      such that ( NutritionAssessment.status in { 'final', 'amended', 'corrected' }
          and NutritionAssessment.effective.toInterval ( ) during QualifyingEncounter.hospitalizationWithObservation ( )
          and ( NutritionAssessment.value as FHIR.CodeableConcept in &quot;Nutrition Assessment Status Finding of Well Nourished or Not Malnourished or Mildly Malnourished&quot; )
          and NutritionAssessment.effective.latest ( ) same day as &quot;Last Nutrition Assessment Day During Encounter&quot;(QualifyingEncounter)
      )

define &quot;Encounters with Malnutrition Diagnosis&quot;:
  ( &quot;Measure Population&quot; QualifyingEncounter
      where exists ( &quot;Has Malnutrition Diagnosis&quot; MalnutritionDiagnosis
          where MalnutritionDiagnosis.prevalenceInterval ( ) overlaps day of QualifyingEncounter.hospitalizationWithObservation ( )
      )
  )
    union &quot;Encounters With Encounter Diagnosis Of Malnutrition Diagnosis&quot;

define &quot;Has Malnutrition Diagnosis&quot;:
  [ConditionProblemsHealthConcerns: &quot;Malnutrition Diagnosis&quot;] MalnutritionDiagnosis
    where MalnutritionDiagnosis.prevalenceInterval ( ) overlaps &quot;Measurement Period&quot;
      and MalnutritionDiagnosis.isVerified ( )

define &quot;Encounters With Encounter Diagnosis Of Malnutrition Diagnosis&quot;:
  &quot;Measure Population&quot; QualifyingEncounter
    where QualifyingEncounter.reasonCode in &quot;Malnutrition Diagnosis&quot;
      or QualifyingEncounter.encounterDiagnosis ( ).verified ( ).code in &quot;Malnutrition Diagnosis&quot;

define &quot;Encounters with Nutrition Care Plan&quot;:
  &quot;Measure Population&quot; QualifyingEncounter
    with [&quot;Procedure&quot;: &quot;Nutrition Care Plan&quot;] NutritionCarePlan
      such that NutritionCarePlan.status in { 'completed', 'in-progress' }
        and NutritionCarePlan.performed.earliest ( ) during QualifyingEncounter.hospitalizationWithObservation ( )

define function &quot;Measure Observation 1&quot;(MalnutritionRiskScreening Encounter):
  if &quot;Encounters with Malnutrition Risk Screening or with Dietitian Referral&quot; contains MalnutritionRiskScreening then 1 
    else 0

define function &quot;Measure Observation 2&quot;(NutritionAssessment Encounter):
  if &quot;Encounters with Malnutrition Not At Risk Screening and without Dietitian Referral&quot; contains NutritionAssessment then 0 
    else if &quot;Encounters with Malnutrition Risk Screening At Risk or with Dietitian Referral&quot; contains NutritionAssessment then 
      if &quot;Encounter With Most Recent Nutrition Assessment And Identified Status&quot; contains NutritionAssessment then 1 
      else 0 
    else 0

define function &quot;Measure Observation 3&quot;(MalnutritionDiagnosis Encounter):
  if &quot;Encounters with Malnutrition Not At Risk Screening and without Dietitian Referral&quot; contains MalnutritionDiagnosis then 0 
    else if &quot;Encounters with Malnutrition Risk Screening At Risk or with Dietitian Referral&quot; contains MalnutritionDiagnosis then 
      if &quot;Encounters with Malnutrition Diagnosis&quot; contains MalnutritionDiagnosis then 
        if &quot;Encounter With Most Recent Nutrition Assessment Status of Not or Mildly Malnourished&quot; contains MalnutritionDiagnosis then 0 
        else if &quot;Encounter With Most Recent Nutrition Assessment Status of Moderately Or Severely Malnourished&quot; contains MalnutritionDiagnosis then 1 
      else 0 
    else 0 
  else 0

define function &quot;Measure Observation 4&quot;(NutritionCarePlan Encounter):
  if &quot;Encounters with Malnutrition Not At Risk Screening and without Dietitian Referral&quot; contains NutritionCarePlan then 0 
    else if &quot;Encounters with Malnutrition Risk Screening At Risk or with Dietitian Referral&quot; contains NutritionCarePlan then 
      if &quot;Encounters with Nutrition Care Plan&quot; contains NutritionCarePlan then 
        if &quot;Encounter With Most Recent Nutrition Assessment Status of Not or Mildly Malnourished&quot; contains NutritionCarePlan then 0 
        else if &quot;Encounter With Most Recent Nutrition Assessment Status of Moderately Or Severely Malnourished&quot; contains NutritionCarePlan then 1 
        else 0 
      else 0 
    else 0

define function &quot;Total Malnutrition Care Score Eligible Occurrences&quot;(QualifyingEncounter Encounter):
  if &quot;Encounters with Malnutrition Risk Screening or with Dietitian Referral&quot; contains QualifyingEncounter
    and &quot;Encounters with Malnutrition Risk Screening Not At Risk&quot; contains QualifyingEncounter
    and not ( &quot;Encounters with Dietitian Referral&quot; contains QualifyingEncounter ) then 1 
    else if ( &quot;Encounters with Malnutrition Risk Screening or with Dietitian Referral&quot; contains QualifyingEncounter
      and &quot;Encounters with Malnutrition Risk Screening At Risk&quot; contains QualifyingEncounter
      or &quot;Encounters with Dietitian Referral&quot; contains QualifyingEncounter
  )
    and &quot;Encounter With Most Recent Nutrition Assessment Status of Not or Mildly Malnourished&quot; contains QualifyingEncounter
    or not ( &quot;Encounter With Most Recent Nutrition Assessment And Identified Status&quot; contains QualifyingEncounter ) then 2 
    else 4

define function &quot;Measure Observation Total Malnutrition Components Score&quot;(QualifyingEncounter Encounter):
  Sum({ &quot;Measure Observation 1&quot;(QualifyingEncounter), &quot;Measure Observation 2&quot;(QualifyingEncounter), &quot;Measure Observation 3&quot;(QualifyingEncounter), &quot;Measure Observation 4&quot;(QualifyingEncounter) })

define function &quot;Measure Observation Total Malnutrition Care Score as Percentage&quot;(QualifyingEncounter Encounter):
  100 * ( &quot;Measure Observation Total Malnutrition Components Score&quot;(QualifyingEncounter) / &quot;Total Malnutrition Care Score Eligible Occurrences&quot;(QualifyingEncounter) )</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/CMS986FHIRMalnutritionScore"/>
  <version value="1.1.000"/>
  <name value="CMS986FHIRMalnutritionScore"/>
  <status value="draft"/>
  <type>
    <coding>
      <system value="http://terminology.hl7.org/CodeSystem/library-type"/>
      <code value="logic-library"/>
    </coding>
  </type>
  <date value="2026-09-19T16:31:14+00:00"/>
  <content>
    <contentType value="text/cql"/>
    <data
          value="LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVM5ODZGSElSTWFsbnV0cml0aW9uU2NvcmUgdmVyc2lvbiAnMS4xLjAwMCcKCnVzaW5nIFVTUXVhbGl0eUNvcmUgdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcKdXNpbmcgVVNDb3JlIHZlcnNpb24gJzYuMS4wLWRlcml2ZWQnCnVzaW5nIEZISVIgdmVyc2lvbiAnNC4wLjEnCgppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMScgY2FsbGVkIEZISVJIZWxwZXJzCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJDb21tb24gdmVyc2lvbiAnMi4wLjAnIGNhbGxlZCBGSElSQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUNvbW1vbiB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvcmVDb21tb24KaW5jbHVkZSBobDcuZmhpci51cy5jcWwuVVNDb3JlRWxlbWVudHMgdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlRWxlbWVudHMKCmluY2x1ZGUgVVNRdWFsaXR5Q29yZUNvbW1vbiB2ZXJzaW9uICcwLjEuMC1jaWJ1aWxkJyBjYWxsZWQgVVNRdWFsaXR5Q29yZUNvbW1vbgppbmNsdWRlIFN1cHBsZW1lbnRhbERhdGFFbGVtZW50cyB2ZXJzaW9uICc2LjEuMDAwJyBjYWxsZWQgU0RFCmluY2x1ZGUgU3RhdHVzIHZlcnNpb24gJzIuMS4wMDAnIGNhbGxlZCBTdGF0dXMKaW5jbHVkZSBDUU1Db21tb24gdmVyc2lvbiAnNS4xLjAwMCcgY2FsbGVkIENRTUNvbW1vbgoKdmFsdWVzZXQgIkVuY291bnRlciBJbnBhdGllbnQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNjY2LjUuMzA3Jwp2YWx1ZXNldCAiSG9zcGljZSBTdGF0dXMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMDk1LjEwMScKdmFsdWVzZXQgIkhvc3BpY2UgQ2FyZSBSZWZlcnJhbCBvciBBZG1pc3Npb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMTE2LjM2NScKdmFsdWVzZXQgIkRpZXRpdGlhbiBSZWZlcnJhbCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEwOTUuOTEnCnZhbHVlc2V0ICJNYWxudXRyaXRpb24gRGlhZ25vc2lzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTA5NS41NScKdmFsdWVzZXQgIk1hbG51dHJpdGlvbiBSaXNrIFNjcmVlbmluZyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEwOTUuOTInCnZhbHVlc2V0ICJNYWxudXRyaXRpb24gU2NyZWVuaW5nIEZpbmRpbmcgb2YgQXQgUmlzayBSZXN1bHQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMDk1Ljg5Jwp2YWx1ZXNldCAiTWFsbnV0cml0aW9uIFNjcmVlbmluZyBGaW5kaW5nIG9mIE5vdCBBdCBSaXNrIFJlc3VsdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEwOTUuMzQnCnZhbHVlc2V0ICJOdXRyaXRpb24gQXNzZXNzbWVudCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEwOTUuMjEnCnZhbHVlc2V0ICJOdXRyaXRpb24gQXNzZXNzbWVudCBTdGF0dXMgRmluZGluZyBvZiBNb2RlcmF0ZWx5IE1hbG5vdXJpc2hlZCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEwOTUuNDcnCnZhbHVlc2V0ICJOdXRyaXRpb24gQXNzZXNzbWVudCBTdGF0dXMgRmluZGluZyBvZiBXZWxsIE5vdXJpc2hlZCBvciBOb3QgTWFsbm91cmlzaGVkIG9yIE1pbGRseSBNYWxub3VyaXNoZWQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMDk1Ljk2Jwp2YWx1ZXNldCAiTnV0cml0aW9uIEFzc2Vzc21lbnQgU3RhdHVzIEZpbmRpbmcgb2YgU2V2ZXJlbHkgTWFsbm91cmlzaGVkIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTA5NS40MycKdmFsdWVzZXQgIk51dHJpdGlvbiBDYXJlIFBsYW4iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMDk1LjkzJwoKcGFyYW1ldGVyICJNZWFzdXJlbWVudCBQZXJpb2QiIEludGVydmFsPERhdGVUaW1lPgogIGRlZmF1bHQgSW50ZXJ2YWxbQDIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiwgQDIwMjctMDEtMDFUMDA6MDA6MDAuMDAwWikKCmNvbnRleHQgUGF0aWVudAoKZGVmaW5lICJTREUgRXRobmljaXR5IjoKICBTREUuIlNERSBFdGhuaWNpdHkiCgpkZWZpbmUgIlNERSBQYXllciBUeXBlIjoKICBTREUuIlNERSBQYXllciIKCmRlZmluZSAiU0RFIFJhY2UiOgogIFNERS4iU0RFIFJhY2UiCgpkZWZpbmUgIlNERSBTZXgiOgogIFNERS4iU0RFIFNleCIKCmRlZmluZSAiTWVhc3VyZSBQb3B1bGF0aW9uIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIgoKZGVmaW5lICJJbml0aWFsIFBvcHVsYXRpb24iOgogIFtFbmNvdW50ZXI6ICJFbmNvdW50ZXIgSW5wYXRpZW50Il0gRW5jb3VudGVySW5wYXRpZW50CiAgICB3aGVyZSBFbmNvdW50ZXJJbnBhdGllbnQucGVyaW9kIGVuZHMgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgQWdlSW5ZZWFyc0F0KGRhdGUgZnJvbSBzdGFydCBvZiBFbmNvdW50ZXJJbnBhdGllbnQucGVyaW9kKSA+PSAxOAogICAgICBhbmQgKCBkdXJhdGlvbiBpbiBob3VycyBvZiBFbmNvdW50ZXJJbnBhdGllbnQucGVyaW9kID49IDI0ICkKICAgICAgYW5kIEVuY291bnRlcklucGF0aWVudC5zdGF0dXMgPSAnZmluaXNoZWQnCgpkZWZpbmUgIk1lYXN1cmUgUG9wdWxhdGlvbiBFeGNsdXNpb24iOgogICJFbmNvdW50ZXJzIHdpdGggRGlzY2hhcmdlIGZvciBIb3NwaWNlIENhcmUiCiAgICB1bmlvbiAiRW5jb3VudGVycyB3aXRoIEhvc3BpY2UgZHVyaW5nIEVsaWdpYmxlIEVuY291bnRlciIKCmRlZmluZSAiRW5jb3VudGVycyB3aXRoIERpc2NoYXJnZSBmb3IgSG9zcGljZSBDYXJlIjoKICAiTWVhc3VyZSBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbi5kaXNjaGFyZ2VEaXNwb3NpdGlvbiBpbiAiSG9zcGljZSBDYXJlIFJlZmVycmFsIG9yIEFkbWlzc2lvbiIKCi8qZGVmaW5lICJJbnRlcnZlbnRpb24gSG9zcGljZSBDYXJlIjoKICAgICggWyJTZXJ2aWNlUmVxdWVzdCI6ICJIb3NwaWNlIFN0YXR1cyJdIEhvc3BpY2VTdGF0dXNPcmRlcgogICAgd2hlcmUgSG9zcGljZVN0YXR1c09yZGVyLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJywgJ29uLWhvbGQnIH0KICAgICAgICBhbmQgSG9zcGljZVN0YXR1c09yZGVyLmludGVudCBpbiB7ICdvcmRlcicsICdvcmlnaW5hbC1vcmRlcicsICdyZWZsZXgtb3JkZXInLCAnZmlsbGVyLW9yZGVyJywgJ2luc3RhbmNlLW9yZGVyJyB9CiAgKQogICAgdW5pb24gKCBbIlByb2NlZHVyZSI6ICJIb3NwaWNlIFN0YXR1cyJdIEhvc3BpY2VTdGF0dXNQZXJmb3JtZWQKICAgICAgICAgICAgd2hlcmUgSG9zcGljZVN0YXR1c1BlcmZvcm1lZC5zdGF0dXMgaW4geyAnY29tcGxldGVkJywgJ2luLXByb2dyZXNzJyB9IAogICAgICAgICAgICkKCmRlZmluZSAiRW5jb3VudGVycyB3aXRoIEhvc3BpY2UgZHVyaW5nIEVsaWdpYmxlIEVuY291bnRlciI6CiAgICAiTWVhc3VyZSBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aXRoICJJbnRlcnZlbnRpb24gSG9zcGljZSBDYXJlIiBIb3NwaWNlU3RhdHVzCiAgICAgICAgICAgIHN1Y2ggdGhhdCBDb2FsZXNjZSAoc3RhcnQgb2YgSG9zcGljZVN0YXR1cy5wZXJmb3JtZWQudG9JbnRlcnZhbCgpLCBIb3NwaWNlU3RhdHVzLmF1dGhvcmVkT24pIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCiovCi8vVGVzdGluZyBkZWZpbml0aW9ucyBiYXNlZCBvbiBDb2RldiBjb21tZW50CgoKCmRlZmluZSAiSW50ZXJ2ZW50aW9uIEhvc3BpY2UgQ2FyZSI6CiAgKCBbIlNlcnZpY2VSZXF1ZXN0IjogIkhvc3BpY2UgU3RhdHVzIl0gSG9zcGljZVN0YXR1c09yZGVyCiAgICAgIHdoZXJlIEhvc3BpY2VTdGF0dXNPcmRlci5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcsICdvbi1ob2xkJyB9CiAgICAgICAgYW5kIEhvc3BpY2VTdGF0dXNPcmRlci5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICAgICByZXR1cm4gSG9zcGljZVN0YXR1c09yZGVyLmF1dGhvcmVkT24KICApCiAgICB1bmlvbiAoIFsiUHJvY2VkdXJlIjogIkhvc3BpY2UgU3RhdHVzIl0gSG9zcGljZVN0YXR1c1BlcmZvcm1lZAogICAgICAgIHdoZXJlIEhvc3BpY2VTdGF0dXNQZXJmb3JtZWQuc3RhdHVzIGluIHsgJ2NvbXBsZXRlZCcsICdpbi1wcm9ncmVzcycgfQogICAgICAgIHJldHVybiBzdGFydCBvZiBIb3NwaWNlU3RhdHVzUGVyZm9ybWVkLnBlcmZvcm1lZC50b0ludGVydmFsICggKQogICAgKQoKZGVmaW5lICJFbmNvdW50ZXJzIHdpdGggSG9zcGljZSBkdXJpbmcgRWxpZ2libGUgRW5jb3VudGVyIjoKICAiTWVhc3VyZSBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aXRoICJJbnRlcnZlbnRpb24gSG9zcGljZSBDYXJlIiBIb3NwaWNlU3RhdHVzRGF0ZQogICAgICBzdWNoIHRoYXQgSG9zcGljZVN0YXR1c0RhdGUgZHVyaW5nIGRheSBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkKCi8qZGVmaW5lICJJbnRlcnZlbnRpb24gRGlldGl0aWFuIFJlZmVycmFsIjoKKCBbIlNlcnZpY2VSZXF1ZXN0IjogIkRpZXRpdGlhbiBSZWZlcnJhbCJdIERpZXRpdGlhblJlZmVycmFsT3JkZXIKICAgIHdoZXJlIERpZXRpdGlhblJlZmVycmFsT3JkZXIuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnLCAnb24taG9sZCcgfQogICAgICAgIGFuZCBEaWV0aXRpYW5SZWZlcnJhbE9yZGVyLmludGVudCBpbiB7ICdvcmRlcicsICdvcmlnaW5hbC1vcmRlcicsICdyZWZsZXgtb3JkZXInLCAnZmlsbGVyLW9yZGVyJywgJ2luc3RhbmNlLW9yZGVyJyB9CiAgCiAgKQogICAgdW5pb24gKCBbIlByb2NlZHVyZSI6ICJEaWV0aXRpYW4gUmVmZXJyYWwiXSBEaWV0aXRpYW5SZWZlcnJhbFBlcmZvcm1lZAogICAgICAgICAgICB3aGVyZSBEaWV0aXRpYW5SZWZlcnJhbFBlcmZvcm1lZC5zdGF0dXMgaW4geyAnY29tcGxldGVkJywgJ2luLXByb2dyZXNzJyB9IAogICAgICAgICAgICkKCmRlZmluZSAiRW5jb3VudGVycyB3aXRoIERpZXRpdGlhbiBSZWZlcnJhbCI6CiAgICAiTWVhc3VyZSBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aXRoICJJbnRlcnZlbnRpb24gRGlldGl0aWFuIFJlZmVycmFsIiBEaWV0aXRpYW5SZWZlcnJhbAogICAgICAgICAgICBzdWNoIHRoYXQgQ29hbGVzY2UgKHN0YXJ0IG9mIERpZXRpdGlhblJlZmVycmFsLnBlcmZvcm1lZC50b0ludGVydmFsKCksIERpZXRpdGlhblJlZmVycmFsLmF1dGhvcmVkT24pIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCiovCi8vTmV3IGRlZmluaXRpb24gZnJvbSBDb2RldiBjb21tZW50cwoKCgpkZWZpbmUgIkludGVydmVudGlvbiBEaWV0aXRpYW4gUmVmZXJyYWwiOgogICggWyJTZXJ2aWNlUmVxdWVzdCI6ICJEaWV0aXRpYW4gUmVmZXJyYWwiXSBEaWV0aXRpYW5SZWZlcnJhbE9yZGVyCiAgICAgIHdoZXJlIERpZXRpdGlhblJlZmVycmFsT3JkZXIuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnLCAnb24taG9sZCcgfQogICAgICAgIGFuZCBEaWV0aXRpYW5SZWZlcnJhbE9yZGVyLmludGVudCBpbiB7ICdvcmRlcicsICdvcmlnaW5hbC1vcmRlcicsICdyZWZsZXgtb3JkZXInLCAnZmlsbGVyLW9yZGVyJywgJ2luc3RhbmNlLW9yZGVyJyB9CiAgICAgIHJldHVybiBEaWV0aXRpYW5SZWZlcnJhbE9yZGVyLmF1dGhvcmVkT24KICApCiAgICB1bmlvbiAoIFsiUHJvY2VkdXJlIjogIkRpZXRpdGlhbiBSZWZlcnJhbCJdIERpZXRpdGlhblJlZmVycmFsUGVyZm9ybWVkCiAgICAgICAgd2hlcmUgRGlldGl0aWFuUmVmZXJyYWxQZXJmb3JtZWQuc3RhdHVzIGluIHsgJ2NvbXBsZXRlZCcsICdpbi1wcm9ncmVzcycgfQogICAgICAgIHJldHVybiBzdGFydCBvZiBEaWV0aXRpYW5SZWZlcnJhbFBlcmZvcm1lZC5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkKICAgICkKCmRlZmluZSAiRW5jb3VudGVycyB3aXRoIERpZXRpdGlhbiBSZWZlcnJhbCI6CiAgIk1lYXN1cmUgUG9wdWxhdGlvbiIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2l0aCAiSW50ZXJ2ZW50aW9uIERpZXRpdGlhbiBSZWZlcnJhbCIgRGlldGl0aWFuUmVmZXJyYWxEYXRlCiAgICAgIHN1Y2ggdGhhdCBEaWV0aXRpYW5SZWZlcnJhbERhdGUgZHVyaW5nIGRheSBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkKCmRlZmluZSAiRW5jb3VudGVycyB3aXRoIE1hbG51dHJpdGlvbiBSaXNrIFNjcmVlbmluZyI6CiAgIkVuY291bnRlcnMgd2l0aCBNYWxudXRyaXRpb24gUmlzayBTY3JlZW5pbmcgTm90IEF0IFJpc2siCiAgICB1bmlvbiAiRW5jb3VudGVycyB3aXRoIE1hbG51dHJpdGlvbiBSaXNrIFNjcmVlbmluZyBBdCBSaXNrIgoKZGVmaW5lICJFbmNvdW50ZXJzIHdpdGggTWFsbnV0cml0aW9uIFJpc2sgU2NyZWVuaW5nIG9yIHdpdGggRGlldGl0aWFuIFJlZmVycmFsIjoKICAiRW5jb3VudGVycyB3aXRoIE1hbG51dHJpdGlvbiBSaXNrIFNjcmVlbmluZyIKICAgIHVuaW9uICJFbmNvdW50ZXJzIHdpdGggRGlldGl0aWFuIFJlZmVycmFsIgoKZGVmaW5lICJFbmNvdW50ZXJzIHdpdGggTWFsbnV0cml0aW9uIFJpc2sgU2NyZWVuaW5nIE5vdCBBdCBSaXNrIjoKICAiTWVhc3VyZSBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aXRoIFsiT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50IjogIk1hbG51dHJpdGlvbiBSaXNrIFNjcmVlbmluZyJdIE1hbG51dHJpdGlvblJpc2tTY3JlZW5pbmcKICAgICAgc3VjaCB0aGF0IE1hbG51dHJpdGlvblJpc2tTY3JlZW5pbmcuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIE1hbG51dHJpdGlvblJpc2tTY3JlZW5pbmcuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkKICAgICAgICBhbmQgKCBNYWxudXRyaXRpb25SaXNrU2NyZWVuaW5nLnZhbHVlIGFzIEZISVIuQ29kZWFibGVDb25jZXB0IGluICJNYWxudXRyaXRpb24gU2NyZWVuaW5nIEZpbmRpbmcgb2YgTm90IEF0IFJpc2sgUmVzdWx0IiApCgpkZWZpbmUgIkVuY291bnRlcnMgd2l0aCBNYWxudXRyaXRpb24gTm90IEF0IFJpc2sgU2NyZWVuaW5nIGFuZCB3aXRob3V0IERpZXRpdGlhbiBSZWZlcnJhbCI6CiAgIkVuY291bnRlcnMgd2l0aCBNYWxudXRyaXRpb24gUmlzayBTY3JlZW5pbmcgTm90IEF0IFJpc2siCiAgICBleGNlcHQgIkVuY291bnRlcnMgd2l0aCBEaWV0aXRpYW4gUmVmZXJyYWwiCgpkZWZpbmUgIkVuY291bnRlcnMgd2l0aCBNYWxudXRyaXRpb24gUmlzayBTY3JlZW5pbmcgQXQgUmlzayI6CiAgIk1lYXN1cmUgUG9wdWxhdGlvbiIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2l0aCBbIk9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCI6ICJNYWxudXRyaXRpb24gUmlzayBTY3JlZW5pbmciXSBNYWxudXRyaXRpb25SaXNrU2NyZWVuaW5nCiAgICAgIHN1Y2ggdGhhdCBNYWxudXRyaXRpb25SaXNrU2NyZWVuaW5nLnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgIGFuZCBNYWxudXRyaXRpb25SaXNrU2NyZWVuaW5nLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCiAgICAgICAgYW5kICggTWFsbnV0cml0aW9uUmlza1NjcmVlbmluZy52YWx1ZSBhcyBGSElSLkNvZGVhYmxlQ29uY2VwdCBpbiAiTWFsbnV0cml0aW9uIFNjcmVlbmluZyBGaW5kaW5nIG9mIEF0IFJpc2sgUmVzdWx0IiApCgpkZWZpbmUgIkVuY291bnRlcnMgd2l0aCBNYWxudXRyaXRpb24gUmlzayBTY3JlZW5pbmcgQXQgUmlzayBvciB3aXRoIERpZXRpdGlhbiBSZWZlcnJhbCI6CiAgIkVuY291bnRlcnMgd2l0aCBNYWxudXRyaXRpb24gUmlzayBTY3JlZW5pbmcgQXQgUmlzayIKICAgIHVuaW9uICJFbmNvdW50ZXJzIHdpdGggRGlldGl0aWFuIFJlZmVycmFsIgogICAKCi8qZGVmaW5lIGZ1bmN0aW9uICJMYXN0IE51dHJpdGlvbiBBc3Nlc3NtZW50IERheSBEdXJpbmcgRW5jb3VudGVyIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgTWF4KCJOdXRyaXRpb24gQXNzZXNzbWVudCBQZXJmb3JtZWQiIE51dHJpdGlvbkFzc2Vzc21lbnRUdXBsZQogICAgd2hlcmUgTnV0cml0aW9uQXNzZXNzbWVudFR1cGxlLkhvc3BFbmNJZCA9IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQKICAgIHJldHVybiBOdXRyaXRpb25Bc3Nlc3NtZW50VHVwbGUuTnV0ckFzc2Vzc1RpbWluZ0xhdGVzdAogICkKCmRlZmluZSAiTnV0cml0aW9uIEFzc2Vzc21lbnQgUGVyZm9ybWVkIjoKICAgIGZyb20KICAgICJNZWFzdXJlIFBvcHVsYXRpb24iIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICBbIk9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCI6ICJOdXRyaXRpb24gQXNzZXNzbWVudCJdIE51dHJpdGlvbkFzc2Vzc21lbnQKICAgICAgICB3aGVyZSBOdXRyaXRpb25Bc3Nlc3NtZW50LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgICAgICBhbmQgTnV0cml0aW9uQXNzZXNzbWVudC5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgZHVyaW5nIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQogICAgICAgICAgICBhbmQgTnV0cml0aW9uQXNzZXNzbWVudC52YWx1ZSBpcyBub3QgbnVsbAogICAgICAgICAgICByZXR1cm4gVHVwbGUgewogICAgICAgIEhvc3BFbmNJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwKICAgICAgICBOdXRyQXNzZXNzVGltaW5nTGF0ZXN0OiBOdXRyaXRpb25Bc3Nlc3NtZW50LmVmZmVjdGl2ZS5sYXRlc3QoKQogICAgICAgIH0KKi8KLy9UZXN0IGRlZmluaXRpb24gcGVyIENPRGV2IGZlZWRiYWNrCgoKCmRlZmluZSBmdW5jdGlvbiAiTGFzdCBOdXRyaXRpb24gQXNzZXNzbWVudCBEYXkgRHVyaW5nIEVuY291bnRlciIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIE1heChbIk9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCI6ICJOdXRyaXRpb24gQXNzZXNzbWVudCJdIE51dHJpdGlvbkFzc2Vzc21lbnQKICAgICAgd2hlcmUgTnV0cml0aW9uQXNzZXNzbWVudC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgTnV0cml0aW9uQXNzZXNzbWVudC5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpCiAgICAgICAgYW5kIE51dHJpdGlvbkFzc2Vzc21lbnQudmFsdWUgaXMgbm90IG51bGwKICAgICAgcmV0dXJuIE51dHJpdGlvbkFzc2Vzc21lbnQuZWZmZWN0aXZlLmxhdGVzdCgpCiAgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBNb3N0IFJlY2VudCBOdXRyaXRpb24gQXNzZXNzbWVudCBBbmQgSWRlbnRpZmllZCBTdGF0dXMiOgogICJFbmNvdW50ZXJzIHdpdGggTWFsbnV0cml0aW9uIFJpc2sgU2NyZWVuaW5nIEF0IFJpc2sgb3Igd2l0aCBEaWV0aXRpYW4gUmVmZXJyYWwiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggWyJPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQiOiAiTnV0cml0aW9uIEFzc2Vzc21lbnQiXSBOdXRyaXRpb25Bc3Nlc3NtZW50CiAgICAgIHN1Y2ggdGhhdCAoIE51dHJpdGlvbkFzc2Vzc21lbnQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgICBhbmQgTnV0cml0aW9uQXNzZXNzbWVudC5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgZHVyaW5nIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQogICAgICAgICAgYW5kICggTnV0cml0aW9uQXNzZXNzbWVudC52YWx1ZSBhcyBGSElSLkNvZGVhYmxlQ29uY2VwdCBpbiAiTnV0cml0aW9uIEFzc2Vzc21lbnQgU3RhdHVzIEZpbmRpbmcgb2YgV2VsbCBOb3VyaXNoZWQgb3IgTm90IE1hbG5vdXJpc2hlZCBvciBNaWxkbHkgTWFsbm91cmlzaGVkIgogICAgICAgICAgICAgIG9yICggTnV0cml0aW9uQXNzZXNzbWVudC52YWx1ZSBhcyBGSElSLkNvZGVhYmxlQ29uY2VwdCBpbiAiTnV0cml0aW9uIEFzc2Vzc21lbnQgU3RhdHVzIEZpbmRpbmcgb2YgTW9kZXJhdGVseSBNYWxub3VyaXNoZWQiICkKICAgICAgICAgICAgICBvciAoIE51dHJpdGlvbkFzc2Vzc21lbnQudmFsdWUgYXMgRkhJUi5Db2RlYWJsZUNvbmNlcHQgaW4gIk51dHJpdGlvbiBBc3Nlc3NtZW50IFN0YXR1cyBGaW5kaW5nIG9mIFNldmVyZWx5IE1hbG5vdXJpc2hlZCIgKQogICAgICAgICAgKQogICAgICAgICAgYW5kIE51dHJpdGlvbkFzc2Vzc21lbnQuZWZmZWN0aXZlLmxhdGVzdCAoICkgc2FtZSBkYXkgYXMgIkxhc3QgTnV0cml0aW9uIEFzc2Vzc21lbnQgRGF5IER1cmluZyBFbmNvdW50ZXIiKFF1YWxpZnlpbmdFbmNvdW50ZXIpCiAgICAgICkKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggTW9zdCBSZWNlbnQgTnV0cml0aW9uIEFzc2Vzc21lbnQgU3RhdHVzIG9mIE1vZGVyYXRlbHkgT3IgU2V2ZXJlbHkgTWFsbm91cmlzaGVkIjoKICAiTWVhc3VyZSBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aXRoIFsiT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50IjogIk51dHJpdGlvbiBBc3Nlc3NtZW50Il0gTnV0cml0aW9uQXNzZXNzbWVudAogICAgICBzdWNoIHRoYXQgTnV0cml0aW9uQXNzZXNzbWVudC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgTnV0cml0aW9uQXNzZXNzbWVudC5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgZHVyaW5nIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQogICAgICAgIGFuZCAoIE51dHJpdGlvbkFzc2Vzc21lbnQudmFsdWUgYXMgRkhJUi5Db2RlYWJsZUNvbmNlcHQgaW4gIk51dHJpdGlvbiBBc3Nlc3NtZW50IFN0YXR1cyBGaW5kaW5nIG9mIE1vZGVyYXRlbHkgTWFsbm91cmlzaGVkIgogICAgICAgICAgICBvciBOdXRyaXRpb25Bc3Nlc3NtZW50LnZhbHVlIGFzIEZISVIuQ29kZWFibGVDb25jZXB0IGluICJOdXRyaXRpb24gQXNzZXNzbWVudCBTdGF0dXMgRmluZGluZyBvZiBTZXZlcmVseSBNYWxub3VyaXNoZWQiCiAgICAgICAgKQogICAgICAgIGFuZCBOdXRyaXRpb25Bc3Nlc3NtZW50LmVmZmVjdGl2ZS5sYXRlc3QgKCApIHNhbWUgZGF5IGFzICJMYXN0IE51dHJpdGlvbiBBc3Nlc3NtZW50IERheSBEdXJpbmcgRW5jb3VudGVyIihRdWFsaWZ5aW5nRW5jb3VudGVyKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBNb3N0IFJlY2VudCBOdXRyaXRpb24gQXNzZXNzbWVudCBTdGF0dXMgb2YgTm90IG9yIE1pbGRseSBNYWxub3VyaXNoZWQiOgogICJNZWFzdXJlIFBvcHVsYXRpb24iIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggWyJPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQiOiAiTnV0cml0aW9uIEFzc2Vzc21lbnQiXSBOdXRyaXRpb25Bc3Nlc3NtZW50CiAgICAgIHN1Y2ggdGhhdCAoIE51dHJpdGlvbkFzc2Vzc21lbnQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgICBhbmQgTnV0cml0aW9uQXNzZXNzbWVudC5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgZHVyaW5nIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQogICAgICAgICAgYW5kICggTnV0cml0aW9uQXNzZXNzbWVudC52YWx1ZSBhcyBGSElSLkNvZGVhYmxlQ29uY2VwdCBpbiAiTnV0cml0aW9uIEFzc2Vzc21lbnQgU3RhdHVzIEZpbmRpbmcgb2YgV2VsbCBOb3VyaXNoZWQgb3IgTm90IE1hbG5vdXJpc2hlZCBvciBNaWxkbHkgTWFsbm91cmlzaGVkIiApCiAgICAgICAgICBhbmQgTnV0cml0aW9uQXNzZXNzbWVudC5lZmZlY3RpdmUubGF0ZXN0ICggKSBzYW1lIGRheSBhcyAiTGFzdCBOdXRyaXRpb24gQXNzZXNzbWVudCBEYXkgRHVyaW5nIEVuY291bnRlciIoUXVhbGlmeWluZ0VuY291bnRlcikKICAgICAgKQoKZGVmaW5lICJFbmNvdW50ZXJzIHdpdGggTWFsbnV0cml0aW9uIERpYWdub3NpcyI6CiAgKCAiTWVhc3VyZSBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHdoZXJlIGV4aXN0cyAoICJIYXMgTWFsbnV0cml0aW9uIERpYWdub3NpcyIgTWFsbnV0cml0aW9uRGlhZ25vc2lzCiAgICAgICAgICB3aGVyZSBNYWxudXRyaXRpb25EaWFnbm9zaXMucHJldmFsZW5jZUludGVydmFsICggKSBvdmVybGFwcyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCiAgICAgICkKICApCiAgICB1bmlvbiAiRW5jb3VudGVycyBXaXRoIEVuY291bnRlciBEaWFnbm9zaXMgT2YgTWFsbnV0cml0aW9uIERpYWdub3NpcyIKCmRlZmluZSAiSGFzIE1hbG51dHJpdGlvbiBEaWFnbm9zaXMiOgogIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiTWFsbnV0cml0aW9uIERpYWdub3NpcyJdIE1hbG51dHJpdGlvbkRpYWdub3NpcwogICAgd2hlcmUgTWFsbnV0cml0aW9uRGlhZ25vc2lzLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgb3ZlcmxhcHMgIk1lYXN1cmVtZW50IFBlcmlvZCIKICAgICAgYW5kIE1hbG51dHJpdGlvbkRpYWdub3Npcy5pc1ZlcmlmaWVkICggKQoKZGVmaW5lICJFbmNvdW50ZXJzIFdpdGggRW5jb3VudGVyIERpYWdub3NpcyBPZiBNYWxudXRyaXRpb24gRGlhZ25vc2lzIjoKICAiTWVhc3VyZSBQb3B1bGF0aW9uIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSBRdWFsaWZ5aW5nRW5jb3VudGVyLnJlYXNvbkNvZGUgaW4gIk1hbG51dHJpdGlvbiBEaWFnbm9zaXMiCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuZW5jb3VudGVyRGlhZ25vc2lzICggKS52ZXJpZmllZCAoICkuY29kZSBpbiAiTWFsbnV0cml0aW9uIERpYWdub3NpcyIKCmRlZmluZSAiRW5jb3VudGVycyB3aXRoIE51dHJpdGlvbiBDYXJlIFBsYW4iOgogICJNZWFzdXJlIFBvcHVsYXRpb24iIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggWyJQcm9jZWR1cmUiOiAiTnV0cml0aW9uIENhcmUgUGxhbiJdIE51dHJpdGlvbkNhcmVQbGFuCiAgICAgIHN1Y2ggdGhhdCBOdXRyaXRpb25DYXJlUGxhbi5zdGF0dXMgaW4geyAnY29tcGxldGVkJywgJ2luLXByb2dyZXNzJyB9CiAgICAgICAgYW5kIE51dHJpdGlvbkNhcmVQbGFuLnBlcmZvcm1lZC5lYXJsaWVzdCAoICkgZHVyaW5nIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQoKZGVmaW5lIGZ1bmN0aW9uICJNZWFzdXJlIE9ic2VydmF0aW9uIDEiKE1hbG51dHJpdGlvblJpc2tTY3JlZW5pbmcgRW5jb3VudGVyKToKICBpZiAiRW5jb3VudGVycyB3aXRoIE1hbG51dHJpdGlvbiBSaXNrIFNjcmVlbmluZyBvciB3aXRoIERpZXRpdGlhbiBSZWZlcnJhbCIgY29udGFpbnMgTWFsbnV0cml0aW9uUmlza1NjcmVlbmluZyB0aGVuIDEgCiAgICBlbHNlIDAKCmRlZmluZSBmdW5jdGlvbiAiTWVhc3VyZSBPYnNlcnZhdGlvbiAyIihOdXRyaXRpb25Bc3Nlc3NtZW50IEVuY291bnRlcik6CiAgaWYgIkVuY291bnRlcnMgd2l0aCBNYWxudXRyaXRpb24gTm90IEF0IFJpc2sgU2NyZWVuaW5nIGFuZCB3aXRob3V0IERpZXRpdGlhbiBSZWZlcnJhbCIgY29udGFpbnMgTnV0cml0aW9uQXNzZXNzbWVudCB0aGVuIDAgCiAgICBlbHNlIGlmICJFbmNvdW50ZXJzIHdpdGggTWFsbnV0cml0aW9uIFJpc2sgU2NyZWVuaW5nIEF0IFJpc2sgb3Igd2l0aCBEaWV0aXRpYW4gUmVmZXJyYWwiIGNvbnRhaW5zIE51dHJpdGlvbkFzc2Vzc21lbnQgdGhlbiAKICAgICAgaWYgIkVuY291bnRlciBXaXRoIE1vc3QgUmVjZW50IE51dHJpdGlvbiBBc3Nlc3NtZW50IEFuZCBJZGVudGlmaWVkIFN0YXR1cyIgY29udGFpbnMgTnV0cml0aW9uQXNzZXNzbWVudCB0aGVuIDEgCiAgICAgIGVsc2UgMCAKICAgIGVsc2UgMAoKZGVmaW5lIGZ1bmN0aW9uICJNZWFzdXJlIE9ic2VydmF0aW9uIDMiKE1hbG51dHJpdGlvbkRpYWdub3NpcyBFbmNvdW50ZXIpOgogIGlmICJFbmNvdW50ZXJzIHdpdGggTWFsbnV0cml0aW9uIE5vdCBBdCBSaXNrIFNjcmVlbmluZyBhbmQgd2l0aG91dCBEaWV0aXRpYW4gUmVmZXJyYWwiIGNvbnRhaW5zIE1hbG51dHJpdGlvbkRpYWdub3NpcyB0aGVuIDAgCiAgICBlbHNlIGlmICJFbmNvdW50ZXJzIHdpdGggTWFsbnV0cml0aW9uIFJpc2sgU2NyZWVuaW5nIEF0IFJpc2sgb3Igd2l0aCBEaWV0aXRpYW4gUmVmZXJyYWwiIGNvbnRhaW5zIE1hbG51dHJpdGlvbkRpYWdub3NpcyB0aGVuIAogICAgICBpZiAiRW5jb3VudGVycyB3aXRoIE1hbG51dHJpdGlvbiBEaWFnbm9zaXMiIGNvbnRhaW5zIE1hbG51dHJpdGlvbkRpYWdub3NpcyB0aGVuIAogICAgICAgIGlmICJFbmNvdW50ZXIgV2l0aCBNb3N0IFJlY2VudCBOdXRyaXRpb24gQXNzZXNzbWVudCBTdGF0dXMgb2YgTm90IG9yIE1pbGRseSBNYWxub3VyaXNoZWQiIGNvbnRhaW5zIE1hbG51dHJpdGlvbkRpYWdub3NpcyB0aGVuIDAgCiAgICAgICAgZWxzZSBpZiAiRW5jb3VudGVyIFdpdGggTW9zdCBSZWNlbnQgTnV0cml0aW9uIEFzc2Vzc21lbnQgU3RhdHVzIG9mIE1vZGVyYXRlbHkgT3IgU2V2ZXJlbHkgTWFsbm91cmlzaGVkIiBjb250YWlucyBNYWxudXRyaXRpb25EaWFnbm9zaXMgdGhlbiAxIAogICAgICBlbHNlIDAgCiAgICBlbHNlIDAgCiAgZWxzZSAwCgpkZWZpbmUgZnVuY3Rpb24gIk1lYXN1cmUgT2JzZXJ2YXRpb24gNCIoTnV0cml0aW9uQ2FyZVBsYW4gRW5jb3VudGVyKToKICBpZiAiRW5jb3VudGVycyB3aXRoIE1hbG51dHJpdGlvbiBOb3QgQXQgUmlzayBTY3JlZW5pbmcgYW5kIHdpdGhvdXQgRGlldGl0aWFuIFJlZmVycmFsIiBjb250YWlucyBOdXRyaXRpb25DYXJlUGxhbiB0aGVuIDAgCiAgICBlbHNlIGlmICJFbmNvdW50ZXJzIHdpdGggTWFsbnV0cml0aW9uIFJpc2sgU2NyZWVuaW5nIEF0IFJpc2sgb3Igd2l0aCBEaWV0aXRpYW4gUmVmZXJyYWwiIGNvbnRhaW5zIE51dHJpdGlvbkNhcmVQbGFuIHRoZW4gCiAgICAgIGlmICJFbmNvdW50ZXJzIHdpdGggTnV0cml0aW9uIENhcmUgUGxhbiIgY29udGFpbnMgTnV0cml0aW9uQ2FyZVBsYW4gdGhlbiAKICAgICAgICBpZiAiRW5jb3VudGVyIFdpdGggTW9zdCBSZWNlbnQgTnV0cml0aW9uIEFzc2Vzc21lbnQgU3RhdHVzIG9mIE5vdCBvciBNaWxkbHkgTWFsbm91cmlzaGVkIiBjb250YWlucyBOdXRyaXRpb25DYXJlUGxhbiB0aGVuIDAgCiAgICAgICAgZWxzZSBpZiAiRW5jb3VudGVyIFdpdGggTW9zdCBSZWNlbnQgTnV0cml0aW9uIEFzc2Vzc21lbnQgU3RhdHVzIG9mIE1vZGVyYXRlbHkgT3IgU2V2ZXJlbHkgTWFsbm91cmlzaGVkIiBjb250YWlucyBOdXRyaXRpb25DYXJlUGxhbiB0aGVuIDEgCiAgICAgICAgZWxzZSAwIAogICAgICBlbHNlIDAgCiAgICBlbHNlIDAKCmRlZmluZSBmdW5jdGlvbiAiVG90YWwgTWFsbnV0cml0aW9uIENhcmUgU2NvcmUgRWxpZ2libGUgT2NjdXJyZW5jZXMiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBpZiAiRW5jb3VudGVycyB3aXRoIE1hbG51dHJpdGlvbiBSaXNrIFNjcmVlbmluZyBvciB3aXRoIERpZXRpdGlhbiBSZWZlcnJhbCIgY29udGFpbnMgUXVhbGlmeWluZ0VuY291bnRlcgogICAgYW5kICJFbmNvdW50ZXJzIHdpdGggTWFsbnV0cml0aW9uIFJpc2sgU2NyZWVuaW5nIE5vdCBBdCBSaXNrIiBjb250YWlucyBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICBhbmQgbm90ICggIkVuY291bnRlcnMgd2l0aCBEaWV0aXRpYW4gUmVmZXJyYWwiIGNvbnRhaW5zIFF1YWxpZnlpbmdFbmNvdW50ZXIgKSB0aGVuIDEgCiAgICBlbHNlIGlmICggIkVuY291bnRlcnMgd2l0aCBNYWxudXRyaXRpb24gUmlzayBTY3JlZW5pbmcgb3Igd2l0aCBEaWV0aXRpYW4gUmVmZXJyYWwiIGNvbnRhaW5zIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgYW5kICJFbmNvdW50ZXJzIHdpdGggTWFsbnV0cml0aW9uIFJpc2sgU2NyZWVuaW5nIEF0IFJpc2siIGNvbnRhaW5zIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgb3IgIkVuY291bnRlcnMgd2l0aCBEaWV0aXRpYW4gUmVmZXJyYWwiIGNvbnRhaW5zIFF1YWxpZnlpbmdFbmNvdW50ZXIKICApCiAgICBhbmQgIkVuY291bnRlciBXaXRoIE1vc3QgUmVjZW50IE51dHJpdGlvbiBBc3Nlc3NtZW50IFN0YXR1cyBvZiBOb3Qgb3IgTWlsZGx5IE1hbG5vdXJpc2hlZCIgY29udGFpbnMgUXVhbGlmeWluZ0VuY291bnRlcgogICAgb3Igbm90ICggIkVuY291bnRlciBXaXRoIE1vc3QgUmVjZW50IE51dHJpdGlvbiBBc3Nlc3NtZW50IEFuZCBJZGVudGlmaWVkIFN0YXR1cyIgY29udGFpbnMgUXVhbGlmeWluZ0VuY291bnRlciApIHRoZW4gMiAKICAgIGVsc2UgNAoKZGVmaW5lIGZ1bmN0aW9uICJNZWFzdXJlIE9ic2VydmF0aW9uIFRvdGFsIE1hbG51dHJpdGlvbiBDb21wb25lbnRzIFNjb3JlIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgU3VtKHsgIk1lYXN1cmUgT2JzZXJ2YXRpb24gMSIoUXVhbGlmeWluZ0VuY291bnRlciksICJNZWFzdXJlIE9ic2VydmF0aW9uIDIiKFF1YWxpZnlpbmdFbmNvdW50ZXIpLCAiTWVhc3VyZSBPYnNlcnZhdGlvbiAzIihRdWFsaWZ5aW5nRW5jb3VudGVyKSwgIk1lYXN1cmUgT2JzZXJ2YXRpb24gNCIoUXVhbGlmeWluZ0VuY291bnRlcikgfSkKCmRlZmluZSBmdW5jdGlvbiAiTWVhc3VyZSBPYnNlcnZhdGlvbiBUb3RhbCBNYWxudXRyaXRpb24gQ2FyZSBTY29yZSBhcyBQZXJjZW50YWdlIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgMTAwICogKCAiTWVhc3VyZSBPYnNlcnZhdGlvbiBUb3RhbCBNYWxudXRyaXRpb24gQ29tcG9uZW50cyBTY29yZSIoUXVhbGlmeWluZ0VuY291bnRlcikgLyAiVG90YWwgTWFsbnV0cml0aW9uIENhcmUgU2NvcmUgRWxpZ2libGUgT2NjdXJyZW5jZXMiKFF1YWxpZnlpbmdFbmNvdW50ZXIpICk="/>
    <url
         value="https://madie.cms.gov/Library-CMS986FHIRMalnutritionScore.cql"/>
  </content>
</Library>