From 1146a8a21f93c559ac382c71a88f65825a1113db Mon Sep 17 00:00:00 2001 From: David Gregorczyk <54440227+d-gregorczyk@users.noreply.github.com> Date: Fri, 30 Aug 2024 18:16:49 +0200 Subject: [PATCH] #152 Add discovery proxy transactions scaffold and actor description. (#300) * #152 Add discovery proxy transactions scaffold and actor description. * #152 Add more content; add ack message to transaction sequence. * #152 Tweak register message text * #152 Add DEV-47, apply tweaks von DEV-46 * #152 Add DEV-47 probe and resolve * #152 Various fixes * #152 Various fixes * #152 Add MDPWS binding contents for DEV-46 * #152 Add MDPWS binding contents for DEV-47; minor fixes to adhoc message excerpts * #152 Add MDPWS binding contents to outline. * #152 Fixes to DEV-47 * #152 Fixes to DEV-47 * Fix yml to use new versions of github action plugins * Fix yml to use new versions of github action plugins * #152 Update references to DEV-47 outlines * Replace gradle-build-action with newer setup-gradle * #152 Add discovery proxy sources and additional chapter * Change path of setup-gradle@v3 * Use setup-gradle@v4 * Use setup-gradle@v4 * Use setup-gradle@v4 * #152 Fix findings * DP Updates to TF-0 & TF-1 - Initial Initial updates to add a transaction name to the TF-0 Transactions listing + the SDPi-P Actor model update & transaction table update & placeholder for the DP option description section. * #152 Add discovery proxy basic sequence diagram * #152 Enrich OID table caption in the discovery proxy section * TF-1 Updates Updated DP TF-1 content, specifically to the SDPi-P transaction table, the Actors and Options section (with its own table) and the Discovery Proxy Option section. Content is rough but sufficient for discussion. * Updated Sequence Diagram & Actor Diagram Sequence Diagram - added secure groupings for all transactions Actor Diagram - simplified to "Discovery Proxy" Updated Change Log with #152 addition A fix to the TF-1 SDPiP Transactions table to re-enable rendering of the end notes ... hopefully! * Trying to Fix SDPi-P Transaction Table Notes Notes are not appearing on last row of the transaction table. Also changed the note numbering based on order from the top of the table. * Fixed SDPi-P Transactions Table Notes Found the extra vertical bar! * Updated DP Transaction Names & PUML Diagram Titles & SDPi Transaction Table Updates * Removed "SDPi" from many of the TF-2 transaction sequence diagram titles - transactions are not profile specific * Refactored DEV-46 and DEV-47 transaction names + reference label text * changed the DP transactions in the SDPi-P Actors & Transactions table to "O" vs. "C" * Integrated comments from David's review of the option bullets * Commented out the version text box from the options section but in the comments kept the potential future options,. * Updated TF-1 DP Option Text Converted the bulleted content into something readable and (generally) tagged. * #152 Fix formatting * #152 Fix formatting * #152 Try to fix wrong directory for PUML includes in CI * #152 Minor fixes * #152 Add more space to images, tables and listings. * Changed "SOMDS Discovery Proxy" to "Discovery Proxy" Left over changes * Editorial Updates based on review & DCC discussion Numerous updates including ... * removing "SOMDS" from "Discovery Proxy" actor name * Discovery Proxy actor brief description more generic * Use of "Transaction" for a specific transaction now uppercase "T" * Managed Discovery Option renamed (from Discovery Proxy Option) * Added "heartbeat" requirement for DP as part of managed discovery behaviour Others ... * Fixed PUML file name error Refactoring PUML file name inserted a space in the file name ... ! * Fixed another file name error Or didn't fix it previously? * Highlighted "shall" statements for review & requirements block addition #shall# added in option block to ensure review and either rewording, removal, or requirements block addition * Updates to Discovery Proxy Option & DEV-47 Title Changed include: * Reset "Transaction" to lowercase "transaction" per guidance from Mary J. * Simplified DEV-47 to "Retrieve Network Presence", leaving off "Metadata" * Added requirements blocks for the option "shall" statements * Transaction Description Updates + MD Option Updates * Updated DEV-46 & DEV-47 transaction summaries to match the updated transaction names * Added as a test, additional requirement metadata to the MD Option section * Changed the arrow direction of the Bye() message for DEV-47 * Test of Inter-Requirement Links Added forward / backward requirement anchor references to R1023. fingers crossed * Tweak update because workflow automation failed 2nd try at triggering build workflow * Updates from SDPi Friday Review Updates from review corrections. --------- Co-authored-by: Todd "AFC!" Cooper --- .../org/sdpi/ConvertAndVerifySupplement.kt | 10 +- .github/copy_images.sh | 2 +- .github/workflows/feature-review-build.yml | 15 +- .github/workflows/latest-master-build.yml | 15 +- CHANGELOG.md | 4 + asciidoc/docinfo.html | 15 + asciidoc/document-declarations.adoc | 3 - asciidoc/images/vol1-diagram-sdpi-p-actor.svg | 357 ++++++++++-------- ...-appendix-a-mdpws-dev-24-resolve-match.xml | 2 +- ...ol2-clause-appendix-a-mdpws-dev-46-bye.xml | 18 + ...appendix-a-mdpws-dev-46-directed-probe.xml | 15 + ...-clause-appendix-a-mdpws-dev-46-hello.xml} | 47 ++- ...ol2-clause-appendix-a-mdpws-dev-47-bye.xml | 18 + ...2-clause-appendix-a-mdpws-dev-47-hello.xml | 23 ++ ...se-appendix-a-mdpws-dev-47-probe-match.xml | 27 ++ ...2-clause-appendix-a-mdpws-dev-47-probe.xml | 18 + ...-appendix-a-mdpws-dev-47-resolve-match.xml | 27 ++ ...clause-appendix-a-mdpws-dev-47-resolve.xml | 18 + asciidoc/plantuml/common_style.inc.puml | 9 + ...a-delegation-example-sequence-diagram.puml | 2 + ...-a-reporting-example-sequence-diagram.puml | 2 + ...igure-sdpi-p-example-sequence-diagram.puml | 3 +- ...ged-discovery-option-sequence-diagram.puml | 38 ++ ...igure-sdpi-r-example-sequence-diagram.puml | 2 +- ...gure-sdpi-xc-example-sequence-diagram.puml | 2 +- .../plantuml/vol2-figure-dev-23-sequence.puml | 7 +- .../plantuml/vol2-figure-dev-24-sequence.puml | 4 +- .../plantuml/vol2-figure-dev-25-sequence.puml | 5 +- .../plantuml/vol2-figure-dev-27-sequence.puml | 4 +- .../plantuml/vol2-figure-dev-28-sequence.puml | 4 +- .../plantuml/vol2-figure-dev-29-sequence.puml | 4 +- .../plantuml/vol2-figure-dev-30-sequence.puml | 4 +- .../plantuml/vol2-figure-dev-34-sequence.puml | 4 +- .../plantuml/vol2-figure-dev-35-sequence.puml | 4 +- .../plantuml/vol2-figure-dev-36-sequence.puml | 4 +- .../plantuml/vol2-figure-dev-37-sequence.puml | 4 +- .../plantuml/vol2-figure-dev-38-sequence.puml | 4 +- .../plantuml/vol2-figure-dev-39-sequence.puml | 4 +- .../plantuml/vol2-figure-dev-40-sequence.puml | 4 +- .../plantuml/vol2-figure-dev-46-sequence.puml | 19 + .../plantuml/vol2-figure-dev-47-sequence.puml | 28 ++ asciidoc/plantuml/vol2-figure-xyz.puml | 7 +- ...igure-biceps-content-module-physiomon.puml | 2 +- asciidoc/sdpi-supplement-intro.adoc | 2 - asciidoc/sdpi-supplement.adoc | 3 - asciidoc/volume0/tf0-ch-a-actors.adoc | 6 +- asciidoc/volume0/tf0-ch-b-transactions.adoc | 14 +- asciidoc/volume0/tf0-main.adoc | 6 +- asciidoc/volume1/tf1-ch-10-sdpi-p.adoc | 175 +++++++-- asciidoc/volume1/tf1-ch-11-sdpi-r.adoc | 2 - asciidoc/volume1/tf1-ch-12-sdpi-a.adoc | 2 - asciidoc/volume1/tf1-ch-2-overview.adoc | 2 - .../volume1/use-cases/tf1-ch-c-60601-1-8.adoc | 4 - asciidoc/volume2/dev-23/tf2-dev-23.adoc | 2 +- .../volume2/dev-24/tf2-ch-a-mdpws-dev-24.adoc | 1 + asciidoc/volume2/dev-24/tf2-dev-24.adoc | 2 +- asciidoc/volume2/dev-25/tf2-dev-25.adoc | 2 +- asciidoc/volume2/dev-27/tf2-dev-27.adoc | 2 +- asciidoc/volume2/dev-28/tf2-dev-28.adoc | 2 +- asciidoc/volume2/dev-29/tf2-dev-29.adoc | 2 +- asciidoc/volume2/dev-30/tf2-dev-30.adoc | 2 +- .../volume2/dev-34/tf2-ch-a-mdpws-dev-34.adoc | 2 +- asciidoc/volume2/dev-34/tf2-dev-34.adoc | 2 +- asciidoc/volume2/dev-35/tf2-dev-35.adoc | 2 +- asciidoc/volume2/dev-36/tf2-dev-36.adoc | 2 +- asciidoc/volume2/dev-37/tf2-dev-37.adoc | 2 +- asciidoc/volume2/dev-38/tf2-dev-38.adoc | 2 +- asciidoc/volume2/dev-39/tf2-dev-39.adoc | 2 +- asciidoc/volume2/dev-40/tf2-dev-40.adoc | 2 +- .../volume2/dev-46/tf2-ch-a-mdpws-dev-46.adoc | 121 ++++++ .../volume2/dev-46/tf2-dev-46-summary.adoc | 3 + asciidoc/volume2/dev-46/tf2-dev-46.adoc | 90 +++++ .../volume2/dev-47/tf2-ch-a-mdpws-dev-47.adoc | 222 +++++++++++ .../volume2/dev-47/tf2-dev-47-summary.adoc | 3 + asciidoc/volume2/dev-47/tf2-dev-47.adoc | 205 ++++++++++ .../tf2-ch-a-mdpws-discovery-proxy.adoc | 79 ++++ asciidoc/volume2/tf2-ch-a-mdpws.adoc | 6 + asciidoc/volume2/tf2-main.adoc | 6 + .../tf3-ch-8.7.3-physiologic-monitor.adoc | 2 +- .../tf3-ch-b-biceps-extension-namespace.adoc | 4 + sources/discovery-proxy/DiscoveryProxy.wsdl | 100 +++++ sources/vol1-diagram-sdpi-p-actor.pptx | Bin 40789 -> 41203 bytes 82 files changed, 1582 insertions(+), 314 deletions(-) create mode 100644 asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-46-bye.xml create mode 100644 asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-46-directed-probe.xml rename asciidoc/listings/{vol2-clause-appendix-a-mdpws-dev-34-bye.xml => vol2-clause-appendix-a-mdpws-dev-46-hello.xml} (82%) create mode 100644 asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-bye.xml create mode 100644 asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-hello.xml create mode 100644 asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-probe-match.xml create mode 100644 asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-probe.xml create mode 100644 asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-resolve-match.xml create mode 100644 asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-resolve.xml create mode 100644 asciidoc/plantuml/common_style.inc.puml create mode 100644 asciidoc/plantuml/vol1-figure-sdpi-p-managed-discovery-option-sequence-diagram.puml create mode 100644 asciidoc/plantuml/vol2-figure-dev-46-sequence.puml create mode 100644 asciidoc/plantuml/vol2-figure-dev-47-sequence.puml create mode 100644 asciidoc/volume2/dev-46/tf2-ch-a-mdpws-dev-46.adoc create mode 100644 asciidoc/volume2/dev-46/tf2-dev-46-summary.adoc create mode 100644 asciidoc/volume2/dev-46/tf2-dev-46.adoc create mode 100644 asciidoc/volume2/dev-47/tf2-ch-a-mdpws-dev-47.adoc create mode 100644 asciidoc/volume2/dev-47/tf2-dev-47-summary.adoc create mode 100644 asciidoc/volume2/dev-47/tf2-dev-47.adoc create mode 100644 asciidoc/volume2/discovery-proxy/tf2-ch-a-mdpws-discovery-proxy.adoc create mode 100644 sources/discovery-proxy/DiscoveryProxy.wsdl diff --git a/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/ConvertAndVerifySupplement.kt b/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/ConvertAndVerifySupplement.kt index 84ddeef..a78dc35 100644 --- a/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/ConvertAndVerifySupplement.kt +++ b/.ci/asciidoc-converter/src/main/kotlin/org/sdpi/ConvertAndVerifySupplement.kt @@ -13,11 +13,11 @@ import org.sdpi.asciidoc.github.IssueImport import java.io.File import kotlin.system.exitProcess -fun main(args: Array) = ConvertAndVerifySupplement().main( - when (System.getenv().containsKey("CI")) { - true -> args.firstOrNull()?.split(" ") ?: listOf() // caution: blanks in quotes not covered here! - false -> args.toList() - } +fun main(args: Array) = ConvertAndVerifySupplement().main(args +// when (System.getenv().containsKey("CI")) { +// true -> args.firstOrNull()?.split(" ") ?: listOf() // caution: blanks in quotes not covered here! +// false -> args.toList() +// } ) class ConvertAndVerifySupplement : CliktCommand("convert-supplement") { diff --git a/.github/copy_images.sh b/.github/copy_images.sh index cb0b847..5e8ceff 100755 --- a/.github/copy_images.sh +++ b/.github/copy_images.sh @@ -3,7 +3,7 @@ sudo apt install graphviz gem install asciidoctor gem install asciidoctor-diagram asciidoctor -V -cd asciidoc +cd asciidoc || exit asciidoctor -r asciidoctor-diagram -D ../ sdpi-supplement.adoc cd .. mkdir sdpi-supplement diff --git a/.github/workflows/feature-review-build.yml b/.github/workflows/feature-review-build.yml index 12bdbe4..4e4b5f0 100755 --- a/.github/workflows/feature-review-build.yml +++ b/.github/workflows/feature-review-build.yml @@ -15,10 +15,10 @@ jobs: steps: - name: Checkout branch - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up JDK 11 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '11' distribution: 'temurin' @@ -31,11 +31,12 @@ jobs: ruby-version: '3.0' # Not needed with a .ruby-version file bundler-cache: true # runs 'bundle install' and caches installed gems automatically + - name: Setup gradle + uses: gradle/actions/setup-gradle@v4 + - name: Create HTML with Gradle - uses: gradle/gradle-build-action@v2 - with: - arguments: run --args="--input-file ../../asciidoc/sdpi-supplement.adoc --output-folder ../../sdpi-supplement --github-token ${{ secrets.SDPI_API_ACCESS_TOKEN_SECRET }} --backend html" - build-root-directory: .ci/asciidoc-converter + run: ./gradlew run --args="--input-file ../../asciidoc/sdpi-supplement.adoc --output-folder ../../sdpi-supplement --github-token ${{ secrets.SDPI_API_ACCESS_TOKEN_SECRET }} --backend html" + working-directory: .ci/asciidoc-converter - name: Generate PlantUML diagrams and copy images run: .github/copy_images.sh @@ -47,7 +48,7 @@ jobs: - name: Upload artifact # if: success() && github.ref == 'refs/heads/master' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: sdpi-supplement-${{ steps.extract_branch.outputs.branch }} path: sdpi-supplement diff --git a/.github/workflows/latest-master-build.yml b/.github/workflows/latest-master-build.yml index 7990122..d358344 100755 --- a/.github/workflows/latest-master-build.yml +++ b/.github/workflows/latest-master-build.yml @@ -18,10 +18,10 @@ jobs: steps: - name: Checkout branch - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up JDK 11 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '11' distribution: 'temurin' @@ -33,12 +33,13 @@ jobs: with: ruby-version: '3.0' # Not needed with a .ruby-version file bundler-cache: true # runs 'bundle install' and caches installed gems automatically - + + - name: Setup gradle + uses: gradle/actions/setup-gradle@v4 + - name: Create HTML with Gradle - uses: gradle/gradle-build-action@v2 - with: - arguments: run --args="--input-file ../../asciidoc/sdpi-supplement.adoc --output-folder ../../sdpi-supplement --github-token ${{ secrets.SDPI_API_ACCESS_TOKEN_SECRET }} --backend html" - build-root-directory: .ci/asciidoc-converter + run: ./gradlew run --args="--input-file ../../asciidoc/sdpi-supplement.adoc --output-folder ../../sdpi-supplement --github-token ${{ secrets.SDPI_API_ACCESS_TOKEN_SECRET }} --backend html" + working-directory: .ci/asciidoc-converter - name: Generate PlantUML diagrams and copy images run: .github/copy_images.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 1bbd533..ed1b5d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,10 @@ Each section shall contain a list of action items of the following format: ` + - - - - - + inkscape:current-layer="g114" /> + id="g114" + transform="translate(-160.01667,-113.68333)"> + id="rect384" + width="996.58801" + height="547.07806" + x="148.40143" + y="104.39114" /> + id="rect4" /> + d="m 695.167,241.167 h 189.666 v 78.666 H 695.167 Z m 0.666,78.333 -0.333,-0.333 h 189 l -0.333,0.333 v -78 l 0.333,0.333 h -189 l 0.333,-0.333 z" + id="path6" /> SOMDS FHIR + transform="translate(726.526,273)" + id="text8">SOMDS FHIR Gateway + transform="translate(746.193,302)" + id="text10">Gateway + id="rect12" /> Non + transform="translate(983.047,220)" + id="text14">Non - + transform="translate(1023.88,220)" + id="text16">- SOMDS + transform="translate(1031.21,220)" + id="text18">SOMDS Systems - + transform="translate(1004.4,249)" + id="text20">Systems + id="path22" /> + id="rect24" /> + d="m 695.167,329.167 h 189.666 v 78.666 H 695.167 Z m 0.666,78.333 -0.333,-0.333 h 189 l -0.333,0.333 v -78 l 0.333,0.333 h -189 l 0.333,-0.333 z" + id="path26" /> SOMDS V2 + transform="translate(736.36,361)" + id="text28">SOMDS V2 Gateway + transform="translate(746.193,390)" + id="text30">Gateway + id="rect32" /> SOMDS Connector + transform="translate(697.621,199)" + id="text34">SOMDS Connector {abstract} + transform="translate(740.767,228)" + id="text36">{abstract} + id="rect38" /> + d="m 695.167,417.167 h 189.666 v 78.666 H 695.167 Z m 0.666,78.333 -0.333,-0.333 h 189 l -0.333,0.333 v -78 l 0.333,0.333 h -189 l 0.333,-0.333 z" + id="path40" /> SOMDS Sensor + transform="translate(716.026,449)" + id="text42">SOMDS Sensor Gateway + transform="translate(746.193,478)" + id="text44">Gateway + id="rect46" /> + d="m 695.167,505.167 h 189.666 v 78.666 H 695.167 Z m 0.666,78.333 -0.333,-0.333 h 189 l -0.333,0.333 v -78 l 0.333,0.333 h -189 l 0.333,-0.333 z" + id="path48" /> SOMDS Smart + transform="translate(719.776,537)" + id="text50">SOMDS Smart App Platform + transform="translate(723.563,566)" + id="text52">App Platform + id="rect54" /> Smart Apps + transform="translate(987.77,536)" + id="text56">Smart Apps (incl. SAMD) - + transform="translate(983.717,565)" + id="text58">(incl. SAMD) + id="rect60" /> SOMDS + transform="translate(438.433,240)" + id="text62">SOMDS Provider + transform="translate(433.78,269)" + id="text64">Provider (MDIB, Services, …) + transform="translate(382.153,298)" + id="text66">(MDIB, Services, …) <<SOMDS Participant>> + transform="translate(357.284,186)" + id="text68"><<SOMDS Participant>> + id="rect70" /> SOMDS Consumer + transform="translate(385.35,468)" + id="text72">SOMDS Consumer (consume MDIB info, + transform="translate(373.823,497)" + id="text74">(consume MDIB info, invoke services, …) + transform="translate(385.103,526)" + id="text76">invoke services, …) <<SOMDS Participant>> + transform="translate(359.767,414)" + id="text78"><<SOMDS Participant>> <<SOMDS Participant>> - - + transform="translate(684.954,152)" + id="text80"><<SOMDS Participant>> Legend: + transform="translate(216.873,592)" + id="text82">Legend: + id="path84" /> + id="path86" /> SDC Communication + transform="translate(312.733,611)" + id="text88">SDC Communication Non + transform="translate(312.733,637)" + id="text90">Non - + transform="translate(344.399,637)" + id="text92">- SDC Communication + transform="translate(350.066,637)" + id="text94">SDC Communication + + Discovery + Proxy + + + + + + diff --git a/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-24-resolve-match.xml b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-24-resolve-match.xml index f41320e..48b79a3 100644 --- a/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-24-resolve-match.xml +++ b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-24-resolve-match.xml @@ -9,7 +9,7 @@ http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/ResolveMatches - urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01 + http://www.w3.org/2005/08/addressing/anonymous diff --git a/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-46-bye.xml b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-46-bye.xml new file mode 100644 index 0000000..6410b02 --- /dev/null +++ b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-46-bye.xml @@ -0,0 +1,18 @@ + + + + http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/Bye + + urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01 + + + + + + + + + diff --git a/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-46-directed-probe.xml b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-46-directed-probe.xml new file mode 100644 index 0000000..f4bb37b --- /dev/null +++ b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-46-directed-probe.xml @@ -0,0 +1,15 @@ + + + + http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/Probe + + urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01 + + + + + diff --git a/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-34-bye.xml b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-46-hello.xml similarity index 82% rename from asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-34-bye.xml rename to asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-46-hello.xml index aefdda9..4d80b17 100644 --- a/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-34-bye.xml +++ b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-46-hello.xml @@ -1,24 +1,23 @@ - - - - http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/Bye - - urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01 - - - - - - - - dpws:Device mdpws:MedicalDevice - - - - - + + + + http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/Hello + + urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01 + + + + + + + dpws:Device mdpws:MedicalDevice + sdc.mds.pkp:1.2.840.10004.20701.1.1 + + + + diff --git a/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-bye.xml b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-bye.xml new file mode 100644 index 0000000..6410b02 --- /dev/null +++ b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-bye.xml @@ -0,0 +1,18 @@ + + + + http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/Bye + + urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01 + + + + + + + + + diff --git a/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-hello.xml b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-hello.xml new file mode 100644 index 0000000..4d80b17 --- /dev/null +++ b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-hello.xml @@ -0,0 +1,23 @@ + + + + http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/Hello + + urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01 + + + + + + + dpws:Device mdpws:MedicalDevice + sdc.mds.pkp:1.2.840.10004.20701.1.1 + + + + diff --git a/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-probe-match.xml b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-probe-match.xml new file mode 100644 index 0000000..fa7a167 --- /dev/null +++ b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-probe-match.xml @@ -0,0 +1,27 @@ + + + + http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/ProbeMatches + + + http://www.w3.org/2005/08/addressing/anonymous + + + + + + + + dpws:Device mdpws:MedicalDevice + sdc.mds.pkp:1.2.840.10004.20701.1.1 + + + + + + diff --git a/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-probe.xml b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-probe.xml new file mode 100644 index 0000000..158fadb --- /dev/null +++ b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-probe.xml @@ -0,0 +1,18 @@ + + + + http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/Probe + + urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01 + + + + mdpws:MedicalDevice + sdc.mds.pkp:1.2.840.10004.20701.1.1 + + + diff --git a/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-resolve-match.xml b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-resolve-match.xml new file mode 100644 index 0000000..e786439 --- /dev/null +++ b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-resolve-match.xml @@ -0,0 +1,27 @@ + + + + http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/ResolveMatches + + + http://www.w3.org/2005/08/addressing/anonymous + + + + + + + + dpws:Device mdpws:MedicalDevice + sdc.mds.pkp:1.2.840.10004.20701.1.1 + + + + + + diff --git a/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-resolve.xml b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-resolve.xml new file mode 100644 index 0000000..25e549b --- /dev/null +++ b/asciidoc/listings/vol2-clause-appendix-a-mdpws-dev-47-resolve.xml @@ -0,0 +1,18 @@ + + + + http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/Resolve + + urn:docs-oasis-open-org:ws-dd:ns:discovery:2009:01 + + + + + + + + + diff --git a/asciidoc/plantuml/common_style.inc.puml b/asciidoc/plantuml/common_style.inc.puml new file mode 100644 index 0000000..7e74ff0 --- /dev/null +++ b/asciidoc/plantuml/common_style.inc.puml @@ -0,0 +1,9 @@ +@startuml + +skinparam { + monochrome true + defaultFontSize 16 + dpi 100 +} + +@enduml \ No newline at end of file diff --git a/asciidoc/plantuml/vol1-figure-sdpi-a-delegation-example-sequence-diagram.puml b/asciidoc/plantuml/vol1-figure-sdpi-a-delegation-example-sequence-diagram.puml index e08c67d..a1dc9b8 100644 --- a/asciidoc/plantuml/vol1-figure-sdpi-a-delegation-example-sequence-diagram.puml +++ b/asciidoc/plantuml/vol1-figure-sdpi-a-delegation-example-sequence-diagram.puml @@ -1,5 +1,7 @@ @startuml +!include plantuml/common_style.inc.puml + !global $str_sdc_sc = "SOMDS Medical Alert Consumer" !global $str_sdc_sp = "SOMDS Medical Alert Provider" diff --git a/asciidoc/plantuml/vol1-figure-sdpi-a-reporting-example-sequence-diagram.puml b/asciidoc/plantuml/vol1-figure-sdpi-a-reporting-example-sequence-diagram.puml index 57ad69b..1959e9f 100644 --- a/asciidoc/plantuml/vol1-figure-sdpi-a-reporting-example-sequence-diagram.puml +++ b/asciidoc/plantuml/vol1-figure-sdpi-a-reporting-example-sequence-diagram.puml @@ -1,5 +1,7 @@ @startuml +!include plantuml/common_style.inc.puml + !global $str_sdc_sc = "SOMDS Medical Alert Consumer" !global $str_sdc_sp = "SOMDS Medical Alert Provider" diff --git a/asciidoc/plantuml/vol1-figure-sdpi-p-example-sequence-diagram.puml b/asciidoc/plantuml/vol1-figure-sdpi-p-example-sequence-diagram.puml index 72490b9..016ba07 100644 --- a/asciidoc/plantuml/vol1-figure-sdpi-p-example-sequence-diagram.puml +++ b/asciidoc/plantuml/vol1-figure-sdpi-p-example-sequence-diagram.puml @@ -1,7 +1,6 @@ @startuml -skinparam dpi 300 -skinparam monochrome true +!include plantuml/common_style.inc.puml !global $str_sdpi_p_somds_prov = "SOMDS Provider" !global $str_sdpi_p_somds_cons = "SOMDS Consumer" diff --git a/asciidoc/plantuml/vol1-figure-sdpi-p-managed-discovery-option-sequence-diagram.puml b/asciidoc/plantuml/vol1-figure-sdpi-p-managed-discovery-option-sequence-diagram.puml new file mode 100644 index 0000000..539fac3 --- /dev/null +++ b/asciidoc/plantuml/vol1-figure-sdpi-p-managed-discovery-option-sequence-diagram.puml @@ -0,0 +1,38 @@ +@startuml + +!include plantuml/common_style.inc.puml + +autonumber + + +!global $str_somds_provider = "SOMDS Provider" +!global $str_somds_discovery_proxy = "Discovery Proxy" +!global $str_somds_consumer = "SOMDS Consumer" + +participant "$str_somds_provider" as somds_provider +participant "$str_somds_discovery_proxy" as somds_discovery_proxy +participant "$str_somds_consumer" as somds_consumer + +==SDPi-P Managed Discovery Option== + +group secured + +somds_provider ->> somds_discovery_proxy: Update Network Presence + +end + +group secured + +somds_consumer ->> somds_discovery_proxy: Retrieve Network Presence +somds_discovery_proxy -->> somds_consumer: Return Network Presence + +end + +group secured + somds_consumer -> somds_provider: Discover BICEPS Services + somds_provider -->> somds_consumer + + note over somds_discovery_proxy: Normal SDPi-P CONSUMER / PROVIDER Interactions +end + +@enduml \ No newline at end of file diff --git a/asciidoc/plantuml/vol1-figure-sdpi-r-example-sequence-diagram.puml b/asciidoc/plantuml/vol1-figure-sdpi-r-example-sequence-diagram.puml index 8176c65..0dd7b41 100644 --- a/asciidoc/plantuml/vol1-figure-sdpi-r-example-sequence-diagram.puml +++ b/asciidoc/plantuml/vol1-figure-sdpi-r-example-sequence-diagram.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_sdc_sc = "SOMDS Medical Data Consumer" diff --git a/asciidoc/plantuml/vol1-figure-sdpi-xc-example-sequence-diagram.puml b/asciidoc/plantuml/vol1-figure-sdpi-xc-example-sequence-diagram.puml index 66bd751..0fede69 100644 --- a/asciidoc/plantuml/vol1-figure-sdpi-xc-example-sequence-diagram.puml +++ b/asciidoc/plantuml/vol1-figure-sdpi-xc-example-sequence-diagram.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_sdc_sc = "SOMDS Medical Control Consumer" diff --git a/asciidoc/plantuml/vol2-figure-dev-23-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-23-sequence.puml index d9361ea..d2e1054 100644 --- a/asciidoc/plantuml/vol2-figure-dev-23-sequence.puml +++ b/asciidoc/plantuml/vol2-figure-dev-23-sequence.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_somds_consumer = "SOMDS Consumer" @@ -9,11 +9,10 @@ autonumber participant "$str_somds_consumer" as consumer participant "$str_somds_provider" as provider -==SDPi Announce Network Presence [DEV-23]== -||| +==Announce Network Presence [DEV-23]== + group unsecured provider ->> consumer: Hello(Provider UID, Discovery Scope) end -||| @enduml \ No newline at end of file diff --git a/asciidoc/plantuml/vol2-figure-dev-24-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-24-sequence.puml index 17d8219..2bd0abc 100644 --- a/asciidoc/plantuml/vol2-figure-dev-24-sequence.puml +++ b/asciidoc/plantuml/vol2-figure-dev-24-sequence.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_somds_consumer = "SOMDS Consumer" @@ -9,7 +9,7 @@ autonumber participant "$str_somds_consumer" as consumer participant "$str_somds_provider" as provider -==SDPi Discover Network Topology [DEV-24]== +==Discover Network Topology [DEV-24]== alt consumer ->> provider: Probe(Discovery Scope) diff --git a/asciidoc/plantuml/vol2-figure-dev-25-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-25-sequence.puml index a550b8d..09470e9 100644 --- a/asciidoc/plantuml/vol2-figure-dev-25-sequence.puml +++ b/asciidoc/plantuml/vol2-figure-dev-25-sequence.puml @@ -1,5 +1,6 @@ @startuml -skinparam monochrome true + +!include plantuml/common_style.inc.puml autonumber !global $str_sdpi_p_somds_cons = "SOMDS Consumer" @@ -8,7 +9,7 @@ autonumber participant "$str_sdpi_p_somds_cons" as sdpi_somds_consumer participant "$str_sdpi_p_somds_prov" as sdpi_somds_provider -==SDPi Discover BICEPS Services [DEV-25]== +==Discover BICEPS Services [DEV-25]== sdpi_somds_consumer -> sdpi_somds_provider: GetMetadata() sdpi_somds_consumer <<-- sdpi_somds_provider: GetMetadataResponse(BICEPS Services, Device Metadata, Model Metadata) diff --git a/asciidoc/plantuml/vol2-figure-dev-27-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-27-sequence.puml index 9280669..ff480e2 100644 --- a/asciidoc/plantuml/vol2-figure-dev-27-sequence.puml +++ b/asciidoc/plantuml/vol2-figure-dev-27-sequence.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_somds_consumer = "SOMDS Consumer" @@ -9,7 +9,7 @@ autonumber participant "$str_somds_consumer" as consumer participant "$str_somds_provider" as provider -==SDPi Manage BICEPS Subscription [DEV-27]== +==Manage BICEPS Subscription [DEV-27]== consumer -> provider: Subscribe(Filter, Expiration Time) consumer <<-- provider: SubscribeResponse(Subscription Manager, Expiration Time) diff --git a/asciidoc/plantuml/vol2-figure-dev-28-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-28-sequence.puml index e22048d..ed74060 100644 --- a/asciidoc/plantuml/vol2-figure-dev-28-sequence.puml +++ b/asciidoc/plantuml/vol2-figure-dev-28-sequence.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_somds_consumer = "SOMDS Consumer" @@ -9,7 +9,7 @@ autonumber participant "$str_somds_consumer" as consumer participant "$str_somds_provider" as provider -==SDPi Notify Change in System Context and Capabilities [DEV-28]== +==Notify Change in System Context and Capabilities [DEV-28]== consumer <<- provider: Notification(EpisodicContextReport) diff --git a/asciidoc/plantuml/vol2-figure-dev-29-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-29-sequence.puml index 55b17bf..b2e8bf1 100644 --- a/asciidoc/plantuml/vol2-figure-dev-29-sequence.puml +++ b/asciidoc/plantuml/vol2-figure-dev-29-sequence.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_somds_consumer = "SOMDS Consumer" @@ -9,7 +9,7 @@ autonumber participant "$str_somds_consumer" as consumer participant "$str_somds_provider" as provider -==SDPi Publish BICEPS Update Reports [DEV-29]== +==Publish BICEPS Update Reports [DEV-29]== opt consumer <<- provider: Notification(EpisodicAlertReport) end diff --git a/asciidoc/plantuml/vol2-figure-dev-30-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-30-sequence.puml index a0a81e0..4cd4172 100644 --- a/asciidoc/plantuml/vol2-figure-dev-30-sequence.puml +++ b/asciidoc/plantuml/vol2-figure-dev-30-sequence.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_somds_consumer = "SOMDS Consumer" @@ -9,7 +9,7 @@ autonumber participant "$str_somds_consumer" as consumer participant "$str_somds_provider" as provider -==SDPi Discover BICEPS Content [DEV-30]== +==Discover BICEPS Content [DEV-30]== consumer -> provider: GetMdib() consumer <<-- provider: GetMdibResponse(MdDescription, MdState [incl. ContextStates]) diff --git a/asciidoc/plantuml/vol2-figure-dev-34-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-34-sequence.puml index b8fca0c..f8b54ec 100644 --- a/asciidoc/plantuml/vol2-figure-dev-34-sequence.puml +++ b/asciidoc/plantuml/vol2-figure-dev-34-sequence.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_somds_consumer = "SOMDS Consumer" @@ -9,7 +9,7 @@ autonumber participant "$str_somds_consumer" as consumer participant "$str_somds_provider" as provider -==SDPi Announce Network Departure [DEV-34]== +==Announce Network Departure [DEV-34]== ||| group unsecured provider ->> consumer: Bye(Provider UID) diff --git a/asciidoc/plantuml/vol2-figure-dev-35-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-35-sequence.puml index cec855d..145a50e 100644 --- a/asciidoc/plantuml/vol2-figure-dev-35-sequence.puml +++ b/asciidoc/plantuml/vol2-figure-dev-35-sequence.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_somds_consumer = "SOMDS Consumer" @@ -9,7 +9,7 @@ autonumber participant "$str_somds_consumer" as consumer participant "$str_somds_provider" as provider -==SDPi Establish Medical Data Exchange [DEV-35]== +==Establish Medical Data Exchange [DEV-35]== consumer -> provider: Subscribe(Filter, Expiration Time) consumer <<-- provider: SubscribeResponse(Subscription Manager, Expiration Time) diff --git a/asciidoc/plantuml/vol2-figure-dev-36-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-36-sequence.puml index af459c9..b3f88ec 100644 --- a/asciidoc/plantuml/vol2-figure-dev-36-sequence.puml +++ b/asciidoc/plantuml/vol2-figure-dev-36-sequence.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_somds_consumer = "SOMDS Consumer" @@ -9,7 +9,7 @@ autonumber participant "$str_somds_consumer" as consumer participant "$str_somds_provider" as provider -==SDPi Publish Medical Data [DEV-36]== +==Publish Medical Data [DEV-36]== consumer <<- provider: Notification(EpisodicMetricReport) diff --git a/asciidoc/plantuml/vol2-figure-dev-37-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-37-sequence.puml index 8ffe1a7..1c83558 100644 --- a/asciidoc/plantuml/vol2-figure-dev-37-sequence.puml +++ b/asciidoc/plantuml/vol2-figure-dev-37-sequence.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_somds_consumer = "SOMDS Consumer" @@ -9,7 +9,7 @@ autonumber participant "$str_somds_consumer" as consumer participant "$str_somds_provider" as provider -==SDPi Retrieve Medical Data [DEV-37]== +==Retrieve Medical Data [DEV-37]== consumer -> provider: GetMdib() consumer <<-- provider: GetMdibResponse(MdDescription, MdState [incl. ContextStates]) diff --git a/asciidoc/plantuml/vol2-figure-dev-38-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-38-sequence.puml index b3129fd..8fd1d59 100644 --- a/asciidoc/plantuml/vol2-figure-dev-38-sequence.puml +++ b/asciidoc/plantuml/vol2-figure-dev-38-sequence.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_somds_consumer = "SOMDS Consumer" @@ -9,7 +9,7 @@ autonumber participant "$str_somds_consumer" as consumer participant "$str_somds_provider" as provider -==SDPi Establish Medical Alert Exchange [DEV-38]== +==Establish Medical Alert Exchange [DEV-38]== consumer -> provider: Subscribe(Filter, Expiration Time) consumer <<-- provider: SubscribeResponse(Subscription Manager, Expiration Time) diff --git a/asciidoc/plantuml/vol2-figure-dev-39-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-39-sequence.puml index 1a2e839..c964043 100644 --- a/asciidoc/plantuml/vol2-figure-dev-39-sequence.puml +++ b/asciidoc/plantuml/vol2-figure-dev-39-sequence.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_somds_consumer = "SOMDS Consumer" @@ -9,7 +9,7 @@ autonumber participant "$str_somds_consumer" as consumer participant "$str_somds_provider" as provider -==SDPi Publish Medical Alert Update [DEV-39]== +==Publish Medical Alert Update [DEV-39]== consumer <<- provider: Notification(EpisodicAlertReport) diff --git a/asciidoc/plantuml/vol2-figure-dev-40-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-40-sequence.puml index 90dcbf5..72d749e 100644 --- a/asciidoc/plantuml/vol2-figure-dev-40-sequence.puml +++ b/asciidoc/plantuml/vol2-figure-dev-40-sequence.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml autonumber !global $str_somds_consumer = "SOMDS Consumer" @@ -9,7 +9,7 @@ autonumber participant "$str_somds_consumer" as consumer participant "$str_somds_provider" as provider -==SDPi Medical Alert Status [DEV-40]== +==Medical Alert Status [DEV-40]== consumer -> provider: GetMdib() consumer <<-- provider: GetMdibResponse(MdDescription, MdState [incl. ContextStates]) diff --git a/asciidoc/plantuml/vol2-figure-dev-46-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-46-sequence.puml new file mode 100644 index 0000000..925389a --- /dev/null +++ b/asciidoc/plantuml/vol2-figure-dev-46-sequence.puml @@ -0,0 +1,19 @@ +@startuml + +!include plantuml/common_style.inc.puml +autonumber + + +!global $str_somds_provider = "SOMDS Provider" +!global $str_somds_discovery_proxy = "Discovery Proxy" + +participant "$str_somds_provider" as provider +participant "$str_somds_discovery_proxy" as discovery_proxy + +==Update Network Presence [DEV-46]== + +discovery_proxy <- provider: Hello(Provider UID, Discovery Scope) + +discovery_proxy <- provider: Bye(Provider UID) + +@enduml \ No newline at end of file diff --git a/asciidoc/plantuml/vol2-figure-dev-47-sequence.puml b/asciidoc/plantuml/vol2-figure-dev-47-sequence.puml new file mode 100644 index 0000000..3b3ce2c --- /dev/null +++ b/asciidoc/plantuml/vol2-figure-dev-47-sequence.puml @@ -0,0 +1,28 @@ +@startuml + +!include plantuml/common_style.inc.puml +autonumber + + +!global $str_somds_consumer = "SOMDS Consumer" +!global $str_somds_discovery_proxy = "Discovery Proxy" + +participant "$str_somds_consumer" as consumer +participant "$str_somds_discovery_proxy" as discovery_proxy + +==Retrieve Network Presence [DEV-47]== + +opt + discovery_proxy -> consumer: Hello(Provider UID, Discovery Scope) + discovery_proxy -> consumer: Bye(Provider UID) +end + +alt + consumer ->> discovery_proxy: Probe(Discovery Scope) + consumer <<-- discovery_proxy: ProbeMatch(Provider UID, Transport Address) +else + consumer ->> discovery_proxy: Resolve(Provider UID) + consumer <<-- discovery_proxy: ResolveMatch(Transport Address) +end + +@enduml \ No newline at end of file diff --git a/asciidoc/plantuml/vol2-figure-xyz.puml b/asciidoc/plantuml/vol2-figure-xyz.puml index e0bd7e9..624eefe 100644 --- a/asciidoc/plantuml/vol2-figure-xyz.puml +++ b/asciidoc/plantuml/vol2-figure-xyz.puml @@ -1,5 +1,5 @@ -skinparam dpi 300 -skinparam monochrome true +@startuml +!include plantuml/common_style.inc.puml autonumber !global $str_sdpi_p_somds_cons = "SOMDS Consumer" @@ -9,9 +9,8 @@ participant "$str_sdpi_p_somds_cons" as sdpi_somds_consumer participant "$str_sdpi_p_somds_prov" as sdpi_somds_provider ==SDPi Announce Network Presence [DEV-23]== -||| group unsecured ' sdpi_somds_provider -> sdpi_somds_consumer: SDC: Hello(EndpointReference, Types, Scopes, [XAddrs]) sdpi_somds_provider -> sdpi_somds_consumer: BICEPS: AnnounceNetworkPresence( PROVIDER UID, Discovery Type, ...) end -||| \ No newline at end of file +@enduml \ No newline at end of file diff --git a/asciidoc/plantuml/vol3-figure-biceps-content-module-physiomon.puml b/asciidoc/plantuml/vol3-figure-biceps-content-module-physiomon.puml index 2d8d9c6..274f534 100644 --- a/asciidoc/plantuml/vol3-figure-biceps-content-module-physiomon.puml +++ b/asciidoc/plantuml/vol3-figure-biceps-content-module-physiomon.puml @@ -1,6 +1,6 @@ @startuml -skinparam monochrome true +!include plantuml/common_style.inc.puml object Monitor_Mds Monitor_Mds : MDC_DEV_METER_PHYSIO_MULTI_PARAM_MDS diff --git a/asciidoc/sdpi-supplement-intro.adoc b/asciidoc/sdpi-supplement-intro.adoc index adbfd4e..39ab5aa 100644 --- a/asciidoc/sdpi-supplement-intro.adoc +++ b/asciidoc/sdpi-supplement-intro.adoc @@ -62,8 +62,6 @@ To that end, the supplement includes updates to all (3) IHE DEV TF volumes, incl * New content covering the application of ISO/IEEE 11073 SDC semantic standards to device content modules, with a primary focus on specifications related to the ISO/IEEE 11073-10207 BICEPS standard. -{empty} + - [#supplement_clause_joint_ihe_hl7_gemini_ses_mdi_project_development] === Joint IHE-HL7 Gemini SES+MDI Project Development This supplement is the result of a joint https://confluence.hl7.org/x/Xzf9Aw[IHE-HL7 Gemini Device Interoperability program] which began early 2020. diff --git a/asciidoc/sdpi-supplement.adoc b/asciidoc/sdpi-supplement.adoc index 70cbcbd..b85efab 100644 --- a/asciidoc/sdpi-supplement.adoc +++ b/asciidoc/sdpi-supplement.adoc @@ -81,9 +81,6 @@ See https://profiles.ihe.net/DEV/[*HERE*] for STU/Trial Implementation and Final A PDF version of the specification is available upon request. -{empty} + - - [#supplement_clause_foreword,sdpi_offset=clear] = Foreword diff --git a/asciidoc/volume0/tf0-ch-a-actors.adoc b/asciidoc/volume0/tf0-ch-a-actors.adoc index 6371474..d21cc7c 100644 --- a/asciidoc/volume0/tf0-ch-a-actors.adoc +++ b/asciidoc/volume0/tf0-ch-a-actors.adoc @@ -39,7 +39,11 @@ |[[actor_somds_dec_gateway,SOMDS DEC Gateway]] SOMDS DEC Gateway -|Exchanges information between SOMDS and IHE DEC-based environments. +|Exchanges information between <> and IHE DEC-based environments. + +|[[actor_somds_discovery_proxy,Discovery Proxy]] Discovery Proxy + +|Accepts and makes available <> endpoint metadata in a <>. |[[actor_somds_fhir_gateway,SOMDS FHIR Gateway]] SOMDS FHIR Gateway diff --git a/asciidoc/volume0/tf0-ch-b-transactions.adoc b/asciidoc/volume0/tf0-ch-b-transactions.adoc index 364b4c6..240ecef 100644 --- a/asciidoc/volume0/tf0-ch-b-transactions.adoc +++ b/asciidoc/volume0/tf0-ch-b-transactions.adoc @@ -153,8 +153,18 @@ include::../volume2/dev-40/tf2-dev-40-summary.adoc[] // include::../volume2/dev-45/tf2-dev-45-summary.adoc[] -.^| DEV-46 | _Reserved_ | -.^| DEV-47 | _Reserved_ | +.^| [[vol0_transaction_summary_dev_46,DEV-46 Update Network Presence]] +[[transaction_number_dev_46,DEV-46]] DEV-46 +| [[transaction_name_update_network_presence,Update Network Presence]] Update Network Presence +| +include::../volume2/dev-46/tf2-dev-46-summary.adoc[] + +.^| [[vol0_transaction_summary_dev_47,DEV-47 Retrieve Network Presence]] +[[transaction_number_dev_47,DEV-47]] DEV-47 +| [[transaction_name_retrieve_network_presence,Retrieve Network Presence]] Retrieve Network Presence +| +include::../volume2/dev-47/tf2-dev-47-summary.adoc[] + .^| DEV-48 | _Reserved_ | .^| DEV-49 | _Reserved_ | .^| DEV-50 | _Reserved_ | diff --git a/asciidoc/volume0/tf0-main.adoc b/asciidoc/volume0/tf0-main.adoc index fbc78c7..76b0cbc 100644 --- a/asciidoc/volume0/tf0-main.adoc +++ b/asciidoc/volume0/tf0-main.adoc @@ -42,7 +42,11 @@ The choice of any namespace prefix is arbitrary and not semantically significant |sdpi |urn:oid:1.3.6.1.4.1.19376.1.6.2.10.1.1.1 -|This specification +|This specification, used by <> extensions. + +|dp +|urn:oid:1.3.6.1.4.1.19376.1.6.2.10.1.2.2 +|This specification, used by the <> actor. |wsa |http://www.w3.org/2005/08/addressing diff --git a/asciidoc/volume1/tf1-ch-10-sdpi-p.adoc b/asciidoc/volume1/tf1-ch-10-sdpi-p.adoc index ed4ea02..bbb277a 100644 --- a/asciidoc/volume1/tf1-ch-10-sdpi-p.adoc +++ b/asciidoc/volume1/tf1-ch-10-sdpi-p.adoc @@ -52,8 +52,6 @@ image::../images/vol1-diagram-sdpi-p-actor.svg[] To claim conformity with this specification, an actor shall support all required transactions (labeled “R”) and may support the optional transactions (labeled “O”). Note that “Consumer” is indicated for actors that receive but do not directly respond to a specific transaction. -{empty} + - [#vol1_table_sdpi_p_actors_transactions] .SDPi-P Profile - Actors and Transactions [%autowidth] @@ -71,7 +69,7 @@ Note that “Consumer” is indicated for actors that receive but do not directl | ... | ... -.12+| <> +.13+| <> .^| <> .^| Initiator .^| R @@ -139,9 +137,14 @@ Note that “Consumer” is indicated for actors that receive but do not directl | R | <> -.12+| <> +.^| <> +.^| Initiator +.^| O ^(See^ ^Note^ ^2)^ +| <> + +.13+| <> .^| <> -.^| _Receiver_ ^(See^ ^Note^ ^2)^ +.^| _Receiver_ ^(See^ ^Note^ ^3)^ .^| O | <> @@ -168,12 +171,12 @@ Note that “Consumer” is indicated for actors that receive but do not directl | <> | <> -| _Receiver_ ^(See^ ^Note^ ^2)^ +| _Receiver_ ^(See^ ^Note^ ^3)^ | O | <> | <> -| _Receiver_ ^(See^ ^Note^ ^2)^ +| _Receiver_ ^(See^ ^Note^ ^3)^ | R | <> @@ -204,14 +207,32 @@ Note that “Consumer” is indicated for actors that receive but do not directl | <> -| _Receiver_ ^(See^ ^Note^ ^2)^ +| _Receiver_ ^(See^ ^Note^ ^3)^ | O | <> +| <> +| Initiator +| O ^(See^ ^Note^ ^2)^ +| <> + + +.2+| <> +.^| <> +.^| _Receiver_ ^(See^ ^Note^ ^2)^ +.^| R +| <> + +| <> +| Responder +| R +| <> + + // FOR THE NEXT ROW: // #TODO: TBD HOW TO REPLICATE TRANSACTIONS; ACTOR SUPPORTS ALL PROVIDER & CONSUMER TRANSACTIONS WITH SAME OPTIONALITY# | <> -| See Note 3 +| See Note 4 | ... | ... | ... @@ -225,7 +246,7 @@ Note that “Consumer” is indicated for actors that receive but do not directl // FOR THE NEXT ROW: // #TODO: TBD HOW TO REPLICATE TRANSACTIONS# | <> -| See Note 3 +| See Note 4 | ... | ... | ... @@ -243,16 +264,15 @@ Note that “Consumer” is indicated for actors that receive but do not directl | ... 5+<| -Note 1: _“Notify Change in System Context and Capabilities”_ is required if there are dynamic changes that may need to be sent to subscribing systems. +Note 1: _“Notify Change in System Context and Capabilities”_ is required if there are dynamic changes that may need to be sent to subscribing systems -Note 2: _“Receiver”_ is included in this column, in _italics_, to indicate that though a <> may "receive" the transaction, there is no response communicated to the message initiator. +Note 2: Optional transaction is required if the SDPi-P <> is enabled. Some deployments may support a mix of systems that use the <> Actor as well as the default "ad hoc" discovery mode. Additional details and requirements are provided in the <> discussion. -Note 3: *_SDPi Version Note:_* -- Full detailing of the transactions related to this actor will be addressed in a subsequent version of this specification. +Note 3: _“Receiver”_ is included in this column, in _italics_, to indicate that though a <> may "receive" the transaction, there is no response communicated to the message initiator. -|=== +Note 4: *_SDPi Version Note:_* -- Full detailing of the transactions related to this actor will be addressed in a subsequent version of this specification. -{empty} + -{empty} + +|=== <> shows the content-related actors defined in the SDPi-P Profile and the direction that the content is exchanged. @@ -265,8 +285,6 @@ Note that in the case of external control, where a <> or in <>. -{empty} + - [#vol1_figure_sdpi_p_biceps_content_actor_diagram] .SDPi-P BICEPS Content Actor Diagram @@ -349,11 +367,11 @@ Note 1: _All content exchanged on a SOMDS shall conform to the general SDPi “B |=== - ==== Actor Descriptions and Actor Profile Requirements + SDPi-P actor roles and responsibilities are described in the subsections below. -Unless otherwise specified below, individual transaction requirements are specified in TF-2 <>, and requirements related to content modules are detailed in TF-3 <>. +Unless otherwise specified below, individual transaction requirements are specified in TF-2 <>, and requirements related to content modules are detailed in TF-3 <>. This section documents any additional requirements on the profile’s content actors. <> illustrates a typical (not comprehensive) exchange scenario between SDPi-P actors: @@ -559,15 +577,23 @@ For robustness, a <> need only process the conten Note that although this SDPi-P content actor primarily supports information exchange between systems participating in a SOMDS network environment, they may be referenced by other non-SDPi profiles that utilize other non-SOMDS exchange architectures, transactions and technologies. +===== Discovery Proxy + +[#vol1_spec_sdpi_p_actor_discovery_proxy, reftext='Discovery Proxy'] +Actor Summary Definition: +[none] +. A centralized registry of system network presence and absence metadata. + +The <> Actor provides a centralized means for systems connected to a network to update a central registry when they are present and available, as well as notification when they are leaving and will be absent. +This is necessary for network configurations that do not support decentralized system discovery. + + [#vol1_clause_sdpi_p_actor_options] === SDPi-P Actor Options -[%noheader] -[%autowidth] -[cols="1"] -|=== -a| *{supplement_note}*: Profile options are out-of-scope for this version of the supplement. -Future versions *_MAY_* include options such as the following (not in priority order): +//// +TODO +Future versions *_MAY_* include options such as * Retrieve Remote Data * Streaming / Waveforms @@ -580,6 +606,102 @@ Future versions *_MAY_* include options such as the following (not in priority o * Mobile Health / Cloud Connected |=== +//// + +Options that may be selected for this Integration Profile are listed in the <> along with the actors to which they apply. +Dependencies between options when applicable are specified in +notes. + +[#vol1_table_sdpi_p_actors_transactions] +.SDPi-P Profile - Actors and Options +[%autowidth] +[cols="1,1,1"] +|=== +.^|Actor +.^|Option Name +.^|Vol. & Section + +| <> +| <> +| <> + +| <> +| <> +| <> + +| <> +| <> +| <> + +|=== + +[#vol1_clause_sdpi_p_option_discovery_proxy] +==== Managed Discovery Option +[#vol1_spec_sdpi_p_option_discovery_proxy, reftext='Managed Discovery Option'] + +The Discovery Proxy profile option provides an alternative means for <> Actors to discover the <> Actors that are present on the network. The default "ad hoc" approach using the <>, <> and <> transactions, requires use of unsecured multicast messaging; however, some deployments do not support or allow this mode of discovery. +The addition of a <> Actor enables a secure and non-multicast means for managing system discovery across the network. +The <> Actor acts as a man-in-the-middle system, with <> Actors using the <> transaction to provide endpoint metatdata and update their network presence or absence status. +<> Actors may then use the <> transaction to determine available <> systems and their endpoint metadata. + +<> provides an overview of the interactions of the SOMDS Consumer and Somes Provider Actors with the Discovery Proxy Actor. + +.SDPi-P Managed Discovery Option - transaction Sequence Diagram +[#figure_sdpi-p-managed-discovery-option-sequence-diagram] +[plantuml, target=target=puml-sdpi-p-managed-discovery-option-sequence-diagram, format=svg, format=svg] +.... +include::../plantuml/vol1-figure-sdpi-p-managed-discovery-option-sequence-diagram.puml[] +.... + +Once the discovery process is complete, actor interactions continue as normal. +See <> for additional detail. + +.R1021 +[sdpi_requirement#r1021,sdpi_req_level=shall] +**** + +When the <> is enabled for a <> Actor, then it shall use the <> transaction to update the <> Actor on its network presence and departure. +**** + +.R1022 +[sdpi_requirement#r1022,sdpi_req_level=shall] +**** + +If a <> Actor is configured or provisioned for the <>, but the proxy system is not available, then the <> shall revert back to "ad hoc" discovery mode. +**** + +.R1023 +[sdpi_requirement#r1023,sdpi_req_level=shall] +**** + +When the <> is enabled for a <> Actor, then it shall use the <> transaction to retrieve <> network presence metadata from the <> Actor. + +NOTE: When retrieving network presence metadata from a <> Actor, a <> may be specified as a filter to identify a specific subset of <> systems. + +NOTE: A <> may optionally use the <> transaction to subscribe to all metadata updates from a set of <> systems, essentially using the <> Actor as a pass through for <> <> and <> transactions. +**** + +.R1024 +[sdpi_requirement#r1024,sdpi_req_level=shall] +**** + +If a <> Actor is configured or provisioned for the <>, but the proxy system is not available, then the <> shall revert back to "ad hoc" discovery mode. +**** + +.R1025 +[sdpi_requirement#r1025,sdpi_req_level=shall] +**** + +In order to ensure that a system's network presence information is up-to-date and valid, during the period when the <> indicates that a system is present, it shall provide some means to determine that this state is still true. + +NOTE: For example, issuing a periodic "heartbeat" check message or cable-connected check. +Specification of these means will be provided for in the transport-specific implementation specification for the <> transaction. +**** + +Though it is not recommended, deployments may allow simultaneous use of both the default "ad hoc" discovery mode and the managed proxy-based discovery mode utilizing a <> Actor. +In these configurations, <> and <> systems should prioritize use of the <> Actor. + +NOTE: Provisioning of <> systems to support use of a <> Actor is out-of-scope for this specification. //// #TODO: Add description and detail specification in a subsequent SDPi Version# @@ -618,7 +740,6 @@ Future versions *_MAY_* include options such as the following (not in priority o [#vol1_clause_sdpi_p_required_actor_groupings] === SDPi-P Required Actor Groupings - [%noheader] [%autowidth] [cols="1"] diff --git a/asciidoc/volume1/tf1-ch-11-sdpi-r.adoc b/asciidoc/volume1/tf1-ch-11-sdpi-r.adoc index 99b734f..af658cd 100644 --- a/asciidoc/volume1/tf1-ch-11-sdpi-r.adoc +++ b/asciidoc/volume1/tf1-ch-11-sdpi-r.adoc @@ -47,8 +47,6 @@ actor groupings, including abstract with concrete, are detailed in <> and <> as well as the increasing prevalence of <> applications. (See https://confluence.hl7.org/x/Iw7xB["Paper: What is a device?"] for additional background.) These general concepts will help the technical framework reader understand the broader context into which the profile specifications are intended to be implemented. - -{empty} + |=== // 2.2 diff --git a/asciidoc/volume1/use-cases/tf1-ch-c-60601-1-8.adoc b/asciidoc/volume1/use-cases/tf1-ch-c-60601-1-8.adoc index 2b31f44..82c70d4 100644 --- a/asciidoc/volume1/use-cases/tf1-ch-c-60601-1-8.adoc +++ b/asciidoc/volume1/use-cases/tf1-ch-c-60601-1-8.adoc @@ -149,7 +149,6 @@ NOTE: An xDIS can be either a DIS or CDIS. Similarly an xDAS can be either a DA ^3^ Not recommended since there is no confirmation that the Source has received the commands |=== -{empty} + ===== ISO/IEC 60601-1-8 Definitions for DIS, DAS and CDAS @@ -181,10 +180,7 @@ NOTE: NOTE 2 A DISTRIBUTED ALARM SYSTEM is intended to notify OPERATORS of the e NOTE: NOTE 3 For the purposes of this document, technical confirmation means that each element of a DISTRIBUTED ALARM SYSTEM confirms or guarantees the successful delivery of the ALARM CONDITION to the next element or appropriate TECHNICAL ALARM CONDITIONS are created as described in clause 6.11.2.2.1 of <>. -{empty} + - .IEC 60601-1-8:2020, Figure 2 -- Functions of a DISTRIBUTED ALARM SYSTEM utilizing a MEDICAL IT NETWORK - image::../images/vol1-diagram-60601-1-8-2020-figure-2.svg[] Examples include: diff --git a/asciidoc/volume2/dev-23/tf2-dev-23.adoc b/asciidoc/volume2/dev-23/tf2-dev-23.adoc index 5d7ecb2..78bcac3 100644 --- a/asciidoc/volume2/dev-23/tf2-dev-23.adoc +++ b/asciidoc/volume2/dev-23/tf2-dev-23.adoc @@ -36,7 +36,7 @@ include::tf2-dev-23-summary.adoc[] ==== Messages .Message Interaction Diagram [{var_transaction_id}] -[plantuml#vol2_figure_dev_23_sequence, target=puml-dev-23-sequence, format=svg, 40width=100%] +[plantuml#vol2_figure_dev_23_sequence, target=puml-dev-23-sequence, format=svg] .... include::../../plantuml/vol2-figure-dev-23-sequence.puml[] .... diff --git a/asciidoc/volume2/dev-24/tf2-ch-a-mdpws-dev-24.adoc b/asciidoc/volume2/dev-24/tf2-ch-a-mdpws-dev-24.adoc index 648e2bf..4a46847 100644 --- a/asciidoc/volume2/dev-24/tf2-ch-a-mdpws-dev-24.adoc +++ b/asciidoc/volume2/dev-24/tf2-ch-a-mdpws-dev-24.adoc @@ -46,6 +46,7 @@ include::../dev-a-default-trigger-events.adoc[] :var_expected_actions_ref: <> include::../dev-a-default-expected-actions.adoc[] +[#vol2_clause_appendix_mdpws_dev_24_additional_consideration] ====== Additional Consideration [sdpi_level=+1] diff --git a/asciidoc/volume2/dev-24/tf2-dev-24.adoc b/asciidoc/volume2/dev-24/tf2-dev-24.adoc index dab9ded..1186f43 100644 --- a/asciidoc/volume2/dev-24/tf2-dev-24.adoc +++ b/asciidoc/volume2/dev-24/tf2-dev-24.adoc @@ -38,7 +38,7 @@ include::tf2-dev-24-summary.adoc[] ==== Messages .Message Interaction Diagram [{var_transaction_id}] -[plantuml#vol2_figure_dev_24_sequence, target=puml-dev-24-sequence, format=svg, 40width=100%] +[plantuml#vol2_figure_dev_24_sequence, target=puml-dev-24-sequence, format=svg] .... include::../../plantuml/vol2-figure-dev-24-sequence.puml[] .... diff --git a/asciidoc/volume2/dev-25/tf2-dev-25.adoc b/asciidoc/volume2/dev-25/tf2-dev-25.adoc index d3da493..5c34c73 100644 --- a/asciidoc/volume2/dev-25/tf2-dev-25.adoc +++ b/asciidoc/volume2/dev-25/tf2-dev-25.adoc @@ -29,7 +29,7 @@ include::tf2-dev-25-summary.adoc[] ==== Messages .Message Interaction Diagram [DEV-25] -[plantuml#vol2_figure_dev_25_sequence, target=puml-dev-25-sequence, format=svg, 40width=100%] +[plantuml#vol2_figure_dev_25_sequence, target=puml-dev-25-sequence, format=svg] .... include::../../plantuml/vol2-figure-dev-25-sequence.puml[] diff --git a/asciidoc/volume2/dev-27/tf2-dev-27.adoc b/asciidoc/volume2/dev-27/tf2-dev-27.adoc index f848725..d1fd072 100644 --- a/asciidoc/volume2/dev-27/tf2-dev-27.adoc +++ b/asciidoc/volume2/dev-27/tf2-dev-27.adoc @@ -48,7 +48,7 @@ When at some point the subscription has to be ended, the <> diff --git a/asciidoc/volume2/dev-34/tf2-dev-34.adoc b/asciidoc/volume2/dev-34/tf2-dev-34.adoc index addd9a5..4dc617a 100644 --- a/asciidoc/volume2/dev-34/tf2-dev-34.adoc +++ b/asciidoc/volume2/dev-34/tf2-dev-34.adoc @@ -33,7 +33,7 @@ include::tf2-dev-34-summary.adoc[] ==== Messages .Message Interaction Diagram [{var_transaction_id}] -[plantuml#vol2_figure_dev_34_sequence, target=puml-dev-34-sequence, format=svg, 40width=100%] +[plantuml#vol2_figure_dev_34_sequence, target=puml-dev-34-sequence, format=svg] .... include::../../plantuml/vol2-figure-dev-34-sequence.puml[] .... diff --git a/asciidoc/volume2/dev-35/tf2-dev-35.adoc b/asciidoc/volume2/dev-35/tf2-dev-35.adoc index c25886f..3241b17 100644 --- a/asciidoc/volume2/dev-35/tf2-dev-35.adoc +++ b/asciidoc/volume2/dev-35/tf2-dev-35.adoc @@ -35,7 +35,7 @@ include::tf2-dev-35-summary.adoc[] ==== Messages .Message Interaction Diagram [{var_transaction_id}] -[plantuml#vol2_figure_dev_35_sequence, target=puml-dev-35-sequence, format=svg, 40width=100%] +[plantuml#vol2_figure_dev_35_sequence, target=puml-dev-35-sequence, format=svg] .... include::../../plantuml/vol2-figure-dev-35-sequence.puml[] .... diff --git a/asciidoc/volume2/dev-36/tf2-dev-36.adoc b/asciidoc/volume2/dev-36/tf2-dev-36.adoc index 15c9b79..f193238 100644 --- a/asciidoc/volume2/dev-36/tf2-dev-36.adoc +++ b/asciidoc/volume2/dev-36/tf2-dev-36.adoc @@ -31,7 +31,7 @@ include::tf2-dev-36-summary.adoc[] ==== Messages .Message Interaction Diagram [{var_transaction_id}] -[plantuml#vol2_figure_dev_36_sequence, target=puml-dev-36-sequence, format=svg, 40width=100%] +[plantuml#vol2_figure_dev_36_sequence, target=puml-dev-36-sequence, format=svg] .... include::../../plantuml/vol2-figure-dev-36-sequence.puml[] .... diff --git a/asciidoc/volume2/dev-37/tf2-dev-37.adoc b/asciidoc/volume2/dev-37/tf2-dev-37.adoc index cefb096..3c72a24 100644 --- a/asciidoc/volume2/dev-37/tf2-dev-37.adoc +++ b/asciidoc/volume2/dev-37/tf2-dev-37.adoc @@ -32,7 +32,7 @@ include::tf2-dev-37-summary.adoc[] ==== Messages .Message Interaction Diagram [{var_transaction_id}] -[plantuml#vol2_figure_dev_37_sequence, target=puml-dev-37-sequence, format=svg, 40width=100%] +[plantuml#vol2_figure_dev_37_sequence, target=puml-dev-37-sequence, format=svg] .... include::../../plantuml/vol2-figure-dev-37-sequence.puml[] .... diff --git a/asciidoc/volume2/dev-38/tf2-dev-38.adoc b/asciidoc/volume2/dev-38/tf2-dev-38.adoc index f932a28..8fab695 100644 --- a/asciidoc/volume2/dev-38/tf2-dev-38.adoc +++ b/asciidoc/volume2/dev-38/tf2-dev-38.adoc @@ -34,7 +34,7 @@ include::tf2-dev-38-summary.adoc[] ==== Messages .Message Interaction Diagram [{var_transaction_id}] -[plantuml#vol2_figure_dev_38_sequence, target=puml-dev-38-sequence, format=svg, 40width=100%] +[plantuml#vol2_figure_dev_38_sequence, target=puml-dev-38-sequence, format=svg] .... include::../../plantuml/vol2-figure-dev-38-sequence.puml[] .... diff --git a/asciidoc/volume2/dev-39/tf2-dev-39.adoc b/asciidoc/volume2/dev-39/tf2-dev-39.adoc index 44228cc..483e40a 100644 --- a/asciidoc/volume2/dev-39/tf2-dev-39.adoc +++ b/asciidoc/volume2/dev-39/tf2-dev-39.adoc @@ -31,7 +31,7 @@ include::tf2-dev-39-summary.adoc[] ==== Messages .Message Interaction Diagram [{var_transaction_id}] -[plantuml#vol2_figure_dev_39_sequence, target=puml-dev-39-sequence, format=svg, 40width=100%] +[plantuml#vol2_figure_dev_39_sequence, target=puml-dev-39-sequence, format=svg] .... include::../../plantuml/vol2-figure-dev-39-sequence.puml[] .... diff --git a/asciidoc/volume2/dev-40/tf2-dev-40.adoc b/asciidoc/volume2/dev-40/tf2-dev-40.adoc index ee33213..5e7fa15 100644 --- a/asciidoc/volume2/dev-40/tf2-dev-40.adoc +++ b/asciidoc/volume2/dev-40/tf2-dev-40.adoc @@ -33,7 +33,7 @@ include::tf2-dev-40-summary.adoc[] ==== Messages .Message Interaction Diagram [{var_transaction_id}] -[plantuml#vol2_figure_dev_40_sequence, target=puml-dev-40-sequence, format=svg, 40width=100%] +[plantuml#vol2_figure_dev_40_sequence, target=puml-dev-40-sequence, format=svg] .... include::../../plantuml/vol2-figure-dev-40-sequence.puml[] .... diff --git a/asciidoc/volume2/dev-46/tf2-ch-a-mdpws-dev-46.adoc b/asciidoc/volume2/dev-46/tf2-ch-a-mdpws-dev-46.adoc new file mode 100644 index 0000000..20bf928 --- /dev/null +++ b/asciidoc/volume2/dev-46/tf2-ch-a-mdpws-dev-46.adoc @@ -0,0 +1,121 @@ +:var_label_dev_46_message_hello: Hello +:var_label_dev_46_message_bye: Bye +:var_label_dev_46_message_directed_probe: DirectedProbe +:var_uri_dpws_messaging: http://docs.oasis-open.org/ws-dd/dpws/1.1/os/wsdd-dpws-1.1-spec-os.html#_Toc228672084 +:var_uri_dpws_discovery: https://docs.oasis-open.org/ws-dd/dpws/1.1/os/wsdd-dpws-1.1-spec-os.html#_Toc228672091 +:var_uri_ws_discovery_hello: https://docs.oasis-open.org/ws-dd/discovery/1.1/os/wsdd-discovery-1.1-spec-os.html#_Toc234231821 +:var_uri_ws_discovery_bye: https://docs.oasis-open.org/ws-dd/discovery/1.1/os/wsdd-discovery-1.1-spec-os.html#_Toc234231825 +:var_uri_ws_discovery_directed_probe: https://docs.oasis-open.org/ws-dd/discovery/1.1/os/wsdd-discovery-1.1-spec-os.html#_Toc234231831 + +[#vol2_clause_appendix_mdpws_dev_46] +==== MDPWS: Update Network Presence [DEV-46] + +This section specifies the MDPWS data transmission for messages defined in <>. + +Additional implementation directions are defined in <>. + +// ---------- Hello --------- + +===== {var_label_dev_46_message_hello} Message + +The <> message is encoded by using {var_uri_dpws_messaging}[DPWS Messaging]. + +====== Referenced Standards + +* <> {var_uri_dpws_messaging}[Section 2 Messaging] +* <> {var_uri_ws_discovery_hello}[Section 4.1 Hello] + +====== Message Outline + +.{var_label_dev_46_message_hello} message +[source#vol2_clause_appendix_a_mdpws_dev_46_hello,xml] +---- +include::../../listings/vol2-clause-appendix-a-mdpws-dev-46-hello.xml[] +---- + +:var_trigger_events_ref: <> +include::../dev-a-default-trigger-events.adoc[] + +====== Message Semantics + +`s12:Envelope/s12:Body/wsd:Hello/wsa:EndpointReference/wsa:Address`:: The <>'s <> as URI. +`s12:Envelope/s12:Body/wsd:Hello/wsd:Scopes`:: The <>'s <> as a list of URIs. + +:var_expected_actions_ref: <> +include::../dev-a-default-expected-actions.adoc[] + + +// ---------- Bye --------- + +===== {var_label_dev_46_message_bye} Message + +The <> message is encoded by using {var_uri_dpws_messaging}[DPWS Messaging]. + +====== Referenced Standards + +* <> {var_uri_dpws_messaging}[Section 2 Messaging] +* <> {var_uri_ws_discovery_bye}[Section 4.2 Bye] + +====== Message Outline + +.{var_label_dev_46_message_bye} message +[source#vol2_clause_appendix_a_mdpws_dev_46_bye,xml] +---- +include::../../listings/vol2-clause-appendix-a-mdpws-dev-46-bye.xml[] +---- + +:var_trigger_events_ref: <> +include::../dev-a-default-trigger-events.adoc[] + +====== Message Semantics + +`s12:Envelope/s12:Body/wsd:Bye/wsa:EndpointReference/wsa:Address`:: The <>'s <> as URI. + +:var_expected_actions_ref: <> +include::../dev-a-default-expected-actions.adoc[] + + +// ---------- DirectedProbe --------- + +===== {var_label_dev_46_message_directed_probe} Message + +In addition to {var_label_dev_46_message_hello} and {var_label_dev_46_message_bye}, this section proposes a <> to periodically probe all <>s it has recorded as present in the <> by using a {var_label_dev_46_message_directed_probe} message. This allows for the <> to verify if <>s reachable. + +The {var_label_dev_46_message_directed_probe} message is encoded by using {var_uri_dpws_messaging}[DPWS Messaging]. + +====== Referenced Standards + +* <> {var_uri_dpws_messaging}[Section 2 Messaging] +* <> {var_uri_dpws_messaging}[Section 3 Discovery] +* <> {var_uri_ws_discovery_directed_probe}[Section 5.2 Probe] + +====== Message Outline + +.{var_label_dev_46_message_directed_probe} message +[source#vol2_clause_appendix_a_mdpws_dev_46_directed_probe,xml] +---- +include::../../listings/vol2-clause-appendix-a-mdpws-dev-46-directed-probe.xml[] +---- + +====== Trigger Events + +A <> may periodically send {var_label_dev_46_message_directed_probe} messages to all present <>s. +The periodicity can be determined by the <>. + +====== Message Semantics + +No payload is required as the probe is intended to be used for watchdog purposes only. + +====== Expected Actions + +If the request succeeds, there is no additional action required. + +If the request fails, the <> removes the <> endpoint metadata from its databases and informs <>s about the <>'s absence. + +.R7006 +[sdpi_requirement#r7006,sdpi_req_level=shall] +**** +If <> sends {var_label_dev_46_message_directed_probe} messages to verify presence of <>s, the <> shall notify all <>s subscribed to Bye messages about the <>'s absence. + +NOTE: Absence of <>s is notified to <>s by using the Bye message as specified in <>. +**** \ No newline at end of file diff --git a/asciidoc/volume2/dev-46/tf2-dev-46-summary.adoc b/asciidoc/volume2/dev-46/tf2-dev-46-summary.adoc new file mode 100644 index 0000000..36ba4b3 --- /dev/null +++ b/asciidoc/volume2/dev-46/tf2-dev-46-summary.adoc @@ -0,0 +1,3 @@ +// DEV-46 Transaction Summary + +Provide network presence and absence of <> Actors in a <> network by updating the metadata in a <> Actor. diff --git a/asciidoc/volume2/dev-46/tf2-dev-46.adoc b/asciidoc/volume2/dev-46/tf2-dev-46.adoc new file mode 100644 index 0000000..4065240 --- /dev/null +++ b/asciidoc/volume2/dev-46/tf2-dev-46.adoc @@ -0,0 +1,90 @@ +:var_transaction_id: DEV-46 + +:var_label_dev_46_message_hello: Hello +:var_label_dev_46_message_bye: Bye + + +//reset|+1|off +[#vol2_clause_dev_46,sdpi_offset=46] +=== Update Network Presence [{var_transaction_id}] + +==== Scope + +include::tf2-dev-46-summary.adoc[] + +==== Actor Roles + +.Actor Roles [{var_transaction_id}] +[cols="1,2"] +|=== +|Actor |Roles + +|<> +|Listens for <> or <> messages to add or remove <> endpoint metadata to/from its internal database. +|<> +|When joining a <>, it announces its presence to the <>. When deliberately leaving the <>, it announces its absence to the <>. +|=== + +==== Referenced Standards + +* <> Section 9. Discovery Model + +==== Messages + +.Message Interaction Diagram [{var_transaction_id}] +[plantuml#vol2_figure_dev_46_sequence, target=puml-dev-46-sequence, format=svg] +.... +include::../../plantuml/vol2-figure-dev-46-sequence.puml[] +.... + +[#vol2_clause_dev_46_message_hello] +===== {var_label_dev_46_message_hello} Message + +<> specifies an implicit discovery protocol for allowing <>s to receive a notification when a <> is ready to exchange messages with other <>s. +If a <> uses a <>, network presence is announced to the <> by using the _{var_label_dev_46_message_hello}_ message of this transaction. + +[#vol2_clause_dev_46_message_hello_trigger_events] +====== Trigger Events + +If a <> is known to the <>, this message is sent + +1. whenever a <> joins an <>, +2. when a <> returns to normal _on-line_ operation after having indicated temporary suspension of message exchanges, or +3. when a <> changes its <>. + +[#vol2_clause_dev_46_message_hello_semantics] +====== Message Semantics + +[[payload_dev_46_provider_uid_hello]]Provider UID:: The <>. +[[payload_dev_46_discovery_scope]]Discovery Scope:: The <> of the <>. + +[#vol2_clause_dev_46_message_hello_expected_actions] +====== Expected Actions + +When a <> sends this message, there is no expected or required response. +The <> is supposed to internally store the <>'s endpoint <> and <> in order to make it available to <>s via <> (see <>). + +[#vol2_clause_dev_46_message_bye] +===== {var_label_dev_46_message_bye} Message + +If a <> uses a <>, network absence is announced to the <> by using the _{var_label_dev_46_message_bye}_ message of this transaction. + +[#vol2_clause_dev_46_message_bye_trigger_events] +====== Trigger Events + +If a <> is known to the <>, this message is sent whenever a <> leaves the <> it previously joined via the {var_label_dev_46_message_hello} message. + +[#vol2_clause_dev_46_message_bye_semantics] +====== Message Semantics + +[[payload_dev_46_provider_uid_bye]]Provider UID:: The <>. + +[#vol2_clause_dev_46_message_bye_expected_actions] +====== Expected Actions + +When a <> sends this message, there is no expected or required response. +The <> is supposed to remove the <>'s <> and <> from its internal database and exposes the removal to <>s via <> (see <>). + +[#vol2_clause_dev_29_publish_biceps_update_reports_ses] +include::../dev-x-default-ses-secured-mode.adoc[] + diff --git a/asciidoc/volume2/dev-47/tf2-ch-a-mdpws-dev-47.adoc b/asciidoc/volume2/dev-47/tf2-ch-a-mdpws-dev-47.adoc new file mode 100644 index 0000000..b5afa9b --- /dev/null +++ b/asciidoc/volume2/dev-47/tf2-ch-a-mdpws-dev-47.adoc @@ -0,0 +1,222 @@ +:var_uri_ws_discovery_probe: http://docs.oasis-open.org/ws-dd/discovery/1.1/os/wsdd-discovery-1.1-spec-os.html#_Toc234231831 +:var_uri_ws_discovery_probe_match: http://docs.oasis-open.org/ws-dd/discovery/1.1/os/wsdd-discovery-1.1-spec-os.html#_Toc234231835 +:var_uri_ws_discovery_resolve: http://docs.oasis-open.org/ws-dd/discovery/1.1/os/wsdd-discovery-1.1-spec-os.html#_Toc234231840 +:var_uri_ws_discovery_resolve_match: http://docs.oasis-open.org/ws-dd/discovery/1.1/os/wsdd-discovery-1.1-spec-os.html#_Toc234231844 +:var_uri_dpws_discovery: http://docs.oasis-open.org/ws-dd/dpws/1.1/os/wsdd-dpws-1.1-spec-os.html#_Toc228672091 +:var_uri_matching_rule: http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01/rfc3986 + +[#vol2_clause_appendix_mdpws_dev_47] +==== MDPWS: Retrieve Network Presence [DEV-47] + +This section specifies the MDPWS data transmission for messages defined in <>. + +Additional implementation directions are defined in <>. + +// ---------- Hello --------- + +===== {var_label_dev_47_message_hello} Message + +The <> message is encoded by using {var_uri_dpws_messaging}[DPWS Messaging]. + +====== Referenced Standards + +* <> {var_uri_dpws_messaging}[Section 2 Messaging] +* <> {var_uri_ws_discovery_hello}[Section 4.1 Hello] +* <> {var_uri_ws_discovery_hello}[Section 4.1 Hello] + +====== Message Outline + +.{var_label_dev_47_message_hello} message +[source#vol2_clause_appendix_a_mdpws_dev_47_hello,xml] +---- +include::../../listings/vol2-clause-appendix-a-mdpws-dev-47-hello.xml[] +---- + +:var_trigger_events_ref: <> +include::../dev-a-default-trigger-events.adoc[] + +====== Message Semantics + +`s12:Envelope/s12:Body/wsd:Hello/wsa:EndpointReference/wsa:Address`:: The <>'s <> as URI. +`s12:Envelope/s12:Body/wsd:Hello/wsd:Scopes`:: The <>'s <> as a list of URIs. + +:var_expected_actions_ref: <> +include::../dev-a-default-expected-actions.adoc[] + + +// ---------- Bye --------- + +[#vol2_clause_appendix_a_mdpws_dev_47_message_bye] +===== {var_label_dev_47_message_bye} Message + +The <> message is encoded by using {var_uri_dpws_messaging}[DPWS Messaging]. + +====== Referenced Standards + +* <> {var_uri_dpws_messaging}[Section 2 Messaging] +* <> {var_uri_ws_discovery_bye}[Section 4.2 Bye] + +====== Message Outline + +.{var_label_dev_47_message_bye} message +[source#vol2_clause_appendix_a_mdpws_dev_47_bye,xml] +---- +include::../../listings/vol2-clause-appendix-a-mdpws-dev-47-bye.xml[] +---- + +:var_trigger_events_ref: <> +include::../dev-a-default-trigger-events.adoc[] + +====== Message Semantics + +`s12:Envelope/s12:Body/wsd:Bye/wsa:EndpointReference/wsa:Address`:: The <>'s <> as URI. + +:var_expected_actions_ref: <> +include::../dev-a-default-expected-actions.adoc[] + + +// ---------- PROBE --------- + + +===== {var_label_dev_47_message_probe} Message + +The <> message is encoded by using {var_uri_ws_discovery_probe}[WS-Discovery Probe]. + +====== Referenced Standards + +* <> {var_uri_ws_discovery_probe}[Section 5.2 Probe] +* <> {var_uri_dpws_discovery}[Section 3 Discovery] +* <> mdpws:MedicalDevice +* <> sdc.mds.pkp:1.2.840.10004.20701.1.1 + +====== Message Outline + +.WS-Discovery Probe message +[source#vol2_clause_appendix_a_mdpws_dev_47_probe,xml] +---- +include::../../listings/vol2-clause-appendix-a-mdpws-dev-47-probe.xml[] +---- + +:var_trigger_events_ref: <> +include::../dev-a-default-trigger-events.adoc[] + +====== Message Semantics + +`s12:Envelope/s12:Body/wsd:Probe/wsa:Types`:: List that contains at least `mdpws:MedicalDevice` to express seeking <>s that conform to MDPWS. +`s12:Envelope/s12:Body/wsd:Probe/wsd:Scopes/@MatchBy`:: The algorithm used to compare the `s12:Envelope/s12:Body/wsd:Probe/wsd:Scopes` against the <>'s scopes. +`s12:Envelope/s12:Body/wsd:Probe/wsd:Scopes`:: The <> as a list of URIs to probe for. +[#vol2_clause_appendix_mdpws_dev_47_recurring_probe] + + +:var_expected_actions_ref: <> +include::../dev-a-default-expected-actions.adoc[] + +====== Additional Consideration + +All additional considerations specified in <> do also apply to <>. + + +// ---------- PROBE MATCH --------- + + +===== {var_label_dev_47_message_probe_match} Message + +The <> message is encoded by using {var_uri_ws_discovery_probe_match}[WS-Discovery Probe Match]. + +====== Referenced Standards + +* <> {var_uri_ws_discovery_probe_match}[Section 5.3 Probe Match] +* <> {var_uri_dpws_discovery}[Section 3 Discovery] +* <> mdpws:MedicalDevice +* <> sdc.mds.pkp:1.2.840.10004.20701.1.1 + +====== Message Outline + +.WS-Discovery Probe Match message +[source#vol2_clause_appendix_a_mdpws_dev_47_probe_match,xml] +---- +include::../../listings/vol2-clause-appendix-a-mdpws-dev-47-probe-match.xml[] +---- + +:var_trigger_events_ref: <> +include::../dev-a-default-trigger-events.adoc[] + +====== Message Semantics + +`s12:Envelope/s12:Body/wsd:ProbeMatches`:: All matches found by the <>. +`s12:Envelope/s12:Body/wsd:ProbeMatches/wsd:ProbeMatch/wsa:EndpointReference/wsa:Address`:: The <>'s <> encoded as URI. +`s12:Envelope/s12:Body/wsd:ProbeMatches/wsd:ProbeMatch/wsd:Types`:: List of types that contains at least `dpws:Device` and mdpws:MedicalDevice`, which expresses the <> to conform to DPWS and MDPWS. +`s12:Envelope/s12:Body/wsd:ProbeMatches/wsd:ProbeMatch/wsd:Scopes`:: The <> of the <>, encoded as a list of URIs. +`s12:Envelope/s12:Body/wsd:ProbeMatches/wsd:ProbeMatch/wsd:XAddrs`:: A list of HTTPS addresses under which the <> receives secured messages. +`s12:Envelope/s12:Body/wsd:ProbeMatches/wsd:ProbeMatch/wsd:MetadataVersion`:: A metadata version of the <>. + +:var_expected_actions_ref: <> +include::../dev-a-default-expected-actions.adoc[] + + +// ---------- RESOLVE --------- + + +===== {var_label_dev_47_message_resolve} Message + +The <> message is encoded by using {var_uri_ws_discovery_resolve}[WS-Discovery Resolve]. + +====== Referenced Standards + +* <> {var_uri_ws_discovery_resolve}[Section 6.2 Resolve] +* <> {var_uri_dpws_discovery}[Section 3 Discovery] + +====== Message Outline + +.WS-Discovery Resolve message +[source#vol2_clause_appendix_a_mdpws_dev_47_resolve,xml] +---- +include::../../listings/vol2-clause-appendix-a-mdpws-dev-47-resolve.xml[] +---- + +:var_trigger_events_ref: <> +include::../dev-a-default-trigger-events.adoc[] + +====== Message Semantics + +`s12:Envelope/s12:Body/wsd:Resolve/wsa:EndpointReference/wsa:Address`:: The <> to resolve, encoded as URI. + +:var_expected_actions_ref: <> +include::../dev-a-default-expected-actions.adoc[] + + +// ---------- RESOLVE MATCH --------- + + +===== {var_label_dev_47_message_resolve_match} Message + +The <> message is encoded by using {var_uri_ws_discovery_resolve_match}[WS-Discovery Resolve Match]. + +====== Referenced Standards + +* <> {var_uri_ws_discovery_resolve_match}[Section 6.3 Resolve Match] +* <> {var_uri_dpws_discovery}[Section 3 Discovery] +* <> mdpws:MedicalDevice +* <> sdc.mds.pkp:1.2.840.10004.20701.1.1 + +====== Message Outline + +.WS-Discovery Resolve Match message +[source#vol2_clause_appendix_a_mdpws_dev_47_resolve_match,xml] +---- +include::../../listings/vol2-clause-appendix-a-mdpws-dev-47-resolve-match.xml[] +---- + +:var_trigger_events_ref: <> +include::../dev-a-default-trigger-events.adoc[] + +====== Message Semantics + +`s12:Envelope/s12:Body/wsd:ResolveMatches/wsd:ResolveMatch/wsa:EndpointReference/wsa:Address`:: The <>'s <> encoded as URI. +`s12:Envelope/s12:Body/wsd:ResolveMatches/wsd:ResolveMatch/wsd:Types`:: List of types that contains at least `dpws:Device` and mdpws:MedicalDevice`, which expresses the <> to conform to DPWS and MDPWS. +`s12:Envelope/s12:Body/wsd:ResolveMatches/wsd:ResolveMatch/wsd:Scopes`:: The <> of the <>, encoded as a list of URIs. +`s12:Envelope/s12:Body/wsd:ResolveMatches/wsd:ResolveMatch/wsd:XAddrs`:: A list of HTTPS addresses under which the <> receives secured messages. +`s12:Envelope/s12:Body/wsd:ResolveMatches/wsd:ResolveMatch/wsd:MetadataVersion`:: A metadata version of the <>. + +:var_expected_actions_ref: <> +include::../dev-a-default-expected-actions.adoc[] diff --git a/asciidoc/volume2/dev-47/tf2-dev-47-summary.adoc b/asciidoc/volume2/dev-47/tf2-dev-47-summary.adoc new file mode 100644 index 0000000..ebb8d4f --- /dev/null +++ b/asciidoc/volume2/dev-47/tf2-dev-47-summary.adoc @@ -0,0 +1,3 @@ +// DEV-47 Transaction Summary + +Retrieve presence metadata from a <> Actor for a specified set of <> Actors that may be connected to a <> network. \ No newline at end of file diff --git a/asciidoc/volume2/dev-47/tf2-dev-47.adoc b/asciidoc/volume2/dev-47/tf2-dev-47.adoc new file mode 100644 index 0000000..0cba537 --- /dev/null +++ b/asciidoc/volume2/dev-47/tf2-dev-47.adoc @@ -0,0 +1,205 @@ +:var_transaction_id: DEV-47 + +:var_label_dev_47_message_hello: Hello +:var_label_dev_47_message_bye: Bye +:var_label_dev_47_message_probe: Probe +:var_label_dev_47_message_probe_match: ProbeMatch +:var_label_dev_47_message_resolve: Resolve +:var_label_dev_47_message_resolve_match: ResolveMatch + + +//reset|+1|off +[#vol2_clause_dev_47,sdpi_offset=47] +=== Retrieve Network Presence [{var_transaction_id}] + +==== Scope + +include::tf2-dev-47-summary.adoc[] + +==== Actor Roles + +.Actor Roles [{var_transaction_id}] +[cols="1,2"] +|=== +|Actor |Roles + +|<> +|Forwards <> and <> messages received from <>s. +Responds to incoming <> and <> messages. +|<> +|Uses <> and <> messages to seek endpoint metadata. +Optionally subscribes to a <> in order to receive <> and <> messages. +|=== + +==== Referenced Standards + +* <> Section 9. Discovery Model + +==== Messages + +.Message Interaction Diagram [{var_transaction_id}] +[plantuml#vol2_figure_dev_47_sequence, target=puml-dev-47-sequence, format=svg] +.... +include::../../plantuml/vol2-figure-dev-47-sequence.puml[] +.... + +// ---------- HELLO --------- + +[#vol2_clause_dev_47_message_hello] +===== {var_label_dev_47_message_hello} Message + +<> specifies an implicit discovery protocol for allowing <>s to receive a notification when a <> is ready to exchange messages with other <>s. +If a <> uses a <>, network presence is announced to the <> by using the _{var_label_dev_47_message_hello}_ message of this transaction. + +[#vol2_clause_dev_47_message_hello_trigger_events] +====== Trigger Events + +If a <> is known to the <> and the <> is interested in {var_label_dev_47_message_hello} messages, this message is sent + +1. whenever a <> known to the <> joins an <>, +2. when a <> known to the <> returns to normal _on-line_ operation after having indicated temporary suspension of message exchanges, or +3. when a <> known to the <> changes its <>. + +[#vol2_clause_dev_47_message_hello_semantics] +====== Message Semantics + +[[payload_dev_47_provider_uid_hello]]Provider UID:: The <>. +[[payload_dev_47_discovery_scope]]Discovery Scope:: The <> of the <>. + +[#vol2_clause_dev_47_message_hello_expected_actions] +====== Expected Actions + +When a <> sends this message, there is no expected or required response. + +// ---------- BYE --------- + +[#vol2_clause_dev_47_message_bye] +===== {var_label_dev_47_message_bye} Message + +If a <> uses a <>, network absence is announced to the <> by using the _{var_label_dev_47_message_bye}_ message of this transaction. + +[#vol2_clause_dev_47_message_bye_trigger_events] +====== Trigger Events + +If a <> is known to the <> and the <> is interested in {var_label_dev_47_message_bye} messages, this message is sent whenever a <> leaves the <> it previously joined via the {var_label_dev_46_message_hello} message. + +[#vol2_clause_dev_47_message_bye_semantics] +====== Message Semantics + +[[payload_dev_47_provider_uid_bye]]Provider UID:: The <>. + +[#vol2_clause_dev_47_message_bye_expected_actions] +====== Expected Actions + +When a <> sends this message, there is no expected or required response. + +// ---------- PROBE --------- + +[#vol2_clause_dev_47_message_probe] +===== {var_label_dev_47_message_probe} Message + +<> specifies an explicit discovery protocol for allowing <>s to discover all <>s that are ready to exchange messages with <>s. +The corresponding message to seek <>s based on filter criteria is called _{var_label_dev_47_message_probe}_. + +If a <> uses a <>, the <> can send a {var_label_dev_47_message_probe} message to the <> to seek endpoint information based on filter criteria. + +[#vol2_clause_dev_47_message_probe_trigger_events] +====== Trigger Events + +The {var_label_dev_47_message_probe} message is sent to a <> + +1. whenever a <> joins an <> and is ready to exchange messages with <>s or +2. when a <> runs in a mode where it periodically checks for availability of <>s matching specific filter criteria. + +[#vol2_clause_dev_47_message_probe_semantics] +====== Message Semantics + +[[payload_dev_47_probe_discovery_scope]]Discovery Scope:: A <> to filter against. + +[#vol2_clause_dev_47_message_probe_expected_actions] +====== Expected Actions + +When a <> sends this message, the <> answers with all endpoint records that match the requested <> by sending a <> message. + +// ---------- PROBE MATCH --------- + +[#vol2_clause_dev_47_message_probe_match] +===== {var_label_dev_47_message_probe_match} Message + +The {var_label_dev_47_message_probe_match} message is sent as part of the BICEPS _explicit discovery_ protocol in response to an incoming <> message. + +[#vol2_clause_dev_47_message_probe_match_trigger_events] +====== Trigger Events + +The {var_label_dev_47_message_probe_match} message is sent whenever a <> receives a <> message that contains a <> that matches zero or more <>'s <>s. + +[#vol2_clause_dev_47_message_probe_match_semantics] +====== Message Semantics + +[[payload_dev_47_probe_match_provider_uid]]Provider UID:: The <>. +[[payload_dev_47_probe_match_transport_address]]Transport Address:: The <> under which the <> can receive secured messages. + +[#vol2_clause_dev_47_message_probe_match_expected_actions] +====== Expected Actions + +The <> that receives a {var_label_dev_47_message_probe_match} message can use the <> to exchange secured messages with the <>s for which it received the <> message. + + +// ---------- RESOLVE --------- + + +[#vol2_clause_dev_47_message_resolve] +===== {var_label_dev_47_message_resolve} Message + +<> specifies an explicit discovery protocol for allowing <>s to discover all <>s that are ready to exchange messages with <>s. +The corresponding message to seek <>s based on a unique identifier is called _{var_label_dev_47_message_resolve}_. + +If a specific <> is known to a <>, the <> can send a {var_label_dev_47_message_resolve} message to a <>. + +[#vol2_clause_dev_47_message_resolve_trigger_events] +====== Trigger Events + +The {var_label_dev_47_message_resolve} message is sent to a <> + +1. whenever a <> joins an <> and is ready to exchange messages with a specific <> for which it knows its <> or +2. when a <> runs in a mode where it periodically checks for availability of <>s matching a specific <>. + +[#vol2_clause_dev_47_message_resolve_semantics] +====== Message Semantics + +[[payload_dev_47_resolve_provider_uid]]Provider UID:: The <> to resolve. + +[#vol2_clause_dev_47_message_resolve_expected_actions] +====== Expected Actions + +When a <> sends this message, the <> answers with the endpoint record that matches the requested <>. + +// ---------- RESOLVE MATCH --------- + + +[#vol2_clause_dev_47_message_resolve_match] +===== {var_label_dev_47_message_resolve_match} Message + +The {var_label_dev_47_message_resolve_match} message is sent as part of the BICEPS _explicit discovery_ protocol in response to an incoming <> message. + +[#vol2_clause_dev_47_message_resolve_match_trigger_events] +====== Trigger Events + +The {var_label_dev_47_message_resolve_match} message is sent whenever a <> receives a <> message. + +[#vol2_clause_dev_47_message_resolve_match_semantics] +====== Message Semantics + +[[payload_dev_47_provider_uid]]Provider UID:: The <>. +[[payload_dev_47_transport_address]]Transport Address:: The <> under which the <> can receive secured messages. + +NOTE: A {var_label_dev_47_message_resolve_match} message may not include a <> and <> if there was no match found for <>. + +[#vol2_clause_dev_47_message_resolve_match_expected_actions] +====== Expected Actions + +The <> that receives a {var_label_dev_47_message_resolve_match} message can use the <> to exchange secured messages with the <> for which it received the <> message. + +[#vol2_clause_dev_47_publish_biceps_update_reports_ses] +include::../dev-x-default-ses-secured-mode.adoc[] + diff --git a/asciidoc/volume2/discovery-proxy/tf2-ch-a-mdpws-discovery-proxy.adoc b/asciidoc/volume2/discovery-proxy/tf2-ch-a-mdpws-discovery-proxy.adoc new file mode 100644 index 0000000..35d1126 --- /dev/null +++ b/asciidoc/volume2/discovery-proxy/tf2-ch-a-mdpws-discovery-proxy.adoc @@ -0,0 +1,79 @@ +[#vol2_clause_appendix_mdpws_discovery_proxy] +=== Discovery Proxy implementation requirements + +This chapter describes requirements to the <> <> binding that go beyond message outlines and semantics specified in <> and <>. + +.R7007 +[sdpi_requirement#r7007,sdpi_req_level=shall] +**** + +A <> shall provide the Discovery Proxy service by implementing the port type +with the <> dp:DiscoveryProxy. + +NOTE: The <> port type is defined in <>. + +NOTE: The OID used for the target namespace of the <> WSDL file is listed in <>. +**** + +.R7008 +[sdpi_requirement#r7008,sdpi_req_level=shall] +**** + +A <> shall accept the WS-Eventing wse:Filter@Dialect +urn:oid:1.3.6.1.4.1.19376.1.6.2.10.1.2.1. + +NOTE: The OID used for the filter dialect is listed in <>. +**** + +.R7009 +[sdpi_requirement#r7009,sdpi_req_level=shall] +**** + +A <> shall add the filter dialect urn:oid:1.3.6.1.4.1.19376.1.6.2.10.1.2.1 to +every Subscribe request to a <>. + +NOTE: The OID used for the filter dialect is listed in <>. +**** + +==== Utilized OIDs + +All object identifiers used by the <> are specified in <>. + +[#vol2_table_appendix_mdpws_discovery_proxy_oids] +.WS-Eventing subscription filter dialect and WSDL target namespace OID assignments +[cols="2,3,1",options="autowidth, header"] +|=== +| Primary identifier +| Concept description +| Secondary identifier + +| 1.3.6.1.4.1.19376.1.6.2.10 +| Profile specific OID for SDPi +| sdpi + +| 1.3.6.1.4.1.19376.1.6.2.10.1 +| Describes namespaces for different purposes as specified by its sub-nodes +| namespaces + +| 1.3.6.1.4.1.19376.1.6.2.10.1.2 +| Identifies <> objects. +| discovery-proxy + +| 1.3.6.1.4.1.19376.1.6.2.10.1.2.1 +| Subscription filter dialect used to identify Hello/Bye subscriptions provided by a <>. +| subscription-filter + +| 1.3.6.1.4.1.19376.1.6.2.10.1.2.2 +| WSDL target namespace identifier for the <> actor. +| wsdl +|=== + +==== Discovery Proxy WSDL + +<> shows the WSDL file that specifies the <> Web Service interface. + +.Discovery Proxy WSDL outline +[source#vol2_clause_appendix_a_mdpws_wsdl,xml] +---- +include::../../../sources/discovery-proxy/DiscoveryProxy.wsdl[] +---- diff --git a/asciidoc/volume2/tf2-ch-a-mdpws.adoc b/asciidoc/volume2/tf2-ch-a-mdpws.adoc index 962d988..bbd2563 100644 --- a/asciidoc/volume2/tf2-ch-a-mdpws.adoc +++ b/asciidoc/volume2/tf2-ch-a-mdpws.adoc @@ -55,6 +55,12 @@ include::dev-34/tf2-ch-a-mdpws-dev-34.adoc[] // //=== Retrieve Medical Alert Status [DEV-40] +include::dev-46/tf2-ch-a-mdpws-dev-46.adoc[] + +include::dev-47/tf2-ch-a-mdpws-dev-47.adoc[] + +include::discovery-proxy/tf2-ch-a-mdpws-discovery-proxy.adoc[] + === Security Considerations In TR1164, <> requires a <> to protect <> services against unauthenticated access. diff --git a/asciidoc/volume2/tf2-main.adoc b/asciidoc/volume2/tf2-main.adoc index 0bf37c7..8f746dc 100644 --- a/asciidoc/volume2/tf2-main.adoc +++ b/asciidoc/volume2/tf2-main.adoc @@ -48,6 +48,12 @@ include::dev-39/tf2-dev-39.adoc[] //=== Retrieve Medical Alert Status [DEV-40] include::dev-40/tf2-dev-40.adoc[] +//=== Update Network Presence [DEV-46] +include::dev-46/tf2-dev-46.adoc[] + +//=== Retrieve Network Presence [DEV-47] +include::dev-47/tf2-dev-47.adoc[] + // TODO how does this differ from DEV-30 // //[appendix#clause-mdpws-constraints-corrigenda-adjuncts] diff --git a/asciidoc/volume3/tf3-ch-8.7.3-physiologic-monitor.adoc b/asciidoc/volume3/tf3-ch-8.7.3-physiologic-monitor.adoc index fb1ac25..1c317cb 100644 --- a/asciidoc/volume3/tf3-ch-8.7.3-physiologic-monitor.adoc +++ b/asciidoc/volume3/tf3-ch-8.7.3-physiologic-monitor.adoc @@ -18,7 +18,7 @@ The following BICEPS containment tree represents a highly-simplified physiologic .Physiologic Monitor Containment Tree Example -[plantuml#vol3-figure-biceps-content-module-physiomon, target=puml-figure-biceps-content-module-physiomon, format=svg,width=100%] +[plantuml#vol3-figure-biceps-content-module-physiomon, target=puml-figure-biceps-content-module-physiomon, format=svg, width=100%] .... include::../plantuml/vol3-figure-biceps-content-module-physiomon.puml[] .... diff --git a/asciidoc/volume3/tf3-ch-b-biceps-extension-namespace.adoc b/asciidoc/volume3/tf3-ch-b-biceps-extension-namespace.adoc index f205c1e..361caf1 100644 --- a/asciidoc/volume3/tf3-ch-b-biceps-extension-namespace.adoc +++ b/asciidoc/volume3/tf3-ch-b-biceps-extension-namespace.adoc @@ -30,4 +30,8 @@ A comprehensive listing of OIDs within the IHE Devices namespace is shown at the | Major version 1 for extensions to the BICEPS Participant and Message Model. In order to avoid proliferation of OIDs below `1.3.6.1.4.1.19376.1.6.2.10.1.1`, versions are incremented only if incompatible changes are made to an extension. | version1 + +| 1.3.6.1.4.1.19376.1.6.2.10.1.2 +| Subscription filter dialect used to identify Hello/Bye subscriptions provided by a <>. +| subscription-filter |=== diff --git a/sources/discovery-proxy/DiscoveryProxy.wsdl b/sources/discovery-proxy/DiscoveryProxy.wsdl new file mode 100644 index 0000000..ced4f1a --- /dev/null +++ b/sources/discovery-proxy/DiscoveryProxy.wsdl @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sources/vol1-diagram-sdpi-p-actor.pptx b/sources/vol1-diagram-sdpi-p-actor.pptx index bbf2e3e40a74b93cec607dcde8c6f36289d53039..7d243f85366116dcfd40eeff0fde7e76ba219229 100644 GIT binary patch delta 17185 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 delta 16728 zcmZv@1yCK$7Ph;Q;4TU7?iM^iaJS$Z9D)IWt5MNLL?x3Qqv&9NKL5V!!BToeJ$q zj6)`0FEQJ+bn5h5`&d>=0ZupO)`f*d=3aGmOcL?_m?Xlj0osRef}1e09i-9-W(2vSEey%Pk=-ybSDc z^?WG!y5IcUK3N`s%H*Su+5}IysWL`JMGg+Qu|*B3-;)hIRZq1f^~JX{j7I(xdzwh( zRfu8c@7O-&gUG-XdfvrZ1#}N*sWB1$$&OlW7&Z)9L`$4$Js_ zDQar3z+;@!lBs%VXUm-NQ4_!;)=z(b`LM@_uQO8%J9mAm*)*2DFId}?)eK8F(@X;f+kzG!_IgR9c|x^zIMrb>ki&w8ztp_(io92FxgX0q`?3y%ddK#iOZe7AZ^!)GXtnCj zJ;P9#+`GKul*OxKP%Tt7cUhUNKx^5h*O^4QzgYYNzjYkr!j3n2!;kjN-j6^FHSV1gKY{>9#m97PRe#K=*znw+OX9+M zQGoYh@8_#q;uToi4Z3?A{kbUZ2+Li|3CHGBYjU#N&FH2u5r-`9JZ#ocWk|R=0?{7z z@FWV*X8%`2@^>N^;oNx*L8P+y1i}HV48QSE?3o%V7*R-N3$m^(gyObqk!qCxfRKPL zNC7;9gIHaijQWri30Q779`60SZp<}fK!J(Wa8%*xM?AKu^2^5YdAEraG$Au2(nMZ8UP`NL@=eJgpMYP^b*QU z)csbb2_nY)wBQkGJ?7(kH=CX22uXm;#ukE-wxN%7!Y>vhiQNf5j^cN4sGRII3SNFS zLnCSgFP!q(IfWUrUztpzdb80u3U?*$SLcr4M3|%*kTobti^g5jC&ITx8OXrUKX zVK+;4_J;-p?gAW%tpP|@2M((zoV|yfDTn${NAsGlk2k(M-Jv8d#zjGE*%e4(d%)KJ zIVjJ$m~p5>@rH&|pz45qDb_%rb19$G1_utulse?daxG+DDrn+w-7Fd=v1&ZS6t5 z+z7jDAJm5gWN%symA*K~05LW)AHIIjgg6w|XGGx~6Y~lbo@r)LyAS{^Zs6nhQz1K4 z%gH%WyFMv3_kv~ofq481NhGW=hDsdwYCM`wMzq;)Ygm{h0Sksm>A_f@qzpMrm|Byz zPJ|VEK4SXh??*Os5Uvc-TVytiA{E?uiLB4!b31v5VmfIqTmxFH5rex?M5%gw&<$cH zyKvhMVIIGvZ!;3bc%%W_ABom`?VZlzi4{%0wp~!hS~!WzWoGV}GC#RxvNa69YEoV)Ow9NPd;7&)JbRfoNYT z;In$BBBL!gEY-!0va@ZcBkAt)vTVZ9;)+lw{9}uqU|UEuf^Eu)?R`}&VV2=;-iIpB zx-lka6;U%4H`oIB@C)=AyG+oW=mV&c5UXplL`BRzRntF|;W}^-e92NELvf%NV&ODp zKV=(_NmAF#4Gsc9mm#$G7{iNDjRYA3?(L{1EGu9y?J~-Hrx*9Pe|G*+ns^K82^nsngXDImWkxLHCmSuY9esj&6{IjT z9jkTTn34$+?)w#VAR9f+@>>IrLU|bc&Bzxi0&0Qg7v>lrF z)9+vSD>K0F%opUOBzlGN~A>{kD$yuG4!EUpg^t7RHu_@ZbSk%7D-S zPSOBC^5IYsnlZ2--S*?z&hu;T&9=S_6qu-#qNGf#b}ohyq1jrX9|{(RIBZQLZK?LO z(-(LcF_u34Lc*r_t}C1mRpfe6Iu5jl1k?2cMe#sKH2uB!r|XfePjqOM;jRv@idlj= zukAOkD@*0ZBD#(YIkL1i5V0CieIzja9Hh|zdLrFc^bbe%(=+f5eSEq8x;QINuk^$Y zlrQ7B@I zNpD`t75<4r*cJsUBq=h>KDap1{=zCXT~(3xGOZQSfm-pdJ(22+i*uN$fBTg5hlU+GmzRAgO9_&L@9h2aN!a6qDLX}m2GJGx3-bo9_zvxZER zR7J$bW?rPE9;RkwoPGzY%yr_ZQ)1a~xdZk;i3xFPll~MwN#tMARD49k{T0K;qZOqK z1li|W3kAZzSGDD!N_nBMR(L$mqG)>qe~PFjmwS*{UsSo@)j~kqL+Lzc$nB9pCx}HF zVzO=@g`rXO1Y=cvMCQp!imuJFmqiOm^Cm>HI4Y4?zkec2l}o_|s>s8ZLxv6gBZkS) z^CS6$Y7B{HRi7b~%0#3|sucqhE`nMJUR9E<{Hu7BFzT7E@Yx1JO4_yWRQrvA%k2?~ zf$c%o>7_lv#Fa74@3T@Ftf5Bq5&DxB&;?&0_k!6K!r=2~C9S12WL6+2nqzluPpI6& zo{W?kE;KI(T%q~aE!Xs`czwh+0*{D3${j|@KpYA@2}p(2pKt6AnUd^|%&l90w^WjG zN_C9SJ82rb1wbIs>njvUQ3eXU0FPKL{9YCcI&G~lsyY@|4jK+u7>bx+*}krNm+%4# z8Wo3>6ue9-fQ2PSe)!di9)UY#!bw0Vp+S$dNfpdYMh+C!)KwjZ{mfXri#O7)8ck^_ z7~8oC0z==|%@o&+PE{3dFSSLtKJT2(>Fd?QdLKe*c?=1t5!?~RsvhoX%<7|flZ1? zUc7Z{o`HZ_0qD|WV^kK?>+9%gF~s>I;rPkAaP9gZ@K(gaJM&e;rM#tIH$*)&hN}AW z8)xdN)8iJ3>f2q8t3I6!hq^3oj?y_qu$0x9ZAMIt=*(&x4cjmXrVd}NdCsW12MBBI ze#gIS8gFO+L_HQCj|`r-;nZ$#@8;6(b8#K}i42%}q#l$6uG#z&`RN!ay!VjA9qIm2 ztY$y7@tIOevSTA42bw`N-6x0SCnROhwNV#1x?v?>FQV1I1RNMEcp;_rr&-KQ)mV3m zi~gF)CMC{AEeOmlzCNB z#61uhq9A&8tOWKtDs6(u;V6f)RVRWO;pz>s}8)?0neW(%L*e`ZYdn;DUNY;7KDiwRC994-Qp*R*0UTK-T}I( zV#YBf2i?74+z3io?n=Ym(3d_hPp0Ygi)StJLo?GAuwCtol_N@*D|O$P!Wq=;ra#UH zo|CPSg=9DQMwxFsoP9&!4rSH9gOolt@Z=#(`@W`#9WNVNEl0g-3&drg{cI{}Q#PQT zdN@!iLSfCYFW?~M`}`R$@P=1VzFFn)Ay5<$wXurTp5)LPdGyO=Rd~yHHKK=jhPv)G184KXI2VneA#@^zG@S0^*L7}<9mQ%s9%2;hu|@NMQ#ST{=7I^NkhTs6WGCa9*+EUV{pqoTn{nwY{#W^4&yE)0=VIi}~rbLPFGYLP& z0|Wxgk6RH6ZY>HT5qSOv4kS-kXQR^e_fv}tz5_uPzpMoYn9HmYE^XnQ#qX`AlmWP| zi3Ee*9?7Y!7~PtbyZlk&-YSpOy3=}big>r~Ak(55@EsK?w8^>LST!NF3>1LdD-V}U zWvoDB*V(a>kSJTVO00a|K0cDUmw=d!-<24UI~H%}oza{jfi__7Q}DrqCI>ORieZqP zSAmx5dH+51+>|tTUe;#1yn}j7%S= zP+hEh`{0)TC}l2Wvbm8=B0J!2*Ej7`Xybi2VdF$k%pol4)dUSZYYz8!(kGVBNfg=b zaGPQT)GiS}=c4P@mb0I?FMqXr-#_i2k~@B2mlgc1BOFp&-LMj)UGHEB63Dn?5 zbVqahNqUMR<(J;i#wmk`Xub+J92eg6$RT-^oj$Z?a<4jBeKtdauf&_wU;QlB`d74( zpOpJhjTrSSPYf+3CzE89zt!=|4S#lI&N0e-2^f0;S88D+0OJnulD&)8snezNLO zdQ@mY!d#qm3g`6QJ2a$YIs4=R+45|@hbKXYOX|ja>*9P*8g7RiKkb0Db+NAW9+}Th z3_W(?-GAV5L!r3DgMWqveOQtn_-qf@u)!DpbGtcR)CZsRDHF=7FdKleX2ay3cTm<} zLNFq^rFnA8x^ewKN<4LF1_(GU^=LN;qy+=~gTxtUZFD4Nw+@lSUvuHFZQ<~mP&To6 zpefPXP@5UL(jHimH(9ot-z*r%>2vbud3&m_9k{h8@&9*M##Z2#95+#?(BYtODPTl+SOFwh>6%srFj|F{E%yLpq z#99aiYXrxrZ@OS#J<7ok0gYVWlu(VriSiC0NvkS+X>UZ2W9uB(>*+HfJjgu=#3Cl= z66j~7kx56Zd)KE|uvT%Fe~5w4-G)|_=_4<8}B?3Ygau^)cC8ATVFnP*f$ z*i6Rp))ODI5mCH3bUnOD7mN-Y9Ltq8$@K^7U2Cf|Su%RuUBDRf0h$c?W@(gNQJ^(}w--PJj(>~bHg zY`ZC|n|y2A5^hc$ zl`iPojy9sR?>WEbK$?nr^}WAldmCl^`2+NC2FoQ@K1W&YkqIIA zCh_13e(9m(-Jq2e^G`Hq4?%uA&rS`5`(guq6rCNV}bV~%+Inh2=t`>lSDqFK}3`kHc ztjV3zO5TWU<^50GBIxu8qEF%3+z2e8@cEjt%5w_f#YPa?C0hzZ8qX@v`MY3y?$aUW z+?i`oT(48tvAhxFm#FR=fn3v8iwW6C)eOxn8x4KJE2>Nb4q@+w@NcCk5iElKFG(yE zpb0y#uVO(0rPOvanhVpw_6M2kgo1A-UTe7+lWdROAu!CmowRant)@@ILThC5i=Oc?aMaU~MN+DIw+Sps=>-YU#eiDQdzN z^J)ce82&;EKrJ+hD3!+VY;LB?8D(*%QCYZ*4DdrkI?{C-pnQF16?{cq?ia4lIsF)a zia84826PuD8Zm#5k)aW%U@+`qOC%liV~Em)0b2{w0t}Ie1j?wC&}DeB0kok{Xeaox zkh1XhpJL<55j1|5H2P4cHsX-h9Q-bh^oSMDm}7J!Y58M{lE}hm z$FXB(!M4}yp{P@!UC4#C`+{4$$i|f21t&~|IReKp31q4%tE3zNK?j)`9VaGru$#gM zMHSTuCDgTRZ?@Ntz;jjW)^6zXb1Z`kq##NbWyp+RmP8dvkUP^+?)1XKc>zVtbQ4HX z+PLzC9FK#QdL}n?)XS|R^BKHuhz-5a_=&#SR>%Vq==&3rHI?zJ`QtT`GRvRlgHV~5 zmrk-T0PL3?WpFjz@$2>uvjhEuo^QW5R@yBXVN^jQ4ZAGNFeN`&^qtr=IeeGqfq@{Z zfAsru=7!Q(@W#u+clc6m(fXb?pFO?zA2k(iQ<^Ylo4q`qK@G29$T6~r#Xg!5MB*5q z?O+&MKuk(l8DmG&z!|V!J2ME(_%yKO@x!0$rwy8TWf)D^8q4p-Fby=;fKTt=X=0h# z51*ivH&<*#iW`-Xwr_^po1!=}e9?}PNDaSfBOf{pD1V#$yc(eDEC z!l?=~Esv3s_-9dYGJmCKzcOr%&+VMPYp!PVL}}4n#OnJ)?JZ;`4Hi8C&n$5@dE(&T zQxh|xij!A-V3Cio7;j3`In{OCA6i|wclpQPAvgyU8kfDrUx5#QvO1%+L%UrmuEVAFQnDo$HvPHV8)?|Ww9T1zxL?LN{E zgEjv(J0H&=54gHd4c;DXTRmRxog=D?^e3k#OI_0uIgh<2yB?x0Iz{)A*CsK)lCMoQ z+uFsrJ$?qrbn2ouBQ+u&PNj}@7zo1$@qGRy1-Z89=HAsz_JgN6@e;62TPHH%$f(fm z{e%xc@TO;KVjLSqlO#`ImJruynpsoizi4&tpsZL&aK zh?z7prlN>V5)XzUlJM@)!D>XwXQzEi#{727k+d>{;z;x}{pU+`tz3F)yJO|2elzUu zI+P&1BjvGdD4AB#I)Boc7X5>Zbx^E{5`$6?2hT8UnJoT7;WFF(9)!1gNd zp~vmlQ^2bVp8$%`CR`^3-5>}H%;A$2&5+0+2b`hK$M4@g)YoNB=~szJho*8{r<37c zkSR~EH+rq|Kf1P(y1z!)aA^s#)I7 z|9YMHVY#F{6tT&cOBjk!PB8bo7o#W_d$@ppb;^yIbsvCtSNF|L?p@1;W$xP5r@bYK(kgnkIaJSmuhh&Y3||z(Ceeq{581l1k0Mx>{EeKvu!iQ4WTGv z2>MWZ87)uS4{RC1pz%vFRdeK00|U*_P>X1iV`em_?^+fzb(qp6rwM7SJeGCsmo^i+ z_O*}KH=%%~32AMFmZQ-VOK9PoX)#rA`tjUU+^93X-Vl0K&hZYfPko|-NSQCDmH@*} z(2S>-Ta;Cs{Amm)6;!XfxQUAY_rCQt+B8yHHub@%Fg;l!Yge8*K~vnwG!Akae_S$C zQN_4ekjbB$FGnVJO^)&lzoU_5n1lCZ=P;@epa6Mhh-3d??d5|JfS7RkVEs}ym-5~x zwgIJKSrX~%V5N4{5(b+@?$Vi(9Ev89CW*6>_ECOJJxh@oZ?StN+GA*8qP##HK7mg` z0Rx~ro5d9dp<_>^Zt^0JS=t+_Y+i28j58PKRbV|%21U>nr$_Unx3hxv^NaP`G5nqO z$1Gh{4zt5Lx()*GpT?kV?`T7ow6DZ5B$0~2rAWUsc7N;b-C2lcWFTQ^=~}wMFPoe5 zO|~u@T#De3J@S|vsN}HPttBz1=MC01SwH}&yHTQw6TjMn1YJrCxZ7+^IxpTYnE$RT z;r&ehQrWxRwDpU=1}I^%-6Tyb3_%g! zea+wi`B1+A3b;OQr%i@X`!s&9b8JPcXV~BXwc^5~K&Ue%-b;iN1iA%oWOC+yWl0+V zx|FKg3oE8yq;UI(H>l8=@o>uVng%4IG|NC=&XuNXvlX$CB&MYw)?irESZHK#qZtUB z+e1oz!%Kk2Gt>^n@ z&*uzl%sm#hV93R)nDl&zv`aOs#k+loAbraI`PQUjqoWvnNg;R6a1eCq;MIPj7c9w#jWGOT1_E#-V=+bxzb4 zi`CMNHLRVMGDOLNMaO--g7SJH{wqyE*a{=nVJhiRum{`;sL8#q)yx_bSO|WerXdQ1 zAdmuKHG=gYNMN+Rq4{OJuC_K7r=>qHKEpgb(=iJK8hXCGSA>bc?mJldSU2&0Yx&M! zPQMz~LXD4>(ilGC9-dT?N!{hvg~`6b?9J^oeQceZ-##ZS`Hr)oqCUwKl;pc9*YD!F zmYlm-&*w|&fE^6F`bIyRxUm!I_}DzPfv-|m8%Q6L0>}~VOH-6#u-DW%42y$sJ7IBn ziW$%OB*h~X!Z;js=soL3h3PS%crczqB_Bt8PlX7#vAf%Qyr{6Fhc=E;P#K49sDiWA zV4=}WaCYybl$00mE_(Nk&7WlQ?(MH*N-0#x;bdUg*5lxf25=Eu%&;KlCp4Kk^DVr- zf_1b;0HjL}tI9<-mgmI^l4MjT!eT8S1ezQlTFI(0F9u6{2DnOEB8@KtOz`({4=B$; zP)$0_^D6ucanZTlLi$5Wjj0H^^wS9-_cfPMeImhHCSJ3Fs3}2r>5iE;oI4k7i zakuomn1mfwipn7e{P3$y0{f{@(8SAh#rs2h;JKYRCgyRBmoO;1*ZCIo3R;y|#1!G+ z!eCIcgwfRC#Kt4*Gg#P#@Zf?SPxDY`wm(zoa`~>nQTL@~j$rT=^bO45Vqs0Vme^_1d_M*$Mg|V^@?z1sr~> zII8lH_(q}@K+BpiYxt?hQZz4@@<&KJ>~=gc!r(Ko#JS=CK|D}CTHy^8OEx#(F|i9ptz6{ zjKEV9tU5XmccTqAB6f6FeAh%%Qs6`=d^+sm!DoaqL?JZbIM`G z(9ugnn%S`!zms)1)4Wb%#qI+&c?O8!2C}H!m!BhF^6VxKVQ4p8Q|#?4Wc$hU5j)a# zr$8;xECw>RctIU^j900g;5huKn60)l$=!kQIEO=+x=6J zQW88YwG@)-Dr&DQ*56eE%oonTi?cs17bo+=k#CufG)S6ub{EI z+EN%73B8(3d(xOSOR(!0&fL)r#Xg_oa!fkgvM-@P-&b% z$zWDVH+L8tya&2qaEcq2Ym>EeC!B&m77rDcZZ=1}=N^A98?`i)*EypQqxe2;c6LhH zo9*#j$e3T7-%?1xI%u4-9=)C1%Yxoyb(rzYorMZD({84%fYb*+<4tQBGe2|_=EPg_ zdqPcAA=P{Bz37FJNqhrJVc$q?op!go?1EY{cKL5a4@)4>G8?&@d%4XciqFARad445 zmhfnJTl1_lgu3BeZZ@b`Zu_uw{l*-_Tnj(l$aDsRGG4=q5F0(xommfl)XG@^Wr`_J zq5960KFm>pm15SRKc-HFg|@5EApA@~|FaN5=xQ^o}2l9)j?VmmqFo6LvUdh2X*O=YyT3kpU^tT(8w%9u}Asx~%&`nMOKJ+3KY z0XzV-b=4l3fjy(QLXmJmpIkN)UFRXeM$tKsP@(7?t=?Y78weSg{V06rqR`q{Yso0D zX?-GB5=LNegWNhtisT#oJkO5;MZ?YT&e5A`rsYfiL7kb{B-xDPJ(>iI1+*y-o|w@5 z0Hu&&A7WRogA~YM{;(a>I99abY$Yyi%MA!)UI0CxjC;1`i1&}Kx04recRh8W?E^K` zf!CIQ7}x8j(d1liI1)a?>D(9M^{Ys0kmI8HsZ(I~s`{M%w@>=k{=@cT@$sis-HI^z z77PQ!K%oP5!?Z2TC$S)#%#cdKr*Jj>>qGljPM{vOs z;-_zeW|1yoN0+4LU)@+_M1}Z1_u2t;pj6$N_DaVArl)c~%U)j>Yfy6$WFIU7mvNdM z#K)ZqPuGSN?zB4*qaCs;GopVlt12;viO03t=qx<5E zo8BvE4e1s1BqnCL5r+8Zy(Lg9hiGOAKwaX=pB}l5H@+=O@3#`7?_wF_i@t0?D`dS*bVy>uHJrqX!|ypBVT%f z4GTN=R}h2I>C4pPE9mp}r^;*i^7Zp~os}ZAmKrYQ(PbZY6Je>0565th=TbnI%;6aj zcW&z=%<8~7Z0Of%%IX=47^bz_I0^@w&-56Ls=DoF7&a8_Y(6quw3p_oH%^sJ(~f&i zVRr@>lLwlj>TJSz*iAvlh@=s9Nz*!+?4%M&1caTq-r$5yoeZ{EO@?6iVy)iKPXbd) zZtjI+PtxnV6mQomw#xGgO3b`Ty%eZ%gVoMpBm(l!@Hggyzxu7JWh&0pawQH%C|_{K zoFrN@5BtEtc8C3&FLwy_}6 zpIfb8LHy;w84U137Il1Rd%x}R3i1Ko#_b$CR}5qZ*lGh~^s7%0nXjPWqH{gQoAz(# zVs;pO7XJKolj2#4VNeWNX8!kh^ErPN>OU&=|0yM2(t|6nAl=HyofZ1v-!(_?RgfT- zQMm=b2;pO?!*0;(%f`O&F~8GZDxs0(QoyKj;7ZUSjLB`|GGGB<9B`s@4ZPJhd-TZF zfND?9`bH!$^d+Mx70(w}#ruA`PNiE~^4nAhQ)NlmYIVM|+ZQoJ)JKa~P%d6W1iSi7 z`DWAdnx*UFQI7Uk$BooH(-7zOe1w?D;c+k}#J;I?xMb&hToAr_P z@%Ez(@H*~@iQ4gBkEa$TxbWq=FP^we;Bv+l5Zp3+lNjaNz%$CX4Axf=CZB)Q zy%90@E6C!xz3>6$?jf)qCSn6IiqFz5p<>;80)eG_XaMEFeoV*6e_x28{C6gT-hq0Z zd!F~F%q}&0jD-QqCME2lWYy^%p4_j0)byhRNh778uy@r~;jh1x+#{a9yd1ciG#HuQ z${MQznWN}il!Mzbvxd#S`b)=f*a&llcl~$z8!%y1;PU9mN{uuP{7b-|TlaF;wri6LalQta0SY-Liir|q6ZDFf-B*H`!j^Dih$ zU&1~NhvO>r^FU+3-NIrEB=)A7!}Xnf2{*cvsCat_X&`67D}FeDnZhfG96RyZeF@mJ zn~nIN<~a01U7 zQzdhz&iSrj39)D3 z&}`P(!(mE9%|CYpvq^FpL)l081v4)6-g%)|E7R{(J>)T$^(#D#LPVWhJ+|v`Rb3TVS;;HId6eH!}diw3nesk*SmXT>;ZYN{f;{I&8-*wi$Hcge=fA2 z5|H&yewFX!YUHFqKFb(1NVDpTG7iwuC0$?oUO_SF9c z3Ff$i2r7q*&(785PNJYL`@4HP#*VBQ35x6Ug555>cLRU#Fd{S*Gh^ z$(cHGNH$ImvHl&o0Rj|31Sa)R0VMhM0)%&#MXoM7lVyt=T;a7I^qNNO^9P)l+zlb` zjVhB!w))R1t&B^=1P){L%KsJ@?auA(nk7*dqZ@Qaf#df-`sT%OGQ|j>e1DAF<#|Cr0g@k5K(%66iV**wLbb*U z4!_Dy63vqXmf$7A_$M6!!WYOpIHJCk(0blS@SGkuzO@p2m}MLVq_(_Ih4&v`qs% zTeP;FbuP4L7OC?0hRS|?0q?0t<=q#b+xFWf;wOiwW0}kcsJF1ZY6qMTg0{rUdsdIQ zU~anw7mn?IJOAeXL3$Calp({F9JmL=Mtf{_PQXFD|3Yk6RV=MWYqauXiPuNOx(lwK zhsX4*9hMDn@CvGB0`^efRD)ONE2xj=WxDarvwk{#zJ+}S5o94T!$;vSN|3q6?bT0l zkjCnA3_x3w7{$@8M{>q@LwfJuOL(QDI|&M^SW78kpZL~EZmkr50Hcu*K;8BP#jH+Y zQ{Uu|Jwu!VrwxL4+r$frf>*F_p|Nf4?F~E*1boXpf6jdyxG7*S#8SL+EB4^!QJz}9 zp*|8fMIu%`4CE%?-nDgYuuw+>$_b@`EOC38Ok3L=h^p*c0c;QNUB0X-LoepQ_*HqpsKeU&QHGAFk`)l-W)eDiRpj zG_Jd`aN_D*mKhZGo+03jV3-h(B^w~4@y95ejs7{iOfK4~4$afLo*A0RJ6mgJ;Bl6) zDT}e9y`aDvHT-_XnC|HK(FcdVZ7jMT;p8{=x0_PpJ{dv>rz!2OhrmREZ2tZ^W$su+ zHP=}jadL%Zb&qPo`+J`O1msfn?si;YO1*X3aSY4V*?jwvyMB_HF`d!+99r0PCD_<& zG9*~pTXp`@K~)r~Pd~z4_h$z9n;?9P9KkDSA7ZjwJaUI+0@68fFky-F*g9KE&;wNK zLiBF7W|cs$2viC}r(KqgsTPH45)^^P@>}Ey=I4=VrJxhO- ztUIdK?PjIfpiy%|2==#RlO9^aMR8#HFu{+C8oEAps{VTpPjzH>VfCoW0=+-v#)@fV z{S~zR(`A>y@i)lA)%N8-dRJqL{W;YlZFf+1m*+8ewu)acYd_Z9U8nq)7JsH`M12i{ zytJRZ{q%H`dXQs0Fl7}ydDN+)Zo@ckM8_UZ)3*jY>BD)5C^K=yoRwmkitiDUva^Ou z8KN1C$qhx}3_|THV-CEEpRbpx!e_64zu)V=8JcZoX^;BD3DJv0#M&9}+*&}9T#A35 z(>~H?!-t#w9ACO-68ZSHyVSrLS9NwwCeprwK$FB7ugK5g@C}sZ% z(KV*@N-baSH{v}bT1**>Z$&5@ihX}4$r*FE(K+n#DDp`($5;)0S80nb1L=j*q9r}& z3JTxtwSUioU{Bcc7e!uy`k(s`j+OQE@f{WhF zyI~*kJ!AkF;G0^TV-B&vp-iv@E-NmCVTm1ruYWjUcRhJslw8f!lbFSgwuW{6!dUY_ zIMoq9_b6;*8B?FcT}Dca3tnLDFFC`hh5nm551|PD;W4}&Y(vO2ST^G#;zY)nm9hVl zHdAlYlr(w&_%;~l=B!26z_Ft_aj__1=RU_FoQquikHEo^AVH+%@Z5SC*pQjAeI4_h z@kyEAXYe7S5(TGDa-@S#e$z)nWc<5cv*z*7B@W-fV%J=XV|WyvQ;`Gyg~xUxjwCJY0DCA{_F45Wz7f|MHiFmiUY z;ie_B5n;pF^Kyb15e(x1!r3H#wnBOzGSa_J8cS7Rs zvVW+XZf|jRb4{TMtTWCU$Ee1+#ggi&&~PL0;4F9IQl~}I=`we4;aLOI?8KOsAINw_ zO9`eRDM?~Q&il#3-5q;jK)etC_f;&%hhECmxPhIrr=n8v#}^A&Sn>jaJp03|-}L3k zi~3SKOELDG%NfQM!Xv(ENO9K`&z4%DpdJDAsmA9X@|WeW*MdhLQIA_5Td$x13Hko# z9_q~d>!4|%5;y|bk0Y9BppaYzUoR z1u|Lt;QmReUs_V+1l2VNQUZA!(%DU>GNCroZp0U0iu@PMPU#k{x2| ziB4OWsH@kObD?)-MK|BGKS$L%&re)vzvJnL4j97WJs8yi?*Feq2v*C54MV_}Fdtl` zL4ZKbV6q4r03jdkqgWW44mU}yUHy^8fvTZ4QGK45JC(fFWLNgmQ8MsyZ^|%sviQ?f z`>ddp*3CKH0Y+RaUrzO+etT+Fdz1w(SJWCg&J(u(bQdTyE&KEB&h#)*+fs z3{ATa$Xb8!4EpORmz(V`<@rALGj zvU5|5kH4W&W+@GpB2~l7kK@<6EOp81Bl_IzDRF>)bb{J=uo{;;DjmWAg$C-uJ2l_+ z3}^1v<`Hhp)UU6FulPum3T|u(Or>Fi&8hrRg~hz&=+=@plGS25qS z0ccxxvET%r!akx>-hPx@{w$(x5UP#|&By8dAyxs|5{2UY>U2)6bkI0)|Irgwe}x18 zSQXp4)6K#$Qj+;Iy17ljbTNTf+?1;i8FAA45;i;sM^Kdb?@f_j#_itDC0s-%$ulME z$qa|oTqn2$!=rmVtjpGvai<0j`AS9NWdK3D7x;rLbNL0Xwa-d1TTs2YiC0ahp?#8l;b$Y?&(*# zb?i$6we}HZKUcn`9AMM5t5c0rK^rNMaWcL7i;{$3a6uc%r&)V>fyYfL9x<_$JgKyn zUJK<|2rp@ig;yK3=Hzy`84Lf{2n$(BM#h0?s({#C`b|y68vNB4PI(2TlRw0q;}~5)wUKZnrPDFXxYLoPG@urK!)#?%PExLsHc%Cm+Yz zRNc?GNPD7*BUmHL?&G_<54C$6(3{cQefFiMF?fngAXNcVoV&sEt;1??YS5M}hWKPJ zQq|F@pxko4)d$+!$39Vk z`@xibNuRW-KM@;MeLgBHsu>g$lDJde9(C7-zQ9Q&rGLa<8l=P2n551jUbBD388PyB z(v&)DgkoW6R5Ybu@0krLx_Wwmq3w$jO9&hYU=Yi1v4V z3s@lWJ!C5mI1QH^?3Rc|@Xy*7h_`$yF$@rh^leehe>ON$@OlyvxH}P>;Ga}+X=o5g z5%u4YB-LLCBMF<}Kbg`0h9>C#LI!WpKdHZ!Z%4Ah{5K@U@)xQ|!p8q65f}*u1cD&` zH^c*8OX48-C+Bqz3Iw`+TSNc9*Brq2_aO4g*aZJ%+WmNguHgR-r3n6o(%+!}WRv|H z(i8a$9lb&SWR&^5nF#*Fzabf^zYt#vHo-q>R90_)Ea=TdWdAYZTMa?sFT`XF1CCBX zBlssPBI^w_L;E*a_vJ6Rkir6)paDio)quR#1f!c!g2PhTAs@BgsubWCZ3OU1Djg(* z&flg$8V4k-?%yhc9s-#6tp{1}Zxc-)0sNFk2Z^cww<(*>0f7tlP1l4ZHuz^pYz7A; zrQzQ$t+y(@(OZ=g%xsJRZqJ~DWHWwiGK29l=^%K(Vwuzg|H;_^f!?g}UmLR(7{wYF zoSjJrSsel%$s{NEzXA2l_~`#df1kh~FKnJh|zf1JD7Ti~sP{5SU@5*(iO fcA$UU(Oc)cH`~7%>%X?zXz)-L8O#OvpMC!ajz!uD