Draft dQM CMS Content Implementation Guide
2025.1.0 - CI Build
Draft dQM CMS Content Implementation Guide, published by cqframework. This guide is not an authorized publication; it is the continuous build for version 2025.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/cqframework/dqm-content-cms-2025/ and changes regularly. See the Directory of published versions
| Active as of 2025-08-22 |
{
"resourceType" : "Library",
"id" : "CMS2FHIRPCSDepScreenAndFollowUp",
"meta" : {
"profile" : [
🔗 "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"🔗 ,
"http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-computablelibrary"🔗 ,
"http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"🔗 ,
"http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-executablelibrary"🔗 ,
"http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"🔗 ,
"http://hl7.org/fhir/uv/cql/StructureDefinition/elm-json-library"🔗 ,
"http://hl7.org/fhir/uv/cql/StructureDefinition/elm-xml-library"
]
},
"text" : {
"status" : "extensions",
"div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n <table class=\"narrative-table\">\n <tbody>\n<tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\">Metadata</th>\n\n\n</tr>\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Title</th>\n\n\n\n<td class=\"content-container\">CMS2FHIRPCSDepScreenAndFollowUp</td>\n\n\n</tr>\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\">Topic</th>\n\n\n\n<td class=\"content-container\">FHIR\n</td>\n\n\n</tr>\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Topic</th>\n\n\n\n<td class=\"content-container\">CQL\n</td>\n\n\n</tr>\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Steward (Publisher)</th>\n\n\n\n<td class=\"content-container\">Centers for Medicare & Medicaid Services (CMS)</td>\n\n\n</tr>\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Description</th>\n\n\n\n<td class=\"content-container\"><div><p>CMS2FHIRPCSDepScreenAndFollowUp</p>\n</div></td>\n\n\n</tr>\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 logic-library from <a href=\"http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html\">http://terminology.hl7.org/CodeSystem/library-type</a> \n\n\n</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\"><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 <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 CMS2FHIRPCSDepScreenAndFollowUp 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.CumulativeMedicationDuration version '2.0.0-ballot' called CMD\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\n\ncodesystem "LOINC": 'http://loinc.org'\ncodesystem "SNOMEDCT": 'http://snomed.info/sct'\n\nvalueset "Adolescent Depression Medications": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1567'\nvalueset "Adult Depression Medications": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1566'\nvalueset "Bipolar Disorder": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.67.1.101.1.128'\nvalueset "Encounter to Screen for Depression": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.600.1916'\nvalueset "Follow Up for Adolescent Depression": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1569'\nvalueset "Follow Up for Adult Depression": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1568'\nvalueset "Medical Reason": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1007'\nvalueset "Physical Therapy Evaluation": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1022'\nvalueset "Referral for Adolescent Depression": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1570'\nvalueset "Referral for Adult Depression": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1571'\nvalueset "Telephone Visits": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1080'\n\ncode "Adolescent depression screening assessment": '73831-0' from "LOINC" display 'Adolescent depression screening assessment'\ncode "Adult depression screening assessment": '73832-8' from "LOINC" display 'Adult depression screening assessment'\ncode "Depression screening declined (situation)": '720834000' from "SNOMEDCT" display 'Depression screening declined (situation)'\ncode "Depression screening negative (finding)": '428171000124102' from "SNOMEDCT" display 'Depression screening negative (finding)'\ncode "Depression screening positive (finding)": '428181000124104' from "SNOMEDCT" display 'Depression screening positive (finding)'\n\nparameter "Measurement Period" Interval<DateTime>\n default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)\n\ncontext Patient\n\ndefine "Initial Population":\n "Patient Age 12 Years or Older at Start of Measurement Period"\n and exists ( "Qualifying Encounter During Measurement Period" )\n\ndefine "Denominator":\n "Initial Population"\n\ndefine "Denominator Exclusions":\n exists "History of Bipolar Diagnosis Before Qualifying Encounter"\n\ndefine "Numerator":\n ( "Patient Age 12 to 16 Years at Start of Measurement Period"\n and ( "Has Most Recent Adolescent Screening Negative"\n or exists "Most Recent Adolescent Depression Screening Positive and Follow Up Provided"\n )\n )\n or ( "Patient Age 17 Years at Start of Measurement Period"\n and ( "Has Most Recent Adolescent Screening Negative"\n or exists "Most Recent Adolescent Depression Screening Positive and Follow Up Provided"\n or "Has Most Recent Adult Screening Negative"\n or exists "Most Recent Adult Depression Screening Positive and Follow Up Provided"\n )\n )\n or ( "Patient Age 18 Years or Older at Start of Measurement Period"\n and ( "Has Most Recent Adult Screening Negative"\n or exists "Most Recent Adult Depression Screening Positive and Follow Up Provided"\n )\n )\n\ndefine "Denominator Exceptions":\n false\n/*\nTODO: Need to reassess how we are representing given no ObservationCancelled profile\n ( exists "Medical or Patient Reason for Not Screening Adolescent for Depression"\n and not "Has Adolescent Depression Screening"\n )\n or ( exists "Medical or Patient Reason for Not Screening Adult for Depression"\n and not "Has Adult Depression Screening"\n )\n*/\n\ndefine "Follow Up Intervention for Positive Adolescent Depression Screening":\n ( ( [USQualityCore.MedicationRequest: "Adolescent Depression Medications"] AdolescentMed\n with "Qualifying Encounter During Measurement Period" QualifyingEncounter\n such that "Most Recent Adolescent Depression Screening".effective.toInterval ( ) starts 14 days or less on or before day of start of QualifyingEncounter.period\n and AdolescentMed.medicationRequestPeriod ( ) overlaps after day of QualifyingEncounter.period\n and "Most Recent Adolescent Depression Screening".value ~ "Depression screening positive (finding)"\n and AdolescentMed.status in { 'active', 'completed' }\n and AdolescentMed.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n )\n union ( [USQualityCore.ServiceRequest: "Referral for Adolescent Depression"] AdolescentReferral\n where AdolescentReferral.status in { 'active', 'completed' }\n )\n union ( [USQualityCore.Procedure: "Follow Up for Adolescent Depression"] AdolescentFollowUp\n where AdolescentFollowUp.status = 'completed'\n )\n )\n\ndefine "Follow Up Intervention for Positive Adult Depression Screening":\n ( ( [USQualityCore.MedicationRequest: "Adult Depression Medications"] AdultMed\n with "Qualifying Encounter During Measurement Period" QualifyingEncounter\n such that "Most Recent Adult Depression Screening".effective.toInterval ( ) starts 14 days or less on or before day of start of QualifyingEncounter.period\n and AdultMed.medicationRequestPeriod ( ) overlaps after day of QualifyingEncounter.period\n and "Most Recent Adult Depression Screening".value ~ "Depression screening positive (finding)"\n and AdultMed.status in { 'active', 'completed' }\n and AdultMed.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n )\n union ( [USQualityCore.ServiceRequest: "Referral for Adult Depression"] AdultReferral\n where AdultReferral.status in { 'active', 'completed' }\n )\n union ( [USQualityCore.Procedure: "Follow Up for Adult Depression"] AdultFollowUp\n where AdultFollowUp.status = 'completed'\n )\n )\n\ndefine "Has Adolescent Depression Screening":\n exists ( [USQualityCore.ObservationScreeningAssessment: "Adolescent depression screening assessment"] AdolescentScreening\n with "Qualifying Encounter During Measurement Period" QualifyingEncounter\n such that AdolescentScreening.effective.toInterval ( ) 14 days or less on or before day of start of QualifyingEncounter.period\n and AdolescentScreening.value is not null\n and AdolescentScreening.status in { 'final', 'amended', 'corrected' }\n )\n\ndefine "Has Adult Depression Screening":\n exists ( [USQualityCore.ObservationScreeningAssessment: "Adult depression screening assessment"] AdultScreening\n with "Qualifying Encounter During Measurement Period" QualifyingEncounter\n such that AdultScreening.effective.toInterval ( ) 14 days or less on or before day of start of QualifyingEncounter.period\n and AdultScreening.value is not null\n and AdultScreening.status in { 'final', 'amended', 'corrected' }\n )\n\ndefine "Has Most Recent Adolescent Screening Negative":\n ( "Most Recent Adolescent Depression Screening" AdolescentScreen\n where AdolescentScreen.value ~ "Depression screening negative (finding)"\n ) is not null\n\ndefine "Has Most Recent Adult Screening Negative":\n ( "Most Recent Adult Depression Screening" AdultScreen\n where AdultScreen.value ~ "Depression screening negative (finding)"\n ) is not null\n\ndefine "History of Bipolar Diagnosis Before Qualifying Encounter":\n [USQualityCore.ConditionProblemsHealthConcerns: "Bipolar Disorder"] BipolarDiagnosis\n with "Qualifying Encounter During Measurement Period" QualifyingEncounter\n such that BipolarDiagnosis.prevalenceInterval ( ) starts before day of start of QualifyingEncounter.period\n\n/*\nTODO: Needs to be reassessed given the pattern change for ObservationCancelled, this should really be a ServiceRequest with a TaskRejected, yes?\ndefine "Medical or Patient Reason for Not Screening Adolescent for Depression":\n [USQualityCore.ObservationCancelled: code ~ "Adolescent depression screening assessment"] NoAdolescentScreen\n with "Qualifying Encounter During Measurement Period" QualifyingEncounter\n such that NoAdolescentScreen.issued during day of QualifyingEncounter.period\n where ( NoAdolescentScreen.notDoneReason ~ "Depression screening declined (situation)"\n or NoAdolescentScreen.notDoneReason in "Medical Reason"\n )\n\ndefine "Medical or Patient Reason for Not Screening Adult for Depression":\n [USQualityCore.ObservationCancelled: code ~ "Adult depression screening assessment"] NoAdultScreen\n with "Qualifying Encounter During Measurement Period" QualifyingEncounter\n such that NoAdultScreen.issued during day of QualifyingEncounter.period\n where ( NoAdultScreen.notDoneReason ~ "Depression screening declined (situation)"\n or NoAdultScreen.notDoneReason in "Medical Reason"\n )\n*/\n\ndefine "Most Recent Adolescent Depression Screening":\n Last([USQualityCore.ObservationScreeningAssessment: "Adolescent depression screening assessment"] AdolescentDepressionScreening\n with "Qualifying Encounter During Measurement Period" QualifyingEncounter\n such that AdolescentDepressionScreening.effective.toInterval() 14 days or less on or before day of start of QualifyingEncounter.period\n and AdolescentDepressionScreening.value is not null\n and AdolescentDepressionScreening.status in { 'final', 'amended', 'corrected' }\n sort by start of effective.toInterval()\n )\n\ndefine "Most Recent Adolescent Depression Screening Positive and Follow Up Provided":\n from\n "Most Recent Adolescent Depression Screening" LastAdolescentScreen,\n "Follow Up Intervention for Positive Adolescent Depression Screening" FollowUpPositiveAdolescentScreen,\n "Qualifying Encounter During Measurement Period" QualifyingEncounter\n where LastAdolescentScreen.effective.toInterval ( ) starts 14 days or less on or before day of start of QualifyingEncounter.period\n and LastAdolescentScreen.value ~ "Depression screening positive (finding)"\n and ( start of FollowUpPositiveAdolescentScreen.performed.toInterval ( ) during QualifyingEncounter.period\n or FollowUpPositiveAdolescentScreen.authoredOn 2 days or less on or after day of end of QualifyingEncounter.period\n )\n and ( Coalesce(start of FollowUpPositiveAdolescentScreen.performed.toInterval(), FollowUpPositiveAdolescentScreen.authoredOn) during day of "Measurement Period" )\n\ndefine "Most Recent Adult Depression Screening":\n Last([USQualityCore.ObservationScreeningAssessment: "Adult depression screening assessment"] AdultDepressionScreening\n with "Qualifying Encounter During Measurement Period" QualifyingEncounter\n such that AdultDepressionScreening.effective.toInterval() 14 days or less on or before day of start of QualifyingEncounter.period\n and AdultDepressionScreening.value is not null\n and AdultDepressionScreening.status in { 'final', 'amended', 'corrected' }\n sort by start of effective.toInterval()\n )\n\ndefine "Most Recent Adult Depression Screening Positive and Follow Up Provided":\n from\n "Most Recent Adult Depression Screening" LastAdultScreen,\n "Follow Up Intervention for Positive Adult Depression Screening" FollowUpPositiveAdultScreen,\n "Qualifying Encounter During Measurement Period" QualifyingEncounter\n where LastAdultScreen.effective.toInterval ( ) starts 14 days or less on or before day of start of QualifyingEncounter.period\n and LastAdultScreen.value ~ "Depression screening positive (finding)"\n and ( start of FollowUpPositiveAdultScreen.performed.toInterval ( ) during QualifyingEncounter.period\n or FollowUpPositiveAdultScreen.authoredOn 2 days or less on or after day of end of QualifyingEncounter.period\n )\n and ( Coalesce(start of FollowUpPositiveAdultScreen.performed.toInterval(), FollowUpPositiveAdultScreen.authoredOn) during day of "Measurement Period" )\n\ndefine "Patient Age 12 to 16 Years at Start of Measurement Period":\n AgeInYearsAt(date from start of "Measurement Period") in Interval[12, 16]\n\ndefine "Patient Age 12 Years or Older at Start of Measurement Period":\n AgeInYearsAt(date from start of "Measurement Period") >= 12\n\ndefine "Patient Age 17 Years at Start of Measurement Period":\n AgeInYearsAt(date from start of "Measurement Period") = 17\n\ndefine "Patient Age 18 Years or Older at Start of Measurement Period":\n AgeInYearsAt(date from start of "Measurement Period") >= 18\n\ndefine "Qualifying Encounter During Measurement Period":\n ( [USQualityCore.Encounter: "Encounter to Screen for Depression"]\n union [USQualityCore.Encounter: "Physical Therapy Evaluation"]\n union [USQualityCore.Encounter: "Telephone Visits"] ) QualifyingEncounter\n where QualifyingEncounter.period during day of "Measurement Period"\n and QualifyingEncounter.status = 'finished'\n\ndefine "SDE Ethnicity":\n SDE."SDE Ethnicity"\n\ndefine "SDE Payer":\n SDE."SDE Payer"\n\ndefine "SDE Race":\n SDE."SDE Race"\n\ndefine "SDE Sex":\n SDE."SDE Sex"</code></pre>\n </td>\n </tr>\n \n \n\n<tr>\n <th colspan=\"2\" scope=\"row\" class=\"row-header\">Generated using version 0.5.4 of the sample-content-ig Liquid templates</th>\n</tr>\n\n </tbody>\n </table>\n</div>"
},
"url" : "https://madie.cms.gov/Library/CMS2FHIRPCSDepScreenAndFollowUp",
"version" : "1.1.000",
"name" : "CMS2FHIRPCSDepScreenAndFollowUp",
"title" : "CMS2FHIRPCSDepScreenAndFollowUp",
"status" : "active",
"experimental" : false,
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/library-type",
"code" : "logic-library"
}
]
},
"date" : "2025-08-22T19:33:33+00:00",
"publisher" : "Centers for Medicare & Medicaid Services (CMS)",
"description" : "CMS2FHIRPCSDepScreenAndFollowUp",
"topic" : [
{
"text" : "FHIR"
},
{
"text" : "CQL"
}
],
"content" : [
{
"contentType" : "text/cql",
"data" : "LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVMyRkhJUlBDU0RlcFNjcmVlbkFuZEZvbGxvd1VwIHZlcnNpb24gJzEuMS4wMDAnCgp1c2luZyBVU1F1YWxpdHlDb3JlIHZlcnNpb24gJzAuMS4wLWNpYnVpbGQnCnVzaW5nIFVTQ29yZSB2ZXJzaW9uICc2LjEuMC1kZXJpdmVkJwp1c2luZyBGSElSIHZlcnNpb24gJzQuMC4xJwoKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkhlbHBlcnMgdmVyc2lvbiAnNC4wLjEnIGNhbGxlZCBGSElSSGVscGVycwppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSQ29tbW9uIHZlcnNpb24gJzIuMC4wJyBjYWxsZWQgRkhJUkNvbW1vbgppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5DdW11bGF0aXZlTWVkaWNhdGlvbkR1cmF0aW9uIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIENNRAppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5VU0NvcmVDb21tb24gdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUVsZW1lbnRzIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIFVTQ29yZUVsZW1lbnRzCgppbmNsdWRlIFVTUXVhbGl0eUNvcmVDb21tb24gdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcgY2FsbGVkIFVTUXVhbGl0eUNvcmVDb21tb24KaW5jbHVkZSBTdXBwbGVtZW50YWxEYXRhRWxlbWVudHMgdmVyc2lvbiAnNi4xLjAwMCcgY2FsbGVkIFNERQoKY29kZXN5c3RlbSAiTE9JTkMiOiAnaHR0cDovL2xvaW5jLm9yZycKY29kZXN5c3RlbSAiU05PTUVEQ1QiOiAnaHR0cDovL3Nub21lZC5pbmZvL3NjdCcKCnZhbHVlc2V0ICJBZG9sZXNjZW50IERlcHJlc3Npb24gTWVkaWNhdGlvbnMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTU2NycKdmFsdWVzZXQgIkFkdWx0IERlcHJlc3Npb24gTWVkaWNhdGlvbnMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTU2NicKdmFsdWVzZXQgIkJpcG9sYXIgRGlzb3JkZXIiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNjcuMS4xMDEuMS4xMjgnCnZhbHVlc2V0ICJFbmNvdW50ZXIgdG8gU2NyZWVuIGZvciBEZXByZXNzaW9uIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjYwMC4xOTE2Jwp2YWx1ZXNldCAiRm9sbG93IFVwIGZvciBBZG9sZXNjZW50IERlcHJlc3Npb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTU2OScKdmFsdWVzZXQgIkZvbGxvdyBVcCBmb3IgQWR1bHQgRGVwcmVzc2lvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xNTY4Jwp2YWx1ZXNldCAiTWVkaWNhbCBSZWFzb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTAwNycKdmFsdWVzZXQgIlBoeXNpY2FsIFRoZXJhcHkgRXZhbHVhdGlvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xMDIyJwp2YWx1ZXNldCAiUmVmZXJyYWwgZm9yIEFkb2xlc2NlbnQgRGVwcmVzc2lvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xNTcwJwp2YWx1ZXNldCAiUmVmZXJyYWwgZm9yIEFkdWx0IERlcHJlc3Npb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTU3MScKdmFsdWVzZXQgIlRlbGVwaG9uZSBWaXNpdHMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwODAnCgpjb2RlICJBZG9sZXNjZW50IGRlcHJlc3Npb24gc2NyZWVuaW5nIGFzc2Vzc21lbnQiOiAnNzM4MzEtMCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ0Fkb2xlc2NlbnQgZGVwcmVzc2lvbiBzY3JlZW5pbmcgYXNzZXNzbWVudCcKY29kZSAiQWR1bHQgZGVwcmVzc2lvbiBzY3JlZW5pbmcgYXNzZXNzbWVudCI6ICc3MzgzMi04JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnQWR1bHQgZGVwcmVzc2lvbiBzY3JlZW5pbmcgYXNzZXNzbWVudCcKY29kZSAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgZGVjbGluZWQgKHNpdHVhdGlvbikiOiAnNzIwODM0MDAwJyBmcm9tICJTTk9NRURDVCIgZGlzcGxheSAnRGVwcmVzc2lvbiBzY3JlZW5pbmcgZGVjbGluZWQgKHNpdHVhdGlvbiknCmNvZGUgIkRlcHJlc3Npb24gc2NyZWVuaW5nIG5lZ2F0aXZlIChmaW5kaW5nKSI6ICc0MjgxNzEwMDAxMjQxMDInIGZyb20gIlNOT01FRENUIiBkaXNwbGF5ICdEZXByZXNzaW9uIHNjcmVlbmluZyBuZWdhdGl2ZSAoZmluZGluZyknCmNvZGUgIkRlcHJlc3Npb24gc2NyZWVuaW5nIHBvc2l0aXZlIChmaW5kaW5nKSI6ICc0MjgxODEwMDAxMjQxMDQnIGZyb20gIlNOT01FRENUIiBkaXNwbGF5ICdEZXByZXNzaW9uIHNjcmVlbmluZyBwb3NpdGl2ZSAoZmluZGluZyknCgpwYXJhbWV0ZXIgIk1lYXN1cmVtZW50IFBlcmlvZCIgSW50ZXJ2YWw8RGF0ZVRpbWU+CiAgZGVmYXVsdCBJbnRlcnZhbFtAMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaLCBAMjAyNy0wMS0wMVQwMDowMDowMC4wMDBaKQoKY29udGV4dCBQYXRpZW50CgpkZWZpbmUgIkluaXRpYWwgUG9wdWxhdGlvbiI6CiAgIlBhdGllbnQgQWdlIDEyIFllYXJzIG9yIE9sZGVyIGF0IFN0YXJ0IG9mIE1lYXN1cmVtZW50IFBlcmlvZCIKICAgIGFuZCBleGlzdHMgKCAiUXVhbGlmeWluZyBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgKQoKZGVmaW5lICJEZW5vbWluYXRvciI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIKCmRlZmluZSAiRGVub21pbmF0b3IgRXhjbHVzaW9ucyI6CiAgZXhpc3RzICJIaXN0b3J5IG9mIEJpcG9sYXIgRGlhZ25vc2lzIEJlZm9yZSBRdWFsaWZ5aW5nIEVuY291bnRlciIKCmRlZmluZSAiTnVtZXJhdG9yIjoKICAoICJQYXRpZW50IEFnZSAxMiB0byAxNiBZZWFycyBhdCBTdGFydCBvZiBNZWFzdXJlbWVudCBQZXJpb2QiCiAgICAgIGFuZCAoICJIYXMgTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBTY3JlZW5pbmcgTmVnYXRpdmUiCiAgICAgICAgICBvciBleGlzdHMgIk1vc3QgUmVjZW50IEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCIKICAgICAgKQogICkKICAgIG9yICggIlBhdGllbnQgQWdlIDE3IFllYXJzIGF0IFN0YXJ0IG9mIE1lYXN1cmVtZW50IFBlcmlvZCIKICAgICAgICBhbmQgKCAiSGFzIE1vc3QgUmVjZW50IEFkb2xlc2NlbnQgU2NyZWVuaW5nIE5lZ2F0aXZlIgogICAgICAgICAgICBvciBleGlzdHMgIk1vc3QgUmVjZW50IEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCIKICAgICAgICAgICAgb3IgIkhhcyBNb3N0IFJlY2VudCBBZHVsdCBTY3JlZW5pbmcgTmVnYXRpdmUiCiAgICAgICAgICAgIG9yIGV4aXN0cyAiTW9zdCBSZWNlbnQgQWR1bHQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCIKICAgICAgICApCiAgICApCiAgICBvciAoICJQYXRpZW50IEFnZSAxOCBZZWFycyBvciBPbGRlciBhdCBTdGFydCBvZiBNZWFzdXJlbWVudCBQZXJpb2QiCiAgICAgICAgYW5kICggIkhhcyBNb3N0IFJlY2VudCBBZHVsdCBTY3JlZW5pbmcgTmVnYXRpdmUiCiAgICAgICAgICAgIG9yIGV4aXN0cyAiTW9zdCBSZWNlbnQgQWR1bHQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCIKICAgICAgICApCiAgICApCgpkZWZpbmUgIkRlbm9taW5hdG9yIEV4Y2VwdGlvbnMiOgogIGZhbHNlCi8qClRPRE86IE5lZWQgdG8gcmVhc3Nlc3MgaG93IHdlIGFyZSByZXByZXNlbnRpbmcgZ2l2ZW4gbm8gT2JzZXJ2YXRpb25DYW5jZWxsZWQgcHJvZmlsZQogICggZXhpc3RzICJNZWRpY2FsIG9yIFBhdGllbnQgUmVhc29uIGZvciBOb3QgU2NyZWVuaW5nIEFkb2xlc2NlbnQgZm9yIERlcHJlc3Npb24iCiAgICAgIGFuZCBub3QgIkhhcyBBZG9sZXNjZW50IERlcHJlc3Npb24gU2NyZWVuaW5nIgogICkKICAgIG9yICggZXhpc3RzICJNZWRpY2FsIG9yIFBhdGllbnQgUmVhc29uIGZvciBOb3QgU2NyZWVuaW5nIEFkdWx0IGZvciBEZXByZXNzaW9uIgogICAgICAgIGFuZCBub3QgIkhhcyBBZHVsdCBEZXByZXNzaW9uIFNjcmVlbmluZyIKICAgICkKKi8KCmRlZmluZSAiRm9sbG93IFVwIEludGVydmVudGlvbiBmb3IgUG9zaXRpdmUgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyI6CiAgKCAoIFtVU1F1YWxpdHlDb3JlLk1lZGljYXRpb25SZXF1ZXN0OiAiQWRvbGVzY2VudCBEZXByZXNzaW9uIE1lZGljYXRpb25zIl0gQWRvbGVzY2VudE1lZAogICAgICAgIHdpdGggIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgICAgIHN1Y2ggdGhhdCAiTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyIuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyAxNCBkYXlzIG9yIGxlc3Mgb24gb3IgYmVmb3JlIGRheSBvZiBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgICBhbmQgQWRvbGVzY2VudE1lZC5tZWRpY2F0aW9uUmVxdWVzdFBlcmlvZCAoICkgb3ZlcmxhcHMgYWZ0ZXIgZGF5IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICAgIGFuZCAiTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyIudmFsdWUgfiAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgcG9zaXRpdmUgKGZpbmRpbmcpIgogICAgICAgICAgICBhbmQgQWRvbGVzY2VudE1lZC5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgICAgICBhbmQgQWRvbGVzY2VudE1lZC5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICAgKQogICAgICB1bmlvbiAoIFtVU1F1YWxpdHlDb3JlLlNlcnZpY2VSZXF1ZXN0OiAiUmVmZXJyYWwgZm9yIEFkb2xlc2NlbnQgRGVwcmVzc2lvbiJdIEFkb2xlc2NlbnRSZWZlcnJhbAogICAgICAgICAgd2hlcmUgQWRvbGVzY2VudFJlZmVycmFsLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICkKICAgICAgdW5pb24gKCBbVVNRdWFsaXR5Q29yZS5Qcm9jZWR1cmU6ICJGb2xsb3cgVXAgZm9yIEFkb2xlc2NlbnQgRGVwcmVzc2lvbiJdIEFkb2xlc2NlbnRGb2xsb3dVcAogICAgICAgICAgd2hlcmUgQWRvbGVzY2VudEZvbGxvd1VwLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICkKICApCgpkZWZpbmUgIkZvbGxvdyBVcCBJbnRlcnZlbnRpb24gZm9yIFBvc2l0aXZlIEFkdWx0IERlcHJlc3Npb24gU2NyZWVuaW5nIjoKICAoICggW1VTUXVhbGl0eUNvcmUuTWVkaWNhdGlvblJlcXVlc3Q6ICJBZHVsdCBEZXByZXNzaW9uIE1lZGljYXRpb25zIl0gQWR1bHRNZWQKICAgICAgICB3aXRoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgICAgICBzdWNoIHRoYXQgIk1vc3QgUmVjZW50IEFkdWx0IERlcHJlc3Npb24gU2NyZWVuaW5nIi5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgc3RhcnRzIDE0IGRheXMgb3IgbGVzcyBvbiBvciBiZWZvcmUgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICAgIGFuZCBBZHVsdE1lZC5tZWRpY2F0aW9uUmVxdWVzdFBlcmlvZCAoICkgb3ZlcmxhcHMgYWZ0ZXIgZGF5IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICAgIGFuZCAiTW9zdCBSZWNlbnQgQWR1bHQgRGVwcmVzc2lvbiBTY3JlZW5pbmciLnZhbHVlIH4gIkRlcHJlc3Npb24gc2NyZWVuaW5nIHBvc2l0aXZlIChmaW5kaW5nKSIKICAgICAgICAgICAgYW5kIEFkdWx0TWVkLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICAgICAgIGFuZCBBZHVsdE1lZC5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICAgKQogICAgICB1bmlvbiAoIFtVU1F1YWxpdHlDb3JlLlNlcnZpY2VSZXF1ZXN0OiAiUmVmZXJyYWwgZm9yIEFkdWx0IERlcHJlc3Npb24iXSBBZHVsdFJlZmVycmFsCiAgICAgICAgICB3aGVyZSBBZHVsdFJlZmVycmFsLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICkKICAgICAgdW5pb24gKCBbVVNRdWFsaXR5Q29yZS5Qcm9jZWR1cmU6ICJGb2xsb3cgVXAgZm9yIEFkdWx0IERlcHJlc3Npb24iXSBBZHVsdEZvbGxvd1VwCiAgICAgICAgICB3aGVyZSBBZHVsdEZvbGxvd1VwLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICkKICApCgpkZWZpbmUgIkhhcyBBZG9sZXNjZW50IERlcHJlc3Npb24gU2NyZWVuaW5nIjoKICBleGlzdHMgKCBbVVNRdWFsaXR5Q29yZS5PYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJBZG9sZXNjZW50IGRlcHJlc3Npb24gc2NyZWVuaW5nIGFzc2Vzc21lbnQiXSBBZG9sZXNjZW50U2NyZWVuaW5nCiAgICAgIHdpdGggIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgICBzdWNoIHRoYXQgQWRvbGVzY2VudFNjcmVlbmluZy5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgMTQgZGF5cyBvciBsZXNzIG9uIG9yIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgICAgIGFuZCBBZG9sZXNjZW50U2NyZWVuaW5nLnZhbHVlIGlzIG5vdCBudWxsCiAgICAgICAgICBhbmQgQWRvbGVzY2VudFNjcmVlbmluZy5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICApCgpkZWZpbmUgIkhhcyBBZHVsdCBEZXByZXNzaW9uIFNjcmVlbmluZyI6CiAgZXhpc3RzICggW1VTUXVhbGl0eUNvcmUuT2JzZXJ2YXRpb25TY3JlZW5pbmdBc3Nlc3NtZW50OiAiQWR1bHQgZGVwcmVzc2lvbiBzY3JlZW5pbmcgYXNzZXNzbWVudCJdIEFkdWx0U2NyZWVuaW5nCiAgICAgIHdpdGggIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgICBzdWNoIHRoYXQgQWR1bHRTY3JlZW5pbmcuZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIDE0IGRheXMgb3IgbGVzcyBvbiBvciBiZWZvcmUgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICBhbmQgQWR1bHRTY3JlZW5pbmcudmFsdWUgaXMgbm90IG51bGwKICAgICAgICAgIGFuZCBBZHVsdFNjcmVlbmluZy5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICApCgpkZWZpbmUgIkhhcyBNb3N0IFJlY2VudCBBZG9sZXNjZW50IFNjcmVlbmluZyBOZWdhdGl2ZSI6CiAgKCAiTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyIgQWRvbGVzY2VudFNjcmVlbgogICAgICB3aGVyZSBBZG9sZXNjZW50U2NyZWVuLnZhbHVlIH4gIkRlcHJlc3Npb24gc2NyZWVuaW5nIG5lZ2F0aXZlIChmaW5kaW5nKSIKICApIGlzIG5vdCBudWxsCgpkZWZpbmUgIkhhcyBNb3N0IFJlY2VudCBBZHVsdCBTY3JlZW5pbmcgTmVnYXRpdmUiOgogICggIk1vc3QgUmVjZW50IEFkdWx0IERlcHJlc3Npb24gU2NyZWVuaW5nIiBBZHVsdFNjcmVlbgogICAgICB3aGVyZSBBZHVsdFNjcmVlbi52YWx1ZSB+ICJEZXByZXNzaW9uIHNjcmVlbmluZyBuZWdhdGl2ZSAoZmluZGluZykiCiAgKSBpcyBub3QgbnVsbAoKZGVmaW5lICJIaXN0b3J5IG9mIEJpcG9sYXIgRGlhZ25vc2lzIEJlZm9yZSBRdWFsaWZ5aW5nIEVuY291bnRlciI6CiAgW1VTUXVhbGl0eUNvcmUuQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkJpcG9sYXIgRGlzb3JkZXIiXSBCaXBvbGFyRGlhZ25vc2lzCiAgICB3aXRoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHN1Y2ggdGhhdCBCaXBvbGFyRGlhZ25vc2lzLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgc3RhcnRzIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKCi8qClRPRE86IE5lZWRzIHRvIGJlIHJlYXNzZXNzZWQgZ2l2ZW4gdGhlIHBhdHRlcm4gY2hhbmdlIGZvciBPYnNlcnZhdGlvbkNhbmNlbGxlZCwgdGhpcyBzaG91bGQgcmVhbGx5IGJlIGEgU2VydmljZVJlcXVlc3Qgd2l0aCBhIFRhc2tSZWplY3RlZCwgeWVzPwpkZWZpbmUgIk1lZGljYWwgb3IgUGF0aWVudCBSZWFzb24gZm9yIE5vdCBTY3JlZW5pbmcgQWRvbGVzY2VudCBmb3IgRGVwcmVzc2lvbiI6CiAgW1VTUXVhbGl0eUNvcmUuT2JzZXJ2YXRpb25DYW5jZWxsZWQ6IGNvZGUgfiAiQWRvbGVzY2VudCBkZXByZXNzaW9uIHNjcmVlbmluZyBhc3Nlc3NtZW50Il0gTm9BZG9sZXNjZW50U2NyZWVuCiAgICB3aXRoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHN1Y2ggdGhhdCBOb0Fkb2xlc2NlbnRTY3JlZW4uaXNzdWVkIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgIHdoZXJlICggTm9BZG9sZXNjZW50U2NyZWVuLm5vdERvbmVSZWFzb24gfiAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgZGVjbGluZWQgKHNpdHVhdGlvbikiCiAgICAgICAgb3IgTm9BZG9sZXNjZW50U2NyZWVuLm5vdERvbmVSZWFzb24gaW4gIk1lZGljYWwgUmVhc29uIgogICAgKQoKZGVmaW5lICJNZWRpY2FsIG9yIFBhdGllbnQgUmVhc29uIGZvciBOb3QgU2NyZWVuaW5nIEFkdWx0IGZvciBEZXByZXNzaW9uIjoKICBbVVNRdWFsaXR5Q29yZS5PYnNlcnZhdGlvbkNhbmNlbGxlZDogY29kZSB+ICJBZHVsdCBkZXByZXNzaW9uIHNjcmVlbmluZyBhc3Nlc3NtZW50Il0gTm9BZHVsdFNjcmVlbgogICAgd2l0aCAiUXVhbGlmeWluZyBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgICBzdWNoIHRoYXQgTm9BZHVsdFNjcmVlbi5pc3N1ZWQgZHVyaW5nIGRheSBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgd2hlcmUgKCBOb0FkdWx0U2NyZWVuLm5vdERvbmVSZWFzb24gfiAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgZGVjbGluZWQgKHNpdHVhdGlvbikiCiAgICAgICAgb3IgTm9BZHVsdFNjcmVlbi5ub3REb25lUmVhc29uIGluICJNZWRpY2FsIFJlYXNvbiIKICAgICkKKi8KCmRlZmluZSAiTW9zdCBSZWNlbnQgQWRvbGVzY2VudCBEZXByZXNzaW9uIFNjcmVlbmluZyI6CiAgTGFzdChbVVNRdWFsaXR5Q29yZS5PYnNlcnZhdGlvblNjcmVlbmluZ0Fzc2Vzc21lbnQ6ICJBZG9sZXNjZW50IGRlcHJlc3Npb24gc2NyZWVuaW5nIGFzc2Vzc21lbnQiXSBBZG9sZXNjZW50RGVwcmVzc2lvblNjcmVlbmluZwogICAgICB3aXRoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgICAgc3VjaCB0aGF0IEFkb2xlc2NlbnREZXByZXNzaW9uU2NyZWVuaW5nLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgMTQgZGF5cyBvciBsZXNzIG9uIG9yIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgICAgIGFuZCBBZG9sZXNjZW50RGVwcmVzc2lvblNjcmVlbmluZy52YWx1ZSBpcyBub3QgbnVsbAogICAgICAgICAgYW5kIEFkb2xlc2NlbnREZXByZXNzaW9uU2NyZWVuaW5nLnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICBzb3J0IGJ5IHN0YXJ0IG9mIGVmZmVjdGl2ZS50b0ludGVydmFsKCkKICApCgpkZWZpbmUgIk1vc3QgUmVjZW50IEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmcgUG9zaXRpdmUgYW5kIEZvbGxvdyBVcCBQcm92aWRlZCI6CiAgZnJvbQogICAgIk1vc3QgUmVjZW50IEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmciIExhc3RBZG9sZXNjZW50U2NyZWVuLAogICAgIkZvbGxvdyBVcCBJbnRlcnZlbnRpb24gZm9yIFBvc2l0aXZlIEFkb2xlc2NlbnQgRGVwcmVzc2lvbiBTY3JlZW5pbmciIEZvbGxvd1VwUG9zaXRpdmVBZG9sZXNjZW50U2NyZWVuLAogICAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdoZXJlIExhc3RBZG9sZXNjZW50U2NyZWVuLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBzdGFydHMgMTQgZGF5cyBvciBsZXNzIG9uIG9yIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgYW5kIExhc3RBZG9sZXNjZW50U2NyZWVuLnZhbHVlIH4gIkRlcHJlc3Npb24gc2NyZWVuaW5nIHBvc2l0aXZlIChmaW5kaW5nKSIKICAgICAgYW5kICggc3RhcnQgb2YgRm9sbG93VXBQb3NpdGl2ZUFkb2xlc2NlbnRTY3JlZW4ucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgb3IgRm9sbG93VXBQb3NpdGl2ZUFkb2xlc2NlbnRTY3JlZW4uYXV0aG9yZWRPbiAyIGRheXMgb3IgbGVzcyBvbiBvciBhZnRlciBkYXkgb2YgZW5kIG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICkKICAgICAgYW5kICggQ29hbGVzY2Uoc3RhcnQgb2YgRm9sbG93VXBQb3NpdGl2ZUFkb2xlc2NlbnRTY3JlZW4ucGVyZm9ybWVkLnRvSW50ZXJ2YWwoKSwgRm9sbG93VXBQb3NpdGl2ZUFkb2xlc2NlbnRTY3JlZW4uYXV0aG9yZWRPbikgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIiApCgpkZWZpbmUgIk1vc3QgUmVjZW50IEFkdWx0IERlcHJlc3Npb24gU2NyZWVuaW5nIjoKICBMYXN0KFtVU1F1YWxpdHlDb3JlLk9ic2VydmF0aW9uU2NyZWVuaW5nQXNzZXNzbWVudDogIkFkdWx0IGRlcHJlc3Npb24gc2NyZWVuaW5nIGFzc2Vzc21lbnQiXSBBZHVsdERlcHJlc3Npb25TY3JlZW5pbmcKICAgICAgd2l0aCAiUXVhbGlmeWluZyBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgICAgIHN1Y2ggdGhhdCBBZHVsdERlcHJlc3Npb25TY3JlZW5pbmcuZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSAxNCBkYXlzIG9yIGxlc3Mgb24gb3IgYmVmb3JlIGRheSBvZiBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgYW5kIEFkdWx0RGVwcmVzc2lvblNjcmVlbmluZy52YWx1ZSBpcyBub3QgbnVsbAogICAgICAgICAgYW5kIEFkdWx0RGVwcmVzc2lvblNjcmVlbmluZy5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgc29ydCBieSBzdGFydCBvZiBlZmZlY3RpdmUudG9JbnRlcnZhbCgpCiAgKQoKZGVmaW5lICJNb3N0IFJlY2VudCBBZHVsdCBEZXByZXNzaW9uIFNjcmVlbmluZyBQb3NpdGl2ZSBhbmQgRm9sbG93IFVwIFByb3ZpZGVkIjoKICBmcm9tCiAgICAiTW9zdCBSZWNlbnQgQWR1bHQgRGVwcmVzc2lvbiBTY3JlZW5pbmciIExhc3RBZHVsdFNjcmVlbiwKICAgICJGb2xsb3cgVXAgSW50ZXJ2ZW50aW9uIGZvciBQb3NpdGl2ZSBBZHVsdCBEZXByZXNzaW9uIFNjcmVlbmluZyIgRm9sbG93VXBQb3NpdGl2ZUFkdWx0U2NyZWVuLAogICAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdoZXJlIExhc3RBZHVsdFNjcmVlbi5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgc3RhcnRzIDE0IGRheXMgb3IgbGVzcyBvbiBvciBiZWZvcmUgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgIGFuZCBMYXN0QWR1bHRTY3JlZW4udmFsdWUgfiAiRGVwcmVzc2lvbiBzY3JlZW5pbmcgcG9zaXRpdmUgKGZpbmRpbmcpIgogICAgICBhbmQgKCBzdGFydCBvZiBGb2xsb3dVcFBvc2l0aXZlQWR1bHRTY3JlZW4ucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgb3IgRm9sbG93VXBQb3NpdGl2ZUFkdWx0U2NyZWVuLmF1dGhvcmVkT24gMiBkYXlzIG9yIGxlc3Mgb24gb3IgYWZ0ZXIgZGF5IG9mIGVuZCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICApCiAgICAgIGFuZCAoIENvYWxlc2NlKHN0YXJ0IG9mIEZvbGxvd1VwUG9zaXRpdmVBZHVsdFNjcmVlbi5wZXJmb3JtZWQudG9JbnRlcnZhbCgpLCBGb2xsb3dVcFBvc2l0aXZlQWR1bHRTY3JlZW4uYXV0aG9yZWRPbikgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIiApCgpkZWZpbmUgIlBhdGllbnQgQWdlIDEyIHRvIDE2IFllYXJzIGF0IFN0YXJ0IG9mIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgQWdlSW5ZZWFyc0F0KGRhdGUgZnJvbSBzdGFydCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgaW4gSW50ZXJ2YWxbMTIsIDE2XQoKZGVmaW5lICJQYXRpZW50IEFnZSAxMiBZZWFycyBvciBPbGRlciBhdCBTdGFydCBvZiBNZWFzdXJlbWVudCBQZXJpb2QiOgogIEFnZUluWWVhcnNBdChkYXRlIGZyb20gc3RhcnQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpID49IDEyCgpkZWZpbmUgIlBhdGllbnQgQWdlIDE3IFllYXJzIGF0IFN0YXJ0IG9mIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgQWdlSW5ZZWFyc0F0KGRhdGUgZnJvbSBzdGFydCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPSAxNwoKZGVmaW5lICJQYXRpZW50IEFnZSAxOCBZZWFycyBvciBPbGRlciBhdCBTdGFydCBvZiBNZWFzdXJlbWVudCBQZXJpb2QiOgogIEFnZUluWWVhcnNBdChkYXRlIGZyb20gc3RhcnQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpID49IDE4CgpkZWZpbmUgIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICggW1VTUXVhbGl0eUNvcmUuRW5jb3VudGVyOiAiRW5jb3VudGVyIHRvIFNjcmVlbiBmb3IgRGVwcmVzc2lvbiJdCiAgICB1bmlvbiBbVVNRdWFsaXR5Q29yZS5FbmNvdW50ZXI6ICJQaHlzaWNhbCBUaGVyYXB5IEV2YWx1YXRpb24iXQogICAgdW5pb24gW1VTUXVhbGl0eUNvcmUuRW5jb3VudGVyOiAiVGVsZXBob25lIFZpc2l0cyJdICkgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2hlcmUgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgUXVhbGlmeWluZ0VuY291bnRlci5zdGF0dXMgPSAnZmluaXNoZWQnCgpkZWZpbmUgIlNERSBFdGhuaWNpdHkiOgogIFNERS4iU0RFIEV0aG5pY2l0eSIKCmRlZmluZSAiU0RFIFBheWVyIjoKICBTREUuIlNERSBQYXllciIKCmRlZmluZSAiU0RFIFJhY2UiOgogIFNERS4iU0RFIFJhY2UiCgpkZWZpbmUgIlNERSBTZXgiOgogIFNERS4iU0RFIFNleCI="
}
]
}