Skip to content

Instantly share code, notes, and snippets.

@diffshare
Last active September 4, 2020 11:19
Show Gist options
  • Save diffshare/21fcd4717e2bed000b8f68c0f6fc0986 to your computer and use it in GitHub Desktop.
Save diffshare/21fcd4717e2bed000b8f68c0f6fc0986 to your computer and use it in GitHub Desktop.
Covid19Radarのシーケンス図

Covid19Radarのシーケンス図

ソースコードから書き起こしたシーケンス図です。間違っている可能性があります。

シーケンス図

@startuml
participant ユーザー as user
participant アプリ as app
participant 接触確認プラグイン as plugin
participant OS as os
participant サーバー as server
participant DB as db
==== 起動時 ====
user -> app: 起動
app -> plugin: Init
plugin -> plugin: ScheduleFetchAsync
plugin -> os
plugin <-- os
note over plugin: バックグラウンド処理開始\n後で説明
app -> server: AppCenter
app -> plugin: IsEnabledAsync
app <-- plugin: bool
app -> plugin: ScheduleFetchAsync
note over plugin
trueだったらスケジュール
なんで2度も?
end note
app -> app: ユーザーデータを確認
group ユーザーデータが存在しなければ
app -> app: チュートリアル開始
end
group ユーザーデータが存在すれば
app -> app: ホームページ表示
end
==== チュートリアル ====
user <-- app: チュートリアル1表示
user -> app: 次へボタン押下
user <-- app: チュートリアル2表示
user -> app: 次へボタン押下
user <-- app: チュートリアル3表示
user -> app: 次へボタン押下
app -> server: RegisterUserAsync\nPOST /register\ncontentは空
note over server
ユーザー登録
UserUuidを生成
UserUuidをseedに乱数文字列を生成: Secret
SecretをAES暗号化: ProtectSecret
end note
server -> db: ユーザーレコードを登録\nUserUuid\nProtectSecret
app <-- server: JSON応答\nSecret,UserUuid,JumpConsistentSeed
app -> os: ユーザーデータを生成し永続化
user <-- app: プライバシーポリシー表示
note over app
うーん
end note
user -> app: 次へボタン押下
user <-- app: チュートリアル4表示
group 非同意ルート
user -> app: 非同意
app -> os: 接触通知は無効とユーザーデータに書き込んで保存
end
group 同意ルート
user -> app: 同意
group iOS
user <- app : Loading画面表示
app -> plugin: StartAsync\n接触確認APIを開始
plugin -> os: iOS: SetExposureNotificationEnabledAsync(true)
note over os
TEKから10~20分ごとにRPIを生成してアドバタイズ
OS側でずっと広告処理を行う
end note
group while
app -> app: 1秒待機
app -> plugin: StartAsync\n接触確認APIを開始
plugin -> os: iOS: SetExposureNotificationEnabledAsync(true)
note over app: 重要なことなので2度(略
app -> plugin: GetStatusAsync\n状態取得
plugin -> os: iOS: ExposureNotificationStatus
plugin <-- os: Status\nenum: Active,BluetoothOff,Disabled,Restricted
app <-- plugin: Status
group Status == Active
app -> os: 接触通知は有効とユーザーデータに書き込んで保存
end
group Status == BluetoothOff
user <-- app: Bluetoothオフやで?
app -> app: 同意前に戻る
end
group 2回リトライしてダメだったら
user <-- app: Exposure Notificationを起動できませんでした\nOh! i18nされないハードコーディング!!
user -> app: OK
app -> app: アプリを落とす
end
end
end
group Android
note over app
ほぼiOSと同等だが
Bluetoothオフの場合に同意前に戻らない
end note
group 2回リトライしてダメだったら
app -> os: 接触通知は無効とユーザーデータに書き込んで保存
app -> app: アプリは落とさずにチュートリアル5に進む
end
end
end
user <-- app: チュートリアル5表示
user -> app: 通知(あり/なし)を選択\nIsNotificationEnabled = bool
app -> os: 通知有無をユーザーデータに保存
user <-- app: チュートリアル6表示
user -> app: ホーム/ヘルプページの表示を選択
==== バックグラウンド処理 iOS ====
app -> plugin: Init
plugin -> plugin: ScheduleFetchAsync
plugin -> os: BGTaskScheduler.Shared.Register\nコールバック登録\nUpdateKeysFromServer
plugin -> plugin: scheduleBgTask
plugin -> os: ENManager.AuthorizationStatus取得
plugin <-- os: ENAuthorizationStatus
note over plugin: ENManager.AuthorizationStatus != ENAuthorizationStatus.Authorized\nならreturn
plugin -> os: BGTaskScheduler.Shared.Submit
note over os: バックグラウンド処理を依頼
...
plugin <- os: UpdateKeysFromServer\nサーバーのキー情報を更新しよう
app <- plugin: FetchExposureKeyBatchFilesFromServerAsync\nサーバーからキー情報の回収よろー
group foreach (var serverRegion in SupportedRegions)
app -> app: DownloadBatchAsync
app -> app: GetTemporaryExposureKeyList
app -> server: GetCdnAsync\nGET /{container}/{region}/list.json
app <-- server: JSON応答\nTekList
group foreach tekItem in tekList
app -> os: LastProcessTekTimestamp取得
app <-- os: LastProcessTekTimestamp
group LastProcessTekTimestampより新しいtekだったら
app -> server: GetTemporaryExposureKey\nGetCdnStreamAsync\nGET {tekItem.Url}
app <-- server: uuid生成および名前{uuid}.zipで\nファイル保存
end
app -> os: LastProcessTekTimestamp更新
end
app -> plugin: submitBatches
plugin -> plugin: PlatformDetectExposuresAsync
plugin -> plugin: GetConfigurationAsync
note over plugin: zip展開 -> .binファイルと.sigファイル
plugin -> os: iOS: DetectExposuresAsync
note over os
TEKからRPIを生成して突合
end note
note over os
RPIの一致があればサマリ生成
end note
plugin <-- os: detectionSummary:\nDaysSinceLastExposure\nMatchedKeyCount\nriskScoreSumFullRange\nmaximumRiskScoreFullRange
note over plugin: zip展開したファイルを削除
app <- plugin: ExposureDetectedAsync
app -> plugin: getExposureInfo(GetInfo)
plugin -> os: iOS: GetExposureInfoAsync
plugin <-- os: Date\ntotalRiskScoreFullRange\nAttenuationValue\nTransmissionRiskLevel\nDuration
app <-- plugin: 同上
app -> os: ユーザーデータのExposureInformationにExposureSummaryを追加
group IsNotificationEnabled == true
user <-- app: 新型コロナウイルス陽性登録者との接触の可能性\n新型コロナウイルス陽性登録者と\n接触した可能性があります。詳細はこちら。
user -> app: アプリ起動\nバックグラウンド動作なので
end
app -> app: zipファイル削除
end
== 感染確認 ==
user -> app: ホームページより感染確認ボタンを押下
app -> app: ユーザーデータのExposureInformationより\n感染情報を確認
group 感染情報が存在しない
user <-- app: 陽性者との接触は確認されませんでした
end
group 感染情報が存在する
user <-- app: 陽性者との接触確認
note over app
以下メッセージ?
陽性者との接触一覧
症状を入力して相談
電話で症状を伝えて相談
現在の症状などを、入力フォームまたはお電話にて、ご連絡ください。内容に応じて、帰国者・接触者外来等への受診を案内します。
受診の際などに必要となる場合があるため、本画面のスクリーンショットの保存をお願いいたします。
end note
end
== 陽性情報の登録 ==
user -> app: ホームページより陽性情報の登録ボタンを押下
user <-- app: 陽性情報の登録ページを表示
note over app
以下メッセージ?
新型コロナウイルス感染症者等情報把握・管理支援システム(HER-SYS)から発行された処理番号を入力してください。
過去14日間に本アプリであなたと接触した履歴のある人に通知が行きます。
登録は匿名で行われ、氏名や連絡先など個人が特定される情報を登録する必要はありません。
また、接触した場所の位置情報が記録や通知されることもありません。
end note
user -> app: DiagnosisUidを入力\n処理番号
app -> os: ユーザーデータのPendingDiagnosisにDiagnosisUidを追加
app -> plugin: SubmitSelfDiagnosisAsync
plugin -> plugin: GetSelfTemporaryExposureKeysAsync\nPlatformGetTemporaryExposureKeys
plugin -> os: iOS: GetDiagnosisKeysAsync
plugin <-- os: TEK[]\nKeyData\nRollingStartNumber\RollingPeriod\nTransmissionRiskLevel
app <- plugin: UploadSelfExposureKeysToServerAsync(selfKeys)
app -> app: DiagnosisUidとTEK[]を関連付けして\nSubmissionを作成
app -> server: PutSelfExposureKeysAsync\nPUT /diagnosis\nSelfDiagnosisSubmission
note over server
SubmissionNumber: DiagnosisUid
AppPackageName: AppInfo.PackageName
UserUuid
Platform
Regions: AppSettings.Instance.SupportedRegions
Keys: keys
VerificationPayload: DiagnosisUid
end note
note over server
diagnosisの正しさを検証
UserUuidとAuthorizationヘッダーを検証
AuthorizationヘッダーはUserUuidから生成されたもの
end note
server -> db: IDでユーザーを問い合わせ
server <-- db: 該当ユーザー
note over server
AuthorizationヘッダーとProtectSecretが等しいことを検証
end note
server -> db: Diagnosisテーブルにdiagnosisを追加\ntimestamp\nUserUuid\nkeys
server <-- db
server -> db: Tekテーブルにkeyを追加
server <-- db
app <-- server: JSON応答
user <-- app: 診断結果の提出\n完了しました
user -> app: OK
user <-- app: ホームページに戻る
== バッチ - 追加 ==
server -> db: Tekテーブルから14日前までのTEKかつexport前を取得
server <-- db: TEK[]
note over server
TEKをGroupBy
GetRollingStartUnixTimeSecondsおよび
GetRollingPeriodSeconds
Regionsごとに処理
TEKの順番を並べ替え
Security considerations: Random Order TemporaryExposureKey
zipの作成
binとsigのJSON
bin: TEKのリスト
Keys
BatchNum
BatchSize
Region
StartTimestamp
EndTimestamp
SignatureInfos
sig: signature
binの署名
sigの実装がおそらく秘密情報?
end note
server -> db: TEKのExport情報を追加
== バッチ - 削除 ==
server -> db: GetOutOfTimeKeysAsync
server <-- db: 14日前のTEKを応答
server -> server: zipファイルを削除
server -> db: TEKのExport情報を更新\n削除済みとして
server -> db: TEKリストから該当TEKを削除
@enduml
Display the source blob
Display the rendered blob
Raw
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="6914px" preserveAspectRatio="none" style="width:1490px;height:6914px;" version="1.1" viewBox="0 0 1490 6914" width="1490px" zoomAndPan="magnify"><defs><filter height="300%" id="f1lc1h5im1m9ig" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="61.7031" style="stroke: #000000; stroke-width: 2.0;" width="260" x="385" y="511.1797"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="61.7031" style="stroke: #000000; stroke-width: 2.0;" width="232" x="385" y="586.8828"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="79.0547" style="stroke: #000000; stroke-width: 2.0;" width="1009" x="68" y="1313.0234"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="1109.0078" style="stroke: #000000; stroke-width: 2.0;" width="1194" x="38" y="1406.0781"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="851.1953" style="stroke: #000000; stroke-width: 2.0;" width="1174" x="48" y="1461.7813"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="654.7344" style="stroke: #000000; stroke-width: 2.0;" width="1029" x="58" y="1651.2422"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="48.7031" style="stroke: #000000; stroke-width: 2.0;" width="692" x="385" y="1991.4609"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="92.0547" style="stroke: #000000; stroke-width: 2.0;" width="454" x="68" y="2054.1641"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="138.7578" style="stroke: #000000; stroke-width: 2.0;" width="467" x="68" y="2160.2188"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="181.1094" style="stroke: #000000; stroke-width: 2.0;" width="803" x="284" y="2326.9766"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="92.0547" style="stroke: #000000; stroke-width: 2.0;" width="692" x="385" y="2409.0313"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="1301.5234" style="stroke: #000000; stroke-width: 2.0;" width="1123" x="58" y="3231.1719"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="251.5156" style="stroke: #000000; stroke-width: 2.0;" width="796" x="375" y="3436.6328"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="128.1094" style="stroke: #000000; stroke-width: 2.0;" width="776" x="385" y="3522.6875"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="128.1094" style="stroke: #000000; stroke-width: 2.0;" width="397" x="68" y="4354.2344"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="48.7031" style="stroke: #000000; stroke-width: 2.0;" width="397" x="68" y="4681.1016"/><rect fill="#FFFFFF" filter="url(#f1lc1h5im1m9ig)" height="187.1641" style="stroke: #000000; stroke-width: 2.0;" width="825" x="12" y="4743.8047"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="115" y1="39.6094" y2="3102.7656"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="115" x2="115" y1="3102.7656" y2="3130.7656"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="115" y1="3130.7656" y2="6872.3906"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="425" y1="39.6094" y2="3102.7656"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="425" x2="425" y1="3102.7656" y2="3130.7656"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="425" y1="3130.7656" y2="6872.3906"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="741" y1="39.6094" y2="3102.7656"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="741" x2="741" y1="3102.7656" y2="3130.7656"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="741" y1="3130.7656" y2="6872.3906"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1048" x2="1048" y1="39.6094" y2="3102.7656"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="1048" x2="1048" y1="3102.7656" y2="3130.7656"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1048" x2="1048" y1="3130.7656" y2="6872.3906"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1114" x2="1114" y1="39.6094" y2="3102.7656"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="1114" x2="1114" y1="3102.7656" y2="3130.7656"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1114" x2="1114" y1="3130.7656" y2="6872.3906"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1454.5" x2="1454.5" y1="39.6094" y2="3102.7656"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 1.0,4.0;" x1="1454.5" x2="1454.5" y1="3102.7656" y2="3130.7656"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1454.5" x2="1454.5" y1="3130.7656" y2="6872.3906"/><rect fill="#FEFECE" filter="url(#f1lc1h5im1m9ig)" height="31.6094" style="stroke: #A80036; stroke-width: 1.5;" width="70" x="78" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="56" x="85" y="24.5332">ユーザー</text><rect fill="#FEFECE" filter="url(#f1lc1h5im1m9ig)" height="31.6094" style="stroke: #A80036; stroke-width: 1.5;" width="70" x="78" y="6871.3906"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="56" x="85" y="6892.9238">ユーザー</text><rect fill="#FEFECE" filter="url(#f1lc1h5im1m9ig)" height="31.6094" style="stroke: #A80036; stroke-width: 1.5;" width="56" x="395" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="42" x="402" y="24.5332">アプリ</text><rect fill="#FEFECE" filter="url(#f1lc1h5im1m9ig)" height="31.6094" style="stroke: #A80036; stroke-width: 1.5;" width="56" x="395" y="6871.3906"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="42" x="402" y="6892.9238">アプリ</text><rect fill="#FEFECE" filter="url(#f1lc1h5im1m9ig)" height="31.6094" style="stroke: #A80036; stroke-width: 1.5;" width="140" x="669" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="126" x="676" y="24.5332">接触確認プラグイン</text><rect fill="#FEFECE" filter="url(#f1lc1h5im1m9ig)" height="31.6094" style="stroke: #A80036; stroke-width: 1.5;" width="140" x="669" y="6871.3906"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="126" x="676" y="6892.9238">接触確認プラグイン</text><rect fill="#FEFECE" filter="url(#f1lc1h5im1m9ig)" height="31.6094" style="stroke: #A80036; stroke-width: 1.5;" width="34" x="1029" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="20" x="1036" y="24.5332">OS</text><rect fill="#FEFECE" filter="url(#f1lc1h5im1m9ig)" height="31.6094" style="stroke: #A80036; stroke-width: 1.5;" width="34" x="1029" y="6871.3906"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="20" x="1036" y="6892.9238">OS</text><rect fill="#FEFECE" filter="url(#f1lc1h5im1m9ig)" height="31.6094" style="stroke: #A80036; stroke-width: 1.5;" width="70" x="1077" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="56" x="1084" y="24.5332">サーバー</text><rect fill="#FEFECE" filter="url(#f1lc1h5im1m9ig)" height="31.6094" style="stroke: #A80036; stroke-width: 1.5;" width="70" x="1077" y="6871.3906"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="56" x="1084" y="6892.9238">サーバー</text><rect fill="#FEFECE" filter="url(#f1lc1h5im1m9ig)" height="31.6094" style="stroke: #A80036; stroke-width: 1.5;" width="33" x="1436.5" y="3"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="19" x="1443.5" y="24.5332">DB</text><rect fill="#FEFECE" filter="url(#f1lc1h5im1m9ig)" height="31.6094" style="stroke: #A80036; stroke-width: 1.5;" width="33" x="1436.5" y="6871.3906"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="19" x="1443.5" y="6892.9238">DB</text><rect fill="#EEEEEE" filter="url(#f1lc1h5im1m9ig)" height="3" style="stroke: #EEEEEE; stroke-width: 1.0;" width="1475.5" x="3" y="70.7852"/><line style="stroke: #000000; stroke-width: 1.0;" x1="3" x2="1478.5" y1="70.7852" y2="70.7852"/><line style="stroke: #000000; stroke-width: 1.0;" x1="3" x2="1478.5" y1="73.7852" y2="73.7852"/><rect fill="#EEEEEE" filter="url(#f1lc1h5im1m9ig)" height="24.3516" style="stroke: #000000; stroke-width: 2.0;" width="64" x="708.75" y="59.6094"/><line style="stroke: #000000; stroke-width: 1.0;" x1="714.75" x2="714.75" y1="71.7852" y2="71.7852"/><line style="stroke: #000000; stroke-width: 1.0;" x1="714.75" x2="714.75" y1="73.7852" y2="73.7852"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="42" x="718.75" y="76.6045">起動時</text><line style="stroke: #000000; stroke-width: 1.0;" x1="764.75" x2="764.75" y1="71.7852" y2="71.7852"/><line style="stroke: #000000; stroke-width: 1.0;" x1="764.75" x2="764.75" y1="73.7852" y2="73.7852"/><polygon fill="#A80036" points="413,112.3125,423,116.3125,413,120.3125,417,116.3125" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="116.3125" y2="116.3125"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="26" x="122" y="111.4561">起動</text><polygon fill="#A80036" points="729,142.6641,739,146.6641,729,150.6641,733,146.6641" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="735" y1="146.6641" y2="146.6641"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="17" x="432" y="141.8076">Init</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="783" y1="177.0156" y2="177.0156"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="783" x2="783" y1="177.0156" y2="190.0156"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="742" x2="783" y1="190.0156" y2="190.0156"/><polygon fill="#A80036" points="752,186.0156,742,190.0156,752,194.0156,748,190.0156" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="124" x="748" y="172.1592">ScheduleFetchAsync</text><polygon fill="#A80036" points="1036,200.0156,1046,204.0156,1036,208.0156,1040,204.0156" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="1042" y1="204.0156" y2="204.0156"/><polygon fill="#A80036" points="752,214.0156,742,218.0156,752,222.0156,748,218.0156" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="746" x2="1047" y1="218.0156" y2="218.0156"/><path d="M650,231.0156 L650,273.0156 L827,273.0156 L827,241.0156 L817,231.0156 L650,231.0156 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M817,231.0156 L817,241.0156 L827,241.0156 L817,231.0156 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="156" x="656" y="249.5107">バックグラウンド処理開始</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="52" x="656" y="265.8623">後で説明</text><polygon fill="#A80036" points="1102,301.0703,1112,305.0703,1102,309.0703,1106,305.0703" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="1108" y1="305.0703" y2="305.0703"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="61" x="432" y="300.2139">AppCenter</text><polygon fill="#A80036" points="729,331.4219,739,335.4219,729,339.4219,733,335.4219" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="735" y1="335.4219" y2="335.4219"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="94" x="432" y="330.5654">IsEnabledAsync</text><polygon fill="#A80036" points="436,361.7734,426,365.7734,436,369.7734,432,365.7734" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="430" x2="740" y1="365.7734" y2="365.7734"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="24" x="442" y="360.917">bool</text><polygon fill="#A80036" points="729,392.125,739,396.125,729,400.125,733,396.125" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="735" y1="396.125" y2="396.125"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="124" x="432" y="391.2686">ScheduleFetchAsync</text><path d="M652,409.125 L652,451.125 L825,451.125 L825,419.125 L815,409.125 L652,409.125 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M815,409.125 L815,419.125 L825,419.125 L815,409.125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="152" x="658" y="427.6201">trueだったらスケジュール</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="85" x="658" y="443.9717">なんで2度も?</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="467" y1="483.1797" y2="483.1797"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="467" x2="467" y1="483.1797" y2="496.1797"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="426" x2="467" y1="496.1797" y2="496.1797"/><polygon fill="#A80036" points="436,492.1797,426,496.1797,436,500.1797,432,496.1797" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="130" x="432" y="478.3232">ユーザーデータを確認</text><path d="M385,511.1797 L640,511.1797 L640,519.1797 L630,529.1797 L385,529.1797 L385,511.1797 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="61.7031" style="stroke: #000000; stroke-width: 2.0;" width="260" x="385" y="511.1797"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="210" x="400" y="525.6748">ユーザーデータが存在しなければ</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="467" y1="551.8828" y2="551.8828"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="467" x2="467" y1="551.8828" y2="564.8828"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="426" x2="467" y1="564.8828" y2="564.8828"/><polygon fill="#A80036" points="436,560.8828,426,564.8828,436,568.8828,432,564.8828" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="117" x="432" y="547.0264">チュートリアル開始</text><path d="M385,586.8828 L612,586.8828 L612,594.8828 L602,604.8828 L385,604.8828 L385,586.8828 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="61.7031" style="stroke: #000000; stroke-width: 2.0;" width="232" x="385" y="586.8828"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="182" x="400" y="601.3779">ユーザーデータが存在すれば</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="467" y1="627.5859" y2="627.5859"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="467" x2="467" y1="627.5859" y2="640.5859"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="426" x2="467" y1="640.5859" y2="640.5859"/><polygon fill="#A80036" points="436,636.5859,426,640.5859,436,644.5859,432,640.5859" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="104" x="432" y="622.7295">ホームページ表示</text><rect fill="#EEEEEE" filter="url(#f1lc1h5im1m9ig)" height="3" style="stroke: #EEEEEE; stroke-width: 1.0;" width="1475.5" x="3" y="676.7617"/><line style="stroke: #000000; stroke-width: 1.0;" x1="3" x2="1478.5" y1="676.7617" y2="676.7617"/><line style="stroke: #000000; stroke-width: 1.0;" x1="3" x2="1478.5" y1="679.7617" y2="679.7617"/><rect fill="#EEEEEE" filter="url(#f1lc1h5im1m9ig)" height="24.3516" style="stroke: #000000; stroke-width: 2.0;" width="120" x="680.75" y="665.5859"/><line style="stroke: #000000; stroke-width: 1.0;" x1="686.75" x2="686.75" y1="677.7617" y2="677.7617"/><line style="stroke: #000000; stroke-width: 1.0;" x1="686.75" x2="686.75" y1="679.7617" y2="679.7617"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="690.75" y="682.5811">チュートリアル</text><line style="stroke: #000000; stroke-width: 1.0;" x1="792.75" x2="792.75" y1="677.7617" y2="677.7617"/><line style="stroke: #000000; stroke-width: 1.0;" x1="792.75" x2="792.75" y1="679.7617" y2="679.7617"/><polygon fill="#A80036" points="126,718.2891,116,722.2891,126,726.2891,122,722.2891" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="722.2891" y2="722.2891"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="124" x="132" y="717.4326">チュートリアル1表示</text><polygon fill="#A80036" points="413,748.6406,423,752.6406,413,756.6406,417,752.6406" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="752.6406" y2="752.6406"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="91" x="122" y="747.7842">次へボタン押下</text><polygon fill="#A80036" points="126,778.9922,116,782.9922,126,786.9922,122,782.9922" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="782.9922" y2="782.9922"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="124" x="132" y="778.1357">チュートリアル2表示</text><polygon fill="#A80036" points="413,809.3438,423,813.3438,413,817.3438,417,813.3438" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="813.3438" y2="813.3438"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="91" x="122" y="808.4873">次へボタン押下</text><polygon fill="#A80036" points="126,839.6953,116,843.6953,126,847.6953,122,843.6953" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="843.6953" y2="843.6953"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="124" x="132" y="838.8389">チュートリアル3表示</text><polygon fill="#A80036" points="413,870.0469,423,874.0469,413,878.0469,417,874.0469" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="874.0469" y2="874.0469"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="91" x="122" y="869.1904">次へボタン押下</text><polygon fill="#A80036" points="1102,933.1016,1112,937.1016,1102,941.1016,1106,937.1016" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="1108" y1="937.1016" y2="937.1016"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="112" x="432" y="899.542">RegisterUserAsync</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="86" x="432" y="915.8936">POST /register</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="69" x="432" y="932.2451">contentは空</text><path d="M973,950.1016 L973,1025.1016 L1251,1025.1016 L1251,960.1016 L1241,950.1016 L973,950.1016 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1241,950.1016 L1241,960.1016 L1251,960.1016 L1241,950.1016 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="78" x="979" y="968.5967">ユーザー登録</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="92" x="979" y="984.9482">UserUuidを生成</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="257" x="979" y="1001.2998">UserUuidをseedに乱数文字列を生成: Secret</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="205" x="979" y="1017.6514">SecretをAES暗号化: ProtectSecret</text><polygon fill="#A80036" points="1443,1085.5625,1453,1089.5625,1443,1093.5625,1447,1089.5625" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1114" x2="1449" y1="1089.5625" y2="1089.5625"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="143" x="1121" y="1052.0029">ユーザーレコードを登録</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="53" x="1121" y="1068.3545">UserUuid</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="80" x="1121" y="1084.7061">ProtectSecret</text><polygon fill="#A80036" points="436,1132.2656,426,1136.2656,436,1140.2656,432,1136.2656" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="430" x2="1113" y1="1136.2656" y2="1136.2656"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="60" x="442" y="1115.0576">JSON応答</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="222" x="442" y="1131.4092">Secret,UserUuid,JumpConsistentSeed</text><polygon fill="#A80036" points="1036,1162.6172,1046,1166.6172,1036,1170.6172,1040,1166.6172" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="1042" y1="1166.6172" y2="1166.6172"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="182" x="432" y="1161.7607">ユーザーデータを生成し永続化</text><polygon fill="#A80036" points="126,1192.9688,116,1196.9688,126,1200.9688,122,1196.9688" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="1196.9688" y2="1196.9688"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="156" x="132" y="1192.1123">プライバシーポリシー表示</text><path d="M393,1209.9688 L393,1235.9688 L453,1235.9688 L453,1219.9688 L443,1209.9688 L393,1209.9688 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M443,1209.9688 L443,1219.9688 L453,1219.9688 L443,1209.9688 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="39" x="399" y="1228.4639">うーん</text><polygon fill="#A80036" points="413,1263.6719,423,1267.6719,413,1271.6719,417,1267.6719" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="1267.6719" y2="1267.6719"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="91" x="122" y="1262.8154">次へボタン押下</text><polygon fill="#A80036" points="126,1294.0234,116,1298.0234,126,1302.0234,122,1298.0234" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="1298.0234" y2="1298.0234"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="124" x="132" y="1293.167">チュートリアル4表示</text><path d="M68,1313.0234 L197,1313.0234 L197,1321.0234 L187,1331.0234 L68,1331.0234 L68,1313.0234 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="79.0547" style="stroke: #000000; stroke-width: 2.0;" width="1009" x="68" y="1313.0234"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="84" x="83" y="1327.5186">非同意ルート</text><polygon fill="#A80036" points="413,1349.7266,423,1353.7266,413,1357.7266,417,1353.7266" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="1353.7266" y2="1353.7266"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="39" x="122" y="1348.8701">非同意</text><polygon fill="#A80036" points="1036,1380.0781,1046,1384.0781,1036,1388.0781,1040,1384.0781" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="1042" y1="1384.0781" y2="1384.0781"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="299" x="432" y="1379.2217">接触通知は無効とユーザーデータに書き込んで保存</text><path d="M38,1406.0781 L153,1406.0781 L153,1414.0781 L143,1424.0781 L38,1424.0781 L38,1406.0781 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="1109.0078" style="stroke: #000000; stroke-width: 2.0;" width="1194" x="38" y="1406.0781"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="70" x="53" y="1420.5732">同意ルート</text><polygon fill="#A80036" points="413,1442.7813,423,1446.7813,413,1450.7813,417,1446.7813" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="1446.7813" y2="1446.7813"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="26" x="122" y="1441.9248">同意</text><path d="M48,1461.7813 L116,1461.7813 L116,1469.7813 L106,1479.7813 L48,1479.7813 L48,1461.7813 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="851.1953" style="stroke: #000000; stroke-width: 2.0;" width="1174" x="48" y="1461.7813"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="23" x="63" y="1476.2764">iOS</text><polygon fill="#A80036" points="126,1498.4844,116,1502.4844,126,1506.4844,122,1502.4844" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="120" x2="424" y1="1502.4844" y2="1502.4844"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="97" x="132" y="1497.6279">Loading画面表示</text><polygon fill="#A80036" points="729,1545.1875,739,1549.1875,729,1553.1875,733,1549.1875" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="735" y1="1549.1875" y2="1549.1875"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="65" x="432" y="1527.9795">StartAsync</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="112" x="432" y="1544.3311">接触確認APIを開始</text><polygon fill="#A80036" points="1036,1575.5391,1046,1579.5391,1036,1583.5391,1040,1579.5391" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="1042" y1="1579.5391" y2="1579.5391"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="283" x="748" y="1574.6826">iOS: SetExposureNotificationEnabledAsync(true)</text><path d="M884,1592.5391 L884,1634.5391 L1208,1634.5391 L1208,1602.5391 L1198,1592.5391 L884,1592.5391 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1198,1592.5391 L1198,1602.5391 L1208,1602.5391 L1198,1592.5391 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="303" x="890" y="1611.0342">TEKから10~20分ごとにRPIを生成してアドバタイズ</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="175" x="890" y="1627.3857">OS側でずっと広告処理を行う</text><path d="M58,1651.2422 L138,1651.2422 L138,1659.2422 L128,1669.2422 L58,1669.2422 L58,1651.2422 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="654.7344" style="stroke: #000000; stroke-width: 2.0;" width="1029" x="58" y="1651.2422"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="35" x="73" y="1665.7373">while</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="467" y1="1691.9453" y2="1691.9453"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="467" x2="467" y1="1691.9453" y2="1704.9453"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="426" x2="467" y1="1704.9453" y2="1704.9453"/><polygon fill="#A80036" points="436,1700.9453,426,1704.9453,436,1708.9453,432,1704.9453" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="46" x="432" y="1687.0889">1秒待機</text><polygon fill="#A80036" points="729,1747.6484,739,1751.6484,729,1755.6484,733,1751.6484" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="735" y1="1751.6484" y2="1751.6484"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="65" x="432" y="1730.4404">StartAsync</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="112" x="432" y="1746.792">接触確認APIを開始</text><polygon fill="#A80036" points="1036,1778,1046,1782,1036,1786,1040,1782" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="1042" y1="1782" y2="1782"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="283" x="748" y="1777.1436">iOS: SetExposureNotificationEnabledAsync(true)</text><path d="M337,1795 L337,1821 L508,1821 L508,1805 L498,1795 L337,1795 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M498,1795 L498,1805 L508,1805 L498,1795 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="150" x="343" y="1813.4951">重要なことなので2度(略</text><polygon fill="#A80036" points="729,1865.0547,739,1869.0547,729,1873.0547,733,1869.0547" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="735" y1="1869.0547" y2="1869.0547"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="96" x="432" y="1847.8467">GetStatusAsync</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="52" x="432" y="1864.1982">状態取得</text><polygon fill="#A80036" points="1036,1895.4063,1046,1899.4063,1036,1903.4063,1040,1899.4063" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="1042" y1="1899.4063" y2="1899.4063"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="187" x="748" y="1894.5498">iOS: ExposureNotificationStatus</text><polygon fill="#A80036" points="752,1942.1094,742,1946.1094,752,1950.1094,748,1946.1094" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="746" x2="1047" y1="1946.1094" y2="1946.1094"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="38" x="758" y="1924.9014">Status</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="267" x="758" y="1941.2529">enum: Active,BluetoothOff,Disabled,Restricted</text><polygon fill="#A80036" points="436,1972.4609,426,1976.4609,436,1980.4609,432,1976.4609" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="430" x2="740" y1="1976.4609" y2="1976.4609"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="38" x="442" y="1971.6045">Status</text><path d="M385,1991.4609 L532,1991.4609 L532,1999.4609 L522,2009.4609 L385,2009.4609 L385,1991.4609 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="48.7031" style="stroke: #000000; stroke-width: 2.0;" width="692" x="385" y="1991.4609"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="102" x="400" y="2005.9561">Status == Active</text><polygon fill="#A80036" points="1036,2028.1641,1046,2032.1641,1036,2036.1641,1040,2032.1641" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="1042" y1="2032.1641" y2="2032.1641"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="299" x="432" y="2027.3076">接触通知は有効とユーザーデータに書き込んで保存</text><path d="M68,2054.1641 L255,2054.1641 L255,2062.1641 L245,2072.1641 L68,2072.1641 L68,2054.1641 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="92.0547" style="stroke: #000000; stroke-width: 2.0;" width="454" x="68" y="2054.1641"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="142" x="83" y="2068.6592">Status == BluetoothOff</text><polygon fill="#A80036" points="126,2090.8672,116,2094.8672,126,2098.8672,122,2094.8672" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="2094.8672" y2="2094.8672"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="120" x="132" y="2090.0107">Bluetoothオフやで?</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="467" y1="2125.2188" y2="2125.2188"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="467" x2="467" y1="2125.2188" y2="2138.2188"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="426" x2="467" y1="2138.2188" y2="2138.2188"/><polygon fill="#A80036" points="436,2134.2188,426,2138.2188,436,2142.2188,432,2138.2188" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="78" x="432" y="2120.3623">同意前に戻る</text><path d="M68,2160.2188 L302,2160.2188 L302,2168.2188 L292,2178.2188 L68,2178.2188 L68,2160.2188 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="138.7578" style="stroke: #000000; stroke-width: 2.0;" width="467" x="68" y="2160.2188"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="189" x="83" y="2174.7139">2回リトライしてダメだったら</text><polygon fill="#A80036" points="126,2213.2734,116,2217.2734,126,2221.2734,122,2217.2734" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="2217.2734" y2="2217.2734"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="266" x="132" y="2196.0654">Exposure Notificationを起動できませんでした</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="223" x="132" y="2212.417">Oh! i18nされないハードコーディング!!</text><polygon fill="#A80036" points="413,2243.625,423,2247.625,413,2251.625,417,2247.625" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="2247.625" y2="2247.625"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="19" x="122" y="2242.7686">OK</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="467" y1="2277.9766" y2="2277.9766"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="467" x2="467" y1="2277.9766" y2="2290.9766"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="426" x2="467" y1="2290.9766" y2="2290.9766"/><polygon fill="#A80036" points="436,2286.9766,426,2290.9766,436,2294.9766,432,2290.9766" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="91" x="432" y="2273.1201">アプリを落とす</text><path d="M284,2326.9766 L379,2326.9766 L379,2334.9766 L369,2344.9766 L284,2344.9766 L284,2326.9766 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="181.1094" style="stroke: #000000; stroke-width: 2.0;" width="803" x="284" y="2326.9766"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="50" x="299" y="2341.4717">Android</text><path d="M294,2350.3281 L294,2392.3281 L552,2392.3281 L552,2360.3281 L542,2350.3281 L294,2350.3281 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M542,2350.3281 L542,2360.3281 L552,2360.3281 L542,2350.3281 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="113" x="300" y="2368.8232">ほぼiOSと同等だが</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="237" x="300" y="2385.1748">Bluetoothオフの場合に同意前に戻らない</text><path d="M385,2409.0313 L619,2409.0313 L619,2417.0313 L609,2427.0313 L385,2427.0313 L385,2409.0313 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="92.0547" style="stroke: #000000; stroke-width: 2.0;" width="692" x="385" y="2409.0313"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="189" x="400" y="2423.5264">2回リトライしてダメだったら</text><polygon fill="#A80036" points="1036,2445.7344,1046,2449.7344,1036,2453.7344,1040,2449.7344" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="1042" y1="2449.7344" y2="2449.7344"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="299" x="432" y="2444.8779">接触通知は無効とユーザーデータに書き込んで保存</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="467" y1="2480.0859" y2="2480.0859"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="467" x2="467" y1="2480.0859" y2="2493.0859"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="426" x2="467" y1="2493.0859" y2="2493.0859"/><polygon fill="#A80036" points="436,2489.0859,426,2493.0859,436,2497.0859,432,2493.0859" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="254" x="432" y="2475.2295">アプリは落とさずにチュートリアル5に進む</text><polygon fill="#A80036" points="126,2540.4375,116,2544.4375,126,2548.4375,122,2544.4375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="2544.4375" y2="2544.4375"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="124" x="132" y="2539.5811">チュートリアル5表示</text><polygon fill="#A80036" points="413,2587.1406,423,2591.1406,413,2595.1406,417,2591.1406" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="2591.1406" y2="2591.1406"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="147" x="122" y="2569.9326">通知(あり/なし)を選択</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="161" x="122" y="2586.2842">IsNotificationEnabled = bool</text><polygon fill="#A80036" points="1036,2617.4922,1046,2621.4922,1036,2625.4922,1040,2621.4922" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="1042" y1="2621.4922" y2="2621.4922"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="195" x="432" y="2616.6357">通知有無をユーザーデータに保存</text><polygon fill="#A80036" points="126,2647.8438,116,2651.8438,126,2655.8438,122,2651.8438" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="2651.8438" y2="2651.8438"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="124" x="132" y="2646.9873">チュートリアル6表示</text><polygon fill="#A80036" points="413,2678.1953,423,2682.1953,413,2686.1953,417,2682.1953" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="2682.1953" y2="2682.1953"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="199" x="122" y="2677.3389">ホーム/ヘルプページの表示を選択</text><rect fill="#EEEEEE" filter="url(#f1lc1h5im1m9ig)" height="3" style="stroke: #EEEEEE; stroke-width: 1.0;" width="1475.5" x="3" y="2711.3711"/><line style="stroke: #000000; stroke-width: 1.0;" x1="3" x2="1478.5" y1="2711.3711" y2="2711.3711"/><line style="stroke: #000000; stroke-width: 1.0;" x1="3" x2="1478.5" y1="2714.3711" y2="2714.3711"/><rect fill="#EEEEEE" filter="url(#f1lc1h5im1m9ig)" height="24.3516" style="stroke: #000000; stroke-width: 2.0;" width="189" x="646.25" y="2700.1953"/><line style="stroke: #000000; stroke-width: 1.0;" x1="652.25" x2="652.25" y1="2712.3711" y2="2712.3711"/><line style="stroke: #000000; stroke-width: 1.0;" x1="652.25" x2="652.25" y1="2714.3711" y2="2714.3711"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="167" x="656.25" y="2717.1904">バックグラウンド処理 iOS</text><line style="stroke: #000000; stroke-width: 1.0;" x1="827.25" x2="827.25" y1="2712.3711" y2="2712.3711"/><line style="stroke: #000000; stroke-width: 1.0;" x1="827.25" x2="827.25" y1="2714.3711" y2="2714.3711"/><polygon fill="#A80036" points="729,2752.8984,739,2756.8984,729,2760.8984,733,2756.8984" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="735" y1="2756.8984" y2="2756.8984"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="17" x="432" y="2752.042">Init</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="783" y1="2787.25" y2="2787.25"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="783" x2="783" y1="2787.25" y2="2800.25"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="742" x2="783" y1="2800.25" y2="2800.25"/><polygon fill="#A80036" points="752,2796.25,742,2800.25,752,2804.25,748,2800.25" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="124" x="748" y="2782.3936">ScheduleFetchAsync</text><polygon fill="#A80036" points="1036,2859.3047,1046,2863.3047,1036,2867.3047,1040,2863.3047" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="1042" y1="2863.3047" y2="2863.3047"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="202" x="748" y="2825.7451">BGTaskScheduler.Shared.Register</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="104" x="748" y="2842.0967">コールバック登録</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="137" x="748" y="2858.4482">UpdateKeysFromServer</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="783" y1="2893.6563" y2="2893.6563"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="783" x2="783" y1="2893.6563" y2="2906.6563"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="742" x2="783" y1="2906.6563" y2="2906.6563"/><polygon fill="#A80036" points="752,2902.6563,742,2906.6563,752,2910.6563,748,2906.6563" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="96" x="748" y="2888.7998">scheduleBgTask</text><polygon fill="#A80036" points="1036,2933.0078,1046,2937.0078,1036,2941.0078,1040,2937.0078" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="1042" y1="2937.0078" y2="2937.0078"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="212" x="748" y="2932.1514">ENManager.AuthorizationStatus取得</text><polygon fill="#A80036" points="752,2963.3594,742,2967.3594,752,2971.3594,748,2967.3594" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="746" x2="1047" y1="2967.3594" y2="2967.3594"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="132" x="758" y="2962.5029">ENAuthorizationStatus</text><path d="M527,2980.3594 L527,3022.3594 L951,3022.3594 L951,2990.3594 L941,2980.3594 L527,2980.3594 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M941,2980.3594 L941,2990.3594 L951,2990.3594 L941,2980.3594 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="403" x="533" y="2998.8545">ENManager.AuthorizationStatus != ENAuthorizationStatus.Authorized</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="59" x="533" y="3015.2061">ならreturn</text><polygon fill="#A80036" points="1036,3050.4141,1046,3054.4141,1036,3058.4141,1040,3054.4141" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="1042" y1="3054.4141" y2="3054.4141"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="195" x="748" y="3049.5576">BGTaskScheduler.Shared.Submit</text><path d="M951,3067.4141 L951,3093.4141 L1141,3093.4141 L1141,3077.4141 L1131,3067.4141 L951,3067.4141 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1131,3067.4141 L1131,3077.4141 L1141,3077.4141 L1131,3067.4141 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="169" x="957" y="3085.9092">バックグラウンド処理を依頼</text><polygon fill="#A80036" points="752,3165.4688,742,3169.4688,752,3173.4688,748,3169.4688" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="746" x2="1047" y1="3169.4688" y2="3169.4688"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="137" x="758" y="3148.2607">UpdateKeysFromServer</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="195" x="758" y="3164.6123">サーバーのキー情報を更新しよう</text><polygon fill="#A80036" points="436,3212.1719,426,3216.1719,436,3220.1719,432,3216.1719" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="430" x2="740" y1="3216.1719" y2="3216.1719"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="276" x="442" y="3194.9639">FetchExposureKeyBatchFilesFromServerAsync</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="208" x="442" y="3211.3154">サーバーからキー情報の回収よろー</text><path d="M58,3231.1719 L408,3231.1719 L408,3239.1719 L398,3249.1719 L58,3249.1719 L58,3231.1719 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="1301.5234" style="stroke: #000000; stroke-width: 2.0;" width="1123" x="58" y="3231.1719"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="305" x="73" y="3245.667">foreach (var serverRegion in SupportedRegions)</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="467" y1="3271.875" y2="3271.875"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="467" x2="467" y1="3271.875" y2="3284.875"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="426" x2="467" y1="3284.875" y2="3284.875"/><polygon fill="#A80036" points="436,3280.875,426,3284.875,436,3288.875,432,3284.875" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="127" x="432" y="3267.0186">DownloadBatchAsync</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="467" y1="3315.2266" y2="3315.2266"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="467" x2="467" y1="3315.2266" y2="3328.2266"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="426" x2="467" y1="3328.2266" y2="3328.2266"/><polygon fill="#A80036" points="436,3324.2266,426,3328.2266,436,3332.2266,432,3328.2266" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="181" x="432" y="3310.3701">GetTemporaryExposureKeyList</text><polygon fill="#A80036" points="1102,3370.9297,1112,3374.9297,1102,3378.9297,1106,3374.9297" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="1108" y1="3374.9297" y2="3374.9297"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="81" x="432" y="3353.7217">GetCdnAsync</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="191" x="432" y="3370.0732">GET /{container}/{region}/list.json</text><polygon fill="#A80036" points="436,3417.6328,426,3421.6328,436,3425.6328,432,3421.6328" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="430" x2="1113" y1="3421.6328" y2="3421.6328"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="60" x="442" y="3400.4248">JSON応答</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="42" x="442" y="3416.7764">TekList</text><path d="M375,3436.6328 L580,3436.6328 L580,3444.6328 L570,3454.6328 L375,3454.6328 L375,3436.6328 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="251.5156" style="stroke: #000000; stroke-width: 2.0;" width="796" x="375" y="3436.6328"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="160" x="390" y="3451.1279">foreach tekItem in tekList</text><polygon fill="#A80036" points="1036,3473.3359,1046,3477.3359,1036,3481.3359,1040,3477.3359" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="1042" y1="3477.3359" y2="3477.3359"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="184" x="432" y="3472.4795">LastProcessTekTimestamp取得</text><polygon fill="#A80036" points="436,3503.6875,426,3507.6875,436,3511.6875,432,3507.6875" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="430" x2="1047" y1="3507.6875" y2="3507.6875"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="158" x="442" y="3502.8311">LastProcessTekTimestamp</text><path d="M385,3522.6875 L743,3522.6875 L743,3530.6875 L733,3540.6875 L385,3540.6875 L385,3522.6875 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="128.1094" style="stroke: #000000; stroke-width: 2.0;" width="776" x="385" y="3522.6875"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="313" x="400" y="3537.1826">LastProcessTekTimestampより新しいtekだったら</text><polygon fill="#A80036" points="1102,3592.0938,1112,3596.0938,1102,3600.0938,1106,3596.0938" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="1108" y1="3596.0938" y2="3596.0938"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="160" x="432" y="3558.5342">GetTemporaryExposureKey</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="123" x="432" y="3574.8857">GetCdnStreamAsync</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="101" x="432" y="3591.2373">GET {tekItem.Url}</text><polygon fill="#A80036" points="436,3638.7969,426,3642.7969,436,3646.7969,432,3642.7969" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="430" x2="1113" y1="3642.7969" y2="3642.7969"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="181" x="442" y="3621.5889">uuid生成および名前{uuid}.zipで</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="78" x="442" y="3637.9404">ファイル保存</text><polygon fill="#A80036" points="1036,3676.1484,1046,3680.1484,1036,3684.1484,1040,3680.1484" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="1042" y1="3680.1484" y2="3680.1484"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="184" x="432" y="3675.292">LastProcessTekTimestamp更新</text><polygon fill="#A80036" points="729,3713.5,739,3717.5,729,3721.5,733,3717.5" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="735" y1="3717.5" y2="3717.5"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="87" x="432" y="3712.6436">submitBatches</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="783" y1="3747.8516" y2="3747.8516"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="783" x2="783" y1="3747.8516" y2="3760.8516"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="742" x2="783" y1="3760.8516" y2="3760.8516"/><polygon fill="#A80036" points="752,3756.8516,742,3760.8516,752,3764.8516,748,3760.8516" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="185" x="748" y="3742.9951">PlatformDetectExposuresAsync</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="783" y1="3791.2031" y2="3791.2031"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="783" x2="783" y1="3791.2031" y2="3804.2031"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="742" x2="783" y1="3804.2031" y2="3804.2031"/><polygon fill="#A80036" points="752,3800.2031,742,3804.2031,752,3808.2031,748,3804.2031" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="133" x="748" y="3786.3467">GetConfigurationAsync</text><path d="M617,3817.2031 L617,3843.2031 L860,3843.2031 L860,3827.2031 L850,3817.2031 L617,3817.2031 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M850,3817.2031 L850,3827.2031 L860,3827.2031 L850,3817.2031 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="222" x="623" y="3835.6982">zip展開 -&gt; .binファイルと.sigファイル</text><polygon fill="#A80036" points="1036,3870.9063,1046,3874.9063,1036,3878.9063,1040,3874.9063" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="1042" y1="3874.9063" y2="3874.9063"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="167" x="748" y="3870.0498">iOS: DetectExposuresAsync</text><path d="M954,3887.9063 L954,3913.9063 L1138,3913.9063 L1138,3897.9063 L1128,3887.9063 L954,3887.9063 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1128,3887.9063 L1128,3897.9063 L1138,3897.9063 L1128,3887.9063 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="163" x="960" y="3906.4014">TEKからRPIを生成して突合</text><path d="M947,3928.2578 L947,3954.2578 L1145,3954.2578 L1145,3938.2578 L1135,3928.2578 L947,3928.2578 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1135,3928.2578 L1135,3938.2578 L1145,3938.2578 L1135,3928.2578 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="177" x="953" y="3946.7529">RPIの一致があればサマリ生成</text><polygon fill="#A80036" points="752,4047.3672,742,4051.3672,752,4055.3672,748,4051.3672" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="746" x2="1047" y1="4051.3672" y2="4051.3672"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="113" x="758" y="3981.1045">detectionSummary:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="143" x="758" y="3997.4561">DaysSinceLastExposure</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="107" x="758" y="4013.8076">MatchedKeyCount</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="140" x="758" y="4030.1592">riskScoreSumFullRange</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="175" x="758" y="4046.5107">maximumRiskScoreFullRange</text><path d="M648,4064.3672 L648,4090.3672 L829,4090.3672 L829,4074.3672 L819,4064.3672 L648,4064.3672 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M819,4064.3672 L819,4074.3672 L829,4074.3672 L819,4064.3672 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="160" x="654" y="4082.8623">zip展開したファイルを削除</text><polygon fill="#A80036" points="436,4118.0703,426,4122.0703,436,4126.0703,432,4122.0703" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="430" x2="740" y1="4122.0703" y2="4122.0703"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="144" x="442" y="4117.2139">ExposureDetectedAsync</text><polygon fill="#A80036" points="729,4148.4219,739,4152.4219,729,4156.4219,733,4152.4219" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="735" y1="4152.4219" y2="4152.4219"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="142" x="432" y="4147.5654">getExposureInfo(GetInfo)</text><polygon fill="#A80036" points="1036,4178.7734,1046,4182.7734,1036,4186.7734,1040,4182.7734" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="1042" y1="4182.7734" y2="4182.7734"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="163" x="748" y="4177.917">iOS: GetExposureInfoAsync</text><polygon fill="#A80036" points="752,4274.5313,742,4278.5313,752,4282.5313,748,4278.5313" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="746" x2="1047" y1="4278.5313" y2="4278.5313"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="27" x="758" y="4208.2686">Date</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="143" x="758" y="4224.6201">totalRiskScoreFullRange</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="99" x="758" y="4240.9717">AttenuationValue</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="132" x="758" y="4257.3232">TransmissionRiskLevel</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="48" x="758" y="4273.6748">Duration</text><polygon fill="#A80036" points="436,4304.8828,426,4308.8828,436,4312.8828,432,4308.8828" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="430" x2="740" y1="4308.8828" y2="4308.8828"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="26" x="442" y="4304.0264">同上</text><polygon fill="#A80036" points="1036,4335.2344,1046,4339.2344,1036,4343.2344,1040,4339.2344" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="1042" y1="4339.2344" y2="4339.2344"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="385" x="432" y="4334.3779">ユーザーデータのExposureInformationにExposureSummaryを追加</text><path d="M68,4354.2344 L296,4354.2344 L296,4362.2344 L286,4372.2344 L68,4372.2344 L68,4354.2344 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="128.1094" style="stroke: #000000; stroke-width: 2.0;" width="397" x="68" y="4354.2344"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="183" x="83" y="4368.7295">IsNotificationEnabled == true</text><polygon fill="#A80036" points="126,4423.6406,116,4427.6406,126,4431.6406,122,4427.6406" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="4427.6406" y2="4427.6406"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="286" x="132" y="4390.0811">新型コロナウイルス陽性登録者との接触の可能性</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="195" x="132" y="4406.4326">新型コロナウイルス陽性登録者と</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="260" x="132" y="4422.7842">接触した可能性があります。詳細はこちら。</text><polygon fill="#A80036" points="413,4470.3438,423,4474.3438,413,4478.3438,417,4474.3438" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="4474.3438" y2="4474.3438"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="65" x="122" y="4453.1357">アプリ起動</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="169" x="122" y="4469.4873">バックグラウンド動作なので</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="467" y1="4511.6953" y2="4511.6953"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="467" x2="467" y1="4511.6953" y2="4524.6953"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="426" x2="467" y1="4524.6953" y2="4524.6953"/><polygon fill="#A80036" points="436,4520.6953,426,4524.6953,436,4528.6953,432,4524.6953" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="95" x="432" y="4506.8389">zipファイル削除</text><rect fill="#EEEEEE" filter="url(#f1lc1h5im1m9ig)" height="3" style="stroke: #EEEEEE; stroke-width: 1.0;" width="1475.5" x="3" y="4560.8711"/><line style="stroke: #000000; stroke-width: 1.0;" x1="3" x2="1478.5" y1="4560.8711" y2="4560.8711"/><line style="stroke: #000000; stroke-width: 1.0;" x1="3" x2="1478.5" y1="4563.8711" y2="4563.8711"/><rect fill="#EEEEEE" filter="url(#f1lc1h5im1m9ig)" height="24.3516" style="stroke: #000000; stroke-width: 2.0;" width="74" x="703.75" y="4549.6953"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="56" x="709.75" y="4567.1904">感染確認</text><polygon fill="#A80036" points="413,4602.3984,423,4606.3984,413,4610.3984,417,4606.3984" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="4606.3984" y2="4606.3984"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="234" x="122" y="4601.542">ホームページより感染確認ボタンを押下</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="467" y1="4653.1016" y2="4653.1016"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="467" x2="467" y1="4653.1016" y2="4666.1016"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="426" x2="467" y1="4666.1016" y2="4666.1016"/><polygon fill="#A80036" points="436,4662.1016,426,4666.1016,436,4670.1016,432,4666.1016" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="248" x="432" y="4631.8936">ユーザーデータのExposureInformationより</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="91" x="432" y="4648.2451">感染情報を確認</text><path d="M68,4681.1016 L253,4681.1016 L253,4689.1016 L243,4699.1016 L68,4699.1016 L68,4681.1016 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="48.7031" style="stroke: #000000; stroke-width: 2.0;" width="397" x="68" y="4681.1016"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="140" x="83" y="4695.5967">感染情報が存在しない</text><polygon fill="#A80036" points="126,4717.8047,116,4721.8047,126,4725.8047,122,4721.8047" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="4721.8047" y2="4721.8047"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="234" x="132" y="4716.9482">陽性者との接触は確認されませんでした</text><path d="M12,4743.8047 L183,4743.8047 L183,4751.8047 L173,4761.8047 L12,4761.8047 L12,4743.8047 " fill="#EEEEEE" style="stroke: #000000; stroke-width: 1.0;"/><rect fill="none" height="187.1641" style="stroke: #000000; stroke-width: 2.0;" width="825" x="12" y="4743.8047"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="126" x="27" y="4758.2998">感染情報が存在する</text><polygon fill="#A80036" points="126,4780.5078,116,4784.5078,126,4788.5078,122,4784.5078" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="4784.5078" y2="4784.5078"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="117" x="132" y="4779.6514">陽性者との接触確認</text><path d="M22,4797.5078 L22,4921.5078 L823,4921.5078 L823,4807.5078 L813,4797.5078 L22,4797.5078 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M813,4797.5078 L813,4807.5078 L823,4807.5078 L813,4797.5078 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="104" x="28" y="4816.0029">以下メッセージ?</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="117" x="28" y="4832.3545">陽性者との接触一覧</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="117" x="28" y="4848.7061">症状を入力して相談</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="143" x="28" y="4865.0576">電話で症状を伝えて相談</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="0" x="32" y="4881.4092"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="780" x="28" y="4897.7607">現在の症状などを、入力フォームまたはお電話にて、ご連絡ください。内容に応じて、帰国者・接触者外来等への受診を案内します。</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="598" x="28" y="4914.1123">受診の際などに必要となる場合があるため、本画面のスクリーンショットの保存をお願いいたします。</text><rect fill="#EEEEEE" filter="url(#f1lc1h5im1m9ig)" height="3" style="stroke: #EEEEEE; stroke-width: 1.0;" width="1475.5" x="3" y="4959.1445"/><line style="stroke: #000000; stroke-width: 1.0;" x1="3" x2="1478.5" y1="4959.1445" y2="4959.1445"/><line style="stroke: #000000; stroke-width: 1.0;" x1="3" x2="1478.5" y1="4962.1445" y2="4962.1445"/><rect fill="#EEEEEE" filter="url(#f1lc1h5im1m9ig)" height="24.3516" style="stroke: #000000; stroke-width: 2.0;" width="116" x="682.75" y="4947.9688"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="688.75" y="4965.4639">陽性情報の登録</text><polygon fill="#A80036" points="413,5000.6719,423,5004.6719,413,5008.6719,417,5004.6719" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="5004.6719" y2="5004.6719"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="273" x="122" y="4999.8154">ホームページより陽性情報の登録ボタンを押下</text><polygon fill="#A80036" points="126,5031.0234,116,5035.0234,126,5039.0234,122,5035.0234" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="5035.0234" y2="5035.0234"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="169" x="132" y="5030.167">陽性情報の登録ページを表示</text><path d="M58,5048.0234 L58,5139.0234 L787,5139.0234 L787,5058.0234 L777,5048.0234 L58,5048.0234 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M777,5048.0234 L777,5058.0234 L787,5058.0234 L777,5048.0234 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="104" x="64" y="5066.5186">以下メッセージ?</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="708" x="64" y="5082.8701">新型コロナウイルス感染症者等情報把握・管理支援システム(HER-SYS)から発行された処理番号を入力してください。</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="443" x="64" y="5099.2217">過去14日間に本アプリであなたと接触した履歴のある人に通知が行きます。</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="546" x="64" y="5115.5732">登録は匿名で行われ、氏名や連絡先など個人が特定される情報を登録する必要はありません。</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="416" x="64" y="5131.9248">また、接触した場所の位置情報が記録や通知されることもありません。</text><polygon fill="#A80036" points="413,5183.4844,423,5187.4844,413,5191.4844,417,5187.4844" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="5187.4844" y2="5187.4844"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="115" x="122" y="5166.2764">DiagnosisUidを入力</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="52" x="122" y="5182.6279">処理番号</text><polygon fill="#A80036" points="1036,5213.8359,1046,5217.8359,1036,5221.8359,1040,5217.8359" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="1042" y1="5217.8359" y2="5217.8359"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="336" x="432" y="5212.9795">ユーザーデータのPendingDiagnosisにDiagnosisUidを追加</text><polygon fill="#A80036" points="729,5244.1875,739,5248.1875,729,5252.1875,733,5248.1875" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="735" y1="5248.1875" y2="5248.1875"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="157" x="432" y="5243.3311">SubmitSelfDiagnosisAsync</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="783" y1="5294.8906" y2="5294.8906"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="783" x2="783" y1="5294.8906" y2="5307.8906"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="742" x2="783" y1="5307.8906" y2="5307.8906"/><polygon fill="#A80036" points="752,5303.8906,742,5307.8906,752,5311.8906,748,5307.8906" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="226" x="748" y="5273.6826">GetSelfTemporaryExposureKeysAsync</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="215" x="748" y="5290.0342">PlatformGetTemporaryExposureKeys</text><polygon fill="#A80036" points="1036,5334.2422,1046,5338.2422,1036,5342.2422,1040,5338.2422" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="741" x2="1042" y1="5338.2422" y2="5338.2422"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="175" x="748" y="5333.3857">iOS: GetDiagnosisKeysAsync</text><polygon fill="#A80036" points="752,5413.6484,742,5417.6484,752,5421.6484,748,5417.6484" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="746" x2="1047" y1="5417.6484" y2="5417.6484"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="33" x="758" y="5363.7373">TEK[]</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="50" x="758" y="5380.0889">KeyData</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="192" x="758" y="5396.4404">RollingStartNumber\RollingPeriod</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="132" x="758" y="5412.792">TransmissionRiskLevel</text><polygon fill="#A80036" points="436,5444,426,5448,436,5452,432,5448" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="430" x2="740" y1="5448" y2="5448"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="292" x="442" y="5443.1436">UploadSelfExposureKeysToServerAsync(selfKeys)</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="467" y1="5494.7031" y2="5494.7031"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="467" x2="467" y1="5494.7031" y2="5507.7031"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="426" x2="467" y1="5507.7031" y2="5507.7031"/><polygon fill="#A80036" points="436,5503.7031,426,5507.7031,436,5511.7031,432,5507.7031" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="213" x="432" y="5473.4951">DiagnosisUidとTEK[]を関連付けして</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="107" x="432" y="5489.8467">Submissionを作成</text><polygon fill="#A80036" points="1102,5566.7578,1112,5570.7578,1102,5574.7578,1106,5570.7578" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="425" x2="1108" y1="5570.7578" y2="5570.7578"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="164" x="432" y="5533.1982">PutSelfExposureKeysAsync</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="88" x="432" y="5549.5498">PUT /diagnosis</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="147" x="432" y="5565.9014">SelfDiagnosisSubmission</text><path d="M957,5583.7578 L957,5707.7578 L1267,5707.7578 L1267,5593.7578 L1257,5583.7578 L957,5583.7578 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1257,5583.7578 L1257,5593.7578 L1267,5593.7578 L1257,5583.7578 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="197" x="963" y="5602.2529">SubmissionNumber: DiagnosisUid</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="248" x="963" y="5618.6045">AppPackageName: AppInfo.PackageName</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="53" x="963" y="5634.9561">UserUuid</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="48" x="963" y="5651.3076">Platform</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="289" x="963" y="5667.6592">Regions: AppSettings.Instance.SupportedRegions</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="66" x="963" y="5684.0107">Keys: keys</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="195" x="963" y="5700.3623">VerificationPayload: DiagnosisUid</text><path d="M942,5722.2188 L942,5781.2188 L1282,5781.2188 L1282,5732.2188 L1272,5722.2188 L942,5722.2188 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1272,5722.2188 L1272,5732.2188 L1282,5732.2188 L1272,5722.2188 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="146" x="948" y="5740.7139">diagnosisの正しさを検証</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="233" x="948" y="5757.0654">UserUuidとAuthorizationヘッダーを検証</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="311" x="956" y="5773.417">AuthorizationヘッダーはUserUuidから生成されたもの</text><polygon fill="#A80036" points="1443,5808.625,1453,5812.625,1443,5816.625,1447,5812.625" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1114" x2="1449" y1="5812.625" y2="5812.625"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="155" x="1121" y="5807.7686">IDでユーザーを問い合わせ</text><polygon fill="#A80036" points="1125,5838.9766,1115,5842.9766,1125,5846.9766,1121,5842.9766" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="1119" x2="1454" y1="5842.9766" y2="5842.9766"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="78" x="1131" y="5838.1201">該当ユーザー</text><path d="M932,5855.9766 L932,5881.9766 L1291,5881.9766 L1291,5865.9766 L1281,5855.9766 L932,5855.9766 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1281,5855.9766 L1281,5865.9766 L1291,5865.9766 L1281,5855.9766 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="338" x="938" y="5874.4717">AuthorizationヘッダーとProtectSecretが等しいことを検証</text><polygon fill="#A80036" points="1443,5958.7344,1453,5962.7344,1443,5966.7344,1447,5962.7344" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1114" x2="1449" y1="5962.7344" y2="5962.7344"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="216" x="1121" y="5908.8232">Diagnosisテーブルにdiagnosisを追加</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="61" x="1121" y="5925.1748">timestamp</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="53" x="1121" y="5941.5264">UserUuid</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="28" x="1121" y="5957.8779">keys</text><polygon fill="#A80036" points="1125,5972.7344,1115,5976.7344,1125,5980.7344,1121,5976.7344" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="1119" x2="1454" y1="5976.7344" y2="5976.7344"/><polygon fill="#A80036" points="1443,6003.0859,1453,6007.0859,1443,6011.0859,1447,6007.0859" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1114" x2="1449" y1="6007.0859" y2="6007.0859"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="146" x="1121" y="6002.2295">Tekテーブルにkeyを追加</text><polygon fill="#A80036" points="1125,6017.0859,1115,6021.0859,1125,6025.0859,1121,6021.0859" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="1119" x2="1454" y1="6021.0859" y2="6021.0859"/><polygon fill="#A80036" points="436,6047.4375,426,6051.4375,436,6055.4375,432,6051.4375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="430" x2="1113" y1="6051.4375" y2="6051.4375"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="60" x="442" y="6046.5811">JSON応答</text><polygon fill="#A80036" points="126,6094.1406,116,6098.1406,126,6102.1406,122,6098.1406" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="6098.1406" y2="6098.1406"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="91" x="132" y="6076.9326">診断結果の提出</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="78" x="132" y="6093.2842">完了しました</text><polygon fill="#A80036" points="413,6124.4922,423,6128.4922,413,6132.4922,417,6128.4922" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="115" x2="419" y1="6128.4922" y2="6128.4922"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="19" x="122" y="6123.6357">OK</text><polygon fill="#A80036" points="126,6154.8438,116,6158.8438,126,6162.8438,122,6158.8438" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="120" x2="424" y1="6158.8438" y2="6158.8438"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="117" x="132" y="6153.9873">ホームページに戻る</text><rect fill="#EEEEEE" filter="url(#f1lc1h5im1m9ig)" height="3" style="stroke: #EEEEEE; stroke-width: 1.0;" width="1475.5" x="3" y="6188.0195"/><line style="stroke: #000000; stroke-width: 1.0;" x1="3" x2="1478.5" y1="6188.0195" y2="6188.0195"/><line style="stroke: #000000; stroke-width: 1.0;" x1="3" x2="1478.5" y1="6191.0195" y2="6191.0195"/><rect fill="#EEEEEE" filter="url(#f1lc1h5im1m9ig)" height="24.3516" style="stroke: #000000; stroke-width: 2.0;" width="100" x="690.75" y="6176.8438"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="82" x="696.75" y="6194.3389">バッチ - 追加</text><polygon fill="#A80036" points="1443,6229.5469,1453,6233.5469,1443,6237.5469,1447,6233.5469" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1114" x2="1449" y1="6233.5469" y2="6233.5469"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="317" x="1121" y="6228.6904">Tekテーブルから14日前までのTEKかつexport前を取得</text><polygon fill="#A80036" points="1125,6259.8984,1115,6263.8984,1125,6267.8984,1121,6263.8984" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="1119" x2="1454" y1="6263.8984" y2="6263.8984"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="33" x="1131" y="6259.042">TEK[]</text><path d="M912,6276.8984 L912,6596.8984 L1312,6596.8984 L1312,6286.8984 L1302,6276.8984 L912,6276.8984 " fill="#FBFB77" filter="url(#f1lc1h5im1m9ig)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1302,6276.8984 L1302,6286.8984 L1312,6286.8984 L1302,6276.8984 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="89" x="918" y="6295.3936">TEKをGroupBy</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="232" x="926" y="6311.7451">GetRollingStartUnixTimeSecondsおよび</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="148" x="926" y="6328.0967">GetRollingPeriodSeconds</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="112" x="918" y="6344.4482">Regionsごとに処理</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="129" x="918" y="6360.7998">TEKの順番を並べ替え</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="371" x="926" y="6377.1514">Security considerations: Random Order TemporaryExposureKey</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="56" x="918" y="6393.5029">zipの作成</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="94" x="926" y="6409.8545">binとsigのJSON</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="102" x="926" y="6426.2061">bin: TEKのリスト</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="30" x="934" y="6442.5576">Keys</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="61" x="934" y="6458.9092">BatchNum</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="60" x="934" y="6475.2607">BatchSize</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="40" x="934" y="6491.6123">Region</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="92" x="934" y="6507.9639">StartTimestamp</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="87" x="934" y="6524.3154">EndTimestamp</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="82" x="934" y="6540.667">SignatureInfos</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="78" x="926" y="6557.0186">sig: signature</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="56" x="934" y="6573.3701">binの署名</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="180" x="918" y="6589.7217">sigの実装がおそらく秘密情報?</text><polygon fill="#A80036" points="1443,6624.9297,1453,6628.9297,1443,6632.9297,1447,6628.9297" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1114" x2="1449" y1="6628.9297" y2="6628.9297"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="141" x="1121" y="6624.0732">TEKのExport情報を追加</text><rect fill="#EEEEEE" filter="url(#f1lc1h5im1m9ig)" height="3" style="stroke: #EEEEEE; stroke-width: 1.0;" width="1475.5" x="3" y="6658.1055"/><line style="stroke: #000000; stroke-width: 1.0;" x1="3" x2="1478.5" y1="6658.1055" y2="6658.1055"/><line style="stroke: #000000; stroke-width: 1.0;" x1="3" x2="1478.5" y1="6661.1055" y2="6661.1055"/><rect fill="#EEEEEE" filter="url(#f1lc1h5im1m9ig)" height="24.3516" style="stroke: #000000; stroke-width: 2.0;" width="100" x="690.75" y="6646.9297"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="82" x="696.75" y="6664.4248">バッチ - 削除</text><polygon fill="#A80036" points="1443,6699.6328,1453,6703.6328,1443,6707.6328,1447,6703.6328" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1114" x2="1449" y1="6703.6328" y2="6703.6328"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="150" x="1121" y="6698.7764">GetOutOfTimeKeysAsync</text><polygon fill="#A80036" points="1125,6729.9844,1115,6733.9844,1125,6737.9844,1121,6733.9844" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 2.0,2.0;" x1="1119" x2="1454" y1="6733.9844" y2="6733.9844"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="117" x="1131" y="6729.1279">14日前のTEKを応答</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="1114" x2="1156" y1="6764.3359" y2="6764.3359"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1156" x2="1156" y1="6764.3359" y2="6777.3359"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1115" x2="1156" y1="6777.3359" y2="6777.3359"/><polygon fill="#A80036" points="1125,6773.3359,1115,6777.3359,1125,6781.3359,1121,6777.3359" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="108" x="1121" y="6759.4795">zipファイルを削除</text><polygon fill="#A80036" points="1443,6820.0391,1453,6824.0391,1443,6828.0391,1447,6824.0391" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1114" x2="1449" y1="6824.0391" y2="6824.0391"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="141" x="1121" y="6802.8311">TEKのExport情報を更新</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="91" x="1121" y="6819.1826">削除済みとして</text><polygon fill="#A80036" points="1443,6850.3906,1453,6854.3906,1443,6858.3906,1447,6854.3906" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1114" x2="1449" y1="6854.3906" y2="6854.3906"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="180" x="1121" y="6849.5342">TEKリストから該当TEKを削除</text><!--MD5=[a3ab28e5f4767293ef4b922a903b1035]
@startuml
participant ユーザー as user
participant アプリ as app
participant 接触確認プラグイン as plugin
participant OS as os
participant サーバー as server
participant DB as db
==== 起動時 ====
user -> app: 起動
app -> plugin: Init
plugin -> plugin: ScheduleFetchAsync
plugin -> os
plugin <- - os
note over plugin: バックグラウンド処理開始\n後で説明
app -> server: AppCenter
app -> plugin: IsEnabledAsync
app <- - plugin: bool
app -> plugin: ScheduleFetchAsync
note over plugin
trueだったらスケジュール
なんで2度も?
end note
app -> app: ユーザーデータを確認
group ユーザーデータが存在しなければ
app -> app: チュートリアル開始
end
group ユーザーデータが存在すれば
app -> app: ホームページ表示
end
==== チュートリアル ====
user <- - app: チュートリアル1表示
user -> app: 次へボタン押下
user <- - app: チュートリアル2表示
user -> app: 次へボタン押下
user <- - app: チュートリアル3表示
user -> app: 次へボタン押下
app -> server: RegisterUserAsync\nPOST /register\ncontentは空
note over server
ユーザー登録
UserUuidを生成
UserUuidをseedに乱数文字列を生成: Secret
SecretをAES暗号化: ProtectSecret
end note
server -> db: ユーザーレコードを登録\nUserUuid\nProtectSecret
app <- - server: JSON応答\nSecret,UserUuid,JumpConsistentSeed
app -> os: ユーザーデータを生成し永続化
user <- - app: プライバシーポリシー表示
note over app
うーん
end note
user -> app: 次へボタン押下
user <- - app: チュートリアル4表示
group 非同意ルート
user -> app: 非同意
app -> os: 接触通知は無効とユーザーデータに書き込んで保存
end
group 同意ルート
user -> app: 同意
group iOS
user <- app : Loading画面表示
app -> plugin: StartAsync\n接触確認APIを開始
plugin -> os: iOS: SetExposureNotificationEnabledAsync(true)
note over os
TEKから10~20分ごとにRPIを生成してアドバタイズ
OS側でずっと広告処理を行う
end note
group while
app -> app: 1秒待機
app -> plugin: StartAsync\n接触確認APIを開始
plugin -> os: iOS: SetExposureNotificationEnabledAsync(true)
note over app: 重要なことなので2度(略
app -> plugin: GetStatusAsync\n状態取得
plugin -> os: iOS: ExposureNotificationStatus
plugin <- - os: Status\nenum: Active,BluetoothOff,Disabled,Restricted
app <- - plugin: Status
group Status == Active
app -> os: 接触通知は有効とユーザーデータに書き込んで保存
end
group Status == BluetoothOff
user <- - app: Bluetoothオフやで?
app -> app: 同意前に戻る
end
group 2回リトライしてダメだったら
user <- - app: Exposure Notificationを起動できませんでした\nOh! i18nされないハードコーディング!!
user -> app: OK
app -> app: アプリを落とす
end
end
end
group Android
note over app
ほぼiOSと同等だが
Bluetoothオフの場合に同意前に戻らない
end note
group 2回リトライしてダメだったら
app -> os: 接触通知は無効とユーザーデータに書き込んで保存
app -> app: アプリは落とさずにチュートリアル5に進む
end
end
end
user <- - app: チュートリアル5表示
user -> app: 通知(あり/なし)を選択\nIsNotificationEnabled = bool
app -> os: 通知有無をユーザーデータに保存
user <- - app: チュートリアル6表示
user -> app: ホーム/ヘルプページの表示を選択
==== バックグラウンド処理 iOS ====
app -> plugin: Init
plugin -> plugin: ScheduleFetchAsync
plugin -> os: BGTaskScheduler.Shared.Register\nコールバック登録\nUpdateKeysFromServer
plugin -> plugin: scheduleBgTask
plugin -> os: ENManager.AuthorizationStatus取得
plugin <- - os: ENAuthorizationStatus
note over plugin: ENManager.AuthorizationStatus != ENAuthorizationStatus.Authorized\nならreturn
plugin -> os: BGTaskScheduler.Shared.Submit
note over os: バックグラウンド処理を依頼
...
plugin <- os: UpdateKeysFromServer\nサーバーのキー情報を更新しよう
app <- plugin: FetchExposureKeyBatchFilesFromServerAsync\nサーバーからキー情報の回収よろー
group foreach (var serverRegion in SupportedRegions)
app -> app: DownloadBatchAsync
app -> app: GetTemporaryExposureKeyList
app -> server: GetCdnAsync\nGET /{container}/{region}/list.json
app <- - server: JSON応答\nTekList
group foreach tekItem in tekList
app -> os: LastProcessTekTimestamp取得
app <- - os: LastProcessTekTimestamp
group LastProcessTekTimestampより新しいtekだったら
app -> server: GetTemporaryExposureKey\nGetCdnStreamAsync\nGET {tekItem.Url}
app <- - server: uuid生成および名前{uuid}.zipで\nファイル保存
end
app -> os: LastProcessTekTimestamp更新
end
app -> plugin: submitBatches
plugin -> plugin: PlatformDetectExposuresAsync
plugin -> plugin: GetConfigurationAsync
note over plugin: zip展開 -> .binファイルと.sigファイル
plugin -> os: iOS: DetectExposuresAsync
note over os
TEKからRPIを生成して突合
end note
note over os
RPIの一致があればサマリ生成
end note
plugin <- - os: detectionSummary:\nDaysSinceLastExposure\nMatchedKeyCount\nriskScoreSumFullRange\nmaximumRiskScoreFullRange
note over plugin: zip展開したファイルを削除
app <- plugin: ExposureDetectedAsync
app -> plugin: getExposureInfo(GetInfo)
plugin -> os: iOS: GetExposureInfoAsync
plugin <- - os: Date\ntotalRiskScoreFullRange\nAttenuationValue\nTransmissionRiskLevel\nDuration
app <- - plugin: 同上
app -> os: ユーザーデータのExposureInformationにExposureSummaryを追加
group IsNotificationEnabled == true
user <- - app: 新型コロナウイルス陽性登録者との接触の可能性\n新型コロナウイルス陽性登録者と\n接触した可能性があります。詳細はこちら。
user -> app: アプリ起動\nバックグラウンド動作なので
end
app -> app: zipファイル削除
end
== 感染確認 ==
user -> app: ホームページより感染確認ボタンを押下
app -> app: ユーザーデータのExposureInformationより\n感染情報を確認
group 感染情報が存在しない
user <- - app: 陽性者との接触は確認されませんでした
end
group 感染情報が存在する
user <- - app: 陽性者との接触確認
note over app
以下メッセージ?
陽性者との接触一覧
症状を入力して相談
電話で症状を伝えて相談
現在の症状などを、入力フォームまたはお電話にて、ご連絡ください。内容に応じて、帰国者・接触者外来等への受診を案内します。
受診の際などに必要となる場合があるため、本画面のスクリーンショットの保存をお願いいたします。
end note
end
== 陽性情報の登録 ==
user -> app: ホームページより陽性情報の登録ボタンを押下
user <- - app: 陽性情報の登録ページを表示
note over app
以下メッセージ?
新型コロナウイルス感染症者等情報把握・管理支援システム(HER-SYS)から発行された処理番号を入力してください。
過去14日間に本アプリであなたと接触した履歴のある人に通知が行きます。
登録は匿名で行われ、氏名や連絡先など個人が特定される情報を登録する必要はありません。
また、接触した場所の位置情報が記録や通知されることもありません。
end note
user -> app: DiagnosisUidを入力\n処理番号
app -> os: ユーザーデータのPendingDiagnosisにDiagnosisUidを追加
app -> plugin: SubmitSelfDiagnosisAsync
plugin -> plugin: GetSelfTemporaryExposureKeysAsync\nPlatformGetTemporaryExposureKeys
plugin -> os: iOS: GetDiagnosisKeysAsync
plugin <- - os: TEK[]\nKeyData\nRollingStartNumber\RollingPeriod\nTransmissionRiskLevel
app <- plugin: UploadSelfExposureKeysToServerAsync(selfKeys)
app -> app: DiagnosisUidとTEK[]を関連付けして\nSubmissionを作成
app -> server: PutSelfExposureKeysAsync\nPUT /diagnosis\nSelfDiagnosisSubmission
note over server
SubmissionNumber: DiagnosisUid
AppPackageName: AppInfo.PackageName
UserUuid
Platform
Regions: AppSettings.Instance.SupportedRegions
Keys: keys
VerificationPayload: DiagnosisUid
end note
note over server
diagnosisの正しさを検証
UserUuidとAuthorizationヘッダーを検証
AuthorizationヘッダーはUserUuidから生成されたもの
end note
server -> db: IDでユーザーを問い合わせ
server <- - db: 該当ユーザー
note over server
AuthorizationヘッダーとProtectSecretが等しいことを検証
end note
server -> db: Diagnosisテーブルにdiagnosisを追加\ntimestamp\nUserUuid\nkeys
server <- - db
server -> db: Tekテーブルにkeyを追加
server <- - db
app <- - server: JSON応答
user <- - app: 診断結果の提出\n完了しました
user -> app: OK
user <- - app: ホームページに戻る
== バッチ - 追加 ==
server -> db: Tekテーブルから14日前までのTEKかつexport前を取得
server <- - db: TEK[]
note over server
TEKをGroupBy
GetRollingStartUnixTimeSecondsおよび
GetRollingPeriodSeconds
Regionsごとに処理
TEKの順番を並べ替え
Security considerations: Random Order TemporaryExposureKey
zipの作成
binとsigのJSON
bin: TEKのリスト
Keys
BatchNum
BatchSize
Region
StartTimestamp
EndTimestamp
SignatureInfos
sig: signature
binの署名
sigの実装がおそらく秘密情報?
end note
server -> db: TEKのExport情報を追加
== バッチ - 削除 ==
server -> db: GetOutOfTimeKeysAsync
server <- - db: 14日前のTEKを応答
server -> server: zipファイルを削除
server -> db: TEKのExport情報を更新\n削除済みとして
server -> db: TEKリストから該当TEKを削除
@enduml
PlantUML version 1.2020.10(Sun May 17 18:35:57 JST 2020)
(GPL source distribution)
Java Runtime: Java(TM) SE Runtime Environment
JVM: Java HotSpot(TM) Client VM
Java Version: 1.8.0_231-b11
Operating System: Windows 10
Default Encoding: MS932
Language: ja
Country: JP
--></g></svg>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment