翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
CSV ファイルからユーザープールにユーザーをインポートする
外部 ID ストアがあり、新しいローカルユーザーのためにユーザープールを準備する時間がある場合、カンマ区切り値 (CSV) ファイルからの一括ユーザーインポートは、Amazon Cognito ユーザープールへの移行のための低労力で低コストのオプションになります。CSV ファイルインポートは、テンプレートファイルをダウンロードして入力し、インポートジョブのユーザープールにファイルを渡すプロセスです。CSV インポートを使用して、テストユーザーをすばやく作成できます。また、外部 ID ストアへの読み取りAPIリクエストをプログラムでファイルに入力し、その詳細と属性をファイルへの書き込みオペレーションに解析することもできます。
インポートプロセスは、[パスワード] 以外のすべてのユーザー属性の値を設定します。セキュリティのベストプラクティスでは、パスワードはプレーンテキスト形式として使用できない必要があり、ハッシュのインポートはサポートされていないため、パスワードのインポートはサポートされません。つまり、ユーザーは最初にサインインした際にパスワードを変更する必要があります。このメソッドを使用してインポートすると、ユーザーは RESET_REQUIRED
状態になります。
ユーザーのパスワードは、 を使用して設定できます。 AdminSetUserPassword API リクエストは、 Permanent
パラメータを に設定しますtrue
。CSV インポートは、ユーザープール内の請求された毎月のアクティブユーザー (MAUs) には影響しません。ただし、パスワードリセットオペレーションは を生成しますMAUs。すぐにアクティブでない可能性のある多数のユーザーをインポートする際のコストを管理するには、ユーザーがサインインしてRESET_REQUIRED
チャレンジを受け取ったときに新しいパスワードの入力を求めるようにアプリケーションを設定します。
注記
各ユーザーの作成日は、ユーザーがユーザープールにインポートされた時間です。作成日は、インポートされた属性の 1 つではありません。
ユーザーインポートジョブを作成する手順
-
AWS Identity and Access Management (IAM) コンソールで Amazon CloudWatch Logs ロールを作成します。
-
ユーザーインポート .csv ファイルを作成します。
-
ユーザーインポートジョブを作成し、実行します。
-
ユーザーインポート .csv ファイルをアップロードします。
-
ユーザーインポートジョブを起動し、実行します。
-
CloudWatch を使用してイベントログを確認します。
-
インポートされたユーザーがパスワードをリセットするように要求します。
その他のリソース
-
ユーザープール間でユーザーアカウントをエクスポートするための Cognito User Profiles Export Reference Architecture
トピック
CloudWatch Logs IAMロールの作成
Amazon Cognito CLIまたは を使用している場合はAPI、ロールを作成 CloudWatch IAMする必要があります。次の手順では、Amazon Cognito がインポートジョブの結果を CloudWatch Logs に書き込むために使用できるIAMロールを作成する方法について説明します。
注記
Amazon Cognito コンソールでインポートジョブを作成すると、IAMロールを同時に作成できます。新しいIAMロール を作成することを選択すると、Amazon Cognito はロールに適切な信頼ポリシーとIAMポリシーを自動的に適用します。
ユーザープールインポートの CloudWatch Logs IAMロールを作成するには (AWS CLI、API)
にサインイン AWS Management Console し、 でIAMコンソールを開きますhttps://console.aws.amazon.com/iam/
。 -
の新しいIAMロールを作成します AWS のサービス。詳しい手順については、AWS Identity and Access Management ユーザーガイドの「 AWS のサービスにアクセス許可を委任するロールの作成」を参照してください。
-
信頼されたエンティティタイプのユースケースを選択するときは、任意のサービスを選択してください。Amazon Cognito は現在、サービスのユースケースに記載されていません。
-
[Add permissions] (アクセス許可の追加) 画面で、[Create policy] (ポリシーの作成) を選択し、次のポリシーステートメントを挿入します。置換
REGION
例えば、 ユーザープール AWS リージョン の を使用しますus-east-1
。置換ACCOUNT
例えば、 など、 の AWS アカウント ID を使用します111122223333
。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:
REGION
:ACCOUNT
:log-group:/aws/cognito/*" ] } ] }
-
-
ロールを作成したときに Amazon Cognito を信頼されたエンティティとして選択しなかったため、ロールの信頼関係を手動で編集する必要があります。IAM コンソールのナビゲーションペインからロールを選択し、作成した新しいロールを選択します。
-
[信頼関係] タブを選択します。
-
[信頼ポリシーを編集] を選択します。
-
次のポリシーステートメントを [Edit trust policy] (信頼ポリシーを編集) に貼り付け、既存のテキストを置き換えます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cognito-idp.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
-
[ポリシーの更新] を選択します。
-
ロールを書き留めますARN。インポートジョブを作成するARNときに を指定します。
ユーザーインポートCSVファイルの作成
既存のユーザーをユーザープールにインポートする前に、インポートするユーザーとその属性を含むカンマ区切りの値 (CSV) ファイルを作成する必要があります。ユーザープールから、ユーザープールの属性スキーマを反映するヘッダーを含むユーザーインポートファイルを取得できます。その後、CSV ファイルのフォーマット のフォーマット要件に一致するユーザー情報を挿入できます。
CSV ファイルヘッダーのダウンロード (コンソール)
CSV ヘッダーファイルをダウンロードするには、次の手順に従います。
CSV ファイルヘッダーをダウンロードするには
-
Amazon Cognito コンソール
に移動します。 AWS 認証情報の入力を求められる場合があります。 -
[User Pools] (ユーザープール) を選択します。
-
リストから存在するユーザープールを 1 つ選択します。
-
[ユーザー] タブを選択します。
-
[Import users] (ユーザーのインポート) セクションで、[Create an import job] (インポートジョブの作成) を選択します。
-
「アップロードCSV」で、 template.csv リンクを選択し、 CSV ファイルをダウンロードします。
CSV ファイルヘッダーのダウンロード (AWS CLI)
正しいヘッダーのリストを取得するには、次のCLIコマンドを実行します。USER_POOL_ID
は、ユーザーをインポートするユーザープールのユーザープール識別子です。
aws cognito-idp get-csv-header --user-pool-id "
USER_POOL_ID
"
レスポンス例:
{ "CSVHeader": [ "name", "given_name", "family_name", "middle_name", "nickname", "preferred_username", "profile", "picture", "website", "email", "email_verified", "gender", "birthdate", "zoneinfo", "locale", "phone_number", "phone_number_verified", "address", "updated_at", "cognito:mfa_enabled", "cognito:username" ], "UserPoolId": "
USER_POOL_ID
" }
CSV ファイルのフォーマット
ダウンロードしたユーザーインポートCSVヘッダーファイルは、次の文字列のようになります。ユーザープールに追加したカスタム属性も含まれます。
cognito:username,name,given_name,family_name,middle_name,nickname,preferred_username,profile,picture,website,email,email_verified,gender,birthdate,zoneinfo,locale,phone_number,phone_number_verified,address,updated_at,cognito:mfa_enabled
CSV ファイルを編集して、このヘッダーとユーザーの属性値が含まれ、次のルールに従ってフォーマットされるようにします。
注記
電話番号の適切な形式など属性値の詳細については、「ユーザー属性の操作」を参照してください。
-
ファイルの最初の行はユーザー属性の名前を含む、ダウンロードされたヘッダーの行です。
-
CSV ファイル内の列の順序は関係ありません。
-
最初の行の後の各行に、ユーザーの属性値が含まれます。
-
ヘッダーのすべての列が存在している必要がありますが、列の値を指定する必要はありません。
-
以下の属性は必須です:
-
cognito:username
-
cognito:mfa_enabled
-
[email_verified] または [phone_number_verified]
-
自動確認された属性の少なくとも一つは、各ユーザーに対して
true
である必要があります。自動検証属性は、新しいユーザーがユーザープールに参加したときに Amazon Cognito が自動的にコードを送信する E メールアドレスまたは電話番号です。 -
ユーザープールは [email_verified] または [phone_number_verified] の少なくとも一つの自動確認された属性が必要です。ユーザープールに自動確認された属性が存在しない場合は、インポートジョブは開始されません。
-
ユーザープールに一つの自動確認された属性がある場合のみ、その属性はユーザーごとに確認する必要があります。たとえば、ユーザープールに自動確認された属性として [phone_number] だけがある場合、[phone_number_verified] 値はそれぞれのユーザーに対して
true
である必要があります。
注記
ユーザーがパスワードをリセットするには、検証済みの E メールまたは電話番号が必要です。Amazon Cognito は、リセットパスワードコードを含むメッセージを、CSVファイルで指定された E メールまたは電話番号に送信します。メッセージが電話番号に送信された場合、SMSメッセージで送信されます。詳細については、「サインアップ時に連絡先情報を検証する」を参照してください。
-
-
[email] ([email_verified] が
true
の場合) -
[phone_number] ([phone_number] が
true
の場合) -
ユーザープールを作成する際に必須と指定した任意の属性
-
-
文字列である属性値には、引用符は使用できません。
-
属性値にカンマが含まれる場合、カンマの前にバックスラッシュ (\) を置く必要があります。これは、CSVファイルのフィールドがカンマで区切られているためです。
-
CSV ファイルの内容は、バイト順序マークなしで UTF-8 形式である必要があります。
-
[cognito:username] フィールドは必須であり、ユーザープール内で一意である必要があります。任意の Unicode 文字列を使えます。ただし、スペースまたはタブを含めることはできません。
-
生年月日の値が存在する場合は、 形式である必要があります
mm/dd/yyyy
。 つまり、例えば、1985 年 2 月 1 日の生年月日は としてエンコードする必要があります02/01/1985
。 -
[cognito:mfa_enabled] フィールドは必須です。ユーザープールで多要素認証 (MFA) が必須に設定されている場合、このフィールドはすべてのユーザー
true
に対してである必要があります。をオフにMFA設定した場合、このフィールドはすべてのユーザーfalse
に対して設定する必要があります。をオプションMFAに設定した場合、このフィールドはtrue
または のいずれかにできますがfalse
、空にすることはできません。 -
最大行数は 16,000 文字です。
-
最大CSVファイルサイズは 100 MB です。
-
ファイルの最大行数 (ユーザー) は 500,000 です。この最大値にはヘッダー行は含まれません。
-
[updated_at] フィールド値はエポック時間 (秒) であると想定します。たとえば
1471453471
などです。 -
属性値の先頭または末尾の空白は切り捨てられます。
次のリストは、カスタム属性のないユーザープールのCSVインポートファイルの例です。ユーザープールスキーマは、この例とは異なる場合があります。この場合、ユーザープールからダウンロードするCSVテンプレートにテスト値を指定する必要があります。
cognito:username,name,given_name,family_name,middle_name,nickname,preferred_username,profile,picture,website,email,email_verified,gender,birthdate,zoneinfo,locale,phone_number,phone_number_verified,address,updated_at,cognito:mfa_enabled John,,John,Doe,,,,,,,johndoe@example.com,TRUE,,02/01/1985,,,+12345550100,TRUE,123 Any Street,,FALSE Jane,,Jane,Roe,,,,,,,janeroe@example.com,TRUE,,01/01/1985,,,+12345550199,TRUE,100 Main Street,,FALSE
Amazon Cognito ユーザープールのインポートジョブの作成と実行
このセクションでは、Amazon Cognito コンソールと AWS Command Line Interface () を使用してユーザープールのインポートジョブを作成して実行する方法について説明しますAWS CLI。
CSV ファイルからのユーザーのインポート (コンソール)
次の手順では、 CSV ファイルからユーザーをインポートする方法について説明します。
CSV ファイルからユーザーをインポートするには (コンソール)
-
Amazon Cognito コンソール
に移動します。 AWS 認証情報の入力を求められる場合があります。 -
[User Pools] (ユーザープール) を選択します。
-
リストから存在するユーザープールを 1 つ選択します。
-
[ユーザー] タブを選択します。
-
[Import users] (ユーザーのインポート) セクションで、[Create an import job] (インポートジョブの作成) を選択します。
-
[Create import job] (インポートジョブの作成) ページで、ジョブ名を入力します。
-
新しいIAMロールを作成するか、既存のIAMロールを使用するかを選択します。
-
新しいIAMロールを作成する を選択した場合は、新しいロールの名前を入力します。Amazon Cognito は、正しいアクセス許可と信頼関係を持つロールを自動的に作成します。インポートジョブを作成するIAMプリンシパルには、IAMロールを作成するアクセス許可が必要です。
-
既存のIAMロールを使用する を選択した場合は、ロールIAM選択 のリストからロールを選択します。このロールには、 CloudWatch Logs IAMロールの作成 で説明されているアクセス許可と信頼ポリシーが必要です。
-
-
[Create job] (ジョブの作成) を選択してジョブを送信しますが、後で開始します。[Create and start job] (ジョブを作成して開始) を選択してジョブを送信し、すぐに開始します。
-
ジョブを作成したが開始しなかった場合は、後で開始できます。[Users] (ユーザー) タブの [Import users] (ユーザーのインポート) で、インポートジョブを選択し、[Start] (開始) を選択します。からStartUserImportJobAPIリクエストを送信することもできます AWS SDK。
-
ユーザーインポートジョブの進行状況は、[Import users] (ユーザーのインポート) の [Users] (ユーザー) タブで監視します。ジョブが成功しない場合は、[Status] (ステータス) 値を選択できます。詳細については、 CloudWatch 「ログを表示」を選択して詳細を確認し、 CloudWatch ログコンソールで問題を確認します。
ユーザーのインポート (AWS CLI)
次のCLIコマンドは、ユーザーをユーザープールにインポートするために使用できます。
-
create-user-import-job
-
get-csv-header
-
describe-user-import-job
-
list-user-import-jobs
-
start-user-import-job
-
stop-user-import-job
これらのコマンドに関するコマンドラインオプションのリストを取得するには、help
コマンドラインオプションを使用します。次に例を示します。
aws cognito-idp get-csv-header help
ユーザーインポートジョブの作成
CSV ファイルを作成したら、次のCLIコマンドを実行してユーザーインポートジョブを作成します。JOB_NAME
は、ジョブに選択する名前です。USER_POOL_ID
は、新しいユーザーを追加するユーザープールのユーザープール ID です。ROLE_ARN
は、 でARN受け取ったロールです CloudWatch Logs IAMロールの作成。
aws cognito-idp create-user-import-job --job-name "
JOB_NAME
" --user-pool-id "USER_POOL_ID
" --cloud-watch-logs-role-arn "ROLE_ARN
"
- PRE_SIGNED_URL
レスポンスで返された は 15 分間有効です。その後、有効期限が切れるため、新しい を取得するには、新しいユーザーインポートジョブを作成する必要がありますURL。
例 レスポンス例:
{ "UserImportJob": { "Status": "Created", "SkippedUsers": 0, "UserPoolId": "
USER_POOL_ID
", "ImportedUsers": 0, "JobName": "JOB_NAME
", "JobId": "JOB_ID
", "PreSignedUrl": "PRE_SIGNED_URL
", "CloudWatchLogsRoleArn": "ROLE_ARN
", "FailedUsers": 0, "CreationDate": 1470957431.965 } }
ユーザーインポートジョブのステータス値
ユーザーインポートのコマンドに対する応答には、Status
を示す次のような値が見つかります。
-
Created
- ジョブが作成されましたが、開始前の状態です。 -
Pending
- 遷移状態です。ジョブを開始しましたが、まだユーザーのインポートは開始していません。 -
InProgress
- ジョブが開始され、ユーザーインポートが進行中です。 -
Stopping
- ジョブを停止する処理中です。ユーザーインポートは停止していません。 -
Stopped
- ジョブは停止中で、ユーザーインポートも停止しています。 -
Succeeded
- ジョブは正常に完了しました。 -
Failed
- エラーのためジョブは停止しました。 -
Expired
- ジョブを作成しましたが、24 ~ 48 時間以内にジョブを起動しませんでした。ジョブに関連付けられたすべてのデータは削除され、ジョブを開始することはできません。
CSV ファイルのアップロード
次のcurl
コマンドを使用して、ユーザーデータを含むCSVファイルをcreate-user-import-job
、コマンドのレスポンスからURL取得した署名付きファイルにアップロードします。
curl -v -T "
PATH_TO_CSV_FILE
" -H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL
"
このコマンドの出力から、次のようなメッセージを見つけます: "We are completely uploaded and
fine"
このメッセージは、ファイルが正常にアップロードされたことを示します。
ユーザーインポートジョブの説明
ユーザーインポートジョブの説明を取得するには、次のコマンドを使用します。USER_POOL_ID
はユーザープール ID であり、JOB_ID
は、ユーザーインポートジョブの作成時に返されたジョブ ID です。
aws cognito-idp describe-user-import-job --user-pool-id "
USER_POOL_ID
" --job-id "JOB_ID
"
例 レスポンス例:
{ "UserImportJob": { "Status": "Created", "SkippedUsers": 0, "UserPoolId": "
USER_POOL_ID
", "ImportedUsers": 0, "JobName": "JOB_NAME
", "JobId": "JOB_ID
", "PreSignedUrl": "PRE_SIGNED_URL
", "CloudWatchLogsRoleArn":"ROLE_ARN
", "FailedUsers": 0, "CreationDate": 1470957431.965 } }
上記のサンプル出力では、PRE_SIGNED_URL
は、CSVファイルをアップロードURLした です。- ROLE_ARN
は、ロールの作成時にARN受け取った CloudWatch Logs ロールです。
ユーザーインポートジョブを表示する
ユーザーインポートジョブを一覧表示するには、次のコマンドを使用します:
aws cognito-idp list-user-import-jobs --user-pool-id "
USER_POOL_ID
" --max-results 2
例 レスポンス例:
{ "UserImportJobs": [ { "Status": "Created", "SkippedUsers": 0, "UserPoolId": "
USER_POOL_ID
", "ImportedUsers": 0, "JobName": "JOB_NAME
", "JobId": "JOB_ID
", "PreSignedUrl":"PRE_SIGNED_URL
", "CloudWatchLogsRoleArn":"ROLE_ARN
", "FailedUsers": 0, "CreationDate": 1470957431.965 }, { "CompletionDate": 1470954227.701, "StartDate": 1470954226.086, "Status": "Failed", "UserPoolId": "USER_POOL_ID
", "ImportedUsers": 0, "SkippedUsers": 0, "JobName": "JOB_NAME
", "CompletionMessage": "Too many users have failed or been skipped during the import.", "JobId": "JOB_ID
", "PreSignedUrl":"PRE_SIGNED_URL
", "CloudWatchLogsRoleArn":"ROLE_ARN
", "FailedUsers": 5, "CreationDate": 1470953929.313 } ], "PaginationToken": "PAGINATION_TOKEN
" }
ジョブは時系列で、作成が最後から最初の順で表示されます。- PAGINATION_TOKEN
2 番目のジョブの後の文字列は、このリストコマンドに追加の結果があることを示します。残りの結果を表示するには、次のように --pagination-token
オプションを使用します:
aws cognito-idp list-user-import-jobs --user-pool-id "
USER_POOL_ID
" --max-results 10 --pagination-token "PAGINATION_TOKEN
"
ユーザーインポートジョブの開始
ユーザーインポートジョブを開始するには、次のコマンドを使用します:
aws cognito-idp start-user-import-job --user-pool-id "
USER_POOL_ID
" --job-id "JOB_ID
"
インポートジョブは、アカウントごとに 1 つしかアクティブにできません。
例 レスポンス例:
{ "UserImportJob": { "Status": "Pending", "StartDate": 1470957851.483, "UserPoolId": "
USER_POOL_ID
", "ImportedUsers": 0, "SkippedUsers": 0, "JobName": "JOB_NAME
", "JobId": "JOB_ID
", "PreSignedUrl":"PRE_SIGNED_URL
", "CloudWatchLogsRoleArn": "ROLE_ARN
", "FailedUsers": 0, "CreationDate": 1470957431.965 } }
ユーザーインポートジョブの停止
ユーザーインポートジョブの進行中に停止するには、次のコマンドを使用します。ジョブを停止すると、再開することはできません。
aws cognito-idp stop-user-import-job --user-pool-id "
USER_POOL_ID
" --job-id "JOB_ID
"
例 レスポンス例:
{ "UserImportJob": { "CompletionDate": 1470958050.571, "StartDate": 1470958047.797, "Status": "Stopped", "UserPoolId": "
USER_POOL_ID
", "ImportedUsers": 0, "SkippedUsers": 0, "JobName": "JOB_NAME
", "CompletionMessage": "The Import Job was stopped by the developer.", "JobId": "JOB_ID
", "PreSignedUrl":"PRE_SIGNED_URL
", "CloudWatchLogsRoleArn": "ROLE_ARN
", "FailedUsers": 0, "CreationDate": 1470957972.387 } }
CloudWatch コンソールでユーザープールのインポート結果を表示する
インポートジョブの結果は、Amazon CloudWatch コンソールで表示できます。
結果の表示
次のステップでは、ユーザープールのインポートの結果を表示する方法を説明します。
ユーザープールのインポート結果を見るには
にサインイン AWS Management Console し、 で CloudWatch コンソールを開きますhttps://console.aws.amazon.com/cloudwatch/
。 -
[ログ] を選択します。
-
ユーザープールのインポートジョブに使用するロググループを選択します。ロググループ名は
/aws/cognito/userpools/
の形式です。USER_POOL_ID
/USER_POOL_NAME
-
先ほど実行したユーザーインポートジョブのログを選択します。ログ名は 形式です。
JOB_ID
/JOB_NAME
。 ログの結果は、ユーザーを行番号で参照します。ユーザーデータはログに書き込まれていません。各ユーザーに対して、次のような行が表示されます。-
[SUCCEEDED] Line Number 5956 - The import succeeded.
-
[SKIPPED] Line Number 5956 - The user already exists.
-
[FAILED] Line Number 5956 - The User Record does not set any of the auto verified attributes to true. (Example: email_verified to true).
-
結果の解釈
正常にインポートされたユーザーは、ステータスがPasswordReset「」に設定されています。
次の場合、ユーザーはインポートされませんが、インポートジョブは継続します。
-
true
に設定された自動検証された属性はありません。 -
ユーザーデータはスキーマに一致しません。
-
内部エラーによりユーザーをインポートできませんでした。
以下の場合、インポートジョブは失敗します。
-
Amazon CloudWatch Logs ロールを引き受けることができないか、正しいアクセスポリシーがないか、削除されています。
-
ユーザープールが削除されている。
-
Amazon Cognito が .csv ファイルを解析できない。
インポートされたユーザーにパスワードをリセットするように要求
インポートされた各ユーザーが初めてサインインしてパスワードを入力するときは、新しいパスワードを入力する必要があります。次の手順では、CSVファイルをインポートした後のローカルユーザーによるカスタムアプリケーションのユーザーエクスペリエンスについて説明します。ユーザーがホストされた UI でサインインすると、Amazon Cognito はユーザーが最初にサインインしたときに新しいパスワードを設定するように求めます。
インポートされたユーザーにパスワードをリセットするように要求
-
アプリケーションで、ランダムなパスワードを使用した
InitiateAuth
により、現在のユーザーのサインインをサイレントに試行します。 -
PreventUserExistenceErrors
が有効な場合、Amazon Cognito はNotAuthorizedException
を返します。そうでない場合はPasswordResetRequiredException
を返します。 -
アプリは
ForgotPassword
APIリクエストを行い、ユーザーのパスワードをリセットします。-
アプリケーションは
ForgotPassword
API、リクエストでユーザー名を送信します。 -
Amazon Cognito は、確認済みの E メールまたは電話番号にコードを送信します。送信先は、 CSV ファイル
phone_number_verified
でemail_verified
と に指定した値によって異なります。ForgotPassword
リクエストへのレスポンスは、コードの宛先を示します。注記
ユーザープールは、E メールまたは電話番号を確認するように設定する必要があります。詳細については、「ユーザーアカウントのサインアップと確認」を参照してください。
-
アプリケーションは、コードがコードの送信先を確認するメッセージをユーザーに表示し、ユーザーにコードと新しいパスワードを入力するように求めます。
-
ユーザーがアプリでコードと新しいパスワードを入力します。
-
アプリケーションは
ConfirmForgotPassword
API、リクエストでコードと新しいパスワードを送信します。 -
アプリケーションはユーザーをサインインにリダイレクトします。
-