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

: CMS56FHIRFuncStatHipReplacement - JSON Representation

Draft as of 2026-09-19

Raw json | Download

{
  "resourceType" : "Library",
  "id" : "CMS56FHIRFuncStatHipReplacement",
  "text" : {
    "status" : "extensions",
    "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n  <table class=\"narrative-table\">\n    <tbody>\n<tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\"><a name=\"metadata\"> </a>Metadata</th>\n\n\n</tr>\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Version</th>\n\n\n\n<td class=\"content-container\">1.1.000</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Status</th>\n\n\n\n<td class=\"content-container\">Draft</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Type</th>\n\n\n\n<td class=\"content-container\">\n    <a href=\"http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html\">http://terminology.hl7.org/CodeSystem/library-type</a>#logic-library\n\n\n</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\"><a name=\"parameters\"> </a>Parameters</th>\n\n\n</tr>\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Parameter</th>\n\n\n\n<td class=\"content-container\">None</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n  <tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\">Library Content</th>\n\n\n</tr>\n  \n    \n    <tr>\n      <th scope=\"row\" class=\"row-header\">CQL Content</th>\n      <td>\n        <a name=\"cql-content\"> </a>\n        <pre style=\"border: none;\" class=\"content-container highlight language-cql\"><code class=\"language-cql\">/*\nNOTE: For use by March 2026 US Realm Connectathon participants for internal use only. Not for use or distribution in commercial products.\n*/\nlibrary CMS56FHIRFuncStatHipReplacement version '1.1.000'\n\nusing USQualityCore version '0.1.0-cibuild'\nusing USCore version '6.1.0-derived'\nusing FHIR version '4.0.1'\n\ninclude hl7.fhir.uv.cql.FHIRHelpers version '4.0.1' called FHIRHelpers\ninclude hl7.fhir.uv.cql.FHIRCommon version '2.0.0' called FHIRCommon\ninclude hl7.fhir.us.cql.USCoreCommon version '2.0.0-ballot' called USCoreCommon\ninclude hl7.fhir.us.cql.USCoreElements version '2.0.0-ballot' called USCoreElements\n\ninclude USQualityCoreCommon version '0.1.0-cibuild' called USQualityCoreCommon\ninclude SupplementalDataElements version '6.1.000' called SDE\ninclude Status version '2.1.000' called Status\ninclude Hospice version '7.1.000' called Hospice\n\ncodesystem &quot;LOINC&quot;: 'http://loinc.org'\ncodesystem &quot;CPT&quot;: 'http://www.ama-assn.org/go/cpt'\ncodesystem &quot;SNOMEDCT&quot;: 'http://snomed.info/sct'\n\nvalueset &quot;Lower Body Fractures Excluding Ankle and Foot&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.1178'\nvalueset &quot;Malignant Neoplasms of Lower and Unspecified Limbs&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.1180'\nvalueset &quot;Mechanical Complications Excluding Upper Body&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.1182'\nvalueset &quot;Office Visit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1001'\nvalueset &quot;Virtual Encounter&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1089'\nvalueset &quot;Outpatient Consultation&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1008'\nvalueset &quot;Partial Arthroplasty of Hip&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.1184'\nvalueset &quot;Primary THA Procedure&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.198.12.1006'\nvalueset &quot;Removal, Revision and Supplement Procedures of the Lower Body and Spine&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.1189'\nvalueset &quot;Telephone Visits&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1080'\n\ncode &quot;Activities of daily living score [HOOS]&quot;: '72095-3' from &quot;LOINC&quot; display 'Activities of daily living score [HOOS]'\ncode &quot;Dead (finding)&quot;: '419099009' from &quot;SNOMEDCT&quot; display 'Dead (finding)'\ncode &quot;Pain score [HOOS]&quot;: '72097-9' from &quot;LOINC&quot; display 'Pain score [HOOS]'\ncode &quot;Postoperative follow-up visit, normally included in the surgical package, to indicate that an evaluation and management service was performed during a postoperative period for a reason(s) related to the original procedure&quot;: '99024' from &quot;CPT&quot; display 'Postoperative follow-up visit, normally included in the surgical package, to indicate that an evaluation and management service was performed during a postoperative period for a reason(s) related to the original procedure'\ncode &quot;PROMIS-10 Global Mental Health (GMH) score T-score&quot;: '71969-0' from &quot;LOINC&quot; display 'PROMIS-10 Global Mental Health (GMH) score T-score'\ncode &quot;PROMIS-10 Global Physical Health (GPH) score T-score&quot;: '71971-6' from &quot;LOINC&quot; display 'PROMIS-10 Global Physical Health (GPH) score T-score'\ncode &quot;Quality of life score [HOOS]&quot;: '72093-8' from &quot;LOINC&quot; display 'Quality of life score [HOOS]'\ncode &quot;Severe cognitive impairment (finding)&quot;: '702956004' from &quot;SNOMEDCT&quot; display 'Severe cognitive impairment (finding)'\ncode &quot;Sport-recreation score [HOOS]&quot;: '72094-6' from &quot;LOINC&quot; display 'Sport-recreation score [HOOS]'\ncode &quot;Symptoms score [HOOS]&quot;: '72096-1' from &quot;LOINC&quot; display 'Symptoms score [HOOS]'\ncode &quot;Total interval score [HOOSJR]&quot;: '82323-7' from &quot;LOINC&quot; display 'Total interval score [HOOSJR]'\ncode &quot;VR-12 Mental component summary (MCS) score - oblique method T-score&quot;: '72026-8' from &quot;LOINC&quot; display 'VR-12 Mental component summary (MCS) score - oblique method T-score'\ncode &quot;VR-12 Mental component summary (MCS) score - orthogonal method T-score&quot;: '72028-4' from &quot;LOINC&quot; display 'VR-12 Mental component summary (MCS) score - orthogonal method T-score'\ncode &quot;VR-12 Physical component summary (PCS) score - oblique method T-score&quot;: '72025-0' from &quot;LOINC&quot; display 'VR-12 Physical component summary (PCS) score - oblique method T-score'\ncode &quot;VR-12 Physical component summary (PCS) score - orthogonal method T-score&quot;: '72027-6' from &quot;LOINC&quot; display 'VR-12 Physical component summary (PCS) score - orthogonal method T-score'\n\nparameter &quot;Measurement Period&quot; Interval&lt;DateTime&gt;\n  default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)\n\ncontext Patient\n\ndefine &quot;SDE Ethnicity&quot;:\n  SDE.&quot;SDE Ethnicity&quot;\n\ndefine &quot;SDE Payer&quot;:\n  SDE.&quot;SDE Payer&quot;\n\ndefine &quot;SDE Race&quot;:\n  SDE.&quot;SDE Race&quot;\n\ndefine &quot;SDE Sex&quot;:\n  SDE.&quot;SDE Sex&quot;\n\ndefine &quot;Initial Population&quot;:\n  &quot;Has Qualifying Encounter&quot;\n    and exists ( &quot;Total Hip Arthroplasty Procedure&quot; )\n    and AgeInYearsAt(date from start of &quot;Measurement Period&quot;) &gt;= 19\n\ndefine &quot;Has Qualifying Encounter&quot;:\n  exists ( ( ( [Encounter: &quot;Outpatient Consultation&quot;]\n        union [Encounter: &quot;Office Visit&quot;]\n        union ( [Encounter] E\n            where exists ( ( E.type ) T\n                where T ~ &quot;Postoperative follow-up visit, normally included in the surgical package, to indicate that an evaluation and management service was performed during a postoperative period for a reason(s) related to the original procedure&quot;\n            )\n        )\n        union [Encounter: &quot;Telephone Visits&quot;]\n        union [Encounter: &quot;Virtual Encounter&quot;]\n    ).isEncounterPerformed ( ) ) ValidEncounters\n      where ValidEncounters.period during day of Interval[&quot;August 1 Year Prior to the Measurement Period&quot;, end of &quot;Measurement Period&quot;]\n  )\n\ndefine &quot;August 1 Year Prior to the Measurement Period&quot;:\n  DateTime((year from start of &quot;Measurement Period&quot; - 1), 8, 1, 0, 0, 0, 0, 0)\n\ndefine &quot;Total Hip Arthroplasty Procedure&quot;:\n  ( ( [Procedure: &quot;Primary THA Procedure&quot;] ).isProcedurePerformed ( ) ) THAProcedure\n    where THAProcedure.performed.toInterval ( ) starts during day of Interval[&quot;November 1 Two Years Prior to the Measurement Period&quot;, &quot;October 31 Year Prior to the Measurement Period&quot;]\n\ndefine &quot;November 1 Two Years Prior to the Measurement Period&quot;:\n  DateTime((year from start of &quot;Measurement Period&quot; - 2), 11, 1, 0, 0, 0, 0, 0)\n\ndefine &quot;October 31 Year Prior to the Measurement Period&quot;:\n  DateTime((year from start of &quot;Measurement Period&quot; - 1), 10, 31, 23, 59, 59, 999, 0)\n\ndefine &quot;Denominator&quot;:\n  &quot;Initial Population&quot;\n\ndefine &quot;Denominator Exclusions&quot;:\n  Hospice.&quot;Has Hospice Services&quot;\n    or &quot;Has Severe Cognitive Impairment&quot;\n    or &quot;Has Total Hip Arthroplasty with 1 or More Lower Body Fractures&quot;\n    or &quot;Has Partial Hip Arthroplasty Procedure&quot;\n    or &quot;Has Revision Hip Arthroplasty Procedure or Implanted Device or Prosthesis Removal Procedure&quot;\n    or &quot;Has Malignant Neoplasm of Lower and Unspecified Limbs&quot;\n    or &quot;Has Mechanical Complication&quot;\n    or &quot;Has More Than One Elective Primary Total Hip Arthroplasty Performed&quot;\n    or &quot;Death Within 300 Days of the THA Procedure&quot;\n\ndefine &quot;Has Severe Cognitive Impairment&quot;:\n  // [E-13] base FHIR.Condition retrieve (defect-tracking/engine-issues.md E-13)\n  // Original:\n  //   exists ( [ConditionProblemsHealthConcerns: &quot;Severe cognitive impairment (finding)&quot;]\n  //     union [ConditionEncounterDiagnosis: &quot;Severe cognitive impairment (finding)&quot;] ) Dementia\n  //     where Dementia.prevalenceInterval ( ) overlaps day of &quot;Measurement Period&quot;\n  exists ( [FHIR.Condition: &quot;Severe cognitive impairment (finding)&quot;] ) Dementia\n    where Dementia.prevalenceInterval ( ) overlaps day of &quot;Measurement Period&quot;\n\ndefine &quot;Has Total Hip Arthroplasty with 1 or More Lower Body Fractures&quot;:\n  exists ( &quot;Total Hip Arthroplasty Procedure&quot; THAProcedure\n      with ( // [E-13] base FHIR.Condition retrieve (defect-tracking/engine-issues.md E-13)\n        // Original:\n        //   ( [ConditionEncounterDiagnosis: &quot;Lower Body Fractures Excluding Ankle and Foot&quot;]\n        //     union [ConditionProblemsHealthConcerns: &quot;Lower Body Fractures Excluding Ankle and Foot&quot;] )\n        [FHIR.Condition: &quot;Lower Body Fractures Excluding Ankle and Foot&quot;] ) LowerBodyFracture\n        such that LowerBodyFracture.prevalenceInterval ( ) starts 48 hours or less on or before start of THAProcedure.performed.toInterval ( )\n          and LowerBodyFracture.isVerified ( )\n  )\n\ndefine &quot;Has Partial Hip Arthroplasty Procedure&quot;:\n  exists ( ( ( [Procedure: &quot;Partial Arthroplasty of Hip&quot;] ).isProcedurePerformed ( ) ) PartialTHAProcedure\n      with &quot;Total Hip Arthroplasty Procedure&quot; THAProcedure\n        such that PartialTHAProcedure.performed.toInterval ( ) during day of THAProcedure.performed.toInterval ( )\n  )\n\ndefine &quot;Has Revision Hip Arthroplasty Procedure or Implanted Device or Prosthesis Removal Procedure&quot;:\n  exists ( &quot;Total Hip Arthroplasty Procedure&quot; THAProcedure\n      with ( ( [Procedure: &quot;Removal, Revision and Supplement Procedures of the Lower Body and Spine&quot;] ).isProcedurePerformed ( ) ) RevisionTHAProcedure\n        such that RevisionTHAProcedure.performed.toInterval ( ) during day of THAProcedure.performed.toInterval ( )\n  )\n\ndefine &quot;Has Malignant Neoplasm of Lower and Unspecified Limbs&quot;:\n  // [E-13] base FHIR.Condition retrieve (defect-tracking/engine-issues.md E-13)\n  // Original:\n  //   exists ( ( [ConditionProblemsHealthConcerns: &quot;Malignant Neoplasms of Lower and Unspecified Limbs&quot;]\n  //       union [ConditionEncounterDiagnosis: &quot;Malignant Neoplasms of Lower and Unspecified Limbs&quot;] ) MalignantNeoplasm\n  exists ( ( [FHIR.Condition: &quot;Malignant Neoplasms of Lower and Unspecified Limbs&quot;] ) MalignantNeoplasm\n      with &quot;Total Hip Arthroplasty Procedure&quot; THAProcedure\n        such that MalignantNeoplasm.prevalenceInterval ( ) overlaps day of THAProcedure.performed.toInterval ( )\n          and MalignantNeoplasm.isVerified ( )\n  )\n\ndefine &quot;Has Mechanical Complication&quot;:\n  // [E-13] base FHIR.Condition retrieve (defect-tracking/engine-issues.md E-13)\n  // Original:\n  //   exists ( ( [ConditionEncounterDiagnosis: &quot;Mechanical Complications Excluding Upper Body&quot;]\n  //       union [ConditionProblemsHealthConcerns: &quot;Mechanical Complications Excluding Upper Body&quot;] ) MechanicalComplications\n  exists ( ( [FHIR.Condition: &quot;Mechanical Complications Excluding Upper Body&quot;] ) MechanicalComplications\n      with &quot;Total Hip Arthroplasty Procedure&quot; THAProcedure\n        such that MechanicalComplications.prevalenceInterval ( ) overlaps day of THAProcedure.performed.toInterval ( )\n          and MechanicalComplications.isVerified ( )\n  )\n\ndefine &quot;Has More Than One Elective Primary Total Hip Arthroplasty Performed&quot;:\n  exists ( &quot;Total Hip Arthroplasty Procedure&quot; THAProcedure\n      with ( ( [Procedure: &quot;Primary THA Procedure&quot;] ).isProcedurePerformed ( ) ) ElectiveTHAProcedure\n        such that THAProcedure.id !~ ElectiveTHAProcedure.id\n          and start of ElectiveTHAProcedure.performed.toInterval ( ) during day of Interval[( start of THAProcedure.performed.toInterval ( ) ) - 1 year, ( start of THAProcedure.performed.toInterval ( ) ) + 1 year]\n  )\n\ndefine &quot;Death Within 300 Days of the THA Procedure&quot;:\n  exists &quot;Total Hip Arthroplasty Procedure&quot; THAProcedure\n    where date from Patient.deceased during day of Interval[date from start of THAProcedure.performed.toInterval ( ), date from start of THAProcedure.performed.toInterval ( ) + 300 days]\n\ndefine &quot;Numerator&quot;:\n  ( &quot;Has THA with Initial and Follow Up HOOS Assessments&quot; )\n    or ( &quot;Has THA with Initial and Follow Up HOOSJr Assessments&quot; )\n    or ( &quot;Has THA with Initial and Follow Up PROMIS10 Assessments&quot; )\n    or ( &quot;Has THA with Initial and Follow Up VR12 Oblique Assessments&quot; )\n    or ( &quot;Has THA with Initial and Follow Up VR12 Orthogonal Assessments&quot; )\n\ndefine &quot;Has THA with Initial and Follow Up HOOS Assessments&quot;:\n  exists ( ( &quot;Total Hip Arthroplasty Procedure&quot; THAProcedure\n      return THAProcedure.performed.toInterval ( ) ) TotalHip\n      with &quot;Date HOOS Total Assessment Completed&quot; InitialHipAssessmentHOOS\n        such that TotalHip starts 90 days or less on or after day of InitialHipAssessmentHOOS\n      with &quot;Date HOOS Total Assessment Completed&quot; FollowUpHipAssessmentHOOS\n        such that date from FollowUpHipAssessmentHOOS during day of Interval[date from end of TotalHip + 300 days, date from end of TotalHip + 425 days]\n  )\n\ndefine &quot;Date HOOS Total Assessment Completed&quot;:\n  from\n    ( ( [ObservationScreeningAssessment: &quot;Quality of life score [HOOS]&quot;] ).isAssessmentPerformed ( ) ) HOOSLifeQuality,\n    ( ( [ObservationScreeningAssessment: &quot;Sport-recreation score [HOOS]&quot;] ).isAssessmentPerformed ( ) ) HOOSSport,\n    ( ( [ObservationScreeningAssessment: &quot;Activities of daily living score [HOOS]&quot;] ).isAssessmentPerformed ( ) ) HOOSActivityScore,\n    ( ( [ObservationScreeningAssessment: &quot;Symptoms score [HOOS]&quot;] ).isAssessmentPerformed ( ) ) HOOSSymptoms,\n    ( ( [ObservationScreeningAssessment: &quot;Pain score [HOOS]&quot;] ).isAssessmentPerformed ( ) ) HOOSPain\n    let HOOSLifeQualityDate: date from start of HOOSLifeQuality.effective.toInterval ( ),\n    HOOSSportDate: date from start of HOOSSport.effective.toInterval ( ),\n    HOOSActivityScoreDate: date from start of HOOSActivityScore.effective.toInterval ( ),\n    HOOSSymptomsDate: date from start of HOOSSymptoms.effective.toInterval ( ),\n    HOOSPainDate: date from start of HOOSPain.effective.toInterval ( )\n    where HOOSLifeQualityDate same day as HOOSSportDate\n      and ( HOOSSport as ObservationScreeningAssessment ).value is not null\n      and HOOSLifeQualityDate same day as HOOSActivityScoreDate\n      and ( HOOSActivityScore as ObservationScreeningAssessment ).value is not null\n      and HOOSLifeQualityDate same day as HOOSSymptomsDate\n      and ( HOOSSymptoms as ObservationScreeningAssessment ).value is not null\n      and HOOSLifeQualityDate same day as HOOSPainDate\n      and ( HOOSPain as ObservationScreeningAssessment ).value is not null\n      and ( HOOSLifeQuality as ObservationScreeningAssessment ).value is not null\n    return Max({ HOOSLifeQualityDate, HOOSSportDate, HOOSActivityScoreDate, HOOSSymptomsDate, HOOSPainDate })\n\ndefine &quot;Has THA with Initial and Follow Up HOOSJr Assessments&quot;:\n  exists ( ( &quot;Total Hip Arthroplasty Procedure&quot; THAProcedure\n      return THAProcedure.performed.toInterval ( ) ) TotalHip\n      with &quot;Date HOOSJr Total Assessment Completed&quot; InitialHipAssessment\n        such that TotalHip starts 90 days or less on or after day of InitialHipAssessment\n      with &quot;Date HOOSJr Total Assessment Completed&quot; FollowUpHipAssessment\n        such that date from FollowUpHipAssessment during day of Interval[date from end of TotalHip + 300 days, date from end of TotalHip + 425 days]\n  )\n\ndefine &quot;Date HOOSJr Total Assessment Completed&quot;:\n  ( ( ( [ObservationScreeningAssessment: &quot;Total interval score [HOOSJR]&quot;] ).isAssessmentPerformed ( ) ) HOOSJr\n    where ( HOOSJr as ObservationScreeningAssessment ).value is not null ) DocumentedHOOSJr\n    return date from start of DocumentedHOOSJr.effective.toInterval ( )\n\ndefine &quot;Has THA with Initial and Follow Up PROMIS10 Assessments&quot;:\n  exists ( ( &quot;Total Hip Arthroplasty Procedure&quot; THAProcedure\n      return THAProcedure.performed.toInterval ( ) ) TotalHip\n      with &quot;Date PROMIS10 Total Assessment Completed&quot; InitialHipAssessmentPROMIS10\n        such that TotalHip starts 90 days or less on or after day of InitialHipAssessmentPROMIS10\n      with &quot;Date PROMIS10 Total Assessment Completed&quot; FollowUpHipAssessmentPROMIS10\n        such that date from FollowUpHipAssessmentPROMIS10 during day of Interval[date from end of TotalHip + 300 days, date from end of TotalHip + 425 days]\n  )\n\ndefine &quot;Date PROMIS10 Total Assessment Completed&quot;:\n  from\n    ( ( [ObservationScreeningAssessment: &quot;PROMIS-10 Global Mental Health (GMH) score T-score&quot;] ).isAssessmentPerformed ( ) ) PROMIS10MentalScore,\n    ( ( [ObservationScreeningAssessment: &quot;PROMIS-10 Global Physical Health (GPH) score T-score&quot;] ).isAssessmentPerformed ( ) ) PROMIS10PhysicalScore\n    let PROMIS10MentalScoreDate: date from start of PROMIS10MentalScore.effective.toInterval ( ),\n    PROMIS10PhysicalScoreDate: date from start of PROMIS10PhysicalScore.effective.toInterval ( )\n    where PROMIS10MentalScoreDate same day as PROMIS10PhysicalScoreDate\n      and ( PROMIS10PhysicalScore as ObservationScreeningAssessment ).value is not null\n      and ( PROMIS10MentalScore as ObservationScreeningAssessment ).value is not null\n    return Max({ PROMIS10MentalScoreDate, PROMIS10PhysicalScoreDate })\n\ndefine &quot;Has THA with Initial and Follow Up VR12 Oblique Assessments&quot;:\n  exists ( ( &quot;Total Hip Arthroplasty Procedure&quot; THAProcedure\n      return THAProcedure.performed.toInterval ( ) ) TotalHip\n      with &quot;Date VR12 Oblique Total Assessment Completed&quot; InitialHipAssessmentOblique\n        such that TotalHip starts 90 days or less on or after day of InitialHipAssessmentOblique\n      with &quot;Date VR12 Oblique Total Assessment Completed&quot; FollowUpHipAssessmentOblique\n        such that date from FollowUpHipAssessmentOblique during day of Interval[date from end of TotalHip + 300 days, date from end of TotalHip + 425 days]\n  )\n\ndefine &quot;Date VR12 Oblique Total Assessment Completed&quot;:\n  from\n    ( ( [ObservationScreeningAssessment: &quot;VR-12 Mental component summary (MCS) score - oblique method T-score&quot;] ).isAssessmentPerformed ( ) ) VR12MentalAssessment,\n    ( ( [ObservationScreeningAssessment: &quot;VR-12 Physical component summary (PCS) score - oblique method T-score&quot;] ).isAssessmentPerformed ( ) ) VR12PhysicalAssessment\n    let VR12MentalAssessmentDate: date from start of VR12MentalAssessment.effective.toInterval ( ),\n    VR12PhysicalAssessmentDate: date from start of VR12PhysicalAssessment.effective.toInterval ( )\n    where VR12MentalAssessmentDate same day as VR12PhysicalAssessmentDate\n      and ( VR12MentalAssessment as ObservationScreeningAssessment ).value is not null\n      and ( VR12PhysicalAssessment as ObservationScreeningAssessment ).value is not null\n    return Max({ VR12MentalAssessmentDate, VR12PhysicalAssessmentDate })\n\ndefine &quot;Has THA with Initial and Follow Up VR12 Orthogonal Assessments&quot;:\n  exists ( ( &quot;Total Hip Arthroplasty Procedure&quot; THAProcedure\n      return THAProcedure.performed.toInterval ( ) ) TotalHip\n      with &quot;Date VR12 Orthogonal Total Assessment Completed&quot; InitialHipAssessmentOrthogonal\n        such that TotalHip starts 90 days or less on or after day of InitialHipAssessmentOrthogonal\n      with &quot;Date VR12 Orthogonal Total Assessment Completed&quot; FollowUpHipAssessmentOrthogonal\n        such that date from FollowUpHipAssessmentOrthogonal during day of Interval[date from end of TotalHip + 300 days, date from end of TotalHip + 425 days]\n  )\n\ndefine &quot;Date VR12 Orthogonal Total Assessment Completed&quot;:\n  from\n    ( ( [ObservationScreeningAssessment: &quot;VR-12 Mental component summary (MCS) score - orthogonal method T-score&quot;] ).isAssessmentPerformed ( ) ) VR12MentalAssessment,\n    ( ( [ObservationScreeningAssessment: &quot;VR-12 Physical component summary (PCS) score - orthogonal method T-score&quot;] ).isAssessmentPerformed ( ) ) VR12PhysicalAssessment\n    let VR12MentalAssessmentDate: date from start of VR12MentalAssessment.effective.toInterval ( ),\n    VR12PhysicalAssessmentDate: date from start of VR12PhysicalAssessment.effective.toInterval ( )\n    where VR12MentalAssessmentDate same day as VR12PhysicalAssessmentDate\n      and ( VR12MentalAssessment as ObservationScreeningAssessment ).value is not null\n      and ( VR12PhysicalAssessment as ObservationScreeningAssessment ).value is not null\n    return Max({ VR12MentalAssessmentDate, VR12PhysicalAssessmentDate })\n    \n/*\n@note: When possible, this function should be migrated to QICoreCommon.\n@description: Returns true if the given Condition has a verification status of &quot;confirmed&quot;, &quot;unconfirmed&quot;, &quot;provisional&quot;, or &quot;differential&quot;\n*/\n\n\ndefine fluent function isVerified(condition Choice&lt;ConditionEncounterDiagnosis, ConditionProblemsHealthConcerns&gt;):\n  condition.verificationStatus is not null implies ( condition.verificationStatus ~ Status.&quot;confirmed&quot;\n      or condition.verificationStatus ~ Status.&quot;unconfirmed&quot;\n      or condition.verificationStatus ~ Status.&quot;provisional&quot;\n      or condition.verificationStatus ~ Status.&quot;differential&quot;\n  )</code></pre>\n      </td>\n    </tr>\n    \n  \n\n\n\n<tr>\n  <th colspan=\"2\" scope=\"row\" class=\"row-header\">Generated using version 0.5.6 of the sample-content-ig Liquid templates</th>\n</tr>\n\n    </tbody>\n  </table>\n</div>"
  },
  "extension" : [
    {
      "url" : "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-softwaresystem",
      "valueReference" : {
        "reference" : "Device/cqf-tooling"
      }
    }
  ],
  "url" : "https://madie.cms.gov/Library/CMS56FHIRFuncStatHipReplacement",
  "version" : "1.1.000",
  "name" : "CMS56FHIRFuncStatHipReplacement",
  "status" : "draft",
  "type" : {
    "coding" : [
      {
        "system" : "http://terminology.hl7.org/CodeSystem/library-type",
        "code" : "logic-library"
      }
    ]
  },
  "date" : "2026-09-19T16:31:14+00:00",
  "content" : [
    {
      "contentType" : "text/cql",
      "data" : "LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVM1NkZISVJGdW5jU3RhdEhpcFJlcGxhY2VtZW50IHZlcnNpb24gJzEuMS4wMDAnCgp1c2luZyBVU1F1YWxpdHlDb3JlIHZlcnNpb24gJzAuMS4wLWNpYnVpbGQnCnVzaW5nIFVTQ29yZSB2ZXJzaW9uICc2LjEuMC1kZXJpdmVkJwp1c2luZyBGSElSIHZlcnNpb24gJzQuMC4xJwoKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkhlbHBlcnMgdmVyc2lvbiAnNC4wLjEnIGNhbGxlZCBGSElSSGVscGVycwppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSQ29tbW9uIHZlcnNpb24gJzIuMC4wJyBjYWxsZWQgRkhJUkNvbW1vbgppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5VU0NvcmVDb21tb24gdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUVsZW1lbnRzIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIFVTQ29yZUVsZW1lbnRzCgppbmNsdWRlIFVTUXVhbGl0eUNvcmVDb21tb24gdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcgY2FsbGVkIFVTUXVhbGl0eUNvcmVDb21tb24KaW5jbHVkZSBTdXBwbGVtZW50YWxEYXRhRWxlbWVudHMgdmVyc2lvbiAnNi4xLjAwMCcgY2FsbGVkIFNERQppbmNsdWRlIFN0YXR1cyB2ZXJzaW9uICcyLjEuMDAwJyBjYWxsZWQgU3RhdHVzCmluY2x1ZGUgSG9zcGljZSB2ZXJzaW9uICc3LjEuMDAwJyBjYWxsZWQgSG9zcGljZQoKY29kZXN5c3RlbSAiTE9JTkMiOiAnaHR0cDovL2xvaW5jLm9yZycKY29kZXN5c3RlbSAiQ1BUIjogJ2h0dHA6Ly93d3cuYW1hLWFzc24ub3JnL2dvL2NwdCcKY29kZXN5c3RlbSAiU05PTUVEQ1QiOiAnaHR0cDovL3Nub21lZC5pbmZvL3NjdCcKCnZhbHVlc2V0ICJMb3dlciBCb2R5IEZyYWN0dXJlcyBFeGNsdWRpbmcgQW5rbGUgYW5kIEZvb3QiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTE3OCcKdmFsdWVzZXQgIk1hbGlnbmFudCBOZW9wbGFzbXMgb2YgTG93ZXIgYW5kIFVuc3BlY2lmaWVkIExpbWJzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjExODAnCnZhbHVlc2V0ICJNZWNoYW5pY2FsIENvbXBsaWNhdGlvbnMgRXhjbHVkaW5nIFVwcGVyIEJvZHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTE4MicKdmFsdWVzZXQgIk9mZmljZSBWaXNpdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDEuMTIuMTAwMScKdmFsdWVzZXQgIlZpcnR1YWwgRW5jb3VudGVyIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDg5Jwp2YWx1ZXNldCAiT3V0cGF0aWVudCBDb25zdWx0YXRpb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwMDgnCnZhbHVlc2V0ICJQYXJ0aWFsIEFydGhyb3BsYXN0eSBvZiBIaXAiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTE4NCcKdmFsdWVzZXQgIlByaW1hcnkgVEhBIFByb2NlZHVyZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xOTguMTIuMTAwNicKdmFsdWVzZXQgIlJlbW92YWwsIFJldmlzaW9uIGFuZCBTdXBwbGVtZW50IFByb2NlZHVyZXMgb2YgdGhlIExvd2VyIEJvZHkgYW5kIFNwaW5lIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjExODknCnZhbHVlc2V0ICJUZWxlcGhvbmUgVmlzaXRzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDgwJwoKY29kZSAiQWN0aXZpdGllcyBvZiBkYWlseSBsaXZpbmcgc2NvcmUgW0hPT1NdIjogJzcyMDk1LTMnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdBY3Rpdml0aWVzIG9mIGRhaWx5IGxpdmluZyBzY29yZSBbSE9PU10nCmNvZGUgIkRlYWQgKGZpbmRpbmcpIjogJzQxOTA5OTAwOScgZnJvbSAiU05PTUVEQ1QiIGRpc3BsYXkgJ0RlYWQgKGZpbmRpbmcpJwpjb2RlICJQYWluIHNjb3JlIFtIT09TXSI6ICc3MjA5Ny05JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnUGFpbiBzY29yZSBbSE9PU10nCmNvZGUgIlBvc3RvcGVyYXRpdmUgZm9sbG93LXVwIHZpc2l0LCBub3JtYWxseSBpbmNsdWRlZCBpbiB0aGUgc3VyZ2ljYWwgcGFja2FnZSwgdG8gaW5kaWNhdGUgdGhhdCBhbiBldmFsdWF0aW9uIGFuZCBtYW5hZ2VtZW50IHNlcnZpY2Ugd2FzIHBlcmZvcm1lZCBkdXJpbmcgYSBwb3N0b3BlcmF0aXZlIHBlcmlvZCBmb3IgYSByZWFzb24ocykgcmVsYXRlZCB0byB0aGUgb3JpZ2luYWwgcHJvY2VkdXJlIjogJzk5MDI0JyBmcm9tICJDUFQiIGRpc3BsYXkgJ1Bvc3RvcGVyYXRpdmUgZm9sbG93LXVwIHZpc2l0LCBub3JtYWxseSBpbmNsdWRlZCBpbiB0aGUgc3VyZ2ljYWwgcGFja2FnZSwgdG8gaW5kaWNhdGUgdGhhdCBhbiBldmFsdWF0aW9uIGFuZCBtYW5hZ2VtZW50IHNlcnZpY2Ugd2FzIHBlcmZvcm1lZCBkdXJpbmcgYSBwb3N0b3BlcmF0aXZlIHBlcmlvZCBmb3IgYSByZWFzb24ocykgcmVsYXRlZCB0byB0aGUgb3JpZ2luYWwgcHJvY2VkdXJlJwpjb2RlICJQUk9NSVMtMTAgR2xvYmFsIE1lbnRhbCBIZWFsdGggKEdNSCkgc2NvcmUgVC1zY29yZSI6ICc3MTk2OS0wJyBmcm9tICJMT0lOQyIgZGlzcGxheSAnUFJPTUlTLTEwIEdsb2JhbCBNZW50YWwgSGVhbHRoIChHTUgpIHNjb3JlIFQtc2NvcmUnCmNvZGUgIlBST01JUy0xMCBHbG9iYWwgUGh5c2ljYWwgSGVhbHRoIChHUEgpIHNjb3JlIFQtc2NvcmUiOiAnNzE5NzEtNicgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1BST01JUy0xMCBHbG9iYWwgUGh5c2ljYWwgSGVhbHRoIChHUEgpIHNjb3JlIFQtc2NvcmUnCmNvZGUgIlF1YWxpdHkgb2YgbGlmZSBzY29yZSBbSE9PU10iOiAnNzIwOTMtOCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1F1YWxpdHkgb2YgbGlmZSBzY29yZSBbSE9PU10nCmNvZGUgIlNldmVyZSBjb2duaXRpdmUgaW1wYWlybWVudCAoZmluZGluZykiOiAnNzAyOTU2MDA0JyBmcm9tICJTTk9NRURDVCIgZGlzcGxheSAnU2V2ZXJlIGNvZ25pdGl2ZSBpbXBhaXJtZW50IChmaW5kaW5nKScKY29kZSAiU3BvcnQtcmVjcmVhdGlvbiBzY29yZSBbSE9PU10iOiAnNzIwOTQtNicgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1Nwb3J0LXJlY3JlYXRpb24gc2NvcmUgW0hPT1NdJwpjb2RlICJTeW1wdG9tcyBzY29yZSBbSE9PU10iOiAnNzIwOTYtMScgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1N5bXB0b21zIHNjb3JlIFtIT09TXScKY29kZSAiVG90YWwgaW50ZXJ2YWwgc2NvcmUgW0hPT1NKUl0iOiAnODIzMjMtNycgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1RvdGFsIGludGVydmFsIHNjb3JlIFtIT09TSlJdJwpjb2RlICJWUi0xMiBNZW50YWwgY29tcG9uZW50IHN1bW1hcnkgKE1DUykgc2NvcmUgLSBvYmxpcXVlIG1ldGhvZCBULXNjb3JlIjogJzcyMDI2LTgnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdWUi0xMiBNZW50YWwgY29tcG9uZW50IHN1bW1hcnkgKE1DUykgc2NvcmUgLSBvYmxpcXVlIG1ldGhvZCBULXNjb3JlJwpjb2RlICJWUi0xMiBNZW50YWwgY29tcG9uZW50IHN1bW1hcnkgKE1DUykgc2NvcmUgLSBvcnRob2dvbmFsIG1ldGhvZCBULXNjb3JlIjogJzcyMDI4LTQnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdWUi0xMiBNZW50YWwgY29tcG9uZW50IHN1bW1hcnkgKE1DUykgc2NvcmUgLSBvcnRob2dvbmFsIG1ldGhvZCBULXNjb3JlJwpjb2RlICJWUi0xMiBQaHlzaWNhbCBjb21wb25lbnQgc3VtbWFyeSAoUENTKSBzY29yZSAtIG9ibGlxdWUgbWV0aG9kIFQtc2NvcmUiOiAnNzIwMjUtMCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1ZSLTEyIFBoeXNpY2FsIGNvbXBvbmVudCBzdW1tYXJ5IChQQ1MpIHNjb3JlIC0gb2JsaXF1ZSBtZXRob2QgVC1zY29yZScKY29kZSAiVlItMTIgUGh5c2ljYWwgY29tcG9uZW50IHN1bW1hcnkgKFBDUykgc2NvcmUgLSBvcnRob2dvbmFsIG1ldGhvZCBULXNjb3JlIjogJzcyMDI3LTYnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdWUi0xMiBQaHlzaWNhbCBjb21wb25lbnQgc3VtbWFyeSAoUENTKSBzY29yZSAtIG9ydGhvZ29uYWwgbWV0aG9kIFQtc2NvcmUnCgpwYXJhbWV0ZXIgIk1lYXN1cmVtZW50IFBlcmlvZCIgSW50ZXJ2YWw8RGF0ZVRpbWU+CiAgZGVmYXVsdCBJbnRlcnZhbFtAMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaLCBAMjAyNy0wMS0wMVQwMDowMDowMC4wMDBaKQoKY29udGV4dCBQYXRpZW50CgpkZWZpbmUgIlNERSBFdGhuaWNpdHkiOgogIFNERS4iU0RFIEV0aG5pY2l0eSIKCmRlZmluZSAiU0RFIFBheWVyIjoKICBTREUuIlNERSBQYXllciIKCmRlZmluZSAiU0RFIFJhY2UiOgogIFNERS4iU0RFIFJhY2UiCgpkZWZpbmUgIlNERSBTZXgiOgogIFNERS4iU0RFIFNleCIKCmRlZmluZSAiSW5pdGlhbCBQb3B1bGF0aW9uIjoKICAiSGFzIFF1YWxpZnlpbmcgRW5jb3VudGVyIgogICAgYW5kIGV4aXN0cyAoICJUb3RhbCBIaXAgQXJ0aHJvcGxhc3R5IFByb2NlZHVyZSIgKQogICAgYW5kIEFnZUluWWVhcnNBdChkYXRlIGZyb20gc3RhcnQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpID49IDE5CgpkZWZpbmUgIkhhcyBRdWFsaWZ5aW5nIEVuY291bnRlciI6CiAgZXhpc3RzICggKCAoIFtFbmNvdW50ZXI6ICJPdXRwYXRpZW50IENvbnN1bHRhdGlvbiJdCiAgICAgICAgdW5pb24gW0VuY291bnRlcjogIk9mZmljZSBWaXNpdCJdCiAgICAgICAgdW5pb24gKCBbRW5jb3VudGVyXSBFCiAgICAgICAgICAgIHdoZXJlIGV4aXN0cyAoICggRS50eXBlICkgVAogICAgICAgICAgICAgICAgd2hlcmUgVCB+ICJQb3N0b3BlcmF0aXZlIGZvbGxvdy11cCB2aXNpdCwgbm9ybWFsbHkgaW5jbHVkZWQgaW4gdGhlIHN1cmdpY2FsIHBhY2thZ2UsIHRvIGluZGljYXRlIHRoYXQgYW4gZXZhbHVhdGlvbiBhbmQgbWFuYWdlbWVudCBzZXJ2aWNlIHdhcyBwZXJmb3JtZWQgZHVyaW5nIGEgcG9zdG9wZXJhdGl2ZSBwZXJpb2QgZm9yIGEgcmVhc29uKHMpIHJlbGF0ZWQgdG8gdGhlIG9yaWdpbmFsIHByb2NlZHVyZSIKICAgICAgICAgICAgKQogICAgICAgICkKICAgICAgICB1bmlvbiBbRW5jb3VudGVyOiAiVGVsZXBob25lIFZpc2l0cyJdCiAgICAgICAgdW5pb24gW0VuY291bnRlcjogIlZpcnR1YWwgRW5jb3VudGVyIl0KICAgICkuaXNFbmNvdW50ZXJQZXJmb3JtZWQgKCApICkgVmFsaWRFbmNvdW50ZXJzCiAgICAgIHdoZXJlIFZhbGlkRW5jb3VudGVycy5wZXJpb2QgZHVyaW5nIGRheSBvZiBJbnRlcnZhbFsiQXVndXN0IDEgWWVhciBQcmlvciB0byB0aGUgTWVhc3VyZW1lbnQgUGVyaW9kIiwgZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiXQogICkKCmRlZmluZSAiQXVndXN0IDEgWWVhciBQcmlvciB0byB0aGUgTWVhc3VyZW1lbnQgUGVyaW9kIjoKICBEYXRlVGltZSgoeWVhciBmcm9tIHN0YXJ0IG9mICJNZWFzdXJlbWVudCBQZXJpb2QiIC0gMSksIDgsIDEsIDAsIDAsIDAsIDAsIDApCgpkZWZpbmUgIlRvdGFsIEhpcCBBcnRocm9wbGFzdHkgUHJvY2VkdXJlIjoKICAoICggW1Byb2NlZHVyZTogIlByaW1hcnkgVEhBIFByb2NlZHVyZSJdICkuaXNQcm9jZWR1cmVQZXJmb3JtZWQgKCApICkgVEhBUHJvY2VkdXJlCiAgICB3aGVyZSBUSEFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgZGF5IG9mIEludGVydmFsWyJOb3ZlbWJlciAxIFR3byBZZWFycyBQcmlvciB0byB0aGUgTWVhc3VyZW1lbnQgUGVyaW9kIiwgIk9jdG9iZXIgMzEgWWVhciBQcmlvciB0byB0aGUgTWVhc3VyZW1lbnQgUGVyaW9kIl0KCmRlZmluZSAiTm92ZW1iZXIgMSBUd28gWWVhcnMgUHJpb3IgdG8gdGhlIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgRGF0ZVRpbWUoKHllYXIgZnJvbSBzdGFydCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIiAtIDIpLCAxMSwgMSwgMCwgMCwgMCwgMCwgMCkKCmRlZmluZSAiT2N0b2JlciAzMSBZZWFyIFByaW9yIHRvIHRoZSBNZWFzdXJlbWVudCBQZXJpb2QiOgogIERhdGVUaW1lKCh5ZWFyIGZyb20gc3RhcnQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIgLSAxKSwgMTAsIDMxLCAyMywgNTksIDU5LCA5OTksIDApCgpkZWZpbmUgIkRlbm9taW5hdG9yIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIgoKZGVmaW5lICJEZW5vbWluYXRvciBFeGNsdXNpb25zIjoKICBIb3NwaWNlLiJIYXMgSG9zcGljZSBTZXJ2aWNlcyIKICAgIG9yICJIYXMgU2V2ZXJlIENvZ25pdGl2ZSBJbXBhaXJtZW50IgogICAgb3IgIkhhcyBUb3RhbCBIaXAgQXJ0aHJvcGxhc3R5IHdpdGggMSBvciBNb3JlIExvd2VyIEJvZHkgRnJhY3R1cmVzIgogICAgb3IgIkhhcyBQYXJ0aWFsIEhpcCBBcnRocm9wbGFzdHkgUHJvY2VkdXJlIgogICAgb3IgIkhhcyBSZXZpc2lvbiBIaXAgQXJ0aHJvcGxhc3R5IFByb2NlZHVyZSBvciBJbXBsYW50ZWQgRGV2aWNlIG9yIFByb3N0aGVzaXMgUmVtb3ZhbCBQcm9jZWR1cmUiCiAgICBvciAiSGFzIE1hbGlnbmFudCBOZW9wbGFzbSBvZiBMb3dlciBhbmQgVW5zcGVjaWZpZWQgTGltYnMiCiAgICBvciAiSGFzIE1lY2hhbmljYWwgQ29tcGxpY2F0aW9uIgogICAgb3IgIkhhcyBNb3JlIFRoYW4gT25lIEVsZWN0aXZlIFByaW1hcnkgVG90YWwgSGlwIEFydGhyb3BsYXN0eSBQZXJmb3JtZWQiCiAgICBvciAiRGVhdGggV2l0aGluIDMwMCBEYXlzIG9mIHRoZSBUSEEgUHJvY2VkdXJlIgoKZGVmaW5lICJIYXMgU2V2ZXJlIENvZ25pdGl2ZSBJbXBhaXJtZW50IjoKICAvLyBbRS0xM10gYmFzZSBGSElSLkNvbmRpdGlvbiByZXRyaWV2ZSAoZGVmZWN0LXRyYWNraW5nL2VuZ2luZS1pc3N1ZXMubWQgRS0xMykKICAvLyBPcmlnaW5hbDoKICAvLyAgIGV4aXN0cyAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiU2V2ZXJlIGNvZ25pdGl2ZSBpbXBhaXJtZW50IChmaW5kaW5nKSJdCiAgLy8gICAgIHVuaW9uIFtDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXM6ICJTZXZlcmUgY29nbml0aXZlIGltcGFpcm1lbnQgKGZpbmRpbmcpIl0gKSBEZW1lbnRpYQogIC8vICAgICB3aGVyZSBEZW1lbnRpYS5wcmV2YWxlbmNlSW50ZXJ2YWwgKCApIG92ZXJsYXBzIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogIGV4aXN0cyAoIFtGSElSLkNvbmRpdGlvbjogIlNldmVyZSBjb2duaXRpdmUgaW1wYWlybWVudCAoZmluZGluZykiXSApIERlbWVudGlhCiAgICB3aGVyZSBEZW1lbnRpYS5wcmV2YWxlbmNlSW50ZXJ2YWwgKCApIG92ZXJsYXBzIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgoKZGVmaW5lICJIYXMgVG90YWwgSGlwIEFydGhyb3BsYXN0eSB3aXRoIDEgb3IgTW9yZSBMb3dlciBCb2R5IEZyYWN0dXJlcyI6CiAgZXhpc3RzICggIlRvdGFsIEhpcCBBcnRocm9wbGFzdHkgUHJvY2VkdXJlIiBUSEFQcm9jZWR1cmUKICAgICAgd2l0aCAoIC8vIFtFLTEzXSBiYXNlIEZISVIuQ29uZGl0aW9uIHJldHJpZXZlIChkZWZlY3QtdHJhY2tpbmcvZW5naW5lLWlzc3Vlcy5tZCBFLTEzKQogICAgICAgIC8vIE9yaWdpbmFsOgogICAgICAgIC8vICAgKCBbQ29uZGl0aW9uRW5jb3VudGVyRGlhZ25vc2lzOiAiTG93ZXIgQm9keSBGcmFjdHVyZXMgRXhjbHVkaW5nIEFua2xlIGFuZCBGb290Il0KICAgICAgICAvLyAgICAgdW5pb24gW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM6ICJMb3dlciBCb2R5IEZyYWN0dXJlcyBFeGNsdWRpbmcgQW5rbGUgYW5kIEZvb3QiXSApCiAgICAgICAgW0ZISVIuQ29uZGl0aW9uOiAiTG93ZXIgQm9keSBGcmFjdHVyZXMgRXhjbHVkaW5nIEFua2xlIGFuZCBGb290Il0gKSBMb3dlckJvZHlGcmFjdHVyZQogICAgICAgIHN1Y2ggdGhhdCBMb3dlckJvZHlGcmFjdHVyZS5wcmV2YWxlbmNlSW50ZXJ2YWwgKCApIHN0YXJ0cyA0OCBob3VycyBvciBsZXNzIG9uIG9yIGJlZm9yZSBzdGFydCBvZiBUSEFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApCiAgICAgICAgICBhbmQgTG93ZXJCb2R5RnJhY3R1cmUuaXNWZXJpZmllZCAoICkKICApCgpkZWZpbmUgIkhhcyBQYXJ0aWFsIEhpcCBBcnRocm9wbGFzdHkgUHJvY2VkdXJlIjoKICBleGlzdHMgKCAoICggW1Byb2NlZHVyZTogIlBhcnRpYWwgQXJ0aHJvcGxhc3R5IG9mIEhpcCJdICkuaXNQcm9jZWR1cmVQZXJmb3JtZWQgKCApICkgUGFydGlhbFRIQVByb2NlZHVyZQogICAgICB3aXRoICJUb3RhbCBIaXAgQXJ0aHJvcGxhc3R5IFByb2NlZHVyZSIgVEhBUHJvY2VkdXJlCiAgICAgICAgc3VjaCB0aGF0IFBhcnRpYWxUSEFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGR1cmluZyBkYXkgb2YgVEhBUHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKQogICkKCmRlZmluZSAiSGFzIFJldmlzaW9uIEhpcCBBcnRocm9wbGFzdHkgUHJvY2VkdXJlIG9yIEltcGxhbnRlZCBEZXZpY2Ugb3IgUHJvc3RoZXNpcyBSZW1vdmFsIFByb2NlZHVyZSI6CiAgZXhpc3RzICggIlRvdGFsIEhpcCBBcnRocm9wbGFzdHkgUHJvY2VkdXJlIiBUSEFQcm9jZWR1cmUKICAgICAgd2l0aCAoICggW1Byb2NlZHVyZTogIlJlbW92YWwsIFJldmlzaW9uIGFuZCBTdXBwbGVtZW50IFByb2NlZHVyZXMgb2YgdGhlIExvd2VyIEJvZHkgYW5kIFNwaW5lIl0gKS5pc1Byb2NlZHVyZVBlcmZvcm1lZCAoICkgKSBSZXZpc2lvblRIQVByb2NlZHVyZQogICAgICAgIHN1Y2ggdGhhdCBSZXZpc2lvblRIQVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgZHVyaW5nIGRheSBvZiBUSEFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApCiAgKQoKZGVmaW5lICJIYXMgTWFsaWduYW50IE5lb3BsYXNtIG9mIExvd2VyIGFuZCBVbnNwZWNpZmllZCBMaW1icyI6CiAgLy8gW0UtMTNdIGJhc2UgRkhJUi5Db25kaXRpb24gcmV0cmlldmUgKGRlZmVjdC10cmFja2luZy9lbmdpbmUtaXNzdWVzLm1kIEUtMTMpCiAgLy8gT3JpZ2luYWw6CiAgLy8gICBleGlzdHMgKCAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiTWFsaWduYW50IE5lb3BsYXNtcyBvZiBMb3dlciBhbmQgVW5zcGVjaWZpZWQgTGltYnMiXQogIC8vICAgICAgIHVuaW9uIFtDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXM6ICJNYWxpZ25hbnQgTmVvcGxhc21zIG9mIExvd2VyIGFuZCBVbnNwZWNpZmllZCBMaW1icyJdICkgTWFsaWduYW50TmVvcGxhc20KICBleGlzdHMgKCAoIFtGSElSLkNvbmRpdGlvbjogIk1hbGlnbmFudCBOZW9wbGFzbXMgb2YgTG93ZXIgYW5kIFVuc3BlY2lmaWVkIExpbWJzIl0gKSBNYWxpZ25hbnROZW9wbGFzbQogICAgICB3aXRoICJUb3RhbCBIaXAgQXJ0aHJvcGxhc3R5IFByb2NlZHVyZSIgVEhBUHJvY2VkdXJlCiAgICAgICAgc3VjaCB0aGF0IE1hbGlnbmFudE5lb3BsYXNtLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgb3ZlcmxhcHMgZGF5IG9mIFRIQVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkKICAgICAgICAgIGFuZCBNYWxpZ25hbnROZW9wbGFzbS5pc1ZlcmlmaWVkICggKQogICkKCmRlZmluZSAiSGFzIE1lY2hhbmljYWwgQ29tcGxpY2F0aW9uIjoKICAvLyBbRS0xM10gYmFzZSBGSElSLkNvbmRpdGlvbiByZXRyaWV2ZSAoZGVmZWN0LXRyYWNraW5nL2VuZ2luZS1pc3N1ZXMubWQgRS0xMykKICAvLyBPcmlnaW5hbDoKICAvLyAgIGV4aXN0cyAoICggW0NvbmRpdGlvbkVuY291bnRlckRpYWdub3NpczogIk1lY2hhbmljYWwgQ29tcGxpY2F0aW9ucyBFeGNsdWRpbmcgVXBwZXIgQm9keSJdCiAgLy8gICAgICAgdW5pb24gW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM6ICJNZWNoYW5pY2FsIENvbXBsaWNhdGlvbnMgRXhjbHVkaW5nIFVwcGVyIEJvZHkiXSApIE1lY2hhbmljYWxDb21wbGljYXRpb25zCiAgZXhpc3RzICggKCBbRkhJUi5Db25kaXRpb246ICJNZWNoYW5pY2FsIENvbXBsaWNhdGlvbnMgRXhjbHVkaW5nIFVwcGVyIEJvZHkiXSApIE1lY2hhbmljYWxDb21wbGljYXRpb25zCiAgICAgIHdpdGggIlRvdGFsIEhpcCBBcnRocm9wbGFzdHkgUHJvY2VkdXJlIiBUSEFQcm9jZWR1cmUKICAgICAgICBzdWNoIHRoYXQgTWVjaGFuaWNhbENvbXBsaWNhdGlvbnMucHJldmFsZW5jZUludGVydmFsICggKSBvdmVybGFwcyBkYXkgb2YgVEhBUHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKQogICAgICAgICAgYW5kIE1lY2hhbmljYWxDb21wbGljYXRpb25zLmlzVmVyaWZpZWQgKCApCiAgKQoKZGVmaW5lICJIYXMgTW9yZSBUaGFuIE9uZSBFbGVjdGl2ZSBQcmltYXJ5IFRvdGFsIEhpcCBBcnRocm9wbGFzdHkgUGVyZm9ybWVkIjoKICBleGlzdHMgKCAiVG90YWwgSGlwIEFydGhyb3BsYXN0eSBQcm9jZWR1cmUiIFRIQVByb2NlZHVyZQogICAgICB3aXRoICggKCBbUHJvY2VkdXJlOiAiUHJpbWFyeSBUSEEgUHJvY2VkdXJlIl0gKS5pc1Byb2NlZHVyZVBlcmZvcm1lZCAoICkgKSBFbGVjdGl2ZVRIQVByb2NlZHVyZQogICAgICAgIHN1Y2ggdGhhdCBUSEFQcm9jZWR1cmUuaWQgIX4gRWxlY3RpdmVUSEFQcm9jZWR1cmUuaWQKICAgICAgICAgIGFuZCBzdGFydCBvZiBFbGVjdGl2ZVRIQVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgZHVyaW5nIGRheSBvZiBJbnRlcnZhbFsoIHN0YXJ0IG9mIFRIQVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKSAtIDEgeWVhciwgKCBzdGFydCBvZiBUSEFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApICkgKyAxIHllYXJdCiAgKQoKZGVmaW5lICJEZWF0aCBXaXRoaW4gMzAwIERheXMgb2YgdGhlIFRIQSBQcm9jZWR1cmUiOgogIGV4aXN0cyAiVG90YWwgSGlwIEFydGhyb3BsYXN0eSBQcm9jZWR1cmUiIFRIQVByb2NlZHVyZQogICAgd2hlcmUgZGF0ZSBmcm9tIFBhdGllbnQuZGVjZWFzZWQgZHVyaW5nIGRheSBvZiBJbnRlcnZhbFtkYXRlIGZyb20gc3RhcnQgb2YgVEhBUHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKSwgZGF0ZSBmcm9tIHN0YXJ0IG9mIFRIQVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKyAzMDAgZGF5c10KCmRlZmluZSAiTnVtZXJhdG9yIjoKICAoICJIYXMgVEhBIHdpdGggSW5pdGlhbCBhbmQgRm9sbG93IFVwIEhPT1MgQXNzZXNzbWVudHMiICkKICAgIG9yICggIkhhcyBUSEEgd2l0aCBJbml0aWFsIGFuZCBGb2xsb3cgVXAgSE9PU0pyIEFzc2Vzc21lbnRzIiApCiAgICBvciAoICJIYXMgVEhBIHdpdGggSW5pdGlhbCBhbmQgRm9sbG93IFVwIFBST01JUzEwIEFzc2Vzc21lbnRzIiApCiAgICBvciAoICJIYXMgVEhBIHdpdGggSW5pdGlhbCBhbmQgRm9sbG93IFVwIFZSMTIgT2JsaXF1ZSBBc3Nlc3NtZW50cyIgKQogICAgb3IgKCAiSGFzIFRIQSB3aXRoIEluaXRpYWwgYW5kIEZvbGxvdyBVcCBWUjEyIE9ydGhvZ29uYWwgQXNzZXNzbWVudHMiICkKCmRlZmluZSAiSGFzIFRIQSB3aXRoIEluaXRpYWwgYW5kIEZvbGxvdyBVcCBIT09TIEFzc2Vzc21lbnRzIjoKICBleGlzdHMgKCAoICJUb3RhbCBIaXAgQXJ0aHJvcGxhc3R5IFByb2NlZHVyZSIgVEhBUHJvY2VkdXJlCiAgICAgIHJldHVybiBUSEFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApICkgVG90YWxIaXAKICAgICAgd2l0aCAiRGF0ZSBIT09TIFRvdGFsIEFzc2Vzc21lbnQgQ29tcGxldGVkIiBJbml0aWFsSGlwQXNzZXNzbWVudEhPT1MKICAgICAgICBzdWNoIHRoYXQgVG90YWxIaXAgc3RhcnRzIDkwIGRheXMgb3IgbGVzcyBvbiBvciBhZnRlciBkYXkgb2YgSW5pdGlhbEhpcEFzc2Vzc21lbnRIT09TCiAgICAgIHdpdGggIkRhdGUgSE9PUyBUb3RhbCBBc3Nlc3NtZW50IENvbXBsZXRlZCIgRm9sbG93VXBIaXBBc3Nlc3NtZW50SE9PUwogICAgICAgIHN1Y2ggdGhhdCBkYXRlIGZyb20gRm9sbG93VXBIaXBBc3Nlc3NtZW50SE9PUyBkdXJpbmcgZGF5IG9mIEludGVydmFsW2RhdGUgZnJvbSBlbmQgb2YgVG90YWxIaXAgKyAzMDAgZGF5cywgZGF0ZSBmcm9tIGVuZCBvZiBUb3RhbEhpcCArIDQyNSBkYXlzXQogICkKCmRlZmluZSAiRGF0ZSBIT09TIFRvdGFsIEFzc2Vzc21lbnQgQ29tcGxldGVkIjoKICBmcm9tCiAgICAoICggW09ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIlF1YWxpdHkgb2YgbGlmZSBzY29yZSBbSE9PU10iXSApLmlzQXNzZXNzbWVudFBlcmZvcm1lZCAoICkgKSBIT09TTGlmZVF1YWxpdHksCiAgICAoICggW09ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIlNwb3J0LXJlY3JlYXRpb24gc2NvcmUgW0hPT1NdIl0gKS5pc0Fzc2Vzc21lbnRQZXJmb3JtZWQgKCApICkgSE9PU1Nwb3J0LAogICAgKCAoIFtPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJBY3Rpdml0aWVzIG9mIGRhaWx5IGxpdmluZyBzY29yZSBbSE9PU10iXSApLmlzQXNzZXNzbWVudFBlcmZvcm1lZCAoICkgKSBIT09TQWN0aXZpdHlTY29yZSwKICAgICggKCBbT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiU3ltcHRvbXMgc2NvcmUgW0hPT1NdIl0gKS5pc0Fzc2Vzc21lbnRQZXJmb3JtZWQgKCApICkgSE9PU1N5bXB0b21zLAogICAgKCAoIFtPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJQYWluIHNjb3JlIFtIT09TXSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIEhPT1NQYWluCiAgICBsZXQgSE9PU0xpZmVRdWFsaXR5RGF0ZTogZGF0ZSBmcm9tIHN0YXJ0IG9mIEhPT1NMaWZlUXVhbGl0eS5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICksCiAgICBIT09TU3BvcnREYXRlOiBkYXRlIGZyb20gc3RhcnQgb2YgSE9PU1Nwb3J0LmVmZmVjdGl2ZS50b0ludGVydmFsICggKSwKICAgIEhPT1NBY3Rpdml0eVNjb3JlRGF0ZTogZGF0ZSBmcm9tIHN0YXJ0IG9mIEhPT1NBY3Rpdml0eVNjb3JlLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSwKICAgIEhPT1NTeW1wdG9tc0RhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBIT09TU3ltcHRvbXMuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApLAogICAgSE9PU1BhaW5EYXRlOiBkYXRlIGZyb20gc3RhcnQgb2YgSE9PU1BhaW4uZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApCiAgICB3aGVyZSBIT09TTGlmZVF1YWxpdHlEYXRlIHNhbWUgZGF5IGFzIEhPT1NTcG9ydERhdGUKICAgICAgYW5kICggSE9PU1Nwb3J0IGFzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCApLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgIGFuZCBIT09TTGlmZVF1YWxpdHlEYXRlIHNhbWUgZGF5IGFzIEhPT1NBY3Rpdml0eVNjb3JlRGF0ZQogICAgICBhbmQgKCBIT09TQWN0aXZpdHlTY29yZSBhcyBPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQgKS52YWx1ZSBpcyBub3QgbnVsbAogICAgICBhbmQgSE9PU0xpZmVRdWFsaXR5RGF0ZSBzYW1lIGRheSBhcyBIT09TU3ltcHRvbXNEYXRlCiAgICAgIGFuZCAoIEhPT1NTeW1wdG9tcyBhcyBPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQgKS52YWx1ZSBpcyBub3QgbnVsbAogICAgICBhbmQgSE9PU0xpZmVRdWFsaXR5RGF0ZSBzYW1lIGRheSBhcyBIT09TUGFpbkRhdGUKICAgICAgYW5kICggSE9PU1BhaW4gYXMgT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50ICkudmFsdWUgaXMgbm90IG51bGwKICAgICAgYW5kICggSE9PU0xpZmVRdWFsaXR5IGFzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCApLnZhbHVlIGlzIG5vdCBudWxsCiAgICByZXR1cm4gTWF4KHsgSE9PU0xpZmVRdWFsaXR5RGF0ZSwgSE9PU1Nwb3J0RGF0ZSwgSE9PU0FjdGl2aXR5U2NvcmVEYXRlLCBIT09TU3ltcHRvbXNEYXRlLCBIT09TUGFpbkRhdGUgfSkKCmRlZmluZSAiSGFzIFRIQSB3aXRoIEluaXRpYWwgYW5kIEZvbGxvdyBVcCBIT09TSnIgQXNzZXNzbWVudHMiOgogIGV4aXN0cyAoICggIlRvdGFsIEhpcCBBcnRocm9wbGFzdHkgUHJvY2VkdXJlIiBUSEFQcm9jZWR1cmUKICAgICAgcmV0dXJuIFRIQVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKSBUb3RhbEhpcAogICAgICB3aXRoICJEYXRlIEhPT1NKciBUb3RhbCBBc3Nlc3NtZW50IENvbXBsZXRlZCIgSW5pdGlhbEhpcEFzc2Vzc21lbnQKICAgICAgICBzdWNoIHRoYXQgVG90YWxIaXAgc3RhcnRzIDkwIGRheXMgb3IgbGVzcyBvbiBvciBhZnRlciBkYXkgb2YgSW5pdGlhbEhpcEFzc2Vzc21lbnQKICAgICAgd2l0aCAiRGF0ZSBIT09TSnIgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiIEZvbGxvd1VwSGlwQXNzZXNzbWVudAogICAgICAgIHN1Y2ggdGhhdCBkYXRlIGZyb20gRm9sbG93VXBIaXBBc3Nlc3NtZW50IGR1cmluZyBkYXkgb2YgSW50ZXJ2YWxbZGF0ZSBmcm9tIGVuZCBvZiBUb3RhbEhpcCArIDMwMCBkYXlzLCBkYXRlIGZyb20gZW5kIG9mIFRvdGFsSGlwICsgNDI1IGRheXNdCiAgKQoKZGVmaW5lICJEYXRlIEhPT1NKciBUb3RhbCBBc3Nlc3NtZW50IENvbXBsZXRlZCI6CiAgKCAoICggW09ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIlRvdGFsIGludGVydmFsIHNjb3JlIFtIT09TSlJdIl0gKS5pc0Fzc2Vzc21lbnRQZXJmb3JtZWQgKCApICkgSE9PU0pyCiAgICB3aGVyZSAoIEhPT1NKciBhcyBPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQgKS52YWx1ZSBpcyBub3QgbnVsbCApIERvY3VtZW50ZWRIT09TSnIKICAgIHJldHVybiBkYXRlIGZyb20gc3RhcnQgb2YgRG9jdW1lbnRlZEhPT1NKci5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkKCmRlZmluZSAiSGFzIFRIQSB3aXRoIEluaXRpYWwgYW5kIEZvbGxvdyBVcCBQUk9NSVMxMCBBc3Nlc3NtZW50cyI6CiAgZXhpc3RzICggKCAiVG90YWwgSGlwIEFydGhyb3BsYXN0eSBQcm9jZWR1cmUiIFRIQVByb2NlZHVyZQogICAgICByZXR1cm4gVEhBUHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKSApIFRvdGFsSGlwCiAgICAgIHdpdGggIkRhdGUgUFJPTUlTMTAgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiIEluaXRpYWxIaXBBc3Nlc3NtZW50UFJPTUlTMTAKICAgICAgICBzdWNoIHRoYXQgVG90YWxIaXAgc3RhcnRzIDkwIGRheXMgb3IgbGVzcyBvbiBvciBhZnRlciBkYXkgb2YgSW5pdGlhbEhpcEFzc2Vzc21lbnRQUk9NSVMxMAogICAgICB3aXRoICJEYXRlIFBST01JUzEwIFRvdGFsIEFzc2Vzc21lbnQgQ29tcGxldGVkIiBGb2xsb3dVcEhpcEFzc2Vzc21lbnRQUk9NSVMxMAogICAgICAgIHN1Y2ggdGhhdCBkYXRlIGZyb20gRm9sbG93VXBIaXBBc3Nlc3NtZW50UFJPTUlTMTAgZHVyaW5nIGRheSBvZiBJbnRlcnZhbFtkYXRlIGZyb20gZW5kIG9mIFRvdGFsSGlwICsgMzAwIGRheXMsIGRhdGUgZnJvbSBlbmQgb2YgVG90YWxIaXAgKyA0MjUgZGF5c10KICApCgpkZWZpbmUgIkRhdGUgUFJPTUlTMTAgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiOgogIGZyb20KICAgICggKCBbT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiUFJPTUlTLTEwIEdsb2JhbCBNZW50YWwgSGVhbHRoIChHTUgpIHNjb3JlIFQtc2NvcmUiXSApLmlzQXNzZXNzbWVudFBlcmZvcm1lZCAoICkgKSBQUk9NSVMxME1lbnRhbFNjb3JlLAogICAgKCAoIFtPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJQUk9NSVMtMTAgR2xvYmFsIFBoeXNpY2FsIEhlYWx0aCAoR1BIKSBzY29yZSBULXNjb3JlIl0gKS5pc0Fzc2Vzc21lbnRQZXJmb3JtZWQgKCApICkgUFJPTUlTMTBQaHlzaWNhbFNjb3JlCiAgICBsZXQgUFJPTUlTMTBNZW50YWxTY29yZURhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBQUk9NSVMxME1lbnRhbFNjb3JlLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSwKICAgIFBST01JUzEwUGh5c2ljYWxTY29yZURhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBQUk9NSVMxMFBoeXNpY2FsU2NvcmUuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApCiAgICB3aGVyZSBQUk9NSVMxME1lbnRhbFNjb3JlRGF0ZSBzYW1lIGRheSBhcyBQUk9NSVMxMFBoeXNpY2FsU2NvcmVEYXRlCiAgICAgIGFuZCAoIFBST01JUzEwUGh5c2ljYWxTY29yZSBhcyBPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQgKS52YWx1ZSBpcyBub3QgbnVsbAogICAgICBhbmQgKCBQUk9NSVMxME1lbnRhbFNjb3JlIGFzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCApLnZhbHVlIGlzIG5vdCBudWxsCiAgICByZXR1cm4gTWF4KHsgUFJPTUlTMTBNZW50YWxTY29yZURhdGUsIFBST01JUzEwUGh5c2ljYWxTY29yZURhdGUgfSkKCmRlZmluZSAiSGFzIFRIQSB3aXRoIEluaXRpYWwgYW5kIEZvbGxvdyBVcCBWUjEyIE9ibGlxdWUgQXNzZXNzbWVudHMiOgogIGV4aXN0cyAoICggIlRvdGFsIEhpcCBBcnRocm9wbGFzdHkgUHJvY2VkdXJlIiBUSEFQcm9jZWR1cmUKICAgICAgcmV0dXJuIFRIQVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKSBUb3RhbEhpcAogICAgICB3aXRoICJEYXRlIFZSMTIgT2JsaXF1ZSBUb3RhbCBBc3Nlc3NtZW50IENvbXBsZXRlZCIgSW5pdGlhbEhpcEFzc2Vzc21lbnRPYmxpcXVlCiAgICAgICAgc3VjaCB0aGF0IFRvdGFsSGlwIHN0YXJ0cyA5MCBkYXlzIG9yIGxlc3Mgb24gb3IgYWZ0ZXIgZGF5IG9mIEluaXRpYWxIaXBBc3Nlc3NtZW50T2JsaXF1ZQogICAgICB3aXRoICJEYXRlIFZSMTIgT2JsaXF1ZSBUb3RhbCBBc3Nlc3NtZW50IENvbXBsZXRlZCIgRm9sbG93VXBIaXBBc3Nlc3NtZW50T2JsaXF1ZQogICAgICAgIHN1Y2ggdGhhdCBkYXRlIGZyb20gRm9sbG93VXBIaXBBc3Nlc3NtZW50T2JsaXF1ZSBkdXJpbmcgZGF5IG9mIEludGVydmFsW2RhdGUgZnJvbSBlbmQgb2YgVG90YWxIaXAgKyAzMDAgZGF5cywgZGF0ZSBmcm9tIGVuZCBvZiBUb3RhbEhpcCArIDQyNSBkYXlzXQogICkKCmRlZmluZSAiRGF0ZSBWUjEyIE9ibGlxdWUgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiOgogIGZyb20KICAgICggKCBbT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiVlItMTIgTWVudGFsIGNvbXBvbmVudCBzdW1tYXJ5IChNQ1MpIHNjb3JlIC0gb2JsaXF1ZSBtZXRob2QgVC1zY29yZSJdICkuaXNBc3Nlc3NtZW50UGVyZm9ybWVkICggKSApIFZSMTJNZW50YWxBc3Nlc3NtZW50LAogICAgKCAoIFtPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJWUi0xMiBQaHlzaWNhbCBjb21wb25lbnQgc3VtbWFyeSAoUENTKSBzY29yZSAtIG9ibGlxdWUgbWV0aG9kIFQtc2NvcmUiXSApLmlzQXNzZXNzbWVudFBlcmZvcm1lZCAoICkgKSBWUjEyUGh5c2ljYWxBc3Nlc3NtZW50CiAgICBsZXQgVlIxMk1lbnRhbEFzc2Vzc21lbnREYXRlOiBkYXRlIGZyb20gc3RhcnQgb2YgVlIxMk1lbnRhbEFzc2Vzc21lbnQuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApLAogICAgVlIxMlBoeXNpY2FsQXNzZXNzbWVudERhdGU6IGRhdGUgZnJvbSBzdGFydCBvZiBWUjEyUGh5c2ljYWxBc3Nlc3NtZW50LmVmZmVjdGl2ZS50b0ludGVydmFsICggKQogICAgd2hlcmUgVlIxMk1lbnRhbEFzc2Vzc21lbnREYXRlIHNhbWUgZGF5IGFzIFZSMTJQaHlzaWNhbEFzc2Vzc21lbnREYXRlCiAgICAgIGFuZCAoIFZSMTJNZW50YWxBc3Nlc3NtZW50IGFzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCApLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgIGFuZCAoIFZSMTJQaHlzaWNhbEFzc2Vzc21lbnQgYXMgT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50ICkudmFsdWUgaXMgbm90IG51bGwKICAgIHJldHVybiBNYXgoeyBWUjEyTWVudGFsQXNzZXNzbWVudERhdGUsIFZSMTJQaHlzaWNhbEFzc2Vzc21lbnREYXRlIH0pCgpkZWZpbmUgIkhhcyBUSEEgd2l0aCBJbml0aWFsIGFuZCBGb2xsb3cgVXAgVlIxMiBPcnRob2dvbmFsIEFzc2Vzc21lbnRzIjoKICBleGlzdHMgKCAoICJUb3RhbCBIaXAgQXJ0aHJvcGxhc3R5IFByb2NlZHVyZSIgVEhBUHJvY2VkdXJlCiAgICAgIHJldHVybiBUSEFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApICkgVG90YWxIaXAKICAgICAgd2l0aCAiRGF0ZSBWUjEyIE9ydGhvZ29uYWwgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiIEluaXRpYWxIaXBBc3Nlc3NtZW50T3J0aG9nb25hbAogICAgICAgIHN1Y2ggdGhhdCBUb3RhbEhpcCBzdGFydHMgOTAgZGF5cyBvciBsZXNzIG9uIG9yIGFmdGVyIGRheSBvZiBJbml0aWFsSGlwQXNzZXNzbWVudE9ydGhvZ29uYWwKICAgICAgd2l0aCAiRGF0ZSBWUjEyIE9ydGhvZ29uYWwgVG90YWwgQXNzZXNzbWVudCBDb21wbGV0ZWQiIEZvbGxvd1VwSGlwQXNzZXNzbWVudE9ydGhvZ29uYWwKICAgICAgICBzdWNoIHRoYXQgZGF0ZSBmcm9tIEZvbGxvd1VwSGlwQXNzZXNzbWVudE9ydGhvZ29uYWwgZHVyaW5nIGRheSBvZiBJbnRlcnZhbFtkYXRlIGZyb20gZW5kIG9mIFRvdGFsSGlwICsgMzAwIGRheXMsIGRhdGUgZnJvbSBlbmQgb2YgVG90YWxIaXAgKyA0MjUgZGF5c10KICApCgpkZWZpbmUgIkRhdGUgVlIxMiBPcnRob2dvbmFsIFRvdGFsIEFzc2Vzc21lbnQgQ29tcGxldGVkIjoKICBmcm9tCiAgICAoICggW09ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIlZSLTEyIE1lbnRhbCBjb21wb25lbnQgc3VtbWFyeSAoTUNTKSBzY29yZSAtIG9ydGhvZ29uYWwgbWV0aG9kIFQtc2NvcmUiXSApLmlzQXNzZXNzbWVudFBlcmZvcm1lZCAoICkgKSBWUjEyTWVudGFsQXNzZXNzbWVudCwKICAgICggKCBbT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiVlItMTIgUGh5c2ljYWwgY29tcG9uZW50IHN1bW1hcnkgKFBDUykgc2NvcmUgLSBvcnRob2dvbmFsIG1ldGhvZCBULXNjb3JlIl0gKS5pc0Fzc2Vzc21lbnRQZXJmb3JtZWQgKCApICkgVlIxMlBoeXNpY2FsQXNzZXNzbWVudAogICAgbGV0IFZSMTJNZW50YWxBc3Nlc3NtZW50RGF0ZTogZGF0ZSBmcm9tIHN0YXJ0IG9mIFZSMTJNZW50YWxBc3Nlc3NtZW50LmVmZmVjdGl2ZS50b0ludGVydmFsICggKSwKICAgIFZSMTJQaHlzaWNhbEFzc2Vzc21lbnREYXRlOiBkYXRlIGZyb20gc3RhcnQgb2YgVlIxMlBoeXNpY2FsQXNzZXNzbWVudC5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkKICAgIHdoZXJlIFZSMTJNZW50YWxBc3Nlc3NtZW50RGF0ZSBzYW1lIGRheSBhcyBWUjEyUGh5c2ljYWxBc3Nlc3NtZW50RGF0ZQogICAgICBhbmQgKCBWUjEyTWVudGFsQXNzZXNzbWVudCBhcyBPYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQgKS52YWx1ZSBpcyBub3QgbnVsbAogICAgICBhbmQgKCBWUjEyUGh5c2ljYWxBc3Nlc3NtZW50IGFzIE9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudCApLnZhbHVlIGlzIG5vdCBudWxsCiAgICByZXR1cm4gTWF4KHsgVlIxMk1lbnRhbEFzc2Vzc21lbnREYXRlLCBWUjEyUGh5c2ljYWxBc3Nlc3NtZW50RGF0ZSB9KQogICAgCi8qCkBub3RlOiBXaGVuIHBvc3NpYmxlLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBtaWdyYXRlZCB0byBRSUNvcmVDb21tb24uCkBkZXNjcmlwdGlvbjogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBDb25kaXRpb24gaGFzIGEgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiAiY29uZmlybWVkIiwgInVuY29uZmlybWVkIiwgInByb3Zpc2lvbmFsIiwgb3IgImRpZmZlcmVudGlhbCIKKi8KCgpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGlzVmVyaWZpZWQoY29uZGl0aW9uIENob2ljZTxDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXMsIENvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM+KToKICBjb25kaXRpb24udmVyaWZpY2F0aW9uU3RhdHVzIGlzIG5vdCBudWxsIGltcGxpZXMgKCBjb25kaXRpb24udmVyaWZpY2F0aW9uU3RhdHVzIH4gU3RhdHVzLiJjb25maXJtZWQiCiAgICAgIG9yIGNvbmRpdGlvbi52ZXJpZmljYXRpb25TdGF0dXMgfiBTdGF0dXMuInVuY29uZmlybWVkIgogICAgICBvciBjb25kaXRpb24udmVyaWZpY2F0aW9uU3RhdHVzIH4gU3RhdHVzLiJwcm92aXNpb25hbCIKICAgICAgb3IgY29uZGl0aW9uLnZlcmlmaWNhdGlvblN0YXR1cyB+IFN0YXR1cy4iZGlmZmVyZW50aWFsIgogICk=",
      "url" : "https://madie.cms.gov/Library-CMS56FHIRFuncStatHipReplacement.cql"
    }
  ]
}