{
  "resourceType" : "StructureMap",
  "id" : "ExtractOpticalPrescription",
  "text" : {
    "status" : "generated",
    "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p class=\"res-header-id\"><b>Generated Narrative: StructureMap ExtractOpticalPrescription</b></p><a name=\"ExtractOpticalPrescription\"> </a><a name=\"hcExtractOpticalPrescription\"> </a><pre class=\"fml\">\r\n<span style=\"color: #cc00cc\">/// <b>url</b> = </span><span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/StructureMap/ExtractOpticalPrescription'</span>\r\n<span style=\"color: #cc00cc\">/// <b>name</b> = </span><span style=\"color: blue\">'ExtractOpticalPrescription'</span>\r\n<span style=\"color: #cc00cc\">/// <b>title</b> = </span><span style=\"color: blue\">'Optical Prescription Extraction'</span>\r\n<span style=\"color: #cc00cc\">/// <b>status</b> = </span><span style=\"color: blue\">'active'</span>\r\n<span style=\"color: #cc00cc\">/// <b>description</b> = </span><span style=\"color: blue\">'The optical prescription out as one VisionPrescription plus one Observation per pupillary distance and visual acuity the prescriber wrote. VisionPrescription is the resource R5 defines for exactly this -- an authorization for the provision of glasses and/or contact lenses -- and it takes the powers: sphere, cylinder, axis and the reading addition for each eye, and the contact lens power, back curve, diameter, brand, colour and wear period. It has no element for pupillary distance or visual acuity, and LOINC names both on a glasses lens prescription per eye at distance and near, so those become LOINC-coded Observations rather than notes. Lens type and coating, which VisionPrescription also cannot code, go into lensSpecification.note, which R5 defines as notes for special requirements such as coatings and lens materials.'</span>\r\n\r\n<b>uses</b><span style=\"color: navy\"> &quot;</span><a href=\"http://hl7.org/fhir/R5/questionnaireresponse.html\" title=\"QuestionnaireResponse\">http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse</a><span style=\"color: navy\">&quot; </span><b>alias </b>QR <b>as </b><b>source</b>\r\n<b>uses</b><span style=\"color: navy\"> &quot;</span><a href=\"http://hl7.org/fhir/R5/bundle.html\" title=\"Bundle\">http://hl7.org/fhir/StructureDefinition/Bundle</a><span style=\"color: navy\">&quot; </span><b>alias </b>Bundle <b>as </b><b>target</b>\r\n<b>uses</b><span style=\"color: navy\"> &quot;</span><a href=\"http://hl7.org/fhir/R5/visionprescription.html\" title=\"VisionPrescription\">http://hl7.org/fhir/StructureDefinition/VisionPrescription</a><span style=\"color: navy\">&quot; </span><b>alias </b>VisionPrescription <b>as </b><b>target</b>\r\n<b>uses</b><span style=\"color: navy\"> &quot;</span><a href=\"http://hl7.org/fhir/R5/observation.html\" title=\"Observation\">http://hl7.org/fhir/StructureDefinition/Observation</a><span style=\"color: navy\">&quot; </span><b>alias </b>Observation <b>as </b><b>target</b>\r\n\r\n<b>group </b>ExtractOpticalPrescription<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">bundle</span><span style=\"color: navy\"> : </span>Bundle<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  qr<span style=\"color: navy\"><b> -&gt; </b></span>bundle.type = <span style=\"color: blue\">'transaction'</span> <i>&quot;setBundleType&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">The prescription itself, created only when every element VisionPrescription</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">makes 1..1 can be filled from the response -- not bent to fit:</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">lensSpecification  at least one lens power. The patterns are every power</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">item on the form -- the eyewear distance and near rows,</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">the reading addition and the contact lens rows -- and</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">deliberately not the pupillary distance or the visual</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">acuity, which are measurements and extract on their own</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">below, nor the transposed rows, which are the same</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">prescription computed the other way round.</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">patient            the response's subject, when it is a Patient.</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">dateWritten,       the response's authored. The form does not ask for a</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">created            date; the client stamps it.</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">prescriber         the response's author (else source) when it is a</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Practitioner or a PractitionerRole. The form does not</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">ask who; the client stamps the practitioner recording</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">it.</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">A response short of any of these extracts no VisionPrescription. That is</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">the rule held rather than worked round: the alternative is a prescription</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">stored without a prescriber, or with one invented. The pupillary distances</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">and visual acuities still extract, because they need none of it.</span>\r\n  qr<b> where </b><span style=\"color: navy\">(</span>(repeat(item).where(linkId.matches('^(eyewear|contact-lens)/(right|left)/((distance|near)/)?(sph|cyl|add|power|base-curve|diameter)$')).answer.value.ofType(decimal).exists() or repeat(item).where(linkId.matches('^(eyewear|contact-lens)/(right|left)/((distance|near)/)?axis$')).answer.value.ofType(integer).exists()) and subject.where(reference.matches('(^|/)Patient/[^/]+$')).exists() and authored.exists() and (author.where(reference.matches('(^|/)(Practitioner|PractitionerRole)/[^/]+$')).exists() or source.where(reference.matches('(^|/)(Practitioner|PractitionerRole)/[^/]+$')).exists())<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'VisionPrescription'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">vp</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    qr<span style=\"color: navy\"><b> -&gt; </b></span> vp<span style=\"color: navy\">, </span> entry<b> then </b>BuildVisionPrescriptionBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">vp</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>&quot;base&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span>vp<b> then </b>SetPrescriber<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">vp</span><span style=\"color: navy\">)</span> <i>&quot;prescriber&quot;</i><span style=\"color: navy\">;</span>\r\n    qr.item<b> as </b><span style=\"color: maroon\">ew</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'eyewear'<span style=\"color: navy\">)</span><b> then </b>SpectacleLenses<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">ew</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">vp</span><span style=\"color: navy\">)</span> <i>&quot;eyewear&quot;</i><span style=\"color: navy\">;</span>\r\n    qr.item<b> as </b><span style=\"color: maroon\">cl</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'contact-lens'<span style=\"color: navy\">)</span><b> then </b>ContactLenses<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">cl</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">vp</span><span style=\"color: navy\">)</span> <i>&quot;contactLens&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;prescription&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Pupillary distance and visual acuity, one Observation each. These extract</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">whether or not there is a prescription: a PD taken for a frame fitting is</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">worth keeping on its own.</span>\r\n  qr.item<b> as </b><span style=\"color: maroon\">ew</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'eyewear'<span style=\"color: navy\">)</span><b> then </b>EyewearMeasurements<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">ew</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">bundle</span><span style=\"color: navy\">)</span> <i>&quot;measurements&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">The prescription</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<b>group </b>BuildVisionPrescriptionBase<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">vp</span><span style=\"color: navy\"> : </span>VisionPrescription, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  qr<span style=\"color: navy\"><b> -&gt; </b></span>vp<b> then </b>SetResponseProvenance<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">vp</span><span style=\"color: navy\">)</span> <i>&quot;responseProvenance&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>vp.id = <b>uuid</b><span style=\"color: navy\">(</span><span style=\"color: navy\">)</span><b> then </b>SetVisionPrescriptionFullUrl<span style=\"color: navy\">(</span><span style=\"color: maroon\">vp</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>&quot;idAndFullUrl&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>entry.request<b> as </b><span style=\"color: maroon\">request</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    qr<span style=\"color: navy\"><b> -&gt; </b></span>request.method = <span style=\"color: blue\">'POST'</span> <i>&quot;requestMethod&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span>request.url = <span style=\"color: blue\">'VisionPrescription'</span> <i>&quot;requestUrl&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;entryRequest&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">`active`: a prescription recorded on this form is one somebody is about to</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">dispense against. fm-status has no `completed`.</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>vp.status = <span style=\"color: blue\">'active'</span> <i>&quot;status&quot;</i><span style=\"color: navy\">;</span>\r\n  qr.subject<b> as </b><span style=\"color: maroon\">s</span><b> where </b><span style=\"color: navy\">(</span>(reference.exists() and (reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient')))<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>vp.patient = <span style=\"color: maroon\">s</span> <i>&quot;patient&quot;</i><span style=\"color: navy\">;</span>\r\n  qr.encounter<b> as </b><span style=\"color: maroon\">e</span><b> where </b><span style=\"color: navy\">(</span>(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>vp.encounter = <span style=\"color: maroon\">e</span><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Both dates, 1..1 each, are the response's `authored`. The form does not ask</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">for a prescription date: the client stamps the moment it was recorded, and</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">that is when this prescription was written and when this record was made.</span>\r\n  qr.authored<b> as </b><span style=\"color: maroon\">t</span><span style=\"color: navy\"><b> -&gt; </b></span>vp.dateWritten = <span style=\"color: maroon\">t</span> <i>&quot;dateWritten&quot;</i><span style=\"color: navy\">;</span>\r\n  qr.authored<b> as </b><span style=\"color: maroon\">t</span><span style=\"color: navy\"><b> -&gt; </b></span>vp.created = <span style=\"color: maroon\">t</span> <i>&quot;created&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">The prescriber is 1..1, and the form does not ask for one. It is the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">practitioner who recorded the prescription, which the client stamps on the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">response as `author`; `source` is taken when there is no author. Either is</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">copied across only when it points at a Practitioner or a PractitionerRole --</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">the two types VisionPrescription.prescriber allows -- because `author` may</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">also name a Device, a Patient or an Organization.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Nothing is guessed when neither qualifies: the rule that creates the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">prescription is guarded on one of them, so this group always finds one.</span>\r\n<b>group </b>SetPrescriber<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">vp</span><span style=\"color: navy\"> : </span>VisionPrescription<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  qr.author<b> as </b><span style=\"color: maroon\">a</span><b> where </b><span style=\"color: navy\">(</span>(reference.matches('(^|/)(Practitioner|PractitionerRole)/[^/]+$')) and ((reference.exists() and (reference.startsWith('Practitioner/') or reference.startsWith('PractitionerRole/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Practitioner') or ('/' + type).endsWith('/PractitionerRole'))))<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>vp.prescriber = <span style=\"color: maroon\">a</span> <i>&quot;prescriberFromAuthor&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<b> where </b><span style=\"color: navy\">(</span>author.where(((reference.exists() and (reference.startsWith('Practitioner/') or reference.startsWith('PractitionerRole/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Practitioner') or ('/' + type).endsWith('/PractitionerRole'))))).exists().not()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    qr.source<b> as </b><span style=\"color: maroon\">s</span><b> where </b><span style=\"color: navy\">(</span>(reference.matches('(^|/)(Practitioner|PractitionerRole)/[^/]+$')) and ((reference.exists() and (reference.startsWith('Practitioner/') or reference.startsWith('PractitionerRole/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Practitioner') or ('/' + type).endsWith('/PractitionerRole'))))<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>vp.prescriber = <span style=\"color: maroon\">s</span> <i>&quot;prescriberFromSource&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;sourceFallback&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">── Spectacle lenses ─────────────────────────────────────────────────────────</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Up to two lens specifications per eye, one per row the prescriber filled in.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">The distance specification carries the distance vision (DV) row and the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">reading addition. That is the shape R5 itself uses for a spectacle</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">prescription -- one specification per eye with the distance powers and</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">`add` -- so a consumer that reads only that one still gets a complete</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">multifocal prescription.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">The near specification carries the near vision (NV) row, when one was</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">written. It is not derived from DV + ADD and it is not dropped when an ADD is</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">present: the prescriber wrote it, and for reading glasses it is the whole</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">prescription. The two cannot be told apart by any element R5 gives a lens</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">specification, so `product` carries HL7's `lens` beside the local</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">`spectacle-lens-distance` or `spectacle-lens-near` -- the same product at a</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">finer grain, which the example-strength binding allows.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">linkIds are matched by suffix inside an eye, so the two eyes share one set</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">of groups. The eye code is set by the caller, which is the only place that</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">knows which eye it is in.</span>\r\n<b>group </b>SpectacleLenses<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>source</b> <span style=\"color: maroon\">ew</span>, <b>target</b> <span style=\"color: maroon\">vp</span><span style=\"color: navy\"> : </span>VisionPrescription<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  ew.item<b> as </b><span style=\"color: maroon\">eye</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'eyewear/right'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    eye<b> where </b><span style=\"color: navy\">(</span>item.where(linkId.endsWith('/distance')).item.where(linkId.endsWith('/sph') or linkId.endsWith('/cyl')).answer.value.ofType(decimal).exists() or item.where(linkId.endsWith('/distance')).item.where(linkId.endsWith('/axis')).answer.value.ofType(integer).exists() or item.where(linkId.endsWith('/add')).answer.value.ofType(decimal).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>vp.lensSpecification<b> as </b><span style=\"color: maroon\">spec</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      eye<span style=\"color: navy\"><b> -&gt; </b></span>spec<b> then </b>DistanceSpectacleLens<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">ew</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">eye</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span> <i>&quot;lens&quot;</i><span style=\"color: navy\">;</span>\r\n      eye<span style=\"color: navy\"><b> -&gt; </b></span>spec.eye = <span style=\"color: blue\">'right'</span> <i>&quot;eyeCode&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;rightDistance&quot;</i><span style=\"color: navy\">;</span>\r\n    eye<b> where </b><span style=\"color: navy\">(</span>item.where(linkId.endsWith('/near')).item.where(linkId.endsWith('/sph') or linkId.endsWith('/cyl')).answer.value.ofType(decimal).exists() or item.where(linkId.endsWith('/near')).item.where(linkId.endsWith('/axis')).answer.value.ofType(integer).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>vp.lensSpecification<b> as </b><span style=\"color: maroon\">spec</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      eye<span style=\"color: navy\"><b> -&gt; </b></span>spec<b> then </b>NearSpectacleLens<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">ew</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">eye</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span> <i>&quot;lens&quot;</i><span style=\"color: navy\">;</span>\r\n      eye<span style=\"color: navy\"><b> -&gt; </b></span>spec.eye = <span style=\"color: blue\">'right'</span> <i>&quot;eyeCode&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;rightNear&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;right&quot;</i><span style=\"color: navy\">;</span>\r\n  ew.item<b> as </b><span style=\"color: maroon\">eye</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'eyewear/left'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    eye<b> where </b><span style=\"color: navy\">(</span>item.where(linkId.endsWith('/distance')).item.where(linkId.endsWith('/sph') or linkId.endsWith('/cyl')).answer.value.ofType(decimal).exists() or item.where(linkId.endsWith('/distance')).item.where(linkId.endsWith('/axis')).answer.value.ofType(integer).exists() or item.where(linkId.endsWith('/add')).answer.value.ofType(decimal).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>vp.lensSpecification<b> as </b><span style=\"color: maroon\">spec</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      eye<span style=\"color: navy\"><b> -&gt; </b></span>spec<b> then </b>DistanceSpectacleLens<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">ew</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">eye</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span> <i>&quot;lens&quot;</i><span style=\"color: navy\">;</span>\r\n      eye<span style=\"color: navy\"><b> -&gt; </b></span>spec.eye = <span style=\"color: blue\">'left'</span> <i>&quot;eyeCode&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;leftDistance&quot;</i><span style=\"color: navy\">;</span>\r\n    eye<b> where </b><span style=\"color: navy\">(</span>item.where(linkId.endsWith('/near')).item.where(linkId.endsWith('/sph') or linkId.endsWith('/cyl')).answer.value.ofType(decimal).exists() or item.where(linkId.endsWith('/near')).item.where(linkId.endsWith('/axis')).answer.value.ofType(integer).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>vp.lensSpecification<b> as </b><span style=\"color: maroon\">spec</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      eye<span style=\"color: navy\"><b> -&gt; </b></span>spec<b> then </b>NearSpectacleLens<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">ew</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">eye</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span> <i>&quot;lens&quot;</i><span style=\"color: navy\">;</span>\r\n      eye<span style=\"color: navy\"><b> -&gt; </b></span>spec.eye = <span style=\"color: blue\">'left'</span> <i>&quot;eyeCode&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;leftNear&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;left&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>DistanceSpectacleLens<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>source</b> <span style=\"color: maroon\">ew</span>, <b>source</b> <span style=\"color: maroon\">eye</span>, <b>target</b> <span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  eye<span style=\"color: navy\"><b> -&gt; </b></span>spec.product<b> as </b><span style=\"color: maroon\">product</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    eye<span style=\"color: navy\"><b> -&gt; </b></span>product.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/ex-visionprescriptionproduct'</span> <i>&quot;hl7System&quot;</i><span style=\"color: navy\">;</span>\r\n      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'lens'</span> <i>&quot;hl7Code&quot;</i><span style=\"color: navy\">;</span>\r\n      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Lens'</span> <i>&quot;hl7Display&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;hl7Coding&quot;</i><span style=\"color: navy\">;</span>\r\n    eye<span style=\"color: navy\"><b> -&gt; </b></span>product.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>&quot;rowSystem&quot;</i><span style=\"color: navy\">;</span>\r\n      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'spectacle-lens-distance'</span> <i>&quot;rowCode&quot;</i><span style=\"color: navy\">;</span>\r\n      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Spectacle lens for distance vision'</span> <i>&quot;rowDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;rowCoding&quot;</i><span style=\"color: navy\">;</span>\r\n    eye<span style=\"color: navy\"><b> -&gt; </b></span>product.text = <span style=\"color: blue\">'Spectacle lens — distance vision (DV)'</span> <i>&quot;productText&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;product&quot;</i><span style=\"color: navy\">;</span>\r\n  eye.item<b> as </b><span style=\"color: maroon\">row</span><b> where </b><span style=\"color: navy\">(</span>linkId.endsWith('/distance')<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    row<span style=\"color: navy\"><b> -&gt; </b></span>spec<b> then </b>LensPowers<span style=\"color: navy\">(</span><span style=\"color: maroon\">row</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span> <i>&quot;powers&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;distanceRow&quot;</i><span style=\"color: navy\">;</span>\r\n  eye.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId.endsWith('/add') and answer.value.ofType(decimal).exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.add = <span style=\"color: maroon\">v</span> <i>&quot;addValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;addAnswer&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;addition&quot;</i><span style=\"color: navy\">;</span>\r\n  ew<span style=\"color: navy\"><b> -&gt; </b></span>spec<b> then </b>SpectacleLensNotes<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">ew</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span> <i>&quot;notes&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>NearSpectacleLens<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>source</b> <span style=\"color: maroon\">ew</span>, <b>source</b> <span style=\"color: maroon\">eye</span>, <b>target</b> <span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  eye<span style=\"color: navy\"><b> -&gt; </b></span>spec.product<b> as </b><span style=\"color: maroon\">product</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    eye<span style=\"color: navy\"><b> -&gt; </b></span>product.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/ex-visionprescriptionproduct'</span> <i>&quot;hl7System&quot;</i><span style=\"color: navy\">;</span>\r\n      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'lens'</span> <i>&quot;hl7Code&quot;</i><span style=\"color: navy\">;</span>\r\n      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Lens'</span> <i>&quot;hl7Display&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;hl7Coding&quot;</i><span style=\"color: navy\">;</span>\r\n    eye<span style=\"color: navy\"><b> -&gt; </b></span>product.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.system = <span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem'</span> <i>&quot;rowSystem&quot;</i><span style=\"color: navy\">;</span>\r\n      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'spectacle-lens-near'</span> <i>&quot;rowCode&quot;</i><span style=\"color: navy\">;</span>\r\n      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Spectacle lens for near vision'</span> <i>&quot;rowDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;rowCoding&quot;</i><span style=\"color: navy\">;</span>\r\n    eye<span style=\"color: navy\"><b> -&gt; </b></span>product.text = <span style=\"color: blue\">'Spectacle lens — near vision (NV)'</span> <i>&quot;productText&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;product&quot;</i><span style=\"color: navy\">;</span>\r\n  eye.item<b> as </b><span style=\"color: maroon\">row</span><b> where </b><span style=\"color: navy\">(</span>linkId.endsWith('/near')<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    row<span style=\"color: navy\"><b> -&gt; </b></span>spec<b> then </b>LensPowers<span style=\"color: navy\">(</span><span style=\"color: maroon\">row</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span> <i>&quot;powers&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;nearRow&quot;</i><span style=\"color: navy\">;</span>\r\n  ew<span style=\"color: navy\"><b> -&gt; </b></span>spec<b> then </b>SpectacleLensNotes<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">ew</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span> <i>&quot;notes&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">Sphere, cylinder and axis off one row. Typed guards, because a rule that</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">assigns an answer of the wrong type to a decimal element does not skip -- it</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">fails the whole extraction.</span>\r\n<b>group </b>LensPowers<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">row</span>, <b>target</b> <span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  row.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId.endsWith('/sph') and answer.value.ofType(decimal).exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.sphere = <span style=\"color: maroon\">v</span> <i>&quot;sphereValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;sphereAnswer&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;sphere&quot;</i><span style=\"color: navy\">;</span>\r\n  row.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId.endsWith('/cyl') and answer.value.ofType(decimal).exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.cylinder = <span style=\"color: maroon\">v</span> <i>&quot;cylinderValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;cylinderAnswer&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;cylinder&quot;</i><span style=\"color: navy\">;</span>\r\n  row.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId.endsWith('/axis') and answer.value.ofType(integer).exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.axis = <span style=\"color: maroon\">v</span> <i>&quot;axisValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;axisAnswer&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;axis&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">Lens type and coating, as the words the prescriber ticked. VisionPrescription</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">has no coded element for either; `note` is where R5 says they go (&quot;notes for</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">special requirements such as coatings and lens materials&quot;), and the codes</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">themselves stay on the response. Both go on every spectacle specification,</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">because the paper ticks them once for the pair.</span>\r\n<b>group </b>SpectacleLensNotes<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>source</b> <span style=\"color: maroon\">ew</span>, <b>target</b> <span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  ew.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'eyewear/lens-types') and answer.value.ofType(Coding).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.note<b> as </b><span style=\"color: maroon\">note</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it<span style=\"color: navy\"><b> -&gt; </b></span>note.text = evaluate<span style=\"color: navy\">(</span>it<span style=\"color: navy\">, </span>'Lens type: ' &amp; answer.value.ofType(Coding).select(iif(display.exists(), display, code)).join(', ')<span style=\"color: navy\">)</span> <i>&quot;lensTypeText&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;lensTypes&quot;</i><span style=\"color: navy\">;</span>\r\n  ew.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'eyewear/lens-coating') and answer.value.ofType(Coding).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.note<b> as </b><span style=\"color: maroon\">note</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it<span style=\"color: navy\"><b> -&gt; </b></span>note.text = evaluate<span style=\"color: navy\">(</span>it<span style=\"color: navy\">, </span>'Lens coating: ' &amp; answer.value.ofType(Coding).select(iif(display.exists(), display, code)).join(', ')<span style=\"color: navy\">)</span> <i>&quot;lensCoatingText&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;lensCoating&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>spec<b> then </b>PrescriptionNotes<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span> <i>&quot;prescriptionNotes&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">The free-text prescription notes. VisionPrescription has no note of its own,</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">only one per lens specification, so the notes go on each specification --</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">repeated rather than put on whichever happens to be first, which a consumer</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">reading one eye would miss.</span>\r\n<b>group </b>PrescriptionNotes<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  qr.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'notes') and answer.value.ofType(string).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.note<b> as </b><span style=\"color: maroon\">note</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>note.text = <span style=\"color: maroon\">v</span> <i>&quot;noteText&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;noteAnswer&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;notes&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">── Contact lenses ───────────────────────────────────────────────────────────</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">One specification per eye with anything written on it. The contact lens</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">power goes to `power`, R5's &quot;contact lens power&quot;, which is what its own</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">contact lens example uses; `sphere` stays the spectacle lens power. Brand,</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">colour and the replacement schedule are asked once for the pair and copied</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">onto both eyes, because R5 holds them per specification.</span>\r\n<b>group </b>ContactLenses<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>source</b> <span style=\"color: maroon\">cl</span>, <b>target</b> <span style=\"color: maroon\">vp</span><span style=\"color: navy\"> : </span>VisionPrescription<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  cl.item<b> as </b><span style=\"color: maroon\">eye</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'contact-lens/right') and (item.answer.value.ofType(decimal).exists() or item.answer.value.ofType(integer).exists())<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>vp.lensSpecification<b> as </b><span style=\"color: maroon\">spec</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    eye<span style=\"color: navy\"><b> -&gt; </b></span>spec<b> then </b>ContactLens<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">cl</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">eye</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span> <i>&quot;lens&quot;</i><span style=\"color: navy\">;</span>\r\n    eye<span style=\"color: navy\"><b> -&gt; </b></span>spec.eye = <span style=\"color: blue\">'right'</span> <i>&quot;eyeCode&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;right&quot;</i><span style=\"color: navy\">;</span>\r\n  cl.item<b> as </b><span style=\"color: maroon\">eye</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'contact-lens/left') and (item.answer.value.ofType(decimal).exists() or item.answer.value.ofType(integer).exists())<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>vp.lensSpecification<b> as </b><span style=\"color: maroon\">spec</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    eye<span style=\"color: navy\"><b> -&gt; </b></span>spec<b> then </b>ContactLens<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">cl</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">eye</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span> <i>&quot;lens&quot;</i><span style=\"color: navy\">;</span>\r\n    eye<span style=\"color: navy\"><b> -&gt; </b></span>spec.eye = <span style=\"color: blue\">'left'</span> <i>&quot;eyeCode&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;left&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>ContactLens<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>source</b> <span style=\"color: maroon\">cl</span>, <b>source</b> <span style=\"color: maroon\">eye</span>, <b>target</b> <span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  eye<span style=\"color: navy\"><b> -&gt; </b></span>spec.product<b> as </b><span style=\"color: maroon\">product</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    eye<span style=\"color: navy\"><b> -&gt; </b></span>product.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/ex-visionprescriptionproduct'</span> <i>&quot;hl7System&quot;</i><span style=\"color: navy\">;</span>\r\n      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'contact'</span> <i>&quot;hl7Code&quot;</i><span style=\"color: navy\">;</span>\r\n      eye<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Contact Lens'</span> <i>&quot;hl7Display&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;hl7Coding&quot;</i><span style=\"color: navy\">;</span>\r\n    eye<span style=\"color: navy\"><b> -&gt; </b></span>product.text = <span style=\"color: blue\">'Contact lens'</span> <i>&quot;productText&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;product&quot;</i><span style=\"color: navy\">;</span>\r\n  eye.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId.endsWith('/power') and answer.value.ofType(decimal).exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.power = <span style=\"color: maroon\">v</span> <i>&quot;powerValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;powerAnswer&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;power&quot;</i><span style=\"color: navy\">;</span>\r\n  eye.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId.endsWith('/cyl') and answer.value.ofType(decimal).exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.cylinder = <span style=\"color: maroon\">v</span> <i>&quot;cylinderValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;cylinderAnswer&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;cylinder&quot;</i><span style=\"color: navy\">;</span>\r\n  eye.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId.endsWith('/axis') and answer.value.ofType(integer).exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.axis = <span style=\"color: maroon\">v</span> <i>&quot;axisValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;axisAnswer&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;axis&quot;</i><span style=\"color: navy\">;</span>\r\n  eye.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId.endsWith('/add') and answer.value.ofType(decimal).exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.add = <span style=\"color: maroon\">v</span> <i>&quot;addValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;addAnswer&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;addition&quot;</i><span style=\"color: navy\">;</span>\r\n  eye.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId.endsWith('/base-curve') and answer.value.ofType(decimal).exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.backCurve = <span style=\"color: maroon\">v</span> <i>&quot;backCurveValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;backCurveAnswer&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;backCurve&quot;</i><span style=\"color: navy\">;</span>\r\n  eye.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>linkId.endsWith('/diameter') and answer.value.ofType(decimal).exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.diameter = <span style=\"color: maroon\">v</span> <i>&quot;diameterValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;diameterAnswer&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;diameter&quot;</i><span style=\"color: navy\">;</span>\r\n  cl.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'contact-lens/brand') and answer.value.ofType(string).exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.brand = <span style=\"color: maroon\">v</span> <i>&quot;brandValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;brandAnswer&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;brand&quot;</i><span style=\"color: navy\">;</span>\r\n  cl.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'contact-lens/colour') and answer.value.ofType(string).exists()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.color = <span style=\"color: maroon\">v</span> <i>&quot;colourValue&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;colourAnswer&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;colour&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">The replacement schedule is R5's `duration`, &quot;the recommended maximum wear</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">period for the lens&quot;, as a UCUM Quantity. One rule per answer, each guarded</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">on its own code, so an answer this map does not know writes no duration</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">rather than an empty Quantity.</span>\r\n  cl.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'contact-lens/replacement') and (answer.value.ofType(Coding).code = 'contact-lens-replace-daily')<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.duration<b> as </b><span style=\"color: maroon\">d</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it<span style=\"color: navy\"><b> -&gt; </b></span>d.value = <span style=\"color: blue\">1</span> <i>&quot;value&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.unit = <span style=\"color: blue\">'day'</span> <i>&quot;unit&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.system = <span style=\"color: blue\">'http://unitsofmeasure.org'</span> <i>&quot;system&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.code = <span style=\"color: blue\">'d'</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;daily&quot;</i><span style=\"color: navy\">;</span>\r\n  cl.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'contact-lens/replacement') and (answer.value.ofType(Coding).code = 'contact-lens-replace-two-weekly')<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.duration<b> as </b><span style=\"color: maroon\">d</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it<span style=\"color: navy\"><b> -&gt; </b></span>d.value = <span style=\"color: blue\">2</span> <i>&quot;value&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.unit = <span style=\"color: blue\">'weeks'</span> <i>&quot;unit&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.system = <span style=\"color: blue\">'http://unitsofmeasure.org'</span> <i>&quot;system&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.code = <span style=\"color: blue\">'wk'</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;twoWeekly&quot;</i><span style=\"color: navy\">;</span>\r\n  cl.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'contact-lens/replacement') and (answer.value.ofType(Coding).code = 'contact-lens-replace-monthly')<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.duration<b> as </b><span style=\"color: maroon\">d</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it<span style=\"color: navy\"><b> -&gt; </b></span>d.value = <span style=\"color: blue\">1</span> <i>&quot;value&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.unit = <span style=\"color: blue\">'month'</span> <i>&quot;unit&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.system = <span style=\"color: blue\">'http://unitsofmeasure.org'</span> <i>&quot;system&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.code = <span style=\"color: blue\">'mo'</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;monthly&quot;</i><span style=\"color: navy\">;</span>\r\n  cl.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'contact-lens/replacement') and (answer.value.ofType(Coding).code = 'contact-lens-replace-quarterly')<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.duration<b> as </b><span style=\"color: maroon\">d</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it<span style=\"color: navy\"><b> -&gt; </b></span>d.value = <span style=\"color: blue\">3</span> <i>&quot;value&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.unit = <span style=\"color: blue\">'months'</span> <i>&quot;unit&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.system = <span style=\"color: blue\">'http://unitsofmeasure.org'</span> <i>&quot;system&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.code = <span style=\"color: blue\">'mo'</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;quarterly&quot;</i><span style=\"color: navy\">;</span>\r\n  cl.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'contact-lens/replacement') and (answer.value.ofType(Coding).code = 'contact-lens-replace-yearly')<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>spec.duration<b> as </b><span style=\"color: maroon\">d</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    it<span style=\"color: navy\"><b> -&gt; </b></span>d.value = <span style=\"color: blue\">1</span> <i>&quot;value&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.unit = <span style=\"color: blue\">'year'</span> <i>&quot;unit&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.system = <span style=\"color: blue\">'http://unitsofmeasure.org'</span> <i>&quot;system&quot;</i><span style=\"color: navy\">;</span>\r\n    it<span style=\"color: navy\"><b> -&gt; </b></span>d.code = <span style=\"color: blue\">'a'</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;yearly&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>spec<b> then </b>PrescriptionNotes<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">spec</span><span style=\"color: navy\">)</span> <i>&quot;prescriptionNotes&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Pupillary distance and visual acuity</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Neither has a home in VisionPrescription, and LOINC names both exactly, per</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">eye, on a glasses lens prescription -- so each is its own Observation under</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">its own code rather than prose in a note. The codes were looked up, not</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">assumed; each display below is LOINC's own:</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">distance (DV)            near (NV)</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">R-PD       28840-7                  28841-5       mm</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">L-PD       28857-1                  55985-6       mm</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">R-VA       28831-6                  28839-9       as written</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">L-VA       28847-2                  28856-3       as written</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">The PD without a qualifier is LOINC's distance PD; near is the one it</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">qualifies. Visual acuity is kept as the string the prescriber wrote -- 6/6,</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">6/9, N6, CF -- because the notations mix Snellen fractions, N-point print</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">sizes and counting fingers, and forcing them into a Ratio would lose the ones</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">that are not fractions.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Nothing on VisionPrescription can point at these. They are tied to it by the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">encounter, by `derivedFrom` naming the same response, and by the same</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">provenance tag.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<b>group </b>EyewearMeasurements<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>source</b> <span style=\"color: maroon\">ew</span>, <b>target</b> <span style=\"color: maroon\">bundle</span><span style=\"color: navy\"> : </span>Bundle<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  ew.item<b> as </b><span style=\"color: maroon\">eye</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'eyewear/right'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    eye.item<b> as </b><span style=\"color: maroon\">row</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'eyewear/right/distance'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      row.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'eyewear/right/distance/pd') and answer.value.ofType(decimal).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Observation'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">obs</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        qr<span style=\"color: navy\"><b> -&gt; </b></span> obs<span style=\"color: navy\">, </span> entry<b> then </b>BuildObservationBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>&quot;base&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          it<span style=\"color: navy\"><b> -&gt; </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span>            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>&quot;system&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'28840-7'</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Right glasses lens prescription Pupillary distance.monocular'</span> <i>&quot;display&quot;</i><span style=\"color: navy\">;</span>\r\n          <span style=\"color: navy\">}</span> <i>&quot;coding&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Right eye pupillary distance, distance vision (R-PD, DV)'</span> <i>&quot;text&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs<b> then </b>SetMillimetres<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>&quot;value&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;rightDistancePd&quot;</i><span style=\"color: navy\">;</span>\r\n      row.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'eyewear/right/distance/va') and answer.value.ofType(string).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Observation'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">obs</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        qr<span style=\"color: navy\"><b> -&gt; </b></span> obs<span style=\"color: navy\">, </span> entry<b> then </b>BuildObservationBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>&quot;base&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          it<span style=\"color: navy\"><b> -&gt; </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span>            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>&quot;system&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'28831-6'</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Right glasses lens prescription Visual acuity far'</span> <i>&quot;display&quot;</i><span style=\"color: navy\">;</span>\r\n          <span style=\"color: navy\">}</span> <i>&quot;coding&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Right eye visual acuity, distance vision (R-VA, DV)'</span> <i>&quot;text&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs<b> then </b>SetAcuity<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>&quot;value&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;rightDistanceVa&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;rightDistance&quot;</i><span style=\"color: navy\">;</span>\r\n    eye.item<b> as </b><span style=\"color: maroon\">row</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'eyewear/right/near'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      row.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'eyewear/right/near/pd') and answer.value.ofType(decimal).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Observation'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">obs</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        qr<span style=\"color: navy\"><b> -&gt; </b></span> obs<span style=\"color: navy\">, </span> entry<b> then </b>BuildObservationBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>&quot;base&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          it<span style=\"color: navy\"><b> -&gt; </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span>            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>&quot;system&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'28841-5'</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Right glasses lens prescription Pupillary distance.monocular near'</span> <i>&quot;display&quot;</i><span style=\"color: navy\">;</span>\r\n          <span style=\"color: navy\">}</span> <i>&quot;coding&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Right eye pupillary distance, near vision (R-PD, NV)'</span> <i>&quot;text&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs<b> then </b>SetMillimetres<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>&quot;value&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;rightNearPd&quot;</i><span style=\"color: navy\">;</span>\r\n      row.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'eyewear/right/near/va') and answer.value.ofType(string).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Observation'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">obs</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        qr<span style=\"color: navy\"><b> -&gt; </b></span> obs<span style=\"color: navy\">, </span> entry<b> then </b>BuildObservationBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>&quot;base&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          it<span style=\"color: navy\"><b> -&gt; </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span>            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>&quot;system&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'28839-9'</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Right glasses lens prescription Visual acuity near'</span> <i>&quot;display&quot;</i><span style=\"color: navy\">;</span>\r\n          <span style=\"color: navy\">}</span> <i>&quot;coding&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Right eye visual acuity, near vision (R-VA, NV)'</span> <i>&quot;text&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs<b> then </b>SetAcuity<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>&quot;value&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;rightNearVa&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;rightNear&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;right&quot;</i><span style=\"color: navy\">;</span>\r\n  ew.item<b> as </b><span style=\"color: maroon\">eye</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'eyewear/left'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    eye.item<b> as </b><span style=\"color: maroon\">row</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'eyewear/left/distance'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      row.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'eyewear/left/distance/pd') and answer.value.ofType(decimal).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Observation'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">obs</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        qr<span style=\"color: navy\"><b> -&gt; </b></span> obs<span style=\"color: navy\">, </span> entry<b> then </b>BuildObservationBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>&quot;base&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          it<span style=\"color: navy\"><b> -&gt; </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span>            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>&quot;system&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'28857-1'</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Left glasses lens prescription Pupillary distance.monocular'</span> <i>&quot;display&quot;</i><span style=\"color: navy\">;</span>\r\n          <span style=\"color: navy\">}</span> <i>&quot;coding&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Left eye pupillary distance, distance vision (L-PD, DV)'</span> <i>&quot;text&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs<b> then </b>SetMillimetres<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>&quot;value&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;leftDistancePd&quot;</i><span style=\"color: navy\">;</span>\r\n      row.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'eyewear/left/distance/va') and answer.value.ofType(string).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Observation'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">obs</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        qr<span style=\"color: navy\"><b> -&gt; </b></span> obs<span style=\"color: navy\">, </span> entry<b> then </b>BuildObservationBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>&quot;base&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          it<span style=\"color: navy\"><b> -&gt; </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span>            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>&quot;system&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'28847-2'</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Left glasses lens prescription Visual acuity far'</span> <i>&quot;display&quot;</i><span style=\"color: navy\">;</span>\r\n          <span style=\"color: navy\">}</span> <i>&quot;coding&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Left eye visual acuity, distance vision (L-VA, DV)'</span> <i>&quot;text&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs<b> then </b>SetAcuity<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>&quot;value&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;leftDistanceVa&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;leftDistance&quot;</i><span style=\"color: navy\">;</span>\r\n    eye.item<b> as </b><span style=\"color: maroon\">row</span><b> where </b><span style=\"color: navy\">(</span>linkId = 'eyewear/left/near'<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      row.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'eyewear/left/near/pd') and answer.value.ofType(decimal).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Observation'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">obs</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        qr<span style=\"color: navy\"><b> -&gt; </b></span> obs<span style=\"color: navy\">, </span> entry<b> then </b>BuildObservationBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>&quot;base&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          it<span style=\"color: navy\"><b> -&gt; </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span>            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>&quot;system&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'55985-6'</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Left glasses lens prescription Pupillary distance.monocular near'</span> <i>&quot;display&quot;</i><span style=\"color: navy\">;</span>\r\n          <span style=\"color: navy\">}</span> <i>&quot;coding&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Left eye pupillary distance, near vision (L-PD, NV)'</span> <i>&quot;text&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs<b> then </b>SetMillimetres<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>&quot;value&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;leftNearPd&quot;</i><span style=\"color: navy\">;</span>\r\n      row.item<b> as </b><span style=\"color: maroon\">it</span><b> where </b><span style=\"color: navy\">(</span>(linkId = 'eyewear/left/near/va') and answer.value.ofType(string).exists()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span> bundle.entry<b> as </b><span style=\"color: maroon\">entry</span><span style=\"color: navy\">, </span> entry.resource = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Observation'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">obs</span><b> then</b><span style=\"color: navy\"> {\r\n</span>        qr<span style=\"color: navy\"><b> -&gt; </b></span> obs<span style=\"color: navy\">, </span> entry<b> then </b>BuildObservationBase<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>&quot;base&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs.code<b> as </b><span style=\"color: maroon\">code</span><b> then</b><span style=\"color: navy\"> {\r\n</span>          it<span style=\"color: navy\"><b> -&gt; </b></span>code.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span>            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://loinc.org'</span> <i>&quot;system&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'28856-3'</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n            it<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Left glasses lens prescription Visual acuity near'</span> <i>&quot;display&quot;</i><span style=\"color: navy\">;</span>\r\n          <span style=\"color: navy\">}</span> <i>&quot;coding&quot;</i><span style=\"color: navy\">;</span>\r\n          it<span style=\"color: navy\"><b> -&gt; </b></span>code.text = <span style=\"color: blue\">'Left eye visual acuity, near vision (L-VA, NV)'</span> <i>&quot;text&quot;</i><span style=\"color: navy\">;</span>\r\n        <span style=\"color: navy\">}</span> <i>&quot;code&quot;</i><span style=\"color: navy\">;</span>\r\n        it<span style=\"color: navy\"><b> -&gt; </b></span>obs<b> then </b>SetAcuity<span style=\"color: navy\">(</span><span style=\"color: maroon\">it</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>&quot;value&quot;</i><span style=\"color: navy\">;</span>\r\n      <span style=\"color: navy\">}</span> <i>&quot;leftNearVa&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;leftNear&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;left&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">`Observation.value[x]` has no decimal choice, so the PD is built as a UCUM</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Quantity. The unit is fixed by the form.</span>\r\n<b>group </b>SetMillimetres<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">it</span>, <b>target</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>obs.value = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Quantity'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">q</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      v<span style=\"color: navy\"><b> -&gt; </b></span>q.value = <span style=\"color: maroon\">v</span> <i>&quot;quantityValue&quot;</i><span style=\"color: navy\">;</span>\r\n      v<span style=\"color: navy\"><b> -&gt; </b></span>q.unit = <span style=\"color: blue\">'mm'</span> <i>&quot;quantityUnit&quot;</i><span style=\"color: navy\">;</span>\r\n      v<span style=\"color: navy\"><b> -&gt; </b></span>q.system = <span style=\"color: blue\">'http://unitsofmeasure.org'</span> <i>&quot;quantitySystem&quot;</i><span style=\"color: navy\">;</span>\r\n      v<span style=\"color: navy\"><b> -&gt; </b></span>q.code = <span style=\"color: blue\">'mm'</span> <i>&quot;quantityCode&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;quantity&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetAcuity<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">it</span>, <b>target</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation<span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  it.answer first<b> as </b><span style=\"color: maroon\">a</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    a.value<b> as </b><span style=\"color: maroon\">v</span><span style=\"color: navy\"><b> -&gt; </b></span>obs.value = <span style=\"color: maroon\">v</span> <i>&quot;acuityValue&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Shared scaffolding. Repeated in each map rather than imported: the transform</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">engine resolves `imports` against whatever StructureMaps happen to be on the</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">server, and a form that stops extracting because a shared map was not</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">uploaded is a worse failure than a duplicated group.</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">─────────────────────────────────────────────────────────────────────────────</span>\r\n<b>group </b>BuildObservationBase<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  qr<span style=\"color: navy\"><b> -&gt; </b></span>obs<b> then </b>SetResponseProvenance<span style=\"color: navy\">(</span><span style=\"color: maroon\">qr</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">)</span> <i>&quot;responseProvenance&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>obs.id = <b>uuid</b><span style=\"color: navy\">(</span><span style=\"color: navy\">)</span><b> then </b>SetObservationFullUrl<span style=\"color: navy\">(</span><span style=\"color: maroon\">obs</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span> <i>&quot;idAndFullUrl&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>entry.request<b> as </b><span style=\"color: maroon\">request</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    qr<span style=\"color: navy\"><b> -&gt; </b></span>request.method = <span style=\"color: blue\">'POST'</span> <i>&quot;requestMethod&quot;</i><span style=\"color: navy\">;</span>\r\n    qr<span style=\"color: navy\"><b> -&gt; </b></span>request.url = <span style=\"color: blue\">'Observation'</span> <i>&quot;requestUrl&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;entryRequest&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>obs.status = <span style=\"color: blue\">'final'</span> <i>&quot;status&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<span style=\"color: navy\"><b> -&gt; </b></span>obs.category<b> as </b><span style=\"color: maroon\">cat</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    qr<span style=\"color: navy\"><b> -&gt; </b></span>cat.coding<b> as </b><span style=\"color: maroon\">coding</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.system = <span style=\"color: blue\">'http://terminology.hl7.org/CodeSystem/observation-category'</span> <i>&quot;categorySystem&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.code = <span style=\"color: blue\">'exam'</span> <i>&quot;categoryCode&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>coding.display = <span style=\"color: blue\">'Exam'</span> <i>&quot;categoryDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;categoryCoding&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;category&quot;</i><span style=\"color: navy\">;</span>\r\n  qr.subject<b> as </b><span style=\"color: maroon\">s</span><b> where </b><span style=\"color: navy\">(</span>(reference.exists() and (reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient')))<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>obs.subject = <span style=\"color: maroon\">s</span><span style=\"color: navy\">;</span>\r\n  qr.encounter<b> as </b><span style=\"color: maroon\">e</span><b> where </b><span style=\"color: navy\">(</span>(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>obs.encounter = <span style=\"color: maroon\">e</span><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Measured when the prescription was written, which is the response's</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">`authored` -- the form does not ask for a date.</span>\r\n  qr.authored<b> as </b><span style=\"color: maroon\">t</span><span style=\"color: navy\"><b> -&gt; </b></span>obs.effective = <span style=\"color: maroon\">t</span> <i>&quot;effective&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">Measured by the prescriber, chosen the same way as on the prescription.</span>\r\n  qr.author<b> as </b><span style=\"color: maroon\">a</span><b> where </b><span style=\"color: navy\">(</span>(reference.matches('(^|/)(Practitioner|PractitionerRole)/[^/]+$')) and ((reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient'))))<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>obs.performer = <span style=\"color: maroon\">a</span> <i>&quot;performerFromAuthor&quot;</i><span style=\"color: navy\">;</span>\r\n  qr<b> where </b><span style=\"color: navy\">(</span>author.where(((reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient'))))).exists().not()<span style=\"color: navy\">)</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    qr.source<b> as </b><span style=\"color: maroon\">s</span><b> where </b><span style=\"color: navy\">(</span>(reference.matches('(^|/)(Practitioner|PractitionerRole)/[^/]+$')) and ((reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient'))))<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span>obs.performer = <span style=\"color: maroon\">s</span> <i>&quot;performerFromSource&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;performerSourceFallback&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">A stored response's id already reads &quot;QuestionnaireResponse/&lt;id&gt;&quot;, so it is</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">a relative reference as it stands. The hasValue() guard is what stops an</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">unsaved response -- one posted straight to $extract rather than saved first</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">-- from writing &quot;QuestionnaireResponse/null&quot; into the record.</span>\r\n  qr.id<b> as </b><span style=\"color: maroon\">qid</span><b> where </b><span style=\"color: navy\">(</span>$this.hasValue()<span style=\"color: navy\">)</span><span style=\"color: navy\"><b> -&gt; </b></span> obs.derivedFrom = <b>create</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'Reference'</span><span style=\"color: navy\">)</span><b> as </b><span style=\"color: maroon\">ref</span><span style=\"color: navy\">, </span> ref.reference = <span style=\"color: maroon\">qid</span> <i>&quot;linkQuestionnaireResponse&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetObservationFullUrl<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">obs</span><span style=\"color: navy\"> : </span>Observation, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  obs.id<b> as </b><span style=\"color: maroon\">id</span><span style=\"color: navy\"><b> -&gt; </b></span>entry.fullUrl = <b>append</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/Observation/'</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">id</span><span style=\"color: navy\">)</span> <i>&quot;assignFullUrl&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><b>group </b>SetVisionPrescriptionFullUrl<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">vp</span><span style=\"color: navy\"> : </span>VisionPrescription, <b>target</b> <span style=\"color: maroon\">entry</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  vp.id<b> as </b><span style=\"color: maroon\">id</span><span style=\"color: navy\"><b> -&gt; </b></span>entry.fullUrl = <b>append</b><span style=\"color: navy\">(</span><span style=\"color: blue\">'https://fhir.slade360.co.ke/fhir/VisionPrescription/'</span><span style=\"color: navy\">, </span><span style=\"color: maroon\">id</span><span style=\"color: navy\">)</span> <i>&quot;assignFullUrl&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span><span style=\"color: navy\">// </span><span style=\"color: green\">── Provenance and tenancy ───────────────────────────────────────────────────</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">Two tags on everything this map creates. The first says which form produced</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">it -- the form's document type, not the questionnaire's id, because every</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">environment mints its own ids and there is one set of maps. The second copies</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">the tenant tags off the response, because nothing else on the path puts them</span>\r\n<span style=\"color: navy\">// </span><span style=\"color: green\">there.</span>\r\n<b>group </b>SetResponseProvenance<span style=\"color: navy\">(</span><b>source</b> <span style=\"color: maroon\">qr</span><span style=\"color: navy\"> : </span>QR, <b>target</b> <span style=\"color: maroon\">r</span><span style=\"color: navy\">)</span><span style=\"color: navy\"> {\r\n</span>  qr<span style=\"color: navy\"><b> -&gt; </b></span>r.meta<b> as </b><span style=\"color: maroon\">m</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    qr<span style=\"color: navy\"><b> -&gt; </b></span>m.tag<b> as </b><span style=\"color: maroon\">t</span><b> then</b><span style=\"color: navy\"> {\r\n</span>      qr<span style=\"color: navy\"><b> -&gt; </b></span>t.system = <span style=\"color: blue\">'http://slade360edi.com/questionnaire-provenance'</span> <i>&quot;provenanceSystem&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>t.code = <span style=\"color: blue\">'optical-prescription'</span> <i>&quot;provenanceCode&quot;</i><span style=\"color: navy\">;</span>\r\n      qr<span style=\"color: navy\"><b> -&gt; </b></span>t.display = <span style=\"color: blue\">'Optical prescription'</span> <i>&quot;provenanceDisplay&quot;</i><span style=\"color: navy\">;</span>\r\n    <span style=\"color: navy\">}</span> <i>&quot;provenanceTag&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;provenanceMeta&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">`meta` is 0..1, so this lands on the same meta the rule above created</span>\r\n  <span style=\"color: navy\">// </span><span style=\"color: green\">rather than a second one.</span>\r\n  qr.meta<b> as </b><span style=\"color: maroon\">qm</span><b> then</b><span style=\"color: navy\"> {\r\n</span>    qm.tag<b> as </b><span style=\"color: maroon\">qt</span><span style=\"color: navy\"><b> -&gt; </b></span> r.meta<b> as </b><span style=\"color: maroon\">m</span><span style=\"color: navy\">, </span> m.tag = <span style=\"color: maroon\">qt</span> <i>&quot;copyTag&quot;</i><span style=\"color: navy\">;</span>\r\n  <span style=\"color: navy\">}</span> <i>&quot;tenantTags&quot;</i><span style=\"color: navy\">;</span>\r\n<span style=\"color: navy\">}\r\n\r\n</span></pre></div>"
  },
  "url" : "https://fhir.slade360.co.ke/fhir/StructureMap/ExtractOpticalPrescription",
  "version" : "0.1.0",
  "name" : "ExtractOpticalPrescription",
  "title" : "Optical Prescription Extraction",
  "status" : "active",
  "date" : "2026-10-06T18:48:22+00:00",
  "publisher" : "Kathurima Kimathi",
  "contact" : [{
    "name" : "Kathurima Kimathi",
    "telecom" : [{
      "system" : "url",
      "value" : "https://www.linkedin.com/in/kathurima-kimathi/"
    },
    {
      "system" : "email",
      "value" : "kathurimakimathi415@gmail.com"
    }]
  },
  {
    "name" : "Oscar John",
    "telecom" : [{
      "system" : "email",
      "value" : "oscarjohnotieno@gmail.com",
      "use" : "work"
    }]
  },
  {
    "name" : "Kennedy Omondi",
    "telecom" : [{
      "system" : "email",
      "value" : "kennankole@gmail.com",
      "use" : "work"
    }]
  }],
  "description" : "The optical prescription out as one VisionPrescription plus one Observation per pupillary distance and visual acuity the prescriber wrote. VisionPrescription is the resource R5 defines for exactly this -- an authorization for the provision of glasses and/or contact lenses -- and it takes the powers: sphere, cylinder, axis and the reading addition for each eye, and the contact lens power, back curve, diameter, brand, colour and wear period. It has no element for pupillary distance or visual acuity, and LOINC names both on a glasses lens prescription per eye at distance and near, so those become LOINC-coded Observations rather than notes. Lens type and coating, which VisionPrescription also cannot code, go into lensSpecification.note, which R5 defines as notes for special requirements such as coatings and lens materials.",
  "structure" : [{
    "url" : "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse",
    "mode" : "source",
    "alias" : "QR"
  },
  {
    "url" : "http://hl7.org/fhir/StructureDefinition/Bundle",
    "mode" : "target",
    "alias" : "Bundle"
  },
  {
    "url" : "http://hl7.org/fhir/StructureDefinition/VisionPrescription",
    "mode" : "target",
    "alias" : "VisionPrescription"
  },
  {
    "url" : "http://hl7.org/fhir/StructureDefinition/Observation",
    "mode" : "target",
    "alias" : "Observation"
  }],
  "group" : [{
    "name" : "ExtractOpticalPrescription",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "bundle",
      "type" : "Bundle",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "setBundleType",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "bundle",
        "element" : "type",
        "transform" : "copy",
        "parameter" : [{
          "valueString" : "transaction"
        }]
      }]
    },
    {
      "name" : "prescription",
      "source" : [{
        "context" : "qr",
        "condition" : "(repeat(item).where(linkId.matches('^(eyewear|contact-lens)/(right|left)/((distance|near)/)?(sph|cyl|add|power|base-curve|diameter)$')).answer.value.ofType(decimal).exists() or repeat(item).where(linkId.matches('^(eyewear|contact-lens)/(right|left)/((distance|near)/)?axis$')).answer.value.ofType(integer).exists()) and subject.where(reference.matches('(^|/)Patient/[^/]+$')).exists() and authored.exists() and (author.where(reference.matches('(^|/)(Practitioner|PractitionerRole)/[^/]+$')).exists() or source.where(reference.matches('(^|/)(Practitioner|PractitionerRole)/[^/]+$')).exists())"
      }],
      "target" : [{
        "context" : "bundle",
        "element" : "entry",
        "variable" : "entry"
      },
      {
        "context" : "entry",
        "element" : "resource",
        "variable" : "vp",
        "transform" : "create",
        "parameter" : [{
          "valueString" : "VisionPrescription"
        }]
      }],
      "rule" : [{
        "name" : "base",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "vp"
        },
        {
          "context" : "entry"
        }],
        "dependent" : [{
          "name" : "BuildVisionPrescriptionBase",
          "parameter" : [{
            "valueId" : "qr"
          },
          {
            "valueId" : "vp"
          },
          {
            "valueId" : "entry"
          }]
        }]
      },
      {
        "name" : "prescriber",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "vp"
        }],
        "dependent" : [{
          "name" : "SetPrescriber",
          "parameter" : [{
            "valueId" : "qr"
          },
          {
            "valueId" : "vp"
          }]
        }]
      },
      {
        "name" : "eyewear",
        "source" : [{
          "context" : "qr",
          "element" : "item",
          "variable" : "ew",
          "condition" : "linkId = 'eyewear'"
        }],
        "dependent" : [{
          "name" : "SpectacleLenses",
          "parameter" : [{
            "valueId" : "qr"
          },
          {
            "valueId" : "ew"
          },
          {
            "valueId" : "vp"
          }]
        }]
      },
      {
        "name" : "contactLens",
        "source" : [{
          "context" : "qr",
          "element" : "item",
          "variable" : "cl",
          "condition" : "linkId = 'contact-lens'"
        }],
        "dependent" : [{
          "name" : "ContactLenses",
          "parameter" : [{
            "valueId" : "qr"
          },
          {
            "valueId" : "cl"
          },
          {
            "valueId" : "vp"
          }]
        }]
      }],
      "documentation" : "The prescription itself, created only when every element VisionPrescription\r\nmakes 1..1 can be filled from the response -- not bent to fit:\r\nlensSpecification  at least one lens power. The patterns are every power\r\nitem on the form -- the eyewear distance and near rows,\r\nthe reading addition and the contact lens rows -- and\r\ndeliberately not the pupillary distance or the visual\r\nacuity, which are measurements and extract on their own\r\nbelow, nor the transposed rows, which are the same\r\nprescription computed the other way round.\r\npatient            the response's subject, when it is a Patient.\r\ndateWritten,       the response's authored. The form does not ask for a\r\ncreated            date; the client stamps it.\r\nprescriber         the response's author (else source) when it is a\r\nPractitioner or a PractitionerRole. The form does not\r\nask who; the client stamps the practitioner recording\r\nit.\r\nA response short of any of these extracts no VisionPrescription. That is\r\nthe rule held rather than worked round: the alternative is a prescription\r\nstored without a prescriber, or with one invented. The pupillary distances\r\nand visual acuities still extract, because they need none of it."
    },
    {
      "name" : "measurements",
      "source" : [{
        "context" : "qr",
        "element" : "item",
        "variable" : "ew",
        "condition" : "linkId = 'eyewear'"
      }],
      "dependent" : [{
        "name" : "EyewearMeasurements",
        "parameter" : [{
          "valueId" : "qr"
        },
        {
          "valueId" : "ew"
        },
        {
          "valueId" : "bundle"
        }]
      }],
      "documentation" : "Pupillary distance and visual acuity, one Observation each. These extract\r\nwhether or not there is a prescription: a PD taken for a frame fitting is\r\nworth keeping on its own."
    }]
  },
  {
    "name" : "BuildVisionPrescriptionBase",
    "documentation" : "─────────────────────────────────────────────────────────────────────────────\r\nThe prescription\r\n─────────────────────────────────────────────────────────────────────────────",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "vp",
      "type" : "VisionPrescription",
      "mode" : "target"
    },
    {
      "name" : "entry",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "responseProvenance",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "vp"
      }],
      "dependent" : [{
        "name" : "SetResponseProvenance",
        "parameter" : [{
          "valueId" : "qr"
        },
        {
          "valueId" : "vp"
        }]
      }]
    },
    {
      "name" : "idAndFullUrl",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "vp",
        "element" : "id",
        "transform" : "uuid"
      }],
      "dependent" : [{
        "name" : "SetVisionPrescriptionFullUrl",
        "parameter" : [{
          "valueId" : "vp"
        },
        {
          "valueId" : "entry"
        }]
      }]
    },
    {
      "name" : "entryRequest",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "entry",
        "element" : "request",
        "variable" : "request"
      }],
      "rule" : [{
        "name" : "requestMethod",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "request",
          "element" : "method",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "POST"
          }]
        }]
      },
      {
        "name" : "requestUrl",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "request",
          "element" : "url",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "VisionPrescription"
          }]
        }]
      }]
    },
    {
      "name" : "status",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "vp",
        "element" : "status",
        "transform" : "copy",
        "parameter" : [{
          "valueString" : "active"
        }]
      }],
      "documentation" : "`active`: a prescription recorded on this form is one somebody is about to\r\ndispense against. fm-status has no `completed`."
    },
    {
      "name" : "patient",
      "source" : [{
        "context" : "qr",
        "element" : "subject",
        "variable" : "s",
        "condition" : "(reference.exists() and (reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient')))"
      }],
      "target" : [{
        "context" : "vp",
        "element" : "patient",
        "transform" : "copy",
        "parameter" : [{
          "valueId" : "s"
        }]
      }]
    },
    {
      "name" : "encounter",
      "source" : [{
        "context" : "qr",
        "element" : "encounter",
        "variable" : "e",
        "condition" : "(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))"
      }],
      "target" : [{
        "context" : "vp",
        "element" : "encounter",
        "transform" : "copy",
        "parameter" : [{
          "valueId" : "e"
        }]
      }]
    },
    {
      "name" : "dateWritten",
      "source" : [{
        "context" : "qr",
        "element" : "authored",
        "variable" : "t"
      }],
      "target" : [{
        "context" : "vp",
        "element" : "dateWritten",
        "transform" : "copy",
        "parameter" : [{
          "valueId" : "t"
        }]
      }],
      "documentation" : "Both dates, 1..1 each, are the response's `authored`. The form does not ask\r\nfor a prescription date: the client stamps the moment it was recorded, and\r\nthat is when this prescription was written and when this record was made."
    },
    {
      "name" : "created",
      "source" : [{
        "context" : "qr",
        "element" : "authored",
        "variable" : "t"
      }],
      "target" : [{
        "context" : "vp",
        "element" : "created",
        "transform" : "copy",
        "parameter" : [{
          "valueId" : "t"
        }]
      }]
    }]
  },
  {
    "name" : "SetPrescriber",
    "documentation" : "The prescriber is 1..1, and the form does not ask for one. It is the\r\npractitioner who recorded the prescription, which the client stamps on the\r\nresponse as `author`; `source` is taken when there is no author. Either is\r\ncopied across only when it points at a Practitioner or a PractitionerRole --\r\nthe two types VisionPrescription.prescriber allows -- because `author` may\r\nalso name a Device, a Patient or an Organization.\r\nNothing is guessed when neither qualifies: the rule that creates the\r\nprescription is guarded on one of them, so this group always finds one.",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "vp",
      "type" : "VisionPrescription",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "prescriberFromAuthor",
      "source" : [{
        "context" : "qr",
        "element" : "author",
        "variable" : "a",
        "condition" : "(reference.matches('(^|/)(Practitioner|PractitionerRole)/[^/]+$')) and ((reference.exists() and (reference.startsWith('Practitioner/') or reference.startsWith('PractitionerRole/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Practitioner') or ('/' + type).endsWith('/PractitionerRole'))))"
      }],
      "target" : [{
        "context" : "vp",
        "element" : "prescriber",
        "transform" : "copy",
        "parameter" : [{
          "valueId" : "a"
        }]
      }]
    },
    {
      "name" : "sourceFallback",
      "source" : [{
        "context" : "qr",
        "condition" : "author.where(((reference.exists() and (reference.startsWith('Practitioner/') or reference.startsWith('PractitionerRole/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Practitioner') or ('/' + type).endsWith('/PractitionerRole'))))).exists().not()"
      }],
      "rule" : [{
        "name" : "prescriberFromSource",
        "source" : [{
          "context" : "qr",
          "element" : "source",
          "variable" : "s",
          "condition" : "(reference.matches('(^|/)(Practitioner|PractitionerRole)/[^/]+$')) and ((reference.exists() and (reference.startsWith('Practitioner/') or reference.startsWith('PractitionerRole/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Practitioner') or ('/' + type).endsWith('/PractitionerRole'))))"
        }],
        "target" : [{
          "context" : "vp",
          "element" : "prescriber",
          "transform" : "copy",
          "parameter" : [{
            "valueId" : "s"
          }]
        }]
      }]
    }]
  },
  {
    "name" : "SpectacleLenses",
    "documentation" : "── Spectacle lenses ─────────────────────────────────────────────────────────\r\nUp to two lens specifications per eye, one per row the prescriber filled in.\r\nThe distance specification carries the distance vision (DV) row and the\r\nreading addition. That is the shape R5 itself uses for a spectacle\r\nprescription -- one specification per eye with the distance powers and\r\n`add` -- so a consumer that reads only that one still gets a complete\r\nmultifocal prescription.\r\nThe near specification carries the near vision (NV) row, when one was\r\nwritten. It is not derived from DV + ADD and it is not dropped when an ADD is\r\npresent: the prescriber wrote it, and for reading glasses it is the whole\r\nprescription. The two cannot be told apart by any element R5 gives a lens\r\nspecification, so `product` carries HL7's `lens` beside the local\r\n`spectacle-lens-distance` or `spectacle-lens-near` -- the same product at a\r\nfiner grain, which the example-strength binding allows.\r\nlinkIds are matched by suffix inside an eye, so the two eyes share one set\r\nof groups. The eye code is set by the caller, which is the only place that\r\nknows which eye it is in.",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "ew",
      "mode" : "source"
    },
    {
      "name" : "vp",
      "type" : "VisionPrescription",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "right",
      "source" : [{
        "context" : "ew",
        "element" : "item",
        "variable" : "eye",
        "condition" : "linkId = 'eyewear/right'"
      }],
      "rule" : [{
        "name" : "rightDistance",
        "source" : [{
          "context" : "eye",
          "condition" : "item.where(linkId.endsWith('/distance')).item.where(linkId.endsWith('/sph') or linkId.endsWith('/cyl')).answer.value.ofType(decimal).exists() or item.where(linkId.endsWith('/distance')).item.where(linkId.endsWith('/axis')).answer.value.ofType(integer).exists() or item.where(linkId.endsWith('/add')).answer.value.ofType(decimal).exists()"
        }],
        "target" : [{
          "context" : "vp",
          "element" : "lensSpecification",
          "variable" : "spec"
        }],
        "rule" : [{
          "name" : "lens",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "spec"
          }],
          "dependent" : [{
            "name" : "DistanceSpectacleLens",
            "parameter" : [{
              "valueId" : "qr"
            },
            {
              "valueId" : "ew"
            },
            {
              "valueId" : "eye"
            },
            {
              "valueId" : "spec"
            }]
          }]
        },
        {
          "name" : "eyeCode",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "eye",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "right"
            }]
          }]
        }]
      },
      {
        "name" : "rightNear",
        "source" : [{
          "context" : "eye",
          "condition" : "item.where(linkId.endsWith('/near')).item.where(linkId.endsWith('/sph') or linkId.endsWith('/cyl')).answer.value.ofType(decimal).exists() or item.where(linkId.endsWith('/near')).item.where(linkId.endsWith('/axis')).answer.value.ofType(integer).exists()"
        }],
        "target" : [{
          "context" : "vp",
          "element" : "lensSpecification",
          "variable" : "spec"
        }],
        "rule" : [{
          "name" : "lens",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "spec"
          }],
          "dependent" : [{
            "name" : "NearSpectacleLens",
            "parameter" : [{
              "valueId" : "qr"
            },
            {
              "valueId" : "ew"
            },
            {
              "valueId" : "eye"
            },
            {
              "valueId" : "spec"
            }]
          }]
        },
        {
          "name" : "eyeCode",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "eye",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "right"
            }]
          }]
        }]
      }]
    },
    {
      "name" : "left",
      "source" : [{
        "context" : "ew",
        "element" : "item",
        "variable" : "eye",
        "condition" : "linkId = 'eyewear/left'"
      }],
      "rule" : [{
        "name" : "leftDistance",
        "source" : [{
          "context" : "eye",
          "condition" : "item.where(linkId.endsWith('/distance')).item.where(linkId.endsWith('/sph') or linkId.endsWith('/cyl')).answer.value.ofType(decimal).exists() or item.where(linkId.endsWith('/distance')).item.where(linkId.endsWith('/axis')).answer.value.ofType(integer).exists() or item.where(linkId.endsWith('/add')).answer.value.ofType(decimal).exists()"
        }],
        "target" : [{
          "context" : "vp",
          "element" : "lensSpecification",
          "variable" : "spec"
        }],
        "rule" : [{
          "name" : "lens",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "spec"
          }],
          "dependent" : [{
            "name" : "DistanceSpectacleLens",
            "parameter" : [{
              "valueId" : "qr"
            },
            {
              "valueId" : "ew"
            },
            {
              "valueId" : "eye"
            },
            {
              "valueId" : "spec"
            }]
          }]
        },
        {
          "name" : "eyeCode",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "eye",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "left"
            }]
          }]
        }]
      },
      {
        "name" : "leftNear",
        "source" : [{
          "context" : "eye",
          "condition" : "item.where(linkId.endsWith('/near')).item.where(linkId.endsWith('/sph') or linkId.endsWith('/cyl')).answer.value.ofType(decimal).exists() or item.where(linkId.endsWith('/near')).item.where(linkId.endsWith('/axis')).answer.value.ofType(integer).exists()"
        }],
        "target" : [{
          "context" : "vp",
          "element" : "lensSpecification",
          "variable" : "spec"
        }],
        "rule" : [{
          "name" : "lens",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "spec"
          }],
          "dependent" : [{
            "name" : "NearSpectacleLens",
            "parameter" : [{
              "valueId" : "qr"
            },
            {
              "valueId" : "ew"
            },
            {
              "valueId" : "eye"
            },
            {
              "valueId" : "spec"
            }]
          }]
        },
        {
          "name" : "eyeCode",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "eye",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "left"
            }]
          }]
        }]
      }]
    }]
  },
  {
    "name" : "DistanceSpectacleLens",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "ew",
      "mode" : "source"
    },
    {
      "name" : "eye",
      "mode" : "source"
    },
    {
      "name" : "spec",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "product",
      "source" : [{
        "context" : "eye"
      }],
      "target" : [{
        "context" : "spec",
        "element" : "product",
        "variable" : "product"
      }],
      "rule" : [{
        "name" : "hl7Coding",
        "source" : [{
          "context" : "eye"
        }],
        "target" : [{
          "context" : "product",
          "element" : "coding",
          "variable" : "coding"
        }],
        "rule" : [{
          "name" : "hl7System",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "system",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "http://terminology.hl7.org/CodeSystem/ex-visionprescriptionproduct"
            }]
          }]
        },
        {
          "name" : "hl7Code",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "code",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "lens"
            }]
          }]
        },
        {
          "name" : "hl7Display",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "display",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "Lens"
            }]
          }]
        }]
      },
      {
        "name" : "rowCoding",
        "source" : [{
          "context" : "eye"
        }],
        "target" : [{
          "context" : "product",
          "element" : "coding",
          "variable" : "coding"
        }],
        "rule" : [{
          "name" : "rowSystem",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "system",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
            }]
          }]
        },
        {
          "name" : "rowCode",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "code",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "spectacle-lens-distance"
            }]
          }]
        },
        {
          "name" : "rowDisplay",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "display",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "Spectacle lens for distance vision"
            }]
          }]
        }]
      },
      {
        "name" : "productText",
        "source" : [{
          "context" : "eye"
        }],
        "target" : [{
          "context" : "product",
          "element" : "text",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "Spectacle lens — distance vision (DV)"
          }]
        }]
      }]
    },
    {
      "name" : "distanceRow",
      "source" : [{
        "context" : "eye",
        "element" : "item",
        "variable" : "row",
        "condition" : "linkId.endsWith('/distance')"
      }],
      "rule" : [{
        "name" : "powers",
        "source" : [{
          "context" : "row"
        }],
        "target" : [{
          "context" : "spec"
        }],
        "dependent" : [{
          "name" : "LensPowers",
          "parameter" : [{
            "valueId" : "row"
          },
          {
            "valueId" : "spec"
          }]
        }]
      }]
    },
    {
      "name" : "addition",
      "source" : [{
        "context" : "eye",
        "element" : "item",
        "variable" : "it",
        "condition" : "linkId.endsWith('/add') and answer.value.ofType(decimal).exists()"
      }],
      "rule" : [{
        "name" : "addAnswer",
        "source" : [{
          "context" : "it",
          "element" : "answer",
          "listMode" : "first",
          "variable" : "a"
        }],
        "rule" : [{
          "name" : "addValue",
          "source" : [{
            "context" : "a",
            "element" : "value",
            "variable" : "v"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "add",
            "transform" : "copy",
            "parameter" : [{
              "valueId" : "v"
            }]
          }]
        }]
      }]
    },
    {
      "name" : "notes",
      "source" : [{
        "context" : "ew"
      }],
      "target" : [{
        "context" : "spec"
      }],
      "dependent" : [{
        "name" : "SpectacleLensNotes",
        "parameter" : [{
          "valueId" : "qr"
        },
        {
          "valueId" : "ew"
        },
        {
          "valueId" : "spec"
        }]
      }]
    }]
  },
  {
    "name" : "NearSpectacleLens",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "ew",
      "mode" : "source"
    },
    {
      "name" : "eye",
      "mode" : "source"
    },
    {
      "name" : "spec",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "product",
      "source" : [{
        "context" : "eye"
      }],
      "target" : [{
        "context" : "spec",
        "element" : "product",
        "variable" : "product"
      }],
      "rule" : [{
        "name" : "hl7Coding",
        "source" : [{
          "context" : "eye"
        }],
        "target" : [{
          "context" : "product",
          "element" : "coding",
          "variable" : "coding"
        }],
        "rule" : [{
          "name" : "hl7System",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "system",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "http://terminology.hl7.org/CodeSystem/ex-visionprescriptionproduct"
            }]
          }]
        },
        {
          "name" : "hl7Code",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "code",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "lens"
            }]
          }]
        },
        {
          "name" : "hl7Display",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "display",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "Lens"
            }]
          }]
        }]
      },
      {
        "name" : "rowCoding",
        "source" : [{
          "context" : "eye"
        }],
        "target" : [{
          "context" : "product",
          "element" : "coding",
          "variable" : "coding"
        }],
        "rule" : [{
          "name" : "rowSystem",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "system",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "https://fhir.slade360.co.ke/fhir/CodeSystem/concept-codesystem"
            }]
          }]
        },
        {
          "name" : "rowCode",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "code",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "spectacle-lens-near"
            }]
          }]
        },
        {
          "name" : "rowDisplay",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "display",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "Spectacle lens for near vision"
            }]
          }]
        }]
      },
      {
        "name" : "productText",
        "source" : [{
          "context" : "eye"
        }],
        "target" : [{
          "context" : "product",
          "element" : "text",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "Spectacle lens — near vision (NV)"
          }]
        }]
      }]
    },
    {
      "name" : "nearRow",
      "source" : [{
        "context" : "eye",
        "element" : "item",
        "variable" : "row",
        "condition" : "linkId.endsWith('/near')"
      }],
      "rule" : [{
        "name" : "powers",
        "source" : [{
          "context" : "row"
        }],
        "target" : [{
          "context" : "spec"
        }],
        "dependent" : [{
          "name" : "LensPowers",
          "parameter" : [{
            "valueId" : "row"
          },
          {
            "valueId" : "spec"
          }]
        }]
      }]
    },
    {
      "name" : "notes",
      "source" : [{
        "context" : "ew"
      }],
      "target" : [{
        "context" : "spec"
      }],
      "dependent" : [{
        "name" : "SpectacleLensNotes",
        "parameter" : [{
          "valueId" : "qr"
        },
        {
          "valueId" : "ew"
        },
        {
          "valueId" : "spec"
        }]
      }]
    }]
  },
  {
    "name" : "LensPowers",
    "documentation" : "Sphere, cylinder and axis off one row. Typed guards, because a rule that\r\nassigns an answer of the wrong type to a decimal element does not skip -- it\r\nfails the whole extraction.",
    "input" : [{
      "name" : "row",
      "mode" : "source"
    },
    {
      "name" : "spec",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "sphere",
      "source" : [{
        "context" : "row",
        "element" : "item",
        "variable" : "it",
        "condition" : "linkId.endsWith('/sph') and answer.value.ofType(decimal).exists()"
      }],
      "rule" : [{
        "name" : "sphereAnswer",
        "source" : [{
          "context" : "it",
          "element" : "answer",
          "listMode" : "first",
          "variable" : "a"
        }],
        "rule" : [{
          "name" : "sphereValue",
          "source" : [{
            "context" : "a",
            "element" : "value",
            "variable" : "v"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "sphere",
            "transform" : "copy",
            "parameter" : [{
              "valueId" : "v"
            }]
          }]
        }]
      }]
    },
    {
      "name" : "cylinder",
      "source" : [{
        "context" : "row",
        "element" : "item",
        "variable" : "it",
        "condition" : "linkId.endsWith('/cyl') and answer.value.ofType(decimal).exists()"
      }],
      "rule" : [{
        "name" : "cylinderAnswer",
        "source" : [{
          "context" : "it",
          "element" : "answer",
          "listMode" : "first",
          "variable" : "a"
        }],
        "rule" : [{
          "name" : "cylinderValue",
          "source" : [{
            "context" : "a",
            "element" : "value",
            "variable" : "v"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "cylinder",
            "transform" : "copy",
            "parameter" : [{
              "valueId" : "v"
            }]
          }]
        }]
      }]
    },
    {
      "name" : "axis",
      "source" : [{
        "context" : "row",
        "element" : "item",
        "variable" : "it",
        "condition" : "linkId.endsWith('/axis') and answer.value.ofType(integer).exists()"
      }],
      "rule" : [{
        "name" : "axisAnswer",
        "source" : [{
          "context" : "it",
          "element" : "answer",
          "listMode" : "first",
          "variable" : "a"
        }],
        "rule" : [{
          "name" : "axisValue",
          "source" : [{
            "context" : "a",
            "element" : "value",
            "variable" : "v"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "axis",
            "transform" : "copy",
            "parameter" : [{
              "valueId" : "v"
            }]
          }]
        }]
      }]
    }]
  },
  {
    "name" : "SpectacleLensNotes",
    "documentation" : "Lens type and coating, as the words the prescriber ticked. VisionPrescription\r\nhas no coded element for either; `note` is where R5 says they go (\"notes for\r\nspecial requirements such as coatings and lens materials\"), and the codes\r\nthemselves stay on the response. Both go on every spectacle specification,\r\nbecause the paper ticks them once for the pair.",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "ew",
      "mode" : "source"
    },
    {
      "name" : "spec",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "lensTypes",
      "source" : [{
        "context" : "ew",
        "element" : "item",
        "variable" : "it",
        "condition" : "(linkId = 'eyewear/lens-types') and answer.value.ofType(Coding).exists()"
      }],
      "target" : [{
        "context" : "spec",
        "element" : "note",
        "variable" : "note"
      }],
      "rule" : [{
        "name" : "lensTypeText",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "note",
          "element" : "text",
          "transform" : "evaluate",
          "parameter" : [{
            "valueId" : "it"
          },
          {
            "valueString" : "'Lens type: ' & answer.value.ofType(Coding).select(iif(display.exists(), display, code)).join(', ')"
          }]
        }]
      }]
    },
    {
      "name" : "lensCoating",
      "source" : [{
        "context" : "ew",
        "element" : "item",
        "variable" : "it",
        "condition" : "(linkId = 'eyewear/lens-coating') and answer.value.ofType(Coding).exists()"
      }],
      "target" : [{
        "context" : "spec",
        "element" : "note",
        "variable" : "note"
      }],
      "rule" : [{
        "name" : "lensCoatingText",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "note",
          "element" : "text",
          "transform" : "evaluate",
          "parameter" : [{
            "valueId" : "it"
          },
          {
            "valueString" : "'Lens coating: ' & answer.value.ofType(Coding).select(iif(display.exists(), display, code)).join(', ')"
          }]
        }]
      }]
    },
    {
      "name" : "prescriptionNotes",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "spec"
      }],
      "dependent" : [{
        "name" : "PrescriptionNotes",
        "parameter" : [{
          "valueId" : "qr"
        },
        {
          "valueId" : "spec"
        }]
      }]
    }]
  },
  {
    "name" : "PrescriptionNotes",
    "documentation" : "The free-text prescription notes. VisionPrescription has no note of its own,\r\nonly one per lens specification, so the notes go on each specification --\r\nrepeated rather than put on whichever happens to be first, which a consumer\r\nreading one eye would miss.",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "spec",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "notes",
      "source" : [{
        "context" : "qr",
        "element" : "item",
        "variable" : "it",
        "condition" : "(linkId = 'notes') and answer.value.ofType(string).exists()"
      }],
      "target" : [{
        "context" : "spec",
        "element" : "note",
        "variable" : "note"
      }],
      "rule" : [{
        "name" : "noteAnswer",
        "source" : [{
          "context" : "it",
          "element" : "answer",
          "listMode" : "first",
          "variable" : "a"
        }],
        "rule" : [{
          "name" : "noteText",
          "source" : [{
            "context" : "a",
            "element" : "value",
            "variable" : "v"
          }],
          "target" : [{
            "context" : "note",
            "element" : "text",
            "transform" : "copy",
            "parameter" : [{
              "valueId" : "v"
            }]
          }]
        }]
      }]
    }]
  },
  {
    "name" : "ContactLenses",
    "documentation" : "── Contact lenses ───────────────────────────────────────────────────────────\r\nOne specification per eye with anything written on it. The contact lens\r\npower goes to `power`, R5's \"contact lens power\", which is what its own\r\ncontact lens example uses; `sphere` stays the spectacle lens power. Brand,\r\ncolour and the replacement schedule are asked once for the pair and copied\r\nonto both eyes, because R5 holds them per specification.",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "cl",
      "mode" : "source"
    },
    {
      "name" : "vp",
      "type" : "VisionPrescription",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "right",
      "source" : [{
        "context" : "cl",
        "element" : "item",
        "variable" : "eye",
        "condition" : "(linkId = 'contact-lens/right') and (item.answer.value.ofType(decimal).exists() or item.answer.value.ofType(integer).exists())"
      }],
      "target" : [{
        "context" : "vp",
        "element" : "lensSpecification",
        "variable" : "spec"
      }],
      "rule" : [{
        "name" : "lens",
        "source" : [{
          "context" : "eye"
        }],
        "target" : [{
          "context" : "spec"
        }],
        "dependent" : [{
          "name" : "ContactLens",
          "parameter" : [{
            "valueId" : "qr"
          },
          {
            "valueId" : "cl"
          },
          {
            "valueId" : "eye"
          },
          {
            "valueId" : "spec"
          }]
        }]
      },
      {
        "name" : "eyeCode",
        "source" : [{
          "context" : "eye"
        }],
        "target" : [{
          "context" : "spec",
          "element" : "eye",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "right"
          }]
        }]
      }]
    },
    {
      "name" : "left",
      "source" : [{
        "context" : "cl",
        "element" : "item",
        "variable" : "eye",
        "condition" : "(linkId = 'contact-lens/left') and (item.answer.value.ofType(decimal).exists() or item.answer.value.ofType(integer).exists())"
      }],
      "target" : [{
        "context" : "vp",
        "element" : "lensSpecification",
        "variable" : "spec"
      }],
      "rule" : [{
        "name" : "lens",
        "source" : [{
          "context" : "eye"
        }],
        "target" : [{
          "context" : "spec"
        }],
        "dependent" : [{
          "name" : "ContactLens",
          "parameter" : [{
            "valueId" : "qr"
          },
          {
            "valueId" : "cl"
          },
          {
            "valueId" : "eye"
          },
          {
            "valueId" : "spec"
          }]
        }]
      },
      {
        "name" : "eyeCode",
        "source" : [{
          "context" : "eye"
        }],
        "target" : [{
          "context" : "spec",
          "element" : "eye",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "left"
          }]
        }]
      }]
    }]
  },
  {
    "name" : "ContactLens",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "cl",
      "mode" : "source"
    },
    {
      "name" : "eye",
      "mode" : "source"
    },
    {
      "name" : "spec",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "product",
      "source" : [{
        "context" : "eye"
      }],
      "target" : [{
        "context" : "spec",
        "element" : "product",
        "variable" : "product"
      }],
      "rule" : [{
        "name" : "hl7Coding",
        "source" : [{
          "context" : "eye"
        }],
        "target" : [{
          "context" : "product",
          "element" : "coding",
          "variable" : "coding"
        }],
        "rule" : [{
          "name" : "hl7System",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "system",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "http://terminology.hl7.org/CodeSystem/ex-visionprescriptionproduct"
            }]
          }]
        },
        {
          "name" : "hl7Code",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "code",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "contact"
            }]
          }]
        },
        {
          "name" : "hl7Display",
          "source" : [{
            "context" : "eye"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "display",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "Contact Lens"
            }]
          }]
        }]
      },
      {
        "name" : "productText",
        "source" : [{
          "context" : "eye"
        }],
        "target" : [{
          "context" : "product",
          "element" : "text",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "Contact lens"
          }]
        }]
      }]
    },
    {
      "name" : "power",
      "source" : [{
        "context" : "eye",
        "element" : "item",
        "variable" : "it",
        "condition" : "linkId.endsWith('/power') and answer.value.ofType(decimal).exists()"
      }],
      "rule" : [{
        "name" : "powerAnswer",
        "source" : [{
          "context" : "it",
          "element" : "answer",
          "listMode" : "first",
          "variable" : "a"
        }],
        "rule" : [{
          "name" : "powerValue",
          "source" : [{
            "context" : "a",
            "element" : "value",
            "variable" : "v"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "power",
            "transform" : "copy",
            "parameter" : [{
              "valueId" : "v"
            }]
          }]
        }]
      }]
    },
    {
      "name" : "cylinder",
      "source" : [{
        "context" : "eye",
        "element" : "item",
        "variable" : "it",
        "condition" : "linkId.endsWith('/cyl') and answer.value.ofType(decimal).exists()"
      }],
      "rule" : [{
        "name" : "cylinderAnswer",
        "source" : [{
          "context" : "it",
          "element" : "answer",
          "listMode" : "first",
          "variable" : "a"
        }],
        "rule" : [{
          "name" : "cylinderValue",
          "source" : [{
            "context" : "a",
            "element" : "value",
            "variable" : "v"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "cylinder",
            "transform" : "copy",
            "parameter" : [{
              "valueId" : "v"
            }]
          }]
        }]
      }]
    },
    {
      "name" : "axis",
      "source" : [{
        "context" : "eye",
        "element" : "item",
        "variable" : "it",
        "condition" : "linkId.endsWith('/axis') and answer.value.ofType(integer).exists()"
      }],
      "rule" : [{
        "name" : "axisAnswer",
        "source" : [{
          "context" : "it",
          "element" : "answer",
          "listMode" : "first",
          "variable" : "a"
        }],
        "rule" : [{
          "name" : "axisValue",
          "source" : [{
            "context" : "a",
            "element" : "value",
            "variable" : "v"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "axis",
            "transform" : "copy",
            "parameter" : [{
              "valueId" : "v"
            }]
          }]
        }]
      }]
    },
    {
      "name" : "addition",
      "source" : [{
        "context" : "eye",
        "element" : "item",
        "variable" : "it",
        "condition" : "linkId.endsWith('/add') and answer.value.ofType(decimal).exists()"
      }],
      "rule" : [{
        "name" : "addAnswer",
        "source" : [{
          "context" : "it",
          "element" : "answer",
          "listMode" : "first",
          "variable" : "a"
        }],
        "rule" : [{
          "name" : "addValue",
          "source" : [{
            "context" : "a",
            "element" : "value",
            "variable" : "v"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "add",
            "transform" : "copy",
            "parameter" : [{
              "valueId" : "v"
            }]
          }]
        }]
      }]
    },
    {
      "name" : "backCurve",
      "source" : [{
        "context" : "eye",
        "element" : "item",
        "variable" : "it",
        "condition" : "linkId.endsWith('/base-curve') and answer.value.ofType(decimal).exists()"
      }],
      "rule" : [{
        "name" : "backCurveAnswer",
        "source" : [{
          "context" : "it",
          "element" : "answer",
          "listMode" : "first",
          "variable" : "a"
        }],
        "rule" : [{
          "name" : "backCurveValue",
          "source" : [{
            "context" : "a",
            "element" : "value",
            "variable" : "v"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "backCurve",
            "transform" : "copy",
            "parameter" : [{
              "valueId" : "v"
            }]
          }]
        }]
      }]
    },
    {
      "name" : "diameter",
      "source" : [{
        "context" : "eye",
        "element" : "item",
        "variable" : "it",
        "condition" : "linkId.endsWith('/diameter') and answer.value.ofType(decimal).exists()"
      }],
      "rule" : [{
        "name" : "diameterAnswer",
        "source" : [{
          "context" : "it",
          "element" : "answer",
          "listMode" : "first",
          "variable" : "a"
        }],
        "rule" : [{
          "name" : "diameterValue",
          "source" : [{
            "context" : "a",
            "element" : "value",
            "variable" : "v"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "diameter",
            "transform" : "copy",
            "parameter" : [{
              "valueId" : "v"
            }]
          }]
        }]
      }]
    },
    {
      "name" : "brand",
      "source" : [{
        "context" : "cl",
        "element" : "item",
        "variable" : "it",
        "condition" : "(linkId = 'contact-lens/brand') and answer.value.ofType(string).exists()"
      }],
      "rule" : [{
        "name" : "brandAnswer",
        "source" : [{
          "context" : "it",
          "element" : "answer",
          "listMode" : "first",
          "variable" : "a"
        }],
        "rule" : [{
          "name" : "brandValue",
          "source" : [{
            "context" : "a",
            "element" : "value",
            "variable" : "v"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "brand",
            "transform" : "copy",
            "parameter" : [{
              "valueId" : "v"
            }]
          }]
        }]
      }]
    },
    {
      "name" : "colour",
      "source" : [{
        "context" : "cl",
        "element" : "item",
        "variable" : "it",
        "condition" : "(linkId = 'contact-lens/colour') and answer.value.ofType(string).exists()"
      }],
      "rule" : [{
        "name" : "colourAnswer",
        "source" : [{
          "context" : "it",
          "element" : "answer",
          "listMode" : "first",
          "variable" : "a"
        }],
        "rule" : [{
          "name" : "colourValue",
          "source" : [{
            "context" : "a",
            "element" : "value",
            "variable" : "v"
          }],
          "target" : [{
            "context" : "spec",
            "element" : "color",
            "transform" : "copy",
            "parameter" : [{
              "valueId" : "v"
            }]
          }]
        }]
      }]
    },
    {
      "name" : "daily",
      "source" : [{
        "context" : "cl",
        "element" : "item",
        "variable" : "it",
        "condition" : "(linkId = 'contact-lens/replacement') and (answer.value.ofType(Coding).code = 'contact-lens-replace-daily')"
      }],
      "target" : [{
        "context" : "spec",
        "element" : "duration",
        "variable" : "d"
      }],
      "rule" : [{
        "name" : "value",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "value",
          "transform" : "copy",
          "parameter" : [{
            "valueInteger" : 1
          }]
        }]
      },
      {
        "name" : "unit",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "unit",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "day"
          }]
        }]
      },
      {
        "name" : "system",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "system",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "http://unitsofmeasure.org"
          }]
        }]
      },
      {
        "name" : "code",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "code",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "d"
          }]
        }]
      }],
      "documentation" : "The replacement schedule is R5's `duration`, \"the recommended maximum wear\r\nperiod for the lens\", as a UCUM Quantity. One rule per answer, each guarded\r\non its own code, so an answer this map does not know writes no duration\r\nrather than an empty Quantity."
    },
    {
      "name" : "twoWeekly",
      "source" : [{
        "context" : "cl",
        "element" : "item",
        "variable" : "it",
        "condition" : "(linkId = 'contact-lens/replacement') and (answer.value.ofType(Coding).code = 'contact-lens-replace-two-weekly')"
      }],
      "target" : [{
        "context" : "spec",
        "element" : "duration",
        "variable" : "d"
      }],
      "rule" : [{
        "name" : "value",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "value",
          "transform" : "copy",
          "parameter" : [{
            "valueInteger" : 2
          }]
        }]
      },
      {
        "name" : "unit",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "unit",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "weeks"
          }]
        }]
      },
      {
        "name" : "system",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "system",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "http://unitsofmeasure.org"
          }]
        }]
      },
      {
        "name" : "code",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "code",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "wk"
          }]
        }]
      }]
    },
    {
      "name" : "monthly",
      "source" : [{
        "context" : "cl",
        "element" : "item",
        "variable" : "it",
        "condition" : "(linkId = 'contact-lens/replacement') and (answer.value.ofType(Coding).code = 'contact-lens-replace-monthly')"
      }],
      "target" : [{
        "context" : "spec",
        "element" : "duration",
        "variable" : "d"
      }],
      "rule" : [{
        "name" : "value",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "value",
          "transform" : "copy",
          "parameter" : [{
            "valueInteger" : 1
          }]
        }]
      },
      {
        "name" : "unit",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "unit",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "month"
          }]
        }]
      },
      {
        "name" : "system",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "system",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "http://unitsofmeasure.org"
          }]
        }]
      },
      {
        "name" : "code",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "code",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "mo"
          }]
        }]
      }]
    },
    {
      "name" : "quarterly",
      "source" : [{
        "context" : "cl",
        "element" : "item",
        "variable" : "it",
        "condition" : "(linkId = 'contact-lens/replacement') and (answer.value.ofType(Coding).code = 'contact-lens-replace-quarterly')"
      }],
      "target" : [{
        "context" : "spec",
        "element" : "duration",
        "variable" : "d"
      }],
      "rule" : [{
        "name" : "value",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "value",
          "transform" : "copy",
          "parameter" : [{
            "valueInteger" : 3
          }]
        }]
      },
      {
        "name" : "unit",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "unit",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "months"
          }]
        }]
      },
      {
        "name" : "system",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "system",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "http://unitsofmeasure.org"
          }]
        }]
      },
      {
        "name" : "code",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "code",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "mo"
          }]
        }]
      }]
    },
    {
      "name" : "yearly",
      "source" : [{
        "context" : "cl",
        "element" : "item",
        "variable" : "it",
        "condition" : "(linkId = 'contact-lens/replacement') and (answer.value.ofType(Coding).code = 'contact-lens-replace-yearly')"
      }],
      "target" : [{
        "context" : "spec",
        "element" : "duration",
        "variable" : "d"
      }],
      "rule" : [{
        "name" : "value",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "value",
          "transform" : "copy",
          "parameter" : [{
            "valueInteger" : 1
          }]
        }]
      },
      {
        "name" : "unit",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "unit",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "year"
          }]
        }]
      },
      {
        "name" : "system",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "system",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "http://unitsofmeasure.org"
          }]
        }]
      },
      {
        "name" : "code",
        "source" : [{
          "context" : "it"
        }],
        "target" : [{
          "context" : "d",
          "element" : "code",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "a"
          }]
        }]
      }]
    },
    {
      "name" : "prescriptionNotes",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "spec"
      }],
      "dependent" : [{
        "name" : "PrescriptionNotes",
        "parameter" : [{
          "valueId" : "qr"
        },
        {
          "valueId" : "spec"
        }]
      }]
    }]
  },
  {
    "name" : "EyewearMeasurements",
    "documentation" : "─────────────────────────────────────────────────────────────────────────────\r\nPupillary distance and visual acuity\r\nNeither has a home in VisionPrescription, and LOINC names both exactly, per\r\neye, on a glasses lens prescription -- so each is its own Observation under\r\nits own code rather than prose in a note. The codes were looked up, not\r\nassumed; each display below is LOINC's own:\r\ndistance (DV)            near (NV)\r\nR-PD       28840-7                  28841-5       mm\r\nL-PD       28857-1                  55985-6       mm\r\nR-VA       28831-6                  28839-9       as written\r\nL-VA       28847-2                  28856-3       as written\r\nThe PD without a qualifier is LOINC's distance PD; near is the one it\r\nqualifies. Visual acuity is kept as the string the prescriber wrote -- 6/6,\r\n6/9, N6, CF -- because the notations mix Snellen fractions, N-point print\r\nsizes and counting fingers, and forcing them into a Ratio would lose the ones\r\nthat are not fractions.\r\nNothing on VisionPrescription can point at these. They are tied to it by the\r\nencounter, by `derivedFrom` naming the same response, and by the same\r\nprovenance tag.\r\n─────────────────────────────────────────────────────────────────────────────",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "ew",
      "mode" : "source"
    },
    {
      "name" : "bundle",
      "type" : "Bundle",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "right",
      "source" : [{
        "context" : "ew",
        "element" : "item",
        "variable" : "eye",
        "condition" : "linkId = 'eyewear/right'"
      }],
      "rule" : [{
        "name" : "rightDistance",
        "source" : [{
          "context" : "eye",
          "element" : "item",
          "variable" : "row",
          "condition" : "linkId = 'eyewear/right/distance'"
        }],
        "rule" : [{
          "name" : "rightDistancePd",
          "source" : [{
            "context" : "row",
            "element" : "item",
            "variable" : "it",
            "condition" : "(linkId = 'eyewear/right/distance/pd') and answer.value.ofType(decimal).exists()"
          }],
          "target" : [{
            "context" : "bundle",
            "element" : "entry",
            "variable" : "entry"
          },
          {
            "context" : "entry",
            "element" : "resource",
            "variable" : "obs",
            "transform" : "create",
            "parameter" : [{
              "valueString" : "Observation"
            }]
          }],
          "rule" : [{
            "name" : "base",
            "source" : [{
              "context" : "qr"
            }],
            "target" : [{
              "context" : "obs"
            },
            {
              "context" : "entry"
            }],
            "dependent" : [{
              "name" : "BuildObservationBase",
              "parameter" : [{
                "valueId" : "qr"
              },
              {
                "valueId" : "obs"
              },
              {
                "valueId" : "entry"
              }]
            }]
          },
          {
            "name" : "code",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs",
              "element" : "code",
              "variable" : "code"
            }],
            "rule" : [{
              "name" : "coding",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "coding",
                "variable" : "coding"
              }],
              "rule" : [{
                "name" : "system",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "system",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "http://loinc.org"
                  }]
                }]
              },
              {
                "name" : "code",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "code",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "28840-7"
                  }]
                }]
              },
              {
                "name" : "display",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "display",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "Right glasses lens prescription Pupillary distance.monocular"
                  }]
                }]
              }]
            },
            {
              "name" : "text",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "text",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "Right eye pupillary distance, distance vision (R-PD, DV)"
                }]
              }]
            }]
          },
          {
            "name" : "value",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs"
            }],
            "dependent" : [{
              "name" : "SetMillimetres",
              "parameter" : [{
                "valueId" : "it"
              },
              {
                "valueId" : "obs"
              }]
            }]
          }]
        },
        {
          "name" : "rightDistanceVa",
          "source" : [{
            "context" : "row",
            "element" : "item",
            "variable" : "it",
            "condition" : "(linkId = 'eyewear/right/distance/va') and answer.value.ofType(string).exists()"
          }],
          "target" : [{
            "context" : "bundle",
            "element" : "entry",
            "variable" : "entry"
          },
          {
            "context" : "entry",
            "element" : "resource",
            "variable" : "obs",
            "transform" : "create",
            "parameter" : [{
              "valueString" : "Observation"
            }]
          }],
          "rule" : [{
            "name" : "base",
            "source" : [{
              "context" : "qr"
            }],
            "target" : [{
              "context" : "obs"
            },
            {
              "context" : "entry"
            }],
            "dependent" : [{
              "name" : "BuildObservationBase",
              "parameter" : [{
                "valueId" : "qr"
              },
              {
                "valueId" : "obs"
              },
              {
                "valueId" : "entry"
              }]
            }]
          },
          {
            "name" : "code",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs",
              "element" : "code",
              "variable" : "code"
            }],
            "rule" : [{
              "name" : "coding",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "coding",
                "variable" : "coding"
              }],
              "rule" : [{
                "name" : "system",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "system",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "http://loinc.org"
                  }]
                }]
              },
              {
                "name" : "code",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "code",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "28831-6"
                  }]
                }]
              },
              {
                "name" : "display",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "display",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "Right glasses lens prescription Visual acuity far"
                  }]
                }]
              }]
            },
            {
              "name" : "text",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "text",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "Right eye visual acuity, distance vision (R-VA, DV)"
                }]
              }]
            }]
          },
          {
            "name" : "value",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs"
            }],
            "dependent" : [{
              "name" : "SetAcuity",
              "parameter" : [{
                "valueId" : "it"
              },
              {
                "valueId" : "obs"
              }]
            }]
          }]
        }]
      },
      {
        "name" : "rightNear",
        "source" : [{
          "context" : "eye",
          "element" : "item",
          "variable" : "row",
          "condition" : "linkId = 'eyewear/right/near'"
        }],
        "rule" : [{
          "name" : "rightNearPd",
          "source" : [{
            "context" : "row",
            "element" : "item",
            "variable" : "it",
            "condition" : "(linkId = 'eyewear/right/near/pd') and answer.value.ofType(decimal).exists()"
          }],
          "target" : [{
            "context" : "bundle",
            "element" : "entry",
            "variable" : "entry"
          },
          {
            "context" : "entry",
            "element" : "resource",
            "variable" : "obs",
            "transform" : "create",
            "parameter" : [{
              "valueString" : "Observation"
            }]
          }],
          "rule" : [{
            "name" : "base",
            "source" : [{
              "context" : "qr"
            }],
            "target" : [{
              "context" : "obs"
            },
            {
              "context" : "entry"
            }],
            "dependent" : [{
              "name" : "BuildObservationBase",
              "parameter" : [{
                "valueId" : "qr"
              },
              {
                "valueId" : "obs"
              },
              {
                "valueId" : "entry"
              }]
            }]
          },
          {
            "name" : "code",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs",
              "element" : "code",
              "variable" : "code"
            }],
            "rule" : [{
              "name" : "coding",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "coding",
                "variable" : "coding"
              }],
              "rule" : [{
                "name" : "system",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "system",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "http://loinc.org"
                  }]
                }]
              },
              {
                "name" : "code",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "code",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "28841-5"
                  }]
                }]
              },
              {
                "name" : "display",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "display",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "Right glasses lens prescription Pupillary distance.monocular near"
                  }]
                }]
              }]
            },
            {
              "name" : "text",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "text",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "Right eye pupillary distance, near vision (R-PD, NV)"
                }]
              }]
            }]
          },
          {
            "name" : "value",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs"
            }],
            "dependent" : [{
              "name" : "SetMillimetres",
              "parameter" : [{
                "valueId" : "it"
              },
              {
                "valueId" : "obs"
              }]
            }]
          }]
        },
        {
          "name" : "rightNearVa",
          "source" : [{
            "context" : "row",
            "element" : "item",
            "variable" : "it",
            "condition" : "(linkId = 'eyewear/right/near/va') and answer.value.ofType(string).exists()"
          }],
          "target" : [{
            "context" : "bundle",
            "element" : "entry",
            "variable" : "entry"
          },
          {
            "context" : "entry",
            "element" : "resource",
            "variable" : "obs",
            "transform" : "create",
            "parameter" : [{
              "valueString" : "Observation"
            }]
          }],
          "rule" : [{
            "name" : "base",
            "source" : [{
              "context" : "qr"
            }],
            "target" : [{
              "context" : "obs"
            },
            {
              "context" : "entry"
            }],
            "dependent" : [{
              "name" : "BuildObservationBase",
              "parameter" : [{
                "valueId" : "qr"
              },
              {
                "valueId" : "obs"
              },
              {
                "valueId" : "entry"
              }]
            }]
          },
          {
            "name" : "code",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs",
              "element" : "code",
              "variable" : "code"
            }],
            "rule" : [{
              "name" : "coding",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "coding",
                "variable" : "coding"
              }],
              "rule" : [{
                "name" : "system",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "system",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "http://loinc.org"
                  }]
                }]
              },
              {
                "name" : "code",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "code",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "28839-9"
                  }]
                }]
              },
              {
                "name" : "display",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "display",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "Right glasses lens prescription Visual acuity near"
                  }]
                }]
              }]
            },
            {
              "name" : "text",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "text",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "Right eye visual acuity, near vision (R-VA, NV)"
                }]
              }]
            }]
          },
          {
            "name" : "value",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs"
            }],
            "dependent" : [{
              "name" : "SetAcuity",
              "parameter" : [{
                "valueId" : "it"
              },
              {
                "valueId" : "obs"
              }]
            }]
          }]
        }]
      }]
    },
    {
      "name" : "left",
      "source" : [{
        "context" : "ew",
        "element" : "item",
        "variable" : "eye",
        "condition" : "linkId = 'eyewear/left'"
      }],
      "rule" : [{
        "name" : "leftDistance",
        "source" : [{
          "context" : "eye",
          "element" : "item",
          "variable" : "row",
          "condition" : "linkId = 'eyewear/left/distance'"
        }],
        "rule" : [{
          "name" : "leftDistancePd",
          "source" : [{
            "context" : "row",
            "element" : "item",
            "variable" : "it",
            "condition" : "(linkId = 'eyewear/left/distance/pd') and answer.value.ofType(decimal).exists()"
          }],
          "target" : [{
            "context" : "bundle",
            "element" : "entry",
            "variable" : "entry"
          },
          {
            "context" : "entry",
            "element" : "resource",
            "variable" : "obs",
            "transform" : "create",
            "parameter" : [{
              "valueString" : "Observation"
            }]
          }],
          "rule" : [{
            "name" : "base",
            "source" : [{
              "context" : "qr"
            }],
            "target" : [{
              "context" : "obs"
            },
            {
              "context" : "entry"
            }],
            "dependent" : [{
              "name" : "BuildObservationBase",
              "parameter" : [{
                "valueId" : "qr"
              },
              {
                "valueId" : "obs"
              },
              {
                "valueId" : "entry"
              }]
            }]
          },
          {
            "name" : "code",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs",
              "element" : "code",
              "variable" : "code"
            }],
            "rule" : [{
              "name" : "coding",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "coding",
                "variable" : "coding"
              }],
              "rule" : [{
                "name" : "system",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "system",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "http://loinc.org"
                  }]
                }]
              },
              {
                "name" : "code",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "code",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "28857-1"
                  }]
                }]
              },
              {
                "name" : "display",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "display",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "Left glasses lens prescription Pupillary distance.monocular"
                  }]
                }]
              }]
            },
            {
              "name" : "text",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "text",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "Left eye pupillary distance, distance vision (L-PD, DV)"
                }]
              }]
            }]
          },
          {
            "name" : "value",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs"
            }],
            "dependent" : [{
              "name" : "SetMillimetres",
              "parameter" : [{
                "valueId" : "it"
              },
              {
                "valueId" : "obs"
              }]
            }]
          }]
        },
        {
          "name" : "leftDistanceVa",
          "source" : [{
            "context" : "row",
            "element" : "item",
            "variable" : "it",
            "condition" : "(linkId = 'eyewear/left/distance/va') and answer.value.ofType(string).exists()"
          }],
          "target" : [{
            "context" : "bundle",
            "element" : "entry",
            "variable" : "entry"
          },
          {
            "context" : "entry",
            "element" : "resource",
            "variable" : "obs",
            "transform" : "create",
            "parameter" : [{
              "valueString" : "Observation"
            }]
          }],
          "rule" : [{
            "name" : "base",
            "source" : [{
              "context" : "qr"
            }],
            "target" : [{
              "context" : "obs"
            },
            {
              "context" : "entry"
            }],
            "dependent" : [{
              "name" : "BuildObservationBase",
              "parameter" : [{
                "valueId" : "qr"
              },
              {
                "valueId" : "obs"
              },
              {
                "valueId" : "entry"
              }]
            }]
          },
          {
            "name" : "code",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs",
              "element" : "code",
              "variable" : "code"
            }],
            "rule" : [{
              "name" : "coding",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "coding",
                "variable" : "coding"
              }],
              "rule" : [{
                "name" : "system",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "system",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "http://loinc.org"
                  }]
                }]
              },
              {
                "name" : "code",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "code",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "28847-2"
                  }]
                }]
              },
              {
                "name" : "display",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "display",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "Left glasses lens prescription Visual acuity far"
                  }]
                }]
              }]
            },
            {
              "name" : "text",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "text",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "Left eye visual acuity, distance vision (L-VA, DV)"
                }]
              }]
            }]
          },
          {
            "name" : "value",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs"
            }],
            "dependent" : [{
              "name" : "SetAcuity",
              "parameter" : [{
                "valueId" : "it"
              },
              {
                "valueId" : "obs"
              }]
            }]
          }]
        }]
      },
      {
        "name" : "leftNear",
        "source" : [{
          "context" : "eye",
          "element" : "item",
          "variable" : "row",
          "condition" : "linkId = 'eyewear/left/near'"
        }],
        "rule" : [{
          "name" : "leftNearPd",
          "source" : [{
            "context" : "row",
            "element" : "item",
            "variable" : "it",
            "condition" : "(linkId = 'eyewear/left/near/pd') and answer.value.ofType(decimal).exists()"
          }],
          "target" : [{
            "context" : "bundle",
            "element" : "entry",
            "variable" : "entry"
          },
          {
            "context" : "entry",
            "element" : "resource",
            "variable" : "obs",
            "transform" : "create",
            "parameter" : [{
              "valueString" : "Observation"
            }]
          }],
          "rule" : [{
            "name" : "base",
            "source" : [{
              "context" : "qr"
            }],
            "target" : [{
              "context" : "obs"
            },
            {
              "context" : "entry"
            }],
            "dependent" : [{
              "name" : "BuildObservationBase",
              "parameter" : [{
                "valueId" : "qr"
              },
              {
                "valueId" : "obs"
              },
              {
                "valueId" : "entry"
              }]
            }]
          },
          {
            "name" : "code",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs",
              "element" : "code",
              "variable" : "code"
            }],
            "rule" : [{
              "name" : "coding",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "coding",
                "variable" : "coding"
              }],
              "rule" : [{
                "name" : "system",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "system",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "http://loinc.org"
                  }]
                }]
              },
              {
                "name" : "code",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "code",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "55985-6"
                  }]
                }]
              },
              {
                "name" : "display",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "display",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "Left glasses lens prescription Pupillary distance.monocular near"
                  }]
                }]
              }]
            },
            {
              "name" : "text",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "text",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "Left eye pupillary distance, near vision (L-PD, NV)"
                }]
              }]
            }]
          },
          {
            "name" : "value",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs"
            }],
            "dependent" : [{
              "name" : "SetMillimetres",
              "parameter" : [{
                "valueId" : "it"
              },
              {
                "valueId" : "obs"
              }]
            }]
          }]
        },
        {
          "name" : "leftNearVa",
          "source" : [{
            "context" : "row",
            "element" : "item",
            "variable" : "it",
            "condition" : "(linkId = 'eyewear/left/near/va') and answer.value.ofType(string).exists()"
          }],
          "target" : [{
            "context" : "bundle",
            "element" : "entry",
            "variable" : "entry"
          },
          {
            "context" : "entry",
            "element" : "resource",
            "variable" : "obs",
            "transform" : "create",
            "parameter" : [{
              "valueString" : "Observation"
            }]
          }],
          "rule" : [{
            "name" : "base",
            "source" : [{
              "context" : "qr"
            }],
            "target" : [{
              "context" : "obs"
            },
            {
              "context" : "entry"
            }],
            "dependent" : [{
              "name" : "BuildObservationBase",
              "parameter" : [{
                "valueId" : "qr"
              },
              {
                "valueId" : "obs"
              },
              {
                "valueId" : "entry"
              }]
            }]
          },
          {
            "name" : "code",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs",
              "element" : "code",
              "variable" : "code"
            }],
            "rule" : [{
              "name" : "coding",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "coding",
                "variable" : "coding"
              }],
              "rule" : [{
                "name" : "system",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "system",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "http://loinc.org"
                  }]
                }]
              },
              {
                "name" : "code",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "code",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "28856-3"
                  }]
                }]
              },
              {
                "name" : "display",
                "source" : [{
                  "context" : "it"
                }],
                "target" : [{
                  "context" : "coding",
                  "element" : "display",
                  "transform" : "copy",
                  "parameter" : [{
                    "valueString" : "Left glasses lens prescription Visual acuity near"
                  }]
                }]
              }]
            },
            {
              "name" : "text",
              "source" : [{
                "context" : "it"
              }],
              "target" : [{
                "context" : "code",
                "element" : "text",
                "transform" : "copy",
                "parameter" : [{
                  "valueString" : "Left eye visual acuity, near vision (L-VA, NV)"
                }]
              }]
            }]
          },
          {
            "name" : "value",
            "source" : [{
              "context" : "it"
            }],
            "target" : [{
              "context" : "obs"
            }],
            "dependent" : [{
              "name" : "SetAcuity",
              "parameter" : [{
                "valueId" : "it"
              },
              {
                "valueId" : "obs"
              }]
            }]
          }]
        }]
      }]
    }]
  },
  {
    "name" : "SetMillimetres",
    "documentation" : "`Observation.value[x]` has no decimal choice, so the PD is built as a UCUM\r\nQuantity. The unit is fixed by the form.",
    "input" : [{
      "name" : "it",
      "mode" : "source"
    },
    {
      "name" : "obs",
      "type" : "Observation",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "answer",
      "source" : [{
        "context" : "it",
        "element" : "answer",
        "listMode" : "first",
        "variable" : "a"
      }],
      "rule" : [{
        "name" : "quantity",
        "source" : [{
          "context" : "a",
          "element" : "value",
          "variable" : "v"
        }],
        "target" : [{
          "context" : "obs",
          "element" : "value",
          "variable" : "q",
          "transform" : "create",
          "parameter" : [{
            "valueString" : "Quantity"
          }]
        }],
        "rule" : [{
          "name" : "quantityValue",
          "source" : [{
            "context" : "v"
          }],
          "target" : [{
            "context" : "q",
            "element" : "value",
            "transform" : "copy",
            "parameter" : [{
              "valueId" : "v"
            }]
          }]
        },
        {
          "name" : "quantityUnit",
          "source" : [{
            "context" : "v"
          }],
          "target" : [{
            "context" : "q",
            "element" : "unit",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "mm"
            }]
          }]
        },
        {
          "name" : "quantitySystem",
          "source" : [{
            "context" : "v"
          }],
          "target" : [{
            "context" : "q",
            "element" : "system",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "http://unitsofmeasure.org"
            }]
          }]
        },
        {
          "name" : "quantityCode",
          "source" : [{
            "context" : "v"
          }],
          "target" : [{
            "context" : "q",
            "element" : "code",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "mm"
            }]
          }]
        }]
      }]
    }]
  },
  {
    "name" : "SetAcuity",
    "input" : [{
      "name" : "it",
      "mode" : "source"
    },
    {
      "name" : "obs",
      "type" : "Observation",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "answer",
      "source" : [{
        "context" : "it",
        "element" : "answer",
        "listMode" : "first",
        "variable" : "a"
      }],
      "rule" : [{
        "name" : "acuityValue",
        "source" : [{
          "context" : "a",
          "element" : "value",
          "variable" : "v"
        }],
        "target" : [{
          "context" : "obs",
          "element" : "value",
          "transform" : "copy",
          "parameter" : [{
            "valueId" : "v"
          }]
        }]
      }]
    }]
  },
  {
    "name" : "BuildObservationBase",
    "documentation" : "─────────────────────────────────────────────────────────────────────────────\r\nShared scaffolding. Repeated in each map rather than imported: the transform\r\nengine resolves `imports` against whatever StructureMaps happen to be on the\r\nserver, and a form that stops extracting because a shared map was not\r\nuploaded is a worse failure than a duplicated group.\r\n─────────────────────────────────────────────────────────────────────────────",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "obs",
      "type" : "Observation",
      "mode" : "target"
    },
    {
      "name" : "entry",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "responseProvenance",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "obs"
      }],
      "dependent" : [{
        "name" : "SetResponseProvenance",
        "parameter" : [{
          "valueId" : "qr"
        },
        {
          "valueId" : "obs"
        }]
      }]
    },
    {
      "name" : "idAndFullUrl",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "obs",
        "element" : "id",
        "transform" : "uuid"
      }],
      "dependent" : [{
        "name" : "SetObservationFullUrl",
        "parameter" : [{
          "valueId" : "obs"
        },
        {
          "valueId" : "entry"
        }]
      }]
    },
    {
      "name" : "entryRequest",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "entry",
        "element" : "request",
        "variable" : "request"
      }],
      "rule" : [{
        "name" : "requestMethod",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "request",
          "element" : "method",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "POST"
          }]
        }]
      },
      {
        "name" : "requestUrl",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "request",
          "element" : "url",
          "transform" : "copy",
          "parameter" : [{
            "valueString" : "Observation"
          }]
        }]
      }]
    },
    {
      "name" : "status",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "obs",
        "element" : "status",
        "transform" : "copy",
        "parameter" : [{
          "valueString" : "final"
        }]
      }]
    },
    {
      "name" : "category",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "obs",
        "element" : "category",
        "variable" : "cat"
      }],
      "rule" : [{
        "name" : "categoryCoding",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "cat",
          "element" : "coding",
          "variable" : "coding"
        }],
        "rule" : [{
          "name" : "categorySystem",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "system",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "http://terminology.hl7.org/CodeSystem/observation-category"
            }]
          }]
        },
        {
          "name" : "categoryCode",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "code",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "exam"
            }]
          }]
        },
        {
          "name" : "categoryDisplay",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "coding",
            "element" : "display",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "Exam"
            }]
          }]
        }]
      }]
    },
    {
      "name" : "subject",
      "source" : [{
        "context" : "qr",
        "element" : "subject",
        "variable" : "s",
        "condition" : "(reference.exists() and (reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Patient')))"
      }],
      "target" : [{
        "context" : "obs",
        "element" : "subject",
        "transform" : "copy",
        "parameter" : [{
          "valueId" : "s"
        }]
      }]
    },
    {
      "name" : "encounter",
      "source" : [{
        "context" : "qr",
        "element" : "encounter",
        "variable" : "e",
        "condition" : "(reference.exists() and (reference.startsWith('Encounter/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Encounter')))"
      }],
      "target" : [{
        "context" : "obs",
        "element" : "encounter",
        "transform" : "copy",
        "parameter" : [{
          "valueId" : "e"
        }]
      }]
    },
    {
      "name" : "effective",
      "source" : [{
        "context" : "qr",
        "element" : "authored",
        "variable" : "t"
      }],
      "target" : [{
        "context" : "obs",
        "element" : "effective",
        "transform" : "copy",
        "parameter" : [{
          "valueId" : "t"
        }]
      }],
      "documentation" : "Measured when the prescription was written, which is the response's\r\n`authored` -- the form does not ask for a date."
    },
    {
      "name" : "performerFromAuthor",
      "source" : [{
        "context" : "qr",
        "element" : "author",
        "variable" : "a",
        "condition" : "(reference.matches('(^|/)(Practitioner|PractitionerRole)/[^/]+$')) and ((reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient'))))"
      }],
      "target" : [{
        "context" : "obs",
        "element" : "performer",
        "transform" : "copy",
        "parameter" : [{
          "valueId" : "a"
        }]
      }],
      "documentation" : "Measured by the prescriber, chosen the same way as on the prescription."
    },
    {
      "name" : "performerSourceFallback",
      "source" : [{
        "context" : "qr",
        "condition" : "author.where(((reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient'))))).exists().not()"
      }],
      "rule" : [{
        "name" : "performerFromSource",
        "source" : [{
          "context" : "qr",
          "element" : "source",
          "variable" : "s",
          "condition" : "(reference.matches('(^|/)(Practitioner|PractitionerRole)/[^/]+$')) and ((reference.exists() and (reference.startsWith('Organization/') or reference.startsWith('Patient/'))) or (reference.empty() and (type.empty() or ('/' + type).endsWith('/Organization') or ('/' + type).endsWith('/Patient'))))"
        }],
        "target" : [{
          "context" : "obs",
          "element" : "performer",
          "transform" : "copy",
          "parameter" : [{
            "valueId" : "s"
          }]
        }]
      }]
    },
    {
      "name" : "linkQuestionnaireResponse",
      "source" : [{
        "context" : "qr",
        "element" : "id",
        "variable" : "qid",
        "condition" : "$this.hasValue()"
      }],
      "target" : [{
        "context" : "obs",
        "element" : "derivedFrom",
        "variable" : "ref",
        "transform" : "create",
        "parameter" : [{
          "valueString" : "Reference"
        }]
      },
      {
        "context" : "ref",
        "element" : "reference",
        "transform" : "copy",
        "parameter" : [{
          "valueId" : "qid"
        }]
      }],
      "documentation" : "A stored response's id already reads \"QuestionnaireResponse/<id>\", so it is\r\na relative reference as it stands. The hasValue() guard is what stops an\r\nunsaved response -- one posted straight to $extract rather than saved first\r\n-- from writing \"QuestionnaireResponse/null\" into the record."
    }]
  },
  {
    "name" : "SetObservationFullUrl",
    "input" : [{
      "name" : "obs",
      "type" : "Observation",
      "mode" : "source"
    },
    {
      "name" : "entry",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "assignFullUrl",
      "source" : [{
        "context" : "obs",
        "element" : "id",
        "variable" : "id"
      }],
      "target" : [{
        "context" : "entry",
        "element" : "fullUrl",
        "transform" : "append",
        "parameter" : [{
          "valueString" : "https://fhir.slade360.co.ke/fhir/Observation/"
        },
        {
          "valueId" : "id"
        }]
      }]
    }]
  },
  {
    "name" : "SetVisionPrescriptionFullUrl",
    "input" : [{
      "name" : "vp",
      "type" : "VisionPrescription",
      "mode" : "source"
    },
    {
      "name" : "entry",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "assignFullUrl",
      "source" : [{
        "context" : "vp",
        "element" : "id",
        "variable" : "id"
      }],
      "target" : [{
        "context" : "entry",
        "element" : "fullUrl",
        "transform" : "append",
        "parameter" : [{
          "valueString" : "https://fhir.slade360.co.ke/fhir/VisionPrescription/"
        },
        {
          "valueId" : "id"
        }]
      }]
    }]
  },
  {
    "name" : "SetResponseProvenance",
    "documentation" : "── Provenance and tenancy ───────────────────────────────────────────────────\r\nTwo tags on everything this map creates. The first says which form produced\r\nit -- the form's document type, not the questionnaire's id, because every\r\nenvironment mints its own ids and there is one set of maps. The second copies\r\nthe tenant tags off the response, because nothing else on the path puts them\r\nthere.",
    "input" : [{
      "name" : "qr",
      "type" : "QR",
      "mode" : "source"
    },
    {
      "name" : "r",
      "mode" : "target"
    }],
    "rule" : [{
      "name" : "provenanceMeta",
      "source" : [{
        "context" : "qr"
      }],
      "target" : [{
        "context" : "r",
        "element" : "meta",
        "variable" : "m"
      }],
      "rule" : [{
        "name" : "provenanceTag",
        "source" : [{
          "context" : "qr"
        }],
        "target" : [{
          "context" : "m",
          "element" : "tag",
          "variable" : "t"
        }],
        "rule" : [{
          "name" : "provenanceSystem",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "t",
            "element" : "system",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "http://slade360edi.com/questionnaire-provenance"
            }]
          }]
        },
        {
          "name" : "provenanceCode",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "t",
            "element" : "code",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "optical-prescription"
            }]
          }]
        },
        {
          "name" : "provenanceDisplay",
          "source" : [{
            "context" : "qr"
          }],
          "target" : [{
            "context" : "t",
            "element" : "display",
            "transform" : "copy",
            "parameter" : [{
              "valueString" : "Optical prescription"
            }]
          }]
        }]
      }]
    },
    {
      "name" : "tenantTags",
      "source" : [{
        "context" : "qr",
        "element" : "meta",
        "variable" : "qm"
      }],
      "rule" : [{
        "name" : "copyTag",
        "source" : [{
          "context" : "qm",
          "element" : "tag",
          "variable" : "qt"
        }],
        "target" : [{
          "context" : "r",
          "element" : "meta",
          "variable" : "m"
        },
        {
          "context" : "m",
          "element" : "tag",
          "transform" : "copy",
          "parameter" : [{
            "valueId" : "qt"
          }]
        }]
      }],
      "documentation" : "`meta` is 0..1, so this lands on the same meta the rule above created\r\nrather than a second one."
    }]
  }]
}