public static IAutoProxyConfigurator AddCloudflareUpdater(this IAutoProxyConfigurator configurator, Action <CloudflareUpdaterOptions> configureOptions = null)
        {
            if (configurator == null)
            {
                throw new ArgumentNullException(nameof(configurator));
            }

            configurator.AddServices(services =>
            {
                if (configureOptions != null)
                {
                    services.PostConfigure(configureOptions);
                }

                services.AddSingleton <IHostedService>(provider => new CloudflareIpUpdater(
                                                           provider.GetRequiredService <ILogger <CloudflareIpUpdater> >(),
                                                           provider.GetRequiredService <IAutoProxyStore>(),
                                                           provider.GetRequiredService <IOptionsMonitor <CloudflareUpdaterOptions> >(),
                                                           provider.GetRequiredService <IHttpClientFactory>().CreateClient(typeof(CloudflareIpUpdater).FullName)));
                services.AddHttpClient(typeof(CloudflareIpUpdater).FullName, (provider, client) =>
                {
                    client.BaseAddress = new Uri("https://www.cloudflare.com/");
                })
                .AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[]
                {
                    TimeSpan.FromSeconds(1),
                    TimeSpan.FromSeconds(5),
                    TimeSpan.FromSeconds(10)
                }));
            });

            return(configurator);
        }
        public static IAutoProxyConfigurator AddCloudflare(this IAutoProxyConfigurator configurator)
        {
            Assembly assembly = typeof(AutoProxyExtensions).Assembly;

            using (Stream fs = assembly.GetManifestResourceStream(assembly.GetName().Name + ".Resources.ips.txt"))
                using (StreamReader sr = new StreamReader(fs))
                    configurator.AddInitialRanges(Constants.ServiceName, sr.ReadNetworks());

            return(configurator);
        }