diff --git a/.changelog/3517.txt b/.changelog/3517.txt new file mode 100644 index 0000000000..cf2500829a --- /dev/null +++ b/.changelog/3517.txt @@ -0,0 +1,3 @@ +```release-note:new-resource +tencentcloud_organization_external_saml_identity_provider +``` diff --git a/go.mod b/go.mod index e7f9bb4591..0feb3a45db 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1107 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.1033 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1148 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.48 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.49 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1206 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1161 @@ -69,7 +69,7 @@ require ( github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mongodb v1.0.1096 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/monitor v1.0.1149 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mps v1.0.853 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.1.14 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.1.49 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres v1.0.1156 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns v1.0.1038 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/pts v1.0.762 diff --git a/go.sum b/go.sum index fb734fdeff..56fea429e9 100644 --- a/go.sum +++ b/go.sum @@ -974,6 +974,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.46 h1:wWcfc github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.46/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.48 h1:aoRUrz2ag27jQWcOKHgeE+toSti6/xPqHKMLruOtJuM= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.48/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.49 h1:BQwUw2V21zIRJxstnaxtG/22lBL3+FbUgWhaC6Qd9ws= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.49/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993 h1:WlPgXldQCxt7qi5Xrc6j6zTrsXWzN5BcOGs7Irq7fwQ= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993/go.mod h1:Z9U8zNtyuyKhjS0698wqsrG/kLx1TQ5CEixXBwVe7xY= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860 h1:F3esKBIT3HW9+7Gt8cVgf8X06VdGIczpgLBUECzSEzU= @@ -1041,6 +1043,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/oceanus v1.0.831 h1:oya github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/oceanus v1.0.831/go.mod h1:2WuTlTnKCnZoa6l0JxY9GNfo0UG6nU7AEsljF8rMMsM= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.1.14 h1:vmvzSrR90cbhhxYkfJNs+OLJigfnPCW8cQtmOk8CZ1M= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.1.14/go.mod h1:KI5v7d+FJCm06dmIqJJInxluDS0W5hV/GesQn4YiJYM= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.1.49 h1:vClZ9j7TBBruqkXjWf0Eh7N/c0TMKAZFRxE8rWrTbkQ= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.1.49/go.mod h1:XzPgbujW3aG4ceclfwTR7e4RC3dK+iUyIIuMs++QMSI= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres v1.0.1156 h1:zf/4a8G7E7RlVaGCVyjVkljX5P4gjNJymQkHoEzhjs4= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres v1.0.1156/go.mod h1:B1+7f2z0qF8G2EjFzPXtqHK3tPbzqb2y725eW1wIkaM= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns v1.0.1038 h1:4rzyVxkDB27v73jDXPr5eGAwjN859R7SsqniCt+46XE= diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 93f69699fa..76c9eab5e8 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -1244,6 +1244,7 @@ func Provider() *schema.Provider { "tencentcloud_organization_org_share_unit_members": tco.DataSourceTencentCloudOrganizationOrgShareUnitMembers(), "tencentcloud_role_configuration_provisionings": tco.DataSourceTencentCloudRoleConfigurationProvisionings(), "tencentcloud_organization_resource_to_share_member": tco.DataSourceTencentCloudOrganizationResourceToShareMember(), + "tencentcloud_organization_org_share_area": tco.DataSourceTencentCloudOrganizationOrgShareArea(), "tencentcloud_pts_scenario_with_jobs": pts.DataSourceTencentCloudPtsScenarioWithJobs(), "tencentcloud_cam_list_attached_user_policy": cam.DataSourceTencentCloudCamListAttachedUserPolicy(), "tencentcloud_cam_secret_last_used_time": cam.DataSourceTencentCloudCamSecretLastUsedTime(), @@ -1280,7 +1281,6 @@ func Provider() *schema.Provider { "tencentcloud_clickhouse_spec": cdwch.DataSourceTencentCloudClickhouseSpec(), "tencentcloud_clickhouse_instance_shards": cdwch.DataSourceTencentCloudClickhouseInstanceShards(), "tencentcloud_clickhouse_instance_nodes": cdwch.DataSourceTencentCloudClickhouseInstanceNodes(), - "tencentcloud_organization_org_share_area": tco.DataSourceTencentCloudOrganizationOrgShareArea(), "tencentcloud_kubernetes_cluster_native_node_pools": tke.DataSourceTencentCloudKubernetesClusterNativeNodePools(), "tencentcloud_cdc_dedicated_cluster_hosts": cdc.DataSourceTencentCloudCdcDedicatedClusterHosts(), "tencentcloud_cdc_dedicated_cluster_instance_types": cdc.DataSourceTencentCloudCdcDedicatedClusterInstanceTypes(), @@ -1621,7 +1621,6 @@ func Provider() *schema.Provider { "tencentcloud_cam_user_permission_boundary_attachment": cam.ResourceTencentCloudCamUserPermissionBoundaryAttachment(), "tencentcloud_cam_role_permission_boundary_attachment": cam.ResourceTencentCloudCamRolePermissionBoundaryAttachment(), "tencentcloud_cam_message_receiver": cam.ResourceTencentCloudCamMessageReceiver(), - "tencentcloud_organization_quit_organization_operation": tco.ResourceTencentCloudOrganizationQuitOrganizationOperation(), "tencentcloud_ciam_user_group": ciam.ResourceTencentCloudCiamUserGroup(), "tencentcloud_ciam_user_store": ciam.ResourceTencentCloudCiamUserStore(), "tencentcloud_scf_function": scf.ResourceTencentCloudScfFunction(), @@ -2042,6 +2041,7 @@ func Provider() *schema.Provider { "tencentcloud_tat_invoker_config": tat.ResourceTencentCloudTatInvokerConfig(), "tencentcloud_tat_invocation_invoke_attachment": tat.ResourceTencentCloudTatInvocationInvokeAttachment(), "tencentcloud_tat_invocation_command_attachment": tat.ResourceTencentCloudTatInvocationCommandAttachment(), + "tencentcloud_organization_quit_organization_operation": tco.ResourceTencentCloudOrganizationQuitOrganizationOperation(), "tencentcloud_organization_org_node": tco.ResourceTencentCloudOrganizationOrgNode(), "tencentcloud_organization_org_member": tco.ResourceTencentCloudOrganizationOrgMember(), "tencentcloud_organization_org_identity": tco.ResourceTencentCloudOrganizationOrgIdentity(), @@ -2071,6 +2071,13 @@ func Provider() *schema.Provider { "tencentcloud_identity_center_scim_synchronization_status": tco.ResourceTencentCloudIdentityCenterScimSynchronizationStatus(), "tencentcloud_provision_role_configuration_operation": tco.ResourceTencentCloudProvisionRoleConfigurationOperation(), "tencentcloud_organization_member_auth_policy_attachment": tco.ResourceTencentCloudOrganizationMemberAuthPolicyAttachment(), + "tencentcloud_organization_org_share_unit_member": tco.ResourceTencentCloudOrganizationOrgShareUnitMember(), + "tencentcloud_organization_org_share_unit_member_v2": tco.ResourceTencentCloudOrganizationOrgShareUnitMemberV2(), + "tencentcloud_organization_org_share_unit": tco.ResourceTencentCloudOrganizationOrgShareUnit(), + "tencentcloud_organization_org_share_unit_resource": tco.ResourceTencentCloudOrganizationOrgShareUnitResource(), + "tencentcloud_accept_join_share_unit_invitation_operation": tco.ResourceTencentCloudAcceptJoinShareUnitInvitationOperation(), + "tencentcloud_reject_join_share_unit_invitation_operation": tco.ResourceTencentCloudRejectJoinShareUnitInvitationOperation(), + "tencentcloud_organization_external_saml_identity_provider": tco.ResourceTencentCloudOrganizationExternalSamlIdentityProvider(), "tencentcloud_dbbrain_sql_filter": dbbrain.ResourceTencentCloudDbbrainSqlFilter(), "tencentcloud_dbbrain_security_audit_log_export_task": dbbrain.ResourceTencentCloudDbbrainSecurityAuditLogExportTask(), "tencentcloud_dbbrain_db_diag_report_task": dbbrain.ResourceTencentCloudDbbrainDbDiagReportTask(), @@ -2422,12 +2429,6 @@ func Provider() *schema.Provider { "tencentcloud_elastic_public_ipv6_attachment": vpc.ResourceTencentCloudElasticPublicIpv6Attachment(), "tencentcloud_ha_vip_instance_attachment": vpc.ResourceTencentCloudHaVipInstanceAttachment(), "tencentcloud_csip_risk_center": csip.ResourceTencentCloudCsipRiskCenter(), - "tencentcloud_organization_org_share_unit_member": tco.ResourceTencentCloudOrganizationOrgShareUnitMember(), - "tencentcloud_organization_org_share_unit_member_v2": tco.ResourceTencentCloudOrganizationOrgShareUnitMemberV2(), - "tencentcloud_organization_org_share_unit": tco.ResourceTencentCloudOrganizationOrgShareUnit(), - "tencentcloud_organization_org_share_unit_resource": tco.ResourceTencentCloudOrganizationOrgShareUnitResource(), - "tencentcloud_accept_join_share_unit_invitation_operation": tco.ResourceTencentCloudAcceptJoinShareUnitInvitationOperation(), - "tencentcloud_reject_join_share_unit_invitation_operation": tco.ResourceTencentCloudRejectJoinShareUnitInvitationOperation(), "tencentcloud_kubernetes_addon": tke.ResourceTencentCloudKubernetesAddon(), "tencentcloud_kubernetes_addon_config": tke.ResourceTencentCloudKubernetesAddonConfig(), "tencentcloud_kubernetes_native_node_pool": tke.ResourceTencentCloudKubernetesNativeNodePool(), diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md index c26b0b41fa..9a9ac617f3 100644 --- a/tencentcloud/provider.md +++ b/tencentcloud/provider.md @@ -1804,6 +1804,7 @@ tencentcloud_accept_join_share_unit_invitation_operation tencentcloud_reject_join_share_unit_invitation_operation tencentcloud_provision_role_configuration_operation tencentcloud_organization_member_auth_policy_attachment +tencentcloud_organization_external_saml_identity_provider TDSQL-C for PostgreSQL(TDCPG) Data Source diff --git a/tencentcloud/services/tco/resource_tc_organization_external_saml_identity_provider.go b/tencentcloud/services/tco/resource_tc_organization_external_saml_identity_provider.go new file mode 100644 index 0000000000..9f34603780 --- /dev/null +++ b/tencentcloud/services/tco/resource_tc_organization_external_saml_identity_provider.go @@ -0,0 +1,476 @@ +package tco + +import ( + "context" + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + organization "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331" + organizationv20210331 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331" + + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func ResourceTencentCloudOrganizationExternalSamlIdentityProvider() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudOrganizationExternalSamlIdentityProviderCreate, + Read: resourceTencentCloudOrganizationExternalSamlIdentityProviderRead, + Update: resourceTencentCloudOrganizationExternalSamlIdentityProviderUpdate, + Delete: resourceTencentCloudOrganizationExternalSamlIdentityProviderDelete, + Schema: map[string]*schema.Schema{ + "zone_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Space ID.", + }, + + "encoded_metadata_document": { + Type: schema.TypeString, + Optional: true, + ConflictsWith: []string{"x509_certificate"}, + Description: "IdP metadata document (Base64 encoded). Provided by an IdP that supports the SAML 2.0 protocol.", + }, + + "sso_status": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Computed: true, + Description: "SSO enabling status. Valid values: Enabled, Disabled (default).", + }, + + "entity_id": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Computed: true, + Description: "IdP identifier.", + }, + + "login_url": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Computed: true, + Description: "IdP login URL.", + }, + + "x509_certificate": { + Type: schema.TypeString, + Optional: true, + ConflictsWith: []string{"encoded_metadata_document"}, + Description: "X509 certificate in PEM format. If this parameter is specified, all existing certificates will be replaced.", + }, + + "another_x509_certificate": { + Type: schema.TypeString, + Optional: true, + Description: "Another X509 certificate in PEM format. If this parameter is specified, all existing certificates will be replaced.", + }, + + // computed + "certificate_id": { + Type: schema.TypeString, + Computed: true, + Description: "Certificate ID.", + }, + + "another_certificate_id": { + Type: schema.TypeString, + Computed: true, + Description: "Another certificate ID.", + }, + + "create_time": { + Type: schema.TypeString, + Computed: true, + Description: "Create time.", + }, + + "update_time": { + Type: schema.TypeString, + Computed: true, + Description: "Update time.", + }, + }, + } +} + +func resourceTencentCloudOrganizationExternalSamlIdentityProviderCreate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_organization_external_saml_identity_provider.create")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = organizationv20210331.NewSetExternalSAMLIdentityProviderRequest() + response = organizationv20210331.NewSetExternalSAMLIdentityProviderResponse() + zoneId string + ) + + if v, ok := d.GetOk("zone_id"); ok { + request.ZoneId = helper.String(v.(string)) + zoneId = v.(string) + } + + if v, ok := d.GetOk("encoded_metadata_document"); ok { + request.EncodedMetadataDocument = helper.String(v.(string)) + } + + if v, ok := d.GetOk("sso_status"); ok { + request.SSOStatus = helper.String(v.(string)) + } + + if v, ok := d.GetOk("entity_id"); ok { + request.EntityId = helper.String(v.(string)) + } + + if v, ok := d.GetOk("login_url"); ok { + request.LoginUrl = helper.String(v.(string)) + } + + if v, ok := d.GetOk("x509_certificate"); ok { + request.X509Certificate = helper.String(v.(string)) + } + + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOrganizationClient().SetExternalSAMLIdentityProviderWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.CertificateIds == nil { + return resource.NonRetryableError(fmt.Errorf("Create organization external saml identity provider failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s create organization external saml identity provider failed, reason:%+v", logId, reqErr) + return reqErr + } + + if len(response.Response.CertificateIds) == 0 { + return fmt.Errorf("CertificateIds is nil.") + } + + // set main certificate id + _ = d.Set("certificate_id", response.Response.CertificateIds[0]) + d.SetId(zoneId) + + // another certificate + if v, ok := d.GetOk("another_certificate_id"); ok { + request := organization.NewAddExternalSAMLIdPCertificateRequest() + response := organization.NewAddExternalSAMLIdPCertificateResponse() + request.ZoneId = &zoneId + request.X509Certificate = helper.String(v.(string)) + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOrganizationClient().AddExternalSAMLIdPCertificateWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil { + return resource.NonRetryableError(fmt.Errorf("Create another organization external saml identity provider failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s create another organization external saml IdP certificate failed, reason:%+v", logId, reqErr) + return reqErr + } + + if response.Response.CertificateId == nil { + return fmt.Errorf("Another certificateId is nil.") + } + + // set another certificate id + _ = d.Set("another_certificate_id", response.Response.CertificateId) + } + + return resourceTencentCloudOrganizationExternalSamlIdentityProviderRead(d, meta) +} + +func resourceTencentCloudOrganizationExternalSamlIdentityProviderRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_organization_external_saml_identity_provider.read")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + service = OrganizationService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + zoneId = d.Id() + ) + + respData, err := service.DescribeOrganizationExternalSamlIdentityProviderById(ctx, zoneId) + if err != nil { + return err + } + + if respData == nil { + log.Printf("[WARN]%s resource `tencentcloud_organization_external_saml_identity_provider` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + d.SetId("") + return nil + } + + _ = d.Set("zone_id", zoneId) + + if respData.EncodedMetadataDocument != nil { + _ = d.Set("encoded_metadata_document", respData.EncodedMetadataDocument) + } + + if respData.SSOStatus != nil { + _ = d.Set("sso_status", respData.SSOStatus) + } + + if respData.EntityId != nil { + _ = d.Set("entity_id", respData.EntityId) + } + + if respData.LoginUrl != nil { + _ = d.Set("login_url", respData.LoginUrl) + } + + if respData.CertificateIds != nil { + tmpCertificateId := d.Get("certificate_id").(string) + tmpAnotherCertificateId := d.Get("another_certificate_id").(string) + if tmpCertificateId != "" || tmpAnotherCertificateId != "" { + for _, item := range respData.CertificateIds { + if item != nil { + if *item == tmpCertificateId { + _ = d.Set("certificate_id", item) + } + + if *item == tmpAnotherCertificateId { + _ = d.Set("another_certificate_id", item) + } + } + } + } + } + + if respData.CreateTime != nil { + _ = d.Set("create_time", respData.CreateTime) + } + + if respData.UpdateTime != nil { + _ = d.Set("update_time", respData.UpdateTime) + } + + return nil +} + +func resourceTencentCloudOrganizationExternalSamlIdentityProviderUpdate(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_organization_external_saml_identity_provider.update")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + zoneId = d.Id() + ) + + if d.HasChange("encoded_metadata_document") || d.HasChange("x509_certificate") || d.HasChange("another_x509_certificate") { + if d.Get("encoded_metadata_document").(string) == "" && d.Get("x509_certificate").(string) == "" && d.Get("another_x509_certificate").(string) == "" { + return fmt.Errorf("At least one certificate must be retained.") + } + + if d.HasChange("encoded_metadata_document") || d.HasChange("x509_certificate") { + oldEmdInterface, newEmdInterface := d.GetChange("encoded_metadata_document") + oldEmd := oldEmdInterface.(string) + newEmd := newEmdInterface.(string) + if newEmd != "" { + return fmt.Errorf("Currently, `encoded_metadata_document` does not support adding new value.") + } + + oldX509CertInterface, newX509CertInterface := d.GetChange("x509_certificate") + oldX509Cert := oldX509CertInterface.(string) + newX509Cert := newX509CertInterface.(string) + + // delete first + if oldEmd != "" || oldX509Cert != "" { + request := organization.NewRemoveExternalSAMLIdPCertificateRequest() + tmpCertificateId := d.Get("certificate_id").(string) + + request.ZoneId = &zoneId + request.CertificateId = helper.String(tmpCertificateId) + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOrganizationClient().RemoveExternalSAMLIdPCertificateWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil { + return resource.NonRetryableError(fmt.Errorf("Remove organization external saml identity provider failed, Response is nil.")) + } + + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s remove organization external saml identity provider failed, reason:%+v", logId, reqErr) + return reqErr + } + + // Clear certificate_id + _ = d.Set("certificate_id", "") + } + + // add new + if newX509Cert != "" { + request := organization.NewAddExternalSAMLIdPCertificateRequest() + response := organization.NewAddExternalSAMLIdPCertificateResponse() + tmpX509Certificate := d.Get("x509_certificate").(string) + + request.ZoneId = &zoneId + request.X509Certificate = helper.String(tmpX509Certificate) + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOrganizationClient().AddExternalSAMLIdPCertificateWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil { + return resource.NonRetryableError(fmt.Errorf("Add organization external saml identity provider failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s add organization external saml identity provider failed, reason:%+v", logId, reqErr) + return reqErr + } + + if response.Response.CertificateId == nil { + return fmt.Errorf("CertificateId is nil.") + } + + _ = d.Set("certificate_id", response.Response.CertificateId) + } + } + + if d.HasChange("another_x509_certificate") { + oldAnotherX509CertInterface, newAnotherX509CertInterface := d.GetChange("another_x509_certificate") + oldAnotherX509Cert := oldAnotherX509CertInterface.(string) + newAnotherX509Cert := newAnotherX509CertInterface.(string) + + // delete first + if oldAnotherX509Cert != "" { + request := organization.NewRemoveExternalSAMLIdPCertificateRequest() + tmpCertificateId := d.Get("another_certificate_id").(string) + + request.ZoneId = &zoneId + request.CertificateId = helper.String(tmpCertificateId) + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOrganizationClient().RemoveExternalSAMLIdPCertificateWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil { + return resource.NonRetryableError(fmt.Errorf("Remove another organization external saml identity provider failed, Response is nil.")) + } + + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s remove another organization external saml identity provider failed, reason:%+v", logId, reqErr) + return reqErr + } + + // Clear certificate_id + _ = d.Set("another_certificate_id", "") + } + + // add new + if newAnotherX509Cert != "" { + request := organization.NewAddExternalSAMLIdPCertificateRequest() + response := organization.NewAddExternalSAMLIdPCertificateResponse() + + request.ZoneId = &zoneId + request.X509Certificate = helper.String(newAnotherX509Cert) + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOrganizationClient().AddExternalSAMLIdPCertificateWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil { + return resource.NonRetryableError(fmt.Errorf("Add another organization external saml identity provider failed, Response is nil.")) + } + + response = result + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s add another organization external saml identity provider failed, reason:%+v", logId, reqErr) + return reqErr + } + + if response.Response.CertificateId == nil { + return fmt.Errorf("CertificateId is nil.") + } + + _ = d.Set("another_certificate_id", response.Response.CertificateId) + } + } + } + + return resourceTencentCloudOrganizationExternalSamlIdentityProviderRead(d, meta) +} + +func resourceTencentCloudOrganizationExternalSamlIdentityProviderDelete(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("resource.tencentcloud_organization_external_saml_identity_provider.delete")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta) + request = organizationv20210331.NewClearExternalSAMLIdentityProviderRequest() + zoneId = d.Id() + ) + + request.ZoneId = &zoneId + reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseOrganizationClient().ClearExternalSAMLIdentityProviderWithContext(ctx, request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + return nil + }) + + if reqErr != nil { + log.Printf("[CRITAL]%s delete organization external saml identity provider failed, reason:%+v", logId, reqErr) + return reqErr + } + + return nil +} diff --git a/tencentcloud/services/tco/resource_tc_organization_external_saml_identity_provider.md b/tencentcloud/services/tco/resource_tc_organization_external_saml_identity_provider.md new file mode 100644 index 0000000000..87edcc2353 --- /dev/null +++ b/tencentcloud/services/tco/resource_tc_organization_external_saml_identity_provider.md @@ -0,0 +1,19 @@ +Provides a resource to create a Organization external saml identity provider + +~> **NOTE:** When creating it for the first time, you must set one of `encoded_metadata_document` and `x509_certificate`, `another_x509_certificate` cannot be set alone. + +Example Usage + +```hcl +resource "tencentcloud_organization_external_saml_identity_provider" "example" { + zone_id = "z-1os7c9znogct" + encoded_metadata_document = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz......RGVzY3JpcHRvcj4=" + another_x509_certificate = <<-EOF +-----BEGIN CERTIFICATE----- +MIIC8DCCAdigAwIBAgIQPCotiH/l8K1K6kBgL4mBfzANBgkqhkiG9w0BAQsFADA0MTIwMAYDVQQD +...... +qs39KP9jOtSzEzc1YhiX +-----END CERTIFICATE----- +EOF +} +``` diff --git a/tencentcloud/services/tco/resource_tc_organization_external_saml_identity_provider_test.go b/tencentcloud/services/tco/resource_tc_organization_external_saml_identity_provider_test.go new file mode 100644 index 0000000000..47ad18a864 --- /dev/null +++ b/tencentcloud/services/tco/resource_tc_organization_external_saml_identity_provider_test.go @@ -0,0 +1,67 @@ +package tco_test + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" +) + +func TestAccTencentCloudOrganizationExternalSamlIdentityProviderResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccOrganizationExternalSamlIdentityProvider, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_organization_external_saml_identity_provider.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_organization_external_saml_identity_provider.example", "zone_id"), + ), + }, + { + Config: testAccOrganizationExternalSamlIdentityProviderUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_organization_external_saml_identity_provider.example", "id"), + resource.TestCheckResourceAttrSet("tencentcloud_organization_external_saml_identity_provider.example", "zone_id"), + ), + }, + }, + }) +} + +const testAccOrganizationExternalSamlIdentityProvider = ` +resource "tencentcloud_organization_external_saml_identity_provider" "example" { + zone_id = "z-1os7c9znogct" + encoded_metadata_document = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW50aXR5RGVzY3JpcHRvciBJRD0iXzU5MjY2N2UxLTE2MDItNDAwZC1hNTQwLThkMWMzZDUzMDNhYSIgZW50aXR5SUQ9Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2Q1MTNkNWJjLTlmMzktNDA2OS1iYTlhLTFlZWFiMmNhNThjMS8iIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bWV0YWRhdGEiPjxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxTaWduZWRJbmZvPjxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIiAvPjxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2IiAvPjxSZWZlcmVuY2UgVVJJPSIjXzU5MjY2N2UxLTE2MDItNDAwZC1hNTQwLThkMWMzZDUzMDNhYSI+PFRyYW5zZm9ybXM+PFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIiAvPjxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiIC8+PC9UcmFuc2Zvcm1zPjxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiIC8+PERpZ2VzdFZhbHVlPnNob1RkY1ZCaUJEOFgwM1l5dFc5QS9ZTzVSZUpLS2RGalBOQjN5OS9QNU09PC9EaWdlc3RWYWx1ZT48L1JlZmVyZW5jZT48L1NpZ25lZEluZm8+PFNpZ25hdHVyZVZhbHVlPmJ2MFR1WFJhVUdVeE1sdkNBL0diVWFuTlhGSFBTM05HQXVSb0s2ZlhCL1hjMWJSRlRtZWVhQ0tEa3JzYnBQUzg1VDZicFQxbDRBRGRCRm11TzhCdkliTTQzR0t1ZEFCZTZrVFl6Z3ZyOG5kQmVmZkNkbkYveUdOL1J3UXBZL2l3Q3JTVDlWUmRIYkdqc0RmcnNOSnFnRkpUWG1wNWZLczg1MldEb2FJcldFb0I5MC9DeUZJdUdEMmZSUFl0M0ZOOHpBUFpmR3ZsOGluZDUzTXlBV0xCcytJYXplSzFwK3VQMlREUFpCM3Eyem40V0QzZmxtWVBmUTgwdEd3eVNmU09hNG1iUlpKajRxRnBHL0R1ejR0aXNGSENlaUtOcW5lYnVrallKZEg1K3RWekREbXlOME9BMG5tYk9TendhOFhGcVU2TnVaLzIrWmpkb0tVczBsRnpaZz09PC9TaWduYXR1cmVWYWx1ZT48ZHM6S2V5SW5mbyB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PGRzOlg1MDlEYXRhPjxkczpYNTA5Q2VydGlmaWNhdGU+TUlJQzhEQ0NBZGlnQXdJQkFnSVFYNUtYZ1lULzJMTkZlZ2g1alVRUUFEQU5CZ2txaGtpRzl3MEJBUXNGQURBME1USXdNQVlEVlFRREV5bE5hV055YjNOdlpuUWdRWHAxY21VZ1JtVmtaWEpoZEdWa0lGTlRUeUJEWlhKMGFXWnBZMkYwWlRBZUZ3MHlOVEF4TVRZd056RTNNRFJhRncweU9EQXhNVFl3TnpFM01ETmFNRFF4TWpBd0JnTlZCQU1US1UxcFkzSnZjMjltZENCQmVuVnlaU0JHWldSbGNtRjBaV1FnVTFOUElFTmxjblJwWm1sallYUmxNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW5LOE1MdFIxOEJxUzFlYkt5dzk2VDN4YU03OTBhVWQwRHoxTkdPeE9tTzhQK04vQ0d1aXB5R2p3Ui9sSGZLRGV4MXFxYzRHMEM1K2hWZy9qQUhTYXdRM3c5QktrVXIwRjliOUJVMW1lZWcrclY4N1h6L25LMExCMitZd1FOaWF2RW1zR1N0THNNcWN3L0FhOGdJRXRFTFVjVlREWWMwR25QazZmajN1RHp4akJZS2Zod1QreWFIUENtVFRmZG1xS2dIem1idk5oOExHVC81bmZvVFl3RmVOTGVZY20vb0VQYW5XUDU1RktxQ2oxR21OeTZoTTh1V2htVjZEQXkwS3dMK0ZEOHlFb1FlU3FIQ3hpd3UvUHVhRXVPaTFaa0M5S1M3OUpRbCtkNDhLa0d2LzZERmtUSjVUMVJ0U01nc1VIUGZXQ21KUjhpYjBHaGh1ZHpJWHpRUUlEQVFBQk1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQmhaZmVUR3pmWGkreTNSN0RRZzI0dmx2MEcxNFk2cXRtbHBKSEJGTTZ0T3hYT0lkaTl5TGZFcStvS3JNTzJra0M2azd6cm5aSmdueEh1cDFzRTJCamx4Rmh4aWFyeXBCNDROMi9xMkVaa0ttUDNnQnlCL0tVV1lDOWJCNWRiZzN2akxxZ2JJMjJXdDRPR2FtdkF0VDhTQ21mc1dTSGJjRWJOYklXZitNaHh0bzl2c3lHWkNhRGdZVnhWd1dnL0ZIQ1Rpc3VFY3NMT3BqaXNLdEJCR3JBZmxnbE1nWTd2NVE4bmhPRVQwZ1hiSldTL2FNaWFta01BWFg0SVRsMnNIM2RGajIzRkdrblU1ZEZSOEp6a0IzRGJKT0x6b0pBVXRHVi9JTjEvZVBvVEF6WHdKS3d3bGNhU0FlR2lxcGdPdnA0YUEzQUZkdXhENVNoOThtZkU3Sm80PC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48L2RzOktleUluZm8+PC9TaWduYXR1cmU+PFJvbGVEZXNjcmlwdG9yIHhzaTp0eXBlPSJmZWQ6U2VjdXJpdHlUb2tlblNlcnZpY2VUeXBlIiBwcm90b2NvbFN1cHBvcnRFbnVtZXJhdGlvbj0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvZmVkZXJhdGlvbi8yMDA3MDYiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmZlZD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvZmVkZXJhdGlvbi8yMDA3MDYiPjxLZXlEZXNjcmlwdG9yIHVzZT0ic2lnbmluZyI+PEtleUluZm8geG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxYNTA5RGF0YT48WDUwOUNlcnRpZmljYXRlPk1JSUM4RENDQWRpZ0F3SUJBZ0lRWDVLWGdZVC8yTE5GZWdoNWpVUVFBREFOQmdrcWhraUc5dzBCQVFzRkFEQTBNVEl3TUFZRFZRUURFeWxOYVdOeWIzTnZablFnUVhwMWNtVWdSbVZrWlhKaGRHVmtJRk5UVHlCRFpYSjBhV1pwWTJGMFpUQWVGdzB5TlRBeE1UWXdOekUzTURSYUZ3MHlPREF4TVRZd056RTNNRE5hTURReE1qQXdCZ05WQkFNVEtVMXBZM0p2YzI5bWRDQkJlblZ5WlNCR1pXUmxjbUYwWldRZ1UxTlBJRU5sY25ScFptbGpZWFJsTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFuSzhNTHRSMThCcVMxZWJLeXc5NlQzeGFNNzkwYVVkMER6MU5HT3hPbU84UCtOL0NHdWlweUdqd1IvbEhmS0RleDFxcWM0RzBDNStoVmcvakFIU2F3UTN3OUJLa1VyMEY5YjlCVTFtZWVnK3JWODdYei9uSzBMQjIrWXdRTmlhdkVtc0dTdExzTXFjdy9BYThnSUV0RUxVY1ZURFljMEduUGs2ZmozdUR6eGpCWUtmaHdUK3lhSFBDbVRUZmRtcUtnSHptYnZOaDhMR1QvNW5mb1RZd0ZlTkxlWWNtL29FUGFuV1A1NUZLcUNqMUdtTnk2aE04dVdobVY2REF5MEt3TCtGRDh5RW9RZVNxSEN4aXd1L1B1YUV1T2kxWmtDOUtTNzlKUWwrZDQ4S2tHdi82REZrVEo1VDFSdFNNZ3NVSFBmV0NtSlI4aWIwR2hodWR6SVh6UVFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUJoWmZlVEd6ZlhpK3kzUjdEUWcyNHZsdjBHMTRZNnF0bWxwSkhCRk02dE94WE9JZGk5eUxmRXErb0tyTU8ya2tDNms3enJuWkpnbnhIdXAxc0UyQmpseEZoeGlhcnlwQjQ0TjIvcTJFWmtLbVAzZ0J5Qi9LVVdZQzliQjVkYmczdmpMcWdiSTIyV3Q0T0dhbXZBdFQ4U0NtZnNXU0hiY0ViTmJJV2YrTWh4dG85dnN5R1pDYURnWVZ4VndXZy9GSENUaXN1RWNzTE9wamlzS3RCQkdyQWZsZ2xNZ1k3djVROG5oT0VUMGdYYkpXUy9hTWlhbWtNQVhYNElUbDJzSDNkRmoyM0ZHa25VNWRGUjhKemtCM0RiSk9Mem9KQVV0R1YvSU4xL2VQb1RBelh3Skt3d2xjYVNBZUdpcXBnT3ZwNGFBM0FGZHV4RDVTaDk4bWZFN0pvNDwvWDUwOUNlcnRpZmljYXRlPjwvWDUwOURhdGE+PC9LZXlJbmZvPjwvS2V5RGVzY3JpcHRvcj48ZmVkOkNsYWltVHlwZXNPZmZlcmVkPjxhdXRoOkNsYWltVHlwZSBVcmk9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiIHhtbG5zOmF1dGg9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2F1dGhvcml6YXRpb24vMjAwNzA2Ij48YXV0aDpEaXNwbGF5TmFtZT5OYW1lPC9hdXRoOkRpc3BsYXlOYW1lPjxhdXRoOkRlc2NyaXB0aW9uPlRoZSBtdXRhYmxlIGRpc3BsYXkgbmFtZSBvZiB0aGUgdXNlci48L2F1dGg6RGVzY3JpcHRpb24+PC9hdXRoOkNsYWltVHlwZT48YXV0aDpDbGFpbVR5cGUgVXJpPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciIgeG1sbnM6YXV0aD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvYXV0aG9yaXphdGlvbi8yMDA3MDYiPjxhdXRoOkRpc3BsYXlOYW1lPlN1YmplY3Q8L2F1dGg6RGlzcGxheU5hbWU+PGF1dGg6RGVzY3JpcHRpb24+QW4gaW1tdXRhYmxlLCBnbG9iYWxseSB1bmlxdWUsIG5vbi1yZXVzYWJsZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHRoYXQgaXMgdW5pcXVlIHRvIHRoZSBhcHBsaWNhdGlvbiBmb3Igd2hpY2ggYSB0b2tlbiBpcyBpc3N1ZWQuPC9hdXRoOkRlc2NyaXB0aW9uPjwvYXV0aDpDbGFpbVR5cGU+PGF1dGg6Q2xhaW1UeXBlIFVyaT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvZ2l2ZW5uYW1lIiB4bWxuczphdXRoPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c2ZlZC9hdXRob3JpemF0aW9uLzIwMDcwNiI+PGF1dGg6RGlzcGxheU5hbWU+R2l2ZW4gTmFtZTwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5GaXJzdCBuYW1lIG9mIHRoZSB1c2VyLjwvYXV0aDpEZXNjcmlwdGlvbj48L2F1dGg6Q2xhaW1UeXBlPjxhdXRoOkNsYWltVHlwZSBVcmk9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL3N1cm5hbWUiIHhtbG5zOmF1dGg9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2F1dGhvcml6YXRpb24vMjAwNzA2Ij48YXV0aDpEaXNwbGF5TmFtZT5TdXJuYW1lPC9hdXRoOkRpc3BsYXlOYW1lPjxhdXRoOkRlc2NyaXB0aW9uPkxhc3QgbmFtZSBvZiB0aGUgdXNlci48L2F1dGg6RGVzY3JpcHRpb24+PC9hdXRoOkNsYWltVHlwZT48YXV0aDpDbGFpbVR5cGUgVXJpPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2lkZW50aXR5L2NsYWltcy9kaXNwbGF5bmFtZSIgeG1sbnM6YXV0aD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvYXV0aG9yaXphdGlvbi8yMDA3MDYiPjxhdXRoOkRpc3BsYXlOYW1lPkRpc3BsYXkgTmFtZTwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5EaXNwbGF5IG5hbWUgb2YgdGhlIHVzZXIuPC9hdXRoOkRlc2NyaXB0aW9uPjwvYXV0aDpDbGFpbVR5cGU+PGF1dGg6Q2xhaW1UeXBlIFVyaT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9pZGVudGl0eS9jbGFpbXMvbmlja25hbWUiIHhtbG5zOmF1dGg9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2F1dGhvcml6YXRpb24vMjAwNzA2Ij48YXV0aDpEaXNwbGF5TmFtZT5OaWNrIE5hbWU8L2F1dGg6RGlzcGxheU5hbWU+PGF1dGg6RGVzY3JpcHRpb24+TmljayBuYW1lIG9mIHRoZSB1c2VyLjwvYXV0aDpEZXNjcmlwdGlvbj48L2F1dGg6Q2xhaW1UeXBlPjxhdXRoOkNsYWltVHlwZSBVcmk9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvYXV0aGVudGljYXRpb25pbnN0YW50IiB4bWxuczphdXRoPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c2ZlZC9hdXRob3JpemF0aW9uLzIwMDcwNiI+PGF1dGg6RGlzcGxheU5hbWU+QXV0aGVudGljYXRpb24gSW5zdGFudDwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5UaGUgdGltZSAoVVRDKSB3aGVuIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQgdG8gV2luZG93cyBBenVyZSBBY3RpdmUgRGlyZWN0b3J5LjwvYXV0aDpEZXNjcmlwdGlvbj48L2F1dGg6Q2xhaW1UeXBlPjxhdXRoOkNsYWltVHlwZSBVcmk9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvYXV0aGVudGljYXRpb25tZXRob2QiIHhtbG5zOmF1dGg9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2F1dGhvcml6YXRpb24vMjAwNzA2Ij48YXV0aDpEaXNwbGF5TmFtZT5BdXRoZW50aWNhdGlvbiBNZXRob2Q8L2F1dGg6RGlzcGxheU5hbWU+PGF1dGg6RGVzY3JpcHRpb24+VGhlIG1ldGhvZCB0aGF0IFdpbmRvd3MgQXp1cmUgQWN0aXZlIERpcmVjdG9yeSB1c2VzIHRvIGF1dGhlbnRpY2F0ZSB1c2Vycy48L2F1dGg6RGVzY3JpcHRpb24+PC9hdXRoOkNsYWltVHlwZT48YXV0aDpDbGFpbVR5cGUgVXJpPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2lkZW50aXR5L2NsYWltcy9vYmplY3RpZGVudGlmaWVyIiB4bWxuczphdXRoPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c2ZlZC9hdXRob3JpemF0aW9uLzIwMDcwNiI+PGF1dGg6RGlzcGxheU5hbWU+T2JqZWN0SWRlbnRpZmllcjwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5QcmltYXJ5IGlkZW50aWZpZXIgZm9yIHRoZSB1c2VyIGluIHRoZSBkaXJlY3RvcnkuIEltbXV0YWJsZSwgZ2xvYmFsbHkgdW5pcXVlLCBub24tcmV1c2FibGUuPC9hdXRoOkRlc2NyaXB0aW9uPjwvYXV0aDpDbGFpbVR5cGU+PGF1dGg6Q2xhaW1UeXBlIFVyaT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9pZGVudGl0eS9jbGFpbXMvdGVuYW50aWQiIHhtbG5zOmF1dGg9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2F1dGhvcml6YXRpb24vMjAwNzA2Ij48YXV0aDpEaXNwbGF5TmFtZT5UZW5hbnRJZDwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5JZGVudGlmaWVyIGZvciB0aGUgdXNlcidzIHRlbmFudC48L2F1dGg6RGVzY3JpcHRpb24+PC9hdXRoOkNsYWltVHlwZT48YXV0aDpDbGFpbVR5cGUgVXJpPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2lkZW50aXR5L2NsYWltcy9pZGVudGl0eXByb3ZpZGVyIiB4bWxuczphdXRoPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c2ZlZC9hdXRob3JpemF0aW9uLzIwMDcwNiI+PGF1dGg6RGlzcGxheU5hbWU+SWRlbnRpdHlQcm92aWRlcjwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5JZGVudGl0eSBwcm92aWRlciBmb3IgdGhlIHVzZXIuPC9hdXRoOkRlc2NyaXB0aW9uPjwvYXV0aDpDbGFpbVR5cGU+PGF1dGg6Q2xhaW1UeXBlIFVyaT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvZW1haWxhZGRyZXNzIiB4bWxuczphdXRoPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c2ZlZC9hdXRob3JpemF0aW9uLzIwMDcwNiI+PGF1dGg6RGlzcGxheU5hbWU+RW1haWw8L2F1dGg6RGlzcGxheU5hbWU+PGF1dGg6RGVzY3JpcHRpb24+RW1haWwgYWRkcmVzcyBvZiB0aGUgdXNlci48L2F1dGg6RGVzY3JpcHRpb24+PC9hdXRoOkNsYWltVHlwZT48YXV0aDpDbGFpbVR5cGUgVXJpPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL2dyb3VwcyIgeG1sbnM6YXV0aD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvYXV0aG9yaXphdGlvbi8yMDA3MDYiPjxhdXRoOkRpc3BsYXlOYW1lPkdyb3VwczwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5Hcm91cHMgb2YgdGhlIHVzZXIuPC9hdXRoOkRlc2NyaXB0aW9uPjwvYXV0aDpDbGFpbVR5cGU+PGF1dGg6Q2xhaW1UeXBlIFVyaT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9pZGVudGl0eS9jbGFpbXMvYWNjZXNzdG9rZW4iIHhtbG5zOmF1dGg9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2F1dGhvcml6YXRpb24vMjAwNzA2Ij48YXV0aDpEaXNwbGF5TmFtZT5FeHRlcm5hbCBBY2Nlc3MgVG9rZW48L2F1dGg6RGlzcGxheU5hbWU+PGF1dGg6RGVzY3JpcHRpb24+QWNjZXNzIHRva2VuIGlzc3VlZCBieSBleHRlcm5hbCBpZGVudGl0eSBwcm92aWRlci48L2F1dGg6RGVzY3JpcHRpb24+PC9hdXRoOkNsYWltVHlwZT48YXV0aDpDbGFpbVR5cGUgVXJpPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL2V4cGlyYXRpb24iIHhtbG5zOmF1dGg9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2F1dGhvcml6YXRpb24vMjAwNzA2Ij48YXV0aDpEaXNwbGF5TmFtZT5FeHRlcm5hbCBBY2Nlc3MgVG9rZW4gRXhwaXJhdGlvbjwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5VVEMgZXhwaXJhdGlvbiB0aW1lIG9mIGFjY2VzcyB0b2tlbiBpc3N1ZWQgYnkgZXh0ZXJuYWwgaWRlbnRpdHkgcHJvdmlkZXIuPC9hdXRoOkRlc2NyaXB0aW9uPjwvYXV0aDpDbGFpbVR5cGU+PGF1dGg6Q2xhaW1UeXBlIFVyaT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9pZGVudGl0eS9jbGFpbXMvb3BlbmlkMl9pZCIgeG1sbnM6YXV0aD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvYXV0aG9yaXphdGlvbi8yMDA3MDYiPjxhdXRoOkRpc3BsYXlOYW1lPkV4dGVybmFsIE9wZW5JRCAyLjAgSWRlbnRpZmllcjwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5PcGVuSUQgMi4wIGlkZW50aWZpZXIgaXNzdWVkIGJ5IGV4dGVybmFsIGlkZW50aXR5IHByb3ZpZGVyLjwvYXV0aDpEZXNjcmlwdGlvbj48L2F1dGg6Q2xhaW1UeXBlPjxhdXRoOkNsYWltVHlwZSBVcmk9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vY2xhaW1zL2dyb3Vwcy5saW5rIiB4bWxuczphdXRoPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c2ZlZC9hdXRob3JpemF0aW9uLzIwMDcwNiI+PGF1dGg6RGlzcGxheU5hbWU+R3JvdXBzT3ZlcmFnZUNsYWltPC9hdXRoOkRpc3BsYXlOYW1lPjxhdXRoOkRlc2NyaXB0aW9uPklzc3VlZCB3aGVuIG51bWJlciBvZiB1c2VyJ3MgZ3JvdXAgY2xhaW1zIGV4Y2VlZHMgcmV0dXJuIGxpbWl0LjwvYXV0aDpEZXNjcmlwdGlvbj48L2F1dGg6Q2xhaW1UeXBlPjxhdXRoOkNsYWltVHlwZSBVcmk9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSIgeG1sbnM6YXV0aD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvYXV0aG9yaXphdGlvbi8yMDA3MDYiPjxhdXRoOkRpc3BsYXlOYW1lPlJvbGUgQ2xhaW08L2F1dGg6RGlzcGxheU5hbWU+PGF1dGg6RGVzY3JpcHRpb24+Um9sZXMgdGhhdCB0aGUgdXNlciBvciBTZXJ2aWNlIFByaW5jaXBhbCBpcyBhdHRhY2hlZCB0bzwvYXV0aDpEZXNjcmlwdGlvbj48L2F1dGg6Q2xhaW1UeXBlPjxhdXRoOkNsYWltVHlwZSBVcmk9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvd2lkcyIgeG1sbnM6YXV0aD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvYXV0aG9yaXphdGlvbi8yMDA3MDYiPjxhdXRoOkRpc3BsYXlOYW1lPlJvbGVUZW1wbGF0ZSBJZCBDbGFpbTwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5Sb2xlIHRlbXBsYXRlIGlkIG9mIHRoZSBCdWlsdC1pbiBEaXJlY3RvcnkgUm9sZXMgdGhhdCB0aGUgdXNlciBpcyBhIG1lbWJlciBvZjwvYXV0aDpEZXNjcmlwdGlvbj48L2F1dGg6Q2xhaW1UeXBlPjwvZmVkOkNsYWltVHlwZXNPZmZlcmVkPjxmZWQ6U2VjdXJpdHlUb2tlblNlcnZpY2VFbmRwb2ludD48d3NhOkVuZHBvaW50UmVmZXJlbmNlIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj48d3NhOkFkZHJlc3M+aHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2Q1MTNkNWJjLTlmMzktNDA2OS1iYTlhLTFlZWFiMmNhNThjMS93c2ZlZDwvd3NhOkFkZHJlc3M+PC93c2E6RW5kcG9pbnRSZWZlcmVuY2U+PC9mZWQ6U2VjdXJpdHlUb2tlblNlcnZpY2VFbmRwb2ludD48ZmVkOlBhc3NpdmVSZXF1ZXN0b3JFbmRwb2ludD48d3NhOkVuZHBvaW50UmVmZXJlbmNlIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj48d3NhOkFkZHJlc3M+aHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2Q1MTNkNWJjLTlmMzktNDA2OS1iYTlhLTFlZWFiMmNhNThjMS93c2ZlZDwvd3NhOkFkZHJlc3M+PC93c2E6RW5kcG9pbnRSZWZlcmVuY2U+PC9mZWQ6UGFzc2l2ZVJlcXVlc3RvckVuZHBvaW50PjwvUm9sZURlc2NyaXB0b3I+PFJvbGVEZXNjcmlwdG9yIHhzaTp0eXBlPSJmZWQ6QXBwbGljYXRpb25TZXJ2aWNlVHlwZSIgcHJvdG9jb2xTdXBwb3J0RW51bWVyYXRpb249Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2ZlZGVyYXRpb24vMjAwNzA2IiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpmZWQ9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2ZlZGVyYXRpb24vMjAwNzA2Ij48S2V5RGVzY3JpcHRvciB1c2U9InNpZ25pbmciPjxLZXlJbmZvIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48WDUwOURhdGE+PFg1MDlDZXJ0aWZpY2F0ZT5NSUlDOERDQ0FkaWdBd0lCQWdJUVg1S1hnWVQvMkxORmVnaDVqVVFRQURBTkJna3Foa2lHOXcwQkFRc0ZBREEwTVRJd01BWURWUVFERXlsTmFXTnliM052Wm5RZ1FYcDFjbVVnUm1Wa1pYSmhkR1ZrSUZOVFR5QkRaWEowYVdacFkyRjBaVEFlRncweU5UQXhNVFl3TnpFM01EUmFGdzB5T0RBeE1UWXdOekUzTUROYU1EUXhNakF3QmdOVkJBTVRLVTFwWTNKdmMyOW1kQ0JCZW5WeVpTQkdaV1JsY21GMFpXUWdVMU5QSUVObGNuUnBabWxqWVhSbE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBbks4TUx0UjE4QnFTMWViS3l3OTZUM3hhTTc5MGFVZDBEejFOR094T21POFArTi9DR3VpcHlHandSL2xIZktEZXgxcXFjNEcwQzUraFZnL2pBSFNhd1EzdzlCS2tVcjBGOWI5QlUxbWVlZytyVjg3WHovbkswTEIyK1l3UU5pYXZFbXNHU3RMc01xY3cvQWE4Z0lFdEVMVWNWVERZYzBHblBrNmZqM3VEenhqQllLZmh3VCt5YUhQQ21UVGZkbXFLZ0h6bWJ2Tmg4TEdULzVuZm9UWXdGZU5MZVljbS9vRVBhbldQNTVGS3FDajFHbU55NmhNOHVXaG1WNkRBeTBLd0wrRkQ4eUVvUWVTcUhDeGl3dS9QdWFFdU9pMVprQzlLUzc5SlFsK2Q0OEtrR3YvNkRGa1RKNVQxUnRTTWdzVUhQZldDbUpSOGliMEdoaHVkeklYelFRSURBUUFCTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCaFpmZVRHemZYaSt5M1I3RFFnMjR2bHYwRzE0WTZxdG1scEpIQkZNNnRPeFhPSWRpOXlMZkVxK29Lck1PMmtrQzZrN3pyblpKZ254SHVwMXNFMkJqbHhGaHhpYXJ5cEI0NE4yL3EyRVprS21QM2dCeUIvS1VXWUM5YkI1ZGJnM3ZqTHFnYkkyMld0NE9HYW12QXRUOFNDbWZzV1NIYmNFYk5iSVdmK01oeHRvOXZzeUdaQ2FEZ1lWeFZ3V2cvRkhDVGlzdUVjc0xPcGppc0t0QkJHckFmbGdsTWdZN3Y1UThuaE9FVDBnWGJKV1MvYU1pYW1rTUFYWDRJVGwyc0gzZEZqMjNGR2tuVTVkRlI4SnprQjNEYkpPTHpvSkFVdEdWL0lOMS9lUG9UQXpYd0pLd3dsY2FTQWVHaXFwZ092cDRhQTNBRmR1eEQ1U2g5OG1mRTdKbzQ8L1g1MDlDZXJ0aWZpY2F0ZT48L1g1MDlEYXRhPjwvS2V5SW5mbz48L0tleURlc2NyaXB0b3I+PGZlZDpUYXJnZXRTY29wZXM+PHdzYTpFbmRwb2ludFJlZmVyZW5jZSB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+PHdzYTpBZGRyZXNzPmh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2Q1MTNkNWJjLTlmMzktNDA2OS1iYTlhLTFlZWFiMmNhNThjMS88L3dzYTpBZGRyZXNzPjwvd3NhOkVuZHBvaW50UmVmZXJlbmNlPjwvZmVkOlRhcmdldFNjb3Blcz48ZmVkOkFwcGxpY2F0aW9uU2VydmljZUVuZHBvaW50Pjx3c2E6RW5kcG9pbnRSZWZlcmVuY2UgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPjx3c2E6QWRkcmVzcz5odHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vZDUxM2Q1YmMtOWYzOS00MDY5LWJhOWEtMWVlYWIyY2E1OGMxL3dzZmVkPC93c2E6QWRkcmVzcz48L3dzYTpFbmRwb2ludFJlZmVyZW5jZT48L2ZlZDpBcHBsaWNhdGlvblNlcnZpY2VFbmRwb2ludD48ZmVkOlBhc3NpdmVSZXF1ZXN0b3JFbmRwb2ludD48d3NhOkVuZHBvaW50UmVmZXJlbmNlIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj48d3NhOkFkZHJlc3M+aHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2Q1MTNkNWJjLTlmMzktNDA2OS1iYTlhLTFlZWFiMmNhNThjMS93c2ZlZDwvd3NhOkFkZHJlc3M+PC93c2E6RW5kcG9pbnRSZWZlcmVuY2U+PC9mZWQ6UGFzc2l2ZVJlcXVlc3RvckVuZHBvaW50PjwvUm9sZURlc2NyaXB0b3I+PElEUFNTT0Rlc2NyaXB0b3IgcHJvdG9jb2xTdXBwb3J0RW51bWVyYXRpb249InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCI+PEtleURlc2NyaXB0b3IgdXNlPSJzaWduaW5nIj48S2V5SW5mbyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PFg1MDlEYXRhPjxYNTA5Q2VydGlmaWNhdGU+TUlJQzhEQ0NBZGlnQXdJQkFnSVFYNUtYZ1lULzJMTkZlZ2g1alVRUUFEQU5CZ2txaGtpRzl3MEJBUXNGQURBME1USXdNQVlEVlFRREV5bE5hV055YjNOdlpuUWdRWHAxY21VZ1JtVmtaWEpoZEdWa0lGTlRUeUJEWlhKMGFXWnBZMkYwWlRBZUZ3MHlOVEF4TVRZd056RTNNRFJhRncweU9EQXhNVFl3TnpFM01ETmFNRFF4TWpBd0JnTlZCQU1US1UxcFkzSnZjMjltZENCQmVuVnlaU0JHWldSbGNtRjBaV1FnVTFOUElFTmxjblJwWm1sallYUmxNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW5LOE1MdFIxOEJxUzFlYkt5dzk2VDN4YU03OTBhVWQwRHoxTkdPeE9tTzhQK04vQ0d1aXB5R2p3Ui9sSGZLRGV4MXFxYzRHMEM1K2hWZy9qQUhTYXdRM3c5QktrVXIwRjliOUJVMW1lZWcrclY4N1h6L25LMExCMitZd1FOaWF2RW1zR1N0THNNcWN3L0FhOGdJRXRFTFVjVlREWWMwR25QazZmajN1RHp4akJZS2Zod1QreWFIUENtVFRmZG1xS2dIem1idk5oOExHVC81bmZvVFl3RmVOTGVZY20vb0VQYW5XUDU1RktxQ2oxR21OeTZoTTh1V2htVjZEQXkwS3dMK0ZEOHlFb1FlU3FIQ3hpd3UvUHVhRXVPaTFaa0M5S1M3OUpRbCtkNDhLa0d2LzZERmtUSjVUMVJ0U01nc1VIUGZXQ21KUjhpYjBHaGh1ZHpJWHpRUUlEQVFBQk1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQmhaZmVUR3pmWGkreTNSN0RRZzI0dmx2MEcxNFk2cXRtbHBKSEJGTTZ0T3hYT0lkaTl5TGZFcStvS3JNTzJra0M2azd6cm5aSmdueEh1cDFzRTJCamx4Rmh4aWFyeXBCNDROMi9xMkVaa0ttUDNnQnlCL0tVV1lDOWJCNWRiZzN2akxxZ2JJMjJXdDRPR2FtdkF0VDhTQ21mc1dTSGJjRWJOYklXZitNaHh0bzl2c3lHWkNhRGdZVnhWd1dnL0ZIQ1Rpc3VFY3NMT3BqaXNLdEJCR3JBZmxnbE1nWTd2NVE4bmhPRVQwZ1hiSldTL2FNaWFta01BWFg0SVRsMnNIM2RGajIzRkdrblU1ZEZSOEp6a0IzRGJKT0x6b0pBVXRHVi9JTjEvZVBvVEF6WHdKS3d3bGNhU0FlR2lxcGdPdnA0YUEzQUZkdXhENVNoOThtZkU3Sm80PC9YNTA5Q2VydGlmaWNhdGU+PC9YNTA5RGF0YT48L0tleUluZm8+PC9LZXlEZXNjcmlwdG9yPjxTaW5nbGVMb2dvdXRTZXJ2aWNlIEJpbmRpbmc9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpiaW5kaW5nczpIVFRQLVJlZGlyZWN0IiBMb2NhdGlvbj0iaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2Q1MTNkNWJjLTlmMzktNDA2OS1iYTlhLTFlZWFiMmNhNThjMS9zYW1sMiIgLz48U2luZ2xlU2lnbk9uU2VydmljZSBCaW5kaW5nPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YmluZGluZ3M6SFRUUC1SZWRpcmVjdCIgTG9jYXRpb249Imh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS9kNTEzZDViYy05ZjM5LTQwNjktYmE5YS0xZWVhYjJjYTU4YzEvc2FtbDIiIC8+PFNpbmdsZVNpZ25PblNlcnZpY2UgQmluZGluZz0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmJpbmRpbmdzOkhUVFAtUE9TVCIgTG9jYXRpb249Imh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS9kNTEzZDViYy05ZjM5LTQwNjktYmE5YS0xZWVhYjJjYTU4YzEvc2FtbDIiIC8+PC9JRFBTU09EZXNjcmlwdG9yPjwvRW50aXR5RGVzY3JpcHRvcj4=" + another_x509_certificate = <<-EOF +-----BEGIN CERTIFICATE----- +MIIC8DCCAdigAwIBAgIQPCotiH/l8K1K6kBgL4mBfzANBgkqhkiG9w0BAQsFADA0MTIwMAYDVQQD +EylNaWNyb3NvZnQgQXp1cmUgRmVkZXJhdGVkIFNTTyBDZXJ0aWZpY2F0ZTAeFw0yNTEwMTUwNzE4 +MDZaFw0yODEwMTUwNzE3NTJaMDQxMjAwBgNVBAMTKU1pY3Jvc29mdCBBenVyZSBGZWRlcmF0ZWQg +U1NPIENlcnRpZmljYXRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA081XCuvEgqMN +ZY2XmOUPUBbX7QZsRZiACW3n2qDlntBzdIfT/PAmkv9fOoUhKFIOs4svo+ZNk547ASddcHGg71ZC +EOuSkUZKBc7q/s9Oo0iySAPbQtdYeIZ9R34w5j5FVKrvx+l+GbjXBiBKz31vIU5BcV6vALRJnw8G +MqiMib6I5UzqRwI9utexnlwRplHNEMg3K3U0OiHljTUocsbNs6NProi0n21k3I6q3xKxRF9LaPPx +YM9iL/Z3qc2JycIgSQRKfQlm8wzrY2ra+8xahvMgNNU7pflJuquc2TKbVK6iub4pHeojR6GOTxM6 +DOYJHyGhCUL6VN8ygDV/05QJsQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAjE19G2e0eLUD9dUJq +Wb0KB910F8Yj97zUmVHX6fWMwHknBhJP72G6aBbjp2Nd2XiRQSMeyMSccXv83PeLt4TZNlpRhU6/ +qJIcvmjkBZ3iql1xAzR/wNHo6N1Buk/cKg8AdN4xsy65UsE25JSmpRzrpIfIPRAHk7/yohKnmzvt +Q3Q3x2WHZUGoVzqx5Df/Qcj0t9uozhHX/jU/5bnlSQ1nuMUsTbnmIXMXGDvx8iaO5/0IsWHMLZlq +ouWo3+vw1vHoLA37XgDXXJURp8tPg70iEuB3j8LE8C1rPl0JWhL3NpPUeuIthzyJHT/uF/8hNA6g +qs39KP9jOtSzEzc1YhiX +-----END CERTIFICATE----- +EOF +} +` + +const testAccOrganizationExternalSamlIdentityProviderUpdate = ` +resource "tencentcloud_organization_external_saml_identity_provider" "example" { + zone_id = "z-1os7c9znogct" + encoded_metadata_document = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48RW50aXR5RGVzY3JpcHRvciBJRD0iXzU5MjY2N2UxLTE2MDItNDAwZC1hNTQwLThkMWMzZDUzMDNhYSIgZW50aXR5SUQ9Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2Q1MTNkNWJjLTlmMzktNDA2OS1iYTlhLTFlZWFiMmNhNThjMS8iIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bWV0YWRhdGEiPjxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxTaWduZWRJbmZvPjxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIiAvPjxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2IiAvPjxSZWZlcmVuY2UgVVJJPSIjXzU5MjY2N2UxLTE2MDItNDAwZC1hNTQwLThkMWMzZDUzMDNhYSI+PFRyYW5zZm9ybXM+PFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIiAvPjxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiIC8+PC9UcmFuc2Zvcm1zPjxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiIC8+PERpZ2VzdFZhbHVlPnNob1RkY1ZCaUJEOFgwM1l5dFc5QS9ZTzVSZUpLS2RGalBOQjN5OS9QNU09PC9EaWdlc3RWYWx1ZT48L1JlZmVyZW5jZT48L1NpZ25lZEluZm8+PFNpZ25hdHVyZVZhbHVlPmJ2MFR1WFJhVUdVeE1sdkNBL0diVWFuTlhGSFBTM05HQXVSb0s2ZlhCL1hjMWJSRlRtZWVhQ0tEa3JzYnBQUzg1VDZicFQxbDRBRGRCRm11TzhCdkliTTQzR0t1ZEFCZTZrVFl6Z3ZyOG5kQmVmZkNkbkYveUdOL1J3UXBZL2l3Q3JTVDlWUmRIYkdqc0RmcnNOSnFnRkpUWG1wNWZLczg1MldEb2FJcldFb0I5MC9DeUZJdUdEMmZSUFl0M0ZOOHpBUFpmR3ZsOGluZDUzTXlBV0xCcytJYXplSzFwK3VQMlREUFpCM3Eyem40V0QzZmxtWVBmUTgwdEd3eVNmU09hNG1iUlpKajRxRnBHL0R1ejR0aXNGSENlaUtOcW5lYnVrallKZEg1K3RWekREbXlOME9BMG5tYk9TendhOFhGcVU2TnVaLzIrWmpkb0tVczBsRnpaZz09PC9TaWduYXR1cmVWYWx1ZT48ZHM6S2V5SW5mbyB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PGRzOlg1MDlEYXRhPjxkczpYNTA5Q2VydGlmaWNhdGU+TUlJQzhEQ0NBZGlnQXdJQkFnSVFYNUtYZ1lULzJMTkZlZ2g1alVRUUFEQU5CZ2txaGtpRzl3MEJBUXNGQURBME1USXdNQVlEVlFRREV5bE5hV055YjNOdlpuUWdRWHAxY21VZ1JtVmtaWEpoZEdWa0lGTlRUeUJEWlhKMGFXWnBZMkYwWlRBZUZ3MHlOVEF4TVRZd056RTNNRFJhRncweU9EQXhNVFl3TnpFM01ETmFNRFF4TWpBd0JnTlZCQU1US1UxcFkzSnZjMjltZENCQmVuVnlaU0JHWldSbGNtRjBaV1FnVTFOUElFTmxjblJwWm1sallYUmxNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW5LOE1MdFIxOEJxUzFlYkt5dzk2VDN4YU03OTBhVWQwRHoxTkdPeE9tTzhQK04vQ0d1aXB5R2p3Ui9sSGZLRGV4MXFxYzRHMEM1K2hWZy9qQUhTYXdRM3c5QktrVXIwRjliOUJVMW1lZWcrclY4N1h6L25LMExCMitZd1FOaWF2RW1zR1N0THNNcWN3L0FhOGdJRXRFTFVjVlREWWMwR25QazZmajN1RHp4akJZS2Zod1QreWFIUENtVFRmZG1xS2dIem1idk5oOExHVC81bmZvVFl3RmVOTGVZY20vb0VQYW5XUDU1RktxQ2oxR21OeTZoTTh1V2htVjZEQXkwS3dMK0ZEOHlFb1FlU3FIQ3hpd3UvUHVhRXVPaTFaa0M5S1M3OUpRbCtkNDhLa0d2LzZERmtUSjVUMVJ0U01nc1VIUGZXQ21KUjhpYjBHaGh1ZHpJWHpRUUlEQVFBQk1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQmhaZmVUR3pmWGkreTNSN0RRZzI0dmx2MEcxNFk2cXRtbHBKSEJGTTZ0T3hYT0lkaTl5TGZFcStvS3JNTzJra0M2azd6cm5aSmdueEh1cDFzRTJCamx4Rmh4aWFyeXBCNDROMi9xMkVaa0ttUDNnQnlCL0tVV1lDOWJCNWRiZzN2akxxZ2JJMjJXdDRPR2FtdkF0VDhTQ21mc1dTSGJjRWJOYklXZitNaHh0bzl2c3lHWkNhRGdZVnhWd1dnL0ZIQ1Rpc3VFY3NMT3BqaXNLdEJCR3JBZmxnbE1nWTd2NVE4bmhPRVQwZ1hiSldTL2FNaWFta01BWFg0SVRsMnNIM2RGajIzRkdrblU1ZEZSOEp6a0IzRGJKT0x6b0pBVXRHVi9JTjEvZVBvVEF6WHdKS3d3bGNhU0FlR2lxcGdPdnA0YUEzQUZkdXhENVNoOThtZkU3Sm80PC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48L2RzOktleUluZm8+PC9TaWduYXR1cmU+PFJvbGVEZXNjcmlwdG9yIHhzaTp0eXBlPSJmZWQ6U2VjdXJpdHlUb2tlblNlcnZpY2VUeXBlIiBwcm90b2NvbFN1cHBvcnRFbnVtZXJhdGlvbj0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvZmVkZXJhdGlvbi8yMDA3MDYiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmZlZD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvZmVkZXJhdGlvbi8yMDA3MDYiPjxLZXlEZXNjcmlwdG9yIHVzZT0ic2lnbmluZyI+PEtleUluZm8geG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxYNTA5RGF0YT48WDUwOUNlcnRpZmljYXRlPk1JSUM4RENDQWRpZ0F3SUJBZ0lRWDVLWGdZVC8yTE5GZWdoNWpVUVFBREFOQmdrcWhraUc5dzBCQVFzRkFEQTBNVEl3TUFZRFZRUURFeWxOYVdOeWIzTnZablFnUVhwMWNtVWdSbVZrWlhKaGRHVmtJRk5UVHlCRFpYSjBhV1pwWTJGMFpUQWVGdzB5TlRBeE1UWXdOekUzTURSYUZ3MHlPREF4TVRZd056RTNNRE5hTURReE1qQXdCZ05WQkFNVEtVMXBZM0p2YzI5bWRDQkJlblZ5WlNCR1pXUmxjbUYwWldRZ1UxTlBJRU5sY25ScFptbGpZWFJsTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFuSzhNTHRSMThCcVMxZWJLeXc5NlQzeGFNNzkwYVVkMER6MU5HT3hPbU84UCtOL0NHdWlweUdqd1IvbEhmS0RleDFxcWM0RzBDNStoVmcvakFIU2F3UTN3OUJLa1VyMEY5YjlCVTFtZWVnK3JWODdYei9uSzBMQjIrWXdRTmlhdkVtc0dTdExzTXFjdy9BYThnSUV0RUxVY1ZURFljMEduUGs2ZmozdUR6eGpCWUtmaHdUK3lhSFBDbVRUZmRtcUtnSHptYnZOaDhMR1QvNW5mb1RZd0ZlTkxlWWNtL29FUGFuV1A1NUZLcUNqMUdtTnk2aE04dVdobVY2REF5MEt3TCtGRDh5RW9RZVNxSEN4aXd1L1B1YUV1T2kxWmtDOUtTNzlKUWwrZDQ4S2tHdi82REZrVEo1VDFSdFNNZ3NVSFBmV0NtSlI4aWIwR2hodWR6SVh6UVFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUJoWmZlVEd6ZlhpK3kzUjdEUWcyNHZsdjBHMTRZNnF0bWxwSkhCRk02dE94WE9JZGk5eUxmRXErb0tyTU8ya2tDNms3enJuWkpnbnhIdXAxc0UyQmpseEZoeGlhcnlwQjQ0TjIvcTJFWmtLbVAzZ0J5Qi9LVVdZQzliQjVkYmczdmpMcWdiSTIyV3Q0T0dhbXZBdFQ4U0NtZnNXU0hiY0ViTmJJV2YrTWh4dG85dnN5R1pDYURnWVZ4VndXZy9GSENUaXN1RWNzTE9wamlzS3RCQkdyQWZsZ2xNZ1k3djVROG5oT0VUMGdYYkpXUy9hTWlhbWtNQVhYNElUbDJzSDNkRmoyM0ZHa25VNWRGUjhKemtCM0RiSk9Mem9KQVV0R1YvSU4xL2VQb1RBelh3Skt3d2xjYVNBZUdpcXBnT3ZwNGFBM0FGZHV4RDVTaDk4bWZFN0pvNDwvWDUwOUNlcnRpZmljYXRlPjwvWDUwOURhdGE+PC9LZXlJbmZvPjwvS2V5RGVzY3JpcHRvcj48ZmVkOkNsYWltVHlwZXNPZmZlcmVkPjxhdXRoOkNsYWltVHlwZSBVcmk9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiIHhtbG5zOmF1dGg9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2F1dGhvcml6YXRpb24vMjAwNzA2Ij48YXV0aDpEaXNwbGF5TmFtZT5OYW1lPC9hdXRoOkRpc3BsYXlOYW1lPjxhdXRoOkRlc2NyaXB0aW9uPlRoZSBtdXRhYmxlIGRpc3BsYXkgbmFtZSBvZiB0aGUgdXNlci48L2F1dGg6RGVzY3JpcHRpb24+PC9hdXRoOkNsYWltVHlwZT48YXV0aDpDbGFpbVR5cGUgVXJpPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciIgeG1sbnM6YXV0aD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvYXV0aG9yaXphdGlvbi8yMDA3MDYiPjxhdXRoOkRpc3BsYXlOYW1lPlN1YmplY3Q8L2F1dGg6RGlzcGxheU5hbWU+PGF1dGg6RGVzY3JpcHRpb24+QW4gaW1tdXRhYmxlLCBnbG9iYWxseSB1bmlxdWUsIG5vbi1yZXVzYWJsZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHRoYXQgaXMgdW5pcXVlIHRvIHRoZSBhcHBsaWNhdGlvbiBmb3Igd2hpY2ggYSB0b2tlbiBpcyBpc3N1ZWQuPC9hdXRoOkRlc2NyaXB0aW9uPjwvYXV0aDpDbGFpbVR5cGU+PGF1dGg6Q2xhaW1UeXBlIFVyaT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvZ2l2ZW5uYW1lIiB4bWxuczphdXRoPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c2ZlZC9hdXRob3JpemF0aW9uLzIwMDcwNiI+PGF1dGg6RGlzcGxheU5hbWU+R2l2ZW4gTmFtZTwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5GaXJzdCBuYW1lIG9mIHRoZSB1c2VyLjwvYXV0aDpEZXNjcmlwdGlvbj48L2F1dGg6Q2xhaW1UeXBlPjxhdXRoOkNsYWltVHlwZSBVcmk9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL3N1cm5hbWUiIHhtbG5zOmF1dGg9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2F1dGhvcml6YXRpb24vMjAwNzA2Ij48YXV0aDpEaXNwbGF5TmFtZT5TdXJuYW1lPC9hdXRoOkRpc3BsYXlOYW1lPjxhdXRoOkRlc2NyaXB0aW9uPkxhc3QgbmFtZSBvZiB0aGUgdXNlci48L2F1dGg6RGVzY3JpcHRpb24+PC9hdXRoOkNsYWltVHlwZT48YXV0aDpDbGFpbVR5cGUgVXJpPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2lkZW50aXR5L2NsYWltcy9kaXNwbGF5bmFtZSIgeG1sbnM6YXV0aD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvYXV0aG9yaXphdGlvbi8yMDA3MDYiPjxhdXRoOkRpc3BsYXlOYW1lPkRpc3BsYXkgTmFtZTwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5EaXNwbGF5IG5hbWUgb2YgdGhlIHVzZXIuPC9hdXRoOkRlc2NyaXB0aW9uPjwvYXV0aDpDbGFpbVR5cGU+PGF1dGg6Q2xhaW1UeXBlIFVyaT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9pZGVudGl0eS9jbGFpbXMvbmlja25hbWUiIHhtbG5zOmF1dGg9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2F1dGhvcml6YXRpb24vMjAwNzA2Ij48YXV0aDpEaXNwbGF5TmFtZT5OaWNrIE5hbWU8L2F1dGg6RGlzcGxheU5hbWU+PGF1dGg6RGVzY3JpcHRpb24+TmljayBuYW1lIG9mIHRoZSB1c2VyLjwvYXV0aDpEZXNjcmlwdGlvbj48L2F1dGg6Q2xhaW1UeXBlPjxhdXRoOkNsYWltVHlwZSBVcmk9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvYXV0aGVudGljYXRpb25pbnN0YW50IiB4bWxuczphdXRoPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c2ZlZC9hdXRob3JpemF0aW9uLzIwMDcwNiI+PGF1dGg6RGlzcGxheU5hbWU+QXV0aGVudGljYXRpb24gSW5zdGFudDwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5UaGUgdGltZSAoVVRDKSB3aGVuIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQgdG8gV2luZG93cyBBenVyZSBBY3RpdmUgRGlyZWN0b3J5LjwvYXV0aDpEZXNjcmlwdGlvbj48L2F1dGg6Q2xhaW1UeXBlPjxhdXRoOkNsYWltVHlwZSBVcmk9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvYXV0aGVudGljYXRpb25tZXRob2QiIHhtbG5zOmF1dGg9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2F1dGhvcml6YXRpb24vMjAwNzA2Ij48YXV0aDpEaXNwbGF5TmFtZT5BdXRoZW50aWNhdGlvbiBNZXRob2Q8L2F1dGg6RGlzcGxheU5hbWU+PGF1dGg6RGVzY3JpcHRpb24+VGhlIG1ldGhvZCB0aGF0IFdpbmRvd3MgQXp1cmUgQWN0aXZlIERpcmVjdG9yeSB1c2VzIHRvIGF1dGhlbnRpY2F0ZSB1c2Vycy48L2F1dGg6RGVzY3JpcHRpb24+PC9hdXRoOkNsYWltVHlwZT48YXV0aDpDbGFpbVR5cGUgVXJpPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2lkZW50aXR5L2NsYWltcy9vYmplY3RpZGVudGlmaWVyIiB4bWxuczphdXRoPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c2ZlZC9hdXRob3JpemF0aW9uLzIwMDcwNiI+PGF1dGg6RGlzcGxheU5hbWU+T2JqZWN0SWRlbnRpZmllcjwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5QcmltYXJ5IGlkZW50aWZpZXIgZm9yIHRoZSB1c2VyIGluIHRoZSBkaXJlY3RvcnkuIEltbXV0YWJsZSwgZ2xvYmFsbHkgdW5pcXVlLCBub24tcmV1c2FibGUuPC9hdXRoOkRlc2NyaXB0aW9uPjwvYXV0aDpDbGFpbVR5cGU+PGF1dGg6Q2xhaW1UeXBlIFVyaT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9pZGVudGl0eS9jbGFpbXMvdGVuYW50aWQiIHhtbG5zOmF1dGg9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2F1dGhvcml6YXRpb24vMjAwNzA2Ij48YXV0aDpEaXNwbGF5TmFtZT5UZW5hbnRJZDwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5JZGVudGlmaWVyIGZvciB0aGUgdXNlcidzIHRlbmFudC48L2F1dGg6RGVzY3JpcHRpb24+PC9hdXRoOkNsYWltVHlwZT48YXV0aDpDbGFpbVR5cGUgVXJpPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2lkZW50aXR5L2NsYWltcy9pZGVudGl0eXByb3ZpZGVyIiB4bWxuczphdXRoPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c2ZlZC9hdXRob3JpemF0aW9uLzIwMDcwNiI+PGF1dGg6RGlzcGxheU5hbWU+SWRlbnRpdHlQcm92aWRlcjwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5JZGVudGl0eSBwcm92aWRlciBmb3IgdGhlIHVzZXIuPC9hdXRoOkRlc2NyaXB0aW9uPjwvYXV0aDpDbGFpbVR5cGU+PGF1dGg6Q2xhaW1UeXBlIFVyaT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvZW1haWxhZGRyZXNzIiB4bWxuczphdXRoPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c2ZlZC9hdXRob3JpemF0aW9uLzIwMDcwNiI+PGF1dGg6RGlzcGxheU5hbWU+RW1haWw8L2F1dGg6RGlzcGxheU5hbWU+PGF1dGg6RGVzY3JpcHRpb24+RW1haWwgYWRkcmVzcyBvZiB0aGUgdXNlci48L2F1dGg6RGVzY3JpcHRpb24+PC9hdXRoOkNsYWltVHlwZT48YXV0aDpDbGFpbVR5cGUgVXJpPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL2dyb3VwcyIgeG1sbnM6YXV0aD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvYXV0aG9yaXphdGlvbi8yMDA3MDYiPjxhdXRoOkRpc3BsYXlOYW1lPkdyb3VwczwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5Hcm91cHMgb2YgdGhlIHVzZXIuPC9hdXRoOkRlc2NyaXB0aW9uPjwvYXV0aDpDbGFpbVR5cGU+PGF1dGg6Q2xhaW1UeXBlIFVyaT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9pZGVudGl0eS9jbGFpbXMvYWNjZXNzdG9rZW4iIHhtbG5zOmF1dGg9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2F1dGhvcml6YXRpb24vMjAwNzA2Ij48YXV0aDpEaXNwbGF5TmFtZT5FeHRlcm5hbCBBY2Nlc3MgVG9rZW48L2F1dGg6RGlzcGxheU5hbWU+PGF1dGg6RGVzY3JpcHRpb24+QWNjZXNzIHRva2VuIGlzc3VlZCBieSBleHRlcm5hbCBpZGVudGl0eSBwcm92aWRlci48L2F1dGg6RGVzY3JpcHRpb24+PC9hdXRoOkNsYWltVHlwZT48YXV0aDpDbGFpbVR5cGUgVXJpPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL2V4cGlyYXRpb24iIHhtbG5zOmF1dGg9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2F1dGhvcml6YXRpb24vMjAwNzA2Ij48YXV0aDpEaXNwbGF5TmFtZT5FeHRlcm5hbCBBY2Nlc3MgVG9rZW4gRXhwaXJhdGlvbjwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5VVEMgZXhwaXJhdGlvbiB0aW1lIG9mIGFjY2VzcyB0b2tlbiBpc3N1ZWQgYnkgZXh0ZXJuYWwgaWRlbnRpdHkgcHJvdmlkZXIuPC9hdXRoOkRlc2NyaXB0aW9uPjwvYXV0aDpDbGFpbVR5cGU+PGF1dGg6Q2xhaW1UeXBlIFVyaT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9pZGVudGl0eS9jbGFpbXMvb3BlbmlkMl9pZCIgeG1sbnM6YXV0aD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvYXV0aG9yaXphdGlvbi8yMDA3MDYiPjxhdXRoOkRpc3BsYXlOYW1lPkV4dGVybmFsIE9wZW5JRCAyLjAgSWRlbnRpZmllcjwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5PcGVuSUQgMi4wIGlkZW50aWZpZXIgaXNzdWVkIGJ5IGV4dGVybmFsIGlkZW50aXR5IHByb3ZpZGVyLjwvYXV0aDpEZXNjcmlwdGlvbj48L2F1dGg6Q2xhaW1UeXBlPjxhdXRoOkNsYWltVHlwZSBVcmk9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vY2xhaW1zL2dyb3Vwcy5saW5rIiB4bWxuczphdXRoPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c2ZlZC9hdXRob3JpemF0aW9uLzIwMDcwNiI+PGF1dGg6RGlzcGxheU5hbWU+R3JvdXBzT3ZlcmFnZUNsYWltPC9hdXRoOkRpc3BsYXlOYW1lPjxhdXRoOkRlc2NyaXB0aW9uPklzc3VlZCB3aGVuIG51bWJlciBvZiB1c2VyJ3MgZ3JvdXAgY2xhaW1zIGV4Y2VlZHMgcmV0dXJuIGxpbWl0LjwvYXV0aDpEZXNjcmlwdGlvbj48L2F1dGg6Q2xhaW1UeXBlPjxhdXRoOkNsYWltVHlwZSBVcmk9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSIgeG1sbnM6YXV0aD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvYXV0aG9yaXphdGlvbi8yMDA3MDYiPjxhdXRoOkRpc3BsYXlOYW1lPlJvbGUgQ2xhaW08L2F1dGg6RGlzcGxheU5hbWU+PGF1dGg6RGVzY3JpcHRpb24+Um9sZXMgdGhhdCB0aGUgdXNlciBvciBTZXJ2aWNlIFByaW5jaXBhbCBpcyBhdHRhY2hlZCB0bzwvYXV0aDpEZXNjcmlwdGlvbj48L2F1dGg6Q2xhaW1UeXBlPjxhdXRoOkNsYWltVHlwZSBVcmk9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvd2lkcyIgeG1sbnM6YXV0aD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NmZWQvYXV0aG9yaXphdGlvbi8yMDA3MDYiPjxhdXRoOkRpc3BsYXlOYW1lPlJvbGVUZW1wbGF0ZSBJZCBDbGFpbTwvYXV0aDpEaXNwbGF5TmFtZT48YXV0aDpEZXNjcmlwdGlvbj5Sb2xlIHRlbXBsYXRlIGlkIG9mIHRoZSBCdWlsdC1pbiBEaXJlY3RvcnkgUm9sZXMgdGhhdCB0aGUgdXNlciBpcyBhIG1lbWJlciBvZjwvYXV0aDpEZXNjcmlwdGlvbj48L2F1dGg6Q2xhaW1UeXBlPjwvZmVkOkNsYWltVHlwZXNPZmZlcmVkPjxmZWQ6U2VjdXJpdHlUb2tlblNlcnZpY2VFbmRwb2ludD48d3NhOkVuZHBvaW50UmVmZXJlbmNlIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj48d3NhOkFkZHJlc3M+aHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2Q1MTNkNWJjLTlmMzktNDA2OS1iYTlhLTFlZWFiMmNhNThjMS93c2ZlZDwvd3NhOkFkZHJlc3M+PC93c2E6RW5kcG9pbnRSZWZlcmVuY2U+PC9mZWQ6U2VjdXJpdHlUb2tlblNlcnZpY2VFbmRwb2ludD48ZmVkOlBhc3NpdmVSZXF1ZXN0b3JFbmRwb2ludD48d3NhOkVuZHBvaW50UmVmZXJlbmNlIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj48d3NhOkFkZHJlc3M+aHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2Q1MTNkNWJjLTlmMzktNDA2OS1iYTlhLTFlZWFiMmNhNThjMS93c2ZlZDwvd3NhOkFkZHJlc3M+PC93c2E6RW5kcG9pbnRSZWZlcmVuY2U+PC9mZWQ6UGFzc2l2ZVJlcXVlc3RvckVuZHBvaW50PjwvUm9sZURlc2NyaXB0b3I+PFJvbGVEZXNjcmlwdG9yIHhzaTp0eXBlPSJmZWQ6QXBwbGljYXRpb25TZXJ2aWNlVHlwZSIgcHJvdG9jb2xTdXBwb3J0RW51bWVyYXRpb249Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2ZlZGVyYXRpb24vMjAwNzA2IiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpmZWQ9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzZmVkL2ZlZGVyYXRpb24vMjAwNzA2Ij48S2V5RGVzY3JpcHRvciB1c2U9InNpZ25pbmciPjxLZXlJbmZvIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48WDUwOURhdGE+PFg1MDlDZXJ0aWZpY2F0ZT5NSUlDOERDQ0FkaWdBd0lCQWdJUVg1S1hnWVQvMkxORmVnaDVqVVFRQURBTkJna3Foa2lHOXcwQkFRc0ZBREEwTVRJd01BWURWUVFERXlsTmFXTnliM052Wm5RZ1FYcDFjbVVnUm1Wa1pYSmhkR1ZrSUZOVFR5QkRaWEowYVdacFkyRjBaVEFlRncweU5UQXhNVFl3TnpFM01EUmFGdzB5T0RBeE1UWXdOekUzTUROYU1EUXhNakF3QmdOVkJBTVRLVTFwWTNKdmMyOW1kQ0JCZW5WeVpTQkdaV1JsY21GMFpXUWdVMU5QSUVObGNuUnBabWxqWVhSbE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBbks4TUx0UjE4QnFTMWViS3l3OTZUM3hhTTc5MGFVZDBEejFOR094T21POFArTi9DR3VpcHlHandSL2xIZktEZXgxcXFjNEcwQzUraFZnL2pBSFNhd1EzdzlCS2tVcjBGOWI5QlUxbWVlZytyVjg3WHovbkswTEIyK1l3UU5pYXZFbXNHU3RMc01xY3cvQWE4Z0lFdEVMVWNWVERZYzBHblBrNmZqM3VEenhqQllLZmh3VCt5YUhQQ21UVGZkbXFLZ0h6bWJ2Tmg4TEdULzVuZm9UWXdGZU5MZVljbS9vRVBhbldQNTVGS3FDajFHbU55NmhNOHVXaG1WNkRBeTBLd0wrRkQ4eUVvUWVTcUhDeGl3dS9QdWFFdU9pMVprQzlLUzc5SlFsK2Q0OEtrR3YvNkRGa1RKNVQxUnRTTWdzVUhQZldDbUpSOGliMEdoaHVkeklYelFRSURBUUFCTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCaFpmZVRHemZYaSt5M1I3RFFnMjR2bHYwRzE0WTZxdG1scEpIQkZNNnRPeFhPSWRpOXlMZkVxK29Lck1PMmtrQzZrN3pyblpKZ254SHVwMXNFMkJqbHhGaHhpYXJ5cEI0NE4yL3EyRVprS21QM2dCeUIvS1VXWUM5YkI1ZGJnM3ZqTHFnYkkyMld0NE9HYW12QXRUOFNDbWZzV1NIYmNFYk5iSVdmK01oeHRvOXZzeUdaQ2FEZ1lWeFZ3V2cvRkhDVGlzdUVjc0xPcGppc0t0QkJHckFmbGdsTWdZN3Y1UThuaE9FVDBnWGJKV1MvYU1pYW1rTUFYWDRJVGwyc0gzZEZqMjNGR2tuVTVkRlI4SnprQjNEYkpPTHpvSkFVdEdWL0lOMS9lUG9UQXpYd0pLd3dsY2FTQWVHaXFwZ092cDRhQTNBRmR1eEQ1U2g5OG1mRTdKbzQ8L1g1MDlDZXJ0aWZpY2F0ZT48L1g1MDlEYXRhPjwvS2V5SW5mbz48L0tleURlc2NyaXB0b3I+PGZlZDpUYXJnZXRTY29wZXM+PHdzYTpFbmRwb2ludFJlZmVyZW5jZSB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+PHdzYTpBZGRyZXNzPmh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2Q1MTNkNWJjLTlmMzktNDA2OS1iYTlhLTFlZWFiMmNhNThjMS88L3dzYTpBZGRyZXNzPjwvd3NhOkVuZHBvaW50UmVmZXJlbmNlPjwvZmVkOlRhcmdldFNjb3Blcz48ZmVkOkFwcGxpY2F0aW9uU2VydmljZUVuZHBvaW50Pjx3c2E6RW5kcG9pbnRSZWZlcmVuY2UgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPjx3c2E6QWRkcmVzcz5odHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vZDUxM2Q1YmMtOWYzOS00MDY5LWJhOWEtMWVlYWIyY2E1OGMxL3dzZmVkPC93c2E6QWRkcmVzcz48L3dzYTpFbmRwb2ludFJlZmVyZW5jZT48L2ZlZDpBcHBsaWNhdGlvblNlcnZpY2VFbmRwb2ludD48ZmVkOlBhc3NpdmVSZXF1ZXN0b3JFbmRwb2ludD48d3NhOkVuZHBvaW50UmVmZXJlbmNlIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj48d3NhOkFkZHJlc3M+aHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2Q1MTNkNWJjLTlmMzktNDA2OS1iYTlhLTFlZWFiMmNhNThjMS93c2ZlZDwvd3NhOkFkZHJlc3M+PC93c2E6RW5kcG9pbnRSZWZlcmVuY2U+PC9mZWQ6UGFzc2l2ZVJlcXVlc3RvckVuZHBvaW50PjwvUm9sZURlc2NyaXB0b3I+PElEUFNTT0Rlc2NyaXB0b3IgcHJvdG9jb2xTdXBwb3J0RW51bWVyYXRpb249InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCI+PEtleURlc2NyaXB0b3IgdXNlPSJzaWduaW5nIj48S2V5SW5mbyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PFg1MDlEYXRhPjxYNTA5Q2VydGlmaWNhdGU+TUlJQzhEQ0NBZGlnQXdJQkFnSVFYNUtYZ1lULzJMTkZlZ2g1alVRUUFEQU5CZ2txaGtpRzl3MEJBUXNGQURBME1USXdNQVlEVlFRREV5bE5hV055YjNOdlpuUWdRWHAxY21VZ1JtVmtaWEpoZEdWa0lGTlRUeUJEWlhKMGFXWnBZMkYwWlRBZUZ3MHlOVEF4TVRZd056RTNNRFJhRncweU9EQXhNVFl3TnpFM01ETmFNRFF4TWpBd0JnTlZCQU1US1UxcFkzSnZjMjltZENCQmVuVnlaU0JHWldSbGNtRjBaV1FnVTFOUElFTmxjblJwWm1sallYUmxNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW5LOE1MdFIxOEJxUzFlYkt5dzk2VDN4YU03OTBhVWQwRHoxTkdPeE9tTzhQK04vQ0d1aXB5R2p3Ui9sSGZLRGV4MXFxYzRHMEM1K2hWZy9qQUhTYXdRM3c5QktrVXIwRjliOUJVMW1lZWcrclY4N1h6L25LMExCMitZd1FOaWF2RW1zR1N0THNNcWN3L0FhOGdJRXRFTFVjVlREWWMwR25QazZmajN1RHp4akJZS2Zod1QreWFIUENtVFRmZG1xS2dIem1idk5oOExHVC81bmZvVFl3RmVOTGVZY20vb0VQYW5XUDU1RktxQ2oxR21OeTZoTTh1V2htVjZEQXkwS3dMK0ZEOHlFb1FlU3FIQ3hpd3UvUHVhRXVPaTFaa0M5S1M3OUpRbCtkNDhLa0d2LzZERmtUSjVUMVJ0U01nc1VIUGZXQ21KUjhpYjBHaGh1ZHpJWHpRUUlEQVFBQk1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQmhaZmVUR3pmWGkreTNSN0RRZzI0dmx2MEcxNFk2cXRtbHBKSEJGTTZ0T3hYT0lkaTl5TGZFcStvS3JNTzJra0M2azd6cm5aSmdueEh1cDFzRTJCamx4Rmh4aWFyeXBCNDROMi9xMkVaa0ttUDNnQnlCL0tVV1lDOWJCNWRiZzN2akxxZ2JJMjJXdDRPR2FtdkF0VDhTQ21mc1dTSGJjRWJOYklXZitNaHh0bzl2c3lHWkNhRGdZVnhWd1dnL0ZIQ1Rpc3VFY3NMT3BqaXNLdEJCR3JBZmxnbE1nWTd2NVE4bmhPRVQwZ1hiSldTL2FNaWFta01BWFg0SVRsMnNIM2RGajIzRkdrblU1ZEZSOEp6a0IzRGJKT0x6b0pBVXRHVi9JTjEvZVBvVEF6WHdKS3d3bGNhU0FlR2lxcGdPdnA0YUEzQUZkdXhENVNoOThtZkU3Sm80PC9YNTA5Q2VydGlmaWNhdGU+PC9YNTA5RGF0YT48L0tleUluZm8+PC9LZXlEZXNjcmlwdG9yPjxTaW5nbGVMb2dvdXRTZXJ2aWNlIEJpbmRpbmc9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpiaW5kaW5nczpIVFRQLVJlZGlyZWN0IiBMb2NhdGlvbj0iaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2Q1MTNkNWJjLTlmMzktNDA2OS1iYTlhLTFlZWFiMmNhNThjMS9zYW1sMiIgLz48U2luZ2xlU2lnbk9uU2VydmljZSBCaW5kaW5nPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YmluZGluZ3M6SFRUUC1SZWRpcmVjdCIgTG9jYXRpb249Imh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS9kNTEzZDViYy05ZjM5LTQwNjktYmE5YS0xZWVhYjJjYTU4YzEvc2FtbDIiIC8+PFNpbmdsZVNpZ25PblNlcnZpY2UgQmluZGluZz0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmJpbmRpbmdzOkhUVFAtUE9TVCIgTG9jYXRpb249Imh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS9kNTEzZDViYy05ZjM5LTQwNjktYmE5YS0xZWVhYjJjYTU4YzEvc2FtbDIiIC8+PC9JRFBTU09EZXNjcmlwdG9yPjwvRW50aXR5RGVzY3JpcHRvcj4=" +} +` diff --git a/tencentcloud/services/tco/service_tencentcloud_organization.go b/tencentcloud/services/tco/service_tencentcloud_organization.go index 393f781fc2..1f129c0c2b 100644 --- a/tencentcloud/services/tco/service_tencentcloud_organization.go +++ b/tencentcloud/services/tco/service_tencentcloud_organization.go @@ -2581,3 +2581,85 @@ func (me *OrganizationService) DescribeOrganizationMembersAuthPolicyAttachmentBy return } + +func (me *OrganizationService) DescribeOrganizationExternalSamlIdpCertificateById(ctx context.Context, zoneId, certificateId string) (ret *organization.SAMLIdPCertificate, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := organization.NewListExternalSAMLIdPCertificatesRequest() + response := organization.NewListExternalSAMLIdPCertificatesResponse() + request.ZoneId = &zoneId + + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error()) + } + }() + + errRet = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseOrganizationClient().ListExternalSAMLIdPCertificates(request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil || result.Response.SAMLIdPCertificates == nil || len(result.Response.SAMLIdPCertificates) == 0 { + return resource.NonRetryableError(fmt.Errorf("List external saml idp certificate failed, Response is nil.")) + } + + response = result + return nil + }) + + if errRet != nil { + return + } + + for _, item := range response.Response.SAMLIdPCertificates { + if item.CertificateId != nil && *item.CertificateId == certificateId { + ret = item + break + } + } + + return +} + +func (me *OrganizationService) DescribeOrganizationExternalSamlIdentityProviderById(ctx context.Context, zoneId string) (ret *organization.SAMLIdentityProviderConfiguration, errRet error) { + logId := tccommon.GetLogId(ctx) + + request := organization.NewGetExternalSAMLIdentityProviderRequest() + response := organization.NewGetExternalSAMLIdentityProviderResponse() + request.ZoneId = &zoneId + + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error()) + } + }() + + errRet = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + ratelimit.Check(request.GetAction()) + result, e := me.client.UseOrganizationClient().GetExternalSAMLIdentityProvider(request) + if e != nil { + return tccommon.RetryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if result == nil || result.Response == nil { + return resource.NonRetryableError(fmt.Errorf("Get external saml identity provider failed, Response is nil.")) + } + + response = result + return nil + }) + + if errRet != nil { + return + } + + ret = response.Response.SAMLIdentityProviderConfiguration + return +} diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go index 6267a8ed4b..0494ae0b6c 100644 --- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go @@ -265,7 +265,7 @@ func CompleteCommonParams(request Request, region string, requestClient string) params["Action"] = request.GetAction() params["Timestamp"] = strconv.FormatInt(time.Now().Unix(), 10) params["Nonce"] = strconv.Itoa(rand.Int()) - params["RequestClient"] = "SDK_GO_1.1.48" + params["RequestClient"] = "SDK_GO_1.1.49" if requestClient != "" { params["RequestClient"] += ": " + requestClient } diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331/client.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331/client.go index d76a4bf74e..2202c8b523 100644 --- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331/client.go +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331/client.go @@ -136,6 +136,8 @@ func NewAddExternalSAMLIdPCertificateResponse() (response *AddExternalSAMLIdPCer // 可能返回的错误码: // FAILEDOPERATION_DBOPERATIONERROR = "FailedOperation.DBOperationError" // FAILEDOPERATION_X509CERTIFICATEALREADYEXIST = "FailedOperation.X509CertificateAlreadyExist" +// FAILEDOPERATION_X509CERTIFICATELIMITEXCEEDED = "FailedOperation.X509CertificateLimitExceeded" +// FAILEDOPERATION_X509CERTIFICATEMINIMUMREQUIRED = "FailedOperation.X509CertificateMinimumRequired" // FAILEDOPERATION_X509CERTIFICATEPARSINGFAILED = "FailedOperation.X509CertificateParsingFailed" // INTERNALERROR = "InternalError" // INVALIDPARAMETERVALUE_X509CERTIFICATEFORMATERROR = "InvalidParameterValue.X509CertificateFormatError" @@ -149,6 +151,8 @@ func (c *Client) AddExternalSAMLIdPCertificate(request *AddExternalSAMLIdPCertif // 可能返回的错误码: // FAILEDOPERATION_DBOPERATIONERROR = "FailedOperation.DBOperationError" // FAILEDOPERATION_X509CERTIFICATEALREADYEXIST = "FailedOperation.X509CertificateAlreadyExist" +// FAILEDOPERATION_X509CERTIFICATELIMITEXCEEDED = "FailedOperation.X509CertificateLimitExceeded" +// FAILEDOPERATION_X509CERTIFICATEMINIMUMREQUIRED = "FailedOperation.X509CertificateMinimumRequired" // FAILEDOPERATION_X509CERTIFICATEPARSINGFAILED = "FailedOperation.X509CertificateParsingFailed" // INTERNALERROR = "InternalError" // INVALIDPARAMETERVALUE_X509CERTIFICATEFORMATERROR = "InvalidParameterValue.X509CertificateFormatError" @@ -7007,6 +7011,8 @@ func NewRemoveExternalSAMLIdPCertificateResponse() (response *RemoveExternalSAML // // 可能返回的错误码: // FAILEDOPERATION_DBOPERATIONERROR = "FailedOperation.DBOperationError" +// FAILEDOPERATION_X509CERTIFICATELIMITEXCEEDED = "FailedOperation.X509CertificateLimitExceeded" +// FAILEDOPERATION_X509CERTIFICATEMINIMUMREQUIRED = "FailedOperation.X509CertificateMinimumRequired" // INTERNALERROR = "InternalError" // RESOURCENOTFOUND_X509CERTIFICATENOTFOUND = "ResourceNotFound.X509CertificateNotFound" func (c *Client) RemoveExternalSAMLIdPCertificate(request *RemoveExternalSAMLIdPCertificateRequest) (response *RemoveExternalSAMLIdPCertificateResponse, err error) { @@ -7018,6 +7024,8 @@ func (c *Client) RemoveExternalSAMLIdPCertificate(request *RemoveExternalSAMLIdP // // 可能返回的错误码: // FAILEDOPERATION_DBOPERATIONERROR = "FailedOperation.DBOperationError" +// FAILEDOPERATION_X509CERTIFICATELIMITEXCEEDED = "FailedOperation.X509CertificateLimitExceeded" +// FAILEDOPERATION_X509CERTIFICATEMINIMUMREQUIRED = "FailedOperation.X509CertificateMinimumRequired" // INTERNALERROR = "InternalError" // RESOURCENOTFOUND_X509CERTIFICATENOTFOUND = "ResourceNotFound.X509CertificateNotFound" func (c *Client) RemoveExternalSAMLIdPCertificateWithContext(ctx context.Context, request *RemoveExternalSAMLIdPCertificateRequest) (response *RemoveExternalSAMLIdPCertificateResponse, err error) { @@ -8163,6 +8171,7 @@ func NewUpdateUserResponse() (response *UpdateUserResponse) { // FAILEDOPERATION_SYNCHRONIZEDUSERNOTUPDATE = "FailedOperation.SynchronizedUserNotUpdate" // FAILEDOPERATION_ZONEIDNOTEXIST = "FailedOperation.ZoneIdNotExist" // INVALIDPARAMETER_EMAILALREADYEXISTS = "InvalidParameter.EmailAlreadyExists" +// INVALIDPARAMETER_USERTYPEERROR = "InvalidParameter.UserTypeError" // RESOURCENOTFOUND_USERNOTEXIST = "ResourceNotFound.UserNotExist" func (c *Client) UpdateUser(request *UpdateUserRequest) (response *UpdateUserResponse, err error) { return c.UpdateUserWithContext(context.Background(), request) @@ -8177,6 +8186,7 @@ func (c *Client) UpdateUser(request *UpdateUserRequest) (response *UpdateUserRes // FAILEDOPERATION_SYNCHRONIZEDUSERNOTUPDATE = "FailedOperation.SynchronizedUserNotUpdate" // FAILEDOPERATION_ZONEIDNOTEXIST = "FailedOperation.ZoneIdNotExist" // INVALIDPARAMETER_EMAILALREADYEXISTS = "InvalidParameter.EmailAlreadyExists" +// INVALIDPARAMETER_USERTYPEERROR = "InvalidParameter.UserTypeError" // RESOURCENOTFOUND_USERNOTEXIST = "ResourceNotFound.UserNotExist" func (c *Client) UpdateUserWithContext(ctx context.Context, request *UpdateUserRequest) (response *UpdateUserResponse, err error) { if request == nil { diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331/errors.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331/errors.go index a0985e5a89..e2d4ed7724 100644 --- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331/errors.go +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331/errors.go @@ -416,6 +416,12 @@ const ( // 该x509证书已经存在了。 FAILEDOPERATION_X509CERTIFICATEALREADYEXIST = "FailedOperation.X509CertificateAlreadyExist" + // x509证书数量超出限制 + FAILEDOPERATION_X509CERTIFICATELIMITEXCEEDED = "FailedOperation.X509CertificateLimitExceeded" + + // 需要最少一个x509证书 + FAILEDOPERATION_X509CERTIFICATEMINIMUMREQUIRED = "FailedOperation.X509CertificateMinimumRequired" + // X509证书解析失败。 FAILEDOPERATION_X509CERTIFICATEPARSINGFAILED = "FailedOperation.X509CertificateParsingFailed" @@ -623,6 +629,9 @@ const ( // SCIM密钥状态错误 INVALIDPARAMETER_USERSCIMCREDENTIALSTATUSERROR = "InvalidParameter.UserScimCredentialStatusError" + // 用户类型错误。 + INVALIDPARAMETER_USERTYPEERROR = "InvalidParameter.UserTypeError" + // 用户名已经存在 INVALIDPARAMETER_USERNAMEALREADYEXISTS = "InvalidParameter.UsernameAlreadyExists" diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331/models.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331/models.go index 44763d00eb..30d2bfa7fe 100644 --- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331/models.go +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331/models.go @@ -1530,7 +1530,7 @@ type CreateOrganizationMemberRequestParams struct { // 关系策略。取值:Financial PolicyType *string `json:"PolicyType,omitnil,omitempty" name:"PolicyType"` - // 成员财务权限ID列表。取值:1-查看账单、2-查看余额、3-资金划拨、4-合并出账、5-开票、6-优惠继承、7-代付费,1、2 默认必须 + // 成员财务权限ID列表。取值:1-查看账单、2-查看余额、3-资金划拨(若需要开启资金划拨权限,请联系您的商务经理内部开通。)、4-合并出账、5-开票、6-优惠继承、7-代付费、8-成本分析、9-预算管理、10-信用额度设置(若需要开启信用额度设置权限,请联系您的商务经理内部开通。),1、2 默认必须 PermissionIds []*uint64 `json:"PermissionIds,omitnil,omitempty" name:"PermissionIds"` // 成员所属部门的节点ID。可以通过[DescribeOrganizationNodes](https://cloud.tencent.com/document/product/850/82926)获取 @@ -1567,7 +1567,7 @@ type CreateOrganizationMemberRequest struct { // 关系策略。取值:Financial PolicyType *string `json:"PolicyType,omitnil,omitempty" name:"PolicyType"` - // 成员财务权限ID列表。取值:1-查看账单、2-查看余额、3-资金划拨、4-合并出账、5-开票、6-优惠继承、7-代付费,1、2 默认必须 + // 成员财务权限ID列表。取值:1-查看账单、2-查看余额、3-资金划拨(若需要开启资金划拨权限,请联系您的商务经理内部开通。)、4-合并出账、5-开票、6-优惠继承、7-代付费、8-成本分析、9-预算管理、10-信用额度设置(若需要开启信用额度设置权限,请联系您的商务经理内部开通。),1、2 默认必须 PermissionIds []*uint64 `json:"PermissionIds,omitnil,omitempty" name:"PermissionIds"` // 成员所属部门的节点ID。可以通过[DescribeOrganizationNodes](https://cloud.tencent.com/document/product/850/82926)获取 @@ -2123,6 +2123,9 @@ type CreateUserRequestParams struct { // 用户类型 Manual:手动创建,Synchronized:外部导入 UserType *string `json:"UserType,omitnil,omitempty" name:"UserType"` + + // 是否需要重置密码: true: 需要重置 false: 不需要重置密码。 默认false + NeedResetPassword *bool `json:"NeedResetPassword,omitnil,omitempty" name:"NeedResetPassword"` } type CreateUserRequest struct { @@ -2154,6 +2157,9 @@ type CreateUserRequest struct { // 用户类型 Manual:手动创建,Synchronized:外部导入 UserType *string `json:"UserType,omitnil,omitempty" name:"UserType"` + + // 是否需要重置密码: true: 需要重置 false: 不需要重置密码。 默认false + NeedResetPassword *bool `json:"NeedResetPassword,omitnil,omitempty" name:"NeedResetPassword"` } func (r *CreateUserRequest) ToJsonString() string { @@ -2177,6 +2183,7 @@ func (r *CreateUserRequest) FromJsonString(s string) error { delete(f, "Email") delete(f, "UserStatus") delete(f, "UserType") + delete(f, "NeedResetPassword") if len(f) > 0 { return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "CreateUserRequest has unknown keys!", "") } @@ -6116,7 +6123,7 @@ type InviteOrganizationMemberRequestParams struct { // 关系策略。取值:Financial PolicyType *string `json:"PolicyType,omitnil,omitempty" name:"PolicyType"` - // 成员财务权限ID列表。取值:1-查看账单、2-查看余额、3-资金划拨、4-合并出账、5-开票、6-优惠继承、7-代付费,1、2 默认必须 + // 成员财务权限ID列表。取值:1-查看账单、2-查看余额、3-资金划拨(若需要开启资金划拨权限,请联系您的商务经理内部开通。)、4-合并出账、5-开票、6-优惠继承、7-代付费、8-成本分析、9-预算管理、10-信用额度设置(若需要开启信用额度设置权限,请联系您的商务经理内部开通。),1、2 默认必须 PermissionIds []*uint64 `json:"PermissionIds,omitnil,omitempty" name:"PermissionIds"` // 成员所属部门的节点ID。可以通过[DescribeOrganizationNodes](https://cloud.tencent.com/document/product/850/82926)获取 @@ -6153,7 +6160,7 @@ type InviteOrganizationMemberRequest struct { // 关系策略。取值:Financial PolicyType *string `json:"PolicyType,omitnil,omitempty" name:"PolicyType"` - // 成员财务权限ID列表。取值:1-查看账单、2-查看余额、3-资金划拨、4-合并出账、5-开票、6-优惠继承、7-代付费,1、2 默认必须 + // 成员财务权限ID列表。取值:1-查看账单、2-查看余额、3-资金划拨(若需要开启资金划拨权限,请联系您的商务经理内部开通。)、4-合并出账、5-开票、6-优惠继承、7-代付费、8-成本分析、9-预算管理、10-信用额度设置(若需要开启信用额度设置权限,请联系您的商务经理内部开通。),1、2 默认必须 PermissionIds []*uint64 `json:"PermissionIds,omitnil,omitempty" name:"PermissionIds"` // 成员所属部门的节点ID。可以通过[DescribeOrganizationNodes](https://cloud.tencent.com/document/product/850/82926)获取 @@ -9517,6 +9524,9 @@ func (r *SetExternalSAMLIdentityProviderRequest) FromJsonString(s string) error // Predefined struct for user type SetExternalSAMLIdentityProviderResponseParams struct { + // 证书ID。 + CertificateIds []*string `json:"CertificateIds,omitnil,omitempty" name:"CertificateIds"` + // 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 RequestId *string `json:"RequestId,omitnil,omitempty" name:"RequestId"` } @@ -10014,7 +10024,7 @@ type UpdateOrganizationMemberRequestParams struct { PolicyType *string `json:"PolicyType,omitnil,omitempty" name:"PolicyType"` // 成员财务权限ID列表。PermissionIds不为空,PolicyType不能为空。 - // 取值:1-查看账单、2-查看余额、3-资金划拨、4-合并出账、5-开票、6-优惠继承、7-代付费、8-成本分析,如果有值,1、2 默认必须 + // 取值:1-查看账单、2-查看余额、3-资金划拨(若需要开启资金划拨权限,请联系您的商务经理内部开通。)、4-合并出账、5-开票、6-优惠继承、7-代付费、8-成本分析、9-预算管理、10-信用额度设置(若需要开启信用额度设置权限,请联系您的商务经理内部开通。),1、2 默认必须 PermissionIds []*uint64 `json:"PermissionIds,omitnil,omitempty" name:"PermissionIds"` // 是否允许成员退出组织。取值:Allow-允许、Denied-不允许 @@ -10043,7 +10053,7 @@ type UpdateOrganizationMemberRequest struct { PolicyType *string `json:"PolicyType,omitnil,omitempty" name:"PolicyType"` // 成员财务权限ID列表。PermissionIds不为空,PolicyType不能为空。 - // 取值:1-查看账单、2-查看余额、3-资金划拨、4-合并出账、5-开票、6-优惠继承、7-代付费、8-成本分析,如果有值,1、2 默认必须 + // 取值:1-查看账单、2-查看余额、3-资金划拨(若需要开启资金划拨权限,请联系您的商务经理内部开通。)、4-合并出账、5-开票、6-优惠继承、7-代付费、8-成本分析、9-预算管理、10-信用额度设置(若需要开启信用额度设置权限,请联系您的商务经理内部开通。),1、2 默认必须 PermissionIds []*uint64 `json:"PermissionIds,omitnil,omitempty" name:"PermissionIds"` // 是否允许成员退出组织。取值:Allow-允许、Denied-不允许 @@ -10640,6 +10650,9 @@ type UpdateUserRequestParams struct { // 用户的电子邮箱。 NewEmail *string `json:"NewEmail,omitnil,omitempty" name:"NewEmail"` + + // 是否需要重置密码 + NeedResetPassword *bool `json:"NeedResetPassword,omitnil,omitempty" name:"NeedResetPassword"` } type UpdateUserRequest struct { @@ -10665,6 +10678,9 @@ type UpdateUserRequest struct { // 用户的电子邮箱。 NewEmail *string `json:"NewEmail,omitnil,omitempty" name:"NewEmail"` + + // 是否需要重置密码 + NeedResetPassword *bool `json:"NeedResetPassword,omitnil,omitempty" name:"NeedResetPassword"` } func (r *UpdateUserRequest) ToJsonString() string { @@ -10686,6 +10702,7 @@ func (r *UpdateUserRequest) FromJsonString(s string) error { delete(f, "NewDisplayName") delete(f, "NewDescription") delete(f, "NewEmail") + delete(f, "NeedResetPassword") if len(f) > 0 { return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "UpdateUserRequest has unknown keys!", "") } @@ -10967,6 +10984,9 @@ type UserInfo struct { // 用户密码 Password *string `json:"Password,omitnil,omitempty" name:"Password"` + + // 下次登录是否需要重置密码, true: 需要重置密码, false:不需要重置密码 + NeedResetPassword *bool `json:"NeedResetPassword,omitnil,omitempty" name:"NeedResetPassword"` } type UserProvisioning struct { diff --git a/vendor/modules.txt b/vendor/modules.txt index cf9b3c5c3e..e0839e0316 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1170,7 +1170,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit/v20190319 # github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1148 ## explicit; go 1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls/v20201016 -# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.48 +# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.49 ## explicit; go 1.11 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors @@ -1262,7 +1262,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/mqtt/v20240516 # github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/oceanus v1.0.831 ## explicit; go 1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/oceanus/v20190422 -# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.1.14 +# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization v1.1.49 ## explicit; go 1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/organization/v20210331 # github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/postgres v1.0.1156 diff --git a/website/docs/r/organization_external_saml_identity_provider.html.markdown b/website/docs/r/organization_external_saml_identity_provider.html.markdown new file mode 100644 index 0000000000..dab82ff465 --- /dev/null +++ b/website/docs/r/organization_external_saml_identity_provider.html.markdown @@ -0,0 +1,54 @@ +--- +subcategory: "Tencent Cloud Organization (TCO)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_organization_external_saml_identity_provider" +sidebar_current: "docs-tencentcloud-resource-organization_external_saml_identity_provider" +description: |- + Provides a resource to create a Organization external saml identity provider +--- + +# tencentcloud_organization_external_saml_identity_provider + +Provides a resource to create a Organization external saml identity provider + +~> **NOTE:** When creating it for the first time, you must set one of `encoded_metadata_document` and `x509_certificate`, `another_x509_certificate` cannot be set alone. + +## Example Usage + +```hcl +resource "tencentcloud_organization_external_saml_identity_provider" "example" { + zone_id = "z-1os7c9znogct" + encoded_metadata_document = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz......RGVzY3JpcHRvcj4=" + another_x509_certificate = <<-EOF +-----BEGIN CERTIFICATE----- +MIIC8DCCAdigAwIBAgIQPCotiH/l8K1K6kBgL4mBfzANBgkqhkiG9w0BAQsFADA0MTIwMAYDVQQD +...... +qs39KP9jOtSzEzc1YhiX +-----END CERTIFICATE----- +EOF +} +``` + +## Argument Reference + +The following arguments are supported: + +* `zone_id` - (Required, String, ForceNew) Space ID. +* `another_x509_certificate` - (Optional, String) Another X509 certificate in PEM format. If this parameter is specified, all existing certificates will be replaced. +* `encoded_metadata_document` - (Optional, String) IdP metadata document (Base64 encoded). Provided by an IdP that supports the SAML 2.0 protocol. +* `entity_id` - (Optional, String, ForceNew) IdP identifier. +* `login_url` - (Optional, String, ForceNew) IdP login URL. +* `sso_status` - (Optional, String, ForceNew) SSO enabling status. Valid values: Enabled, Disabled (default). +* `x509_certificate` - (Optional, String) X509 certificate in PEM format. If this parameter is specified, all existing certificates will be replaced. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. +* `another_certificate_id` - Another certificate ID. +* `certificate_id` - Certificate ID. +* `create_time` - Create time. +* `update_time` - Update time. + + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index 04b0970431..1d716e3e82 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -4804,6 +4804,9 @@