public async static Task DeleteAllDevicesInHubAsync(IotHubServiceClient hubClient)
        {
            Console.WriteLine($"\nTrying to clean up all devices\n");

            try
            {
                AsyncPageable <TwinData> asyncPageableResponse = hubClient.Devices.GetTwinsAsync();
                List <TwinData>          deviceTwins           = new List <TwinData>();
                await foreach (TwinData twin in asyncPageableResponse)
                {
                    deviceTwins.Add(twin);
                }

                foreach (TwinData twin in deviceTwins)
                {
                    DeviceIdentity device = await hubClient.Devices.GetIdentityAsync(twin.DeviceId);

                    await hubClient.Devices.DeleteIdentityAsync(device);
                }

                SampleLogger.PrintSuccess($"Cleanup succeeded\n");
            }
            catch (Exception ex)
            {
                SampleLogger.PrintWarning($"Cleanup failed due to:\n{ex.Message}\n");
            }
        }
        /// <summary>
        /// Creates a new device identity.
        /// </summary>
        /// <param name="deviceId">Unique identifier of the device.</param>
        public async Task CreateDeviceIdentitiesAsync(IEnumerable <DeviceIdentity> deviceIdentities)
        {
            SampleLogger.PrintHeader("CREATE DEVICE IDENTITIES");

            try
            {
                Console.WriteLine($"Creating {BulkCount} new devices");

                Response <BulkRegistryOperationResponse> response = await IoTHubServiceClient.Devices.CreateIdentitiesAsync(deviceIdentities);

                var bulkResponse = response.Value;

                if (bulkResponse.IsSuccessful ?? true)
                {
                    SampleLogger.PrintSuccess("Successfully created new device identities");
                }
                else
                {
                    SampleLogger.PrintWarning("Failed to create new device identities");

                    foreach (var bulkOperationError in bulkResponse.Errors)
                    {
                        SampleLogger.PrintWarning($"Device id that failed: {bulkOperationError.DeviceId}, error code: {bulkOperationError.ErrorCode}");
                    }
                }
            }
            catch (Exception ex)
            {
                SampleLogger.FatalError($"Failed to create device identity due to:\n{ex}");
                throw;
            }
        }
        /// <summary>
        /// Delete multiple device identities.
        /// </summary>
        /// <param name="deviceIdentities">Collection of device identities to be deleted.</param>
        public async Task DeleteDeviceIdentitiesAsync(IEnumerable <DeviceIdentity> deviceIdentities)
        {
            SampleLogger.PrintHeader("DELETE DEVICE IDENTITIES");

            try
            {
                #region Snippet:IotHubDeleteDeviceIdentities

                Console.WriteLine($"Deleting bulk device identities");

                Response <BulkRegistryOperationResponse> response = await IoTHubServiceClient.Devices.DeleteIdentitiesAsync(deviceIdentities);

                var bulkResponse = response.Value;

                if (bulkResponse.IsSuccessful ?? true)
                {
                    SampleLogger.PrintSuccess("Successfully deleted the device identities");
                }
                else
                {
                    SampleLogger.PrintWarning("Failed to delete the device identities");

                    foreach (var bulkOperationError in bulkResponse.Errors)
                    {
                        SampleLogger.PrintWarning($"Device id that failed: {bulkOperationError.DeviceId}, error code: {bulkOperationError.ErrorCode}");
                    }
                }

                #endregion Snippet:IotHubDeleteDeviceIdentities
            }
            catch (Exception ex)
            {
                SampleLogger.FatalError($"Failed to device identity due to:\n{ex}");
            }
        }
        /// <summary>
        /// Update multiple module twin desired properties.
        /// </summary>
        /// <param name="moduleTwins">Collection of module twins to be updated.</param>
        public async Task UpdateModuleTwinsAsync(IEnumerable <TwinData> moduleTwins)
        {
            SampleLogger.PrintHeader("UPDATE MODULE TWINS");

            string userPropName = "user";

            try
            {
                Console.WriteLine($"Setting a new desired property {userPropName} to: '{Environment.UserName}' for each twin");

                #region Snippet:IotHubUpdateModuleTwins

                foreach (TwinData twin in moduleTwins)
                {
                    twin.Properties.Desired.Add(new KeyValuePair <string, object>(userPropName, Environment.UserName));
                }

                Response <BulkRegistryOperationResponse> response = await IoTHubServiceClient.Modules.UpdateTwinsAsync(moduleTwins);

                var bulkResponse = response.Value;

                if (bulkResponse.IsSuccessful ?? true)
                {
                    SampleLogger.PrintSuccess("Successfully updated the module twins");
                }
                else
                {
                    SampleLogger.PrintWarning("Failed to update the module twins");

                    foreach (var bulkOperationError in bulkResponse.Errors)
                    {
                        SampleLogger.PrintWarning($"Module id that failed: {bulkOperationError.ModuleId}, for device {bulkOperationError.DeviceId}, error code: {bulkOperationError.ErrorCode}");
                    }
                }

                #endregion Snippet:IotHubUpdateModuleTwins
            }
            catch (Exception ex)
            {
                // Try to cleanup before exiting with fatal error.
                await CleanupHelper.DeleteAllDevicesInHubAsync(IoTHubServiceClient);

                SampleLogger.FatalError($"Failed to update a module identity due to:\n{ex}");
                throw;
            }
        }
        /// <summary>
        /// Update multiple module identities.
        /// </summary>
        /// <param name="moduleIdentities">Collection of module identities to be updated.</param>
        public async Task UpdateModuleIdentitiesAsync(IEnumerable <ModuleIdentity> moduleIdentities)
        {
            SampleLogger.PrintHeader("UPDATE MODULE IDENTITIES");

            try
            {
                Console.WriteLine($"Disconnect multiple modules so they cannot connect to IoT Hub.");

                #region Snippet:IotHubUpdateModuleIdentities

                foreach (var identity in moduleIdentities)
                {
                    identity.ConnectionState = ModuleConnectionState.Disconnected;
                }

                Response <BulkRegistryOperationResponse> response = await IoTHubServiceClient.Modules.UpdateIdentitiesAsync(moduleIdentities, BulkIfMatchPrecondition.IfMatch);

                var bulkResponse = response.Value;

                if (bulkResponse.IsSuccessful ?? true)
                {
                    SampleLogger.PrintSuccess("Successfully disconnected the module identities");
                }
                else
                {
                    SampleLogger.PrintWarning("Failed to disconnect the module identities");

                    foreach (var bulkOperationError in bulkResponse.Errors)
                    {
                        SampleLogger.PrintWarning($"Module id that failed: {bulkOperationError.ModuleId}, for device {bulkOperationError.DeviceId}, error code: {bulkOperationError.ErrorCode}");
                    }
                }

                #endregion Snippet:IotHubUpdateModuleIdentities
            }
            catch (Exception ex)
            {
                // Try to cleanup before exiting with fatal error.
                await CleanupHelper.DeleteAllDevicesInHubAsync(IoTHubServiceClient);

                SampleLogger.FatalError($"Failed to update a module identity due to:\n{ex}");
                throw;
            }
        }
        /// <summary>
        /// Update multiple device twin desired properties.
        /// </summary>
        /// <param name="deviceTwins">Collection of device twins to be updated.</param>
        public async Task UpdateDeviceTwinsAsync(IEnumerable <TwinData> deviceTwins)
        {
            SampleLogger.PrintHeader("UPDATE DEVICE TWINS");

            string userPropName = "user";

            try
            {
                #region Snippet:IotHubUpdateDeviceTwins

                Console.WriteLine($"Setting a new desired property {userPropName} to: '{Environment.UserName}' for each twin");
                foreach (TwinData twin in deviceTwins)
                {
                    twin.Properties.Desired.Add(new KeyValuePair <string, object>(userPropName, Environment.UserName));
                }

                Response <BulkRegistryOperationResponse> response = await IoTHubServiceClient.Devices.UpdateTwinsAsync(deviceTwins);

                var bulkResponse = response.Value;

                if (bulkResponse.IsSuccessful ?? true)
                {
                    SampleLogger.PrintSuccess("Successfully updated the device twins");
                }
                else
                {
                    SampleLogger.PrintWarning("Failed to update the device twins");

                    foreach (var bulkOperationError in bulkResponse.Errors)
                    {
                        SampleLogger.PrintWarning($"Device id that failed: {bulkOperationError.DeviceId}, error code: {bulkOperationError.ErrorCode}");
                    }
                }

                #endregion Snippet:IotHubUpdateDeviceTwins
            }
            catch (Exception ex)
            {
                SampleLogger.FatalError($"Failed to update a device identity due to:\n{ex}");
                throw;
            }
        }
        /// <summary>
        /// Update multiple device identity.
        /// </summary>
        /// <param name="deviceIdentities">Collection of device identities to be updated.</param>
        public async Task UpdateDeviceIdentitiesAsync(IEnumerable <DeviceIdentity> deviceIdentities)
        {
            SampleLogger.PrintHeader("UPDATE DEVICE IDENTITIES");

            try
            {
                Console.WriteLine($"Disabling multiple devices so they cannot connect to IoT Hub.");

                #region Snippet:IotHubUpdateDeviceIdentities

                foreach (var identity in deviceIdentities)
                {
                    identity.Status = DeviceStatus.Disabled;
                }

                Response <BulkRegistryOperationResponse> response = await IoTHubServiceClient.Devices.UpdateIdentitiesAsync(deviceIdentities, BulkIfMatchPrecondition.IfMatch);

                var bulkResponse = response.Value;

                if (bulkResponse.IsSuccessful ?? true)
                {
                    SampleLogger.PrintSuccess("Successfully disabled the device identities");
                }
                else
                {
                    SampleLogger.PrintWarning("Failed to disable the device identities");

                    foreach (var bulkOperationError in bulkResponse.Errors)
                    {
                        SampleLogger.PrintWarning($"Device id that failed: {bulkOperationError.DeviceId}, error code: {bulkOperationError.ErrorCode}");
                    }
                }

                #endregion Snippet:IotHubUpdateDeviceIdentities
            }
            catch (Exception ex)
            {
                SampleLogger.FatalError($"Failed to update a device identity due to:\n{ex}");
                throw;
            }
        }
        /// <summary>
        /// Create multiple module identities.
        /// </summary>
        /// <param name="moduleIdentities">Collection of modules identities to be created.</param>
        public async Task CreateModuleIdentitiesAsync(IEnumerable <ModuleIdentity> moduleIdentities)
        {
            SampleLogger.PrintHeader("CREATE MODULE IDENTITIES");

            try
            {
                Console.WriteLine($"Creating {BulkCount} new modules");

                #region Snippet:IotHubCreateModuleIdentities

                Response <BulkRegistryOperationResponse> response = await IoTHubServiceClient.Modules.CreateIdentitiesAsync(moduleIdentities);

                var bulkResponse = response.Value;

                if (bulkResponse.IsSuccessful ?? true)
                {
                    SampleLogger.PrintSuccess("Successfully created new module identities");
                }
                else
                {
                    SampleLogger.PrintWarning("Failed to create new module identities");

                    foreach (var bulkOperationError in bulkResponse.Errors)
                    {
                        SampleLogger.PrintWarning($"Module id that failed: {bulkOperationError.ModuleId}, for device {bulkOperationError.DeviceId}, error code: {bulkOperationError.ErrorCode}");
                    }
                }

                #endregion Snippet:IotHubCreateModuleIdentities
            }
            catch (Exception ex)
            {
                // Try to cleanup before exiting with fatal error.
                await CleanupHelper.DeleteAllDevicesInHubAsync(IoTHubServiceClient);

                SampleLogger.FatalError($"Failed to create module identity due to:\n{ex}");
                throw;
            }
        }