From ac282710ce91a5a0d03d3ad179cc478d54780fb7 Mon Sep 17 00:00:00 2001 From: Randy Coulman Date: Thu, 15 Oct 2020 19:19:33 -0700 Subject: [PATCH 1/2] Generate app skeleton - Generate with `mix new . --app config_cat` - Don't overwrite README or .gitignore - Append the README contents that would have been generated to the existing README --- .formatter.exs | 4 ++++ README.md | 20 +++++++++++++++++++- lib/config_cat.ex | 18 ++++++++++++++++++ mix.exs | 28 ++++++++++++++++++++++++++++ test/config_cat_test.exs | 8 ++++++++ test/test_helper.exs | 1 + 6 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 .formatter.exs create mode 100644 lib/config_cat.ex create mode 100644 mix.exs create mode 100644 test/config_cat_test.exs create mode 100644 test/test_helper.exs diff --git a/.formatter.exs b/.formatter.exs new file mode 100644 index 00000000..d2cda26e --- /dev/null +++ b/.formatter.exs @@ -0,0 +1,4 @@ +# Used by "mix format" +[ + inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"] +] diff --git a/README.md b/README.md index aa1db75b..b0298ff8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,25 @@ # ConfigCat SDK for Elixir -https://configcat.com + +https://configcat.com ConfigCat SDK for Elixir provides easy integration for your application to ConfigCat. ConfigCat is a feature flag and configuration management service that lets you separate releases from deployments. You can turn your features ON/OFF using ConfigCat Dashboard even after they are deployed. ConfigCat lets you target specific groups of users based on region, email or any other custom user attribute. ConfigCat is a hosted feature flag service. Manage feature toggles across frontend, backend, mobile, desktop apps. Alternative to LaunchDarkly. Management app + feature flag SDKs. + +## Installation + +If [available in Hex](https://hex.pm/docs/publish), the package can be installed +by adding `config_cat` to your list of dependencies in `mix.exs`: + +```elixir +def deps do + [ + {:config_cat, "~> 0.1.0"} + ] +end +``` + +Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc) +and published on [HexDocs](https://hexdocs.pm). Once published, the docs can +be found at [https://hexdocs.pm/config_cat](https://hexdocs.pm/config_cat). diff --git a/lib/config_cat.ex b/lib/config_cat.ex new file mode 100644 index 00000000..8cfe3663 --- /dev/null +++ b/lib/config_cat.ex @@ -0,0 +1,18 @@ +defmodule ConfigCat do + @moduledoc """ + Documentation for `ConfigCat`. + """ + + @doc """ + Hello world. + + ## Examples + + iex> ConfigCat.hello() + :world + + """ + def hello do + :world + end +end diff --git a/mix.exs b/mix.exs new file mode 100644 index 00000000..eee7ef8f --- /dev/null +++ b/mix.exs @@ -0,0 +1,28 @@ +defmodule ConfigCat.MixProject do + use Mix.Project + + def project do + [ + app: :config_cat, + version: "0.1.0", + elixir: "~> 1.11", + start_permanent: Mix.env() == :prod, + deps: deps() + ] + end + + # Run "mix help compile.app" to learn about applications. + def application do + [ + extra_applications: [:logger] + ] + end + + # Run "mix help deps" to learn about dependencies. + defp deps do + [ + # {:dep_from_hexpm, "~> 0.3.0"}, + # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"} + ] + end +end diff --git a/test/config_cat_test.exs b/test/config_cat_test.exs new file mode 100644 index 00000000..3b642db5 --- /dev/null +++ b/test/config_cat_test.exs @@ -0,0 +1,8 @@ +defmodule ConfigCatTest do + use ExUnit.Case + doctest ConfigCat + + test "greets the world" do + assert ConfigCat.hello() == :world + end +end diff --git a/test/test_helper.exs b/test/test_helper.exs new file mode 100644 index 00000000..869559e7 --- /dev/null +++ b/test/test_helper.exs @@ -0,0 +1 @@ +ExUnit.start() From 6ec1982efb18e8830908d3171b5e8e0055a1a505 Mon Sep 17 00:00:00 2001 From: Randy Coulman Date: Thu, 15 Oct 2020 20:20:04 -0700 Subject: [PATCH 2/2] Extract library from InfluxData's app This commit contains the code almost exactly as it has been running in production at InfluxData. Changes here: - Add necessary dependencies to mix.exs - Replace use of `Ecto.UUID.generate/0` with `UUID.uuid4/0` to avoid depending on Ecto - Configure the log level in `test_helper.exs` - Add `@tag capture_log: true` to noisy tests. Co-authored-by: Iris Scholten Co-authored-by: Delmer Reed Co-authored-by: Marc Delagrammatikas Co-authored-by: Mansi Gandhi Co-authored-by: Kristin Albright Co-authored-by: Nick Stalter --- lib/config_cat.ex | 191 ++++- lib/config_cat/api.ex | 11 + lib/config_cat/fetch_policy.ex | 51 ++ lib/config_cat/rollout.ex | 192 +++++ lib/config_cat/rollout/comparator.ex | 176 ++++ lib/config_cat/user.ex | 35 + mix.exs | 7 +- mix.lock | 17 + test/config_cat_test.exs | 252 +++++- test/fetch_policy_test.exs | 101 +++ test/fixtures/testmatrix.csv | 1012 +++++++++++++++++++++++ test/fixtures/testmatrix_number.csv | 26 + test/fixtures/testmatrix_semantic.csv | 36 + test/fixtures/testmatrix_semantic_2.csv | 95 +++ test/fixtures/testmatrix_sensitive.csv | 8 + test/integration_test.exs | 57 ++ test/rollout/comparator_test.exs | 258 ++++++ test/rollout_test.exs | 120 +++ test/test_helper.exs | 1 + test/user_test.exs | 91 ++ 20 files changed, 2722 insertions(+), 15 deletions(-) create mode 100644 lib/config_cat/api.ex create mode 100644 lib/config_cat/fetch_policy.ex create mode 100644 lib/config_cat/rollout.ex create mode 100644 lib/config_cat/rollout/comparator.ex create mode 100644 lib/config_cat/user.ex create mode 100644 mix.lock create mode 100644 test/fetch_policy_test.exs create mode 100644 test/fixtures/testmatrix.csv create mode 100644 test/fixtures/testmatrix_number.csv create mode 100644 test/fixtures/testmatrix_semantic.csv create mode 100644 test/fixtures/testmatrix_semantic_2.csv create mode 100644 test/fixtures/testmatrix_sensitive.csv create mode 100644 test/integration_test.exs create mode 100644 test/rollout/comparator_test.exs create mode 100644 test/rollout_test.exs create mode 100644 test/user_test.exs diff --git a/lib/config_cat.ex b/lib/config_cat.ex index 8cfe3663..32aadeda 100644 --- a/lib/config_cat.ex +++ b/lib/config_cat.ex @@ -1,18 +1,187 @@ defmodule ConfigCat do - @moduledoc """ - Documentation for `ConfigCat`. - """ + use GenServer - @doc """ - Hello world. + alias ConfigCat.{FetchPolicy, Rollout} + alias HTTPoison.Response - ## Examples + require Logger - iex> ConfigCat.hello() - :world + @base_url "https://cdn.configcat.com" + @base_path "configuration-files" + @config_filename "config_v4.json" - """ - def hello do - :world + def start_link(sdk_key, options \\ []) + + def start_link(nil, _options), do: {:error, :missing_sdk_key} + + def start_link(sdk_key, options) do + with {name, options} <- Keyword.pop(options, :name, __MODULE__), + {initial_config, options} <- Keyword.pop(options, :initial_config) do + initial_state = %{ + config: initial_config, + etag: nil, + last_update: nil, + options: Keyword.merge(default_options(), options), + sdk_key: sdk_key + } + + GenServer.start_link(__MODULE__, initial_state, name: name) + end + end + + defp default_options, do: [api: ConfigCat.API, fetch_policy: FetchPolicy.auto()] + + def get_value(key, default_value, user_or_options \\ []) do + if Keyword.keyword?(user_or_options) do + get_value(key, default_value, nil, user_or_options) + else + get_value(key, default_value, user_or_options, []) + end + end + + def get_value(key, default_value, user, options) do + client = Keyword.get(options, :client, __MODULE__) + GenServer.call(client, {:get_value, key, default_value, user}) + end + + def force_refresh(client \\ __MODULE__) do + GenServer.call(client, :force_refresh) + end + + @impl GenServer + def init(state) do + {:ok, state, {:continue, :maybe_init_fetch}} + end + + @impl GenServer + def handle_call({:get_value, key, default_value, user}, _from, state) do + with {:ok, new_state} <- maybe_refresh(state), + value <- Rollout.evaluate(key, user, default_value, new_state.config) do + {:reply, value, new_state} + else + error -> {:reply, error, state} + end + end + + @impl GenServer + def handle_call(:force_refresh, _from, state) do + with {:ok, new_state} <- refresh(state) do + {:reply, :ok, new_state} + else + error -> {:reply, error, state} + end + end + + defp schedule_initial_fetch?(%{options: options}) do + options + |> Keyword.get(:fetch_policy) + |> FetchPolicy.schedule_initial_fetch?() + end + + defp maybe_refresh(%{options: options} = state) do + options + |> Keyword.get(:fetch_policy) + |> maybe_refresh(state) + end + + defp maybe_refresh(fetch_policy, %{last_update: last_update} = state) do + if FetchPolicy.needs_fetch?(fetch_policy, last_update) do + refresh(state) + else + {:ok, state} + end + end + + defp refresh(%{options: options, etag: etag} = state) do + Logger.info("Fetching configuration from ConfigCat") + + with api <- Keyword.get(options, :api), + {:ok, response} <- api.get(url(state), headers(etag)) do + response + |> log_response() + |> handle_response(state) + else + error -> + log_error(error) + end + end + + defp handle_response(%Response{status_code: code, body: body, headers: headers}, state) + when code >= 200 and code < 300 do + with {:ok, config} = Jason.decode(body), + etag <- extract_etag(headers) do + {:ok, %{state | config: config, etag: etag, last_update: now()}} + end + end + + defp handle_response(%Response{status_code: 304}, state) do + {:ok, %{state | last_update: now()}} + end + + defp handle_response(response, _state) do + {:error, response} + end + + defp headers(nil), do: [] + defp headers(etag), do: [{"If-None-Match", etag}] + + defp extract_etag(headers) do + headers |> Enum.into(%{}) |> Map.get("ETag") + end + + defp url(%{options: options, sdk_key: sdk_key}) do + base_url = Keyword.get(options, :base_url, @base_url) + + base_url + |> URI.parse() + |> URI.merge("#{@base_path}/#{sdk_key}/#{@config_filename}") + |> URI.to_string() + end + + defp now, do: DateTime.utc_now() + + defp log_response(%Response{headers: headers, status_code: status_code} = response) do + Logger.info( + "ConfigCat configuration json fetch response code: #{status_code} Cached: #{ + extract_etag(headers) + }" + ) + + response + end + + defp log_error(error) do + Logger.warn("Failed to fetch configuration from ConfigCat: #{inspect(error)}") + error + end + + defp schedule_and_refresh(%{options: options} = state) do + options + |> Keyword.get(:fetch_policy) + |> FetchPolicy.schedule_next_fetch(self()) + + case refresh(state) do + {:ok, new_state} -> new_state + _error -> state + end + end + + @impl GenServer + # Work around leaking messages from hackney (see https://github.com/benoitc/hackney/issues/464#issuecomment-495731612) + # Seems to be an issue in OTP 21 and later. + def handle_info({:ssl_closed, _msg}, state), do: {:noreply, state} + + @impl GenServer + def handle_info(:refresh, state) do + {:noreply, schedule_and_refresh(state)} + end + + @impl GenServer + def handle_continue(:maybe_init_fetch, state) do + if schedule_initial_fetch?(state) do + {:noreply, schedule_and_refresh(state)} + else + {:noreply, state} + end end end diff --git a/lib/config_cat/api.ex b/lib/config_cat/api.ex new file mode 100644 index 00000000..ef620614 --- /dev/null +++ b/lib/config_cat/api.ex @@ -0,0 +1,11 @@ +defmodule ConfigCat.API do + use HTTPoison.Base + + def process_request_headers(headers) do + [ + {"User-Agent", "ConfigCat-Elixir/m-0.0.1"}, + {"X-ConfigCat-UserAgent", "ConfigCat-Elixir/m-0.0.1"}, + {"Content-Type", "application/json"} | headers + ] + end +end diff --git a/lib/config_cat/fetch_policy.ex b/lib/config_cat/fetch_policy.ex new file mode 100644 index 00000000..630599e5 --- /dev/null +++ b/lib/config_cat/fetch_policy.ex @@ -0,0 +1,51 @@ +defmodule ConfigCat.FetchPolicy do + defstruct [ + :type, + cache_expiry_seconds: 0, + poll_interval_seconds: 0 + ] + + def manual do + %__MODULE__{type: :manual} + end + + def lazy(cache_expiry_seconds: seconds) do + %__MODULE__{type: :lazy, cache_expiry_seconds: seconds} + end + + def auto(options \\ []) do + seconds = options |> Keyword.get(:poll_interval_seconds, 60) |> max(1) + + %__MODULE__{ + type: :auto, + poll_interval_seconds: seconds + } + end + + def needs_fetch?(%__MODULE__{type: :lazy}, nil), do: true + + def needs_fetch?( + %__MODULE__{type: :lazy, cache_expiry_seconds: expiry_seconds}, + last_update_time + ) do + cache_expired?(last_update_time, expiry_seconds) + end + + def needs_fetch?(_policy, _last_update_time), do: false + + def schedule_initial_fetch?(%__MODULE__{type: :auto}), do: true + def schedule_initial_fetch?(_policy), do: false + + def schedule_next_fetch(%__MODULE__{type: :auto, poll_interval_seconds: seconds}, pid) do + Process.send_after(pid, :refresh, seconds * 1000) + end + + def schedule_next_fetch(_policy, _pid), do: nil + + defp cache_expired?(last_update_time, expiry_seconds) do + :gt !== + last_update_time + |> DateTime.add(expiry_seconds, :second) + |> DateTime.compare(DateTime.utc_now()) + end +end diff --git a/lib/config_cat/rollout.ex b/lib/config_cat/rollout.ex new file mode 100644 index 00000000..8a1581e3 --- /dev/null +++ b/lib/config_cat/rollout.ex @@ -0,0 +1,192 @@ +defmodule ConfigCat.Rollout do + require Logger + + alias ConfigCat.User + alias ConfigCat.Rollout.Comparator + + # Fields + @comparator "t" + @comparison_attribute "a" + @comparison_value "c" + @rollout_rules "r" + @percentage_rules "p" + @percentage "p" + @value "v" + + def evaluate(_key, _user, default_value, nil), do: default_value + + def evaluate(key, user, default_value, config) do + log_evaluating(key) + + with {:ok, valid_user} <- validate_user(user), + {:ok, setting_descriptor} <- Map.fetch(config, key), + rollout_rules <- Map.get(setting_descriptor, @rollout_rules, []), + percentage_rules <- Map.get(setting_descriptor, @percentage_rules, []), + result <- evaluate_rules(rollout_rules, percentage_rules, valid_user, key) do + if result == :none do + base_value(setting_descriptor, default_value) + else + result + end + else + {:error, :invalid_user} -> + log_invalid_user(key) + evaluate(key, nil, default_value, config) + + :error -> + log_no_value_found(key, default_value) + default_value + end + end + + defp validate_user(nil), do: {:ok, nil} + defp validate_user(%User{} = user), do: {:ok, user} + defp validate_user(_), do: {:error, :invalid_user} + + defp evaluate_rules([], [], _user, _key), do: :none + + defp evaluate_rules(_rollout_rules, _percentage_rules, nil, key) do + log_nil_user(key) + :none + end + + defp evaluate_rules(rollout_rules, percentage_rules, user, key) do + log_valid_user(user) + result = evaluate_rollout_rules(rollout_rules, user, key) + + if result == :none do + evaluate_percentage_rules(percentage_rules, user, key) + else + result + end + end + + defp evaluate_rollout_rules(rules, user, _key) do + Enum.reduce_while(rules, :none, &evaluate_rollout_rule(&1, &2, user)) + end + + defp evaluate_rollout_rule(rule, default, user) do + with comparison_attribute <- Map.get(rule, @comparison_attribute), + comparison_value <- Map.get(rule, @comparison_value), + comparator <- Map.get(rule, @comparator), + value <- Map.get(rule, @value) do + case User.get_attribute(user, comparison_attribute) do + nil -> + log_no_match(comparison_attribute, nil, comparator, comparison_value) + {:cont, default} + + user_value -> + case Comparator.compare(comparator, to_string(user_value), to_string(comparison_value)) do + {:ok, true} -> + log_match(comparison_attribute, user_value, comparator, comparison_value, value) + {:halt, value} + + {:ok, false} -> + {:cont, default} + + {:error, error} -> + log_validation_error( + comparison_attribute, + user_value, + comparator, + comparison_value, + error + ) + + {:cont, default} + end + end + end + end + + def evaluate_percentage_rules(_percentage_rules = [], _user, _key), do: :none + + def evaluate_percentage_rules(percentage_rules, user, key) do + hash_val = hash_user(user, key) + + Enum.reduce_while(percentage_rules, 0, &evaluate_percentage_rule(&1, &2, hash_val)) + end + + def evaluate_percentage_rule(rule, bucket, hash_val) do + bucket = increment_bucket(bucket, rule) + + if hash_val < bucket do + percentage_value = Map.get(rule, @value, nil) + {:halt, percentage_value} + else + {:cont, bucket} + end + end + + defp increment_bucket(bucket, rule), do: bucket + Map.get(rule, @percentage, 0) + + defp hash_user(user, key) do + user_key = User.get_attribute(user, "identifier") + hash_candidate = "#{key}#{user_key}" + + {hash_value, _} = + :crypto.hash(:sha, hash_candidate) + |> Base.encode16() + |> String.slice(0, 7) + |> Integer.parse(16) + + rem(hash_value, 100) + end + + defp base_value(setting_descriptor, default_value) do + result = Map.get(setting_descriptor, @value, default_value) + Logger.debug("Returning #{result}") + + result + end + + defp log_evaluating(key) do + Logger.debug("Evaluating get_value('#{key}').") + end + + defp log_match(comparison_attribute, user_value, comparator, comparison_value, value) do + Logger.debug( + "Evaluating rule: [#{comparison_attribute}:#{user_value}] [#{ + Comparator.description(comparator) + }] [#{comparison_value}] => match, returning: #{value}" + ) + end + + defp log_no_match(comparison_attribute, user_value, comparator, comparison_value) do + Logger.debug( + "Evaluating rule: [#{comparison_attribute}:#{user_value}] [#{ + Comparator.description(comparator) + }] [#{comparison_value}] => no match" + ) + end + + defp log_validation_error(comparison_attribute, user_value, comparator, comparison_value, error) do + Logger.warn( + "Evaluating rule: [#{comparison_attribute}:#{user_value}] [#{ + Comparator.description(comparator) + }] [#{comparison_value}] => SKIP rule. Validation error: #{inspect(error)}" + ) + end + + defp log_no_value_found(key, default_value) do + Logger.error( + "Evaluating get_value('#{key}') failed. Value not found for key '#{key}'. Return default_value: [#{ + default_value + }]." + ) + end + + defp log_valid_user(user) do + Logger.debug("User object: #{inspect(user)}") + end + + defp log_nil_user(key) do + Logger.warn( + "Evaluating get_value('#{key}'). User struct missing! You should pass a User to get_value(), in order to make targeting work properly. Read more: https://configcat.com/docs/advanced/user-object/" + ) + end + + defp log_invalid_user(key) do + Logger.warn("Evaluating get_value('#{key}'). User Object is not an instance of User struct.") + end +end diff --git a/lib/config_cat/rollout/comparator.ex b/lib/config_cat/rollout/comparator.ex new file mode 100644 index 00000000..809bfab7 --- /dev/null +++ b/lib/config_cat/rollout/comparator.ex @@ -0,0 +1,176 @@ +defmodule ConfigCat.Rollout.Comparator do + @is_one_of 0 + @is_not_one_of 1 + @contains 2 + @does_not_contain 3 + @is_one_of_semver 4 + @is_not_one_of_semver 5 + @less_than_semver 6 + @less_than_equal_semver 7 + @greater_than_semver 8 + @greater_than_equal_semver 9 + @equals_number 10 + @not_equals_number 11 + @less_than_number 12 + @less_than_equal_number 13 + @greater_than_number 14 + @greater_than_equal_number 15 + @is_one_of_sensitive 16 + @is_not_one_of_sensitive 17 + + @descriptions %{ + @is_one_of => "IS ONE OF", + @is_not_one_of => "IS NOT ONE OF", + @contains => "CONTAINS", + @does_not_contain => "DOES NOT CONTAIN", + @is_one_of_semver => "IS ONE OF (SemVer)", + @is_not_one_of_semver => "IS NOT ONE OF (SemVer)", + @less_than_semver => "< (SemVer)", + @less_than_equal_semver => "<= (SemVer)", + @greater_than_semver => "> (SemVer)", + @greater_than_equal_semver => ">= (SemVer)", + @equals_number => "= (Number)", + @not_equals_number => "<> (Number)", + @less_than_number => "< (Number)", + @less_than_equal_number => "<= (Number)", + @greater_than_number => "> (Number)", + @greater_than_equal_number => ">= (Number)", + @is_one_of_sensitive => "IS ONE OF (Sensitive)", + @is_not_one_of_sensitive => "IS NOT ONE OF (Sensitive)" + } + + def description(comparator) do + Map.get(@descriptions, comparator, "Unsupported comparator") + end + + def compare(@is_one_of, user_value, comparison_value), + do: is_one_of(user_value, comparison_value) + + def compare(@is_not_one_of, user_value, comparison_value), + do: is_one_of(user_value, comparison_value) |> negate() + + def compare(@contains, user_value, comparison_value), + do: contains(user_value, comparison_value) + + def compare(@does_not_contain, user_value, comparison_value), + do: contains(user_value, comparison_value) |> negate() + + def compare(@is_one_of_semver, user_value, comparison_value), + do: is_one_of_semver(user_value, comparison_value) + + def compare(@is_not_one_of_semver, user_value, comparison_value), + do: is_one_of_semver(user_value, comparison_value) |> negate() + + def compare(@less_than_semver, user_value, comparison_value), + do: compare_semver(user_value, comparison_value, [:lt]) + + def compare(@less_than_equal_semver, user_value, comparison_value), + do: compare_semver(user_value, comparison_value, [:lt, :eq]) + + def compare(@greater_than_semver, user_value, comparison_value), + do: compare_semver(user_value, comparison_value, [:gt]) + + def compare(@greater_than_equal_semver, user_value, comparison_value), + do: compare_semver(user_value, comparison_value, [:gt, :eq]) + + def compare(@equals_number, user_value, comparison_value), + do: compare_numbers(user_value, comparison_value, &==/2) + + def compare(@not_equals_number, user_value, comparison_value), + do: compare_numbers(user_value, comparison_value, &!==/2) + + def compare(@less_than_number, user_value, comparison_value), + do: compare_numbers(user_value, comparison_value, &/2) + + def compare(@greater_than_equal_number, user_value, comparison_value), + do: compare_numbers(user_value, comparison_value, &>=/2) + + def compare(@is_one_of_sensitive, user_value, comparison_value), + do: is_one_of_sensitive(user_value, comparison_value) + + def compare(@is_not_one_of_sensitive, user_value, comparison_value), + do: is_one_of_sensitive(user_value, comparison_value) |> negate() + + def compare(_comparator, _user_value, _comparison_value) do + {:ok, false} + end + + defp is_one_of(user_value, comparison_value) do + result = + comparison_value + |> String.split(",") + |> Enum.map(&String.trim/1) + |> Enum.member?(user_value) + + {:ok, result} + end + + defp contains(user_value, comparison_value) do + result = String.contains?(user_value, comparison_value) + {:ok, result} + end + + def is_one_of_semver(user_value, comparison_value) do + user_version = Version.parse!(user_value) + + result = + comparison_value + |> String.split(",") + |> Enum.map(&String.trim/1) + |> Enum.reject(&(&1 == "")) + |> Enum.map(&Version.parse!/1) + |> Enum.any?(fn version -> Version.compare(user_version, version) == :eq end) + + {:ok, result} + rescue + error in Version.InvalidVersionError -> + {:error, error} + end + + defp is_one_of_sensitive(user_value, comparison_value) do + user_value + |> hash_value() + |> is_one_of(comparison_value) + end + + defp hash_value(value) do + :crypto.hash(:sha, value) + |> Base.encode16() + |> String.downcase() + end + + defp compare_semver(user_value, comparison_value, valid_comparisons) do + user_version = to_version(user_value) + comparison_version = to_version(comparison_value) + result = Version.compare(user_version, comparison_version) in valid_comparisons + {:ok, result} + rescue + error in Version.InvalidVersionError -> {:error, error} + end + + defp to_version(value) do + value |> String.trim() |> Version.parse!() + end + + defp compare_numbers(user_value, comparison_value, operator) do + with {user_float, _} <- to_float(user_value), + {comparison_float, _} <- to_float(comparison_value) do + {:ok, operator.(user_float, comparison_float)} + else + :error -> {:error, :invalid_float} + end + end + + defp to_float(value) do + value |> to_string() |> String.replace(",", ".") |> Float.parse() + end + + defp negate({:ok, result}), do: {:ok, !result} + defp negate(error), do: error +end diff --git a/lib/config_cat/user.ex b/lib/config_cat/user.ex new file mode 100644 index 00000000..66f6601a --- /dev/null +++ b/lib/config_cat/user.ex @@ -0,0 +1,35 @@ +defmodule ConfigCat.User do + @enforce_keys :identifier + defstruct [:identifier, email: nil, country: nil, custom: nil] + + def new(identifier, other_props \\ []) do + %__MODULE__{identifier: identifier} + |> struct!(other_props) + end + + def get_attribute(user, attribute) do + do_get_attribute(user, normalize(attribute)) + end + + defp do_get_attribute(user, "identifier"), do: user.identifier + defp do_get_attribute(user, "email"), do: user.email + defp do_get_attribute(user, "country"), do: user.country + defp do_get_attribute(user, attribute), do: custom_attribute(user.custom, attribute) + + defp custom_attribute(nil, _attribute), do: nil + + defp custom_attribute(custom, attribute) do + case Enum.find(custom, fn {key, _value} -> + normalize(key) == attribute + end) do + {_key, value} -> value + _ -> nil + end + end + + defp normalize(attribute) do + attribute + |> to_string() + |> String.downcase() + end +end diff --git a/mix.exs b/mix.exs index eee7ef8f..6f98e799 100644 --- a/mix.exs +++ b/mix.exs @@ -5,7 +5,7 @@ defmodule ConfigCat.MixProject do [ app: :config_cat, version: "0.1.0", - elixir: "~> 1.11", + elixir: "~> 1.10", start_permanent: Mix.env() == :prod, deps: deps() ] @@ -23,6 +23,11 @@ defmodule ConfigCat.MixProject do [ # {:dep_from_hexpm, "~> 0.3.0"}, # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"} + {:elixir_uuid, "~> 1.2"}, + {:httpoison, "~> 1.7"}, + {:jason, "~> 1.2"}, + {:mix_test_watch, "~> 1.0", only: :dev, runtime: false}, + {:mox, "~> 1.0", only: :test} ] end end diff --git a/mix.lock b/mix.lock new file mode 100644 index 00000000..5c3aff25 --- /dev/null +++ b/mix.lock @@ -0,0 +1,17 @@ +%{ + "certifi": {:hex, :certifi, "2.5.2", "b7cfeae9d2ed395695dd8201c57a2d019c0c43ecaf8b8bcb9320b40d6662f340", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "3b3b5f36493004ac3455966991eaf6e768ce9884693d9968055aeeeb1e575040"}, + "elixir_uuid": {:hex, :elixir_uuid, "1.2.1", "dce506597acb7e6b0daeaff52ff6a9043f5919a4c3315abb4143f0b00378c097", [:mix], [], "hexpm", "f7eba2ea6c3555cea09706492716b0d87397b88946e6380898c2889d68585752"}, + "file_system": {:hex, :file_system, "0.2.9", "545b9c9d502e8bfa71a5315fac2a923bd060fd9acb797fe6595f54b0f975fd32", [:mix], [], "hexpm", "3cf87a377fe1d93043adeec4889feacf594957226b4f19d5897096d6f61345d8"}, + "hackney": {:hex, :hackney, "1.16.0", "5096ac8e823e3a441477b2d187e30dd3fff1a82991a806b2003845ce72ce2d84", [:rebar3], [{:certifi, "2.5.2", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.1", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.0", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.6", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "3bf0bebbd5d3092a3543b783bf065165fa5d3ad4b899b836810e513064134e18"}, + "httpoison": {:hex, :httpoison, "1.7.0", "abba7d086233c2d8574726227b6c2c4f6e53c4deae7fe5f6de531162ce9929a0", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "975cc87c845a103d3d1ea1ccfd68a2700c211a434d8428b10c323dc95dc5b980"}, + "idna": {:hex, :idna, "6.0.1", "1d038fb2e7668ce41fbf681d2c45902e52b3cb9e9c77b55334353b222c2ee50c", [:rebar3], [{:unicode_util_compat, "0.5.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a02c8a1c4fd601215bb0b0324c8a6986749f807ce35f25449ec9e69758708122"}, + "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, + "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, + "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, + "mix_test_watch": {:hex, :mix_test_watch, "1.0.2", "34900184cbbbc6b6ed616ed3a8ea9b791f9fd2088419352a6d3200525637f785", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "47ac558d8b06f684773972c6d04fcc15590abdb97aeb7666da19fcbfdc441a07"}, + "mox": {:hex, :mox, "1.0.0", "4b3c7005173f47ff30641ba044eb0fe67287743eec9bd9545e37f3002b0a9f8b", [:mix], [], "hexpm", "201b0a20b7abdaaab083e9cf97884950f8a30a1350a1da403b3145e213c6f4df"}, + "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.5.0", "8516502659002cec19e244ebd90d312183064be95025a319a6c7e89f4bccd65b", [:rebar3], [], "hexpm", "d48d002e15f5cc105a696cf2f1bbb3fc72b4b770a184d8420c8db20da2674b38"}, + "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm", "c790593b4c3b601f5dc2378baae7efaf5b3d73c4c6456ba85759905be792f2ac"}, +} diff --git a/test/config_cat_test.exs b/test/config_cat_test.exs index 3b642db5..51e39999 100644 --- a/test/config_cat_test.exs +++ b/test/config_cat_test.exs @@ -1,8 +1,254 @@ defmodule ConfigCatTest do use ExUnit.Case - doctest ConfigCat - test "greets the world" do - assert ConfigCat.hello() == :world + import Mox + + alias ConfigCat.FetchPolicy + alias HTTPoison.Response + + setup [:set_mox_global, :verify_on_exit!] + + Mox.defmock(APIMock, for: HTTPoison.Base) + + setup do + feature = "FEATURE" + value = "VALUE" + config = %{feature => %{"v" => value}} + + {:ok, config: config, feature: feature, value: value} + end + + describe "starting the GenServer" do + test "requires SDK key" do + assert {:error, :missing_sdk_key} == start_config_cat(nil) + end + end + + describe "manually fetching the configuration" do + test "fetches configuration from ConfigCat server", %{ + config: config, + feature: feature, + value: value + } do + sdk_key = "SDK_KEY" + url = "https://cdn.configcat.com/configuration-files/#{sdk_key}/config_v4.json" + + {:ok, client} = start_config_cat(sdk_key, fetch_policy: FetchPolicy.manual()) + + APIMock + |> stub(:get, fn ^url, _headers -> + {:ok, %Response{status_code: 200, body: Jason.encode!(config)}} + end) + + :ok = ConfigCat.force_refresh(client) + assert ConfigCat.get_value(feature, "default", client: client) == value + end + + test "sends proper cache control header on later requests" do + etag = "ETAG" + {:ok, client} = start_config_cat("SDK_KEY", fetch_policy: FetchPolicy.manual()) + + initial_response = %Response{ + status_code: 200, + body: Jason.encode!(%{}), + headers: [{"ETag", etag}] + } + + APIMock + |> stub(:get, fn _url, [] -> {:ok, initial_response} end) + + :ok = ConfigCat.force_refresh(client) + + not_modified_response = %Response{ + status_code: 304, + headers: [{"ETag", etag}] + } + + APIMock + |> expect(:get, fn _url, [{"If-None-Match", ^etag}] -> {:ok, not_modified_response} end) + + assert :ok = ConfigCat.force_refresh(client) + end + + test "retains previous config when server responds that the config hasn't changed", %{ + config: config, + feature: feature, + value: value + } do + {:ok, client} = + start_config_cat("SDK_KEY", initial_config: config, fetch_policy: FetchPolicy.manual()) + + response = %Response{ + status_code: 304, + headers: [{"ETag", "ETAG"}] + } + + APIMock + |> stub(:get, fn _url, _headers -> {:ok, response} end) + + :ok = ConfigCat.force_refresh(client) + + assert ConfigCat.get_value(feature, "default", client: client) == value + end + + @tag capture_log: true + test "handles non-200 response from ConfigCat" do + {:ok, client} = start_config_cat("SDK_KEY", fetch_policy: FetchPolicy.manual()) + response = %Response{status_code: 503} + + APIMock + |> stub(:get, fn _url, _headers -> {:ok, response} end) + + assert {:error, response} == ConfigCat.force_refresh(client) + end + + @tag capture_log: true + test "handles error response from ConfigCat" do + {:ok, client} = start_config_cat("SDK_KEY") + + error = %HTTPoison.Error{reason: "failed"} + + APIMock + |> stub(:get, fn _url, _headers -> {:error, error} end) + + assert {:error, error} == ConfigCat.force_refresh(client) + end + + test "allows base URL to be configured" do + base_url = "https://BASE_URL/" + sdk_key = "SDK_KEY" + url = "https://BASE_URL/configuration-files/#{sdk_key}/config_v4.json" + + {:ok, client} = + start_config_cat(sdk_key, base_url: base_url, fetch_policy: FetchPolicy.manual()) + + APIMock + |> expect(:get, fn ^url, _headers -> + {:ok, %Response{status_code: 200, body: Jason.encode!(%{})}} + end) + + :ok = ConfigCat.force_refresh(client) + end + end + + describe "automatically fetching the configuration" do + test "loads configuration after initialized", %{ + config: config, + feature: feature, + value: value + } do + APIMock + |> stub(:get, fn _url, _headers -> + {:ok, %Response{status_code: 200, body: Jason.encode!(config)}} + end) + + fetch_policy = FetchPolicy.auto() + {:ok, client} = start_config_cat("SDK_KEY", fetch_policy: fetch_policy) + + assert ConfigCat.get_value(feature, "default", client: client) == value + end + + test "retains previous configuration if state cannot be refreshed", %{ + feature: feature, + config: config, + value: value + } do + APIMock + |> stub(:get, fn _url, _headers -> + {:ok, %Response{status_code: 500}} + end) + + fetch_policy = FetchPolicy.auto() + + {:ok, client} = + start_config_cat("SDK_KEY", fetch_policy: fetch_policy, initial_config: config) + + assert ConfigCat.get_value(feature, "default", client: client) == value + end + end + + describe "lazily fetching the configuration" do + test "loads configuration when first attempting to get a value", %{ + config: config, + feature: feature, + value: value + } do + {:ok, client} = + start_config_cat( + "SDK_KEY", + fetch_policy: FetchPolicy.lazy(cache_expiry_seconds: 300) + ) + + APIMock + |> stub(:get, fn _url, _headers -> + {:ok, %Response{status_code: 200, body: Jason.encode!(config)}} + end) + + assert ConfigCat.get_value(feature, "default", client: client) == value + end + + test "does not reload configuration if cache has not expired", %{ + config: config, + feature: feature, + value: value + } do + {:ok, client} = + start_config_cat( + "SDK_KEY", + fetch_policy: FetchPolicy.lazy(cache_expiry_seconds: 300) + ) + + APIMock + |> expect(:get, 1, fn _url, _headers -> + {:ok, %Response{status_code: 200, body: Jason.encode!(config)}} + end) + + ConfigCat.get_value(feature, "default", client: client) + assert ConfigCat.get_value(feature, "default", client: client) == value + end + + test "refetches configuration if cache has expired", %{ + config: config, + feature: feature, + value: value + } do + {:ok, client} = + start_config_cat( + "SDK_KEY", + fetch_policy: FetchPolicy.lazy(cache_expiry_seconds: 0) + ) + + APIMock + |> expect(:get, 2, fn _url, _headers -> + {:ok, %Response{status_code: 200, body: Jason.encode!(config)}} + end) + + ConfigCat.get_value(feature, "default", client: client) + assert ConfigCat.get_value(feature, "default", client: client) == value + end + end + + describe "looking up configuration values" do + test "looks up the value for a key in the cached config", %{ + config: config, + feature: feature, + value: value + } do + {:ok, client} = + start_config_cat("SDK_KEY", initial_config: config, fetch_policy: FetchPolicy.manual()) + + assert ConfigCat.get_value(feature, "default", client: client) == value + end + + test "returns default value when config hasn't been fetched" do + {:ok, client} = start_config_cat("SDK_KEY", fetch_policy: FetchPolicy.manual()) + + assert ConfigCat.get_value("any_feature", "default", client: client) == "default" + end + end + + defp start_config_cat(sdk_key, options \\ []) do + name = UUID.uuid4() |> String.to_atom() + ConfigCat.start_link(sdk_key, Keyword.merge([api: APIMock, name: name], options)) end end diff --git a/test/fetch_policy_test.exs b/test/fetch_policy_test.exs new file mode 100644 index 00000000..902395b7 --- /dev/null +++ b/test/fetch_policy_test.exs @@ -0,0 +1,101 @@ +defmodule ConfigCat.FetchPolicyTest do + use ExUnit.Case, async: true + + alias ConfigCat.FetchPolicy + + describe "checking whether a fetch is required" do + test "is not required for a manual policy" do + policy = FetchPolicy.manual() + + refute FetchPolicy.needs_fetch?(policy, DateTime.utc_now()) + end + + test "is not required for an auto policy" do + policy = FetchPolicy.auto() + + refute FetchPolicy.needs_fetch?(policy, DateTime.utc_now()) + end + + test "is required for a lazy policy when not yet fetched" do + policy = FetchPolicy.lazy(cache_expiry_seconds: 60) + + assert FetchPolicy.needs_fetch?(policy, nil) + end + + test "is required for a lazy policy when cache has expired" do + one_minute_ago = DateTime.add(DateTime.utc_now(), -60, :second) + policy = FetchPolicy.lazy(cache_expiry_seconds: 60) + + assert FetchPolicy.needs_fetch?(policy, one_minute_ago) + end + + test "is not required for a lazy policy when cache has not expired" do + a_few_seconds_ago = DateTime.add(DateTime.utc_now(), -3, :second) + policy = FetchPolicy.lazy(cache_expiry_seconds: 60) + + refute FetchPolicy.needs_fetch?(policy, a_few_seconds_ago) + end + end + + describe "creating auto fetch policy" do + test "returns with valid interval" do + actual = FetchPolicy.auto(poll_interval_seconds: -1) + + assert actual.poll_interval_seconds == 1 + end + + test "returns with valid defaults" do + actual = FetchPolicy.auto() + + assert actual.poll_interval_seconds == 60 + assert actual.type == :auto + end + end + + describe "checking to schedule initial fetch" do + test "returns true if auto policy" do + policy = FetchPolicy.auto() + assert FetchPolicy.schedule_initial_fetch?(policy) + end + + test "returns false if manual policy" do + policy = FetchPolicy.manual() + + refute FetchPolicy.schedule_initial_fetch?(policy) + end + + test "returns false if lazy policy" do + policy = FetchPolicy.lazy(cache_expiry_seconds: 60) + + refute FetchPolicy.schedule_initial_fetch?(policy) + end + end + + describe "scheduling next fetch" do + test "sends a refresh message after poll interval" do + interval_seconds = 0 + policy = FetchPolicy.auto() |> Map.put(:poll_interval_seconds, interval_seconds) + FetchPolicy.schedule_next_fetch(policy, self()) + + start = DateTime.utc_now() + assert_receive :refresh + stop = DateTime.utc_now() + time_passed = DateTime.diff(stop, start) + assert time_passed == interval_seconds + end + + test "doesnt send a refresh message for manual policy" do + policy = FetchPolicy.manual() + FetchPolicy.schedule_next_fetch(policy, self()) + + refute_receive :refresh + end + + test "doesnt send a refresh message for lazy policy" do + policy = FetchPolicy.lazy(cache_expiry_seconds: 1) + FetchPolicy.schedule_next_fetch(policy, self()) + + refute_receive :refresh + end + end +end diff --git a/test/fixtures/testmatrix.csv b/test/fixtures/testmatrix.csv new file mode 100644 index 00000000..c1851f29 --- /dev/null +++ b/test/fixtures/testmatrix.csv @@ -0,0 +1,1012 @@ +Identifier;Email;Country;Custom1;bool30TrueAdvancedRules;boolDefaultFalse;boolDefaultTrue;double25Pi25E25Gr25Zero;doubleDefaultPi;integer25One25Two25Three25FourAdvancedRules;integerDefaultOne;string25Cat25Dog25Falcon25Horse;string25Cat25Dog25Falcon25HorseAdvancedRules;string75Cat0Dog25Falcon0Horse;stringContainsDogDefaultCat;stringDefaultCat;stringIsInDogDefaultCat;stringIsNotInDogDefaultCat;stringNotContainsDogDefaultCat +##null##;;;;true;false;true;-1.0;3.1415;-1;1;Chicken;Chicken;Chicken;Cat;Cat;Cat;Cat;Cat +a@configcat.com;a@configcat.com;Hungary;admin;false;false;true;5.561;3.1415;5;1;Cat;Dolphin;Cat;Dog;Cat;Dog;Cat;Cat +b@configcat.com;b@configcat.com;Hungary;;false;false;true;5.561;3.1415;5;1;Falcon;Dolphin;Cat;Dog;Cat;Dog;Cat;Cat +c@configcat.com;c@configcat.com;United Kingdom;admin;false;false;true;5.561;3.1415;5;1;Dog;Dolphin;Falcon;Dog;Cat;Dog;Dog;Cat +d@configcat.com;d@configcat.com;United Kingdom;;false;false;true;5.561;3.1415;5;1;Falcon;Dolphin;Cat;Dog;Cat;Cat;Dog;Cat +e@configcat.com;e@configcat.com;United States of America;;false;false;true;5.561;3.1415;5;1;Falcon;Kitten;Cat;Dog;Cat;Cat;Dog;Cat +f@configcat.com;f@configcat.com;;;false;false;true;5.561;3.1415;5;1;Cat;Kitten;Falcon;Dog;Cat;Cat;Dog;Cat +g@configcat.com;g@configcat.com;;;false;false;true;5.561;3.1415;5;1;Horse;Kitten;Cat;Dog;Cat;Cat;Dog;Cat +h@configcat.com;h@configcat.com;;;false;false;true;5.561;3.1415;5;1;Cat;Kitten;Cat;Dog;Cat;Cat;Dog;Cat +i@configcat.com;i@configcat.com;;admin;true;false;true;5.561;3.1415;5;1;Cat;Lion;Falcon;Dog;Cat;Dog;Dog;Cat +j@configcat.com;j@configcat.com;;;false;false;true;5.561;3.1415;5;1;Cat;Kitten;Falcon;Dog;Cat;Cat;Dog;Cat +stern@msn.com;stern@msn.com;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +sarahs@yahoo.com;sarahs@yahoo.com;##null##;##null##;true;false;true;0.0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +luebke@hotmail.com;luebke@hotmail.com;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +padme@icloud.com;padme@icloud.com;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +claypool@aol.com;claypool@aol.com;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +bogjobber@verizon.net;bogjobber@verizon.net;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +cliffordj@aol.com;cliffordj@aol.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog +bryanw@verizon.net;bryanw@verizon.net;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog +jfmulder@sbcglobal.net;jfmulder@sbcglobal.net;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +raines@live.com;raines@live.com;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog +ribet@yahoo.ca;ribet@yahoo.ca;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +nacho@gmail.com;nacho@gmail.com;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Dog;Dog +sherzodr@att.net;sherzodr@att.net;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +oster@optonline.net;oster@optonline.net;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +josem@icloud.com;josem@icloud.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog +hedwig@outlook.com;hedwig@outlook.com;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +camenisch@yahoo.com;camenisch@yahoo.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +ccohen@comcast.net;ccohen@comcast.net;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +techie@att.net;techie@att.net;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +damian@gmail.com;damian@gmail.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog +psharpe@comcast.net;psharpe@comcast.net;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +ebassi@me.com;ebassi@me.com;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +curly@aol.com;curly@aol.com;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +rddesign@optonline.net;rddesign@optonline.net;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +boftx@gmail.com;boftx@gmail.com;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +eegsa@yahoo.ca;eegsa@yahoo.ca;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +ganter@gmail.com;ganter@gmail.com;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Dog;Dog +mleary@att.net;mleary@att.net;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog +kassiesa@icloud.com;kassiesa@icloud.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +peterhoeg@outlook.com;peterhoeg@outlook.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog +mhanoh@yahoo.ca;mhanoh@yahoo.ca;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +henkp@yahoo.com;henkp@yahoo.com;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +krueger@sbcglobal.net;krueger@sbcglobal.net;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Dog;Dog +barjam@yahoo.com;barjam@yahoo.com;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +mirod@msn.com;mirod@msn.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +marioph@yahoo.com;marioph@yahoo.com;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog +niknejad@optonline.net;niknejad@optonline.net;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +bwcarty@sbcglobal.net;bwcarty@sbcglobal.net;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +mcast@aol.com;mcast@aol.com;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +portscan@msn.com;portscan@msn.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog +pereinar@yahoo.ca;pereinar@yahoo.ca;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +floxy@verizon.net;floxy@verizon.net;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog +mhassel@comcast.net;mhassel@comcast.net;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog +mgemmons@optonline.net;mgemmons@optonline.net;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Dog;Dog +luvirini@mac.com;luvirini@mac.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +gslondon@gmail.com;gslondon@gmail.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +lamky@comcast.net;lamky@comcast.net;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Dog;Dog +lipeng@aol.com;lipeng@aol.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +keiji@mac.com;keiji@mac.com;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Dog;Dog +gumpish@verizon.net;gumpish@verizon.net;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog +tromey@hotmail.com;tromey@hotmail.com;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +miyop@aol.com;miyop@aol.com;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +natepuri@me.com;natepuri@me.com;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +sbmrjbr@outlook.com;sbmrjbr@outlook.com;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Horse;Dog;Falcon;Cat;Cat;Cat;Dog;Dog +hahiss@gmail.com;hahiss@gmail.com;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog +gmcgath@yahoo.ca;gmcgath@yahoo.ca;##null##;##null##;true;false;true;0.0;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog +zavadsky@msn.com;zavadsky@msn.com;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +munson@gmail.com;munson@gmail.com;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog +jfriedl@yahoo.com;jfriedl@yahoo.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +lushe@yahoo.ca;lushe@yahoo.ca;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Dog;Dog +skythe@gmail.com;skythe@gmail.com;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +lipeng@aol.com;lipeng@aol.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +jigsaw@me.com;jigsaw@me.com;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog +schwaang@gmail.com;schwaang@gmail.com;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog +eurohack@verizon.net;eurohack@verizon.net;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog +janneh@icloud.com;janneh@icloud.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +frederic@me.com;frederic@me.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +facet@optonline.net;facet@optonline.net;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +uncle@aol.com;uncle@aol.com;##null##;##null##;false;false;true;0.0;3.1415;3;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +wilsonpm@comcast.net;wilsonpm@comcast.net;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog +garland@optonline.net;garland@optonline.net;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +srour@yahoo.com;srour@yahoo.com;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog +inico@hotmail.com;inico@hotmail.com;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +plover@comcast.net;plover@comcast.net;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog +amichalo@comcast.net;amichalo@comcast.net;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +mirod@hotmail.com;mirod@hotmail.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog +bester@mac.com;bester@mac.com;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +kildjean@verizon.net;kildjean@verizon.net;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +arandal@comcast.net;arandal@comcast.net;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +bartlett@yahoo.com;bartlett@yahoo.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +zyghom@icloud.com;zyghom@icloud.com;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog +valdez@mac.com;valdez@mac.com;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +scato@yahoo.com;scato@yahoo.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Dog;Dog +sinkou@live.com;sinkou@live.com;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +evilopie@comcast.net;evilopie@comcast.net;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog +ducasse@gmail.com;ducasse@gmail.com;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog +sthomas@sbcglobal.net;sthomas@sbcglobal.net;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Dog;Dog +plover@msn.com;plover@msn.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +mavilar@yahoo.com;mavilar@yahoo.com;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +josephw@msn.com;josephw@msn.com;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog +qmacro@yahoo.com;qmacro@yahoo.com;##null##;##null##;true;false;true;0.0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +munson@mac.com;munson@mac.com;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Dog;Dog +paulv@mac.com;paulv@mac.com;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +dogdude@hotmail.com;dogdude@hotmail.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Dog;Dog +symbolic@yahoo.ca;symbolic@yahoo.ca;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog +carcus@yahoo.com;carcus@yahoo.com;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +sblack@me.com;sblack@me.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Dog;Dog +richard@gmail.com;richard@gmail.com;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog +tbusch@yahoo.ca;tbusch@yahoo.ca;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog +gtaylor@aol.com;gtaylor@aol.com;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +burniske@att.net;burniske@att.net;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +bebing@me.com;bebing@me.com;##null##;##null##;false;false;true;0.0;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +joglo@gmail.com;joglo@gmail.com;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +chrwin@sbcglobal.net;chrwin@sbcglobal.net;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +chaikin@yahoo.com;chaikin@yahoo.com;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +jigsaw@verizon.net;jigsaw@verizon.net;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +wbarker@yahoo.ca;wbarker@yahoo.ca;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +ganter@verizon.net;ganter@verizon.net;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog +eegsa@att.net;eegsa@att.net;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +sethbrown@hotmail.com;sethbrown@hotmail.com;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Dog;Dog +solomon@me.com;solomon@me.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog +tellis@yahoo.ca;tellis@yahoo.ca;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +jshirley@optonline.net;jshirley@optonline.net;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +tattooman@verizon.net;tattooman@verizon.net;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog +bescoto@yahoo.com;bescoto@yahoo.com;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog +hstiles@comcast.net;hstiles@comcast.net;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog +gumpish@optonline.net;gumpish@optonline.net;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Dog;Dog +hikoza@optonline.net;hikoza@optonline.net;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog +slanglois@yahoo.ca;slanglois@yahoo.ca;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +kmiller@verizon.net;kmiller@verizon.net;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog +bowmanbs@hotmail.com;bowmanbs@hotmail.com;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog +penna@msn.com;penna@msn.com;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog +rnelson@live.com;rnelson@live.com;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog +johndo@aol.com;johndo@aol.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +shrapnull@att.net;shrapnull@att.net;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +lcheng@comcast.net;lcheng@comcast.net;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +cyrus@msn.com;cyrus@msn.com;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +suresh@yahoo.ca;suresh@yahoo.ca;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +elflord@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +sassen@verizon.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dbindel@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +morain@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +timtroyr@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +esbeck@live.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +ilyaz@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +grinder@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +trieuvan@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +koudas@msn.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +specprog@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +nichoj@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +sopwith@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +odlyzko@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +warrior@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +budinger@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +lstein@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +kmiller@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +british@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +webinc@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +kohlis@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +matthijs@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mmccool@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +ribet@hotmail.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +wildfire@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +makarow@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +garland@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +kjohnson@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +oneiros@sbcglobal.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +jaxweb@gmail.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +raides@msn.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +cantu@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +msherr@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dwsauder@aol.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +comdig@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +esokullu@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +kjetilk@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +boomzilla@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +cvrcek@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +iamcal@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +grdschl@att.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jgwang@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +stevelim@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +weidai@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +dpitts@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +bebing@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +wikinerd@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +pfitza@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +policies@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +niknejad@me.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +aukjan@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dleconte@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +noahb@aol.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bdbrown@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +adillon@att.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +eegsa@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +chunzi@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +privcan@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +mglee@hotmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +leocharre@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +dwendlan@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +lpalmer@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +emcleod@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +breegster@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mwandel@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +stewwy@me.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +drolsky@live.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +lukka@live.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +geekgrl@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +epeeist@me.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +papathan@verizon.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +singh@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +njpayne@aol.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +willg@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jimmichie@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +frosal@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +dunstan@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +parasite@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +firstpr@msn.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +konit@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +amaranth@msn.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mcsporran@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gommix@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dprice@verizon.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +lcheng@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dwendlan@optonline.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +miami@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +ajlitt@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +grdschl@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +andersbr@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +nacho@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +hoangle@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jbuchana@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +knorr@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +saridder@gmail.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +scotfl@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +skoch@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +luebke@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +bsikdar@live.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +ryanvm@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dburrows@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +seebs@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mgemmons@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +kobayasi@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +marcs@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +netsfr@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +martink@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bflong@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +bhima@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +oster@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +teverett@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +kannan@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +yzheng@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +msusa@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +hmbrand@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +falcao@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +uraeus@live.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +dunstan@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +oracle@yahoo.ca;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +tbeck@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +scottzed@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +sblack@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +yenya@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bjoern@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +benanov@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +preneel@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +punkis@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +rwelty@comcast.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +penna@me.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +baveja@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +louise@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +arachne@icloud.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +hahiss@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +wayward@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +pajas@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +intlprog@comcast.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +hermanab@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +presoff@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +trygstad@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +denton@optonline.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +skythe@live.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +hmbrand@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +lushe@sbcglobal.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +magusnet@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ullman@optonline.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +jyoliver@optonline.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +flavell@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +ianbuck@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +satch@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gommix@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +rnelson@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +crusader@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +rddesign@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +nanop@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +ngedmond@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +munjal@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +unreal@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jemarch@sbcglobal.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +shawnce@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +nweaver@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +british@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +ccohen@verizon.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +amaranth@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +louise@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +atmarks@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +iamcal@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +snunez@msn.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mrobshaw@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +denton@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +konst@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +louise@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +wetter@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +kohlis@att.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +monkeydo@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +melnik@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +munge@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +stefano@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +giafly@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +gbacon@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +dgriffith@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dkrishna@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +firstpr@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +nichoj@comcast.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +aibrahim@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +inico@aol.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +ribet@sbcglobal.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +ajlitt@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +errxn@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +lstein@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mgemmons@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jadavis@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +zilla@hotmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +bogjobber@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +shazow@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +rgarton@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +meder@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +hedwig@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dhwon@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mstrout@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +manuals@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +andrewik@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +hahsler@icloud.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +miami@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +facet@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +zeitlin@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +lamprecht@aol.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +johnh@mac.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +mrsam@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +lipeng@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +dsowsy@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +philen@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +kjohnson@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +nelson@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +syncnine@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +pgottsch@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jfmulder@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jacks@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +mrdvt@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +cfhsoft@outlook.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +kodeman@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mbrown@comcast.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jaxweb@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +symbolic@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +denism@att.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +hager@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +zavadsky@yahoo.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mugwump@hotmail.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +geekgrl@comcast.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +dprice@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +petersko@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +netsfr@aol.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +tbmaddux@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +meder@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +benits@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +timlinux@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +heroine@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hachi@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dkrishna@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +sthomas@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +thaljef@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +ganter@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +drjlaw@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +timtroyr@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +smcnabb@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +fwiles@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +delpino@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +whimsy@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +lbecchi@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jbearp@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +tamas@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +panolex@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +lridener@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +wayward@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +amaranth@me.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +garland@yahoo.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +rfisher@live.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +stern@verizon.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +mavilar@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +rfisher@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +tarreau@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +koudas@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +bwcarty@mac.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jeteve@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +pmint@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +barlow@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +punkis@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jfinke@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +unreal@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +dwendlan@sbcglobal.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dbrobins@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +rasca@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jfriedl@att.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +clkao@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +noahb@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ducasse@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jrkorson@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +hmbrand@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +corrada@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +tmaek@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +richard@mac.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +pkplex@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kwilliams@icloud.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mcrawfor@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +webteam@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +leakin@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ebassi@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +njpayne@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +konst@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +godeke@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +godeke@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +glenz@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +fallorn@comcast.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +nacho@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dkeeler@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +adhere@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gfody@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +codex@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +erynf@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +monkeydo@verizon.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +lauronen@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dinther@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +miami@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kewley@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dkeeler@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +galbra@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mastinfo@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +kempsonc@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +andale@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +airship@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +xtang@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jhardin@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +frederic@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +matsn@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +pereinar@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +salesgeek@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +tezbo@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +keijser@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +chaki@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +wetter@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +delpino@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +thassine@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +hoangle@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +bester@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jdhedden@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +killmenow@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +retoh@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +goresky@yahoo.ca;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +microfab@att.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +pfitza@aol.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +onestab@hotmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +aracne@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +sherzodr@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +feamster@verizon.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +hyper@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jmgomez@me.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +fwitness@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +storerm@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +improv@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +arnold@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +blixem@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +rohitm@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +rfisher@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dwsauder@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +alastair@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +multiplx@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +caidaperl@icloud.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +nacho@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +keutzer@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +lbaxter@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +hachi@live.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mfburgo@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gfody@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +jaxweb@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +wojciech@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +doche@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +josephw@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +hakim@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +lstein@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +conteb@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +wildixon@att.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +oechslin@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +metzzo@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +kosact@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kodeman@optonline.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +ebassi@hotmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +pgolle@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jdhildeb@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +garyjb@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +gslondon@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +maratb@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +marnanel@optonline.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +rgiersig@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +gozer@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +valdez@hotmail.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +mnemonic@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +paina@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +syncnine@aol.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +melnik@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jaesenj@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +sekiya@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +tbusch@aol.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +whimsy@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +firstpr@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +bartlett@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +bester@att.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +gordonjcp@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +bcevc@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +sethbrown@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mcmillan@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +raines@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +psharpe@comcast.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bachmann@gmail.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +leslie@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hager@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +ismail@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +nacho@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +kohlis@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +lahvak@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +gozer@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +willg@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +zavadsky@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +steve@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ccohen@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +msusa@mac.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jsmith@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jshearer@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +pgottsch@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +majordick@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +sjava@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +rupak@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +empathy@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +intlprog@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +matthijs@gmail.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +portscan@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +morain@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +gozer@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +akoblin@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mhassel@comcast.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +spadkins@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +rohitm@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mwandel@yahoo.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +warrior@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jipsen@aol.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +bancboy@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +corrada@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +wojciech@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +marcs@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +atmarks@me.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +quinn@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dkeeler@aol.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +pizza@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +empathy@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +dmouse@aol.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +dinther@comcast.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +pappp@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +dougj@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +cfhsoft@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +maratb@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +stewwy@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +sravani@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +tmaek@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +juliano@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mcsporran@optonline.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +mgemmons@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +seasweb@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +lushe@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +schumer@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gfody@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mlewan@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +eegsa@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +rhavyn@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +cremonini@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +boftx@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +smartfart@outlook.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +uncled@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +quantaman@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +heidrich@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +moinefou@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ilial@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +fraser@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +csilvers@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +csilvers@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +kalpol@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +punkis@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +nacho@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mcsporran@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jaarnial@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gboss@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +henkp@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +philb@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +hllam@yahoo.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +roamer@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +geekgrl@comcast.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +cantu@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +firstpr@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +hmbrand@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +arandal@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jaarnial@live.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +hoyer@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mmccool@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +smcnabb@att.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +pakaste@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +panolex@mac.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hikoza@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +larry@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +arandal@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dwsauder@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +ducasse@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +policies@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +sblack@yahoo.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +hstiles@comcast.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +lushe@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +devphil@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dowdy@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +arachne@verizon.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +donev@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bowmanbs@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +roesch@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +lridener@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hmbrand@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +sopwith@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +vsprintf@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dwsauder@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +symbolic@aol.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +gbacon@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hillct@verizon.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +earmstro@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +studyabr@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +shawnce@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +boser@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gknauss@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +marcs@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +bruck@icloud.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +comdig@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +floxy@yahoo.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +tmccarth@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +darin@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +mcraigw@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +fhirsch@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +unreal@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +crypt@comcast.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +pakaste@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +denism@att.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +staffelb@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jonas@outlook.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +staikos@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +mfburgo@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +psichel@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +brainless@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jmgomez@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +wsnyder@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +carcus@yahoo.ca;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dmouse@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +graham@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +murdocj@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +reziac@att.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +caronni@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +hoyer@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +amcuri@verizon.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mstrout@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +osrin@verizon.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +geeber@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +konit@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +mxiao@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ryanshaw@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +bowmanbs@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +yamla@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ardagna@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +darin@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jmorris@me.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +valdez@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +haddawy@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +biglou@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +pplinux@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +afeldspar@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +campbell@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +akoblin@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +nwiger@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +stinson@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +daveed@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +arachne@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +augusto@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +xtang@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +itstatus@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ebassi@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kspiteri@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +kewley@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +yamla@me.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +oevans@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +ebassi@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +scitext@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +sisyphus@verizon.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jandrese@live.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jamuir@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +dobey@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +rande@live.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dkasak@yahoo.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +greear@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +thaljef@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +sjmuir@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +joehall@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +kronvold@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jmorris@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +ajohnson@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +russotto@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +pgolle@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +mrdvt@aol.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +starstuff@icloud.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +jesse@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +luebke@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +emmanuel@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +imightb@msn.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +wbarker@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +luvirini@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +ylchang@yahoo.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +elflord@icloud.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +scottzed@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +mcraigw@yahoo.ca;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +nacho@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +rwelty@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +subir@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +tbusch@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +rupak@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +giafly@aol.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +british@outlook.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hllam@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +fatelk@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +parsimony@verizon.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +tbeck@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +citizenl@optonline.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jimxugle@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +starstuff@sbcglobal.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bader@icloud.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +starstuff@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +satishr@yahoo.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +ilikered@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +bader@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +yruan@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +skoch@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +bader@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +smallpaul@sbcglobal.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +stern@verizon.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +feamster@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mcnihil@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +firstpr@msn.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +bmorrow@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +laird@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +ingolfke@msn.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +irving@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +monopole@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +keiji@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +wortmanj@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +keijser@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +aschmitz@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +tangsh@mac.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jdray@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +kewley@yahoo.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +policies@verizon.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +wayward@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +errxn@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +fglock@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +kmself@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +amichalo@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mwandel@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +thowell@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +pedwards@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dmiller@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +choset@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dbrobins@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +pizza@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +noahb@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jespley@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jfriedl@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +arebenti@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +eidac@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jipsen@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +malin@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jramio@optonline.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jsnover@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +martyloo@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +danny@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bruck@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jfmulder@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +wsnyder@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +leslie@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +noticias@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +cgcra@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +louise@me.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +rasca@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +cvrcek@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +chaffar@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +webdragon@att.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +keutzer@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +knorr@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +kawasaki@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +ducasse@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +satishr@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +drewf@comcast.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +martyloo@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +lstein@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +nighthawk@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +debest@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +cyrus@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dogdude@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +yruan@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +bmidd@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +policies@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +treit@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +animats@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kawasaki@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jramio@yahoo.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +josephw@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +rgarcia@me.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +ryanvm@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +rnewman@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +yangyan@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +tubesteak@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +munjal@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +pgolle@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +milton@icloud.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +harryh@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +howler@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +drewf@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +cantu@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +leslie@optonline.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mfleming@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +nelson@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +valdez@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jsmith@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +djpig@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +bader@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +galbra@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dawnsong@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mcrawfor@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +pthomsen@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +raides@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +ahuillet@icloud.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +kostas@aol.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +lridener@att.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +maneesh@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +sartak@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +rohitm@comcast.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +heidrich@mac.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +koudas@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +okroeger@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +cgcra@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +janusfury@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +seurat@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dhrakar@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +delpino@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +bebing@msn.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +keiji@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +okroeger@hotmail.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +gward@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jusdisgi@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +sakusha@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +rande@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +mwitte@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +alhajj@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +marcs@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +juerd@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +sethbrown@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kdawson@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +mfburgo@aol.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +crandall@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +schwaang@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +mrsam@icloud.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +szymansk@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +epeeist@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +miyop@sbcglobal.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +wainwrig@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +pereinar@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +killmenow@mac.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +dsowsy@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +forsberg@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +amaranth@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +mkearl@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jandrese@live.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +openldap@msn.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +world@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +adamk@att.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +pdbaby@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hellfire@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +firstpr@optonline.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kenja@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +leslie@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +bogjobber@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +hauma@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +hoangle@mac.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +nimaclea@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +fraterk@icloud.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +ninenine@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dogdude@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +campware@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +amimojo@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +karasik@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +yenya@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +stevelim@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dvdotnet@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bonmots@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +schumer@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +andrei@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +alfred@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +multiplx@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +tjensen@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dmath@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +kostas@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +carmena@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +terjesa@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +tjensen@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +schwaang@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +nimaclea@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jaesenj@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jimxugle@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +mobileip@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +nullchar@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +crowemojo@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +hermanab@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +esbeck@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +naoya@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +lpalmer@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +dgatwood@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jtorkbob@att.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +rfoley@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +andale@comcast.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mlewan@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +ianbuck@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +syrinx@live.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +imightb@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +gozer@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +gozer@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +shawnce@gmail.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +lauronen@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +raines@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jfriedl@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hstiles@comcast.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +smpeters@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +thurston@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +flaviog@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +mnemonic@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +privcan@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +mobileip@verizon.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gbacon@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +caronni@optonline.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +tbeck@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +keijser@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +scotfl@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +ryanshaw@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +eimear@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +noticias@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +leocharre@yahoo.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +killmenow@yahoo.ca;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +petersen@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +bdthomas@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mavilar@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +isaacson@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +miyop@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +bwcarty@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +warrior@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +magusnet@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +crowemojo@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +crypt@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +kempsonc@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +kayvonf@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +noahb@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +symbolic@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +wsnyder@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +pdbaby@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jfriedl@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +openldap@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +jwarren@optonline.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dsugal@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kayvonf@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +nasarius@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +bolow@mac.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +tbmaddux@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +maradine@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +breegster@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +breegster@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +openldap@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +jshirley@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +tfinniga@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +delpino@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +stecoop@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jnolan@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jhardin@yahoo.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +teverett@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +wsnyder@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +treeves@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +garland@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ullman@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +sumdumass@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat diff --git a/test/fixtures/testmatrix_number.csv b/test/fixtures/testmatrix_number.csv new file mode 100644 index 00000000..56a53508 --- /dev/null +++ b/test/fixtures/testmatrix_number.csv @@ -0,0 +1,26 @@ +Identifier;Email;Country;Custom1;numberWithPercentage;number +##null##;;;;Default;Default +id1;;;0;<2.1;<>5 +id1;;;0.0;<2.1;<>5 +id1;;;0,0;<2.1;<>5 +id1;;;0.2;<2.1;<>5 +id2;;;0,2;<2.1;<>5 +id3;;;1;<2.1;<>5 +id4;;;1.0;<2.1;<>5 +id5;;;1,0;<2.1;<>5 +id6;;;1.5;<2.1;<>5 +id7;;;1,5;<2.1;<>5 +id8;;;2.1;<=2,1;<>5 +id9;;;2,1;<=2,1;<>5 +id10;;;3.50;=3.5;<>5 +id11;;;3,50;=3.5;<>5 +id12;;;5;>=5;Default +id13;;;5.0;>=5;Default +id14;;;5,0;>=5;Default +id13;;;5.76;>5;<>5 +id14;;;5,76;>5;<>5 +id15;;;4;<>4.2;<>5 +id16;;;4.0;<>4.2;<>5 +id17;;;4,0;<>4.2;<>5 +id18;;;4.2;80%;<>5 +id19;;;4,2;20%;<>5 diff --git a/test/fixtures/testmatrix_semantic.csv b/test/fixtures/testmatrix_semantic.csv new file mode 100644 index 00000000..a5a70465 --- /dev/null +++ b/test/fixtures/testmatrix_semantic.csv @@ -0,0 +1,36 @@ +Identifier;Email;Country;Custom1;isOneOf;isOneOfWithPercentage;isNotOneOf;isNotOneOfWithPercentage;lessThanWithPercentage;relations +##null##;;;;Default;Default;Default;Default;Default;Default +id1;;;0.0.0;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );< 1.0.0;< 1.0.0 +id1;;;0.1.0;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );< 1.0.0;< 1.0.0 +id1;;;0.2.1;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );< 1.0.0;< 1.0.0 +id1;;;1;Default;80%;Default;80%;20%;Default +id2;;;1.0;Default;80%;Default;80%;80%;Default +id3;;;1.0.0;Is one of (1.0.0);is one of (1.0.0);Default;80%;80%;<=1.0.0 +id4;;;1.0.0.0;Default;80%;Default;20%;20%;Default +id5;;;1.0.0.0.0;Default;80%;Default;80%;80%;Default +id6;;;1.0.1;Default;80%;Is not one of (1.0.0, 3.0.1);Is not one of (1.0.0, 3.0.1);80%;Default +id7;;;1.0.11;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );20%;Default +id8;;;1.0.111;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default +id9;;;1.0.2;Default;20%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default +id10;;;1.0.3;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default +id11;;;1.0.4;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default +id12;;;1.0.5;Default;20%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default +id13;;;1.1.0;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default +id14;;;1.1.1;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default +id15;;;1.1.2;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default +id16;;;1.1.3;Default;20%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );20%;Default +id17;;;1.1.4;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );20%;Default +id18;;;1.1.5;Default;20%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default +id19;;;1.9.0;Default;20%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default +id20;;;1.9.99;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );20%;Default +id21;;;2.0.0;Default;80%;Is not one of (1.0.0, 3.0.1);Is not one of (1.0.0, 3.0.1);20%;>=2.0.0 +id22;;;2.0.1;Is one of ( , 2.0.1, 2.0.2, );80%;Is not one of (1.0.0, 3.0.1);Is not one of (1.0.0, 3.0.1);80%;>2.0.0 +id23;;;2.0.11;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );20%;>2.0.0 +id24;;;2.0.2;Is one of ( , 2.0.1, 2.0.2, );80%;Is not one of (1.0.0, 3.0.1);Is not one of (1.0.0, 3.0.1);80%;>2.0.0 +id25;;;2.0.3;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;>2.0.0 +id26;;;3.0.0;Is one of (3.0.0);80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;>2.0.0 +id27;;;3.0.1;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );20%;>2.0.0 +id28;;;3.1.0;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;>2.0.0 +id28;;;3.1.1;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;>2.0.0 +id29;;;5.0.0;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;>2.0.0 +id30;;;5.99.999;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );20%;>2.0.0 diff --git a/test/fixtures/testmatrix_semantic_2.csv b/test/fixtures/testmatrix_semantic_2.csv new file mode 100644 index 00000000..449f8632 --- /dev/null +++ b/test/fixtures/testmatrix_semantic_2.csv @@ -0,0 +1,95 @@ +Identifier;Email;Country;AppVersion;precedenceTests +dontcare;;;1.9.1-1;< 1.9.1-2 +dontcare;;;1.9.1-2;< 1.9.1-10 +dontcare;;;1.9.1-10;< 1.9.1-10a +dontcare;;;1.9.1-10a;< 1.9.1-1a +dontcare;;;1.9.1-1a;< 1.9.1-alpha +dontcare;;;1.9.1-alpha;< 1.9.99-alpha +dontcare;;;1.9.99-alpha;= 1.9.99-alpha +dontcare;;;1.9.99-alpha+build1;= 1.9.99-alpha +dontcare;;;1.9.99-alpha+build2;= 1.9.99-alpha +dontcare;;;1.9.99-alpha2;< 1.9.99-beta +dontcare;;;1.9.99-beta;< 1.9.99-rc +dontcare;;;1.9.99-rc;< 1.9.99-rc.1 +dontcare;;;1.9.99-rc.1;< 1.9.99-rc.2 +dontcare;;;1.9.99-rc.2;< 1.9.99-rc.20 +dontcare;;;1.9.99-rc.9;< 1.9.99-rc.20 +dontcare;;;1.9.99-rc.20;< 1.9.99-rc.20a +dontcare;;;1.9.99-rc.20a;< 1.9.99-rc.2a +dontcare;;;1.9.99-rc.2a;< 1.9.99 +dontcare;;;1.9.99;< 1.9.100 +dontcare;;;1.9.100;< 1.10.0-alpha +dontcare;;;1.10.0-alpha;<= 1.10.0-alpha +dontcare;;;1.10.0;<= 1.10.0 +dontcare;;;1.10.1;<= 1.10.1 +dontcare;;;1.10.2;<= 1.10.3 +dontcare;;;2.0.0;= 2.0.0 +dontcare;;;2.0.0+build3;= 2.0.0 +dontcare;;;2.0.0+001;= 2.0.0 +dontcare;;;2.0.0+20130313144700;= 2.0.0 +dontcare;;;2.0.0+exp.sha.5114f85;= 2.0.0 +dontcare;;;3.0.0;= 3.0.0+build3 +dontcare;;;4.0.0;= 4.0.0+001 +dontcare;;;5.0.0;= 5.0.0+20130313144700 +dontcare;;;6.0.0;= 6.0.0+exp.sha.5114f85 +dontcare;;;7.0.0-patch+metadata;= 7.0.0-patch +dontcare;;;8.0.0-patch+metadata;= 8.0.0-patch+anothermetadata +dontcare;;;9.0.0-patch;= 9.0.0-patch+metadata +dontcare;;;10.0.0;DEFAULT-FROM-CC-APP +dontcare;;;104.0.0;> 103.0.0 +dontcare;;;103.0.0;>= 103.0.0 +dontcare;;;102.0.0;>= 101.0.0 +dontcare;;;101.0.0;>= 101.0.0 +dontcare;;;90.104.0;> 90.103.0 +dontcare;;;90.103.0;>= 90.103.0 +dontcare;;;90.102.0;>= 90.101.0 +dontcare;;;90.101.0;>= 90.101.0 +dontcare;;;80.0.104;> 80.0.103 +dontcare;;;80.0.103;>= 80.0.103 +dontcare;;;80.0.102;>= 80.0.101 +dontcare;;;80.0.101;>= 80.0.101 +dontcare;;;73.0.0;>= 73.0.0-beta.2 +dontcare;;;72.0.0;> 72.0.0-beta.2 +dontcare;;;72.0.0-beta.2;> 72.0.0-beta.1 +dontcare;;;72.0.0-beta.1;> 72.0.0-beta +dontcare;;;72.0.0-beta;> 72.0.0-alpha +dontcare;;;72.0.0-alpha;> 72.0.0-1a +dontcare;;;72.0.0-1a;> 72.0.0-10a +dontcare;;;72.0.0-10aa;> 72.0.0-10a +dontcare;;;72.0.0-10a;> 72.0.0-2 +dontcare;;;72.0.0-2;> 72.0.0-1 +dontcare;;;71.0.0+metadata;>= 71.0.0+anothermetadata +dontcare;;;71.0.0-patch3+metadata;>= 71.0.0-patch3+anothermetadata +dontcare;;;71.0.0-patch2+metadata;>= 71.0.0-patch2 +dontcare;;;71.0.0-patch1;>= 71.0.0-patch1+metadata +dontcare;;;60.73.0;>= 60.73.0-beta.2 +dontcare;;;60.72.0;> 60.72.0-beta.2 +dontcare;;;60.72.0-beta.2;> 60.72.0-beta.1 +dontcare;;;60.72.0-beta.1;> 60.72.0-beta +dontcare;;;60.72.0-beta;> 60.72.0-alpha +dontcare;;;60.72.0-alpha;> 60.72.0-1a +dontcare;;;60.72.0-1a;> 60.72.0-10a +dontcare;;;60.72.0-10aa;> 60.72.0-10a +dontcare;;;60.72.0-10a;> 60.72.0-2 +dontcare;;;60.72.0-2;> 60.72.0-1 +dontcare;;;60.71.0+metadata;>= 60.71.0+anothermetadata +dontcare;;;60.71.0-patch3+metadata;>= 60.71.0-patch3+anothermetadata +dontcare;;;60.71.0-patch2+metadata;>= 60.71.0-patch2 +dontcare;;;60.71.0-patch1;>= 60.71.0-patch1+metadata +dontcare;;;50.60.73;>= 50.60.73-beta.2 +dontcare;;;50.60.72;> 50.60.72-beta.2 +dontcare;;;50.60.72-beta.2;> 50.60.72-beta.1 +dontcare;;;50.60.72-beta.1;> 50.60.72-beta +dontcare;;;50.60.72-beta;> 50.60.72-alpha +dontcare;;;50.60.72-alpha;> 50.60.72-1a +dontcare;;;50.60.72-1a;> 50.60.72-10a +dontcare;;;50.60.72-10aa;> 50.60.72-10a +dontcare;;;50.60.72-10a;> 50.60.72-2 +dontcare;;;50.60.72-2;> 50.60.72-1 +dontcare;;;50.60.71+metadata;>= 50.60.71+anothermetadata +dontcare;;;50.60.71-patch3+metadata;>= 50.60.71-patch3+anothermetadata +dontcare;;;50.60.71-patch2+metadata;>= 50.60.71-patch2 +dontcare;;;50.60.71-patch1;>= 50.60.71-patch1+metadata +dontcare;;;50.60.71-patch1+anothermetadata;>= 50.60.71-patch1+metadata +dontcare;;;40.0.0-patch;>= 40.0.0-patch +dontcare;;;30.0.0-beta;>= 30.0.0-alpha diff --git a/test/fixtures/testmatrix_sensitive.csv b/test/fixtures/testmatrix_sensitive.csv new file mode 100644 index 00000000..1fe9dbf0 --- /dev/null +++ b/test/fixtures/testmatrix_sensitive.csv @@ -0,0 +1,8 @@ +Identifier;Email;Country;Custom1;isOneOfSensitive;isNotOneOfSensitive +##null##;;;;ToAll;ToAll +id1;macska@example.com;;;Macska;Kigyo +Kutya;;;;Allat;ToAll +Sas;;;;ToAll;Kigyo +Kutya;macska@example.com;;;Macska;ToAll +id1;;Scotland;;Britt;Kigyo +Macska;;USA;;ToAll;Ireland diff --git a/test/integration_test.exs b/test/integration_test.exs new file mode 100644 index 00000000..e7a4e911 --- /dev/null +++ b/test/integration_test.exs @@ -0,0 +1,57 @@ +defmodule ConfigCat.IntegrationTest do + use ExUnit.Case, async: true + + alias ConfigCat.FetchPolicy + + @sdk_key "PKDVCLf-Hq-h-kCzMp-L7Q/PaDVCFk9EpmD6sLpGLltTA" + + test "fetches config" do + {:ok, client} = start_config_cat(@sdk_key) + + :ok = ConfigCat.force_refresh(client) + + assert ConfigCat.get_value("keySampleText", "default value", client: client) == + "This text came from ConfigCat" + end + + test "maintains previous configuration when config has not changed between refreshes" do + {:ok, client} = start_config_cat(@sdk_key) + + :ok = ConfigCat.force_refresh(client) + :ok = ConfigCat.force_refresh(client) + + assert ConfigCat.get_value("keySampleText", "default value", client: client) == + "This text came from ConfigCat" + end + + test "lazily fetches configuration when using lazy loading" do + {:ok, client} = + start_config_cat( + @sdk_key, + fetch_policy: FetchPolicy.lazy(cache_expiry_seconds: 5) + ) + + assert ConfigCat.get_value("keySampleText", "default value", client: client) == + "This text came from ConfigCat" + end + + @tag capture_log: true + test "handles errors from ConfigCat server" do + {:ok, client} = start_config_cat("invalid_sdk_key") + + {:error, response} = ConfigCat.force_refresh(client) + assert response.status_code == 404 + end + + @tag capture_log: true + test "handles invalid base_url" do + {:ok, client} = start_config_cat(@sdk_key, base_url: "https://invalidcdn.configcat.com") + + assert {:error, %HTTPoison.Error{}} = ConfigCat.force_refresh(client) + end + + defp start_config_cat(sdk_key, options \\ []) do + name = UUID.uuid4() |> String.to_atom() + ConfigCat.start_link(sdk_key, Keyword.merge([name: name], options)) + end +end diff --git a/test/rollout/comparator_test.exs b/test/rollout/comparator_test.exs new file mode 100644 index 00000000..ccf02b6e --- /dev/null +++ b/test/rollout/comparator_test.exs @@ -0,0 +1,258 @@ +defmodule ConfigCat.Rollout.ComparatorTest do + @moduledoc """ + All evaluators are tested exhaustively in ConfigCat.RolloutTest, + these are basic tests to ensure that we're using the correct + comparator type for the given comparator value. + """ + + use ExUnit.Case, async: true + + alias ConfigCat.Rollout.Comparator + alias Version.InvalidVersionError + + test "returns false if given an unknown comparator" do + assert {:ok, false} = Comparator.compare(-1, "b", "a, b, c") + end + + describe "basic comparators" do + test "is_one_of" do + is_one_of = 0 + + assert {:ok, true} = Comparator.compare(is_one_of, "b", "a, b, c") + assert {:ok, false} = Comparator.compare(is_one_of, "x", "a, b, c") + end + + test "is_not_one_of" do + is_not_one_of = 1 + + assert {:ok, false} = Comparator.compare(is_not_one_of, "b", "a, b, c") + assert {:ok, true} = Comparator.compare(is_not_one_of, "x", "a, b, c") + end + + test "contains" do + contains = 2 + + assert {:ok, true} = Comparator.compare(contains, "jane@influxdata.com", "influxdata.com") + assert {:ok, false} = Comparator.compare(contains, "jane@email.com", "influxdata.com") + end + + test "does_not_contain" do + does_not_contain = 3 + + assert {:ok, false} = + Comparator.compare(does_not_contain, "jane@influxdata.com", "influxdata.com") + + assert {:ok, true} = + Comparator.compare(does_not_contain, "jane@email.com", "influxdata.com") + end + end + + describe "semantic version comparators" do + test "is_one_of (semver)" do + is_one_of_semver = 4 + + assert {:ok, true} = Comparator.compare(is_one_of_semver, "1.2.0", "1.2.0, 1.3.4") + assert {:ok, false} = Comparator.compare(is_one_of_semver, "2.0.0", "1.2.0, 1.3.4") + + assert {:error, %InvalidVersionError{}} = + Comparator.compare(is_one_of_semver, "invalid", "1.2.0, 1.3.4") + + assert {:error, %InvalidVersionError{}} = + Comparator.compare(is_one_of_semver, "1.2.0", "invalid, 1.2.0") + + assert {:error, %InvalidVersionError{}} = + Comparator.compare(is_one_of_semver, "1.2.0", "1.2.0, invalid") + end + + test "is_not_one_of (semver)" do + is_not_one_of_semver = 5 + + assert {:ok, true} = Comparator.compare(is_not_one_of_semver, "2.0.0", "1.2.0, 1.3.4") + assert {:ok, false} = Comparator.compare(is_not_one_of_semver, "1.2.0", "1.2.0, 1.3.4") + + assert {:error, %InvalidVersionError{}} = + Comparator.compare(is_not_one_of_semver, "invalid", "1.2.0, 1.3.4") + + assert {:error, %InvalidVersionError{}} = + Comparator.compare(is_not_one_of_semver, "1.2.0", "invalid, 1.3.4") + + assert {:error, %InvalidVersionError{}} = + Comparator.compare(is_not_one_of_semver, "1.2.0", "1.2.0, invalid") + end + + test "< (SemVer)" do + less_than_semver = 6 + + assert {:ok, true} = Comparator.compare(less_than_semver, "1.2.0", "1.3.0") + assert {:ok, false} = Comparator.compare(less_than_semver, "1.3.0", "1.2.0") + assert {:ok, false} = Comparator.compare(less_than_semver, "1.2.0", "1.2.0") + + assert {:error, %InvalidVersionError{}} = + Comparator.compare(less_than_semver, "invalid", "1.2.0") + + assert {:error, %InvalidVersionError{}} = + Comparator.compare(less_than_semver, "1.3.0", "invalid") + end + + test "<= (SemVer)" do + less_than_equal_semver = 7 + + assert {:ok, true} = Comparator.compare(less_than_equal_semver, "1.2.0", "1.3.0") + assert {:ok, false} = Comparator.compare(less_than_equal_semver, "1.3.0", "1.2.0") + assert {:ok, true} = Comparator.compare(less_than_equal_semver, "1.2.0", "1.2.0") + + assert {:error, %InvalidVersionError{}} = + Comparator.compare(less_than_equal_semver, "invalid", "1.2.0") + + assert {:error, %InvalidVersionError{}} = + Comparator.compare(less_than_equal_semver, "1.3.0", "invalid") + end + + test "> (SemVer)" do + greater_than_semver = 8 + + assert {:ok, true} = Comparator.compare(greater_than_semver, "1.3.0", "1.2.0") + assert {:ok, false} = Comparator.compare(greater_than_semver, "1.2.0", "1.3.0") + assert {:ok, false} = Comparator.compare(greater_than_semver, "1.2.0", "1.2.0") + + assert {:error, %InvalidVersionError{}} = + Comparator.compare(greater_than_semver, "invalid", "1.2.0") + + assert {:error, %InvalidVersionError{}} = + Comparator.compare(greater_than_semver, "1.3.0", "invalid") + end + + test ">= (SemVer)" do + greater_than_equal_semver = 9 + + assert {:ok, true} = Comparator.compare(greater_than_equal_semver, "1.3.0", "1.2.0") + assert {:ok, false} = Comparator.compare(greater_than_equal_semver, "1.2.0", "1.3.0") + assert {:ok, true} = Comparator.compare(greater_than_equal_semver, "1.2.0", "1.2.0") + + assert {:error, %InvalidVersionError{}} = + Comparator.compare(greater_than_equal_semver, "invalid", "1.2.0") + + assert {:error, %InvalidVersionError{}} = + Comparator.compare(greater_than_equal_semver, "1.3.0", "invalid") + end + end + + describe "numeric comparators" do + test "= (Number)" do + equals_number = 10 + + assert {:ok, true} = Comparator.compare(equals_number, "3.5", "3.5000") + assert {:ok, true} = Comparator.compare(equals_number, "3,5", "3.5000") + assert {:ok, true} = Comparator.compare(equals_number, 3.5, 3.5000) + assert {:ok, false} = Comparator.compare(equals_number, "3,5", "4.752") + assert {:error, :invalid_float} = Comparator.compare(equals_number, "not a float", "3.5000") + assert {:error, :invalid_float} = Comparator.compare(equals_number, "3,5", "not a float") + end + + test "<> (Number)" do + not_equals_number = 11 + + assert {:ok, false} = Comparator.compare(not_equals_number, "3.5", "3.5000") + assert {:ok, false} = Comparator.compare(not_equals_number, "3,5", "3.5000") + assert {:ok, false} = Comparator.compare(not_equals_number, 3.5, 3.5000) + assert {:ok, true} = Comparator.compare(not_equals_number, "3,5", "4.752") + + assert {:error, :invalid_float} = + Comparator.compare(not_equals_number, "not a float", "3.5000") + + assert {:error, :invalid_float} = + Comparator.compare(not_equals_number, "3,5", "not a float") + end + + test "< (Number)" do + less_than_number = 12 + + assert {:ok, true} = Comparator.compare(less_than_number, "3.5", "3.6000") + assert {:ok, true} = Comparator.compare(less_than_number, "3,5", "3.6000") + assert {:ok, true} = Comparator.compare(less_than_number, 3.5, 3.6000) + assert {:ok, false} = Comparator.compare(less_than_number, "3,5", "1.752") + assert {:ok, false} = Comparator.compare(less_than_number, "3,5", "3.5") + + assert {:error, :invalid_float} = + Comparator.compare(less_than_number, "not a float", "3.5000") + + assert {:error, :invalid_float} = Comparator.compare(less_than_number, "3,5", "not a float") + end + + test "<= (Number)" do + less_than_equal_number = 13 + + assert {:ok, true} = Comparator.compare(less_than_equal_number, "3.5", "3.6000") + assert {:ok, true} = Comparator.compare(less_than_equal_number, "3,5", "3.6000") + assert {:ok, true} = Comparator.compare(less_than_equal_number, 3.5, 3.6000) + assert {:ok, true} = Comparator.compare(less_than_equal_number, "3,5", "3.5") + assert {:ok, false} = Comparator.compare(less_than_equal_number, "3,5", "1.752") + + assert {:error, :invalid_float} = + Comparator.compare(less_than_equal_number, "not a float", "3.5000") + + assert {:error, :invalid_float} = + Comparator.compare(less_than_equal_number, "3,5", "not a float") + end + + test "> (Number)" do + greater_than_number = 14 + + assert {:ok, false} = Comparator.compare(greater_than_number, "3.5", "3.6000") + assert {:ok, false} = Comparator.compare(greater_than_number, "3,5", "3.6000") + assert {:ok, false} = Comparator.compare(greater_than_number, 3.5, 3.6000) + assert {:ok, false} = Comparator.compare(greater_than_number, "3,5", "3.5") + assert {:ok, true} = Comparator.compare(greater_than_number, "3,5", "1.752") + + assert {:error, :invalid_float} = + Comparator.compare(greater_than_number, "not a float", "3.5000") + + assert {:error, :invalid_float} = + Comparator.compare(greater_than_number, "3,5", "not a float") + end + + test ">= (Number)" do + greater_than_equal_number = 15 + + assert {:ok, false} = Comparator.compare(greater_than_equal_number, "3.5", "3.6000") + assert {:ok, false} = Comparator.compare(greater_than_equal_number, "3,5", "3.6000") + assert {:ok, false} = Comparator.compare(greater_than_equal_number, 3.5, 3.6000) + assert {:ok, true} = Comparator.compare(greater_than_equal_number, "3,5", "1.752") + assert {:ok, true} = Comparator.compare(greater_than_equal_number, "3,5", "3.5") + + assert {:error, :invalid_float} = + Comparator.compare(greater_than_equal_number, "not a float", "3.5000") + + assert {:error, :invalid_float} = + Comparator.compare(greater_than_equal_number, "3,5", "not a float") + end + end + + describe "sensitive comparators" do + setup do + hashed = %{ + a: "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8", + b: "e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98", + c: "84a516841ba77a5b4648de2cd0dfcb30ea46dbb4" + } + + {:ok, hashed: hashed} + end + + test "is_one_of (sensitive)", %{hashed: hashed} do + is_one_of_sensitive = 16 + %{a: a, b: b, c: c} = hashed + + assert {:ok, true} = Comparator.compare(is_one_of_sensitive, "a", "#{a}, #{b}, #{c}") + assert {:ok, false} = Comparator.compare(is_one_of_sensitive, "x", "#{a}, #{b}, #{c}") + end + + test "is_not_one_of (sensitive)", %{hashed: hashed} do + is_not_one_of_sensitive = 17 + %{a: a, b: b, c: c} = hashed + + assert {:ok, true} = Comparator.compare(is_not_one_of_sensitive, "x", "#{a}, #{b}, #{c}") + assert {:ok, false} = Comparator.compare(is_not_one_of_sensitive, "a", "#{a}, #{b}, #{c}") + end + end +end diff --git a/test/rollout_test.exs b/test/rollout_test.exs new file mode 100644 index 00000000..f8a61678 --- /dev/null +++ b/test/rollout_test.exs @@ -0,0 +1,120 @@ +defmodule ConfigCat.RolloutTest do + use ExUnit.Case, async: true + + alias ConfigCat.{FetchPolicy, User} + + @moduletag capture_log: true + + test "basic rule evaluation" do + test_matrix("testmatrix.csv", "PKDVCLf-Hq-h-kCzMp-L7Q/psuH7BGHoUmdONrzzUOY7A") + end + + test "semantic version matching" do + test_matrix("testmatrix_semantic.csv", "PKDVCLf-Hq-h-kCzMp-L7Q/BAr3KgLTP0ObzKnBTo5nhA") + end + + test "semantic version comparisons" do + test_matrix("testmatrix_semantic_2.csv", "PKDVCLf-Hq-h-kCzMp-L7Q/q6jMCFIp-EmuAfnmZhPY7w") + end + + test "numeric comparisons" do + test_matrix("testmatrix_number.csv", "PKDVCLf-Hq-h-kCzMp-L7Q/uGyK3q9_ckmdxRyI7vjwCw") + end + + test "sensitive information comparisons" do + test_matrix("testmatrix_sensitive.csv", "PKDVCLf-Hq-h-kCzMp-L7Q/qX3TP2dTj06ZpCCT1h_SPA") + end + + test "invalid user object" do + user = %{email: "a@configcat.com"} + {:ok, client} = start_config_cat("PKDVCLf-Hq-h-kCzMp-L7Q/psuH7BGHoUmdONrzzUOY7A") + actual = ConfigCat.get_value("stringContainsDogDefaultCat", "Lion", user, client: client) + + assert actual == "Cat" + end + + defp test_matrix(filename, sdk_key) do + [header | test_lines] = read_test_matrix(filename) + {custom_key, settings_keys} = parse_header(header) + + {:ok, client} = start_config_cat(sdk_key) + + errors = Enum.flat_map(test_lines, &run_tests(&1, client, custom_key, settings_keys)) + + assert errors == [] + end + + defp read_test_matrix(filename) do + __ENV__.file + |> Path.dirname() + |> Path.join("fixtures/#{filename}") + |> File.read!() + |> String.split("\n", trim: true) + end + + defp parse_header(header) do + [custom_key | settings_keys] = + header + |> String.split(";") + |> Enum.drop(3) + + {custom_key, settings_keys} + end + + defp run_tests(test_line, client, custom_key, settings_keys) do + user = build_user(test_line, custom_key) + + expected_values = + test_line + |> String.split(";") + |> Enum.drop(4) + + Enum.zip(settings_keys, expected_values) + |> Enum.map(fn {setting_key, expected} -> run_test(setting_key, expected, user, client) end) + |> Enum.reject(&is_nil/1) + end + + defp build_user(test_line, custom_key) do + [id, email, country, custom_value] = + test_line + |> String.split(";") + |> Enum.take(4) + |> Enum.map(&normalize/1) + + if id do + User.new(id, email: email, country: country, custom: build_custom(custom_key, custom_value)) + else + nil + end + end + + defp run_test(setting_key, expected, user, client) do + actual = ConfigCat.get_value(setting_key, nil, user, client: client) + + if to_string(actual) !== to_string(expected) do + %{ + identifier: user && user.identifier, + setting_key: setting_key, + expected: to_string(expected), + actual: to_string(actual) + } + end + end + + defp build_custom(_custom_key, nil), do: nil + defp build_custom(custom_key, custom_value), do: %{custom_key => custom_value} + + defp normalize(nil), do: nil + defp normalize(""), do: nil + defp normalize("##null##"), do: nil + defp normalize(value), do: value + + defp start_config_cat(sdk_key) do + name = UUID.uuid4() |> String.to_atom() + + ConfigCat.start_link(sdk_key, + fetch_policy: FetchPolicy.lazy(cache_expiry_seconds: 300), + name: name + ) + end +end diff --git a/test/test_helper.exs b/test/test_helper.exs index 869559e7..404a0d20 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -1 +1,2 @@ +Logger.configure(level: :warn) ExUnit.start() diff --git a/test/user_test.exs b/test/user_test.exs new file mode 100644 index 00000000..7a2696b2 --- /dev/null +++ b/test/user_test.exs @@ -0,0 +1,91 @@ +defmodule ConfigCat.UserTest do + use ExUnit.Case, async: true + + alias ConfigCat.User + + describe "creating a user" do + test "creates a user with only an identifer" do + identifier = "IDENTIFIER" + user = User.new(identifier) + + assert %User{identifier: ^identifier, email: nil, country: nil, custom: nil} = user + end + + test "creates a user with additional properties" do + identifier = "IDENTIFIER" + email = "me@example.com" + country = "COUNTRY" + user = User.new(identifier, email: email, country: country) + + assert %User{identifier: ^identifier, email: ^email, country: ^country, custom: nil} = user + end + + test "creates a user with custom properties" do + identifier = "IDENTIFIER" + custom_property = 42 + user = User.new(identifier, custom: %{custom_property: custom_property}) + + assert %User{ + identifier: ^identifier, + email: nil, + country: nil, + custom: %{custom_property: ^custom_property} + } = user + end + end + + describe "looking up attributes" do + setup do + user = + User.new("IDENTIFIER", + email: "EMAIL", + country: "COUNTRY", + custom: %{ + :atom_property => "ATOM_VALUE", + "string_property" => "STRING_VALUE", + "UpperStringProperty" => "UPPER_STRING_VALUE" + } + ) + + {:ok, user: user} + end + + test "looks up identifier", %{user: user} do + value = User.get_attribute(user, "Identifier") + assert value == user.identifier + end + + test "looks up email", %{user: user} do + value = User.get_attribute(user, "Email") + assert value == user.email + end + + test "looks up country", %{user: user} do + value = User.get_attribute(user, "Country") + assert value == user.country + end + + test "looks up a custom property with an atom key", %{user: user} do + value = User.get_attribute(user, "ATOM_PROPERTY") + assert value == user.custom[:atom_property] + end + + test "looks up a custom property with a string key", %{user: user} do + value = User.get_attribute(user, "STRING_PROPERTY") + assert value == user.custom["string_property"] + end + + test "looks up a custom property with a string key with uppercase letters", %{user: user} do + value = User.get_attribute(user, "upperstringproperty") + assert value == user.custom["UpperStringProperty"] + end + + test "returns nil for null attributes" do + user = User.new("IDENTIFIER") + + assert User.get_attribute(user, "Email") == nil + assert User.get_attribute(user, "Country") == nil + assert User.get_attribute(user, "AnyCustom") == nil + end + end +end