From 998cc8f58866ea93fa47ef342ebb3e2662dd1555 Mon Sep 17 00:00:00 2001 From: Sebastian Gsell Date: Tue, 16 Aug 2022 13:03:21 +0200 Subject: [PATCH 01/12] Include bounds. --- src/estimagic/optimization/bhhh.py | 25 +++++++--- tests/optimization/test_bhhh.py | 80 +++++++++++++++++++++++------- 2 files changed, 80 insertions(+), 25 deletions(-) diff --git a/src/estimagic/optimization/bhhh.py b/src/estimagic/optimization/bhhh.py index 6e09412bd..655bbb7a3 100644 --- a/src/estimagic/optimization/bhhh.py +++ b/src/estimagic/optimization/bhhh.py @@ -33,6 +33,8 @@ def bhhh( def bhhh_internal( criterion_and_derivative, x, + lower_bounds, + upper_bounds, convergence_absolute_gradient_tolerance, stopping_max_iterations, ): @@ -66,17 +68,19 @@ def bhhh_internal( initial_step_size = 1 step_size = initial_step_size - niter = 1 - while niter < stopping_max_iterations: - niter += 1 + n_iter = 1 + while n_iter < stopping_max_iterations: + n_iter += 1 x_candidate = x_accepted + step_size * direction + x_candidate = _apply_bounds_to_x_candidate( + x_candidate, lower_bounds, upper_bounds + ) criterion_candidate, gradient = criterion_and_derivative(x_candidate) # If previous step was accepted if step_size == initial_step_size: hessian_approx = np.dot(gradient.T, gradient) - else: criterion_candidate, gradient = criterion_and_derivative(x_candidate) @@ -85,11 +89,9 @@ def bhhh_internal( step_size /= 2 if step_size <= 0.01: - # Accept step x_accepted = x_candidate criterion_accepted = criterion_candidate - # Reset step size step_size = initial_step_size # If decrease in likelihood, calculate new direction vector @@ -106,7 +108,6 @@ def bhhh_internal( hessian_approx = np.dot(gradient.T, gradient) direction = np.linalg.solve(hessian_approx, gradient_sum) - # Reset stepsize step_size = initial_step_size if gtol < convergence_absolute_gradient_tolerance: @@ -115,8 +116,16 @@ def bhhh_internal( result_dict = { "solution_x": x_accepted, "solution_criterion": criterion_accepted, - "n_iterations": niter, + "n_iterations": n_iter, "message": "Under develpment", } return result_dict + + +def _apply_bounds_to_x_candidate(x, lower_bounds, upper_bounds, bound_tol=0): + """Apply upper and lower bounds to the candidate vector.""" + x = np.where(x <= lower_bounds + bound_tol, lower_bounds, x) + x = np.where(x >= upper_bounds - bound_tol, upper_bounds, x) + + return x diff --git a/tests/optimization/test_bhhh.py b/tests/optimization/test_bhhh.py index 20098635c..67669166c 100644 --- a/tests/optimization/test_bhhh.py +++ b/tests/optimization/test_bhhh.py @@ -87,7 +87,6 @@ def criterion_and_derivative_probit(x): Returns: tuple: first entry is the criterion, second entry is the score - """ endog, exog = generate_test_data() @@ -97,39 +96,86 @@ def criterion_and_derivative_probit(x): return -loglike(x), score(x) +# ===================================================================================== +# Fixtures +# ===================================================================================== + + @pytest.fixture -def result_statsmodels_logit(): +def result_logit_unbounded(): endog, exog = generate_test_data() - result = sm.Logit(endog, exog).fit() + result_unbounded = sm.Logit(endog, exog).fit() - return result + return result_unbounded.params @pytest.fixture -def result_statsmodels_probit(): +def result_probit_unbounded(): endog, exog = generate_test_data() - result = sm.Probit(endog, exog).fit() + result_unbounded = sm.Probit(endog, exog).fit() + + return result_unbounded.params + - return result +@pytest.fixture +def result_logit_bounded(): + return np.array([-5.0, -3.93455447, 6.49171767]) + + +@pytest.fixture +def result_probit_bounded(): + return np.array([-5.0, -2.56431715, 4.18468707]) + + +# ===================================================================================== +# Tests +# ===================================================================================== +TEST_CASES = [ + ( + criterion_and_derivative_logit, + np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, np.inf, np.inf]), + "result_logit_unbounded", + ), + ( + criterion_and_derivative_probit, + np.array([-np.inf, -np.inf, -np.inf]), + np.array([np.inf, np.inf, np.inf]), + "result_probit_unbounded", + ), + ( + criterion_and_derivative_logit, + np.array([-5, -10, -10]), + np.array([10, 10, 10]), + "result_logit_bounded", + ), + ( + criterion_and_derivative_probit, + np.array([-5, -10, -10]), + np.array([10, 10, 10]), + "result_probit_bounded", + ), +] @pytest.mark.parametrize( - "criterion_and_derivative, result_statsmodels", - [ - (criterion_and_derivative_logit, "result_statsmodels_logit"), - (criterion_and_derivative_probit, "result_statsmodels_probit"), - ], + "criterion_and_derivative, lower_bounds, upper_bounds, result_statsmodels", + TEST_CASES, ) -def test_maximum_likelihood(criterion_and_derivative, result_statsmodels, request): - result_expected = request.getfixturevalue(result_statsmodels) +def test_maximum_likelihood( + criterion_and_derivative, lower_bounds, upper_bounds, result_statsmodels, request +): + params_expected = request.getfixturevalue(result_statsmodels) - x = np.zeros(3) + x0 = np.zeros(3) result_bhhh = bhhh_internal( criterion_and_derivative, - x=x, + x=x0, + lower_bounds=lower_bounds, + upper_bounds=upper_bounds, convergence_absolute_gradient_tolerance=1e-8, stopping_max_iterations=200, ) - aaae(result_bhhh["solution_x"], result_expected.params, decimal=4) + aaae(result_bhhh["solution_x"], params_expected, decimal=4) From 3eeb5dd2b32c19839ff0d65bca7d2325180fb776 Mon Sep 17 00:00:00 2001 From: Sebastian Gsell Date: Tue, 16 Aug 2022 14:23:32 +0200 Subject: [PATCH 02/12] Refactor. --- src/estimagic/optimization/bhhh.py | 149 +++++++++++++++++++++-------- 1 file changed, 110 insertions(+), 39 deletions(-) diff --git a/src/estimagic/optimization/bhhh.py b/src/estimagic/optimization/bhhh.py index 655bbb7a3..bea83217c 100644 --- a/src/estimagic/optimization/bhhh.py +++ b/src/estimagic/optimization/bhhh.py @@ -42,7 +42,11 @@ def bhhh_internal( Args: criterion_and_derivative (callable): The objective function to be minimized. - x (np.ndarray): Initial guess of the parameter vector (starting points). + x (np.ndarray): Initial guess of the parameter vector x (starting points). + lower_bounds (np.ndarray): 1d array of shape (n,) with lower bounds + for the parameter vector x. + upper_bounds (np.ndarray): 1d array of shape (n,) with upper bounds + for the parameter vector x. convergence_absolute_gradient_tolerance (float): Stopping criterion for the gradient tolerance. stopping_max_iterations (int): Maximum number of iterations. If reached, @@ -57,56 +61,52 @@ def bhhh_internal( solution vector or reaching stopping_max_iterations. - message (str): Message to the user. Currently it says: "Under development." """ - criterion_accepted, gradient = criterion_and_derivative(x) + criterion_accepted, gradient_candidate = criterion_and_derivative(x) x_accepted = x - hessian_approx = np.dot(gradient.T, gradient) - gradient_sum = np.sum(gradient, axis=0) - direction = np.linalg.solve(hessian_approx, gradient_sum) - gtol = np.dot(gradient_sum, direction) + hessian_approx = gradient_candidate.T @ gradient_candidate + direction, gtol = _calculate_new_direction_vector( + gradient_candidate, hessian_approx + ) initial_step_size = 1 step_size = initial_step_size - n_iter = 1 - while n_iter < stopping_max_iterations: - n_iter += 1 - - x_candidate = x_accepted + step_size * direction - x_candidate = _apply_bounds_to_x_candidate( - x_candidate, lower_bounds, upper_bounds + for _n_iter in range(stopping_max_iterations): + ( + x_candidate, + criterion_candidate, + gradient_candidate, + hessian_approx, + ) = find_new_candidates( + x_accepted, + direction, + hessian_approx, + lower_bounds, + upper_bounds, + step_size, + initial_step_size, + criterion_and_derivative, ) - criterion_candidate, gradient = criterion_and_derivative(x_candidate) - - # If previous step was accepted - if step_size == initial_step_size: - hessian_approx = np.dot(gradient.T, gradient) - else: - criterion_candidate, gradient = criterion_and_derivative(x_candidate) - # Line search if np.sum(criterion_candidate) > np.sum(criterion_accepted): - step_size /= 2 + x_accepted, criterion_accepted, step_size = determine_new_step_size( + x_accepted, + criterion_accepted, + x_candidate, + criterion_candidate, + step_size, + initial_step_size, + ) - if step_size <= 0.01: - x_accepted = x_candidate - criterion_accepted = criterion_candidate - - step_size = initial_step_size - - # If decrease in likelihood, calculate new direction vector else: - # Accept step x_accepted = x_candidate criterion_accepted = criterion_candidate - gradient_sum = np.sum(gradient, axis=0) - direction = np.linalg.solve(hessian_approx, gradient_sum) - gtol = np.dot(gradient_sum, direction) - - if gtol < 0: - hessian_approx = np.dot(gradient.T, gradient) - direction = np.linalg.solve(hessian_approx, gradient_sum) + direction, hessian_approx, gtol = determine_new_search_direction( + gradient_candidate, + hessian_approx, + ) step_size = initial_step_size @@ -116,13 +116,84 @@ def bhhh_internal( result_dict = { "solution_x": x_accepted, "solution_criterion": criterion_accepted, - "n_iterations": n_iter, - "message": "Under develpment", + "n_iterations": _n_iter, + "message": "Under development", } return result_dict +def find_new_candidates( + x_accepted, + direction, + hessian_approx, + lower_bounds, + upper_bounds, + step_size, + initial_step_size, + criterion_and_derivative, +): + """Find new candidates for x, criterion, gradient, and hessian.""" + x_candidate = x_accepted + step_size * direction + x_candidate = _apply_bounds_to_x_candidate(x_candidate, lower_bounds, upper_bounds) + + criterion_candidate, gradient_candidate = criterion_and_derivative(x_candidate) + + if step_size == initial_step_size: + hessian_approx = gradient_candidate.T @ gradient_candidate + else: + criterion_candidate, gradient_candidate = criterion_and_derivative(x_candidate) + + return x_candidate, criterion_candidate, gradient_candidate, hessian_approx + + +def determine_new_step_size( + x_accepted, + criterion_accepted, + x_candidate, + criterion_candidate, + step_size, + initial_step_size, +): + """Determine new step size and accept candidates.""" + step_size /= 2 + + if step_size <= 0.01: + x_accepted = x_candidate + criterion_accepted = criterion_candidate + + step_size = initial_step_size + + return x_accepted, criterion_accepted, step_size + + +def determine_new_search_direction( + gradient_candidate, + hessian_approx, +): + """Determine new search direction and accept candidates.""" + direction, gtol = _calculate_new_direction_vector( + gradient_candidate, hessian_approx + ) + + if gtol < 0: + hessian_approx = gradient_candidate.T @ gradient_candidate + direction, _ = _calculate_new_direction_vector( + gradient_candidate, hessian_approx + ) + + return direction, hessian_approx, gtol + + +def _calculate_new_direction_vector(gradient_candidate, hessian_approx): + """Calculate new direction vector.""" + gradient_sum = np.sum(gradient_candidate, axis=0) + direction = np.linalg.solve(hessian_approx, gradient_sum) + gtol = gradient_sum @ direction + + return direction, gtol + + def _apply_bounds_to_x_candidate(x, lower_bounds, upper_bounds, bound_tol=0): """Apply upper and lower bounds to the candidate vector.""" x = np.where(x <= lower_bounds + bound_tol, lower_bounds, x) From 11a4db29e03b2963cdd7761c9af9565a858161cf Mon Sep 17 00:00:00 2001 From: Sebastian Gsell Date: Wed, 24 Aug 2022 18:43:07 +0200 Subject: [PATCH 03/12] Implement bounds a la lbfgsb. --- docs/source/algorithms.rst | 4 +- src/estimagic/optimization/bhhh.py | 224 +++++++++++++++-------------- tests/optimization/test_bhhh.py | 25 ++-- 3 files changed, 127 insertions(+), 126 deletions(-) diff --git a/docs/source/algorithms.rst b/docs/source/algorithms.rst index d2f1aeb3f..fd99739c7 100644 --- a/docs/source/algorithms.rst +++ b/docs/source/algorithms.rst @@ -559,14 +559,14 @@ We implement a few algorithms from scratch. They are currently considered experi "bhhh" - Minimize a likelihood function using the BHHH algorithm. + Minimize a likelihood function using the bounded BHHH algorithm. BHHH (:cite:`Berndt1974`) can - and should ONLY - be used for minimizing (or maximizing) a likelihood. It is similar to the Newton-Raphson algorithm, but replaces the Hessian matrix with the outer product of the gradient. This approximation is based on the information matrix equality (:cite:`Halbert1982`) and is thus only vaid when minimizing (or maximizing) - a likelihood. + a likelihood. Bounds, i.e. box constraints, are supported. The criterion function :func:`func` should return a dictionary with at least the entry ``{"contributions": array_or_pytree}`` where ``array_or_pytree`` diff --git a/src/estimagic/optimization/bhhh.py b/src/estimagic/optimization/bhhh.py index bea83217c..28cdae1fe 100644 --- a/src/estimagic/optimization/bhhh.py +++ b/src/estimagic/optimization/bhhh.py @@ -1,4 +1,4 @@ -"""Implement Berndt-Hall-Hall-Hausman (BHHH) algorithm.""" +"""Implement the Berndt-Hall-Hall-Hausman (BHHH) algorithm.""" import numpy as np from estimagic.decorators import mark_minimizer @@ -12,18 +12,24 @@ def bhhh( criterion_and_derivative, x, + lower_bounds, + upper_bounds, *, convergence_absolute_gradient_tolerance=1e-8, + convergence_relative_gradient_tolerance=1e-8, stopping_max_iterations=200, ): - """Minimize a likelihood function using the BHHH algorithm. + """Minimize a likelihood function using the bounded BHHH algorithm. For details, see :ref:`_own_algorithms`. """ result_dict = bhhh_internal( criterion_and_derivative, x=x, + lower_bounds=lower_bounds, + upper_bounds=upper_bounds, convergence_absolute_gradient_tolerance=convergence_absolute_gradient_tolerance, + convergence_relative_gradient_tolerance=convergence_relative_gradient_tolerance, stopping_max_iterations=stopping_max_iterations, ) @@ -36,167 +42,171 @@ def bhhh_internal( lower_bounds, upper_bounds, convergence_absolute_gradient_tolerance, + convergence_relative_gradient_tolerance, stopping_max_iterations, ): - """Minimize a likelihood function using the BHHH algorithm. + """Minimize a likelihood function using the bounded BHHH algorithm. Args: - criterion_and_derivative (callable): The objective function to be minimized. + criterion_and_derivative (callable): A function returning the tuple: + - criterion (np.ndarray): Likelihood contributions of shape (n_obs,) + - derivative (np.ndarray): Jacobian matrix of shape (n_obs, n_params) x (np.ndarray): Initial guess of the parameter vector x (starting points). - lower_bounds (np.ndarray): 1d array of shape (n,) with lower bounds - for the parameter vector x. - upper_bounds (np.ndarray): 1d array of shape (n,) with upper bounds + lower_bounds (np.ndarray): 1d array of shape (n_params,) with lower bounds for the parameter vector x. + upper_bounds (np.ndarray): 1d array of shape (n_params,) with upper bounds + for the parameter vector x convergence_absolute_gradient_tolerance (float): Stopping criterion for the - gradient tolerance. + absolute gradient tolerance. + convergence_relative_gradient_tolerance (float): Stopping criterion for the + relative gradient tolerance. stopping_max_iterations (int): Maximum number of iterations. If reached, terminate. Returns: (dict) Result dictionary containing: - - solution_x (np.ndarray): Solution vector of shape (n,). - - solution_criterion (np.ndarray): Likelihood at the solution. Shape (n_obs,). + - solution_x (np.ndarray): Solution vector of shape (n_params,). + - solution_criterion (np.ndarray): Likelihood contributions at the solution. + Shape (n_obs,). + - solution_loglikelihood (float): Value of the log-likelihood at the solution. - n_iterations (int): Number of iterations the algorithm ran before finding a solution vector or reaching stopping_max_iterations. - message (str): Message to the user. Currently it says: "Under development." """ - criterion_accepted, gradient_candidate = criterion_and_derivative(x) + tol = { + "abs": convergence_absolute_gradient_tolerance, + "rel": convergence_relative_gradient_tolerance, + } + n_params = len(x) + x_accepted = x + criterion_accepted, jacobian = criterion_and_derivative(x_accepted) + gradient = np.sum(jacobian, axis=0) - hessian_approx = gradient_candidate.T @ gradient_candidate - direction, gtol = _calculate_new_direction_vector( - gradient_candidate, hessian_approx + norm_pg0 = np.linalg.norm( + x_accepted - np.clip(x_accepted - gradient, lower_bounds, upper_bounds) + ) + norm_pg = norm_pg0 + + inactive_set = estimate_epsilon_inactive_set( + x_accepted, norm_pg, lower_bounds, upper_bounds + ) + + gradient_reduced = gradient[inactive_set] + hessian_reduced = jacobian[:, inactive_set].T @ jacobian[:, inactive_set] + direction = determine_descent_direction( + gradient, gradient_reduced, hessian_reduced, inactive_set, n_params ) initial_step_size = 1 step_size = initial_step_size for _n_iter in range(stopping_max_iterations): - ( - x_candidate, - criterion_candidate, - gradient_candidate, - hessian_approx, - ) = find_new_candidates( - x_accepted, - direction, - hessian_approx, - lower_bounds, - upper_bounds, - step_size, - initial_step_size, - criterion_and_derivative, + + x_candidate = np.clip( + x_accepted + step_size * direction, lower_bounds, upper_bounds ) + criterion_candidate, jacobian = criterion_and_derivative(x_candidate) + + if step_size == initial_step_size: + hessian_reduced = jacobian[:, inactive_set].T @ jacobian[:, inactive_set] + if np.sum(criterion_candidate) > np.sum(criterion_accepted): - x_accepted, criterion_accepted, step_size = determine_new_step_size( - x_accepted, - criterion_accepted, - x_candidate, - criterion_candidate, - step_size, - initial_step_size, - ) + step_size /= 2 + if step_size <= 0.01: + x_accepted = x_candidate + criterion_accepted = criterion_candidate + + step_size = initial_step_size else: x_accepted = x_candidate criterion_accepted = criterion_candidate - direction, hessian_approx, gtol = determine_new_search_direction( - gradient_candidate, - hessian_approx, + gradient = np.sum(jacobian, axis=0) + gradient_reduced = gradient[inactive_set] + + direction = determine_descent_direction( + gradient, + gradient_reduced, + hessian_reduced, + inactive_set, + n_params, ) + norm_pg = np.linalg.norm( + x_accepted - np.clip(x_accepted - gradient, lower_bounds, upper_bounds) + ) + inactive_set = estimate_epsilon_inactive_set( + x_accepted, norm_pg, lower_bounds, upper_bounds + ) + + if norm_pg < 0: + gradient_reduced = gradient[inactive_set] + hessian_reduced = ( + jacobian[:, inactive_set].T @ jacobian[:, inactive_set] + ) + + direction = determine_descent_direction( + gradient, + gradient_reduced, + hessian_reduced, + inactive_set, + n_params, + ) + step_size = initial_step_size - if gtol < convergence_absolute_gradient_tolerance: + if norm_pg < tol["abs"] + tol["rel"] * norm_pg0: break result_dict = { "solution_x": x_accepted, "solution_criterion": criterion_accepted, + "solution_loglikelihood": np.sum(criterion_accepted), "n_iterations": _n_iter, - "message": "Under development", + "message": "Under develpment", } return result_dict -def find_new_candidates( - x_accepted, - direction, - hessian_approx, - lower_bounds, - upper_bounds, - step_size, - initial_step_size, - criterion_and_derivative, -): - """Find new candidates for x, criterion, gradient, and hessian.""" - x_candidate = x_accepted + step_size * direction - x_candidate = _apply_bounds_to_x_candidate(x_candidate, lower_bounds, upper_bounds) - - criterion_candidate, gradient_candidate = criterion_and_derivative(x_candidate) - - if step_size == initial_step_size: - hessian_approx = gradient_candidate.T @ gradient_candidate - else: - criterion_candidate, gradient_candidate = criterion_and_derivative(x_candidate) - - return x_candidate, criterion_candidate, gradient_candidate, hessian_approx - +def estimate_epsilon_inactive_set(x, norm_gradient, lower_bounds, upper_bounds): + """Estimate the set of epsilon-inactive bound constraints up to a tolerance. -def determine_new_step_size( - x_accepted, - criterion_accepted, - x_candidate, - criterion_candidate, - step_size, - initial_step_size, -): - """Determine new step size and accept candidates.""" - step_size /= 2 + The set of epsilon-inactive indices underestimates (overestimates) the actual + set of inactive (active) indices. - if step_size <= 0.01: - x_accepted = x_candidate - criterion_accepted = criterion_candidate + x (np.ndarray): Current candidate vector. + norm_gradient (float): Norm of the projected gradient. + lower_bounds (np.ndarray): 1d array of shape (n_params,) with lower bounds + for the parameter vector x. + upper_bounds (np.ndarray): 1d array of shape (n_params,) with upper bounds + for the parameter vector x + """ + epsilon = min(np.min(upper_bounds - lower_bounds) / 2, norm_gradient) - step_size = initial_step_size + inactive_set = np.where( + (lower_bounds + epsilon < x) & (x < upper_bounds - epsilon) + )[0] - return x_accepted, criterion_accepted, step_size + return inactive_set -def determine_new_search_direction( - gradient_candidate, - hessian_approx, +def determine_descent_direction( + gradient_candidate, gradient_reduced, hessian_reduced, inactive_set, n_params ): - """Determine new search direction and accept candidates.""" - direction, gtol = _calculate_new_direction_vector( - gradient_candidate, hessian_approx - ) - - if gtol < 0: - hessian_approx = gradient_candidate.T @ gradient_candidate - direction, _ = _calculate_new_direction_vector( - gradient_candidate, hessian_approx - ) - - return direction, hessian_approx, gtol - - -def _calculate_new_direction_vector(gradient_candidate, hessian_approx): - """Calculate new direction vector.""" - gradient_sum = np.sum(gradient_candidate, axis=0) - direction = np.linalg.solve(hessian_approx, gradient_sum) - gtol = gradient_sum @ direction + """Determine the new descent serach direction.""" + direction = np.linalg.solve(hessian_reduced, gradient_reduced) - return direction, gtol + direction_active = gradient_candidate.copy() + direction_active[inactive_set] = 0 + direction_projected = np.zeros(n_params) + direction_projected[inactive_set] = direction -def _apply_bounds_to_x_candidate(x, lower_bounds, upper_bounds, bound_tol=0): - """Apply upper and lower bounds to the candidate vector.""" - x = np.where(x <= lower_bounds + bound_tol, lower_bounds, x) - x = np.where(x >= upper_bounds - bound_tol, upper_bounds, x) + direction_all = direction_active + direction_projected - return x + return direction_all diff --git a/tests/optimization/test_bhhh.py b/tests/optimization/test_bhhh.py index 67669166c..8375714a5 100644 --- a/tests/optimization/test_bhhh.py +++ b/tests/optimization/test_bhhh.py @@ -13,7 +13,7 @@ def generate_test_data(): rng = get_rng(seed=12) - num_observations = 5000 + num_observations = 5_000 x1 = rng.multivariate_normal([0, 0], [[1, 0.75], [0.75, 1]], num_observations) x2 = rng.multivariate_normal([1, 4], [[1, 0.75], [0.75, 1]], num_observations) @@ -104,7 +104,7 @@ def criterion_and_derivative_probit(x): @pytest.fixture def result_logit_unbounded(): endog, exog = generate_test_data() - result_unbounded = sm.Logit(endog, exog).fit() + result_unbounded = sm.Logit(endog, exog).fit(disp=True) return result_unbounded.params @@ -112,24 +112,20 @@ def result_logit_unbounded(): @pytest.fixture def result_probit_unbounded(): endog, exog = generate_test_data() - result_unbounded = sm.Probit(endog, exog).fit() + result_unbounded = sm.Probit(endog, exog).fit(disp=True) return result_unbounded.params @pytest.fixture def result_logit_bounded(): - return np.array([-5.0, -3.93455447, 6.49171767]) - - -@pytest.fixture -def result_probit_bounded(): - return np.array([-5.0, -2.56431715, 4.18468707]) + return np.array([-1.866, -1.5223, 2.7153]) # ===================================================================================== # Tests # ===================================================================================== + TEST_CASES = [ ( criterion_and_derivative_logit, @@ -145,16 +141,10 @@ def result_probit_bounded(): ), ( criterion_and_derivative_logit, - np.array([-5, -10, -10]), - np.array([10, 10, 10]), + np.array([-5, -1_000, -1_000]), + np.array([1_000, 1_000, 1_000]), "result_logit_bounded", ), - ( - criterion_and_derivative_probit, - np.array([-5, -10, -10]), - np.array([10, 10, 10]), - "result_probit_bounded", - ), ] @@ -175,6 +165,7 @@ def test_maximum_likelihood( lower_bounds=lower_bounds, upper_bounds=upper_bounds, convergence_absolute_gradient_tolerance=1e-8, + convergence_relative_gradient_tolerance=1e-8, stopping_max_iterations=200, ) From 41daf40fd8eae9377eef43eec35a34f1027e6889 Mon Sep 17 00:00:00 2001 From: Sebastian Gsell Date: Mon, 29 Aug 2022 17:41:58 +0200 Subject: [PATCH 04/12] Implement alternative algorithm for constrained case. --- src/estimagic/optimization/bhhh.py | 193 +- .../fixtures/telco_churn_clean.csv | 7033 +++++++++++++++++ tests/optimization/test_bhhh.py | 266 +- 3 files changed, 7443 insertions(+), 49 deletions(-) create mode 100644 tests/optimization/fixtures/telco_churn_clean.csv diff --git a/src/estimagic/optimization/bhhh.py b/src/estimagic/optimization/bhhh.py index 28cdae1fe..7f6ddfaee 100644 --- a/src/estimagic/optimization/bhhh.py +++ b/src/estimagic/optimization/bhhh.py @@ -19,24 +19,35 @@ def bhhh( convergence_relative_gradient_tolerance=1e-8, stopping_max_iterations=200, ): - """Minimize a likelihood function using the bounded BHHH algorithm. + """Minimize a likelihood function using the box-constrained BHHH algorithm. For details, see :ref:`_own_algorithms`. """ - result_dict = bhhh_internal( - criterion_and_derivative, - x=x, - lower_bounds=lower_bounds, - upper_bounds=upper_bounds, - convergence_absolute_gradient_tolerance=convergence_absolute_gradient_tolerance, - convergence_relative_gradient_tolerance=convergence_relative_gradient_tolerance, - stopping_max_iterations=stopping_max_iterations, - ) + if np.isinf(lower_bounds).all() and np.isinf(upper_bounds).all(): + result_dict = bhhh_unconstrained( + criterion_and_derivative, + x, + lower_bounds, + upper_bounds, + convergence_absolute_gradient_tolerance, + convergence_relative_gradient_tolerance, + stopping_max_iterations, + ) + else: + result_dict = bhhh_box_constrained( + criterion_and_derivative, + x, + lower_bounds, + upper_bounds, + convergence_absolute_gradient_tolerance, + convergence_relative_gradient_tolerance, + stopping_max_iterations, + ) return result_dict -def bhhh_internal( +def bhhh_unconstrained( criterion_and_derivative, x, lower_bounds, @@ -94,7 +105,9 @@ def bhhh_internal( ) gradient_reduced = gradient[inactive_set] - hessian_reduced = jacobian[:, inactive_set].T @ jacobian[:, inactive_set] + hessian_approx = jacobian.T @ jacobian + hessian_reduced = hessian_approx[inactive_set[:, np.newaxis], inactive_set] + direction = determine_descent_direction( gradient, gradient_reduced, hessian_reduced, inactive_set, n_params ) @@ -111,7 +124,8 @@ def bhhh_internal( criterion_candidate, jacobian = criterion_and_derivative(x_candidate) if step_size == initial_step_size: - hessian_reduced = jacobian[:, inactive_set].T @ jacobian[:, inactive_set] + hessian_approx = jacobian.T @ jacobian + hessian_reduced = hessian_approx[inactive_set[:, np.newaxis], inactive_set] if np.sum(criterion_candidate) > np.sum(criterion_accepted): step_size /= 2 @@ -145,9 +159,10 @@ def bhhh_internal( if norm_pg < 0: gradient_reduced = gradient[inactive_set] - hessian_reduced = ( - jacobian[:, inactive_set].T @ jacobian[:, inactive_set] - ) + hessian_approx = jacobian.T @ jacobian + hessian_reduced = hessian_approx[ + inactive_set[:, np.newaxis], inactive_set + ] direction = determine_descent_direction( gradient, @@ -198,7 +213,7 @@ def estimate_epsilon_inactive_set(x, norm_gradient, lower_bounds, upper_bounds): def determine_descent_direction( gradient_candidate, gradient_reduced, hessian_reduced, inactive_set, n_params ): - """Determine the new descent serach direction.""" + """Determine the new descent (search) direction.""" direction = np.linalg.solve(hessian_reduced, gradient_reduced) direction_active = gradient_candidate.copy() @@ -210,3 +225,147 @@ def determine_descent_direction( direction_all = direction_active + direction_projected return direction_all + + +def bhhh_box_constrained( + criterion_and_derivative, + x, + lower_bounds, + upper_bounds, + convergence_absolute_gradient_tolerance, + stopping_max_iterations, +): + """Minimize a likelihood function using the box-constrained BHHH algorithm. + + Args: + criterion_and_derivative (callable): A function returning the tuple: + - criterion (np.ndarray): Likelihood contributions of shape (n_obs,) + - derivative (np.ndarray): Jacobian matrix of shape (n_obs, n_params) + x (np.ndarray): Initial guess of the parameter vector x (starting points). + lower_bounds (np.ndarray): 1d array of shape (n_params,) with lower bounds + for the parameter vector x. + upper_bounds (np.ndarray): 1d array of shape (n_params,) with upper bounds + for the parameter vector x + convergence_absolute_gradient_tolerance (float): Stopping criterion for the + absolute gradient tolerance. + convergence_relative_gradient_tolerance (float): Stopping criterion for the + relative gradient tolerance. + stopping_max_iterations (int): Maximum number of iterations. If reached, + terminate. + + Returns: + (dict) Result dictionary containing: + + - solution_x (np.ndarray): Solution vector of shape (n_params,). + - solution_criterion (np.ndarray): Likelihood contributions at the solution. + Shape (n_obs,). + - solution_loglikelihood (float): Value of the log-likelihood at the solution. + - n_iterations (int): Number of iterations the algorithm ran before finding a + solution vector or reaching stopping_max_iterations. + - message (str): Message to the user. Currently it says: "Under development." + """ + _zero_threshold = np.finfo(float).eps + n_params = len(x) + step_min = 1e-6 + + critic_limit = convergence_absolute_gradient_tolerance + + crit = 1 + step_len_optimal = 1 + + jacobian = criterion_and_derivative(x, task="derivative") + gradient = np.sum(jacobian, axis=0) + + norm_pg = np.linalg.norm(x - np.clip(x - gradient, lower_bounds, upper_bounds)) + inactive_set = estimate_epsilon_inactive_set(x, norm_pg, lower_bounds, upper_bounds) + + for _n_iter in range(stopping_max_iterations): + jacobian = criterion_and_derivative(x, task="derivative") + gradient = np.sum(jacobian, axis=0) + + gradient_reduced = gradient[inactive_set] + hessian_approx = jacobian.T @ jacobian + hessian_reduced = hessian_approx[inactive_set[:, np.newaxis], inactive_set] + + direction_projected = determine_descent_direction( + gradient, gradient_reduced, hessian_reduced, inactive_set, n_params + ) + + step_len_optimal = find_optimal_step_len( + x, + direction_projected, + lower_bounds, + upper_bounds, + step_min, + criterion_and_derivative, + ) + + x_candidate = np.clip( + x + step_len_optimal * direction_projected, lower_bounds, upper_bounds + ) + + crit = np.max( + np.abs(((x_candidate - x) + _zero_threshold) / (x + _zero_threshold)) + / step_len_optimal + ) + + x = x_candidate + + if crit < critic_limit: + break + + norm_pg = np.linalg.norm(x - np.clip(x - gradient, lower_bounds, upper_bounds)) + inactive_set = estimate_epsilon_inactive_set( + x, norm_pg, lower_bounds, upper_bounds + ) + + solution_criterion = criterion_and_derivative(x, task="criterion") + + result_dict = { + "solution_x": x, + "solution_criterion": solution_criterion, + "solution_loglikelihood": np.sum(solution_criterion), + "n_iterations": _n_iter, + "message": "Under develpment", + } + + return result_dict + + +def find_optimal_step_len( + x, + direction_projected, + lower_bounds, + upper_bounds, + step_min, + criterion_and_derivative, +): + """Find optimal step length.""" + step_len_trial = 2 + step_len_optimal = 1 + + loglike_higher = 1 + loglike_lower = 0 + + while (loglike_higher > loglike_lower) & (step_len_trial >= step_min): + step_len_trial = step_len_trial / 2 + + criterion_candidate_higher = criterion_and_derivative( + np.clip( + x + step_len_trial * direction_projected, lower_bounds, upper_bounds + ), + task="criterion", + ) + criterion_candidate_lower = criterion_and_derivative( + np.clip( + x + step_len_trial * direction_projected / 2, lower_bounds, upper_bounds + ), + task="criterion", + ) + + loglike_higher = np.sum(criterion_candidate_higher) + loglike_lower = np.sum(criterion_candidate_lower) + + step_len_optimal = step_len_trial + + return step_len_optimal diff --git a/tests/optimization/fixtures/telco_churn_clean.csv b/tests/optimization/fixtures/telco_churn_clean.csv new file mode 100644 index 000000000..cc1fd3b1e --- /dev/null +++ b/tests/optimization/fixtures/telco_churn_clean.csv @@ -0,0 +1,7033 @@ +gender,SeniorCitizen,Partner,Dependents,tenure,PhoneService,PaperlessBilling,MonthlyCharges,Churn +0,0,1,0,1,0,1,29.85,0 +1,0,0,0,34,1,0,56.95,0 +1,0,0,0,2,1,1,53.85,1 +1,0,0,0,45,0,0,42.3,0 +0,0,0,0,2,1,1,70.7,1 +0,0,0,0,8,1,1,99.65,1 +1,0,0,1,22,1,1,89.1,0 +0,0,0,0,10,0,0,29.75,0 +0,0,1,0,28,1,1,104.8,1 +1,0,0,1,62,1,0,56.15,0 +1,0,1,1,13,1,1,49.95,0 +1,0,0,0,16,1,0,18.95,0 +1,0,1,0,58,1,0,100.35,0 +1,0,0,0,49,1,1,103.7,1 +1,0,0,0,25,1,1,105.5,0 +0,0,1,1,69,1,0,113.25,0 +0,0,0,0,52,1,0,20.65,0 +1,0,0,1,71,1,0,106.7,0 +0,0,1,1,10,1,0,55.2,1 +0,0,0,0,21,1,1,90.05,0 +1,1,0,0,1,0,1,39.65,1 +1,0,1,0,12,1,0,19.8,0 +1,0,0,0,1,1,0,20.15,1 +0,0,1,0,58,1,1,59.9,0 +1,0,1,1,49,1,0,59.6,0 +0,0,0,0,30,1,1,55.3,0 +1,0,1,1,47,1,1,99.35,1 +1,0,1,1,1,0,0,30.2,1 +1,0,1,0,72,1,1,90.25,0 +0,0,0,1,17,1,1,64.7,1 +0,1,1,0,71,1,1,96.35,0 +1,1,1,0,2,1,1,95.5,0 +0,0,1,1,27,1,0,66.15,0 +1,0,0,0,1,1,0,20.2,0 +1,1,0,0,1,1,0,45.25,0 +0,0,1,1,72,1,0,99.9,0 +1,0,0,0,5,1,1,69.7,1 +0,0,0,0,46,1,1,74.8,0 +1,0,0,0,34,1,1,106.35,1 +0,0,0,0,11,1,1,97.85,1 +1,0,1,1,10,1,0,49.55,0 +0,0,1,1,70,1,1,69.2,0 +0,0,1,1,17,1,0,20.75,0 +0,0,0,0,63,1,1,79.85,0 +0,0,1,0,13,1,1,76.2,0 +0,0,0,0,49,1,1,84.5,0 +1,0,0,0,2,1,0,49.25,0 +0,0,0,0,2,1,1,80.65,1 +1,0,0,0,52,1,1,79.75,0 +0,0,1,1,69,1,1,64.15,0 +0,1,0,0,43,1,1,90.25,0 +0,0,0,0,15,1,1,99.1,1 +0,1,1,0,25,1,1,69.5,0 +0,1,1,0,8,1,1,80.65,1 +0,1,1,1,60,1,1,74.85,0 +1,1,0,0,18,1,1,95.45,1 +0,0,1,1,63,1,1,99.65,0 +1,1,1,1,66,1,1,108.45,0 +0,0,1,1,34,1,0,24.95,0 +0,0,0,0,72,1,1,107.5,0 +0,0,1,0,47,1,1,100.5,0 +1,0,0,0,60,1,1,89.9,0 +1,0,1,0,72,0,0,42.1,0 +0,0,1,1,18,1,1,54.4,0 +0,0,0,0,9,1,0,94.4,1 +0,0,0,0,3,1,1,75.3,0 +1,0,1,0,47,1,1,78.9,0 +0,0,0,0,31,1,0,79.2,0 +0,0,1,1,50,1,0,20.15,0 +1,0,0,0,10,1,1,79.85,0 +1,0,0,0,1,1,0,49.05,0 +0,0,1,1,52,1,1,20.4,0 +1,1,1,1,64,1,1,111.6,0 +1,0,1,1,62,1,1,24.25,0 +0,0,0,1,3,1,1,64.5,0 +0,1,0,0,56,1,0,110.5,0 +0,0,0,0,46,1,0,55.65,0 +0,0,1,1,8,1,0,54.65,0 +1,1,0,0,30,1,1,74.75,0 +0,0,1,1,45,1,1,25.9,0 +0,0,0,1,1,1,1,79.35,1 +0,0,1,1,11,0,0,50.55,0 +0,0,1,0,7,1,1,75.15,1 +0,0,0,0,42,1,1,103.8,0 +0,0,1,0,49,1,1,20.15,0 +1,0,0,0,9,1,1,99.3,0 +0,0,1,0,35,1,1,62.15,0 +0,0,1,1,48,1,0,20.65,0 +0,0,1,1,46,1,1,19.95,0 +1,0,1,0,29,0,0,33.75,0 +1,0,1,1,30,1,0,82.05,0 +1,1,0,0,1,1,0,74.7,0 +1,0,1,1,66,1,1,84.0,0 +0,0,0,0,65,1,1,111.05,0 +1,0,0,0,72,1,1,100.9,0 +0,0,0,0,12,1,1,78.95,1 +1,0,1,1,71,1,1,66.85,0 +1,0,0,0,5,1,0,21.05,1 +1,0,0,0,52,1,0,21.0,0 +0,1,1,0,25,1,1,98.5,1 +1,0,0,0,1,1,0,20.2,0 +0,0,1,1,1,1,0,19.45,0 +1,0,0,0,38,1,0,95.0,0 +0,1,1,0,66,0,0,45.55,0 +1,0,1,0,68,1,1,110.0,1 +1,0,0,0,5,0,0,24.3,0 +0,0,1,1,72,1,1,104.15,0 +0,0,0,0,32,0,0,30.15,0 +1,0,0,0,43,1,0,94.35,0 +1,0,1,1,72,1,0,19.4,0 +1,0,1,0,55,1,1,96.75,1 +0,0,0,0,52,1,0,57.95,0 +0,0,0,0,43,1,1,91.65,0 +0,1,1,0,37,1,1,76.5,1 +0,0,1,1,64,0,1,54.6,0 +1,0,1,1,3,1,0,89.85,0 +0,0,0,0,36,0,0,31.05,0 +0,0,1,1,10,1,1,100.25,1 +0,0,0,0,41,1,0,20.65,0 +1,0,1,1,27,1,1,85.2,0 +0,0,1,1,56,1,1,99.8,0 +0,0,0,0,6,1,0,20.7,0 +1,0,0,0,3,1,1,74.4,1 +0,0,1,1,7,1,0,50.7,0 +0,0,1,1,4,1,0,20.85,0 +1,0,0,0,33,1,1,88.95,0 +0,1,0,0,27,1,1,78.05,1 +1,0,1,0,72,1,1,23.55,0 +1,0,0,0,1,1,0,19.75,0 +1,1,0,0,71,0,1,56.45,0 +0,0,0,0,13,1,1,85.95,0 +0,0,1,1,25,0,1,58.6,1 +1,0,0,0,67,1,0,50.55,0 +1,0,0,0,1,0,1,35.45,1 +1,0,0,0,2,1,0,44.35,1 +0,0,0,0,43,1,1,25.7,0 +0,0,0,0,23,1,1,75.0,0 +0,0,1,1,64,1,0,20.2,0 +1,0,0,1,57,1,1,19.6,0 +0,1,1,0,1,1,1,70.45,1 +0,1,1,1,72,1,1,88.05,0 +0,0,0,0,8,1,0,71.15,1 +0,0,1,0,61,1,1,101.05,0 +1,0,0,0,64,1,1,84.3,0 +1,1,1,0,71,1,0,23.95,0 +0,0,1,1,65,1,1,99.05,0 +1,0,0,0,3,1,0,19.6,0 +1,0,0,0,1,1,1,45.65,1 +1,0,0,1,30,1,0,64.5,0 +1,0,1,1,15,1,1,69.5,0 +0,0,1,1,8,1,1,68.55,0 +1,0,0,0,7,1,0,95.0,1 +0,0,1,1,70,1,1,108.15,0 +1,0,1,1,62,1,0,86.1,0 +0,0,1,1,6,1,0,19.7,0 +0,0,1,1,14,1,1,80.9,0 +0,0,0,0,22,1,1,84.15,0 +1,0,1,1,22,1,0,20.15,0 +1,0,1,1,16,1,0,64.25,0 +1,0,0,0,10,1,0,25.7,0 +0,0,0,1,13,1,1,56.0,0 +0,0,1,0,20,1,0,82.4,1 +0,0,0,0,2,1,1,69.7,0 +1,0,0,0,53,1,1,73.9,0 +0,0,1,1,11,1,0,20.6,0 +1,0,1,0,69,1,0,19.9,0 +0,0,0,0,4,1,1,70.9,1 +1,0,1,0,72,1,1,89.05,0 +1,1,1,0,58,0,1,45.3,1 +0,0,1,1,16,1,0,20.4,0 +1,0,1,0,43,1,1,84.25,0 +0,0,1,0,2,1,1,104.4,1 +1,0,1,0,14,1,0,81.95,0 +0,0,1,0,53,1,1,94.85,1 +0,0,0,0,32,1,0,20.55,0 +0,0,1,0,34,1,0,24.7,0 +0,1,0,0,15,1,1,74.45,1 +0,1,0,0,7,1,0,76.45,1 +0,0,1,1,15,1,1,105.35,0 +1,0,1,0,61,1,1,20.55,0 +0,0,0,0,1,0,0,29.95,1 +0,0,0,0,1,1,0,45.3,0 +1,0,0,0,8,1,0,84.5,1 +1,0,1,1,33,1,0,74.75,0 +0,0,0,0,13,1,1,79.25,1 +0,0,1,0,1,0,1,24.8,1 +1,0,0,0,20,1,1,51.8,0 +1,0,0,0,3,0,0,30.4,0 +0,0,0,0,13,1,0,19.65,0 +0,0,1,0,40,1,0,56.6,0 +1,0,1,1,43,1,1,71.9,0 +1,0,1,0,6,1,1,91.0,1 +0,0,1,1,69,1,0,19.75,0 +0,0,1,1,72,1,0,109.7,0 +1,0,1,1,59,1,0,19.3,0 +0,0,1,0,20,1,1,96.55,0 +1,0,1,1,24,1,1,24.1,0 +1,0,0,0,59,1,1,111.35,0 +1,0,1,1,72,1,1,112.25,0 +1,0,0,1,1,1,0,20.75,0 +0,0,1,0,27,1,1,101.9,0 +0,0,0,0,14,1,1,80.05,0 +1,0,1,1,71,1,0,105.55,0 +1,0,0,1,13,1,1,78.3,0 +1,0,0,0,44,1,0,68.85,0 +0,0,0,0,33,1,1,79.95,0 +1,0,1,1,72,0,1,55.45,0 +1,0,0,0,1,1,0,79.9,1 +0,0,0,0,19,1,1,106.6,1 +1,0,1,0,64,1,1,102.45,0 +1,0,0,0,2,1,1,46.0,1 +0,0,0,0,1,0,0,25.25,0 +1,0,0,1,61,1,0,19.75,0 +0,0,1,1,29,1,0,20.0,0 +1,1,1,0,23,1,0,86.8,0 +0,0,1,0,57,0,1,58.75,0 +1,0,1,1,72,0,0,45.25,0 +1,0,1,0,66,0,1,56.6,0 +1,0,1,1,65,1,1,84.2,0 +0,0,0,0,8,1,1,80.0,0 +0,0,0,0,4,1,1,70.15,1 +0,0,1,0,71,1,0,24.75,0 +1,0,1,1,1,1,1,20.2,0 +1,0,1,0,4,1,0,50.05,1 +0,0,0,0,12,1,1,19.35,0 +1,0,0,0,24,0,1,50.6,0 +0,0,1,1,31,1,1,81.15,0 +0,0,1,0,1,1,0,55.2,1 +1,0,0,0,30,1,1,89.9,0 +0,0,1,1,47,1,1,85.3,0 +1,0,0,0,54,1,1,108.0,0 +1,0,0,0,50,1,1,93.5,0 +1,0,0,0,1,1,1,84.6,1 +0,0,0,0,72,1,0,20.25,0 +0,0,0,0,29,1,0,25.15,0 +1,0,0,0,2,1,1,54.4,1 +0,0,0,0,10,0,1,29.6,0 +1,0,1,0,18,1,1,73.15,0 +0,1,0,0,11,1,1,95.0,1 +1,0,0,0,16,1,0,19.75,0 +0,0,0,0,72,1,0,86.6,0 +1,0,0,0,72,1,0,109.2,0 +0,0,1,1,41,1,1,74.7,0 +0,1,1,0,65,1,0,94.4,0 +0,1,0,0,13,1,1,54.8,0 +1,1,0,0,4,1,0,75.35,0 +1,0,0,0,41,1,0,65.0,0 +1,1,0,0,15,1,1,74.4,1 +1,0,0,0,1,1,1,48.55,1 +1,0,0,0,42,1,1,99.0,0 +0,0,1,0,51,1,1,93.5,0 +0,0,1,1,2,1,0,70.4,1 +1,1,1,0,1,0,0,40.2,1 +1,0,0,1,32,1,0,83.7,0 +1,0,0,0,10,1,1,19.85,0 +0,0,1,1,67,0,1,59.55,0 +0,0,1,1,61,1,0,115.1,0 +1,0,0,0,50,1,0,114.35,0 +0,0,1,0,2,1,1,44.6,1 +0,1,1,0,29,0,1,45.0,0 +1,1,0,0,3,0,1,41.15,1 +1,1,0,0,13,1,1,106.9,1 +1,1,1,0,57,1,1,89.85,0 +0,0,0,0,31,0,1,49.85,0 +0,0,1,0,45,1,0,113.3,0 +0,0,1,1,61,1,0,88.1,0 +1,0,0,0,50,1,0,24.9,0 +0,1,0,0,19,1,1,105.0,0 +1,0,0,0,59,1,0,19.35,1 +0,0,1,0,71,1,1,24.25,0 +0,1,0,0,16,1,1,94.45,1 +1,0,1,0,57,1,1,59.75,0 +1,0,0,0,1,0,0,24.8,1 +1,1,1,0,20,1,0,107.05,0 +1,0,0,0,1,1,0,70.6,1 +1,0,1,0,5,1,1,85.4,1 +0,0,1,0,52,1,1,105.05,1 +1,1,1,0,21,1,1,64.95,0 +1,0,0,0,14,0,1,55.0,0 +0,0,0,0,5,1,0,50.55,0 +0,0,0,0,6,1,0,55.15,0 +0,0,0,0,10,1,0,51.2,0 +0,0,0,1,1,1,0,25.4,0 +0,0,0,0,68,1,0,54.45,0 +1,0,1,1,18,1,0,95.15,1 +0,0,0,0,22,1,1,76.0,0 +0,0,0,0,20,1,1,44.35,0 +1,0,1,0,1,1,0,70.0,1 +1,1,0,0,8,1,1,74.5,1 +1,0,0,0,10,1,1,44.85,1 +1,1,0,0,24,1,1,76.1,1 +1,0,0,0,35,1,0,61.2,0 +1,0,1,1,23,1,0,86.8,0 +0,1,0,0,6,1,1,89.35,0 +0,0,0,0,12,1,0,19.7,0 +1,0,0,0,1,1,0,20.25,0 +0,0,1,1,71,1,0,76.05,0 +1,1,1,0,35,1,1,100.8,0 +1,0,1,1,40,1,1,74.55,0 +0,0,0,1,1,1,1,73.6,1 +1,0,0,0,23,1,1,64.9,0 +0,1,0,0,4,1,1,95.45,1 +1,0,0,0,4,1,1,90.4,0 +0,0,1,1,68,0,0,60.3,0 +1,0,0,1,38,1,1,81.85,0 +1,0,1,1,52,1,0,24.8,0 +1,1,1,0,32,1,1,74.9,1 +1,0,1,1,29,1,0,75.55,0 +1,1,1,1,38,1,0,101.15,0 +1,0,0,1,48,1,1,78.75,0 +0,0,0,0,1,1,1,19.25,0 +0,0,0,0,22,1,1,89.05,0 +0,0,0,0,43,1,0,115.05,0 +0,1,1,0,5,1,1,69.35,0 +1,0,0,0,5,1,1,80.6,1 +1,0,1,1,51,1,0,110.05,0 +1,0,0,0,71,1,1,19.9,0 +0,0,1,1,38,1,0,80.3,1 +1,1,1,0,24,1,1,93.15,1 +1,0,1,0,35,1,1,91.5,0 +0,1,0,0,54,1,0,82.45,1 +0,0,1,1,72,0,1,60.0,0 +1,0,0,0,1,1,1,44.8,0 +0,0,1,1,9,1,0,48.6,0 +1,0,0,0,69,0,1,60.05,0 +0,0,1,0,52,1,1,102.7,0 +0,1,1,0,11,1,1,82.9,0 +0,1,0,0,2,1,1,70.35,1 +0,1,1,1,28,0,1,35.9,0 +0,1,0,0,17,1,1,82.65,0 +0,0,1,1,35,1,1,19.85,0 +0,0,0,0,8,1,1,19.2,0 +1,0,0,0,46,1,1,94.9,0 +0,0,0,0,7,1,1,73.85,1 +0,0,0,0,2,1,0,80.6,1 +1,0,1,1,68,1,1,75.8,1 +0,0,0,0,43,1,1,104.6,1 +0,0,0,0,68,1,1,88.15,0 +0,0,0,0,36,1,1,94.8,0 +1,0,1,0,63,1,1,103.4,1 +0,1,0,0,32,1,0,54.65,0 +0,0,1,0,71,1,0,85.75,0 +0,0,1,1,66,1,1,67.45,0 +1,0,0,0,63,1,0,20.5,0 +0,0,0,1,41,1,1,20.25,0 +0,1,0,0,1,1,1,72.1,0 +0,0,0,0,2,1,1,90.4,1 +0,0,1,0,70,1,0,19.45,0 +0,0,0,0,23,0,1,44.95,0 +0,1,1,0,64,1,0,97.0,0 +1,0,1,1,37,1,1,62.8,0 +1,0,0,1,17,1,0,44.6,0 +0,1,0,0,7,1,1,89.15,0 +1,0,1,1,4,1,1,84.8,1 +0,1,0,0,21,0,1,41.9,1 +0,0,0,0,10,1,1,80.25,1 +0,1,0,0,16,1,1,54.1,0 +1,0,1,0,64,1,1,105.25,0 +1,1,1,0,27,0,0,30.75,1 +1,0,1,1,42,1,0,97.1,0 +1,0,0,1,5,1,0,20.2,0 +0,0,0,0,41,1,1,98.8,0 +1,0,1,0,58,1,0,50.3,0 +0,0,0,0,47,1,1,20.55,0 +1,0,0,0,18,1,1,75.9,0 +1,0,0,0,5,1,0,96.5,1 +1,0,1,0,23,1,1,59.95,0 +0,0,0,0,1,1,0,19.15,0 +1,0,1,0,71,1,1,98.65,0 +1,0,1,1,72,1,1,112.6,0 +1,0,1,1,33,1,0,20.6,0 +1,0,0,0,2,1,1,85.65,1 +1,0,0,1,24,0,0,35.75,0 +0,0,1,1,56,1,1,99.75,0 +1,0,0,0,37,1,1,96.1,0 +0,0,0,0,43,1,0,85.1,0 +1,0,0,0,1,0,0,25.35,0 +0,0,1,0,25,1,1,104.95,1 +0,0,0,0,61,1,0,89.65,0 +1,0,0,0,17,1,0,86.75,0 +0,0,1,0,41,1,1,86.2,0 +1,0,0,0,1,1,0,50.65,1 +1,1,1,1,72,0,1,64.8,0 +1,0,0,0,1,1,1,90.85,1 +1,0,0,0,48,1,1,108.1,0 +1,1,1,0,11,1,0,19.95,1 +0,1,1,0,55,1,1,85.45,1 +0,0,0,0,42,0,1,54.75,0 +1,0,0,0,44,1,1,90.4,0 +1,0,0,1,1,1,0,44.0,0 +0,0,0,0,27,1,1,95.6,0 +1,1,1,0,27,1,1,84.8,0 +0,1,0,0,2,1,1,44.3,0 +0,0,0,0,19,1,0,19.9,0 +0,1,1,0,42,1,1,95.05,0 +0,0,0,0,66,1,1,90.05,0 +1,1,1,0,33,1,1,109.9,0 +0,0,0,0,34,1,1,73.95,1 +1,1,0,0,33,0,1,54.6,0 +0,0,1,1,23,1,0,20.05,0 +0,0,0,0,32,1,0,19.75,0 +0,0,0,0,11,1,0,20.05,0 +1,0,1,1,69,1,1,99.45,1 +0,0,1,0,68,1,0,55.9,0 +1,0,0,0,20,1,1,19.7,0 +1,0,0,0,72,1,1,19.8,0 +1,0,1,1,60,1,1,95.4,0 +1,1,1,1,32,1,1,93.95,0 +0,0,0,0,1,1,1,19.9,1 +1,0,0,0,1,1,1,19.6,1 +1,1,0,0,3,1,1,81.35,1 +0,0,1,0,46,1,1,24.45,0 +0,0,1,0,29,1,1,74.95,0 +1,0,0,0,51,1,1,87.35,0 +0,1,1,0,48,1,1,70.65,0 +0,0,1,1,16,1,0,73.25,0 +1,0,1,0,70,1,1,98.7,0 +0,0,1,1,40,1,1,24.8,0 +0,0,1,1,22,1,0,83.3,1 +0,1,0,0,1,1,1,75.3,1 +0,0,1,1,5,1,1,24.3,0 +0,0,0,0,7,1,1,69.85,0 +1,0,0,1,29,1,0,100.55,0 +1,0,1,1,44,1,0,25.7,0 +0,0,0,0,10,0,0,40.7,0 +0,1,1,0,55,1,0,51.65,0 +1,1,1,0,52,1,1,105.1,0 +0,0,1,1,10,1,0,85.95,0 +1,0,0,0,18,1,1,75.6,0 +0,0,1,0,68,1,0,58.25,0 +0,0,1,1,61,1,1,19.4,1 +0,0,1,1,72,0,1,65.2,0 +1,0,0,0,2,1,0,53.45,0 +1,0,0,0,12,1,1,45.4,1 +1,0,1,0,41,1,1,19.75,0 +0,0,0,0,26,0,1,44.45,0 +1,0,1,0,36,1,0,20.85,0 +1,0,1,1,72,1,1,114.05,0 +1,0,1,0,35,1,1,89.85,0 +1,0,0,0,1,1,0,55.05,0 +0,0,1,1,16,1,1,112.95,0 +0,1,0,0,49,1,0,101.55,0 +0,0,1,0,54,1,1,114.65,0 +0,0,0,1,18,1,0,64.8,0 +0,0,1,0,36,1,0,80.4,0 +0,0,0,0,60,1,1,105.9,1 +0,0,0,0,1,1,0,69.55,1 +0,0,1,1,52,1,1,25.05,0 +1,0,1,1,8,1,1,94.75,0 +1,0,1,1,72,1,0,105.5,0 +0,0,0,0,64,1,0,24.7,0 +0,1,0,0,22,1,1,69.75,0 +1,0,1,0,60,0,1,60.2,0 +0,0,1,1,28,1,1,81.05,1 +0,0,1,0,61,1,0,24.4,0 +0,0,0,0,24,1,1,104.15,0 +1,0,1,1,28,1,0,92.9,0 +0,0,1,1,30,1,0,80.8,0 +1,0,1,0,2,1,0,20.0,0 +1,0,0,0,1,1,1,75.1,0 +1,0,0,1,6,1,0,19.65,0 +0,0,1,0,24,1,1,69.45,0 +1,0,1,1,4,1,0,101.15,1 +1,0,0,0,7,1,1,99.8,1 +1,1,1,0,72,1,1,116.05,0 +1,0,0,0,70,0,1,40.05,0 +1,1,1,0,64,1,0,102.1,0 +1,0,1,1,72,1,1,89.7,0 +0,0,0,1,44,1,0,19.9,0 +0,0,1,1,13,1,0,55.95,1 +0,1,0,0,17,1,0,20.65,0 +1,0,0,0,1,1,1,55.0,1 +1,0,1,0,9,1,1,70.05,0 +1,0,1,0,24,1,0,53.6,0 +0,0,1,1,1,1,1,74.7,1 +1,0,0,0,24,1,1,80.25,1 +1,1,1,1,35,1,1,76.05,0 +0,0,1,1,7,1,1,75.7,0 +1,0,0,0,5,1,1,96.1,1 +0,0,0,1,15,1,0,69.0,1 +1,0,1,1,11,1,0,19.65,0 +0,0,1,0,48,0,1,45.3,1 +0,1,0,0,20,1,1,81.45,0 +0,0,1,0,72,1,1,108.5,0 +0,0,1,1,8,1,1,83.55,1 +1,0,1,1,72,1,1,84.5,0 +0,0,0,0,15,1,1,100.15,0 +1,0,0,0,72,1,1,88.6,0 +1,0,0,1,1,1,1,74.35,1 +1,0,1,1,63,1,1,104.8,0 +0,0,0,0,2,1,1,59.0,0 +0,0,1,0,2,1,1,74.4,1 +1,1,1,0,61,1,0,64.05,0 +1,0,0,0,1,1,0,20.4,0 +1,0,0,0,22,0,1,43.75,1 +1,0,1,0,28,1,0,60.9,0 +0,0,1,0,70,1,0,19.8,0 +0,1,0,0,5,0,0,28.45,1 +0,0,0,0,12,1,1,99.7,1 +1,0,0,0,34,1,0,116.25,0 +0,1,1,0,71,1,1,80.7,0 +0,0,1,1,70,1,0,65.2,0 +0,0,1,1,52,1,1,84.05,0 +1,0,0,1,69,1,1,79.45,0 +0,1,0,0,20,1,1,94.1,1 +1,0,0,1,11,1,1,78.0,0 +1,0,1,0,2,1,1,94.2,1 +0,0,1,1,6,1,1,80.5,1 +0,0,0,0,1,1,0,19.85,0 +1,1,1,1,20,1,0,94.3,0 +1,0,0,0,61,1,1,106.45,0 +0,1,1,0,5,1,1,74.35,1 +0,0,0,0,56,1,1,105.45,0 +1,0,0,0,30,1,1,95.0,0 +1,0,0,0,40,1,0,104.8,1 +0,0,0,0,28,1,0,54.3,0 +0,1,1,0,5,1,0,70.05,0 +0,1,1,0,27,1,1,75.2,1 +1,0,0,0,12,1,0,20.05,0 +1,0,1,1,67,1,1,105.4,0 +1,1,1,0,29,1,1,51.6,0 +1,0,1,1,55,1,0,85.5,0 +0,0,0,0,23,1,0,75.6,1 +1,0,1,0,34,1,1,100.05,1 +1,0,0,0,52,1,0,91.25,0 +1,1,1,1,72,1,1,115.75,0 +1,0,1,1,58,1,1,94.7,0 +1,0,1,1,35,1,0,19.6,0 +0,1,0,0,56,1,1,99.9,0 +0,0,1,1,24,1,1,21.1,0 +1,0,1,1,70,1,0,20.05,0 +1,0,0,0,2,1,1,79.95,0 +1,1,1,1,68,1,1,107.15,0 +0,0,0,0,1,1,1,85.0,1 +1,0,0,0,12,1,1,89.55,0 +0,0,1,0,63,1,1,81.55,0 +0,0,1,1,33,1,1,58.45,0 +0,0,1,0,69,1,1,95.65,0 +0,0,1,1,60,1,1,80.6,0 +0,0,1,1,72,1,1,113.1,0 +0,0,0,0,11,1,1,58.95,0 +0,0,0,0,1,1,0,19.55,0 +1,0,0,0,10,1,1,86.05,1 +1,0,0,0,13,0,1,45.55,1 +1,0,1,1,34,1,1,78.95,0 +1,0,1,1,39,1,1,86.3,1 +0,0,0,0,65,1,1,105.05,0 +1,1,1,0,50,1,1,101.9,0 +1,0,0,0,15,1,0,19.75,0 +1,0,1,1,72,1,1,110.3,0 +0,0,1,1,72,1,1,115.6,0 +1,0,1,1,55,1,0,19.35,0 +0,0,1,1,23,1,1,25.6,0 +1,0,0,0,32,1,1,80.35,1 +0,0,1,1,56,1,1,68.75,0 +0,0,0,0,1,1,0,19.9,0 +1,0,0,0,38,1,0,70.6,0 +1,0,0,0,11,1,0,70.2,0 +1,0,0,0,1,1,1,49.3,0 +1,0,1,0,56,1,1,107.25,0 +1,0,1,0,3,1,1,23.6,0 +1,0,1,1,7,1,0,69.7,0 +1,0,1,1,59,1,1,99.5,0 +1,0,0,0,7,1,0,64.3,0 +1,0,1,1,71,1,1,70.85,0 +1,0,1,1,15,1,0,101.9,0 +1,0,1,0,71,1,0,73.5,0 +0,0,0,0,35,1,1,100.25,1 +0,0,0,0,11,0,1,40.4,0 +0,0,1,1,60,1,1,19.25,0 +1,1,0,0,47,1,0,59.6,0 +0,0,0,0,11,1,0,64.9,0 +1,0,1,0,56,1,0,100.3,1 +0,1,1,0,28,1,1,110.85,0 +1,0,1,0,61,1,1,81.05,0 +1,0,1,1,31,1,0,98.05,0 +1,0,0,0,9,1,1,70.5,0 +1,1,1,0,35,1,1,94.55,0 +1,0,0,0,2,1,1,19.65,0 +0,0,1,1,12,1,0,19.0,1 +0,0,0,0,1,1,0,75.3,1 +0,1,0,0,4,1,1,89.2,1 +0,0,1,1,1,1,1,19.0,0 +0,0,0,0,3,1,1,20.0,0 +0,1,0,0,1,1,1,85.7,1 +1,0,0,0,52,1,1,63.25,0 +1,0,1,1,5,1,0,20.1,0 +1,0,1,0,72,1,1,99.15,0 +1,0,1,1,71,1,0,90.4,0 +1,0,1,0,72,1,1,111.9,0 +1,0,1,1,46,1,0,24.9,0 +1,0,1,1,63,1,0,83.5,0 +1,0,0,0,30,1,1,84.3,0 +1,0,0,0,1,1,0,45.6,0 +0,0,0,0,12,1,1,61.65,1 +1,0,0,0,16,0,0,54.85,0 +1,0,0,0,4,1,0,65.55,0 +1,0,1,0,51,1,1,90.35,0 +1,0,1,0,65,1,1,20.4,0 +1,0,0,0,16,1,1,74.55,0 +1,0,0,0,2,1,0,19.95,0 +0,0,1,1,66,1,1,74.25,0 +1,0,0,0,46,1,0,108.65,0 +0,0,0,0,32,1,1,109.55,0 +1,0,1,0,72,1,0,86.65,0 +1,0,1,1,38,1,0,81.0,0 +1,0,0,1,51,1,0,47.85,0 +1,0,1,1,72,1,0,114.55,0 +0,1,1,0,65,1,0,105.25,1 +1,0,1,1,9,0,1,29.95,1 +0,0,1,1,9,1,0,65.0,1 +1,0,0,1,66,1,0,20.55,0 +0,1,0,0,44,1,1,109.8,0 +1,0,0,0,50,1,0,69.5,0 +0,0,0,0,15,1,0,48.85,0 +1,0,0,0,8,0,1,25.25,0 +0,1,0,0,66,1,1,102.85,0 +0,0,0,0,57,1,1,87.55,0 +0,0,0,0,7,1,1,78.55,0 +1,1,1,1,10,0,1,34.55,0 +0,0,0,0,62,1,1,92.05,0 +1,0,1,1,40,1,1,85.05,0 +0,0,0,0,20,1,0,19.7,0 +0,0,0,0,7,1,0,20.0,1 +0,0,1,0,25,1,1,95.15,0 +1,0,1,0,23,1,0,84.25,0 +0,1,1,0,66,1,0,104.6,0 +0,1,0,0,72,1,0,111.65,0 +1,1,1,0,49,1,0,90.05,1 +1,1,1,1,43,1,1,110.75,1 +0,0,1,0,46,1,0,55.0,0 +1,0,1,1,72,1,0,89.85,0 +1,0,0,0,10,1,0,20.35,0 +0,0,0,0,40,0,1,54.55,0 +0,0,1,1,65,1,1,105.5,1 +1,0,0,0,31,1,0,99.45,0 +0,0,1,0,68,1,0,70.9,0 +1,1,1,1,56,1,1,104.55,1 +1,0,1,0,10,1,1,85.25,1 +1,0,1,1,68,1,0,25.4,0 +0,0,1,1,43,1,0,56.15,1 +1,0,0,0,1,1,1,89.55,1 +0,1,0,0,49,1,1,89.85,0 +0,0,1,1,15,1,1,25.25,0 +1,1,1,0,20,1,1,94.55,1 +1,0,0,0,1,1,1,45.7,1 +1,0,1,1,50,1,1,69.65,0 +0,1,0,0,2,1,0,89.5,1 +1,1,0,0,24,1,0,70.0,0 +0,0,0,0,3,1,1,69.55,1 +0,0,0,0,1,1,1,74.6,1 +1,0,1,1,35,1,0,20.1,0 +0,0,0,0,17,1,0,24.8,0 +0,1,0,0,8,1,0,19.65,1 +1,0,0,0,10,1,1,95.1,0 +1,0,1,1,68,1,1,88.85,0 +1,0,1,0,45,1,0,78.8,0 +1,0,1,1,2,1,0,19.85,1 +1,0,1,0,37,1,0,20.35,0 +0,0,0,0,4,0,1,24.25,1 +0,0,0,0,10,1,0,45.25,0 +1,0,0,0,1,1,0,20.05,0 +1,0,1,1,65,1,1,69.55,0 +0,0,1,1,57,1,0,19.5,0 +0,0,0,0,3,1,1,74.75,0 +0,0,0,0,2,1,0,69.65,1 +1,0,0,0,49,0,1,30.2,0 +0,0,0,0,4,1,0,45.65,1 +0,0,1,0,70,0,0,57.8,0 +0,0,1,1,53,1,1,19.85,0 +1,0,1,1,53,1,0,25.55,0 +0,0,0,0,1,1,1,75.05,1 +1,0,0,0,22,1,1,24.85,0 +1,1,0,0,52,0,1,49.15,1 +1,1,0,0,65,1,1,110.35,0 +0,0,0,0,48,1,0,24.55,0 +0,0,0,0,2,0,1,34.7,1 +1,0,0,0,3,1,0,107.95,0 +1,0,1,0,45,1,0,81.4,0 +1,0,1,1,1,1,0,80.0,1 +0,0,1,1,61,1,1,73.8,0 +1,0,0,0,3,1,1,64.4,0 +0,1,0,0,40,1,1,103.75,0 +0,0,0,0,1,1,0,71.1,0 +0,0,0,0,1,1,1,49.9,0 +1,0,0,0,51,1,1,24.6,0 +1,1,0,0,2,1,1,49.25,1 +1,0,0,0,52,0,0,30.1,0 +1,0,0,0,51,1,0,83.4,0 +1,0,0,0,1,1,1,20.45,0 +1,0,1,1,31,1,1,75.25,0 +1,0,0,1,47,1,0,20.55,0 +0,0,0,0,3,1,1,75.1,1 +0,1,0,0,22,1,1,20.05,0 +0,0,1,0,1,1,1,20.65,0 +1,0,1,0,72,1,1,85.15,0 +1,0,1,1,3,1,1,50.15,1 +1,1,1,1,47,1,1,84.95,0 +1,0,1,1,72,1,1,66.5,0 +1,0,1,1,66,1,1,63.3,0 +1,0,0,0,35,1,0,83.15,0 +1,0,0,0,29,1,1,84.9,0 +0,0,0,0,2,1,1,20.55,0 +1,0,0,0,4,1,0,49.25,0 +0,0,0,0,25,1,1,79.85,1 +0,0,0,0,65,1,1,59.6,0 +1,1,0,0,27,1,1,104.65,0 +1,0,1,0,29,1,1,75.3,0 +1,0,1,1,29,1,0,80.1,0 +1,0,0,0,1,1,0,19.55,1 +0,0,1,0,20,1,1,81.0,0 +0,0,0,0,58,1,1,24.7,0 +0,0,0,1,14,1,1,86.0,0 +1,0,1,0,72,1,0,25.4,0 +1,0,0,0,46,1,1,89.15,0 +0,0,1,0,71,0,0,58.25,0 +1,0,0,0,32,1,1,85.65,0 +0,0,0,0,26,0,1,50.35,0 +1,1,1,0,68,1,1,80.35,0 +1,0,1,1,2,1,0,20.2,0 +1,0,1,1,61,1,0,20.55,0 +0,0,1,1,4,1,1,85.95,1 +1,0,0,0,3,1,1,45.35,1 +1,1,1,0,33,1,1,94.5,1 +1,1,1,0,9,1,1,21.25,0 +0,0,0,0,22,1,0,26.25,0 +0,0,1,1,5,1,1,80.85,0 +0,1,0,0,30,1,0,91.7,1 +1,0,0,0,65,1,1,74.2,0 +0,0,0,0,45,1,1,87.25,1 +1,0,0,0,5,1,0,20.35,0 +1,0,1,1,25,1,1,75.5,0 +0,0,1,1,72,1,0,79.05,0 +0,0,1,0,27,1,0,90.15,0 +1,0,1,1,32,0,0,50.6,0 +0,0,0,0,30,1,0,110.45,0 +1,0,1,0,70,1,0,101.0,0 +1,1,0,0,42,1,1,79.35,0 +0,1,1,0,72,1,1,89.85,0 +0,0,0,0,47,1,1,65.0,0 +0,0,0,0,2,1,1,80.45,0 +1,0,0,0,10,1,0,98.55,1 +0,0,1,1,61,1,1,24.1,0 +0,0,0,0,5,1,1,44.05,0 +0,1,1,0,72,1,1,110.8,0 +1,1,1,1,72,1,1,114.95,0 +0,1,0,0,3,1,0,75.05,0 +1,0,1,0,48,1,0,19.25,0 +0,0,0,0,63,1,1,90.05,0 +0,0,0,0,27,1,1,56.7,0 +1,0,1,1,70,1,1,80.15,0 +1,0,1,1,7,1,1,71.35,0 +0,0,1,0,2,1,0,90.35,0 +1,1,0,0,20,1,1,98.55,1 +1,0,0,0,66,1,0,19.7,0 +0,0,0,0,3,1,0,19.85,0 +0,0,0,1,15,1,1,85.9,1 +0,0,1,1,72,1,1,90.35,0 +1,0,0,0,1,1,0,20.8,0 +0,0,0,0,22,1,0,89.25,1 +1,0,1,0,3,1,1,70.3,1 +0,0,1,1,72,1,0,66.85,0 +1,0,1,1,65,1,0,19.9,0 +0,0,0,0,11,0,1,35.8,0 +1,0,0,0,22,1,1,78.85,0 +1,0,0,0,14,1,0,20.4,0 +1,0,0,0,41,1,1,74.25,0 +1,0,1,0,17,1,0,64.8,0 +1,0,0,0,11,1,1,20.45,0 +1,0,0,0,15,1,1,93.35,1 +0,0,0,0,1,1,0,19.9,1 +0,0,1,0,5,1,1,88.9,1 +1,0,1,0,33,1,1,95.8,1 +0,0,1,0,72,1,1,110.65,0 +0,0,1,1,3,0,0,40.3,0 +1,0,0,0,2,1,1,82.0,1 +0,0,1,0,59,1,1,107.0,0 +1,0,0,0,2,1,0,45.35,1 +1,0,1,1,71,1,1,73.35,0 +0,0,1,1,5,1,0,44.8,0 +1,0,1,1,27,1,1,54.75,0 +0,0,0,0,1,1,1,52.2,1 +1,0,0,1,63,0,1,40.6,0 +0,1,0,0,46,1,1,110.0,1 +1,0,1,1,72,1,0,55.3,0 +0,0,1,0,34,1,1,60.85,0 +0,0,1,1,24,1,0,78.4,0 +1,0,0,0,72,1,0,69.65,0 +0,0,1,1,60,0,0,59.85,0 +1,0,0,0,68,1,1,76.9,0 +0,0,1,1,8,1,1,19.85,0 +0,0,0,1,34,1,0,67.65,0 +0,0,0,0,6,0,0,45.0,0 +1,0,1,0,2,1,1,64.2,0 +1,0,0,0,31,1,0,81.7,0 +0,0,1,1,20,1,1,25.55,0 +0,0,1,1,1,1,0,20.0,0 +1,0,0,0,62,1,1,96.75,1 +0,1,1,0,70,1,1,75.65,0 +0,0,0,0,10,1,1,98.5,1 +1,0,1,1,39,1,1,23.8,0 +0,0,1,0,46,1,1,64.2,0 +1,0,0,0,6,1,1,85.35,1 +0,0,1,1,72,1,1,76.8,0 +1,0,0,0,18,1,0,55.2,0 +1,0,1,0,71,1,1,108.55,0 +1,0,1,0,40,1,1,101.3,1 +1,0,0,0,1,1,1,69.55,1 +1,0,0,0,58,1,1,103.25,1 +1,0,0,0,70,1,1,104.0,1 +0,0,1,0,42,1,0,25.25,0 +1,0,1,1,34,0,0,30.4,0 +1,1,0,0,5,1,0,20.05,0 +0,0,0,0,25,1,1,84.6,0 +0,0,0,0,2,1,1,86.2,1 +0,0,1,1,55,1,1,103.7,0 +1,0,1,0,21,1,1,111.2,1 +1,0,1,0,70,1,1,88.0,0 +0,0,1,0,61,1,1,106.35,0 +1,0,1,1,43,1,1,79.15,0 +1,0,0,0,47,1,1,103.1,0 +1,0,0,0,5,1,1,63.95,0 +0,0,0,0,62,1,1,25.8,0 +0,0,1,1,16,1,1,89.45,1 +1,1,1,0,7,1,1,95.6,1 +0,0,1,1,14,1,0,25.55,0 +1,0,1,1,60,1,0,90.95,1 +1,0,1,1,34,0,1,44.85,0 +0,0,1,0,50,1,0,108.55,1 +1,0,1,1,38,1,0,25.05,0 +0,0,1,1,70,1,0,74.1,0 +0,0,1,1,37,1,1,88.8,0 +0,1,0,0,4,1,1,78.85,1 +1,1,1,1,60,1,1,93.25,0 +1,0,1,1,62,1,0,71.4,0 +1,0,0,0,1,1,0,44.4,1 +1,0,0,0,36,1,1,79.2,0 +1,0,0,0,44,1,0,20.4,0 +0,1,0,0,55,1,1,100.0,1 +0,0,1,0,72,1,1,105.0,0 +0,0,1,1,12,1,0,19.8,1 +0,0,0,0,13,0,1,30.85,0 +1,0,0,0,1,1,1,89.9,1 +0,0,1,1,15,1,0,20.55,0 +0,0,0,0,65,1,1,84.85,0 +0,0,1,1,12,0,0,33.15,0 +1,0,1,0,72,1,1,92.0,0 +0,0,1,1,72,1,0,89.8,0 +0,0,1,1,72,1,1,115.8,0 +1,0,0,1,52,1,1,85.15,0 +1,0,0,0,2,1,0,24.85,0 +0,0,0,0,5,1,1,64.35,0 +0,0,0,0,68,1,0,20.5,0 +0,0,0,1,62,1,1,100.15,1 +1,0,0,0,72,1,0,86.05,0 +1,0,0,0,1,1,0,50.8,1 +0,0,1,0,66,1,0,89.0,0 +1,0,1,1,72,0,1,64.8,0 +1,0,0,0,26,1,0,19.8,0 +1,0,1,1,64,1,0,93.4,0 +1,1,1,0,20,1,1,73.65,1 +0,0,0,0,3,1,1,95.1,1 +1,0,0,0,22,1,1,94.65,1 +1,0,1,0,4,1,1,80.6,1 +1,0,1,0,62,0,1,39.0,0 +0,0,0,0,5,1,1,20.5,0 +1,0,1,0,59,1,0,85.55,1 +1,0,0,1,3,1,1,26.4,0 +0,0,1,0,72,1,1,98.2,0 +1,0,1,1,57,1,1,97.55,0 +1,0,0,1,66,1,0,19.95,0 +0,0,0,0,60,0,1,50.8,1 +1,0,0,1,45,1,0,99.7,0 +0,0,0,0,3,0,1,34.8,0 +0,0,0,0,15,1,0,105.1,1 +0,0,0,1,51,0,0,60.15,0 +0,0,0,0,60,1,0,64.75,0 +1,0,0,0,33,1,1,54.65,0 +1,0,0,0,10,1,1,110.1,1 +1,1,0,0,26,1,0,19.3,0 +0,0,0,0,6,1,0,83.9,1 +0,0,1,0,67,1,1,111.25,0 +0,0,1,1,49,0,1,35.8,0 +1,0,0,0,1,1,1,20.05,0 +0,1,0,0,7,1,1,84.35,0 +0,1,0,0,27,1,1,110.5,0 +1,0,1,1,37,1,0,91.2,0 +0,0,1,1,63,1,1,100.55,1 +1,0,1,1,31,1,0,89.3,0 +1,0,1,1,50,1,1,103.85,1 +1,1,0,0,32,1,1,81.1,0 +0,0,0,0,1,0,0,24.6,1 +0,0,1,0,63,1,1,81.2,0 +1,0,0,0,30,1,1,94.3,0 +1,0,1,0,71,1,1,116.1,0 +0,0,0,0,53,1,0,105.55,0 +0,0,0,0,12,1,1,98.9,1 +1,0,1,0,50,1,1,94.4,0 +0,0,0,0,2,1,0,19.5,0 +0,0,0,0,9,1,0,98.3,1 +1,0,0,0,17,1,0,93.85,1 +0,0,1,0,56,1,1,105.6,0 +1,0,1,1,67,1,0,81.35,0 +1,1,0,0,9,1,1,100.5,1 +1,0,0,0,4,1,1,56.4,0 +1,0,0,0,19,1,1,65.35,0 +0,0,0,1,8,1,0,19.95,0 +0,0,0,0,71,1,1,111.25,0 +1,1,0,0,10,1,1,72.85,1 +0,1,0,0,15,1,0,89.0,0 +1,0,1,1,72,1,1,106.1,0 +1,0,0,0,12,1,0,20.05,0 +1,0,1,1,72,1,1,25.2,0 +1,1,1,0,1,1,1,73.55,1 +0,1,0,0,23,1,1,75.4,0 +1,0,0,0,72,0,1,65.55,0 +0,0,0,0,26,1,1,80.7,0 +0,0,0,0,21,1,1,104.55,0 +1,0,1,0,60,1,0,24.15,0 +1,0,0,0,12,1,0,20.45,0 +1,0,1,0,16,1,1,75.4,0 +0,0,1,0,63,1,1,79.7,0 +0,1,0,0,22,1,0,81.7,0 +0,0,1,1,32,1,0,76.3,0 +0,1,0,0,3,1,1,79.4,1 +0,0,0,0,13,1,1,81.15,1 +0,0,1,1,68,1,1,103.75,0 +0,0,1,1,30,1,0,86.45,0 +0,0,0,0,16,1,0,75.1,0 +1,0,0,0,33,1,0,80.6,0 +1,0,1,0,72,1,0,19.3,0 +0,1,0,0,4,1,1,84.6,1 +0,0,0,0,12,0,1,33.6,0 +0,1,1,0,4,1,1,83.25,0 +0,0,0,0,6,1,1,79.05,1 +0,0,1,0,65,1,1,108.05,0 +0,0,0,0,15,1,0,19.9,0 +0,0,0,1,24,1,0,21.05,0 +0,0,0,1,13,0,0,30.15,0 +1,0,0,0,24,1,1,79.85,0 +0,0,1,0,72,0,0,65.5,0 +0,0,1,1,54,1,1,104.1,0 +0,0,0,0,3,1,0,74.4,1 +1,0,1,1,4,1,1,20.5,0 +0,1,1,1,32,1,1,91.35,0 +1,1,0,0,35,1,1,99.05,1 +1,0,1,1,35,1,0,20.5,0 +1,1,0,0,2,1,0,44.95,1 +0,0,0,0,8,1,0,75.6,0 +1,0,0,0,22,1,0,55.1,0 +0,0,0,0,15,1,0,58.95,0 +1,0,0,0,22,1,1,95.1,0 +1,0,1,0,1,1,0,44.7,1 +0,0,1,1,71,1,0,25.45,0 +1,0,0,0,4,1,0,56.75,0 +1,0,0,0,25,1,0,81.75,0 +0,0,1,1,32,1,1,86.1,0 +1,1,1,0,7,0,0,29.8,0 +1,0,0,0,17,1,1,20.5,0 +1,1,1,0,8,1,0,60.9,0 +0,1,0,0,56,1,0,73.25,0 +1,0,0,0,1,1,1,45.7,1 +1,1,0,0,8,1,0,100.3,1 +1,0,0,0,7,1,0,19.25,1 +1,0,0,1,3,1,0,20.85,0 +0,0,0,0,71,1,0,77.35,0 +0,0,0,0,2,1,1,96.0,1 +0,0,0,0,1,1,0,90.55,1 +1,0,1,0,49,1,1,93.85,0 +1,0,0,0,58,1,0,70.1,0 +1,1,1,0,44,0,1,30.35,1 +0,0,1,1,59,1,1,75.95,0 +1,0,0,0,71,1,1,108.05,1 +1,0,0,0,1,1,1,69.9,1 +0,0,0,0,11,1,0,75.25,0 +1,1,1,0,62,1,1,103.75,1 +0,0,1,1,35,1,1,54.95,0 +0,0,0,0,20,1,1,19.5,0 +1,0,1,1,40,1,0,19.6,0 +0,0,0,0,39,1,1,47.85,0 +1,0,0,0,1,1,1,86.6,1 +0,0,1,1,72,1,0,23.75,0 +0,1,1,0,33,1,1,80.6,1 +0,0,0,0,12,1,0,43.8,0 +1,0,0,0,1,1,0,19.75,0 +1,0,0,1,27,1,0,19.15,0 +1,0,1,1,34,1,0,19.6,0 +0,0,1,0,56,1,0,80.3,0 +0,0,0,0,58,1,0,24.35,0 +0,0,1,1,22,1,0,25.25,0 +0,0,1,1,10,1,0,26.1,0 +1,0,0,0,13,1,0,20.0,0 +0,0,0,0,35,1,0,85.3,1 +0,0,0,0,34,1,1,70.0,1 +0,1,0,0,4,1,1,94.3,1 +1,0,1,0,72,1,0,20.7,0 +1,0,0,0,2,1,0,70.3,0 +0,0,0,0,7,1,1,95.35,1 +1,1,1,0,27,1,1,75.5,1 +1,0,1,1,4,1,1,69.55,0 +0,0,0,0,37,1,0,19.85,0 +1,0,0,0,21,1,0,20.0,0 +0,1,1,0,53,1,1,95.85,0 +0,0,0,0,18,1,1,90.1,1 +0,0,0,0,2,1,0,68.95,1 +1,0,1,1,32,1,1,99.55,1 +1,1,1,0,23,1,1,20.75,0 +1,0,0,0,3,1,1,50.15,0 +0,0,1,1,71,0,0,58.65,0 +1,0,0,0,9,1,1,95.9,0 +0,0,0,0,1,1,0,49.5,0 +1,0,1,1,18,1,0,57.45,1 +1,0,1,1,12,1,0,53.65,1 +1,0,1,0,71,1,1,80.1,0 +0,0,0,0,64,1,1,24.4,0 +1,0,0,0,4,0,1,40.05,0 +0,0,0,0,23,1,1,19.5,0 +0,0,1,1,39,1,0,51.05,0 +1,0,1,0,28,1,0,54.35,0 +0,1,0,0,5,1,1,84.7,0 +0,1,1,0,45,1,1,86.1,0 +1,0,0,0,37,1,1,70.35,0 +0,1,1,0,60,1,1,110.0,0 +1,1,0,0,8,1,1,100.6,1 +0,0,0,0,47,1,0,94.9,0 +1,0,1,1,26,1,1,83.75,1 +0,1,1,1,3,1,1,88.3,1 +0,0,1,1,50,1,1,69.75,0 +1,0,1,1,27,1,0,71.6,0 +0,1,0,0,8,1,1,92.1,1 +0,0,1,0,62,1,0,23.65,0 +0,0,1,0,71,1,0,81.85,0 +1,0,0,0,66,1,0,25.1,0 +1,0,1,1,68,1,1,114.7,0 +0,0,0,0,13,0,0,49.15,0 +1,0,1,0,56,1,1,80.9,0 +1,0,1,0,38,1,1,79.45,1 +1,1,0,0,14,1,0,90.45,1 +0,0,0,1,16,1,1,19.3,0 +0,0,1,1,14,1,0,70.2,0 +1,0,1,1,32,1,1,69.75,1 +0,0,0,0,8,1,0,54.25,0 +0,0,1,1,43,1,1,99.3,0 +0,0,0,0,52,1,0,74.0,0 +1,0,0,0,3,1,1,50.25,0 +1,0,0,0,29,1,1,19.8,0 +0,0,0,0,1,1,0,19.65,1 +1,1,0,0,12,0,1,43.65,1 +0,0,1,1,16,0,1,35.5,0 +0,0,0,0,40,1,1,80.75,0 +0,0,0,0,5,0,0,39.5,1 +1,0,1,0,40,1,1,97.1,1 +0,0,0,0,36,1,0,19.55,0 +0,0,0,0,5,1,1,80.0,1 +0,0,0,0,10,1,1,84.7,1 +1,0,1,1,2,1,1,89.55,1 +1,0,0,0,23,1,1,90.6,1 +1,0,1,1,26,1,1,20.05,0 +0,1,1,0,72,1,1,112.4,0 +0,0,1,0,34,1,0,50.2,0 +1,0,0,0,10,1,0,62.25,0 +0,0,0,0,14,1,0,55.7,0 +0,0,0,0,23,1,1,90.05,1 +1,0,1,0,47,1,0,19.65,0 +1,0,1,0,24,1,1,89.25,0 +1,0,1,0,49,1,1,99.05,1 +1,1,0,0,20,1,0,54.0,0 +0,0,0,0,2,1,0,69.75,1 +0,0,0,0,2,1,1,49.05,1 +1,0,0,0,22,0,0,56.75,0 +1,0,0,0,7,1,1,98.05,1 +1,0,0,0,1,1,0,21.1,0 +0,0,1,1,59,1,1,96.65,0 +0,0,1,1,58,1,1,24.5,0 +0,0,0,0,41,1,1,114.5,1 +0,1,0,0,59,1,1,79.2,0 +0,0,1,1,3,1,1,69.55,0 +1,0,0,0,32,1,1,20.05,0 +1,1,1,0,46,1,1,98.85,0 +1,0,0,0,2,1,1,80.95,1 +0,0,1,1,52,1,0,19.6,0 +0,1,0,0,13,1,1,74.3,1 +0,1,0,0,11,1,0,89.7,1 +1,0,0,0,32,1,0,87.65,0 +1,1,1,0,17,1,1,100.45,1 +0,0,0,0,16,1,1,74.75,0 +0,0,0,0,51,1,0,107.45,0 +1,0,0,0,29,1,1,75.35,0 +1,0,1,0,70,1,0,64.95,0 +0,0,1,1,71,1,0,100.45,0 +1,0,1,1,41,1,0,68.5,0 +1,0,0,0,1,1,1,80.55,0 +0,0,1,0,7,1,0,81.25,0 +1,0,1,1,25,1,1,90.4,1 +1,0,1,1,67,1,0,89.55,0 +1,0,1,1,5,1,1,55.7,0 +1,0,0,1,15,1,1,24.8,0 +0,0,1,1,20,1,0,20.0,0 +1,0,1,1,3,1,1,56.15,1 +1,0,1,1,54,1,1,105.2,0 +1,0,0,0,42,1,1,19.55,0 +0,0,1,0,9,1,1,79.75,0 +0,0,0,0,63,1,0,97.45,0 +0,0,1,0,69,1,0,24.25,0 +0,0,0,0,69,1,0,24.6,0 +1,0,1,0,40,1,1,50.15,0 +1,0,0,0,60,0,0,39.6,0 +0,0,0,0,4,1,1,94.4,1 +0,1,0,0,71,1,0,89.85,0 +0,0,1,0,37,1,1,78.95,1 +1,0,1,0,32,1,1,98.85,0 +1,0,0,0,39,1,1,53.85,0 +0,0,0,0,38,1,1,24.25,0 +1,0,0,0,52,1,1,89.45,0 +0,0,1,1,48,1,1,105.25,0 +1,0,1,1,70,0,0,59.5,0 +1,0,0,0,20,1,0,70.55,0 +0,0,0,0,50,1,1,82.5,0 +0,0,0,0,19,0,1,44.85,1 +1,0,1,1,25,1,1,61.6,0 +1,0,0,0,12,1,1,49.05,0 +1,1,1,0,39,1,1,105.65,1 +1,0,0,0,7,1,0,74.65,1 +0,0,1,1,23,1,1,66.25,0 +1,0,0,0,27,1,1,19.4,0 +1,1,0,0,47,1,1,86.05,0 +1,0,1,1,26,1,1,19.15,0 +0,0,1,0,14,1,1,64.7,1 +0,1,1,0,11,1,1,104.05,1 +1,0,0,1,2,1,0,19.25,0 +0,0,1,1,26,1,0,81.95,0 +0,1,1,0,72,1,1,114.65,0 +0,0,1,1,63,1,0,20.0,0 +1,0,1,1,71,1,0,19.8,0 +1,0,1,1,11,1,1,65.15,0 +1,1,1,0,14,1,0,19.65,0 +0,0,0,1,13,1,0,88.95,0 +1,0,0,1,6,1,1,20.2,0 +1,1,1,1,11,1,1,75.2,0 +1,0,1,0,18,1,0,56.8,0 +1,0,0,0,1,0,1,35.55,1 +0,0,1,0,32,1,1,75.5,0 +1,0,0,0,29,0,0,35.6,0 +0,0,0,0,3,1,1,60.25,0 +0,0,0,0,2,1,1,95.15,1 +1,0,1,1,13,1,1,96.65,1 +0,0,0,0,41,0,1,40.35,0 +0,0,0,0,1,1,0,18.85,0 +1,0,0,0,7,1,0,54.85,0 +0,0,1,0,52,1,1,64.3,0 +0,0,1,1,45,1,1,24.65,0 +1,0,1,0,70,1,0,76.1,0 +0,0,0,0,53,1,0,18.7,0 +0,1,1,0,62,1,1,97.95,0 +0,0,1,0,60,1,1,94.1,0 +0,1,1,0,3,1,1,80.4,1 +0,1,1,0,23,1,1,95.1,0 +1,0,0,1,1,0,1,31.35,1 +0,0,0,0,67,1,1,72.35,0 +0,0,0,0,12,1,1,89.75,1 +0,1,1,0,71,1,1,82.7,0 +1,0,0,0,25,1,0,19.9,0 +0,0,0,0,5,1,1,53.8,0 +1,0,0,0,26,1,1,51.55,0 +1,0,1,1,1,1,0,19.65,0 +1,1,0,0,70,0,1,44.05,0 +1,0,1,1,72,1,1,114.0,0 +1,0,1,0,60,1,1,94.4,1 +0,1,1,1,32,1,1,100.4,0 +1,0,0,0,1,1,1,19.85,1 +0,0,0,0,14,1,1,54.25,0 +0,0,0,0,13,1,1,80.0,0 +0,0,0,0,6,1,1,109.9,1 +0,0,0,0,46,1,0,79.2,0 +1,0,0,0,15,1,1,101.35,1 +1,1,1,0,43,1,1,94.3,0 +1,0,0,0,39,1,1,49.8,0 +1,1,0,0,21,1,1,60.05,1 +1,0,0,0,57,0,1,53.75,0 +0,0,1,0,53,1,1,93.45,0 +1,0,1,1,18,1,1,87.9,0 +0,0,0,0,1,1,1,60.15,1 +0,0,1,0,58,1,1,61.05,0 +0,1,0,0,71,1,0,104.05,0 +0,0,0,0,35,1,1,99.25,0 +1,0,0,0,3,1,0,85.7,0 +1,0,0,0,38,1,1,104.85,0 +1,0,1,1,35,1,1,69.15,0 +1,0,0,0,7,1,1,90.45,1 +0,0,0,0,47,1,0,74.45,0 +0,0,0,0,14,1,0,50.45,0 +0,1,1,0,20,1,1,60.0,0 +1,0,1,0,66,1,0,85.25,0 +1,0,1,0,15,1,1,19.45,0 +0,0,0,0,42,1,1,20.75,0 +0,0,1,0,17,1,0,78.9,0 +1,0,0,0,37,1,1,104.5,0 +0,0,0,0,12,1,1,49.4,0 +1,0,1,0,53,1,1,94.25,1 +0,0,0,0,60,1,0,25.0,0 +1,0,1,1,18,0,0,25.55,0 +1,0,0,0,1,1,1,74.9,1 +0,0,0,0,3,1,1,70.15,0 +0,0,0,1,9,1,1,69.4,0 +0,0,0,0,1,1,1,80.25,1 +1,0,1,0,56,1,1,93.15,0 +1,0,1,1,17,1,1,69.0,1 +0,0,1,1,11,1,1,66.35,1 +1,0,0,0,7,1,1,69.55,0 +0,0,1,1,69,1,0,20.2,0 +1,0,0,0,19,1,1,86.0,1 +0,0,1,1,3,1,1,80.3,1 +1,0,1,1,54,1,0,20.4,0 +1,0,1,0,62,1,1,23.75,0 +1,0,0,0,24,1,1,90.55,1 +0,0,1,1,62,1,1,70.45,0 +1,0,0,0,17,1,0,65.75,0 +1,0,0,0,9,0,1,24.6,0 +1,0,1,1,64,1,0,69.25,0 +0,0,0,0,2,1,1,75.9,1 +1,0,1,1,1,1,1,45.85,1 +0,0,1,0,16,0,1,49.95,1 +0,0,1,0,72,1,0,24.65,0 +1,0,0,0,30,1,0,90.4,0 +0,0,1,0,49,1,1,100.85,0 +1,0,1,0,61,1,0,75.35,0 +1,0,1,1,47,1,0,87.2,0 +1,0,0,0,20,1,0,64.4,0 +1,0,1,1,34,1,0,78.3,1 +0,0,1,1,70,1,0,24.7,0 +1,0,0,1,54,1,1,105.85,0 +1,1,1,0,61,1,1,98.3,0 +1,0,0,0,3,1,1,76.95,1 +1,0,0,0,13,1,0,19.45,0 +0,1,0,0,16,1,1,96.15,1 +0,0,1,1,3,1,1,58.7,0 +1,0,0,0,25,1,1,20.15,0 +1,0,0,0,30,1,1,64.5,0 +0,0,1,0,21,0,0,28.5,0 +1,0,0,0,1,1,0,45.3,1 +0,0,0,0,15,1,0,19.4,1 +1,1,1,0,23,1,1,90.45,0 +0,0,1,1,45,1,1,105.15,0 +0,0,1,1,24,1,0,83.15,0 +0,0,0,0,11,1,0,90.15,1 +1,0,0,0,1,1,0,45.05,1 +0,0,1,0,56,1,0,103.2,0 +0,0,0,0,1,1,0,75.8,1 +1,0,0,0,1,1,0,19.45,0 +0,0,0,0,7,1,1,79.3,1 +0,1,1,0,55,1,0,88.8,0 +0,0,0,0,2,0,1,30.9,1 +0,0,1,1,72,1,1,85.9,0 +0,1,0,0,45,0,0,34.2,0 +0,0,0,0,47,1,0,20.15,0 +0,1,0,0,46,1,0,95.25,1 +1,0,0,0,2,1,1,50.3,0 +0,0,1,0,2,1,1,80.15,0 +0,0,1,0,12,1,1,51.25,0 +0,1,1,0,68,1,1,89.6,1 +1,0,1,1,69,1,1,95.2,0 +1,1,0,1,56,1,0,94.8,0 +0,1,0,0,4,1,1,80.25,0 +1,0,1,0,64,1,1,76.1,0 +1,0,1,0,59,1,1,110.15,1 +1,0,1,1,62,1,0,115.55,0 +1,0,1,1,63,1,0,24.65,0 +0,0,0,0,53,0,1,53.6,0 +1,0,1,1,5,1,0,19.45,0 +1,1,1,0,49,1,1,88.2,0 +0,0,1,1,62,1,1,101.15,0 +0,0,1,0,55,1,0,56.8,0 +0,1,1,0,71,1,1,99.4,0 +0,0,1,1,72,1,1,20.1,0 +1,0,1,1,36,0,0,60.7,0 +1,0,1,0,25,1,1,20.95,0 +0,1,1,0,72,1,1,114.85,0 +0,0,0,0,36,1,1,19.25,0 +1,0,0,0,1,1,1,62.8,0 +0,0,1,0,72,1,1,105.5,0 +1,0,1,1,59,1,0,19.85,0 +1,1,1,0,7,1,1,89.5,1 +0,0,0,0,1,1,0,74.1,0 +0,0,1,1,30,1,1,107.5,0 +1,0,0,0,64,1,0,19.55,0 +1,0,0,0,63,1,0,68.8,0 +1,1,1,0,72,1,0,84.45,0 +1,0,1,0,8,1,0,75.0,1 +0,0,0,0,62,1,0,84.5,0 +1,0,1,1,67,1,1,111.2,0 +1,0,0,0,6,1,0,44.75,1 +0,0,1,1,70,1,1,80.6,0 +0,1,0,0,20,1,0,80.7,0 +0,0,0,0,5,1,0,75.6,0 +0,0,1,1,24,0,0,57.6,0 +0,0,1,0,11,1,1,44.05,1 +1,0,1,0,72,1,1,110.6,0 +0,0,1,1,66,1,1,58.2,0 +0,0,1,1,45,1,1,81.0,0 +0,0,1,1,69,1,0,19.7,0 +1,1,1,0,15,1,1,85.6,1 +0,0,0,0,28,1,1,59.55,0 +0,0,0,0,70,1,0,115.55,1 +0,0,0,0,36,1,1,75.55,0 +1,1,0,0,16,1,1,86.6,1 +0,0,0,0,18,1,1,85.2,1 +0,0,1,0,34,1,1,97.65,1 +1,0,1,1,42,0,1,45.1,0 +1,0,0,0,48,1,1,70.95,0 +1,0,1,0,47,1,1,109.55,1 +0,0,1,1,39,1,1,89.55,1 +0,0,1,1,11,1,0,20.9,0 +1,0,0,0,7,1,1,19.95,0 +0,0,0,0,3,1,0,24.6,0 +1,0,0,0,8,1,1,66.7,0 +1,0,0,1,1,1,1,19.45,1 +1,0,1,1,32,1,0,94.8,0 +1,0,1,1,60,1,1,65.85,0 +0,0,1,0,10,1,1,19.95,0 +0,0,1,0,71,1,1,24.65,0 +0,0,1,1,4,1,0,20.35,1 +0,1,0,0,1,1,1,69.25,1 +0,0,1,1,43,0,1,51.25,0 +1,0,1,0,59,1,1,99.5,1 +0,0,1,0,23,1,0,54.25,0 +0,0,1,0,72,1,0,19.4,0 +1,0,1,0,22,1,1,56.25,0 +0,0,0,0,1,0,1,25.15,0 +1,0,0,0,69,1,0,23.95,0 +1,0,0,0,50,0,1,35.4,0 +0,1,0,0,1,0,1,25.2,1 +1,0,0,0,2,1,1,45.0,1 +0,0,1,0,15,1,0,75.35,0 +1,0,0,0,31,1,0,20.4,0 +1,0,0,0,1,1,0,20.15,1 +1,0,1,0,66,1,1,105.0,1 +1,0,0,1,3,1,1,54.7,1 +0,0,0,0,8,1,0,20.0,0 +1,0,1,1,64,1,1,73.05,0 +0,0,1,0,28,1,0,20.5,0 +0,0,1,0,57,1,1,100.75,0 +0,0,1,1,14,1,1,87.25,1 +1,0,0,0,19,1,1,19.95,0 +1,0,1,0,10,1,1,79.95,1 +0,0,1,0,51,0,1,49.65,0 +0,0,1,0,67,1,0,65.65,0 +1,0,1,1,11,1,1,20.45,0 +1,0,1,1,72,0,0,60.95,0 +1,0,1,1,66,1,1,20.35,0 +0,0,0,0,18,1,1,88.35,1 +0,0,0,0,9,1,1,19.5,0 +0,0,0,0,9,1,1,75.2,0 +1,0,1,0,48,1,1,111.45,0 +1,0,0,0,10,1,0,70.15,0 +0,0,0,0,9,1,1,94.75,1 +0,1,0,0,13,1,1,95.05,1 +1,0,0,0,4,1,0,78.45,1 +1,0,0,0,4,1,1,70.2,1 +0,0,1,0,72,1,0,92.0,0 +0,0,1,1,51,1,0,85.5,0 +1,0,1,0,59,0,1,41.05,1 +1,0,1,0,10,1,1,85.6,1 +1,1,1,0,61,1,1,82.15,0 +1,0,0,0,54,1,0,84.4,0 +0,0,0,0,33,1,1,60.9,0 +0,0,0,0,27,1,1,20.25,0 +0,1,0,0,1,1,1,79.2,1 +1,0,0,0,23,1,0,95.3,0 +1,0,0,1,1,1,0,19.85,0 +1,0,1,1,45,1,1,84.35,0 +0,0,1,1,39,1,1,19.85,0 +1,0,0,0,5,1,1,70.0,1 +1,0,1,1,72,1,0,82.3,0 +0,0,1,1,58,1,1,66.8,0 +0,0,0,0,70,0,1,44.6,0 +1,0,1,1,61,1,1,98.45,0 +1,0,0,0,2,1,0,70.7,0 +0,0,1,1,46,1,0,24.95,0 +0,0,0,0,1,1,1,49.95,1 +0,0,1,0,22,1,1,69.25,1 +0,0,0,0,48,1,1,102.5,0 +1,0,0,0,64,1,0,86.55,0 +1,0,1,1,72,1,0,24.3,0 +0,0,1,1,12,1,1,58.35,0 +0,1,1,0,34,1,1,94.25,1 +0,0,1,1,72,1,0,68.75,0 +1,0,1,0,29,1,1,85.8,0 +1,0,1,1,33,1,0,20.1,0 +0,0,0,0,1,1,0,20.35,0 +0,0,1,1,62,1,1,110.8,0 +1,0,1,0,41,1,1,73.0,1 +0,0,0,0,64,1,1,100.05,1 +0,0,0,0,4,1,1,82.85,0 +0,0,0,0,24,1,1,84.35,0 +0,0,1,1,14,1,0,19.55,0 +1,0,0,1,3,1,0,19.95,0 +0,1,0,0,4,1,1,99.8,1 +0,0,0,1,18,0,1,35.0,1 +1,0,0,0,8,1,1,66.25,0 +0,0,0,0,35,1,0,23.3,0 +0,0,0,0,1,1,0,76.0,1 +1,0,0,1,66,1,1,25.3,0 +1,0,0,1,8,0,1,44.55,0 +0,0,1,0,71,1,1,104.1,0 +0,0,1,1,43,1,1,92.55,0 +0,1,0,0,2,1,1,93.85,1 +1,1,0,0,29,1,1,101.45,0 +0,0,1,0,15,1,1,84.3,1 +1,0,1,1,65,1,0,94.55,0 +1,0,0,0,35,1,0,95.5,0 +1,0,0,0,64,1,1,100.3,0 +0,0,1,1,58,0,1,55.5,0 +0,1,0,0,18,1,1,49.85,0 +1,0,1,1,67,1,1,89.55,0 +1,0,1,1,63,1,1,19.15,0 +0,0,1,0,60,1,1,99.8,0 +1,1,0,0,9,1,1,84.4,1 +0,0,1,1,70,1,1,113.05,0 +1,0,1,0,15,1,1,101.1,1 +0,0,0,1,48,1,0,19.95,0 +1,0,1,0,12,1,1,74.15,0 +1,1,1,0,71,1,1,92.0,0 +1,1,0,0,44,1,0,73.85,0 +1,0,0,0,1,1,1,50.45,1 +1,0,1,1,45,1,0,24.45,0 +0,0,0,0,23,1,0,24.8,0 +0,0,1,0,43,1,1,64.85,0 +1,0,0,0,35,1,0,20.75,0 +1,0,1,0,9,1,1,68.95,0 +1,0,0,0,12,1,1,99.95,1 +0,1,1,0,65,1,1,109.4,0 +0,0,0,0,2,1,1,91.4,1 +1,0,0,0,27,1,0,49.0,0 +0,0,0,0,40,1,1,50.25,0 +0,1,0,0,5,1,1,75.55,1 +1,0,1,1,8,1,0,19.9,0 +0,1,1,0,58,1,1,97.8,0 +0,0,1,1,52,1,0,100.3,0 +1,0,1,0,3,1,1,55.8,0 +1,0,0,1,41,1,1,111.15,0 +1,0,0,0,20,1,1,98.55,0 +1,0,0,1,1,1,1,50.05,0 +1,0,0,1,4,1,0,80.8,1 +1,0,0,0,23,1,0,20.85,0 +0,1,0,0,6,1,0,19.5,0 +1,0,1,1,8,1,1,19.35,0 +1,0,0,0,18,1,0,69.5,0 +1,1,0,0,52,0,1,48.8,0 +1,0,0,0,31,1,1,94.5,0 +1,0,1,1,29,1,1,20.65,0 +0,0,1,0,36,1,1,106.05,0 +0,0,1,0,16,1,1,100.0,1 +1,0,1,0,42,1,1,108.3,0 +1,0,0,0,1,1,0,20.55,1 +0,0,0,0,60,1,1,99.65,0 +1,0,0,0,5,1,1,85.3,1 +1,0,1,0,22,1,0,95.9,0 +1,0,1,0,36,1,0,20.0,0 +0,0,0,0,4,1,0,70.4,1 +1,0,0,0,9,1,0,64.95,0 +1,0,1,1,1,1,0,74.6,0 +1,0,1,1,12,1,1,49.2,0 +0,0,0,0,23,1,1,73.75,0 +1,0,0,0,62,1,1,92.3,0 +1,0,0,0,37,1,0,98.8,1 +0,0,0,0,8,1,0,19.2,0 +1,0,1,0,31,1,0,88.65,0 +1,0,1,1,13,1,1,74.4,1 +0,0,0,0,24,1,1,98.75,1 +1,0,1,1,45,1,1,95.95,0 +0,1,1,0,69,1,0,105.4,0 +1,0,0,0,2,1,0,20.25,0 +1,0,1,1,61,1,1,106.0,1 +1,0,0,0,41,1,1,104.7,1 +0,0,0,0,44,0,1,49.05,0 +1,0,0,0,39,0,0,35.55,0 +1,0,1,1,72,0,1,65.1,0 +0,1,0,0,13,1,1,96.85,0 +0,0,1,1,51,1,1,69.75,0 +0,1,1,0,71,1,1,99.2,0 +1,1,0,0,22,1,1,96.7,1 +0,0,0,0,2,1,1,55.05,1 +0,0,0,0,56,1,1,106.8,0 +1,0,0,0,1,1,0,51.25,0 +0,0,1,1,23,1,1,57.75,0 +0,1,1,0,66,1,1,70.85,0 +0,0,0,0,1,1,0,19.55,0 +1,1,0,0,19,1,1,88.2,1 +1,0,0,0,11,1,1,79.5,0 +0,0,1,1,8,1,1,19.75,1 +0,0,1,1,52,1,0,98.15,0 +1,0,0,0,3,1,1,20.25,0 +0,0,1,1,51,1,1,79.15,0 +1,1,0,0,15,1,0,75.65,1 +1,1,1,0,64,1,1,94.25,0 +0,0,0,0,37,0,1,40.2,0 +1,0,0,0,13,1,0,19.95,0 +1,0,1,0,49,1,1,55.35,0 +0,1,0,0,45,1,1,102.15,0 +0,0,0,0,18,1,1,71.1,0 +1,1,0,0,1,1,1,74.7,1 +1,0,1,0,68,0,1,54.1,0 +1,0,0,0,54,1,0,19.65,0 +0,1,1,1,23,1,1,88.45,0 +1,0,0,0,17,1,1,76.65,1 +1,0,1,0,71,1,0,80.4,0 +0,0,1,1,67,1,1,19.25,0 +0,0,1,1,14,1,1,84.8,0 +0,1,0,0,1,0,1,25.8,1 +0,0,0,1,63,1,0,19.5,0 +0,0,0,0,41,1,1,68.6,0 +0,0,1,0,17,1,0,92.6,0 +1,0,1,0,56,1,1,100.55,0 +0,0,0,0,5,1,0,20.55,0 +0,0,0,0,2,0,1,42.6,1 +0,0,1,0,3,1,1,19.6,0 +1,0,0,0,37,1,0,67.45,0 +0,0,0,0,29,1,1,68.85,1 +1,0,0,0,8,1,0,43.55,0 +0,0,0,0,63,1,1,109.85,0 +0,0,1,1,7,1,0,20.65,0 +0,0,0,0,3,1,0,95.4,0 +1,0,1,1,72,1,0,21.0,0 +0,0,0,0,19,1,1,56.2,0 +0,0,1,0,59,1,0,18.4,0 +1,0,1,1,2,1,0,90.0,1 +0,0,1,1,35,1,1,25.75,0 +1,0,0,0,14,1,0,19.6,0 +0,0,0,0,14,1,0,75.35,1 +0,0,1,1,69,1,0,19.8,0 +1,1,1,0,7,1,0,64.2,0 +1,0,1,1,69,1,1,75.75,0 +0,0,1,1,72,1,1,78.95,0 +1,0,0,0,8,1,0,100.85,1 +0,0,1,1,4,1,0,50.3,0 +1,0,1,1,63,1,1,80.3,0 +1,0,0,0,72,1,0,19.85,0 +0,0,0,0,46,1,1,21.1,0 +0,0,1,0,5,1,0,69.95,1 +1,0,1,0,30,1,1,50.0,0 +1,0,0,0,63,1,1,104.75,0 +0,0,0,0,60,1,0,19.85,0 +0,0,1,0,63,1,1,107.5,1 +1,0,1,1,25,1,0,85.9,0 +1,0,0,0,1,1,1,45.85,1 +1,1,1,0,6,1,1,80.8,0 +1,0,0,0,22,1,0,25.25,0 +0,0,1,1,31,1,0,80.55,0 +0,0,1,1,39,1,1,81.5,0 +1,0,0,0,26,1,0,20.9,0 +0,0,1,0,53,1,1,106.1,1 +0,0,0,0,1,1,0,91.7,1 +1,0,0,0,12,1,1,67.25,0 +0,0,0,0,16,1,1,95.6,1 +0,0,0,0,2,1,0,20.35,0 +1,0,0,1,39,0,0,45.05,0 +1,0,0,0,1,1,1,74.95,1 +0,0,1,1,7,0,0,34.65,0 +1,1,0,0,4,1,0,69.35,0 +1,1,0,0,10,1,1,95.35,1 +0,0,0,0,55,1,1,81.55,0 +1,0,1,1,72,1,1,75.4,0 +0,0,1,0,10,1,1,67.8,0 +1,1,0,0,11,1,1,111.4,0 +0,0,1,1,15,1,0,46.3,0 +0,0,1,1,23,1,0,20.4,0 +1,0,0,1,1,1,0,20.05,0 +0,1,0,0,3,1,0,45.0,1 +1,0,1,1,47,1,1,96.1,0 +0,0,0,1,15,1,0,19.65,0 +1,0,0,0,66,1,0,99.5,1 +0,1,1,0,68,1,1,60.65,0 +0,0,1,1,17,1,0,98.6,1 +0,0,0,0,7,1,1,59.5,1 +1,1,1,0,12,1,1,80.45,1 +0,1,1,0,21,1,0,71.7,0 +1,0,0,0,21,0,1,36.0,0 +0,0,1,1,56,1,0,65.2,0 +0,0,1,1,6,1,1,48.95,0 +0,1,0,0,65,0,1,53.5,0 +1,0,1,0,42,1,0,80.45,0 +0,0,1,1,68,1,1,109.05,0 +1,0,1,1,48,1,0,26.3,0 +0,1,0,0,50,1,1,106.8,0 +0,1,0,0,7,1,1,64.95,0 +0,0,1,1,63,1,0,19.35,0 +1,0,0,0,17,1,0,21.1,0 +0,0,1,1,42,1,1,77.95,1 +1,0,1,1,4,1,0,18.85,0 +0,0,0,1,62,1,0,26.0,0 +1,1,0,0,2,1,1,74.7,1 +0,0,1,0,2,1,1,70.35,0 +1,0,1,0,48,1,1,96.9,0 +1,0,1,0,27,1,0,19.55,0 +0,0,1,1,70,1,1,80.4,0 +1,1,0,0,1,1,1,88.8,1 +1,0,1,0,46,1,1,94.65,0 +1,0,0,0,30,1,1,90.25,1 +0,0,0,0,15,1,1,64.65,1 +1,0,1,1,69,1,0,95.75,0 +1,0,0,0,65,1,1,19.55,0 +1,1,1,1,72,1,1,104.1,0 +1,1,1,0,13,1,1,89.05,1 +1,0,0,0,17,1,1,20.1,0 +1,0,1,0,51,1,1,111.55,0 +1,0,1,1,51,1,0,60.5,0 +0,0,1,0,72,1,1,90.95,0 +1,0,1,1,67,1,0,87.4,1 +1,0,0,0,34,1,0,19.7,0 +1,0,1,0,67,0,1,50.95,0 +0,0,1,0,49,1,1,20.05,0 +1,0,1,1,53,1,1,19.4,0 +1,0,0,0,27,1,0,59.45,0 +0,1,0,0,23,1,1,94.75,1 +1,0,0,0,69,1,1,81.5,0 +0,0,1,1,2,0,0,29.05,0 +0,0,0,0,35,1,1,86.45,1 +0,0,1,0,46,1,0,70.6,0 +0,0,0,0,54,1,1,97.2,0 +0,0,1,0,56,1,1,98.25,1 +0,0,1,0,9,1,1,75.75,1 +1,0,0,0,20,1,0,59.2,0 +1,0,0,0,11,1,1,75.9,0 +0,1,1,0,30,1,1,90.05,0 +1,0,1,0,68,1,0,70.95,0 +1,1,1,0,38,1,1,102.6,0 +0,1,1,0,17,1,1,85.35,1 +1,0,0,0,48,1,1,106.1,1 +0,0,0,0,1,1,0,43.8,0 +1,0,1,1,63,0,0,59.0,0 +0,0,0,0,3,1,1,69.95,0 +0,0,0,0,48,1,0,24.35,0 +1,0,0,0,66,0,0,29.45,0 +0,0,1,1,68,1,1,84.4,0 +1,1,0,0,17,1,1,45.05,1 +0,0,1,1,7,1,0,20.65,0 +1,0,1,0,72,1,1,87.1,0 +0,0,1,0,29,1,0,19.85,0 +1,0,1,0,37,1,1,90.35,0 +0,0,0,0,34,1,1,109.8,1 +0,1,0,0,42,1,1,84.65,1 +0,0,1,1,59,1,0,65.5,0 +1,0,1,1,11,1,1,79.5,1 +1,1,1,1,60,1,1,80.95,0 +0,0,0,0,27,1,1,56.15,0 +0,0,0,0,1,1,0,85.8,1 +1,1,0,0,1,1,1,79.1,1 +1,0,1,0,17,0,0,34.4,0 +1,0,1,0,58,1,0,20.75,0 +1,0,1,1,1,1,0,18.8,0 +0,0,1,1,3,1,0,44.3,1 +0,0,0,0,53,1,0,90.8,0 +1,0,0,0,35,1,1,25.6,0 +1,0,1,1,50,1,0,105.95,1 +1,0,1,1,68,1,0,70.8,0 +1,0,1,0,47,1,0,25.4,0 +0,1,1,0,65,1,1,108.8,0 +1,0,0,0,5,1,1,69.75,1 +1,0,1,0,51,1,1,94.65,1 +0,0,0,0,46,1,0,96.05,1 +0,0,0,0,9,1,1,76.85,0 +0,0,0,0,8,1,0,20.25,0 +1,0,0,0,14,1,1,24.8,0 +0,0,0,0,45,1,1,115.65,0 +0,0,0,0,8,1,1,74.6,0 +1,1,0,1,1,1,1,50.15,1 +1,0,1,1,66,1,1,103.15,0 +1,0,1,1,72,1,0,72.1,0 +0,0,1,0,41,1,1,113.6,1 +0,0,1,1,23,1,0,25.1,0 +0,0,0,0,29,1,1,78.9,1 +0,0,0,0,4,1,1,80.15,0 +1,0,1,1,6,1,0,25.4,0 +0,1,1,0,67,1,1,105.4,0 +1,1,0,1,7,1,1,45.75,0 +1,0,1,1,56,1,1,24.45,0 +0,0,1,0,72,1,0,25.0,0 +1,0,1,0,72,1,1,85.25,0 +1,0,1,1,23,1,0,19.6,0 +0,0,0,1,35,1,0,50.15,0 +1,1,1,0,27,1,1,70.55,0 +0,0,1,1,26,1,1,60.05,1 +1,0,1,1,12,1,0,26.4,0 +0,0,0,0,40,1,0,20.15,0 +1,0,1,1,7,0,0,58.85,0 +1,0,1,1,70,1,1,97.55,0 +1,0,1,1,60,1,0,19.65,0 +1,0,1,1,39,0,1,25.25,0 +1,0,1,0,72,1,0,114.45,0 +0,0,0,0,1,0,1,34.7,1 +1,0,1,1,54,1,1,70.7,0 +1,0,0,0,3,1,1,85.3,1 +0,0,1,1,63,1,0,75.55,0 +1,0,1,1,71,1,1,84.8,0 +0,0,0,0,42,1,1,20.65,0 +1,0,0,0,47,1,0,20.45,0 +0,0,1,1,66,1,1,102.45,1 +0,0,1,0,21,1,1,104.4,1 +1,0,0,0,11,0,1,35.65,0 +1,0,0,1,1,1,1,99.75,1 +0,1,1,0,55,1,0,90.45,0 +1,0,0,0,69,1,1,97.65,0 +0,1,0,0,3,1,0,73.85,0 +1,0,0,0,4,1,1,74.4,1 +1,1,0,0,30,1,1,69.1,0 +0,0,0,0,5,1,1,82.75,0 +0,0,1,0,71,1,1,24.4,0 +0,0,0,0,29,1,1,55.25,0 +1,0,1,0,52,1,0,61.35,0 +1,0,0,0,68,1,0,76.75,0 +0,0,1,1,46,1,0,19.4,0 +1,0,0,0,8,1,1,54.75,0 +1,0,1,0,72,1,0,19.7,0 +0,0,0,0,17,1,0,19.9,0 +1,0,0,0,3,1,1,107.95,0 +0,1,0,0,2,1,1,83.8,0 +0,0,0,0,9,1,1,74.25,1 +0,0,0,0,51,0,1,56.4,0 +0,0,1,1,6,1,0,20.1,0 +0,0,1,0,3,1,0,94.9,0 +0,1,0,0,17,1,1,94.2,0 +1,0,1,0,30,1,0,49.9,0 +1,0,0,0,31,1,1,71.05,0 +0,0,0,0,45,1,0,81.65,0 +1,0,1,0,64,1,0,89.45,0 +1,0,0,0,1,1,1,59.85,1 +0,1,0,0,1,1,1,69.6,1 +1,1,1,1,61,1,0,99.0,0 +1,0,0,0,1,1,0,19.05,0 +1,0,0,0,9,0,1,45.4,1 +1,0,1,1,72,1,0,114.45,0 +0,0,0,0,1,1,0,19.5,1 +0,0,1,0,7,1,1,44.25,0 +0,0,1,0,66,1,1,90.55,0 +1,0,0,0,1,1,1,69.9,1 +1,0,1,1,40,1,1,20.4,0 +1,0,0,0,16,1,1,71.4,0 +0,0,0,0,2,1,1,87.15,1 +1,0,1,0,67,1,0,24.85,0 +0,0,1,0,41,1,1,104.45,0 +0,0,1,1,56,1,1,19.8,0 +0,0,0,0,72,1,1,116.45,0 +0,0,1,1,3,1,1,84.75,1 +0,0,1,0,54,1,0,20.05,0 +1,1,0,0,52,1,1,110.75,0 +0,0,0,0,50,1,1,89.7,0 +1,0,0,0,14,1,1,89.95,1 +1,0,1,0,27,1,0,48.7,0 +0,1,1,0,72,1,1,96.6,0 +1,0,0,0,62,1,1,74.3,0 +0,0,0,0,12,1,1,54.3,0 +0,1,0,0,44,1,0,74.85,0 +1,0,1,1,54,1,1,79.95,0 +0,0,0,0,68,1,0,20.05,0 +1,0,0,0,20,1,0,19.4,0 +1,0,1,1,50,1,0,54.9,0 +1,0,0,0,58,1,1,24.45,0 +1,0,1,1,35,1,1,89.65,0 +0,0,0,0,2,1,1,45.4,0 +1,0,1,1,63,1,0,75.7,0 +0,0,1,0,58,1,1,110.65,0 +0,0,1,1,27,1,1,20.55,0 +0,0,1,0,71,1,1,115.15,0 +0,0,0,0,63,1,0,58.55,0 +1,0,1,0,71,1,1,93.25,0 +0,1,0,0,41,1,1,113.2,1 +1,1,0,0,13,1,1,90.5,1 +1,0,0,0,2,1,0,79.0,1 +0,0,1,1,68,1,1,19.35,0 +1,0,1,1,1,1,1,48.75,0 +1,1,0,0,65,1,1,109.05,0 +1,1,1,0,72,1,1,25.0,0 +0,0,0,0,28,1,1,54.9,0 +1,0,1,1,72,1,0,24.75,0 +0,0,0,0,2,1,1,91.15,0 +0,0,0,1,18,1,0,20.15,1 +1,1,1,0,60,1,1,104.35,0 +0,1,0,0,26,1,1,66.05,0 +1,0,0,1,1,1,1,71.65,1 +0,0,0,0,4,1,0,20.35,1 +1,0,1,1,68,1,1,92.2,0 +0,0,0,0,38,1,1,84.25,1 +0,1,1,0,42,1,1,105.2,0 +0,0,1,0,57,1,1,19.6,0 +1,0,1,0,54,0,0,30.4,0 +0,0,0,0,12,1,0,78.1,1 +0,0,1,0,44,1,1,61.5,0 +1,0,1,1,42,1,1,69.4,0 +1,0,1,1,72,1,0,24.75,0 +0,0,1,1,71,1,0,91.05,0 +0,0,1,0,19,1,0,89.65,1 +0,0,1,0,23,1,1,73.65,0 +0,0,0,0,30,1,0,19.4,0 +1,0,0,0,35,1,0,26.2,0 +0,0,0,0,10,1,1,98.7,1 +1,0,0,0,1,1,1,43.85,0 +1,0,0,0,22,1,1,69.7,0 +1,0,1,1,7,0,0,38.55,0 +0,0,0,0,36,0,1,53.1,0 +0,0,1,1,34,1,0,20.65,0 +1,0,1,1,72,1,0,64.45,0 +1,0,1,1,36,1,0,25.1,0 +0,0,0,0,1,1,0,76.35,1 +0,0,0,0,23,1,1,79.15,1 +1,1,1,0,32,1,1,85.0,1 +0,0,1,1,71,1,1,95.15,0 +0,1,0,0,23,1,1,79.35,0 +1,0,1,0,17,1,1,96.65,0 +1,0,0,0,1,1,1,75.5,0 +1,0,1,1,12,1,0,19.7,0 +0,0,1,0,72,1,0,20.5,0 +1,0,0,0,1,1,0,19.2,0 +1,1,1,0,72,1,0,98.35,0 +1,0,1,1,60,1,0,74.35,0 +0,0,1,1,61,0,0,51.35,0 +0,0,1,0,6,1,0,45.65,0 +1,1,1,0,32,1,0,85.3,1 +0,0,0,1,31,1,1,86.55,1 +1,0,0,0,19,1,1,73.85,1 +1,0,1,1,72,1,0,20.3,0 +0,0,0,0,32,1,1,54.2,0 +1,0,1,0,65,1,1,90.65,0 +0,0,1,1,45,0,1,50.9,0 +1,0,0,0,42,1,0,25.05,0 +1,0,0,0,8,1,1,74.85,0 +1,0,0,1,32,1,0,20.5,0 +0,1,1,0,22,1,1,63.55,0 +1,1,1,0,57,0,1,44.85,1 +1,0,0,0,1,1,0,47.95,0 +1,1,0,0,1,1,0,45.1,1 +0,0,1,0,1,1,1,45.0,0 +1,0,0,0,24,1,1,96.0,1 +1,0,0,0,1,1,0,20.05,1 +1,1,0,0,54,1,1,90.05,0 +0,0,0,0,4,1,1,25.3,0 +1,0,1,1,65,1,0,108.65,1 +0,0,1,0,56,1,0,24.3,0 +1,0,0,0,45,1,1,75.95,0 +0,0,1,1,71,1,0,19.7,0 +1,0,1,0,59,1,0,66.4,0 +1,0,0,0,69,0,1,35.75,0 +1,0,0,0,19,1,0,18.8,0 +0,0,1,1,55,1,0,19.4,0 +0,0,0,0,38,1,0,19.3,0 +1,0,0,0,10,1,1,45.55,1 +0,1,1,0,47,1,1,67.45,0 +0,0,1,0,2,0,1,35.1,1 +1,0,0,0,1,1,0,46.2,1 +0,0,0,0,1,1,0,45.15,1 +1,1,0,0,1,0,1,43.3,1 +1,0,1,1,46,1,1,20.1,0 +0,1,0,0,38,1,1,57.15,1 +0,0,1,0,65,1,0,58.9,0 +0,0,1,0,19,1,1,73.2,1 +1,0,0,0,52,1,1,85.35,1 +1,0,1,1,71,1,0,19.45,0 +0,0,0,0,1,1,0,45.95,1 +0,1,0,0,52,0,1,50.5,0 +1,0,1,0,6,1,0,25.1,0 +0,1,1,0,26,1,0,60.7,0 +1,1,0,0,48,1,1,99.0,0 +0,0,1,1,64,1,1,104.4,0 +0,0,0,0,3,1,0,83.75,1 +1,0,0,0,1,1,1,44.05,0 +1,0,1,1,72,1,0,24.1,0 +1,0,0,0,1,1,1,45.55,0 +0,0,1,1,51,1,1,93.8,0 +0,0,1,1,41,1,0,19.7,0 +0,0,1,1,72,1,1,70.65,0 +0,0,1,0,43,1,0,86.45,0 +1,0,1,0,72,1,1,114.1,0 +1,0,1,0,47,1,1,95.2,0 +1,0,0,0,72,1,0,88.55,0 +1,0,0,0,3,1,1,20.75,0 +1,0,0,0,1,1,1,70.05,1 +1,0,0,0,2,1,1,86.0,1 +1,0,0,0,26,0,1,44.65,0 +1,0,1,1,29,1,1,60.2,0 +0,1,1,0,35,1,1,100.5,1 +1,0,0,0,27,1,0,55.45,0 +1,0,1,1,24,1,1,70.3,0 +1,0,1,1,67,1,1,60.4,0 +0,0,0,0,16,1,0,72.65,1 +0,0,0,0,23,1,0,55.8,0 +1,0,0,0,14,0,1,31.1,0 +0,0,1,1,1,1,1,21.0,1 +0,1,0,0,1,1,0,45.1,1 +1,1,0,0,4,0,1,50.95,0 +1,0,0,1,16,1,1,69.1,0 +0,0,1,0,46,0,1,43.95,0 +1,0,0,1,68,1,1,86.5,0 +1,0,0,0,38,1,0,69.95,0 +1,1,1,0,30,1,1,50.4,1 +0,1,0,0,5,1,0,78.95,1 +1,0,0,0,17,1,1,90.95,0 +1,0,1,1,4,1,0,19.9,0 +0,0,0,0,12,1,0,20.15,0 +1,0,1,1,72,1,1,90.6,0 +1,0,0,0,3,1,1,92.0,0 +1,0,0,0,56,1,1,94.45,1 +0,0,0,0,41,1,1,24.85,0 +1,0,0,0,40,0,0,36.0,0 +0,0,0,0,7,1,1,78.5,0 +1,0,0,0,69,1,0,19.95,0 +1,0,1,1,7,1,0,20.65,0 +0,0,1,1,5,0,1,30.5,0 +0,0,1,1,72,1,0,106.1,0 +1,0,1,1,44,1,1,20.5,0 +0,0,0,0,65,1,1,95.5,0 +0,0,0,0,3,1,0,64.6,0 +1,0,0,0,24,1,1,51.1,0 +0,0,0,0,44,1,1,84.8,1 +0,1,1,0,72,1,0,89.1,0 +1,0,0,0,24,1,0,54.95,0 +1,0,0,0,1,1,0,50.9,1 +1,0,1,0,22,1,1,20.45,0 +1,0,1,1,70,1,1,85.95,0 +1,0,1,1,25,1,0,60.35,0 +1,0,1,1,37,1,0,19.8,0 +0,1,1,1,22,1,0,85.35,0 +0,0,1,1,59,1,1,72.1,0 +1,0,1,1,49,1,1,99.8,1 +1,0,1,1,47,1,1,107.35,1 +0,0,1,1,31,1,1,19.55,1 +1,0,1,1,1,1,1,81.05,0 +1,0,0,0,3,1,1,20.5,0 +0,0,1,0,53,1,1,111.8,0 +1,0,0,0,1,1,0,20.2,0 +1,0,0,0,20,1,1,19.7,0 +0,0,0,0,3,1,1,79.1,1 +0,0,0,0,51,1,1,19.85,0 +0,0,1,0,51,1,1,60.5,0 +0,0,1,1,13,1,0,19.55,0 +0,0,0,0,1,1,0,20.9,0 +1,0,0,1,1,1,1,21.05,0 +1,0,0,0,63,1,0,71.5,0 +1,0,0,0,3,1,0,54.65,0 +1,0,0,0,46,1,0,19.2,0 +1,0,0,0,1,1,1,49.8,0 +1,0,0,1,8,0,0,25.5,1 +0,0,1,1,71,1,0,20.5,0 +1,0,1,1,55,1,1,90.4,0 +0,0,0,0,70,1,1,90.25,0 +0,0,0,0,2,1,0,80.75,1 +1,0,1,1,67,1,0,104.6,0 +1,0,1,0,65,1,1,91.85,1 +1,0,1,0,14,1,0,50.2,0 +0,0,1,1,20,1,1,95.5,0 +1,0,0,1,1,1,1,75.35,1 +1,0,0,0,1,1,1,75.45,1 +0,0,1,1,49,1,1,95.4,0 +0,0,0,0,72,1,1,101.3,0 +0,0,1,0,46,1,0,53.1,0 +1,0,0,0,24,1,1,84.85,0 +0,0,1,1,5,0,0,34.25,0 +0,0,1,1,33,1,0,88.6,0 +0,0,0,0,42,1,1,60.15,0 +1,0,0,0,23,1,1,99.95,0 +1,0,0,0,8,1,0,70.7,0 +1,0,0,0,66,1,1,54.8,0 +1,0,0,0,24,1,1,49.55,1 +1,1,0,0,24,1,0,54.8,0 +1,0,0,0,69,1,1,78.6,1 +0,0,0,0,53,1,1,100.3,0 +0,0,0,0,60,0,0,53.6,0 +0,0,1,0,7,1,1,81.1,1 +0,0,0,0,20,1,1,19.35,0 +0,0,1,1,23,1,0,85.6,0 +1,0,1,1,72,1,1,80.8,0 +1,0,1,0,11,1,1,74.95,1 +1,0,0,0,21,1,0,19.6,0 +1,1,0,0,1,1,1,93.55,1 +1,1,0,0,31,1,1,90.7,0 +0,0,0,0,57,1,0,69.75,0 +0,0,1,1,45,1,1,20.0,0 +1,0,0,0,10,1,1,95.25,0 +0,0,1,0,58,1,1,102.1,1 +1,0,0,1,14,1,0,19.95,0 +1,0,1,0,27,1,0,80.85,0 +0,0,1,1,14,1,1,90.9,1 +0,0,1,1,12,0,0,29.2,1 +0,0,1,1,69,1,1,93.3,0 +0,0,1,1,25,1,1,89.15,1 +1,1,1,0,58,1,1,108.85,1 +0,0,1,1,35,0,1,46.35,0 +0,1,0,0,16,1,1,84.75,1 +1,0,1,1,45,1,0,78.75,0 +0,0,0,0,17,1,1,83.55,0 +0,0,1,1,1,1,1,45.7,1 +1,0,0,0,22,1,0,19.6,0 +0,1,0,0,1,1,1,69.95,1 +1,0,1,1,67,1,0,67.85,0 +0,0,1,1,67,1,1,105.65,0 +0,0,1,0,2,0,0,44.6,1 +1,0,0,0,23,1,1,74.95,1 +0,1,0,0,9,1,0,75.5,0 +0,0,0,0,5,1,0,20.15,0 +1,0,0,0,54,0,0,45.2,0 +0,0,0,0,57,1,1,95.25,1 +1,0,0,0,24,1,1,89.85,1 +0,0,1,1,49,1,0,100.45,1 +1,0,0,0,5,1,0,47.15,1 +1,0,0,0,2,1,1,80.2,1 +0,0,0,1,4,1,1,87.1,1 +1,0,1,1,70,1,1,79.25,0 +1,0,0,0,5,1,1,75.9,1 +1,0,1,1,53,1,0,85.7,0 +0,0,1,0,47,1,1,98.75,1 +0,0,0,1,31,1,0,20.1,0 +1,0,1,1,13,1,0,61.8,0 +0,0,1,1,28,1,0,49.9,0 +0,0,0,0,10,1,0,86.45,1 +1,0,1,0,38,1,0,20.4,0 +0,0,0,0,1,1,1,45.3,1 +1,0,1,0,67,1,0,104.1,1 +1,0,1,0,52,1,1,75.4,0 +1,0,1,1,62,1,0,108.15,0 +0,0,0,0,16,1,1,86.25,0 +0,1,1,0,5,1,1,81.0,1 +1,0,0,0,12,1,0,95.7,0 +0,0,1,1,72,1,1,116.85,0 +1,1,0,0,71,1,0,105.75,0 +0,0,1,0,24,1,0,20.15,0 +0,0,0,0,15,1,0,19.6,0 +1,0,1,0,67,1,1,90.6,1 +1,0,0,1,2,1,0,60.95,0 +0,0,1,1,5,0,0,25.05,0 +0,0,1,0,15,1,0,88.15,1 +1,0,0,0,1,1,1,20.2,1 +1,0,1,1,41,1,1,60.3,0 +0,0,0,1,43,1,1,63.95,0 +1,1,1,0,1,1,0,74.3,0 +0,1,0,0,1,1,1,70.6,0 +0,0,1,1,26,1,1,90.8,1 +1,0,0,0,22,1,1,79.35,1 +1,0,1,0,71,1,0,90.55,0 +1,0,0,0,7,1,0,19.45,0 +0,1,0,0,28,1,0,64.45,0 +1,1,0,0,16,1,0,69.65,0 +1,0,0,0,7,1,0,19.5,0 +0,0,0,0,69,1,1,110.5,0 +0,0,0,1,1,0,0,24.7,0 +1,0,0,0,3,1,1,77.4,0 +1,1,0,0,21,1,1,96.8,1 +0,0,1,0,69,1,1,85.4,0 +0,0,1,0,71,0,1,47.6,0 +0,0,1,1,69,1,0,19.4,0 +0,0,0,0,48,1,1,103.85,0 +1,0,1,0,47,1,1,83.35,1 +0,0,0,0,2,1,1,49.4,1 +1,0,0,0,45,1,1,108.45,0 +1,0,0,0,51,1,0,81.0,0 +0,0,1,0,22,1,1,79.2,1 +1,0,0,0,72,1,0,86.65,0 +1,0,1,1,37,1,1,92.95,0 +1,0,1,1,71,1,0,90.35,0 +1,0,1,1,7,1,0,48.7,1 +0,0,0,0,66,1,1,25.15,0 +1,0,1,1,51,1,1,76.4,0 +0,0,1,1,30,1,0,19.55,0 +0,0,0,0,34,1,0,85.35,0 +1,0,1,1,64,1,1,24.8,0 +1,1,1,0,65,1,1,103.15,0 +1,0,0,0,47,1,0,100.75,0 +0,0,0,0,1,1,1,95.6,1 +0,0,0,0,49,1,1,59.75,1 +0,0,1,1,67,1,0,94.1,0 +1,0,0,1,39,1,0,19.35,0 +1,0,0,0,14,1,0,19.9,0 +0,1,0,0,43,1,1,108.15,1 +1,1,0,0,56,1,1,101.05,0 +0,0,0,0,14,1,0,59.1,0 +0,0,0,0,1,1,0,71.35,1 +1,0,1,1,16,1,1,55.85,0 +1,0,1,1,70,1,1,106.05,0 +1,1,1,0,72,1,1,84.1,0 +0,0,1,1,23,1,1,75.3,0 +1,0,0,1,21,1,0,24.7,0 +0,0,0,0,1,1,1,20.15,1 +1,0,0,1,1,1,0,69.75,1 +0,1,1,0,32,1,1,93.2,1 +1,0,1,1,17,1,0,80.85,1 +0,0,0,0,4,0,1,33.65,1 +0,0,0,0,36,1,0,55.8,0 +0,0,0,0,50,0,0,39.7,0 +0,0,1,1,48,0,1,29.5,0 +0,0,0,1,50,1,0,20.15,0 +1,0,1,0,72,1,0,79.55,0 +1,0,0,1,10,1,0,24.8,0 +0,0,0,0,18,1,0,19.65,0 +1,0,0,0,1,1,1,79.95,1 +0,0,0,0,1,1,0,19.3,1 +1,0,0,0,9,1,1,94.05,0 +1,0,0,0,2,1,0,90.75,0 +0,0,1,0,40,1,1,78.85,0 +1,0,1,0,69,1,0,99.5,0 +0,0,1,0,37,1,1,99.2,1 +1,0,0,1,18,1,1,80.55,0 +1,1,1,0,11,1,1,70.2,0 +0,0,1,0,8,1,1,85.2,1 +0,0,0,0,3,1,0,75.25,1 +1,0,1,1,55,1,0,59.45,0 +1,0,1,0,33,1,1,93.35,0 +0,0,0,0,46,1,0,44.95,0 +1,0,0,0,34,1,0,26.1,0 +0,0,0,0,3,1,0,20.2,0 +1,0,1,1,30,1,0,21.25,0 +0,0,0,0,33,1,0,59.4,0 +1,0,1,1,45,1,1,95.0,0 +1,0,0,0,40,1,1,61.9,0 +0,0,0,0,71,1,1,118.65,0 +1,0,0,0,1,1,0,54.35,1 +0,0,1,1,72,0,0,64.45,0 +0,0,1,1,22,1,1,80.15,0 +1,0,1,1,46,1,1,20.2,0 +0,0,1,1,55,1,0,21.0,0 +1,0,0,0,1,1,0,20.45,0 +0,0,0,0,12,1,1,75.85,0 +1,0,0,0,31,1,1,80.45,0 +1,0,1,0,5,0,1,24.95,1 +0,0,1,1,67,1,1,75.5,0 +1,0,0,0,1,1,0,44.45,0 +1,0,1,0,40,0,1,42.35,1 +1,0,1,1,41,1,1,74.55,0 +1,0,0,0,1,1,1,75.3,1 +1,0,0,0,51,1,1,94.8,1 +1,0,1,1,42,0,0,48.15,0 +1,0,1,1,23,1,0,19.65,0 +0,1,0,0,1,1,1,70.55,1 +0,0,0,0,1,1,0,20.15,0 +0,0,0,0,56,1,1,106.6,0 +1,0,0,1,15,1,1,91.0,0 +1,0,1,1,12,1,1,25.4,0 +0,0,1,1,54,1,0,69.95,0 +0,0,0,0,7,1,1,66.85,0 +0,0,1,1,33,1,0,86.15,1 +1,0,1,1,16,1,0,20.15,0 +0,0,0,1,21,1,0,64.85,0 +1,1,1,0,30,1,0,74.85,0 +1,0,0,0,3,1,1,50.5,0 +1,0,0,0,11,1,0,72.9,0 +0,0,0,0,62,1,1,115.05,0 +1,0,0,0,18,1,0,19.0,0 +1,0,0,1,6,1,0,19.55,0 +0,0,0,0,46,1,1,101.1,0 +1,0,0,0,21,1,1,84.1,0 +1,0,0,0,68,1,1,24.15,0 +0,0,0,0,1,1,1,50.1,0 +0,0,1,0,25,1,1,74.6,0 +0,0,0,1,24,1,0,19.75,0 +0,0,1,0,30,1,1,85.0,1 +0,0,0,0,2,1,0,80.55,1 +1,0,1,0,51,1,1,106.8,0 +0,0,1,1,57,1,1,84.5,0 +0,0,0,0,15,1,0,25.05,0 +0,0,1,1,72,1,1,83.7,0 +0,0,0,0,2,1,1,75.8,1 +1,0,1,0,28,1,0,96.6,0 +1,1,1,0,29,1,1,98.5,1 +1,0,1,1,70,1,1,101.1,0 +0,0,0,0,13,1,0,20.2,0 +0,1,1,0,59,1,1,94.05,0 +1,1,1,0,13,1,1,95.25,1 +1,1,1,0,7,1,1,74.4,1 +0,0,1,0,62,1,0,81.0,0 +0,0,0,0,21,1,1,60.25,0 +0,0,0,0,2,1,0,60.85,0 +0,0,0,0,1,1,0,43.95,0 +1,0,0,0,4,1,0,86.05,0 +0,0,0,0,19,1,0,20.25,0 +0,0,0,0,30,1,0,85.15,1 +1,0,1,1,67,1,1,19.4,0 +1,1,1,0,72,1,1,102.65,0 +1,0,1,0,53,1,0,19.9,0 +0,0,0,0,5,1,0,19.55,0 +1,1,1,0,71,1,1,95.5,0 +0,0,1,1,50,1,1,84.15,0 +1,0,1,1,56,1,1,103.2,0 +1,0,0,0,2,1,1,50.2,0 +0,1,0,0,2,1,1,88.55,1 +1,0,1,1,24,1,0,54.75,1 +1,0,1,1,46,1,0,19.95,0 +1,0,1,0,71,1,1,116.25,0 +0,0,0,0,29,0,1,31.2,0 +1,0,1,1,69,1,0,24.45,0 +1,0,1,0,71,1,0,84.2,0 +0,1,0,0,1,1,1,91.3,1 +1,1,1,0,56,1,1,85.65,0 +1,0,0,1,56,1,1,21.2,0 +1,0,0,0,1,1,1,79.5,1 +0,0,1,0,28,1,0,25.55,0 +0,0,1,1,19,1,0,20.2,0 +1,0,1,0,66,1,0,63.85,0 +0,0,1,1,17,1,1,61.95,0 +1,0,1,1,52,1,0,25.75,0 +0,0,0,0,19,1,0,58.2,0 +0,0,0,0,36,1,0,85.85,0 +1,1,1,0,7,1,1,70.1,1 +1,0,1,1,72,1,1,104.9,0 +1,0,1,1,67,1,1,111.3,1 +1,1,0,0,34,1,1,99.85,0 +1,1,1,0,57,1,1,95.25,1 +0,0,1,0,7,1,1,86.25,1 +0,1,1,0,1,1,1,100.8,1 +1,0,1,0,8,1,1,19.55,0 +0,0,0,0,69,1,0,104.0,0 +0,0,1,0,50,1,1,104.4,0 +1,0,0,0,10,1,0,19.5,0 +0,0,1,1,12,1,0,25.25,0 +0,0,0,0,14,1,1,86.3,1 +0,0,1,0,70,0,1,49.85,0 +0,1,0,0,64,1,1,108.95,0 +0,0,1,1,66,1,0,89.9,0 +0,0,1,1,71,1,1,82.0,0 +1,1,0,0,20,1,0,89.95,0 +1,0,1,0,72,1,1,79.35,0 +0,0,1,1,71,1,0,64.05,0 +1,0,1,1,38,1,1,101.15,0 +0,0,0,0,28,1,1,89.95,1 +1,1,1,0,17,1,1,76.45,1 +1,0,0,0,33,0,1,39.1,0 +0,0,1,1,23,0,0,34.6,0 +1,0,1,1,58,1,1,19.55,0 +0,1,1,0,70,1,1,104.45,0 +1,0,1,0,4,1,0,70.5,0 +1,0,1,1,45,1,0,20.35,0 +1,0,0,0,10,1,1,70.0,1 +1,0,1,1,36,1,0,19.45,0 +1,0,0,0,54,1,1,69.9,0 +1,0,1,1,23,1,0,59.7,0 +0,0,1,1,41,1,1,78.35,0 +1,1,0,0,5,1,1,71.45,0 +1,0,1,1,27,0,1,45.85,0 +0,0,0,0,1,1,1,95.85,0 +0,0,1,1,67,0,0,35.7,0 +0,1,1,1,72,1,1,89.55,0 +0,0,1,1,56,1,1,24.95,0 +1,0,1,1,44,1,0,24.85,0 +0,1,1,0,66,1,1,100.8,0 +0,0,0,0,34,1,1,64.4,1 +0,0,1,0,69,1,0,105.35,0 +0,0,1,1,1,1,1,102.45,1 +0,0,0,0,40,1,0,19.65,0 +1,0,1,1,30,1,1,54.45,0 +0,0,0,0,11,1,0,70.5,0 +0,0,0,0,15,1,0,20.1,0 +1,0,0,0,11,1,1,69.35,0 +0,0,1,1,64,1,0,19.8,0 +1,1,1,0,72,1,0,74.4,0 +1,1,1,0,72,1,1,93.05,0 +0,0,0,1,1,1,0,51.2,0 +0,0,0,1,15,1,0,65.6,0 +0,0,0,0,60,1,0,80.55,0 +1,0,0,0,56,1,0,52.7,0 +0,0,0,0,8,1,0,20.85,0 +0,0,0,0,3,1,0,80.1,1 +0,0,1,0,49,1,1,52.15,0 +0,0,0,0,2,1,1,80.2,1 +0,0,0,0,6,1,1,98.15,1 +1,0,0,0,70,1,1,114.95,0 +1,0,0,0,12,1,1,112.95,1 +1,1,1,0,52,1,1,104.45,0 +0,0,1,0,72,1,1,113.65,0 +0,0,0,0,40,1,1,20.6,0 +0,0,0,0,1,1,0,70.9,1 +0,1,0,0,3,1,1,86.85,1 +0,1,0,0,40,1,1,91.55,0 +1,0,0,1,1,1,1,49.85,0 +1,0,1,0,30,1,0,19.8,0 +1,0,1,1,23,1,1,99.85,1 +1,0,1,1,1,1,1,74.5,1 +0,1,1,0,44,1,0,104.15,0 +1,0,0,0,65,1,1,109.15,1 +0,1,0,0,7,1,1,48.2,0 +1,1,0,0,72,1,1,25.1,0 +0,1,0,0,8,1,1,100.15,0 +0,0,0,0,16,1,1,65.2,1 +1,1,1,1,66,1,1,99.5,1 +1,0,0,0,1,1,1,71.55,1 +1,0,0,1,3,1,0,55.9,0 +1,0,1,0,53,1,0,93.9,1 +1,1,1,0,8,1,1,64.4,0 +1,1,1,0,69,1,1,108.4,1 +0,0,0,0,5,1,1,85.3,0 +0,0,1,1,72,1,0,107.45,0 +0,0,1,0,13,0,1,48.75,1 +0,0,0,0,4,1,1,85.65,1 +0,0,1,1,54,1,0,91.3,0 +1,0,1,0,72,1,0,85.95,0 +1,0,0,0,12,1,1,106.7,1 +1,0,0,0,1,0,1,25.15,1 +1,1,0,0,1,1,0,45.2,0 +0,0,1,0,54,1,0,110.35,1 +1,0,1,1,69,1,1,79.2,0 +0,0,0,0,48,1,0,55.5,0 +0,0,1,1,48,1,1,103.25,1 +0,0,1,0,8,1,1,90.25,0 +1,0,1,1,71,1,1,91.25,0 +1,0,0,0,2,1,1,47.8,1 +1,0,1,0,67,1,1,100.9,0 +1,0,1,1,34,1,1,97.7,0 +0,0,0,0,3,1,1,69.85,0 +0,0,1,1,9,1,1,65.6,0 +1,0,1,1,71,1,1,104.65,0 +1,0,0,0,57,1,1,90.45,0 +1,0,0,0,72,0,1,63.7,0 +0,1,1,1,48,1,1,104.5,0 +1,0,0,0,18,1,0,20.1,0 +1,0,1,1,43,1,1,104.3,0 +0,0,1,1,72,1,1,93.25,0 +1,0,1,1,35,1,1,73.45,0 +1,0,0,0,4,1,0,20.7,0 +0,0,1,1,49,1,0,25.25,0 +0,0,1,1,71,1,0,100.5,0 +1,0,1,1,11,1,0,90.6,0 +1,0,1,1,63,1,1,89.4,0 +0,1,0,0,65,1,1,95.45,0 +0,0,0,1,49,1,0,20.45,0 +0,0,0,0,29,1,1,98.6,1 +0,1,1,0,15,1,1,83.05,1 +0,0,1,1,4,1,1,19.95,0 +0,0,1,0,72,1,0,109.15,0 +0,1,1,0,26,1,1,85.7,0 +0,1,1,0,35,1,0,102.05,0 +0,0,0,0,57,1,0,94.7,0 +1,0,1,1,28,1,0,64.4,0 +0,0,1,0,25,1,1,26.8,0 +0,0,1,0,47,1,1,66.05,0 +0,0,1,1,57,1,0,65.2,0 +1,1,1,0,16,1,1,85.05,0 +1,0,0,0,5,1,1,55.8,0 +1,0,1,0,17,1,1,70.4,1 +0,1,0,0,56,1,1,104.75,1 +1,0,1,1,72,1,0,19.95,0 +0,1,0,0,21,1,1,94.25,1 +0,0,1,1,48,0,0,45.0,0 +0,0,1,0,68,1,0,114.9,0 +0,0,0,0,30,1,0,106.4,0 +0,0,1,0,3,1,1,46.1,0 +0,1,0,0,14,0,0,39.7,0 +0,0,0,1,4,1,1,20.05,0 +0,0,1,1,71,1,1,95.75,0 +1,0,1,1,8,1,0,24.4,0 +1,0,1,1,61,0,0,33.6,0 +1,0,1,1,72,1,0,90.45,0 +0,0,0,0,5,1,1,84.0,0 +0,0,0,0,49,1,0,67.4,0 +1,0,0,0,8,1,1,19.7,0 +1,0,0,0,3,1,1,80.35,0 +1,0,1,1,9,1,0,19.6,0 +1,0,1,1,67,1,1,54.2,0 +1,0,0,0,46,1,1,45.2,0 +0,0,1,0,67,1,0,75.1,0 +0,0,1,0,55,1,0,19.7,0 +1,0,1,0,33,1,1,72.75,0 +1,0,1,1,62,1,0,20.05,0 +0,0,0,1,1,1,0,45.95,1 +1,0,1,1,49,0,1,39.2,0 +1,0,0,0,1,1,1,44.75,0 +1,0,1,0,14,1,1,82.65,0 +1,1,0,0,18,1,0,93.9,0 +0,1,0,0,1,1,1,70.15,1 +0,0,0,0,1,1,1,85.55,1 +0,0,1,0,72,1,1,117.15,0 +1,0,0,0,64,1,0,99.25,0 +1,0,1,0,69,1,1,112.55,0 +0,0,0,0,1,1,1,25.7,0 +1,0,1,1,71,1,0,90.3,0 +0,0,1,1,66,1,1,49.4,0 +1,0,0,0,2,1,0,19.4,0 +0,1,1,0,71,1,1,109.7,0 +1,0,0,0,11,1,1,61.25,0 +1,0,0,1,47,1,1,55.3,0 +0,0,1,0,35,1,1,70.3,1 +1,1,1,0,32,1,0,106.35,1 +1,0,1,1,60,1,1,103.75,0 +1,0,0,0,11,1,0,19.5,0 +0,0,0,0,29,0,0,39.5,0 +1,0,1,1,21,0,1,26.05,0 +1,1,1,0,48,1,1,91.05,0 +0,0,0,1,3,0,0,29.65,0 +0,0,1,1,43,1,0,50.2,0 +1,0,0,0,5,1,0,105.3,0 +0,0,0,0,1,1,1,55.45,0 +1,0,1,1,71,1,0,85.45,0 +0,0,1,1,8,1,0,19.8,0 +1,0,0,0,8,1,1,59.25,0 +1,0,0,0,20,1,1,90.7,0 +0,0,1,1,33,1,1,103.7,1 +1,0,0,0,71,1,1,79.05,0 +0,1,1,0,31,1,1,90.7,0 +0,1,1,0,38,1,0,95.0,0 +1,0,0,0,1,1,1,88.35,1 +0,0,1,1,2,0,1,30.25,0 +0,0,1,0,12,0,1,49.85,0 +0,0,0,1,9,1,0,93.0,0 +1,1,0,1,11,1,1,54.55,0 +1,0,0,1,6,1,0,19.7,0 +0,0,1,0,71,1,1,84.8,0 +0,0,1,1,42,1,1,94.45,0 +0,0,1,1,8,1,1,94.2,1 +0,0,0,0,5,1,1,96.25,1 +0,0,1,0,2,1,1,70.7,1 +0,0,1,1,45,1,0,20.85,0 +1,0,1,1,28,0,1,60.0,0 +0,0,1,0,43,1,0,80.45,0 +1,0,0,1,60,1,1,84.95,0 +0,0,1,0,42,0,0,33.55,1 +1,0,1,1,7,0,0,49.65,0 +0,0,1,0,25,1,1,20.2,0 +0,1,1,1,40,1,1,94.55,1 +1,0,0,0,27,1,1,100.5,0 +1,0,0,0,10,0,0,35.75,0 +0,1,0,0,27,1,1,86.45,0 +0,0,0,0,11,1,0,53.8,0 +1,0,1,1,4,0,0,38.55,0 +1,0,0,0,68,0,1,39.9,0 +1,1,0,0,1,1,1,70.05,0 +0,0,0,0,18,1,0,20.1,0 +0,0,0,0,57,1,1,112.95,1 +1,0,0,0,26,1,1,20.3,0 +0,0,1,0,17,0,1,35.65,0 +1,0,0,0,1,0,0,35.9,1 +1,0,0,1,38,1,1,99.25,1 +1,1,1,0,59,1,1,82.95,0 +1,0,0,0,30,1,1,55.65,0 +1,1,0,0,2,0,1,24.45,1 +0,1,1,0,50,1,0,25.2,0 +1,0,0,0,9,0,0,50.8,0 +0,0,1,1,3,1,0,19.65,0 +0,0,0,1,14,1,1,59.8,0 +0,1,0,0,31,1,1,73.55,0 +0,0,0,0,7,1,0,61.4,0 +0,0,0,0,8,1,1,103.35,1 +1,0,1,1,17,1,0,19.9,0 +1,0,1,1,32,1,1,19.45,0 +0,1,0,0,2,1,0,81.5,0 +1,1,0,0,7,1,1,84.8,1 +0,0,1,1,72,1,0,109.55,0 +0,1,0,0,31,1,1,99.95,1 +0,0,1,1,27,1,0,74.4,0 +0,0,0,0,18,1,1,90.0,1 +1,0,0,0,7,1,1,74.9,0 +0,1,0,0,14,1,1,104.85,1 +1,0,1,1,11,1,1,59.65,0 +0,0,1,1,72,1,1,110.45,0 +1,0,1,1,28,1,0,106.1,1 +1,1,0,0,15,1,1,74.2,1 +0,1,0,0,4,1,1,74.45,0 +0,0,0,0,71,1,0,24.55,0 +0,0,0,0,5,1,1,89.35,1 +1,0,1,1,47,1,0,24.55,0 +1,1,1,0,57,1,1,90.65,0 +1,1,1,0,50,1,1,105.05,0 +1,0,0,0,8,1,1,20.45,0 +0,0,1,1,48,1,0,19.55,0 +0,0,0,0,70,1,0,19.7,0 +1,0,0,1,1,1,1,70.45,0 +1,0,1,0,8,1,1,85.65,0 +0,0,0,0,1,1,1,77.15,1 +1,0,0,0,1,0,1,35.25,1 +1,0,1,1,60,1,0,20.55,0 +1,0,1,1,49,1,1,97.95,0 +1,0,1,0,4,0,1,48.55,1 +0,0,0,0,29,1,0,20.0,0 +0,0,1,0,67,1,1,25.25,0 +0,0,1,0,53,1,1,98.4,1 +1,0,1,0,67,1,0,70.9,0 +0,0,1,1,6,1,0,19.85,0 +0,0,0,0,47,1,1,106.35,0 +0,0,0,0,53,1,0,99.5,0 +1,0,1,0,69,1,1,84.7,0 +1,0,0,0,3,1,1,86.05,0 +1,0,0,0,4,1,0,44.55,0 +1,0,1,1,56,1,1,75.85,0 +1,1,1,0,59,1,1,93.85,1 +1,1,1,0,61,1,0,25.0,0 +0,0,1,0,2,1,1,45.0,0 +1,1,1,1,46,1,1,100.7,1 +1,0,1,1,12,1,0,20.5,0 +0,0,0,0,14,1,1,80.45,1 +0,0,1,1,28,1,1,90.45,0 +1,0,0,0,24,1,0,60.45,0 +1,0,0,0,31,1,1,55.25,1 +0,0,1,1,68,1,1,78.45,0 +1,0,0,1,39,1,0,100.55,0 +0,0,1,0,42,1,0,20.35,0 +1,0,1,0,13,0,1,54.45,1 +0,0,1,0,6,1,1,90.75,0 +1,0,0,0,35,1,0,75.35,1 +0,0,1,0,38,1,1,20.25,0 +1,0,0,0,18,1,0,20.05,0 +0,0,1,0,4,1,0,19.6,0 +1,0,1,0,27,1,1,53.8,0 +1,0,0,1,41,1,0,70.2,0 +1,0,1,1,50,1,0,75.5,0 +1,0,1,1,72,1,0,20.35,0 +0,0,0,0,70,1,0,26.05,0 +1,0,1,1,44,1,0,20.6,0 +1,0,0,0,2,1,1,75.7,1 +0,0,1,1,34,1,1,20.1,0 +0,1,1,0,72,1,0,24.3,0 +1,0,1,0,71,1,1,24.5,0 +0,0,0,0,64,1,1,110.5,0 +0,0,1,0,72,1,1,25.25,0 +1,0,0,0,1,1,1,74.25,1 +1,1,1,0,29,1,0,90.1,0 +0,0,1,0,23,1,1,68.75,0 +1,0,1,1,52,1,0,19.2,0 +0,1,0,0,25,1,1,89.7,1 +0,0,0,0,64,1,1,115.1,0 +0,1,0,0,16,1,1,96.4,1 +1,1,0,0,1,1,1,69.5,1 +1,0,0,0,24,1,1,99.65,0 +1,0,1,0,2,1,1,91.45,0 +0,0,1,1,34,1,0,84.75,0 +1,1,1,0,36,1,1,85.25,1 +1,0,1,1,53,1,1,78.75,0 +0,0,1,1,47,1,0,20.25,0 +1,0,0,1,72,1,0,19.9,0 +1,0,1,1,72,1,1,97.75,0 +1,0,0,0,1,1,0,19.4,1 +0,0,0,0,9,1,1,83.3,1 +0,0,0,0,8,1,1,80.1,1 +1,1,0,0,45,1,0,62.7,1 +0,0,0,0,7,1,1,100.4,0 +0,0,1,0,71,1,1,24.45,0 +0,1,0,0,41,1,1,101.1,0 +1,0,1,1,67,0,0,50.9,0 +1,0,1,0,69,1,1,107.2,0 +0,1,1,0,70,1,1,92.2,0 +1,0,0,0,25,1,0,25.3,1 +1,0,0,0,72,1,0,113.4,0 +1,0,1,1,34,0,1,40.55,0 +0,0,1,1,65,1,0,26.0,0 +0,0,0,0,70,1,1,111.95,0 +0,0,1,1,72,0,1,53.8,0 +1,0,0,1,35,1,1,72.1,0 +1,0,0,0,13,1,0,98.15,1 +0,0,1,0,12,1,0,78.85,0 +0,0,1,1,62,1,1,70.75,0 +0,0,0,0,25,1,1,76.15,0 +0,0,0,0,52,0,0,39.1,0 +1,1,0,0,8,1,1,69.95,0 +1,0,0,0,2,1,0,20.05,0 +0,0,1,1,56,1,0,20.05,0 +0,0,0,0,12,1,0,19.45,0 +0,0,1,0,47,1,0,26.9,0 +1,1,0,0,2,1,0,19.2,0 +0,0,0,0,18,1,1,50.0,0 +0,0,0,0,8,1,1,60.0,0 +1,0,1,0,45,1,1,84.55,0 +1,0,0,0,3,1,0,45.45,0 +0,0,0,0,38,1,0,20.05,0 +1,0,1,0,72,1,1,115.55,0 +1,0,0,0,46,1,1,93.7,1 +0,0,1,1,71,1,1,99.0,0 +1,0,1,1,66,0,0,50.55,0 +1,1,0,0,25,1,0,105.95,1 +1,0,0,0,18,1,1,82.0,1 +0,0,1,1,13,1,1,25.0,0 +0,0,1,1,65,1,0,91.55,0 +1,0,1,0,60,1,1,95.75,1 +1,0,1,1,15,1,0,19.35,0 +0,0,1,0,72,1,0,24.85,0 +1,0,1,0,30,1,1,94.05,1 +0,0,1,1,42,1,1,100.4,0 +0,0,1,0,71,1,0,25.0,0 +0,0,0,0,1,1,1,54.75,1 +1,1,0,0,39,1,1,95.65,1 +0,0,0,0,35,1,0,19.25,0 +0,0,1,1,53,1,1,108.25,0 +0,0,0,0,1,1,1,94.6,1 +0,1,1,1,31,1,1,98.9,1 +1,0,0,0,48,1,0,20.15,0 +0,1,0,1,30,1,1,101.3,0 +1,0,0,0,10,1,0,20.0,0 +0,0,0,1,12,1,1,105.3,0 +0,1,0,0,57,1,0,69.85,0 +0,0,1,0,58,1,1,65.25,0 +0,0,0,0,37,1,0,19.8,0 +0,0,1,1,44,1,0,19.6,0 +1,0,0,1,27,1,0,20.05,0 +0,0,0,0,8,1,0,49.4,0 +1,1,0,0,3,1,1,76.05,1 +0,1,1,0,25,1,0,88.4,0 +0,0,1,1,57,1,1,100.6,0 +0,0,0,0,12,1,0,19.45,0 +0,0,1,1,62,1,0,20.3,0 +0,0,1,0,65,1,1,107.65,0 +0,0,1,0,71,1,1,80.45,0 +0,0,1,1,21,1,1,58.85,0 +1,0,1,0,71,1,1,109.6,0 +0,0,0,0,7,1,1,75.15,0 +0,0,0,0,72,1,1,73.0,0 +0,0,0,0,1,1,0,70.1,0 +0,0,1,1,72,1,1,98.65,0 +0,0,1,1,64,1,1,111.45,0 +0,0,0,0,72,1,1,114.9,0 +0,0,0,0,29,1,0,100.55,0 +0,0,0,0,13,1,1,20.4,0 +0,0,0,0,31,1,0,104.35,0 +1,1,0,0,1,1,1,69.75,1 +1,0,1,1,7,0,1,34.5,1 +1,0,1,0,61,1,1,105.55,1 +0,0,0,1,39,0,0,30.1,1 +1,0,1,0,10,1,1,70.3,1 +0,0,1,1,14,1,0,80.45,0 +0,0,0,0,1,1,1,80.2,1 +0,0,1,1,67,1,1,94.35,1 +0,0,0,0,72,1,1,91.35,0 +1,0,1,1,6,1,1,44.6,1 +0,0,0,0,1,1,1,19.6,1 +1,0,1,1,25,1,0,19.9,0 +0,1,0,0,33,1,1,110.45,1 +1,0,0,0,18,1,1,68.35,0 +1,0,1,0,71,1,1,79.1,0 +1,1,1,1,28,1,1,51.0,0 +0,0,0,1,2,1,0,80.55,0 +1,0,1,1,17,1,1,66.7,0 +1,0,0,0,56,1,1,86.4,0 +0,0,1,0,60,0,0,50.05,0 +0,0,0,0,33,1,0,25.7,0 +0,0,0,0,1,1,1,83.4,0 +1,0,0,0,2,1,0,70.7,1 +1,0,1,0,63,1,1,84.65,0 +1,1,1,0,7,1,1,99.25,1 +0,0,0,0,55,1,1,64.75,0 +0,0,1,0,65,1,1,100.15,0 +1,0,1,0,1,1,1,84.8,1 +1,0,0,0,63,1,0,25.25,0 +0,1,1,0,70,1,1,113.0,0 +0,0,1,1,36,0,0,40.65,0 +1,0,0,0,52,1,1,105.0,1 +1,0,0,0,22,1,1,54.45,1 +1,0,0,0,22,1,1,94.95,0 +0,1,0,0,5,1,0,59.9,0 +0,0,1,0,47,1,1,85.3,1 +0,0,0,0,33,1,1,83.35,1 +1,0,0,0,18,0,1,33.5,1 +0,0,0,0,1,1,0,19.8,0 +1,0,0,0,56,1,1,81.8,0 +0,0,0,0,2,1,1,20.0,0 +1,0,0,0,35,1,1,59.6,0 +0,0,1,0,64,1,0,25.0,0 +0,0,0,0,15,1,1,84.35,0 +1,0,0,0,24,1,1,90.35,1 +1,0,0,0,1,1,0,55.55,0 +0,0,1,1,70,1,0,75.35,0 +1,0,1,0,1,1,1,90.75,1 +0,0,0,1,4,1,0,89.6,1 +0,0,0,0,39,1,0,59.3,0 +0,0,0,0,29,1,1,66.1,0 +0,0,1,1,14,1,0,18.8,0 +0,0,0,0,61,1,0,86.45,0 +1,0,0,1,13,1,1,52.1,0 +0,0,0,0,66,0,1,47.4,0 +1,0,0,0,2,0,1,49.25,1 +0,0,1,0,59,1,1,109.15,0 +1,0,1,1,62,1,1,94.95,0 +1,1,1,0,33,1,1,93.55,0 +1,0,0,1,66,1,1,79.5,0 +0,0,0,0,72,1,0,115.05,0 +1,0,0,1,1,1,0,19.75,1 +0,0,0,0,19,1,1,95.15,1 +0,0,1,1,51,1,1,95.15,0 +1,0,0,0,63,1,0,105.4,0 +1,0,0,0,27,1,0,20.1,0 +1,0,0,0,22,1,1,101.35,1 +0,1,0,0,4,1,0,20.05,0 +1,0,1,1,42,1,0,20.7,0 +0,0,0,0,29,1,0,20.35,0 +0,0,0,0,4,1,1,70.05,1 +1,0,0,0,30,1,0,19.7,0 +1,0,1,0,4,1,1,74.65,1 +1,0,1,1,71,1,0,85.45,0 +1,0,1,0,46,0,0,40.4,0 +1,0,0,0,4,1,0,50.4,1 +0,0,0,0,7,1,1,79.65,1 +1,0,0,0,69,1,1,105.2,0 +0,0,1,0,72,1,0,100.65,0 +1,1,0,0,19,1,1,79.85,1 +1,0,0,0,28,1,0,91.0,0 +1,0,1,0,5,1,1,78.75,1 +0,1,1,0,72,1,1,116.75,0 +1,1,1,1,8,1,1,80.45,1 +0,0,0,0,7,1,1,59.1,0 +0,0,0,0,22,1,1,49.8,0 +1,0,0,0,72,1,0,19.3,0 +1,0,1,1,8,1,0,19.65,0 +1,0,1,0,52,1,1,81.4,0 +0,0,0,0,68,0,0,38.9,0 +0,0,1,0,71,1,0,87.95,0 +1,0,0,0,2,1,0,19.85,0 +0,1,0,0,34,1,1,96.35,0 +0,0,0,0,35,0,0,24.15,0 +0,0,1,1,61,1,0,19.1,0 +1,0,0,0,1,1,0,44.0,0 +0,0,0,0,1,1,1,50.1,1 +0,0,1,1,53,1,0,60.6,0 +0,0,1,0,72,1,0,25.65,0 +1,0,1,0,2,1,0,76.4,1 +1,0,0,0,3,1,1,98.7,1 +0,1,0,0,13,1,1,100.8,1 +1,1,1,0,41,0,1,53.95,0 +0,0,1,0,24,1,0,20.4,0 +0,0,1,1,28,1,1,90.1,1 +1,0,0,0,8,0,0,29.35,0 +1,0,0,0,1,1,1,20.45,0 +0,0,0,0,54,1,1,95.1,0 +1,0,0,0,41,1,1,25.25,0 +0,0,1,0,19,1,0,44.9,0 +0,0,1,1,72,1,0,92.65,0 +1,0,0,0,62,0,1,43.7,0 +0,1,1,1,56,1,1,72.6,0 +1,0,0,0,15,1,0,51.55,1 +1,1,0,0,10,1,1,79.25,1 +1,0,1,1,32,1,0,18.95,0 +1,0,0,0,21,1,0,20.5,0 +1,0,1,1,62,1,0,19.95,0 +0,0,0,0,2,0,0,24.5,0 +1,0,0,1,27,1,0,20.6,0 +1,0,0,0,5,1,1,94.85,1 +0,0,0,0,25,0,0,61.05,0 +0,0,0,0,2,1,1,85.7,1 +1,0,0,0,49,1,1,106.65,0 +0,0,0,0,63,1,0,108.25,0 +0,0,0,1,4,1,0,20.4,0 +0,0,1,0,1,1,1,55.3,0 +1,0,0,0,11,1,0,20.25,0 +1,1,0,0,52,1,1,72.95,0 +0,1,1,0,60,1,0,89.45,0 +1,0,0,0,64,1,1,104.65,0 +0,0,1,1,43,1,0,75.2,0 +0,0,1,0,61,1,0,101.15,0 +0,0,0,0,1,1,0,44.4,1 +1,1,0,0,5,1,1,89.5,1 +1,0,0,0,66,1,0,68.75,0 +1,0,1,0,67,1,1,111.05,0 +0,0,1,0,42,1,1,99.0,0 +1,1,1,0,1,1,1,86.05,1 +0,0,1,1,31,1,0,21.0,0 +1,0,0,0,7,1,1,19.4,0 +1,0,0,0,4,0,1,44.55,1 +1,0,1,1,34,1,0,77.2,0 +1,0,0,0,3,1,1,19.45,0 +0,0,1,1,19,0,1,24.85,0 +1,0,1,1,31,0,0,35.4,1 +0,0,0,0,1,1,0,95.65,1 +1,0,0,0,3,0,0,41.35,0 +1,0,1,0,46,1,0,19.6,0 +0,0,0,0,1,1,0,20.95,1 +0,0,1,1,69,1,0,84.45,0 +1,0,0,0,5,1,0,20.25,0 +1,0,0,0,1,1,0,19.65,0 +1,0,0,0,26,1,1,20.65,0 +0,1,0,0,10,0,1,34.7,1 +1,0,0,0,25,1,0,99.3,0 +1,0,1,1,64,1,0,81.05,0 +1,0,1,1,30,1,0,67.6,0 +1,0,0,0,13,1,1,70.15,0 +0,0,1,0,64,1,1,115.0,0 +0,0,0,1,46,1,1,84.8,0 +0,0,0,0,12,1,0,19.7,0 +0,0,0,0,15,1,0,19.75,1 +1,0,1,1,17,1,1,92.55,1 +0,0,1,1,13,1,1,63.15,0 +0,0,1,1,67,1,0,74.0,0 +1,0,1,0,24,0,0,29.1,0 +1,0,0,0,6,1,0,50.05,0 +1,1,1,0,53,1,1,60.05,1 +1,1,1,0,16,1,1,74.3,1 +1,0,0,0,10,1,0,20.0,0 +0,0,0,0,13,1,1,74.65,0 +1,0,0,0,9,1,1,85.35,1 +0,0,0,0,25,1,0,74.3,1 +1,1,0,0,7,0,1,44.4,0 +1,0,1,1,38,1,1,85.4,0 +0,0,1,0,43,1,1,94.1,0 +0,0,0,1,4,1,1,98.1,1 +0,0,0,0,25,1,0,108.9,0 +1,0,0,1,27,1,0,56.2,0 +1,0,1,1,72,1,0,26.1,0 +1,0,0,1,71,1,1,85.45,0 +0,0,0,0,24,1,1,88.95,0 +0,0,0,0,50,1,1,109.65,1 +1,0,0,0,57,1,1,74.35,0 +0,0,0,0,15,1,0,48.85,0 +1,0,0,0,4,1,1,80.1,0 +0,0,0,0,28,1,0,56.05,0 +0,1,0,0,9,1,1,74.55,1 +0,0,1,0,55,1,1,89.8,0 +1,0,0,0,3,1,1,100.95,1 +1,0,0,0,10,1,1,94.9,1 +1,0,0,1,55,1,0,19.1,0 +0,0,1,1,20,1,0,20.35,0 +0,0,1,1,62,1,1,106.05,0 +1,1,1,0,32,1,1,104.9,1 +0,0,0,0,43,1,1,19.65,0 +1,0,1,0,9,0,0,24.1,1 +0,0,1,0,60,1,0,59.85,0 +1,0,1,0,58,1,1,86.1,0 +1,0,0,1,7,1,0,19.45,0 +1,0,1,1,2,1,0,97.1,0 +1,1,0,0,37,0,0,36.65,0 +0,1,1,1,65,1,1,103.9,0 +0,0,1,1,39,1,0,19.75,0 +1,0,1,0,66,1,1,104.05,1 +1,0,0,0,68,1,0,24.55,0 +0,0,1,1,62,0,0,48.7,0 +1,0,0,0,3,1,1,88.35,1 +0,0,1,0,72,1,1,109.55,0 +0,0,1,0,41,1,0,20.65,0 +1,0,1,1,29,1,0,94.65,1 +0,0,0,0,4,1,0,55.2,0 +1,0,0,0,53,1,0,24.05,0 +1,1,1,0,1,1,1,74.4,1 +0,0,1,1,41,1,0,79.9,1 +1,0,1,0,39,1,1,20.45,0 +1,0,1,0,63,1,0,19.25,0 +1,0,0,0,15,1,1,26.35,0 +0,0,1,0,13,1,0,43.8,0 +1,0,0,0,1,1,1,50.15,0 +1,0,0,0,1,1,0,20.45,0 +1,1,0,0,8,1,1,69.7,1 +1,0,0,0,60,1,0,61.4,0 +0,1,1,0,12,1,1,98.1,1 +1,0,1,0,40,1,0,70.75,0 +0,0,0,0,66,1,1,61.15,0 +1,0,1,1,42,1,0,20.25,0 +0,1,0,0,66,1,1,63.85,0 +1,0,0,0,49,1,0,98.7,0 +0,0,0,0,1,1,0,20.5,1 +0,0,0,0,41,1,0,20.0,0 +0,0,1,1,41,1,0,19.3,0 +0,0,1,1,23,1,0,84.4,0 +1,0,0,0,3,0,0,25.1,0 +0,0,0,0,4,0,0,48.25,0 +0,0,1,1,52,1,0,19.85,0 +0,1,1,0,4,1,1,99.6,1 +0,0,0,0,11,1,1,94.2,0 +0,0,1,0,2,1,1,62.15,0 +0,0,1,0,26,1,0,79.3,0 +1,0,1,1,24,1,1,56.25,0 +0,0,0,0,12,1,0,20.3,0 +1,1,1,0,60,1,1,99.0,0 +0,0,1,1,64,1,1,90.6,0 +1,0,1,0,66,1,1,85.9,0 +0,0,0,0,60,1,1,79.2,0 +1,0,1,1,17,1,1,70.35,0 +1,0,1,1,42,1,0,19.35,0 +1,0,0,0,1,1,1,50.15,0 +0,0,1,1,47,1,0,63.8,0 +0,0,1,0,10,1,1,20.55,0 +1,1,1,0,70,1,1,88.55,0 +1,1,0,0,67,1,1,101.4,0 +0,0,0,0,1,1,1,81.95,1 +1,0,1,0,7,1,1,69.35,1 +1,0,0,0,1,1,0,44.6,0 +1,0,0,0,4,1,1,63.75,0 +0,0,1,1,66,1,0,109.25,0 +0,0,0,0,12,1,1,84.6,0 +0,0,0,0,24,1,0,20.45,0 +1,0,0,0,26,1,1,85.75,0 +0,0,0,0,6,1,1,91.1,1 +1,0,1,0,57,1,0,107.95,0 +1,0,1,0,14,1,1,86.1,1 +0,0,1,1,42,1,0,22.95,0 +1,0,0,0,25,1,1,94.7,1 +0,0,1,0,64,1,0,19.45,0 +1,0,1,0,22,1,1,85.1,1 +1,0,0,0,19,1,1,19.7,0 +0,0,1,1,61,1,1,99.15,1 +1,0,1,0,22,1,1,87.0,0 +1,1,1,0,70,1,1,102.95,1 +1,0,0,0,12,1,1,79.95,0 +0,0,1,0,31,1,1,64.0,0 +0,0,0,0,11,1,1,64.9,0 +1,0,1,1,68,1,0,25.75,0 +0,1,1,1,72,1,1,90.15,0 +1,1,0,0,67,1,1,116.1,0 +0,0,0,0,60,1,1,104.95,0 +1,0,0,0,1,1,1,45.05,1 +0,1,0,1,1,1,1,71.0,1 +1,0,1,1,58,0,0,50.0,0 +0,1,1,1,47,1,0,70.55,1 +0,0,0,0,1,1,1,79.7,1 +1,0,0,0,1,1,0,20.45,0 +1,0,0,0,22,1,0,59.0,1 +0,0,0,0,48,1,1,60.35,1 +0,0,1,0,37,1,1,19.85,0 +1,0,0,0,13,1,1,19.95,0 +1,0,0,0,43,1,0,26.45,0 +0,0,0,0,6,0,1,63.4,0 +1,0,0,0,71,0,0,53.95,0 +0,1,1,1,1,1,1,69.25,1 +0,0,1,1,72,1,1,95.1,0 +0,1,0,0,6,1,1,74.1,0 +1,0,1,1,12,0,0,35.5,0 +1,0,0,0,25,1,0,70.95,1 +0,0,1,0,21,1,0,79.2,0 +0,0,1,1,6,1,1,48.8,0 +1,0,1,0,20,1,1,89.0,1 +1,0,1,0,18,1,1,99.4,1 +0,0,0,0,43,1,0,55.45,0 +0,0,1,1,35,1,1,25.4,0 +0,0,0,0,1,1,0,73.5,1 +1,1,1,0,32,1,1,93.5,0 +1,0,0,0,52,0,0,63.9,0 +1,0,0,0,32,1,1,64.85,0 +0,0,1,1,72,0,1,63.8,0 +1,0,0,0,51,0,1,44.45,0 +1,0,1,1,68,1,1,19.95,0 +1,1,1,0,8,0,1,43.35,0 +1,0,1,0,49,0,0,49.65,0 +0,0,1,0,72,1,0,85.1,0 +1,0,0,0,9,1,1,95.5,1 +0,0,1,0,28,1,1,92.35,1 +1,0,0,0,54,1,0,89.8,0 +1,0,0,0,11,1,1,74.55,1 +0,0,1,1,50,1,0,103.05,0 +0,0,1,0,69,1,1,116.0,0 +1,0,0,0,1,1,1,69.9,0 +1,0,1,1,68,1,0,95.1,0 +1,0,0,1,40,0,0,40.25,0 +1,0,1,1,31,1,0,25.75,0 +0,1,0,1,33,1,1,105.35,0 +1,1,1,0,55,1,1,113.6,0 +1,0,1,1,68,1,1,24.0,0 +0,0,1,1,12,1,0,19.4,0 +1,0,1,0,71,1,1,86.1,0 +1,0,0,0,40,1,1,102.65,0 +0,0,1,1,64,1,1,92.85,0 +1,0,1,0,53,1,0,97.75,0 +1,1,0,0,12,1,1,83.8,1 +1,1,0,0,53,0,1,54.45,1 +1,0,1,0,72,1,1,97.95,0 +1,0,0,0,46,1,0,19.95,0 +1,0,0,0,40,1,1,24.6,0 +1,0,0,0,12,0,1,50.95,0 +1,0,0,0,9,1,0,75.6,0 +0,0,1,1,51,1,1,80.75,0 +1,0,1,1,49,1,1,90.4,0 +1,1,1,0,41,1,1,99.8,1 +0,0,0,0,56,1,1,60.25,0 +1,0,0,0,4,1,1,20.2,0 +1,0,1,0,20,1,1,64.15,0 +0,0,1,1,26,1,1,20.25,0 +0,0,1,1,20,1,1,105.85,1 +0,0,0,0,7,1,0,75.45,1 +1,0,0,0,7,1,1,93.85,1 +1,0,0,0,51,1,1,99.0,0 +0,0,0,0,4,1,1,80.3,0 +0,0,0,0,1,1,0,19.55,0 +1,0,1,1,27,1,0,100.75,0 +1,0,0,0,22,1,1,100.75,1 +1,0,0,0,12,1,1,53.75,0 +0,0,1,1,3,0,1,31.0,1 +0,0,1,1,34,1,1,25.6,0 +1,0,1,0,24,1,1,58.35,0 +1,0,0,0,51,1,0,80.0,1 +0,1,0,0,14,0,1,46.35,0 +1,0,1,0,59,1,0,113.75,0 +1,0,0,0,3,1,0,90.4,0 +0,0,1,1,65,1,0,109.3,0 +1,1,0,0,5,1,1,70.25,1 +0,0,1,1,59,1,0,90.3,0 +1,0,1,1,72,0,1,65.25,0 +0,0,1,1,62,1,1,100.15,1 +1,0,0,0,28,1,1,94.5,1 +1,0,0,0,3,1,0,60.65,0 +1,0,0,1,19,1,1,24.1,0 +1,0,0,0,1,1,1,19.5,0 +1,0,0,0,24,1,1,85.95,0 +1,1,0,0,57,1,1,53.5,0 +0,0,0,0,72,1,0,25.45,0 +1,0,0,0,67,1,0,20.5,0 +1,0,1,1,52,1,1,20.85,0 +1,0,1,1,71,1,0,89.9,0 +0,0,1,0,26,1,0,26.0,0 +0,0,0,0,35,1,1,113.2,0 +0,0,1,1,55,1,1,69.05,0 +0,0,1,1,33,1,0,20.1,0 +1,0,1,0,72,1,1,109.65,0 +1,0,0,1,1,1,1,19.2,0 +1,0,0,0,10,0,1,33.9,1 +0,1,1,0,37,1,0,90.0,0 +1,0,0,0,12,0,0,34.0,0 +1,0,1,1,1,1,0,20.4,0 +1,0,1,0,62,0,1,38.6,0 +0,0,0,0,1,0,0,25.25,0 +0,0,0,0,18,1,1,60.6,0 +1,1,1,0,69,1,1,89.95,1 +1,0,0,0,2,1,1,74.75,0 +1,0,1,1,19,1,0,20.6,0 +1,0,0,0,12,1,1,84.45,1 +1,0,0,0,9,1,0,20.4,0 +1,0,0,0,27,1,0,81.7,0 +1,0,0,1,27,1,1,79.5,1 +1,0,1,1,1,1,0,89.15,1 +0,1,0,0,24,1,1,20.3,0 +1,1,0,0,14,1,1,74.95,1 +0,1,0,0,32,1,1,74.4,1 +0,0,0,0,11,1,0,20.0,0 +1,0,0,0,1,1,1,25.0,0 +1,1,0,1,38,1,1,80.45,0 +0,0,1,1,9,1,0,19.75,0 +1,0,1,1,54,1,1,65.65,0 +0,0,0,0,29,1,1,71.0,0 +1,1,1,0,44,1,1,89.2,0 +1,0,1,1,59,1,1,86.75,0 +0,0,0,0,3,1,1,55.3,1 +0,0,1,1,18,1,1,61.5,0 +1,1,0,0,67,1,0,25.1,0 +0,0,1,1,22,1,0,55.15,1 +1,0,0,1,33,0,0,34.05,0 +1,0,0,0,5,1,0,19.95,0 +0,0,0,0,2,1,0,19.95,0 +1,0,1,1,72,1,0,89.7,0 +1,0,0,1,9,1,0,20.4,0 +1,0,1,1,67,1,0,26.3,0 +0,0,1,0,16,1,1,84.95,1 +0,0,0,0,8,1,1,20.7,0 +1,0,0,0,5,0,1,43.25,1 +1,0,1,1,23,1,1,48.35,1 +1,0,0,0,1,1,1,79.55,1 +0,1,1,0,50,1,1,71.05,1 +1,0,0,0,17,1,0,19.45,0 +0,0,1,0,68,1,1,110.8,0 +1,0,0,0,1,1,0,84.5,1 +0,1,1,0,25,1,1,69.3,0 +1,0,0,0,67,0,1,49.35,0 +1,0,0,0,32,1,0,20.35,0 +0,1,1,0,67,1,1,105.6,0 +1,1,1,0,72,0,1,64.45,0 +1,0,1,0,71,1,1,108.6,1 +1,0,0,1,1,1,1,49.9,0 +1,0,0,0,46,0,0,30.3,1 +0,1,0,0,2,0,1,30.4,1 +0,0,0,0,1,1,1,45.4,1 +0,0,1,0,48,1,1,65.65,0 +0,0,1,0,61,1,1,103.3,0 +0,0,1,0,32,1,0,84.15,1 +0,0,0,0,2,1,0,44.45,0 +0,0,0,0,3,1,0,19.75,1 +0,0,0,0,5,1,1,85.4,1 +0,0,1,1,71,1,0,89.9,0 +1,0,1,0,37,1,1,55.05,0 +1,0,1,1,65,1,1,104.1,0 +0,0,0,1,67,1,1,106.6,0 +1,0,0,1,49,1,0,75.2,1 +1,0,1,1,50,1,1,70.5,0 +1,0,1,1,25,1,0,19.6,0 +0,0,0,1,17,1,1,55.85,1 +0,0,1,1,64,1,1,24.05,0 +1,0,1,0,25,0,1,38.1,0 +1,1,0,0,23,1,1,106.4,1 +1,1,1,0,24,0,0,34.25,0 +0,0,0,0,37,1,1,100.05,0 +0,0,0,0,21,1,1,68.65,0 +1,0,0,0,1,1,1,45.8,0 +0,0,0,0,10,1,1,75.75,0 +1,0,0,0,6,1,1,84.4,1 +1,0,1,0,51,1,1,96.4,0 +0,0,0,0,10,1,1,20.55,0 +0,0,0,0,6,0,0,50.95,0 +1,0,1,1,47,1,1,90.5,0 +0,0,1,1,61,1,1,79.4,0 +0,0,0,0,52,0,1,58.75,0 +0,0,1,1,35,1,1,59.45,0 +1,0,1,0,71,1,1,105.7,0 +0,0,0,0,6,1,0,56.25,1 +1,0,1,0,45,1,0,53.3,0 +0,1,0,0,2,1,1,85.55,1 +0,0,0,0,4,1,1,68.65,1 +1,0,0,0,2,0,0,24.3,0 +1,0,0,0,4,1,0,77.85,1 +1,0,0,0,51,1,0,59.9,0 +1,0,1,1,60,1,0,23.95,0 +1,0,0,0,9,1,1,20.15,0 +1,0,0,0,3,1,1,105.35,1 +1,0,0,0,17,1,1,95.65,0 +0,0,0,0,8,1,1,87.05,1 +1,0,1,1,46,1,0,81.0,0 +0,0,0,0,68,1,1,82.45,0 +1,0,0,0,1,1,1,53.5,1 +0,0,1,0,4,1,0,20.5,0 +0,0,0,0,1,0,1,25.1,1 +1,0,0,1,28,1,1,54.4,0 +0,0,0,0,39,1,1,58.6,0 +1,0,0,0,11,1,0,84.8,0 +0,0,1,0,71,0,1,61.4,0 +1,0,0,1,2,1,0,20.4,0 +1,1,1,0,30,1,1,79.65,1 +0,0,0,0,17,1,0,20.15,0 +0,0,1,0,55,1,1,94.45,0 +0,0,0,0,58,1,1,79.8,0 +0,0,0,0,5,1,0,54.2,1 +0,1,0,0,1,1,1,19.45,1 +1,1,0,0,9,1,1,74.05,0 +1,0,0,0,26,1,0,49.15,0 +0,0,0,0,50,1,0,19.4,0 +0,0,1,0,72,1,1,113.65,0 +0,0,0,1,43,1,1,106.0,0 +1,0,0,0,56,1,1,25.95,0 +0,0,0,0,1,1,0,19.1,0 +1,0,1,1,72,1,1,103.4,1 +1,0,1,0,72,1,1,100.55,0 +1,0,1,0,36,1,1,95.4,0 +1,0,0,0,5,1,0,75.15,0 +0,0,0,0,13,1,1,84.45,1 +0,1,0,0,44,1,0,89.15,0 +0,1,1,1,70,1,1,107.9,0 +1,0,0,0,44,1,0,19.5,0 +0,1,1,0,32,1,1,85.95,1 +0,0,1,0,69,1,1,24.95,0 +0,1,0,0,16,1,0,59.4,1 +1,1,1,1,68,1,0,19.5,0 +1,0,0,0,16,1,1,69.95,0 +1,0,1,1,68,1,0,82.85,0 +1,0,0,0,4,1,0,19.0,0 +0,0,1,1,26,0,0,38.85,0 +0,0,0,0,29,0,1,30.6,1 +1,0,0,1,5,1,0,20.35,0 +1,0,1,0,70,1,1,95.0,0 +1,0,1,0,24,1,0,74.4,0 +0,1,1,0,72,1,0,78.45,0 +1,0,0,0,1,1,1,74.3,0 +1,0,1,0,70,0,1,51.05,0 +0,0,1,1,36,1,0,19.2,0 +0,1,0,0,38,1,1,99.55,1 +0,0,0,0,17,1,1,70.0,1 +0,0,1,1,41,1,1,109.1,0 +0,0,0,0,1,1,1,45.3,1 +1,0,0,0,2,0,0,29.85,1 +1,0,0,0,14,1,0,76.45,0 +1,1,0,0,2,1,1,95.1,1 +1,0,0,0,1,1,0,19.8,1 +1,0,1,1,13,1,1,72.8,0 +1,0,0,0,6,1,0,18.95,0 +0,0,0,0,4,1,1,76.65,1 +0,0,1,1,5,1,1,99.15,1 +0,0,1,0,15,1,0,101.75,0 +0,0,0,0,47,1,0,75.45,0 +0,0,0,0,8,1,0,64.1,0 +1,0,0,0,17,0,1,25.65,0 +1,0,1,1,15,1,0,75.1,0 +0,0,0,0,26,1,1,95.85,0 +0,0,0,0,23,1,0,54.4,0 +0,1,0,0,4,1,0,72.75,0 +1,0,0,1,29,1,0,19.85,0 +0,0,0,0,25,1,0,19.05,0 +1,0,0,0,9,1,0,44.95,1 +1,0,1,0,18,1,1,49.55,1 +1,1,0,0,3,1,1,94.85,0 +0,0,1,1,69,0,0,46.25,0 +1,0,0,0,14,1,0,19.35,0 +1,0,0,0,19,1,0,69.6,0 +1,1,0,0,39,1,0,90.7,0 +1,0,0,0,31,1,1,101.4,0 +1,0,1,1,24,1,0,20.25,0 +1,0,1,0,14,1,0,48.8,0 +0,0,1,0,64,1,1,74.35,0 +0,0,0,0,50,1,1,19.35,0 +1,0,1,1,52,1,1,68.75,0 +1,0,0,0,28,1,0,100.2,0 +0,0,0,0,21,1,1,20.85,0 +1,0,0,1,25,1,1,95.9,1 +0,0,1,0,17,1,0,19.35,0 +1,0,1,0,58,0,1,45.0,0 +1,1,1,0,17,1,0,81.5,1 +0,0,1,0,51,1,0,25.5,0 +1,0,1,1,72,0,0,48.9,0 +1,0,1,0,52,1,0,84.1,1 +0,0,0,0,27,1,1,19.6,0 +0,0,0,0,3,1,0,20.0,0 +0,0,1,0,64,1,1,81.3,0 +0,0,1,0,45,1,1,95.2,0 +1,1,1,0,3,0,1,36.45,1 +0,0,1,0,71,1,1,83.3,0 +0,1,0,0,1,0,0,25.05,1 +0,0,1,1,58,1,0,20.3,0 +1,0,1,1,34,1,1,89.85,0 +0,0,0,0,8,1,1,49.85,1 +0,0,1,1,15,1,0,19.8,0 +1,0,1,1,66,0,0,54.65,0 +1,1,0,0,12,0,1,29.35,0 +1,0,0,0,58,1,1,19.15,0 +0,0,1,1,3,1,0,19.1,0 +0,1,1,0,43,0,0,55.55,1 +0,0,0,0,9,1,0,80.55,0 +0,0,0,0,3,1,0,20.25,0 +0,0,1,1,22,1,1,69.5,1 +1,0,1,0,40,1,1,106.0,0 +0,0,0,0,68,1,0,25.5,0 +1,0,1,0,54,1,1,104.3,1 +0,0,0,0,50,1,1,79.6,0 +1,0,0,0,1,1,1,55.25,0 +0,0,1,0,72,1,0,88.05,0 +1,0,0,1,40,1,1,20.4,0 +0,0,1,1,72,1,1,117.6,0 +0,0,0,0,6,1,0,20.0,0 +0,0,0,0,5,1,1,19.65,0 +1,0,1,0,48,1,1,70.55,0 +0,0,0,0,1,1,1,93.85,1 +0,0,1,1,64,1,0,65.8,0 +0,0,0,0,17,1,0,20.05,0 +1,0,1,0,40,1,1,80.0,0 +0,0,1,1,41,0,0,35.4,0 +1,1,0,0,51,1,1,79.6,0 +1,0,1,0,41,1,1,80.25,0 +0,0,1,1,1,1,0,50.45,1 +0,0,0,0,2,1,1,20.45,0 +1,0,0,0,68,1,0,79.6,0 +0,0,1,1,24,1,0,24.7,0 +1,0,1,0,70,1,0,77.3,0 +1,0,0,0,3,0,1,29.75,0 +1,0,0,0,2,1,0,44.9,0 +1,0,1,0,3,0,0,29.8,0 +0,0,0,0,7,1,1,74.65,1 +0,0,0,0,13,1,1,71.95,0 +1,0,0,0,7,1,0,20.75,0 +1,0,1,1,12,1,1,56.3,0 +1,0,1,1,53,1,1,105.25,0 +0,0,0,0,12,1,1,94.2,1 +1,0,1,1,63,1,0,19.55,0 +0,0,0,0,15,1,0,84.45,0 +1,0,1,1,36,1,0,53.65,0 +1,1,1,0,4,0,1,29.9,0 +0,0,1,1,24,1,0,19.7,0 +0,0,0,0,61,0,0,43.7,0 +1,0,0,0,16,1,0,55.3,0 +1,0,1,1,65,1,1,19.85,0 +0,0,1,1,26,1,0,19.65,0 +1,0,0,0,16,1,1,49.45,0 +0,0,1,0,54,1,0,106.55,1 +1,0,0,0,1,1,0,20.1,1 +1,0,0,1,5,1,0,20.45,0 +0,0,0,0,19,0,1,39.7,0 +1,0,0,0,10,1,1,54.5,0 +0,0,1,1,23,1,0,83.8,1 +1,0,0,0,3,1,0,55.15,1 +0,0,0,0,72,1,1,111.6,0 +1,1,1,0,10,1,1,86.65,1 +0,0,1,1,10,1,1,55.55,0 +1,0,1,0,11,1,1,20.55,0 +0,1,0,0,37,1,1,106.75,1 +1,0,1,1,17,1,1,62.1,0 +0,0,1,1,36,1,1,104.5,0 +1,1,0,0,17,1,1,101.8,0 +0,1,1,1,66,1,1,110.6,0 +1,0,1,1,61,1,0,84.9,0 +1,0,0,0,22,1,1,93.2,0 +1,0,0,0,1,0,1,24.4,0 +0,0,0,0,6,1,0,70.55,0 +1,0,0,0,31,1,1,78.45,1 +0,0,1,1,68,1,1,85.0,0 +0,0,1,1,34,1,0,87.45,1 +0,0,1,1,52,1,0,85.8,0 +0,0,0,1,10,1,1,91.1,0 +1,0,1,1,29,1,1,70.75,1 +0,0,1,1,72,1,0,20.1,0 +1,0,1,1,47,1,0,20.05,0 +1,0,1,1,24,1,0,74.8,0 +1,0,0,0,65,1,0,24.8,0 +0,0,0,0,4,1,1,100.85,0 +1,1,1,0,12,1,1,101.35,1 +1,0,0,0,1,1,1,81.7,1 +1,0,0,0,33,1,0,68.25,1 +0,0,0,0,34,1,1,105.1,0 +0,0,1,0,14,1,0,20.4,0 +0,0,0,0,4,1,1,79.15,1 +1,0,1,1,13,1,0,20.0,0 +0,0,1,1,65,1,1,79.4,0 +1,0,1,1,23,1,0,57.2,0 +1,0,1,0,55,1,0,58.6,0 +1,0,1,0,49,1,1,94.8,0 +1,0,1,0,60,1,0,102.5,0 +0,0,1,1,69,1,1,20.35,0 +1,0,0,0,40,1,1,84.9,0 +1,0,1,0,67,1,1,69.2,0 +1,1,0,0,35,1,1,95.45,1 +1,0,1,1,19,1,1,100.95,1 +0,0,1,1,13,1,0,20.85,0 +0,0,0,1,41,1,1,88.5,0 +0,0,0,0,4,0,0,35.0,0 +0,0,1,1,24,1,0,55.15,0 +0,0,0,0,5,0,1,50.95,0 +0,0,0,0,5,1,1,64.0,0 +0,0,1,1,1,1,1,69.1,1 +0,0,1,1,72,1,0,80.2,0 +0,0,0,0,24,1,1,49.3,0 +0,0,1,0,42,1,0,84.35,0 +0,0,0,0,4,1,0,20.05,0 +1,0,0,0,68,1,1,117.2,0 +0,0,1,1,33,1,0,20.1,0 +0,1,0,0,1,1,1,69.6,1 +1,0,0,0,31,1,1,103.45,1 +0,0,0,0,4,1,0,77.95,1 +1,1,1,0,69,1,1,109.95,0 +1,1,0,0,38,1,0,94.75,0 +0,0,1,1,3,1,1,80.0,0 +0,0,1,1,48,1,0,79.65,0 +0,0,1,0,15,1,0,25.2,0 +0,0,0,0,25,1,0,19.9,0 +0,1,0,0,1,1,0,78.45,1 +0,0,0,0,48,0,1,44.8,0 +1,0,0,0,1,1,0,20.3,0 +1,0,0,0,1,1,0,19.2,0 +0,0,0,0,37,1,0,80.05,0 +1,1,1,0,66,1,1,107.35,0 +0,0,1,0,26,0,0,47.85,0 +1,0,1,0,63,1,0,70.8,0 +1,0,0,0,10,0,0,29.5,1 +0,0,0,0,2,1,1,70.75,1 +1,1,1,0,18,1,1,59.1,0 +0,0,1,0,64,1,0,25.55,0 +0,1,0,0,9,1,1,84.45,1 +0,0,0,1,28,1,0,20.25,0 +0,0,0,0,1,1,0,75.55,0 +1,0,0,0,4,1,1,85.65,1 +1,1,0,0,38,1,1,70.15,1 +1,0,1,0,66,1,0,95.3,0 +0,0,0,0,1,1,1,70.25,0 +0,0,1,0,18,1,1,50.3,0 +1,1,0,0,51,1,1,97.8,1 +1,0,0,0,1,1,0,46.3,1 +1,0,0,1,12,1,0,19.35,0 +0,0,0,0,41,1,1,106.3,1 +1,0,0,0,12,1,0,25.0,0 +0,0,1,1,55,1,0,20.3,0 +0,0,0,0,7,1,1,75.35,0 +0,0,0,0,12,1,1,89.4,1 +0,0,1,1,68,1,0,88.0,0 +0,1,0,0,5,1,1,83.15,1 +0,1,0,0,49,1,0,43.8,0 +1,0,0,0,40,0,0,62.05,0 +0,0,0,0,16,1,0,20.1,0 +1,0,0,0,10,1,1,74.15,1 +0,0,1,0,72,1,1,101.35,0 +0,1,0,0,2,1,1,84.05,0 +1,0,1,1,23,1,0,20.9,0 +0,1,0,0,71,1,1,105.9,0 +0,0,1,0,11,1,1,99.5,1 +1,0,0,0,1,1,1,44.15,1 +0,0,0,0,16,1,1,53.9,1 +0,0,0,0,1,1,1,85.45,1 +1,0,1,0,12,1,1,85.05,0 +0,0,0,0,54,0,0,44.1,0 +0,0,1,0,68,1,0,90.2,0 +0,0,1,1,4,1,0,50.85,1 +0,0,0,1,1,1,0,59.2,1 +1,0,0,0,27,1,0,53.45,0 +1,0,0,0,21,1,1,19.95,0 +1,0,0,0,13,1,1,83.2,1 +0,1,0,0,64,1,0,74.65,0 +0,0,0,0,1,1,1,54.9,1 +1,0,1,0,57,0,1,57.5,0 +0,0,1,0,21,1,1,103.9,1 +1,0,0,0,19,1,0,19.65,0 +1,0,1,0,31,1,1,93.8,0 +1,0,0,0,52,1,1,89.25,0 +0,0,0,0,46,1,1,94.15,0 +0,1,0,0,11,1,1,55.6,0 +0,0,1,1,53,0,1,48.7,0 +0,0,1,1,11,1,1,19.25,1 +1,1,0,0,57,1,1,104.9,0 +0,1,0,0,2,1,1,75.45,1 +0,1,0,0,2,1,0,54.85,1 +0,0,1,1,71,1,0,19.9,0 +0,0,1,1,1,1,1,19.4,0 +1,0,1,0,68,1,0,25.05,0 +1,0,1,0,72,1,0,84.45,0 +0,0,0,0,2,1,0,19.3,0 +1,1,1,0,1,1,1,95.1,1 +0,0,0,0,41,1,1,79.85,0 +1,0,1,1,72,1,0,25.55,0 +1,0,1,0,6,1,1,75.5,1 +0,0,1,1,4,1,1,73.75,1 +1,0,0,0,12,1,1,96.05,1 +0,0,1,0,58,1,1,68.4,0 +0,0,0,0,7,1,0,20.65,0 +0,0,1,0,65,1,1,55.15,0 +1,0,0,0,1,1,1,70.6,0 +1,0,1,0,56,1,0,19.95,0 +1,0,0,0,4,1,0,19.0,0 +0,0,1,1,58,1,1,44.1,0 +1,0,1,0,62,1,1,107.6,0 +1,0,0,0,26,1,0,61.55,0 +1,0,0,0,62,1,0,90.7,0 +0,0,1,1,58,1,0,99.25,0 +0,0,1,0,68,1,1,91.7,0 +0,0,1,1,61,1,1,100.7,0 +0,0,0,0,42,1,1,78.45,0 +1,0,0,0,18,1,0,84.3,0 +0,0,0,0,56,1,1,19.55,0 +0,0,0,0,4,1,1,88.95,1 +0,0,0,0,4,1,0,20.45,0 +0,0,0,1,35,1,0,55.6,0 +0,0,1,1,64,1,1,86.8,0 +0,0,0,0,31,1,0,20.95,0 +0,1,1,0,67,1,1,20.05,0 +0,0,0,0,4,1,0,50.7,1 +0,1,1,0,70,1,1,113.65,0 +1,0,0,0,3,1,0,53.4,1 +1,1,1,0,53,1,1,101.9,1 +1,0,1,1,2,1,0,59.5,0 +0,0,1,1,29,1,1,87.8,0 +0,0,0,0,47,0,0,41.9,0 +0,0,1,1,68,1,1,83.0,1 +1,0,0,1,12,1,1,69.85,0 +0,0,1,1,8,1,0,56.3,0 +1,0,1,0,54,1,0,109.55,0 +1,0,1,1,69,1,1,92.15,0 +0,0,0,0,26,1,1,69.5,0 +0,0,1,0,72,1,1,97.0,0 +0,0,0,0,70,0,1,58.35,0 +1,0,0,1,1,1,0,50.6,1 +1,0,0,0,10,1,1,89.5,1 +0,0,1,1,28,1,1,70.4,0 +1,0,0,0,1,1,1,69.8,1 +0,0,1,0,21,1,1,94.3,0 +1,1,1,0,51,1,1,93.8,1 +0,0,1,1,53,1,0,19.55,0 +1,0,0,1,53,1,0,95.95,0 +1,0,1,0,24,1,1,101.05,1 +0,0,1,0,70,1,1,94.8,0 +1,0,0,0,61,1,1,107.75,0 +0,0,0,0,11,1,1,54.6,0 +1,0,0,0,2,1,1,71.3,0 +1,0,0,0,25,1,1,19.5,0 +0,0,0,0,41,1,1,56.3,0 +1,0,1,0,18,1,1,94.7,1 +1,1,1,0,72,1,1,104.15,1 +0,0,1,1,71,1,1,90.55,0 +0,0,1,1,34,1,1,60.8,0 +1,0,0,0,29,1,1,98.8,0 +1,1,1,0,40,1,1,98.15,0 +1,0,1,0,36,0,0,35.35,0 +0,0,1,0,46,1,1,103.15,0 +0,0,0,0,58,1,1,107.75,0 +1,0,0,0,39,1,0,81.4,0 +1,0,1,1,4,1,0,61.45,1 +0,0,1,1,52,1,1,95.7,0 +1,1,1,0,70,1,1,104.8,0 +1,1,1,0,65,1,1,70.95,0 +1,0,0,0,1,1,1,44.95,0 +0,0,1,0,70,1,1,97.65,0 +0,1,1,1,29,0,1,35.65,0 +1,0,0,0,1,1,1,90.55,1 +0,0,0,0,67,1,1,85.25,0 +0,0,0,0,1,1,1,19.5,0 +0,0,0,0,26,1,1,88.8,1 +0,0,1,1,30,1,1,25.1,0 +0,0,1,0,48,1,1,100.05,0 +0,0,1,1,55,1,0,55.7,0 +1,0,0,0,7,1,1,85.2,1 +1,0,0,0,37,1,1,91.15,0 +0,0,1,0,31,1,1,83.85,0 +1,0,0,0,4,1,1,45.9,0 +1,0,1,1,72,1,1,25.1,0 +1,1,0,0,5,1,1,91.4,1 +1,0,1,1,1,1,0,19.7,0 +0,1,0,0,15,1,1,91.5,0 +1,0,1,1,8,1,1,51.3,0 +0,0,0,0,35,1,0,21.1,0 +0,1,0,0,56,1,0,104.75,0 +1,0,1,0,42,1,1,106.15,1 +1,1,1,1,65,1,1,85.75,0 +0,0,1,1,2,1,0,20.3,0 +1,1,1,0,65,1,1,100.75,0 +0,0,0,0,18,1,1,74.15,0 +0,0,0,0,23,1,1,78.55,0 +0,0,0,0,4,1,1,45.3,1 +1,0,1,0,70,1,0,19.85,0 +0,0,0,0,4,1,0,50.7,0 +1,0,0,0,19,1,1,45.0,0 +0,0,0,0,18,1,0,77.8,0 +0,1,1,0,38,1,1,83.45,0 +1,0,0,0,2,1,1,73.25,1 +1,0,0,0,47,1,0,94.8,0 +0,0,1,1,52,1,0,20.1,0 +1,0,0,0,9,1,0,59.9,0 +0,0,1,0,26,1,1,90.1,0 +1,0,1,1,8,1,1,51.05,1 +1,0,1,0,44,1,1,70.95,0 +0,0,0,0,3,0,0,29.2,0 +1,0,0,0,2,1,1,46.6,0 +0,0,1,1,9,1,1,85.35,1 +1,1,0,0,1,1,1,75.35,1 +1,0,0,0,25,1,0,74.3,0 +0,1,1,0,2,1,1,69.3,0 +1,0,0,0,43,1,1,75.2,1 +0,0,0,0,1,1,0,20.9,1 +0,0,1,0,58,1,1,94.3,0 +0,0,1,1,59,1,1,76.45,0 +1,0,0,0,44,0,1,54.0,0 +1,0,0,0,66,1,1,104.25,0 +1,0,1,1,68,1,0,19.95,0 +1,0,0,0,9,0,1,24.95,0 +1,0,0,0,19,1,1,84.75,0 +1,0,0,0,4,1,0,19.75,0 +0,0,0,0,70,1,1,113.65,0 +1,0,0,0,1,1,1,44.9,0 +0,0,0,0,8,1,1,75.25,0 +1,0,0,0,53,1,0,24.6,0 +1,1,0,0,51,1,0,25.0,0 +1,0,1,1,11,1,0,20.95,0 +1,0,1,1,60,1,1,110.6,0 +1,0,0,0,17,1,1,55.5,0 +1,0,0,0,3,1,1,43.3,1 +1,0,1,0,70,1,1,109.5,1 +1,0,0,0,1,1,0,19.45,0 +1,1,0,0,43,1,1,84.85,0 +0,0,1,0,16,1,0,19.6,0 +0,0,1,1,57,1,0,53.45,0 +1,0,1,1,37,1,0,19.8,0 +0,0,1,0,72,1,0,112.1,0 +0,1,0,0,11,1,1,84.8,1 +0,1,1,0,50,1,1,95.05,1 +1,1,0,0,5,1,0,50.35,1 +1,0,1,0,1,1,1,74.6,1 +1,0,0,0,16,1,1,19.7,1 +1,1,1,0,2,1,1,74.2,0 +0,0,0,0,17,1,1,69.0,0 +0,0,0,0,16,1,0,19.35,0 +0,0,0,0,15,1,1,59.45,1 +0,0,0,0,10,1,1,19.8,0 +0,0,0,1,46,1,1,105.2,1 +1,0,1,1,64,1,1,109.2,0 +0,0,0,0,1,1,1,79.15,0 +1,0,1,1,25,1,0,53.65,0 +1,0,1,1,71,1,0,100.2,0 +1,0,0,0,8,1,1,45.15,1 +0,0,1,1,72,1,1,108.65,0 +0,0,1,0,49,0,0,40.65,0 +1,0,1,1,29,0,1,55.35,0 +1,0,1,0,72,1,0,105.6,0 +1,0,1,0,31,1,0,93.8,1 +0,0,0,0,50,1,1,95.7,0 +1,0,1,0,71,1,0,83.2,0 +1,1,1,0,70,1,0,90.05,0 +1,0,0,0,71,1,0,97.65,0 +1,0,1,1,61,1,1,68.05,0 +1,0,0,0,32,1,1,96.2,1 +0,0,0,1,1,1,1,79.6,1 +1,0,0,0,68,1,1,102.1,0 +1,0,0,0,62,1,0,23.4,0 +0,0,0,1,7,1,1,71.05,0 +1,0,0,0,20,1,1,85.25,1 +1,0,1,1,6,1,0,19.45,0 +0,1,0,0,33,0,1,59.45,0 +1,0,1,1,28,1,0,92.2,0 +1,0,0,0,27,1,0,19.85,0 +1,0,0,0,7,1,0,43.9,0 +1,0,0,0,26,1,1,80.5,1 +1,1,0,0,5,1,1,89.8,1 +1,1,0,0,30,1,1,90.5,0 +1,0,0,0,63,1,0,90.45,0 +1,0,0,0,1,1,1,50.75,1 +0,0,0,1,53,1,1,84.6,0 +0,0,1,1,14,1,1,89.65,1 +0,0,0,0,21,1,1,99.15,0 +1,0,0,0,17,1,0,19.95,0 +1,0,1,1,16,1,0,20.5,0 +0,0,0,0,35,1,1,62.1,0 +0,1,0,0,32,1,1,79.5,0 +0,0,1,1,28,1,1,19.55,0 +0,0,0,0,1,1,1,20.35,0 +1,0,0,0,59,0,1,51.7,0 +0,0,1,1,72,1,1,23.3,0 +1,0,0,0,36,1,1,65.4,1 +0,0,0,0,40,1,0,65.1,0 +1,0,1,1,40,1,1,81.2,0 +0,0,0,1,9,1,1,72.9,1 +1,0,1,1,63,1,0,74.5,0 +0,0,0,0,3,1,1,80.5,0 +1,0,1,1,40,0,0,60.3,0 +1,0,1,0,8,1,1,75.0,0 +1,1,1,0,34,1,0,90.15,0 +1,0,0,0,5,0,0,40.0,1 +1,1,0,0,9,1,1,99.45,1 +1,0,1,0,9,1,1,69.05,0 +1,0,1,1,31,1,0,59.7,0 +0,0,1,0,50,1,1,19.85,0 +0,0,0,0,2,1,1,86.25,1 +0,0,0,0,1,1,1,45.65,1 +1,0,0,0,8,1,1,70.1,1 +0,0,0,0,9,0,0,40.75,0 +0,1,0,0,2,1,1,70.2,1 +0,0,0,0,3,1,0,55.35,1 +1,0,1,0,25,1,1,95.7,0 +1,1,0,0,1,1,0,46.3,0 +0,0,1,1,45,1,0,81.3,0 +1,1,1,1,51,1,1,84.2,1 +0,0,1,1,55,1,0,20.0,0 +0,0,0,0,38,1,1,66.15,0 +1,0,0,0,2,1,0,45.85,1 +1,0,1,1,38,1,0,19.6,0 +1,0,0,0,34,1,1,49.8,0 +0,0,1,0,70,1,1,101.75,0 +0,0,0,0,13,1,0,55.15,0 +1,0,0,0,39,1,0,75.25,1 +0,0,0,0,61,1,1,103.95,0 +0,0,0,0,12,1,1,100.15,1 +1,0,0,0,41,1,1,99.65,0 +1,0,0,0,21,1,1,73.7,0 +1,1,0,0,55,0,1,50.05,0 +1,0,1,0,69,0,0,60.25,0 +1,1,1,1,26,1,0,105.75,1 +0,1,1,0,69,1,0,87.3,0 +0,1,1,0,18,0,1,48.35,1 +1,0,1,1,47,1,0,54.25,0 +0,0,1,1,72,1,0,85.3,0 +1,1,1,0,33,0,1,50.0,0 +0,0,1,1,2,0,1,24.4,1 +0,0,1,1,72,1,0,90.95,0 +1,1,1,0,37,1,1,72.25,0 +0,1,1,1,62,1,1,96.1,0 +0,0,1,0,71,1,0,19.85,0 +1,0,0,1,23,1,1,55.3,0 +0,0,0,0,16,1,0,20.1,0 +1,0,0,0,9,1,1,69.5,0 +1,0,1,1,17,1,1,25.15,0 +0,0,0,0,4,1,0,20.95,1 +0,1,1,0,1,1,1,49.55,1 +0,0,1,0,24,1,1,79.65,0 +0,1,0,0,1,1,1,71.25,0 +1,1,0,0,72,1,0,113.8,0 +0,0,1,0,72,1,0,24.55,0 +0,0,0,1,11,1,0,19.7,0 +1,0,0,0,9,1,0,20.25,1 +0,1,1,0,2,1,0,50.15,1 +0,1,1,0,60,1,1,100.5,0 +1,1,1,0,29,1,1,95.9,1 +0,0,0,0,49,1,1,74.45,0 +0,1,0,0,30,1,1,104.1,0 +0,0,1,0,53,1,0,19.05,0 +1,0,0,1,39,1,0,25.0,0 +0,0,0,0,9,1,0,19.05,0 +1,0,0,0,39,1,0,81.9,0 +1,1,0,0,8,1,1,69.7,0 +0,0,1,1,51,1,1,90.15,0 +1,0,1,1,71,1,0,25.35,0 +1,1,0,0,71,1,1,24.65,0 +0,1,1,0,70,1,1,19.55,0 +0,1,0,0,1,0,0,25.25,1 +1,0,1,0,38,0,1,60.0,0 +0,0,1,0,28,1,0,89.9,0 +0,0,1,0,32,1,0,19.4,0 +1,1,1,0,49,1,0,49.8,0 +0,0,1,1,37,1,1,24.1,0 +0,0,0,0,10,1,0,54.25,0 +1,0,1,0,67,1,0,109.9,0 +1,0,0,0,7,0,1,35.5,0 +0,0,0,0,51,1,0,87.55,0 +0,0,0,0,9,1,0,45.15,1 +0,0,0,0,9,1,1,88.4,0 +1,0,0,0,4,1,1,50.8,0 +1,0,1,0,71,1,1,99.0,0 +0,0,1,1,50,1,1,84.4,1 +0,1,1,1,24,1,1,96.55,0 +1,0,1,0,22,1,1,59.75,0 +1,0,0,0,44,1,1,111.5,0 +0,0,1,1,33,1,0,24.25,0 +0,0,0,0,1,1,1,75.1,1 +0,0,1,0,54,1,1,70.15,1 +1,0,0,0,42,1,1,101.75,1 +0,0,0,0,1,1,0,45.8,1 +0,0,0,0,1,1,0,20.5,0 +1,0,0,0,30,1,0,70.4,0 +0,0,0,0,1,0,0,30.55,0 +1,0,1,1,16,1,0,84.9,0 +1,0,0,0,1,1,1,20.1,1 +1,0,1,0,9,0,0,40.65,1 +1,1,1,0,46,1,1,101.0,1 +1,0,0,0,1,1,1,69.1,1 +1,0,1,0,71,1,0,54.5,0 +1,0,0,0,43,1,1,75.35,0 +1,0,1,0,50,0,1,44.45,0 +0,0,0,0,13,1,1,75.0,1 +1,0,1,1,19,1,0,100.0,1 +0,0,0,0,41,1,0,98.05,0 +0,1,0,0,1,1,1,71.15,1 +0,0,0,0,24,0,1,54.15,1 +0,0,1,0,40,1,0,63.9,0 +0,0,1,1,3,1,1,69.15,0 +0,0,0,0,37,1,0,64.65,0 +0,0,1,1,67,1,1,108.75,1 +0,0,1,1,32,1,1,98.85,0 +0,0,1,0,6,1,1,49.15,1 +0,0,1,1,32,1,0,89.6,0 +0,0,0,0,59,1,1,83.25,0 +0,0,1,0,30,1,0,70.25,0 +1,0,0,1,20,1,1,19.4,1 +0,0,1,1,27,1,0,24.5,0 +0,1,0,0,20,1,1,79.15,1 +1,0,0,1,9,1,0,20.1,0 +0,0,1,1,68,1,1,73.0,0 +0,0,1,1,69,1,0,61.4,0 +1,0,0,0,26,1,1,84.3,0 +1,0,1,1,69,1,0,19.9,0 +1,0,0,0,11,1,0,20.4,0 +1,0,0,0,1,1,0,50.75,0 +1,0,1,1,10,1,0,20.45,0 +0,0,1,1,55,1,1,75.75,0 +1,0,0,0,44,1,0,65.4,0 +1,1,1,0,46,1,1,80.4,1 +1,0,1,1,69,1,1,59.75,0 +1,1,0,0,11,1,1,78.5,0 +0,0,1,0,11,1,1,102.0,1 +1,0,0,0,29,1,0,48.95,0 +0,0,1,0,57,1,1,99.65,0 +1,0,0,0,28,1,0,18.25,0 +0,0,0,0,42,1,0,54.55,0 +0,0,0,0,2,1,0,20.65,1 +1,0,0,1,23,0,0,40.65,0 +0,0,1,1,18,1,0,20.45,0 +1,0,1,1,62,1,0,24.8,0 +0,0,0,0,1,1,1,70.8,1 +1,0,0,0,16,1,1,89.05,1 +0,0,0,0,3,1,1,96.6,1 +1,0,0,0,67,1,1,88.8,0 +1,0,0,0,62,1,1,20.05,0 +0,0,1,0,57,1,1,104.5,1 +1,0,0,0,2,1,1,69.8,0 +0,0,1,1,23,1,1,77.15,0 +0,0,0,1,25,0,0,35.05,0 +0,1,0,0,72,1,1,108.1,0 +0,0,1,0,2,1,1,84.05,0 +0,0,0,0,8,1,1,20.2,0 +0,0,0,0,5,1,1,50.6,1 +1,0,0,0,35,0,0,49.2,0 +1,0,0,0,24,1,0,24.6,0 +0,0,1,1,2,1,1,71.65,0 +1,0,1,1,72,1,1,104.9,0 +0,0,0,0,41,1,1,106.5,0 +1,0,0,1,4,1,0,49.35,1 +1,0,0,0,26,1,0,75.5,0 +1,0,0,0,7,1,1,94.25,1 +0,0,1,0,1,1,1,68.95,1 +0,0,1,1,4,1,1,58.5,0 +1,0,0,0,48,1,0,78.9,0 +1,1,0,0,2,1,1,93.85,1 +0,1,1,0,12,1,1,79.2,0 +1,0,1,0,60,1,1,109.45,0 +1,0,0,0,55,1,1,59.2,0 +1,0,0,0,1,0,0,29.15,0 +1,0,0,0,1,1,0,20.05,0 +1,0,0,0,4,1,1,76.05,1 +1,0,0,0,1,0,1,24.45,1 +0,0,0,0,42,1,0,66.5,0 +0,0,0,0,1,1,0,49.55,0 +1,0,0,0,7,1,1,89.35,1 +1,0,0,0,3,1,1,73.6,0 +0,0,1,0,72,1,1,82.65,0 +1,0,0,0,15,1,1,49.0,0 +1,0,1,0,4,1,1,80.35,1 +0,0,0,0,11,1,0,25.2,0 +0,0,0,0,5,1,0,25.45,0 +0,1,0,0,1,1,1,55.8,1 +1,0,1,0,72,1,1,110.9,0 +0,0,1,0,55,1,1,77.75,0 +0,0,1,1,40,1,1,26.2,0 +0,0,1,0,57,1,0,19.9,0 +1,0,0,0,1,1,1,79.05,1 +1,0,1,0,1,1,1,95.0,1 +0,0,0,0,1,0,0,25.2,1 +1,1,1,1,52,1,1,80.85,0 +1,1,0,0,41,1,1,98.4,1 +1,0,1,0,43,1,1,56.35,0 +0,0,1,1,47,1,0,19.3,0 +1,0,0,0,3,1,0,50.4,0 +1,1,1,1,66,1,0,79.4,1 +1,0,1,1,55,1,1,55.25,0 +1,0,0,0,29,1,0,19.1,0 +0,0,0,1,12,1,1,84.05,0 +0,0,1,0,66,1,1,105.2,0 +1,1,0,0,35,1,1,101.4,1 +1,1,1,0,10,1,1,89.8,1 +1,0,1,1,27,1,1,75.75,0 +0,0,0,0,58,1,1,95.3,0 +1,0,1,0,54,1,0,109.75,1 +1,0,0,0,9,1,0,19.85,0 +1,0,0,0,2,1,0,19.3,1 +1,0,0,0,6,1,1,69.1,0 +0,1,0,0,26,1,1,91.25,1 +0,0,0,0,9,1,0,20.25,0 +1,0,1,0,8,1,1,54.75,0 +1,0,0,0,12,1,1,81.45,0 +0,0,0,0,15,1,1,49.1,1 +1,0,1,0,43,1,1,80.2,0 +1,0,0,0,42,1,1,100.3,0 +0,0,0,0,31,1,0,65.25,1 +0,0,0,1,66,1,1,90.95,0 +0,1,0,0,18,1,1,85.45,1 +1,0,0,0,1,1,0,20.0,0 +1,0,1,0,61,1,1,94.1,1 +1,0,0,0,10,1,0,79.85,0 +1,1,0,0,1,1,1,71.65,1 +0,1,0,0,18,1,1,73.55,0 +1,0,1,0,24,1,1,104.65,1 +0,0,1,1,3,1,0,19.3,0 +1,0,0,0,50,1,0,20.15,0 +1,0,1,1,1,1,0,44.55,0 +1,0,0,0,2,1,1,54.45,0 +1,0,0,0,17,1,1,19.65,0 +1,0,1,1,69,1,1,105.0,0 +1,0,1,0,72,1,1,88.7,0 +0,0,0,0,3,1,1,74.25,1 +1,1,1,1,50,1,1,75.15,0 +0,0,0,0,53,1,0,20.25,0 +0,0,1,0,58,1,1,109.1,0 +1,0,0,0,46,0,1,30.75,0 +1,1,1,0,72,1,1,112.9,0 +0,1,0,0,1,1,1,74.2,1 +0,0,1,1,6,1,1,94.05,0 +1,0,1,0,72,1,0,78.85,0 +1,0,0,0,4,1,1,55.3,0 +0,0,1,1,52,1,0,19.35,0 +0,0,0,0,2,1,0,20.45,0 +0,0,1,0,65,1,0,19.35,0 +1,1,1,0,43,1,1,101.0,1 +1,0,1,0,4,1,1,100.2,1 +1,1,1,0,25,1,1,89.05,1 +0,0,1,0,51,1,1,78.65,0 +1,0,0,0,12,1,0,74.75,0 +0,0,1,1,57,1,1,70.1,1 +0,0,1,1,24,1,0,19.9,0 +0,0,1,0,64,1,0,58.35,0 +0,0,0,0,4,1,1,105.65,1 +0,0,0,0,26,1,1,100.5,0 +0,0,1,1,15,1,0,20.05,0 +1,1,1,0,64,1,0,25.65,0 +1,1,1,0,36,1,1,96.5,1 +0,0,1,0,27,1,0,95.0,0 +1,1,1,0,1,1,0,70.85,1 +0,0,0,0,35,1,1,85.95,1 +1,0,0,0,4,1,1,73.9,1 +0,0,1,1,8,1,1,45.45,0 +1,0,0,0,10,1,1,20.0,0 +0,0,0,0,2,1,0,49.2,0 +0,0,1,0,58,1,1,109.45,1 +1,0,1,0,51,1,1,83.25,0 +0,0,1,1,46,1,1,19.25,0 +1,0,0,0,1,1,1,19.65,0 +1,0,0,0,46,1,0,72.8,0 +0,0,1,0,50,1,1,109.65,0 +1,0,1,1,53,1,0,65.0,0 +1,0,1,0,61,1,1,114.1,0 +1,0,0,0,5,1,0,20.65,0 +1,0,0,0,47,1,1,86.95,0 +0,0,0,0,54,1,1,94.75,0 +1,0,0,1,19,0,1,25.35,0 +0,0,0,1,26,1,1,105.45,0 +1,0,1,1,70,1,0,25.4,0 +1,0,1,0,17,1,1,102.55,0 +0,0,0,0,30,1,1,100.2,1 +0,0,0,1,1,1,0,24.0,0 +0,0,1,1,19,1,0,25.6,0 +0,0,1,0,26,1,1,73.5,0 +0,0,1,1,21,1,1,74.05,1 +1,0,1,0,50,1,1,98.25,0 +0,0,1,0,68,0,1,54.4,0 +1,0,0,0,3,1,1,101.55,1 +1,0,1,1,9,1,0,103.1,0 +0,0,1,1,51,0,0,34.2,0 +0,0,0,0,9,1,1,43.75,0 +1,1,1,1,41,1,1,111.95,1 +1,0,0,0,22,1,1,100.65,0 +0,0,1,1,21,0,1,55.95,1 +1,0,1,1,71,1,1,116.05,0 +1,0,0,0,1,1,0,45.75,1 +1,0,1,1,26,1,1,82.0,0 +1,0,1,0,71,1,0,65.15,0 +1,0,0,0,4,1,1,44.8,0 +0,0,0,0,12,1,1,79.8,0 +0,0,1,0,18,1,1,88.85,0 +0,0,0,0,3,1,1,74.95,0 +0,1,1,0,72,1,1,106.85,0 +1,0,0,0,11,1,0,74.95,1 +0,0,0,0,1,1,0,80.15,1 +1,0,0,0,13,1,0,19.3,0 +0,0,1,0,72,1,1,109.25,1 +1,0,1,0,42,1,0,56.1,0 +0,0,0,0,17,1,0,19.7,0 +0,1,0,0,7,1,1,51.3,0 +0,0,1,0,68,1,0,118.6,0 +1,0,1,1,56,1,0,24.15,0 +0,0,1,1,38,1,0,20.3,0 +0,0,1,1,72,1,1,115.5,0 +0,0,0,0,48,1,0,25.05,0 +0,1,1,0,52,1,1,109.1,0 +0,0,1,1,35,1,0,19.65,0 +1,0,1,0,67,1,1,111.3,0 +0,0,0,0,1,0,0,29.9,0 +1,0,0,0,53,1,1,80.6,0 +1,0,1,1,34,1,0,20.8,0 +0,0,0,0,3,0,0,35.2,1 +0,0,1,0,1,1,0,78.8,1 +1,0,0,0,19,1,0,89.95,0 +0,1,1,0,60,1,1,116.05,0 +1,0,0,0,11,1,0,19.55,0 +0,0,0,0,47,1,1,106.4,1 +1,0,0,0,18,1,0,49.4,1 +0,0,1,1,60,1,0,115.25,0 +1,0,1,0,72,1,0,24.8,0 +1,0,0,0,39,1,0,19.9,0 +0,0,1,0,59,1,1,81.25,0 +1,0,1,1,2,1,0,69.95,0 +1,1,0,0,1,1,0,69.1,1 +1,0,1,1,20,1,1,90.2,1 +0,0,0,0,6,1,1,93.55,1 +1,0,0,0,71,1,1,86.4,0 +0,0,1,0,24,1,0,66.3,0 +1,1,1,0,67,1,1,94.65,0 +1,0,0,0,1,1,1,80.85,1 +0,0,1,1,48,1,1,82.05,1 +0,0,1,0,37,1,0,72.1,0 +1,0,0,0,11,0,0,34.7,0 +1,0,1,0,3,1,1,20.55,1 +0,0,1,0,18,1,1,95.95,0 +1,0,1,1,50,1,1,44.8,0 +0,0,1,1,67,1,1,109.4,0 +0,0,1,0,25,1,1,71.05,0 +0,1,0,0,2,1,1,78.55,1 +1,0,0,0,9,1,0,19.7,0 +0,0,0,1,10,0,0,40.25,0 +0,0,1,0,70,1,0,19.85,0 +1,0,0,0,9,1,1,68.25,0 +0,0,0,0,4,1,1,20.15,0 +0,0,0,0,2,1,0,50.95,0 +0,0,0,1,1,1,0,78.65,1 +1,0,0,0,19,0,1,25.15,0 +1,0,1,1,7,1,1,20.25,0 +1,0,0,0,1,1,1,42.9,1 +1,1,0,0,1,1,0,44.0,0 +0,0,1,1,9,1,0,20.25,0 +0,0,0,0,3,0,0,34.25,1 +0,0,0,0,9,0,0,58.5,1 +0,0,0,0,5,1,0,55.8,0 +0,0,1,1,56,1,0,88.9,0 +0,0,0,1,18,1,0,57.65,0 +1,1,0,0,49,1,1,96.2,1 +1,0,1,0,70,1,0,79.15,0 +0,0,0,0,72,1,1,108.05,0 +0,1,0,0,6,1,0,74.4,1 +1,1,1,0,17,1,1,94.8,0 +1,0,1,0,29,0,1,45.9,0 +0,0,1,0,6,1,1,105.3,1 +1,0,1,0,63,1,0,102.6,0 +1,0,1,0,16,1,1,73.85,1 +1,0,0,0,59,1,1,61.35,0 +0,0,0,0,3,1,0,57.55,0 +0,0,0,0,8,0,1,29.25,0 +0,1,1,0,7,1,1,84.55,1 +0,0,0,0,68,1,0,19.6,0 +0,0,1,1,68,1,0,111.75,0 +0,1,1,0,52,1,1,106.5,0 +1,0,1,1,72,1,1,107.7,0 +0,0,1,0,32,1,0,19.3,0 +0,0,1,0,72,1,0,20.05,0 +1,0,1,1,1,1,1,69.95,0 +1,0,1,1,42,1,0,63.7,0 +0,0,0,0,25,1,0,24.75,1 +1,0,0,0,45,1,1,50.9,0 +0,0,1,1,43,0,1,60.4,0 +1,0,1,0,37,1,0,79.25,0 +0,1,0,0,20,1,1,85.8,1 +0,0,0,0,4,0,1,24.45,1 +1,0,1,0,63,1,1,110.1,0 +1,0,0,0,3,1,0,90.7,0 +1,0,1,1,66,1,1,25.3,0 +1,0,0,0,28,1,1,105.7,1 +0,1,0,0,8,1,0,85.2,0 +1,0,0,1,71,1,0,24.35,0 +1,0,0,0,1,0,1,24.25,1 +0,0,1,1,72,1,0,25.1,0 +1,1,1,0,16,1,1,54.55,0 +1,0,1,0,66,1,0,96.6,0 +0,0,0,0,11,1,1,76.5,1 +1,0,0,0,51,1,1,81.15,0 +0,0,0,1,8,0,1,38.5,0 +1,0,0,0,14,1,1,92.9,0 +0,0,0,0,4,1,1,93.5,1 +0,0,0,0,70,1,0,84.7,0 +0,0,0,1,70,1,0,66.0,0 +0,1,1,0,54,1,1,101.5,1 +1,0,0,1,28,1,1,74.9,1 +1,0,0,0,24,1,0,20.75,0 +0,0,1,0,69,1,1,61.45,0 +1,0,1,1,42,1,0,54.5,0 +0,1,0,0,2,1,1,69.6,1 +0,1,0,0,39,1,1,99.75,0 +1,0,1,1,45,1,1,109.75,0 +1,0,1,1,72,1,1,80.85,0 +0,0,0,0,38,1,0,20.3,0 +1,0,1,0,72,1,1,67.8,0 +1,0,0,0,1,1,1,24.05,1 +1,0,1,1,72,1,1,19.8,0 +1,0,1,0,55,1,0,25.7,0 +0,0,1,1,51,0,1,56.15,0 +1,0,0,0,63,1,1,86.7,0 +0,0,0,0,1,1,0,20.4,0 +0,0,1,1,23,1,1,19.65,0 +0,0,0,0,1,1,0,50.55,1 +0,0,0,0,2,1,1,54.35,0 +0,1,0,0,52,1,0,108.1,0 +0,0,0,0,36,1,0,54.45,0 +0,0,0,0,1,1,0,45.35,0 +0,0,0,0,28,1,0,59.0,0 +0,0,1,1,7,1,0,69.45,0 +1,0,0,0,14,1,1,100.55,1 +1,1,1,0,72,0,1,64.95,0 +0,0,1,1,1,1,1,20.5,1 +0,0,0,0,10,1,0,18.85,0 +1,0,0,0,42,1,0,19.8,0 +0,0,0,0,7,0,0,25.05,0 +1,0,0,0,4,1,1,74.8,1 +1,0,1,1,72,1,1,114.3,0 +0,0,1,0,20,0,1,24.45,1 +1,0,0,0,63,1,0,109.2,0 +0,0,0,0,56,0,0,45.05,0 +0,0,0,1,5,1,1,51.0,0 +0,0,1,0,72,1,1,110.45,0 +1,1,1,1,68,1,1,84.65,0 +1,0,1,1,67,1,0,60.05,0 +1,0,1,1,8,1,0,44.65,0 +1,0,1,1,52,1,1,93.25,0 +0,0,1,1,18,1,1,20.25,0 +0,0,1,1,59,1,0,25.45,0 +0,0,0,0,60,1,0,20.6,0 +1,0,0,0,7,1,1,94.1,0 +1,0,1,1,59,0,0,34.8,0 +1,0,0,0,46,0,1,60.75,0 +1,0,0,0,5,1,1,51.35,0 +1,1,1,0,59,0,1,64.05,0 +0,0,1,0,70,1,1,84.8,0 +0,0,0,0,14,1,1,71.0,1 +0,0,0,0,44,1,1,50.15,0 +0,0,1,0,64,1,1,94.6,0 +0,0,1,1,58,0,0,59.75,0 +0,1,1,0,46,1,0,100.25,0 +1,1,1,0,58,1,1,98.9,0 +0,0,1,0,72,1,1,97.7,0 +0,1,0,0,30,0,1,40.3,1 +1,1,0,0,11,1,0,60.25,0 +0,1,0,0,34,0,1,56.25,0 +1,0,0,0,54,0,0,46.2,0 +0,0,0,0,3,0,1,50.6,1 +0,0,1,1,72,1,0,24.9,0 +0,0,1,1,40,1,1,84.85,1 +0,0,1,1,2,1,0,65.7,1 +1,0,1,1,54,1,0,63.35,0 +0,0,0,0,14,1,0,50.1,0 +0,0,0,0,1,1,0,70.5,1 +0,0,0,0,10,1,1,94.85,1 +0,0,0,0,1,1,0,50.15,0 +1,0,0,0,1,1,0,19.75,1 +1,0,0,0,56,1,1,64.65,0 +0,0,1,0,68,1,1,79.6,0 +0,0,1,1,14,1,1,19.5,0 +1,0,1,1,68,1,1,99.55,0 +1,1,1,0,55,1,1,74.0,0 +0,0,0,0,16,0,1,38.9,0 +1,1,0,0,9,1,1,79.55,0 +1,0,1,1,14,1,1,65.45,1 +1,1,1,0,58,1,1,98.7,1 +1,0,0,0,53,0,1,46.3,0 +1,0,1,0,70,1,1,99.35,0 +0,1,1,1,14,1,1,95.8,0 +1,0,1,1,22,1,1,67.5,1 +0,0,1,0,10,1,1,78.15,0 +0,0,1,1,29,1,0,26.1,0 +0,0,0,0,1,1,1,69.6,1 +1,0,1,0,49,1,0,84.35,1 +0,1,1,0,68,1,1,100.2,1 +0,0,0,0,1,1,0,78.05,1 +0,0,0,0,30,0,1,40.35,0 +0,0,1,0,72,1,0,79.2,0 +0,0,0,0,10,1,1,20.9,0 +1,0,0,0,7,1,0,73.6,1 +0,0,0,0,9,1,1,74.75,1 +0,0,0,1,1,1,0,49.9,0 +0,0,0,0,20,1,1,68.9,0 +0,0,0,0,1,1,1,20.25,0 +0,0,0,0,29,1,1,76.0,0 +1,0,0,0,1,1,0,74.0,0 +1,0,0,0,3,1,1,82.3,0 +0,0,0,0,20,1,1,89.4,0 +1,0,0,1,64,1,1,99.15,0 +1,0,0,0,1,1,1,20.2,1 +0,0,0,0,6,0,0,29.45,0 +1,0,1,0,50,1,0,19.8,0 +1,0,0,0,6,1,1,59.15,0 +1,0,1,1,7,1,0,44.75,0 +1,0,1,1,72,1,1,90.8,0 +1,0,1,0,8,1,1,49.55,0 +0,0,1,1,67,1,0,106.7,0 +0,1,1,0,24,1,1,93.55,1 +0,0,1,0,72,1,1,94.45,0 +1,0,1,1,33,1,1,19.45,0 +1,0,0,0,2,0,1,25.05,1 +1,0,1,0,70,1,0,67.95,0 +0,0,0,0,22,1,0,65.25,0 +0,0,0,0,59,1,1,99.45,0 +1,0,0,0,36,1,1,20.35,0 +0,0,1,1,51,1,0,19.95,0 +1,0,1,0,53,1,0,77.4,0 +0,0,1,1,20,1,0,19.7,0 +1,0,1,0,63,1,0,99.7,0 +0,0,0,0,40,1,0,74.8,0 +1,0,0,0,35,1,1,19.15,0 +1,0,1,1,26,1,0,78.95,0 +1,1,1,0,27,1,1,95.55,1 +1,0,0,1,53,1,0,62.85,0 +1,1,1,0,34,1,0,71.55,0 +0,1,1,0,19,1,1,94.95,0 +1,0,1,0,43,1,1,86.1,0 +1,0,1,1,6,1,0,19.55,0 +1,0,0,1,56,1,1,24.8,0 +1,0,0,0,57,0,1,39.3,1 +1,0,1,1,34,1,1,84.05,0 +0,0,0,0,10,0,0,36.25,0 +0,0,0,0,1,1,1,20.25,1 +0,0,0,0,13,0,1,23.9,1 +1,0,0,0,56,1,0,98.6,0 +0,0,1,0,55,1,1,103.65,0 +0,0,1,1,36,1,1,92.9,0 +1,0,1,0,47,1,0,19.9,0 +0,0,1,1,12,1,1,20.1,0 +0,0,0,0,1,1,1,85.45,1 +1,1,0,0,24,1,1,80.5,0 +0,0,0,0,63,1,0,99.9,1 +0,1,0,0,35,0,1,39.85,0 +0,0,0,0,67,1,0,60.5,0 +1,0,0,0,25,1,1,84.8,1 +1,0,0,0,21,1,0,103.85,0 +0,0,0,0,13,1,0,67.8,0 +1,0,1,0,35,1,1,75.2,1 +1,1,1,0,71,1,0,24.85,0 +0,0,0,0,29,1,0,19.35,0 +1,0,1,0,71,0,0,49.35,1 +1,1,1,0,7,1,1,89.0,0 +0,1,0,0,57,0,1,55.0,0 +1,0,1,0,65,1,0,76.15,0 +1,0,0,0,27,1,0,20.3,0 +1,0,0,0,6,1,1,74.9,1 +0,1,0,0,72,1,1,117.35,0 +1,0,0,0,1,1,1,19.75,0 +1,0,0,0,11,1,0,45.2,0 +1,0,1,1,39,1,0,25.2,0 +0,1,0,0,59,1,1,89.75,0 +1,0,0,0,26,1,0,75.0,0 +1,1,0,0,2,1,0,49.95,0 +0,0,1,1,72,0,0,65.7,0 +1,0,1,0,65,1,0,67.05,0 +1,0,1,1,72,1,0,110.9,0 +1,0,0,0,6,1,1,87.95,0 +1,1,0,0,32,1,0,19.8,0 +0,0,1,0,50,1,0,75.7,0 +1,0,1,0,61,0,1,62.15,0 +0,0,0,0,15,1,1,101.25,1 +1,0,1,0,72,1,0,115.15,0 +1,0,0,0,9,1,1,18.95,1 +0,0,0,0,1,1,0,19.5,0 +0,0,0,0,12,1,1,86.55,0 +0,0,0,0,37,0,0,28.6,1 +1,0,1,1,61,1,0,20.4,0 +1,0,1,1,18,1,0,19.8,0 +1,0,0,1,21,1,0,45.65,0 +1,0,1,1,68,0,1,56.4,0 +1,1,0,0,12,1,1,73.3,0 +0,1,0,0,2,0,0,24.35,1 +0,0,1,0,62,1,1,101.35,0 +0,1,0,0,29,1,0,98.65,1 +1,0,0,1,1,0,0,33.6,0 +1,1,1,0,5,1,1,79.9,1 +0,0,0,0,1,1,0,20.7,0 +1,0,0,1,62,1,1,104.05,0 +0,0,1,1,36,1,0,20.25,0 +0,1,0,0,28,1,1,103.3,1 +0,0,1,1,69,1,0,73.7,0 +0,0,1,0,11,1,1,96.2,1 +0,0,1,0,63,1,1,108.75,0 +1,0,0,0,23,1,0,20.15,0 +1,0,0,0,10,1,0,19.75,0 +0,0,1,0,71,1,1,25.95,0 +0,1,0,0,45,1,1,70.05,0 +0,0,1,1,70,1,0,24.05,0 +0,0,0,1,22,1,1,84.75,0 +0,0,1,1,52,1,0,23.05,0 +1,0,1,0,55,1,1,104.15,1 +0,0,0,0,65,0,0,59.95,0 +0,0,1,1,72,1,0,19.55,0 +1,0,1,0,10,1,0,19.6,0 +0,0,0,1,7,1,0,20.05,0 +1,1,0,0,5,1,1,85.55,0 +0,0,1,1,24,1,0,78.6,0 +0,0,1,1,72,1,1,116.8,0 +1,0,0,0,21,0,1,43.55,0 +1,0,1,0,69,0,1,60.8,0 +1,0,1,1,44,1,1,54.9,0 +0,1,1,1,61,1,1,65.2,0 +1,1,0,0,24,1,1,102.95,1 +0,0,0,0,1,1,0,90.6,1 +0,0,0,0,6,1,1,50.8,1 +1,0,0,0,4,1,1,90.05,1 +1,0,1,0,72,1,1,108.2,0 +1,0,0,0,72,1,0,92.0,0 +1,1,1,0,14,1,1,75.1,0 +1,0,0,0,7,1,1,25.05,0 +0,0,0,0,48,1,0,75.15,0 +1,0,1,1,55,1,0,19.5,0 +1,0,0,0,1,1,0,19.3,0 +1,0,0,0,45,1,0,112.2,0 +1,0,0,0,3,1,1,70.3,0 +0,0,1,0,71,1,0,19.6,0 +1,0,1,0,8,1,0,20.25,0 +0,0,1,0,3,1,1,75.85,1 +1,0,1,1,69,1,0,80.65,0 +1,0,1,1,1,1,1,68.5,1 +0,1,1,0,72,1,1,115.75,0 +1,0,0,0,11,1,1,73.5,1 +1,0,0,0,71,1,0,80.6,0 +0,0,0,0,1,1,1,69.95,1 +0,0,1,0,33,0,0,59.55,0 +0,0,0,0,16,1,0,19.05,0 +0,1,1,0,56,1,0,95.65,0 +0,0,0,0,1,1,0,19.95,0 +1,0,0,0,5,1,1,70.05,1 +1,0,1,1,57,1,0,19.4,0 +1,0,1,1,56,0,1,36.1,0 +1,0,0,0,8,1,1,94.0,1 +0,0,1,1,22,1,0,61.15,1 +0,0,0,0,1,1,0,19.75,0 +0,0,0,1,40,1,1,64.1,0 +1,0,1,1,46,1,0,19.75,0 +1,0,1,1,63,1,0,19.7,0 +1,0,1,1,68,1,1,110.2,0 +1,0,1,1,69,1,1,106.35,0 +0,0,1,0,56,1,0,90.55,0 +0,0,1,1,10,1,1,65.9,0 +1,0,0,0,63,1,0,104.5,0 +0,0,1,1,24,0,1,52.5,0 +0,0,0,0,19,1,1,56.1,0 +1,0,1,1,22,1,1,88.75,0 +1,0,1,0,29,1,1,84.45,1 +1,0,1,0,13,1,1,75.3,1 +0,0,1,0,70,1,1,26.0,0 +0,0,1,0,49,1,0,99.4,0 +0,1,1,0,43,1,1,109.55,1 +0,0,0,0,3,1,1,19.6,1 +1,0,1,1,42,1,0,73.15,0 +1,0,0,0,57,1,1,54.65,0 +1,1,0,0,2,1,0,66.4,1 +0,0,1,0,72,1,1,115.55,0 +0,1,0,0,46,1,1,104.45,0 +1,1,1,0,66,1,1,100.05,1 +1,0,0,0,62,1,0,102.0,1 +0,0,1,0,72,1,1,91.15,0 +1,0,1,1,35,1,1,89.7,0 +1,0,1,0,17,1,0,90.2,1 +0,0,1,0,72,1,1,92.4,0 +0,0,1,1,28,1,0,19.9,0 +1,0,1,0,56,1,1,25.15,1 +0,0,0,0,31,1,1,79.85,1 +1,0,0,0,45,1,0,18.85,0 +0,0,0,0,1,1,1,25.75,0 +0,0,0,0,2,1,1,49.6,1 +0,0,0,0,6,1,1,20.95,0 +0,0,1,0,48,1,1,97.05,0 +1,0,1,1,25,1,1,25.4,0 +1,0,1,1,64,1,1,19.7,0 +1,0,0,0,50,0,1,35.0,0 +0,0,1,1,52,1,0,101.25,0 +1,1,1,0,4,1,1,70.2,0 +0,1,0,0,32,1,0,90.95,0 +1,0,1,1,45,1,0,73.85,0 +1,0,1,0,9,1,1,88.05,0 +0,1,1,0,66,1,1,105.95,1 +1,0,0,1,3,1,0,91.85,1 +0,0,0,0,54,1,0,20.1,0 +0,0,1,1,1,0,0,40.1,1 +0,0,1,1,64,1,0,110.3,0 +0,1,0,0,31,1,1,73.9,1 +0,0,0,0,14,1,1,89.8,1 +0,0,0,0,12,1,1,85.15,0 +1,1,1,0,67,1,1,60.95,0 +0,0,1,1,35,1,0,72.25,1 +0,0,0,0,45,1,0,73.55,0 +1,0,0,0,10,1,0,46.0,0 +0,1,0,0,29,1,1,58.55,0 +0,0,0,0,24,1,0,24.6,0 +1,0,1,1,66,1,1,19.75,0 +1,0,0,0,51,1,0,86.35,0 +0,0,1,0,45,1,0,25.5,0 +0,0,1,0,49,1,0,19.0,0 +0,0,1,0,29,1,1,19.55,0 +1,0,1,1,40,1,1,110.1,0 +0,1,0,0,37,1,1,96.55,1 +1,0,0,0,25,1,0,69.75,0 +0,0,0,0,22,0,1,50.6,0 +1,0,0,0,72,0,1,65.6,0 +0,0,0,0,7,0,1,40.1,1 +1,0,1,1,33,1,0,82.1,0 +0,0,0,0,23,1,1,79.1,0 +1,1,0,0,24,1,1,101.25,1 +0,0,0,0,1,1,0,79.55,1 +1,0,0,0,69,1,0,90.65,0 +0,0,0,1,3,1,1,20.55,0 +1,0,0,0,56,1,1,75.75,0 +1,0,0,0,65,1,1,110.0,0 +1,0,1,0,71,1,0,20.85,0 +0,1,0,0,14,1,1,80.35,0 +0,0,0,0,2,1,1,70.15,0 +0,0,0,0,32,1,0,84.05,1 +1,0,0,0,40,1,0,67.45,0 +1,0,0,0,1,1,0,20.75,0 +1,0,0,0,1,1,1,89.1,1 +0,0,0,0,7,1,1,69.9,0 +0,0,1,0,15,1,1,51.1,0 +0,0,1,1,17,1,0,94.4,1 +1,0,0,0,19,1,1,78.25,1 +1,0,0,0,71,1,0,25.55,0 +0,0,1,1,54,1,0,60.0,0 +1,0,1,0,31,1,1,90.55,0 +0,0,0,0,11,1,0,76.4,0 +0,1,0,0,18,1,1,84.95,0 +0,1,0,0,72,1,1,110.1,0 +0,1,0,0,71,1,1,99.65,0 +1,1,0,0,5,0,0,45.4,0 +1,0,1,0,38,1,0,69.0,0 +1,0,0,1,5,1,1,48.65,0 +1,1,0,0,2,1,1,44.15,1 +0,1,0,0,52,1,0,59.85,0 +0,1,0,0,8,1,1,75.75,1 +0,0,0,0,68,1,1,80.65,0 +1,0,1,1,69,1,1,20.55,0 +0,0,1,0,42,1,1,66.4,0 +0,0,0,0,50,1,1,100.2,0 +0,0,0,0,1,1,1,19.1,1 +1,1,1,0,1,1,1,80.3,1 +1,0,1,0,33,1,1,44.55,0 +0,0,0,0,7,1,0,20.35,0 +1,0,1,1,64,1,1,91.8,0 +0,0,0,0,1,1,1,74.9,1 +1,0,0,0,59,1,1,20.2,0 +0,0,1,0,6,1,0,50.35,0 +0,0,0,0,3,1,0,18.8,0 +0,0,1,0,15,1,0,20.45,0 +1,0,1,1,13,1,1,64.75,0 +0,0,0,0,23,1,1,98.7,0 +1,1,1,0,31,1,0,89.45,0 +1,0,0,0,29,1,1,58.75,0 +0,0,1,0,49,1,0,20.7,0 +0,0,1,0,56,1,1,85.6,0 +0,0,0,0,63,1,1,80.3,0 +1,0,1,0,63,1,0,79.8,0 +1,1,1,1,24,1,1,79.85,0 +1,1,1,0,36,1,0,54.1,0 +0,1,0,0,9,1,1,80.85,1 +1,0,0,0,3,0,0,24.75,1 +0,0,1,0,21,1,0,80.9,0 +1,0,1,1,13,1,0,24.5,0 +1,0,1,1,1,1,1,20.15,0 +0,0,1,1,25,1,0,20.05,0 +1,0,1,1,71,1,1,19.6,0 +1,0,0,0,66,1,1,114.3,0 +0,0,0,0,45,1,1,100.3,0 +0,0,1,0,22,1,1,80.0,0 +0,0,1,0,67,1,1,20.85,0 +0,0,1,0,68,1,1,89.95,0 +0,1,0,0,49,1,1,90.85,1 +0,1,0,0,4,1,0,48.75,0 +1,0,1,0,63,1,0,80.0,0 +0,0,1,0,2,1,0,79.7,1 +1,0,0,0,21,1,1,20.35,0 +1,0,1,1,55,1,0,57.55,1 +1,0,0,1,1,1,1,20.25,0 +0,0,0,0,17,1,0,19.4,0 +1,0,0,0,30,1,1,100.4,0 +1,0,1,1,22,1,1,57.95,0 +0,0,0,0,9,1,1,59.5,0 +1,0,1,1,1,1,0,19.2,0 +0,0,1,0,21,1,1,86.5,1 +1,0,0,0,19,1,0,59.55,0 +0,0,1,1,69,1,1,103.95,1 +1,1,0,0,1,0,1,25.1,1 +0,0,1,0,72,1,1,103.95,0 +1,0,1,1,70,1,0,68.95,0 +0,0,0,0,66,1,1,103.1,0 +0,0,1,1,7,0,1,24.7,0 +0,1,1,1,46,1,1,110.2,0 +1,0,0,0,39,0,1,48.95,1 +0,0,1,1,32,1,0,62.45,0 +1,0,0,0,24,1,1,89.55,0 +1,0,1,1,6,1,1,83.55,1 +0,0,0,0,37,1,1,78.9,0 +1,0,0,1,8,1,0,20.35,0 +0,0,1,1,72,1,1,71.45,0 +1,1,1,0,71,0,0,46.35,0 +0,0,1,0,16,1,1,94.65,0 +0,0,1,0,57,0,1,49.9,0 +1,0,0,0,66,1,0,25.45,0 +0,1,0,0,17,1,1,89.15,1 +0,0,0,1,21,1,0,20.75,0 +1,0,1,0,66,1,1,66.1,0 +0,0,1,0,17,1,1,75.4,0 +1,0,0,1,1,1,1,70.45,1 +1,0,1,0,58,1,0,60.3,1 +0,0,1,1,8,1,0,21.05,0 +1,0,0,0,27,1,0,69.35,0 +1,0,1,0,34,1,0,88.85,0 +1,0,0,0,30,1,1,97.0,0 +1,0,0,0,33,1,1,66.4,0 +1,0,0,1,1,0,0,24.75,1 +1,0,1,1,14,1,0,69.2,0 +0,0,0,1,16,1,1,79.5,0 +0,0,0,0,49,1,0,100.65,0 +1,0,1,1,19,1,0,103.3,1 +0,0,1,1,70,1,0,79.7,0 +0,0,1,1,32,1,0,61.4,0 +0,0,0,0,18,1,1,69.8,0 +1,0,0,0,37,0,1,40.55,0 +0,0,0,0,4,1,1,75.65,0 +0,0,1,0,16,1,0,90.7,0 +1,0,1,0,17,1,1,80.5,0 +0,0,0,1,19,1,1,60.6,0 +1,0,1,0,60,1,0,101.15,0 +1,0,1,1,51,1,1,24.95,0 +1,0,1,1,28,1,1,20.3,0 +1,0,0,0,43,1,1,60.0,0 +1,0,1,0,42,1,0,20.25,0 +1,0,0,0,3,1,1,78.5,1 +0,0,0,0,1,1,0,44.75,0 +0,0,0,0,3,1,0,19.85,1 +0,0,0,0,63,1,0,98.0,0 +1,1,0,0,3,1,1,79.9,1 +1,0,1,0,68,1,1,107.7,0 +0,1,0,0,30,1,1,99.7,1 +0,0,0,0,60,1,0,104.7,0 +1,0,0,0,15,1,1,58.6,1 +1,1,0,0,45,1,1,93.9,0 +0,0,1,0,70,1,0,86.45,0 +1,0,1,0,10,1,1,98.5,1 +1,0,0,0,4,1,0,19.4,0 +0,0,0,0,1,1,1,50.45,1 +0,0,1,0,68,1,1,24.95,0 +1,0,1,1,22,1,0,75.0,0 +1,0,1,1,38,1,1,94.65,1 +0,0,0,0,1,1,1,100.25,1 +1,0,1,0,18,1,0,78.2,0 +1,0,0,0,29,1,1,94.2,0 +0,0,0,0,16,1,1,88.45,1 +1,0,0,0,1,1,1,69.85,1 +1,0,0,0,12,1,0,81.7,1 +1,0,0,0,31,0,1,50.05,0 +1,0,0,0,4,1,1,79.9,1 +0,0,1,0,48,1,1,69.55,0 +0,0,0,0,15,1,1,25.4,1 +1,0,0,0,50,1,1,90.1,0 +1,0,0,0,7,1,1,44.65,0 +1,1,1,0,41,1,1,83.75,1 +1,0,1,1,68,1,0,80.35,0 +0,1,1,0,26,1,1,98.1,0 +1,0,0,0,57,0,0,53.35,0 +0,0,0,0,3,1,0,19.55,0 +0,0,0,0,1,1,0,20.9,1 +1,0,1,1,19,1,1,48.95,0 +0,0,0,0,3,1,1,54.2,0 +0,0,0,0,59,1,0,24.45,0 +0,0,1,0,1,1,1,69.4,1 +1,0,1,0,42,0,1,40.15,0 +0,0,0,0,7,1,1,74.9,1 +1,0,1,0,67,1,0,25.6,0 +1,0,0,0,1,1,1,70.35,0 +1,0,1,0,66,1,0,91.7,0 +0,0,0,0,61,1,0,89.2,0 +1,0,1,1,4,1,0,24.1,0 +0,1,1,0,42,1,1,74.15,1 +0,0,1,1,64,1,1,53.85,0 +0,1,1,0,54,1,1,115.6,0 +1,0,0,0,1,1,1,19.75,0 +1,0,1,1,54,1,1,24.05,0 +0,0,0,1,18,1,0,25.3,0 +1,0,0,0,3,1,0,84.3,0 +0,0,0,0,1,1,1,70.1,1 +0,0,1,1,72,1,0,89.75,0 +1,1,1,0,60,1,1,97.95,0 +0,0,1,1,11,1,1,20.0,0 +0,0,0,1,12,1,1,78.3,1 +1,0,1,1,61,1,0,103.9,0 +0,0,0,0,39,1,0,20.7,0 +1,0,0,0,55,1,1,96.8,1 +0,0,0,0,17,1,1,94.4,1 +1,0,0,0,37,1,0,20.15,0 +0,0,1,0,72,1,1,26.0,0 +1,1,1,0,72,1,0,77.35,0 +0,0,0,0,8,1,0,66.05,0 +0,0,1,1,22,1,0,19.9,0 +0,0,0,0,1,1,0,84.3,1 +0,0,0,0,38,1,0,68.15,0 +1,0,0,1,17,1,0,80.85,0 +0,1,0,0,70,1,1,75.5,0 +0,1,1,1,72,1,0,92.45,1 +0,0,0,0,28,1,1,80.6,0 +0,0,0,0,15,1,1,83.2,0 +1,0,1,1,72,1,1,87.55,0 +0,1,1,0,11,1,1,99.55,1 +1,1,0,0,8,1,1,81.25,1 +0,0,1,0,57,1,1,109.4,0 +1,0,1,1,1,1,0,19.95,1 +0,0,1,0,46,0,0,45.55,0 +1,0,1,0,30,1,0,20.7,0 +1,1,1,0,10,1,0,75.3,0 +1,0,1,0,23,1,1,99.25,1 +1,0,0,0,32,1,1,93.4,0 +1,0,0,0,13,1,1,73.75,0 +0,0,0,0,39,1,1,80.45,1 +0,0,0,0,44,1,1,88.15,0 +1,1,0,0,9,1,0,49.2,0 +0,0,1,0,67,1,0,19.65,0 +1,0,1,1,9,1,1,79.35,1 +0,0,0,0,15,1,1,79.75,1 +0,0,1,0,71,1,1,105.15,0 +1,0,0,0,1,1,0,49.0,0 +0,0,1,1,30,1,1,100.05,1 +1,0,0,0,1,1,1,69.35,1 +1,0,1,0,17,0,1,49.8,0 +0,0,0,0,3,1,0,85.8,1 +1,0,1,1,67,1,1,79.7,1 +1,0,0,0,1,1,0,20.95,0 +0,1,0,0,1,1,0,50.55,1 +0,1,1,0,32,1,0,79.3,0 +1,0,1,1,41,1,0,19.5,0 +1,0,1,0,1,1,1,80.55,1 +0,0,0,0,1,1,0,44.15,0 +0,0,1,1,12,1,1,84.5,1 +1,0,1,1,62,1,1,105.5,0 +0,0,0,0,22,1,1,84.3,1 +0,0,0,1,17,1,1,92.7,0 +0,0,1,1,72,1,1,26.25,0 +1,0,1,1,56,1,1,96.95,0 +0,0,0,0,9,1,1,20.45,0 +1,0,1,0,72,1,1,115.8,0 +1,0,0,0,20,1,1,108.2,0 +1,0,1,1,19,1,0,20.2,0 +1,0,0,0,2,1,1,67.75,1 +1,0,0,0,53,0,0,54.9,0 +0,1,0,0,27,1,1,85.25,1 +1,0,0,0,6,1,0,20.15,0 +1,0,1,1,9,1,1,90.35,0 +0,0,1,1,8,1,0,55.75,0 +0,0,1,1,71,1,0,114.6,0 +0,0,0,0,10,1,1,80.05,1 +1,0,0,0,1,1,0,20.0,1 +0,0,1,0,71,0,0,66.8,0 +1,0,1,0,68,1,1,100.3,0 +1,0,0,0,34,1,1,105.35,0 +1,0,0,0,26,1,1,85.2,0 +0,0,0,0,22,1,1,48.8,1 +1,0,0,0,7,1,1,18.95,0 +0,0,1,0,20,1,1,69.8,0 +0,0,1,0,60,1,1,106.15,0 +1,0,1,1,72,1,0,20.55,0 +0,1,1,0,72,1,1,105.75,0 +1,0,0,0,4,1,0,25.25,0 +1,0,1,1,16,1,0,19.75,0 +0,1,1,0,62,1,1,104.85,0 +0,0,0,0,10,1,1,60.95,0 +1,0,0,0,31,1,1,81.15,0 +0,0,1,0,71,1,0,19.1,0 +1,0,0,0,58,1,0,20.8,0 +1,0,1,1,70,1,1,90.15,0 +0,0,1,0,71,1,0,90.1,0 +1,1,0,0,69,1,0,74.1,0 +0,1,0,0,1,1,1,85.05,1 +0,0,1,1,72,1,1,118.75,0 +0,0,1,0,26,1,0,85.9,0 +0,0,1,0,33,1,1,95.0,0 +0,0,1,1,10,1,0,20.15,0 +0,1,0,0,57,1,0,101.3,0 +0,0,0,0,10,1,1,21.2,0 +0,0,1,1,39,1,1,24.2,0 +0,0,0,0,11,1,0,20.3,0 +0,0,1,1,21,1,1,102.8,1 +0,0,1,1,68,1,0,85.3,0 +1,0,0,0,18,1,1,89.6,0 +0,0,0,0,6,1,1,99.95,1 +1,0,0,0,18,1,0,56.25,0 +0,0,1,1,52,1,1,50.95,0 +1,0,1,1,56,1,0,115.85,0 +1,0,0,0,45,1,1,103.65,0 +0,0,0,0,67,1,1,26.1,0 +1,0,1,0,3,0,0,35.1,0 +1,1,0,0,65,1,1,99.1,0 +1,0,1,0,63,1,0,67.25,0 +0,0,1,1,11,1,0,25.0,0 +1,0,0,1,1,1,1,59.55,0 +1,0,0,0,55,1,1,77.8,0 +1,0,1,1,25,1,1,55.1,0 +1,0,1,0,72,1,1,117.8,1 +0,0,1,0,72,1,1,24.15,0 +0,0,0,1,65,0,0,45.25,0 +0,1,0,0,54,1,1,79.5,1 +1,0,1,1,7,1,0,20.25,0 +0,0,1,0,72,1,0,64.75,0 +1,0,1,0,21,1,0,54.6,0 +0,0,0,0,2,1,1,20.7,0 +1,1,0,0,4,1,1,94.75,0 +1,0,1,0,3,1,1,79.65,1 +1,0,1,0,72,1,0,115.8,0 +0,0,0,0,6,1,1,49.45,0 +1,0,0,0,52,1,1,83.8,0 +1,1,1,0,69,1,1,95.35,0 +1,0,0,0,8,1,1,94.7,1 +0,1,0,0,8,1,1,74.05,0 +0,1,0,0,63,1,1,89.6,0 +1,0,0,0,60,1,1,116.6,0 +0,0,1,0,12,1,0,54.2,0 +0,0,0,0,13,1,1,19.3,0 +1,0,0,0,22,1,0,65.05,0 +1,0,0,0,5,1,1,92.5,1 +0,0,1,1,1,1,0,19.45,1 +0,0,1,1,72,1,1,24.05,0 +0,0,0,0,2,1,0,18.75,0 +0,0,1,1,40,1,0,20.15,0 +1,0,1,1,44,1,0,20.0,0 +1,1,1,0,71,1,1,71.0,0 +0,0,0,0,2,1,1,75.55,1 +1,1,0,0,26,1,1,93.6,0 +1,0,1,1,1,1,1,70.0,1 +0,0,0,0,1,0,0,24.4,0 +1,0,1,1,65,1,1,74.8,1 +1,0,0,0,3,1,1,65.25,0 +1,0,0,0,13,1,1,50.55,0 +0,0,1,0,33,1,1,104.4,1 +0,0,0,0,1,1,1,70.7,0 +1,0,1,1,4,1,0,45.25,0 +1,0,0,0,2,1,1,70.3,0 +1,0,1,0,72,1,1,108.95,0 +0,0,1,1,37,1,0,26.45,0 +0,0,0,0,15,1,0,86.2,1 +0,0,0,0,23,1,1,19.65,0 +0,0,1,1,30,0,0,51.2,1 +0,0,1,1,42,1,1,19.05,0 +0,0,0,0,32,1,0,74.75,0 +0,0,1,1,22,1,1,75.8,0 +1,0,1,0,42,0,1,25.1,0 +0,0,0,0,8,1,0,44.45,0 +0,0,1,1,65,1,1,104.3,0 +0,0,0,0,2,1,0,19.5,1 +0,0,1,1,70,1,1,89.0,0 +1,0,0,1,22,1,0,20.15,0 +0,1,0,0,4,1,1,74.9,1 +0,0,0,0,2,1,0,74.9,1 +0,0,1,1,67,0,0,36.15,0 +0,0,0,0,25,1,1,19.2,0 +0,0,1,0,20,1,0,19.25,0 +0,0,0,1,2,1,1,61.2,0 +1,0,0,0,51,1,0,20.45,0 +0,0,1,1,46,0,0,35.05,0 +0,0,0,0,25,1,1,100.25,1 +1,0,0,1,13,1,0,44.0,0 +0,1,0,0,25,1,1,102.8,1 +1,0,1,1,26,1,0,50.35,0 +1,0,0,0,43,1,1,100.0,1 +1,0,0,1,19,1,1,20.0,0 +1,0,1,0,10,1,1,99.85,1 +0,0,0,1,2,1,1,94.2,1 +0,0,1,0,72,1,1,86.4,0 +1,1,0,0,18,1,1,58.4,0 +1,1,0,0,9,1,1,83.85,1 +0,1,0,0,27,1,0,88.3,1 +1,0,0,0,24,1,1,94.1,0 +1,0,0,0,69,1,1,104.05,1 +0,0,1,0,46,1,1,108.9,0 +0,1,0,0,72,1,1,107.4,0 +1,0,1,0,22,1,1,94.7,1 +0,1,1,0,70,1,1,90.85,0 +0,0,0,0,2,1,0,19.9,0 +1,0,1,0,31,1,1,66.4,0 +0,1,1,0,56,1,1,100.65,1 +0,0,1,1,16,1,0,100.7,0 +1,0,0,1,52,1,0,25.6,0 +1,0,1,1,13,1,1,19.85,0 +0,0,0,0,35,1,0,20.75,0 +0,0,0,0,59,1,0,95.8,0 +1,0,1,0,72,1,1,94.65,0 +0,1,1,0,66,1,1,80.55,1 +0,0,1,0,49,1,0,106.65,0 +0,0,0,0,2,1,1,45.85,0 +1,1,0,0,21,1,1,104.35,0 +1,1,0,0,54,0,1,55.45,0 +1,1,1,0,24,1,1,78.85,1 +1,0,0,0,1,1,0,61.15,0 +1,0,0,0,6,1,1,78.95,0 +0,0,0,0,1,1,1,44.45,1 +1,0,0,1,49,1,1,109.2,0 +0,0,1,1,56,1,1,61.3,0 +0,1,0,0,56,1,1,96.85,0 +0,0,1,1,6,0,0,40.55,0 +1,0,0,0,32,1,0,19.8,0 +1,0,1,1,50,1,1,108.25,0 +1,0,1,1,58,1,1,105.05,0 +0,0,1,1,65,1,1,90.45,0 +0,0,0,0,64,1,1,86.4,0 +0,0,1,0,66,1,0,66.9,0 +1,0,1,0,38,1,1,110.7,0 +0,0,1,0,20,1,1,20.0,0 +1,0,0,0,36,1,1,84.9,1 +1,1,0,0,64,1,0,102.1,0 +1,0,0,0,1,1,0,20.25,1 +0,0,0,0,60,1,1,70.15,0 +1,0,0,0,1,1,1,74.35,1 +0,0,1,1,50,1,1,80.05,0 +1,0,0,0,1,1,0,62.05,1 +0,0,1,0,72,0,1,49.2,0 +1,0,1,0,60,1,1,20.5,0 +1,0,0,0,46,0,0,38.25,0 +0,0,1,1,69,0,1,54.95,0 +1,1,0,0,31,1,1,96.6,0 +1,0,1,1,19,1,0,19.9,0 +0,0,1,1,71,1,0,19.9,0 +1,0,1,0,12,1,1,84.6,0 +1,0,1,1,39,1,0,80.0,1 +1,0,0,0,44,1,1,85.25,0 +0,0,1,1,56,1,0,81.25,0 +0,0,1,0,72,1,1,115.5,0 +1,0,0,0,5,1,0,104.1,1 +0,0,0,0,11,1,1,79.0,0 +1,1,1,0,24,0,0,39.1,1 +0,1,1,0,15,1,1,94.65,0 +1,0,0,0,72,1,1,20.8,0 +1,0,1,0,56,1,0,59.5,0 +1,1,0,0,64,1,1,20.05,0 +0,0,1,0,34,1,1,100.45,0 +1,0,0,0,2,1,1,76.5,1 +1,0,0,0,35,1,0,20.6,0 +1,0,0,0,22,1,0,20.3,0 +1,0,0,0,5,1,1,49.2,1 +1,0,0,0,9,0,0,39.55,0 +1,0,0,0,11,1,0,23.15,1 +1,0,0,0,23,1,0,20.45,0 +0,0,1,1,4,1,0,80.85,1 +1,0,1,0,68,1,0,25.25,0 +1,0,1,0,33,1,0,91.25,0 +1,0,0,0,31,1,1,72.45,0 +1,0,0,0,1,1,0,60.1,1 +0,0,0,0,56,1,0,19.7,0 +1,0,0,0,1,1,1,78.95,1 +1,0,1,1,66,1,1,75.1,0 +1,0,1,1,72,1,0,25.0,0 +1,1,0,0,34,1,0,69.15,0 +0,0,1,1,58,1,1,91.55,0 +1,0,0,0,2,1,1,45.15,1 +1,0,0,0,37,0,0,35.8,0 +0,0,0,0,71,1,1,113.15,0 +1,0,1,1,1,1,0,19.85,0 +1,1,1,1,71,1,0,19.8,0 +1,0,1,1,35,1,0,19.9,0 +0,0,1,1,6,1,0,19.7,0 +0,0,0,0,3,1,1,79.4,1 +0,0,1,1,69,1,0,59.1,0 +1,0,0,0,44,0,1,53.95,1 +0,0,1,0,53,1,1,91.15,0 +0,0,1,0,24,1,1,99.3,1 +0,0,1,0,5,1,1,68.95,0 +0,0,0,1,2,1,0,51.55,0 +1,0,0,1,62,1,1,24.4,0 +0,0,1,0,19,1,1,96.8,0 +1,0,0,0,9,1,0,70.05,0 +1,0,0,0,53,1,0,19.5,0 +1,0,0,0,5,1,0,78.75,0 +0,1,1,1,71,1,0,69.2,0 +0,0,0,0,1,1,1,19.55,0 +1,0,0,0,18,1,1,80.65,1 +1,0,0,0,72,1,1,103.65,0 +0,0,1,0,4,1,0,54.7,0 +1,0,0,0,59,1,0,54.15,0 +0,0,0,0,1,1,0,71.1,1 +0,1,1,0,31,1,1,84.85,0 +1,0,1,0,3,1,0,20.0,0 +0,1,1,0,65,1,1,106.25,1 +1,0,1,0,49,1,1,99.25,0 +1,0,0,0,2,1,0,19.35,0 +0,0,1,0,53,1,0,20.8,1 +0,0,1,0,55,1,1,94.75,0 +1,0,1,1,72,1,1,114.05,0 +0,1,0,0,36,1,1,74.9,0 +0,0,1,1,10,1,1,19.8,0 +1,1,0,0,1,1,1,94.0,1 +0,0,1,1,72,1,0,80.85,0 +0,0,0,0,28,1,0,54.65,0 +1,0,1,0,38,1,0,91.7,0 +0,0,0,0,61,1,1,118.6,0 +1,0,1,1,52,1,0,24.55,0 +1,0,0,0,67,1,1,19.45,0 +0,0,0,1,34,1,1,116.15,0 +0,0,0,0,54,1,0,80.6,0 +0,0,1,0,1,1,1,20.3,0 +0,1,0,0,15,1,0,89.85,1 +0,0,0,0,4,1,1,46.0,1 +0,0,0,0,9,1,0,66.25,1 +0,0,0,1,46,1,1,99.8,0 +0,0,0,0,22,1,1,90.0,1 +1,0,0,0,38,1,1,70.45,1 +0,0,1,1,55,1,1,75.0,0 +0,0,0,0,1,1,0,19.9,0 +1,1,1,0,64,1,0,80.3,0 +1,0,0,1,53,1,0,19.75,1 +0,0,1,0,58,1,1,84.3,0 +1,0,1,0,56,0,1,54.05,0 +1,0,1,1,72,1,1,104.9,0 +1,0,0,0,1,1,1,53.95,1 +1,1,1,0,72,1,1,97.25,0 +1,0,0,0,22,1,0,83.05,0 +0,1,0,0,8,1,1,105.5,1 +0,0,0,1,16,1,1,81.0,1 +0,0,0,0,39,0,0,41.1,0 +0,0,0,0,12,1,1,45.0,0 +1,0,1,0,54,1,1,74.55,0 +0,0,0,0,18,0,1,40.2,0 +1,0,1,0,32,1,0,70.5,0 +0,0,0,0,41,1,1,19.75,0 +1,0,1,1,67,1,0,24.65,0 +1,0,1,0,65,1,1,104.25,0 +0,0,0,0,25,1,1,78.35,0 +0,0,1,1,1,1,1,69.8,1 +0,0,1,0,67,1,1,109.7,0 +1,1,0,0,7,1,0,73.75,1 +0,1,0,0,43,0,1,33.45,0 +0,0,0,0,24,1,1,94.6,0 +1,1,0,0,9,1,0,54.55,1 +1,0,1,1,69,1,0,20.2,0 +0,0,0,1,37,1,0,20.3,0 +1,0,1,1,20,0,1,39.4,0 +1,0,0,0,7,1,0,69.15,0 +0,1,0,0,37,1,1,76.25,1 +0,0,0,0,5,1,1,93.9,1 +1,0,0,0,41,0,1,51.35,0 +0,0,0,0,54,1,1,100.05,0 +0,1,0,0,3,1,1,70.4,1 +1,1,0,0,69,1,0,20.3,0 +0,0,0,0,53,1,1,94.45,0 +1,0,1,1,18,0,0,46.4,0 +1,0,1,0,64,1,1,104.05,0 +0,0,1,1,31,1,1,91.15,1 +0,0,0,0,20,0,0,24.9,0 +1,0,1,1,57,1,0,59.6,0 +1,1,1,0,63,1,0,108.5,0 +1,0,1,1,13,0,0,40.55,0 +0,1,1,0,48,1,1,58.95,0 +0,0,0,0,2,1,1,70.95,1 +1,0,1,1,57,1,0,20.75,0 +1,0,1,0,71,1,1,113.15,0 +0,0,1,1,7,1,0,48.8,0 +0,0,0,0,16,1,1,63.05,0 +1,0,1,0,34,1,0,100.85,0 +0,0,1,0,37,1,1,99.5,1 +1,0,0,0,16,1,1,80.55,0 +1,0,0,1,48,1,1,64.4,0 +1,0,1,1,58,1,1,75.2,0 +0,0,1,0,72,1,1,84.9,0 +0,0,0,0,7,1,0,19.3,0 +0,0,0,0,38,1,1,83.9,1 +0,1,1,0,48,1,0,117.45,1 +1,0,0,0,10,1,1,104.4,1 +0,0,0,0,30,1,0,74.65,0 +1,0,1,0,31,1,1,59.05,0 +0,1,0,0,46,1,1,69.1,0 +1,0,1,0,50,1,0,20.55,0 +1,0,1,0,28,1,0,76.55,0 +0,0,0,0,66,0,1,62.5,0 +1,1,0,0,8,0,1,29.4,1 +0,0,1,1,41,1,1,94.9,0 +1,1,1,0,72,1,1,111.65,0 +0,0,0,0,7,1,0,19.9,0 +0,0,1,1,38,1,0,20.45,0 +1,0,0,0,44,1,1,106.05,0 +1,0,1,1,47,1,1,113.45,0 +1,0,1,1,53,1,1,92.55,0 +1,0,1,0,4,1,0,65.6,0 +1,1,0,0,20,1,1,84.35,0 +1,0,0,0,2,1,0,44.65,1 +1,1,1,0,57,1,1,71.1,0 +0,1,1,0,44,1,1,85.15,0 +1,0,0,0,24,1,1,49.7,0 +1,0,1,1,15,0,1,30.2,0 +0,0,0,0,3,0,0,25.25,1 +0,0,0,1,4,1,0,84.05,1 +1,1,1,0,37,1,1,85.7,1 +0,0,0,0,1,1,1,74.7,1 +0,0,0,0,24,1,0,56.35,0 +0,0,0,0,5,1,1,90.8,1 +0,0,0,0,33,1,0,107.55,0 +0,0,1,1,58,1,1,19.85,0 +0,0,1,1,72,1,1,95.9,0 +0,0,1,0,71,1,0,23.85,0 +0,1,0,0,28,1,1,106.15,1 +1,0,1,0,51,1,1,83.85,0 +0,0,0,0,30,1,0,85.35,1 +1,1,1,0,72,1,1,84.8,0 +1,1,0,0,36,1,1,90.85,1 +1,0,0,1,14,1,0,76.1,0 +0,0,1,1,72,1,0,74.55,0 +0,0,1,1,22,0,0,39.2,0 +0,0,0,0,2,1,0,79.55,0 +0,0,0,0,15,1,0,19.6,0 +1,0,1,1,51,1,0,19.55,0 +1,0,1,0,70,0,1,39.15,0 +0,0,1,1,71,1,0,20.1,0 +0,0,1,1,39,1,1,99.95,0 +0,0,1,1,61,1,0,59.8,0 +0,0,0,0,52,1,1,49.75,0 +0,0,0,0,1,0,1,35.75,1 +1,0,1,0,64,1,1,108.5,0 +1,0,1,0,62,1,1,60.15,0 +1,0,1,0,30,1,0,19.05,0 +0,1,1,1,4,1,0,46.0,1 +1,1,1,0,63,1,1,84.0,0 +0,0,0,0,1,1,1,44.55,0 +1,0,1,0,15,1,1,103.45,0 +1,0,1,1,27,1,1,80.65,0 +0,0,0,1,4,0,1,57.2,0 +0,0,1,0,72,1,1,110.75,0 +1,1,1,0,45,1,0,24.7,0 +0,1,0,0,45,1,1,97.05,0 +0,0,0,0,36,1,1,76.35,0 +1,0,1,1,17,1,1,89.4,1 +1,0,0,0,1,1,0,18.9,0 +1,1,0,0,16,1,1,74.45,0 +1,0,0,0,3,1,1,19.8,1 +1,0,1,1,4,1,1,50.9,1 +0,0,1,0,71,1,1,84.4,0 +1,0,1,1,10,1,1,24.4,0 +1,0,1,1,20,1,0,20.05,0 +1,0,0,0,4,1,1,81.0,1 +1,0,0,0,26,1,1,98.35,1 +0,0,0,0,4,1,0,55.5,0 +1,0,0,0,5,0,1,51.0,1 +0,0,1,0,4,1,1,91.65,1 +1,1,1,0,29,1,1,84.3,0 +1,0,0,0,2,1,0,100.2,0 +0,0,0,0,29,1,0,19.4,0 +1,0,0,1,1,1,1,90.85,1 +1,0,0,0,1,1,0,69.4,1 +0,1,0,0,8,1,1,94.45,1 +1,0,0,0,13,1,1,20.4,0 +0,0,1,0,59,1,1,94.75,0 +0,0,1,1,1,1,1,20.15,1 +1,1,0,0,50,1,1,95.7,1 +1,0,1,0,18,1,1,44.35,0 +0,0,1,1,17,1,0,74.55,0 +1,0,1,0,47,1,0,73.6,0 +0,0,0,0,26,1,1,74.95,1 +0,0,0,0,6,0,1,47.95,1 +1,0,1,1,19,1,0,50.1,0 +0,0,0,0,3,1,1,63.6,1 +0,1,1,1,68,0,1,53.0,0 +0,0,1,0,2,1,0,19.85,0 +1,0,0,0,7,0,1,24.35,0 +0,0,0,0,18,1,1,19.55,0 +0,0,1,0,71,1,0,25.05,0 +1,1,1,0,13,1,0,93.8,0 +1,0,0,0,3,0,1,36.85,1 +1,0,1,0,72,1,1,103.75,0 +1,0,1,1,66,0,1,56.75,0 +1,0,1,1,24,1,1,20.8,0 +0,0,0,0,1,1,1,44.1,1 +0,0,1,1,56,1,1,24.45,0 +0,1,1,0,22,1,0,25.6,0 +1,0,0,0,14,0,1,50.75,1 +0,1,1,0,61,1,1,104.4,1 +0,1,1,0,40,0,1,39.3,1 +0,0,0,0,42,1,0,59.65,0 +0,0,1,1,72,1,1,83.3,0 +0,0,0,0,12,1,1,79.55,0 +1,0,1,0,71,1,0,24.45,0 +0,0,1,0,26,1,0,19.2,0 +0,0,0,1,7,0,0,29.8,0 +0,0,1,1,6,1,0,45.5,0 +0,0,0,0,58,1,1,106.45,1 +1,0,1,0,51,0,1,30.05,0 +1,0,1,1,72,0,1,65.65,0 +0,0,0,0,18,1,1,96.05,1 +0,0,0,0,7,1,1,75.1,1 +0,0,0,0,47,1,0,74.05,0 +1,1,0,0,2,1,1,44.7,1 +1,1,0,0,62,1,1,110.75,0 +0,0,1,1,16,1,0,19.7,0 +1,0,0,0,6,1,1,49.5,0 +1,0,0,0,19,1,1,55.0,1 +0,0,1,1,69,0,1,43.95,0 +1,0,1,1,11,1,1,74.35,1 +0,0,1,0,64,1,1,111.15,0 +0,0,1,0,39,1,1,104.7,1 +0,0,0,0,15,1,1,55.7,1 +1,0,0,0,25,1,0,20.6,0 +0,0,0,0,6,1,0,19.65,0 +1,0,1,0,66,1,0,115.8,0 +0,0,0,0,61,1,0,88.65,0 +0,1,1,0,43,1,1,94.5,0 +0,0,0,0,12,1,0,20.1,0 +1,1,0,0,23,0,1,34.65,0 +1,1,1,0,71,0,1,52.3,0 +0,0,0,0,34,1,0,65.0,0 +0,0,0,0,5,1,0,19.85,1 +0,0,1,0,41,0,0,35.45,0 +0,0,1,1,72,1,0,19.7,0 +1,1,0,0,14,1,1,95.6,0 +0,0,0,0,41,1,1,19.85,0 +0,0,1,1,23,1,0,81.85,0 +1,0,1,1,71,1,0,109.3,0 +0,0,0,0,1,1,1,70.3,1 +1,0,1,0,72,1,0,25.4,0 +1,0,1,1,6,1,1,69.8,0 +1,0,1,1,23,1,1,20.0,0 +1,1,1,0,10,1,0,85.55,1 +0,0,0,0,72,1,1,109.9,0 +0,0,1,0,7,1,1,50.3,0 +1,0,0,1,6,1,0,94.5,1 +1,0,1,1,9,1,1,101.5,0 +0,0,0,0,12,1,1,89.15,0 +0,0,0,0,1,1,1,19.4,0 +0,1,1,1,48,0,0,29.9,0 +1,0,0,0,20,1,0,78.8,0 +0,1,1,0,16,1,1,85.35,1 +0,0,0,0,2,1,1,79.65,1 +0,0,0,0,10,1,1,19.3,0 +0,1,0,0,2,1,1,79.6,1 +1,0,1,1,20,1,0,96.8,0 +1,0,1,0,20,1,0,20.65,0 +1,0,1,1,19,1,0,19.8,0 +1,1,0,0,19,1,1,90.6,1 +1,0,1,0,22,1,1,104.6,0 +0,0,0,0,35,1,0,80.05,0 +0,0,0,0,1,1,0,45.15,0 +1,0,0,0,39,1,1,73.15,0 +0,1,1,0,54,1,1,99.1,0 +0,0,0,0,1,1,1,20.2,1 +1,0,1,0,66,1,1,106.05,1 +1,0,0,0,56,1,1,105.35,0 +1,0,0,1,18,1,1,45.65,0 +0,0,1,1,16,1,1,79.95,0 +0,0,0,0,68,1,1,54.45,0 +0,1,1,0,53,1,0,25.1,0 +0,0,1,1,72,1,0,84.7,0 +1,0,0,0,9,1,1,75.85,0 +0,0,0,0,30,1,1,48.8,0 +0,0,0,0,36,1,1,99.15,1 +0,0,0,0,18,0,1,35.2,0 +0,1,1,1,55,1,0,76.25,0 +0,0,1,0,39,0,0,55.9,1 +1,0,0,0,21,1,1,82.35,1 +1,0,0,0,2,0,1,40.4,1 +1,1,0,0,33,1,1,24.9,0 +1,0,1,0,44,0,0,54.3,0 +0,0,1,1,30,1,0,66.3,0 +0,0,1,0,71,1,1,20.9,0 +0,0,0,0,4,1,0,75.35,1 +1,0,0,1,35,1,1,85.15,1 +1,0,1,0,1,1,0,75.35,0 +1,1,1,0,23,1,1,104.45,0 +0,0,0,1,22,0,1,49.45,0 +0,0,0,1,49,1,0,19.45,0 +0,0,1,1,42,1,1,92.15,0 +0,0,1,1,33,1,1,93.8,1 +0,0,1,1,7,1,0,19.85,0 +0,0,1,1,67,1,1,100.25,0 +1,0,0,0,15,1,0,95.7,0 +1,0,1,0,67,1,1,93.15,0 +1,0,1,1,53,1,1,69.7,0 +1,0,1,1,21,1,0,19.8,0 +0,0,1,1,40,1,1,71.35,0 +0,0,1,1,22,1,0,20.75,0 +1,0,0,0,39,0,1,40.6,0 +1,0,0,0,45,1,1,20.4,1 +0,0,1,0,2,1,0,20.35,0 +0,0,1,1,57,1,0,19.75,0 +1,0,1,1,8,1,1,54.4,0 +1,1,1,0,7,1,1,94.7,1 +1,0,0,0,6,0,1,30.5,1 +0,0,1,1,7,1,0,20.45,0 +1,0,0,0,49,1,1,66.15,0 +0,0,0,0,65,1,1,89.85,0 +0,0,0,0,55,1,0,45.05,0 +1,0,1,1,71,1,0,86.85,0 +1,0,0,0,35,1,1,96.75,0 +1,1,0,0,3,1,1,77.0,1 +0,0,0,1,11,1,0,20.1,1 +0,0,0,0,1,1,0,75.3,1 +1,0,0,0,17,1,1,106.65,0 +0,0,1,0,72,1,1,110.15,0 +0,0,1,1,28,1,1,82.85,0 +0,0,1,0,18,1,0,20.1,0 +0,1,1,0,40,1,1,99.2,1 +0,0,0,0,52,1,1,59.45,0 +0,0,1,0,47,1,1,58.6,0 +0,0,0,0,23,1,0,49.7,0 +1,0,1,1,66,1,0,65.85,0 +0,0,0,0,8,1,1,73.5,0 +1,1,0,0,47,1,0,85.5,1 +0,0,0,0,7,1,0,20.05,1 +0,0,1,1,71,1,0,113.65,0 +0,1,0,0,50,1,1,83.4,0 +1,0,1,0,46,1,0,65.65,0 +1,0,0,0,1,1,0,70.4,1 +0,0,0,0,66,0,1,61.35,0 +0,0,1,0,42,1,1,85.9,0 +0,0,0,0,5,1,1,75.65,0 +1,0,1,1,7,1,1,49.75,1 +1,0,0,0,29,1,0,70.9,0 +0,0,1,1,27,1,0,49.85,0 +0,1,0,0,15,1,1,75.3,1 +0,0,1,1,25,1,0,20.1,0 +0,0,1,0,11,1,1,94.0,1 +1,0,1,0,57,1,1,103.05,0 +1,0,0,0,67,1,1,118.35,1 +0,1,1,0,47,1,0,99.7,0 +0,0,0,0,13,1,1,81.9,0 +1,0,0,0,8,0,1,30.45,1 +0,0,1,0,44,1,1,96.1,1 +1,0,1,1,71,1,1,66.2,0 +1,1,1,0,24,1,1,104.25,1 +1,1,0,0,15,1,1,80.2,1 +0,0,0,0,1,1,0,19.75,0 +1,1,0,0,2,1,1,72.6,0 +1,1,0,0,55,1,1,116.5,0 +1,1,0,0,71,1,1,106.8,0 +1,0,1,1,50,1,0,24.95,0 +1,0,0,0,1,1,1,89.25,0 +1,0,0,0,5,1,1,19.25,0 +0,0,0,0,66,1,1,104.55,0 +0,0,1,1,49,1,1,87.2,0 +0,1,1,0,3,0,1,30.75,0 +1,0,1,1,66,1,1,25.7,0 +1,0,0,1,11,1,0,86.2,0 +1,0,0,0,28,0,1,30.1,0 +1,0,1,0,65,1,1,99.35,0 +0,0,0,0,62,1,1,19.2,0 +0,0,1,0,2,1,0,20.1,0 +0,0,0,0,2,1,0,20.35,0 +0,0,1,1,55,1,1,25.65,0 +1,1,1,0,41,1,1,94.55,0 +0,0,1,1,17,1,1,104.2,1 +0,0,0,0,30,1,1,94.4,0 +1,0,0,0,17,1,0,56.1,0 +0,0,1,1,16,1,0,68.25,0 +1,0,0,0,72,1,0,24.75,0 +1,0,0,0,9,1,1,76.25,0 +0,0,0,0,1,1,0,74.35,0 +1,0,0,1,23,1,0,54.15,0 +1,0,0,1,8,1,0,19.45,0 +1,0,1,1,19,0,1,34.95,0 +0,0,0,0,7,1,1,53.65,0 +1,1,0,0,1,1,1,69.65,1 +1,0,0,0,61,1,0,104.0,0 +0,0,1,0,57,1,1,70.35,0 +1,0,0,0,9,1,1,80.8,1 +1,0,0,1,15,1,0,64.85,0 +0,0,0,0,1,1,0,19.65,0 +0,0,1,0,12,1,0,45.9,0 +1,0,0,0,54,1,0,20.0,0 +1,0,1,1,4,1,0,44.8,0 +0,0,0,0,7,1,1,80.3,1 +0,0,1,0,20,1,0,20.35,0 +0,0,0,1,26,0,0,45.8,0 +1,1,1,0,36,1,1,84.1,1 +0,0,1,0,53,1,1,108.95,0 +1,0,0,0,3,1,1,69.35,1 +0,0,0,0,68,0,0,64.35,0 +1,0,1,1,72,1,1,90.8,0 +1,0,0,0,12,1,0,24.95,0 +0,1,1,1,34,1,1,79.6,1 +0,0,1,0,68,1,1,84.7,0 +0,0,0,1,50,1,1,70.8,0 +0,1,0,0,1,0,1,36.45,1 +0,1,0,0,41,1,1,104.4,0 +1,1,1,0,30,1,1,101.5,0 +1,0,0,0,1,1,0,54.3,0 +1,1,1,1,29,1,1,103.95,0 +0,0,1,1,23,1,1,91.1,0 +1,0,0,1,60,1,0,19.95,0 +0,0,1,0,72,1,0,26.45,0 +1,0,0,1,22,1,1,89.4,1 +1,0,0,0,72,1,1,75.1,0 +0,1,0,0,66,1,0,108.1,0 +0,0,1,0,72,1,1,110.15,0 +0,1,1,0,47,1,0,80.35,1 +0,0,0,0,51,1,1,111.5,0 +0,0,1,1,70,1,1,106.5,0 +1,0,0,0,9,1,1,19.9,0 +1,0,1,1,59,1,1,111.1,0 +1,0,0,1,3,1,0,70.7,0 +1,1,1,0,38,0,1,24.85,0 +0,0,0,0,37,1,0,91.2,0 +1,0,0,0,37,1,0,65.6,0 +0,1,1,0,24,0,1,40.65,1 +0,0,1,1,14,1,0,59.45,0 +1,0,1,0,72,1,1,109.95,0 +1,0,1,0,53,0,1,60.45,1 +0,0,1,0,8,1,1,84.9,1 +1,0,1,1,72,0,0,38.5,0 +0,1,1,0,17,1,1,92.55,0 +0,0,1,1,2,1,1,73.55,1 +0,0,1,0,8,1,0,20.15,1 +0,0,1,0,48,0,0,34.7,1 +0,0,0,0,10,1,1,24.5,0 +1,0,0,0,1,1,0,20.6,0 +0,0,0,0,29,1,0,58.0,0 +0,1,1,1,65,1,1,107.45,0 +0,0,0,0,8,1,1,65.5,0 +1,0,1,0,61,1,0,25.45,0 +0,1,0,0,45,1,1,100.15,0 +1,0,1,1,72,1,1,104.45,0 +1,0,1,1,12,1,1,21.15,0 +1,0,0,0,7,1,0,96.2,0 +1,0,0,0,9,1,1,44.4,0 +0,1,1,0,43,1,1,107.55,1 +1,0,1,1,58,1,0,94.35,0 +1,1,1,0,16,1,1,98.75,1 +1,0,1,1,2,1,0,20.3,0 +0,0,1,0,8,1,0,101.15,1 +0,0,1,0,40,1,0,105.75,0 +1,0,0,0,9,1,1,81.15,0 +1,0,0,0,41,1,1,89.55,0 +0,0,0,0,26,1,1,54.75,0 +0,0,1,0,33,1,1,53.75,0 +1,0,1,1,68,1,0,105.75,0 +0,1,1,0,65,1,1,105.85,0 +1,0,0,0,55,1,1,64.2,0 +1,0,0,0,20,1,1,88.7,1 +1,0,0,0,19,1,1,87.7,0 +0,0,0,0,45,1,1,89.3,0 +0,0,1,1,70,1,1,20.15,0 +0,0,0,0,2,1,1,79.75,1 +0,0,0,0,27,1,1,94.55,1 +0,0,1,0,12,1,1,20.05,0 +1,0,0,1,72,0,0,67.2,0 +1,0,0,0,12,1,0,94.55,0 +0,1,0,0,5,1,1,69.05,1 +1,1,1,0,71,1,1,107.5,0 +1,1,0,0,35,1,1,73.0,0 +1,0,1,1,70,1,0,114.75,0 +0,0,0,0,31,1,1,76.05,0 +1,0,1,1,52,1,1,96.25,1 +1,1,0,0,37,1,1,101.1,1 +1,0,0,0,69,1,1,104.7,1 +1,1,1,0,30,1,0,77.9,0 +0,0,0,0,33,1,1,90.65,0 +1,1,1,0,54,1,1,110.45,0 +0,0,0,0,59,1,0,68.7,0 +1,1,0,0,55,0,1,44.85,0 +1,1,1,0,69,0,1,29.8,0 +0,0,0,0,66,1,1,88.9,0 +1,0,1,1,37,1,1,58.75,0 +1,1,1,0,9,1,0,19.85,0 +1,0,1,1,69,1,0,86.9,0 +1,0,0,0,10,1,1,59.65,0 +1,0,0,1,40,1,1,55.25,1 +1,0,0,1,13,1,0,66.4,0 +0,0,0,0,6,1,1,90.1,1 +0,0,1,1,69,1,0,20.15,0 +0,1,1,0,66,1,1,108.1,0 +1,0,0,0,11,1,0,53.75,1 +1,0,1,1,46,1,0,56.9,0 +0,0,0,0,6,1,0,89.3,1 +0,0,1,1,56,1,1,109.6,0 +1,0,1,1,70,1,0,25.15,0 +0,0,1,1,33,1,1,79.15,0 +0,0,1,1,72,1,0,66.75,0 +0,0,1,0,3,1,1,95.2,1 +0,0,0,1,19,1,0,48.8,0 +0,1,0,0,5,0,0,45.7,1 +0,0,1,0,71,1,1,80.7,0 +1,0,1,0,8,1,1,74.5,1 +1,0,0,0,1,1,0,20.55,0 +0,0,0,0,1,1,1,79.65,1 +0,0,0,0,61,1,1,115.1,0 +0,0,1,1,71,0,0,59.7,0 +0,0,1,0,68,1,0,86.45,0 +1,0,0,0,46,0,0,33.7,0 +1,0,0,0,33,1,0,80.1,0 +0,0,1,1,53,1,1,104.05,0 +0,1,1,0,50,1,0,108.75,0 +0,0,0,0,57,0,1,41.1,0 +0,0,1,1,54,1,1,20.35,0 +0,1,1,0,60,1,1,105.9,0 +0,1,1,0,28,1,1,101.3,1 +0,0,1,1,1,1,1,80.05,1 +1,0,1,1,29,1,1,89.2,1 +0,0,1,1,10,1,1,65.5,0 +1,0,0,1,43,0,1,40.45,0 +1,1,1,0,13,1,0,70.45,0 +0,0,1,0,43,1,1,78.8,0 +1,0,1,1,19,1,1,83.65,1 +1,0,1,1,1,1,1,90.1,0 +0,0,0,0,69,1,1,82.45,0 +0,0,1,0,61,1,0,20.25,0 +1,0,1,0,43,1,0,66.25,0 +0,0,1,0,6,1,0,19.5,1 +1,0,0,0,1,1,0,51.25,1 +1,0,1,0,56,1,0,89.7,0 +0,0,1,0,70,0,0,64.55,0 +1,0,0,0,1,1,1,45.6,1 +1,0,1,1,49,1,1,93.65,0 +0,0,0,0,6,1,1,49.65,1 +0,0,1,1,32,1,0,73.6,0 +0,1,1,0,72,1,1,109.75,0 +1,0,0,1,37,1,0,61.45,0 +0,0,1,0,69,1,1,106.4,0 +0,0,1,0,26,1,0,81.9,0 +0,0,1,1,58,1,1,105.2,0 +1,0,0,0,24,1,0,54.6,0 +1,0,1,1,5,1,0,20.55,0 +1,0,1,1,15,1,1,20.0,1 +0,0,1,1,30,1,0,19.7,0 +0,0,1,0,55,1,1,66.05,0 +0,0,1,0,25,0,1,34.0,1 +1,1,1,0,10,1,1,92.5,1 +1,0,1,1,44,0,1,54.05,0 +0,0,0,0,47,1,1,58.9,0 +0,0,1,1,13,1,0,88.35,1 +0,0,1,1,49,1,1,107.95,1 +0,0,1,0,64,1,1,96.9,0 +1,0,0,0,1,1,0,19.1,0 +1,0,0,0,20,1,0,50.0,0 +0,0,1,0,37,0,0,45.4,0 +1,0,1,1,30,1,0,85.45,0 +0,0,0,0,38,1,0,84.1,0 +0,1,0,0,1,1,1,74.45,1 +0,0,0,0,37,1,1,64.75,1 +0,0,1,0,52,0,0,66.25,0 +1,0,0,1,71,1,1,76.9,0 +1,0,0,0,26,1,0,89.8,1 +1,0,0,0,66,1,1,74.6,0 +1,0,1,0,72,1,1,116.95,0 +1,0,0,1,25,0,1,40.65,0 +1,0,1,1,69,1,1,114.35,0 +1,0,1,1,53,1,0,69.7,0 +0,0,0,0,12,1,0,95.5,1 +1,0,0,0,26,1,1,98.65,0 +1,0,0,0,21,1,0,61.65,0 +0,0,0,1,1,1,1,89.35,0 +1,0,0,0,48,1,1,95.4,0 +0,0,1,0,26,0,0,35.4,0 +1,0,1,0,60,1,0,19.95,0 +1,0,0,0,18,1,0,19.25,0 +0,1,0,0,10,0,1,29.65,1 +1,0,1,1,5,1,1,84.5,1 +0,0,0,1,4,1,1,20.4,0 +1,0,1,1,65,1,0,24.75,0 +1,0,1,1,70,1,0,25.35,0 +1,0,0,0,18,1,1,90.7,1 +1,0,0,1,62,1,0,20.0,0 +0,0,1,1,66,1,1,59.75,0 +0,0,1,1,65,1,1,82.5,0 +0,1,0,0,3,1,1,70.3,1 +0,0,0,0,34,1,0,20.35,0 +1,0,1,1,16,1,1,90.8,0 +0,0,0,0,54,1,1,103.95,1 +0,1,0,0,50,1,1,104.95,0 +1,0,1,0,71,1,1,105.25,0 +0,0,0,0,10,1,1,74.75,1 +0,0,0,0,1,1,1,50.8,1 +1,0,0,0,18,1,0,23.75,0 +1,0,0,0,4,1,1,61.3,0 +0,0,1,1,58,1,0,75.8,0 +0,0,1,0,56,1,1,98.0,0 +1,0,0,0,2,1,1,80.25,1 +1,0,1,0,32,1,1,78.9,1 +1,0,1,1,56,0,1,52.0,0 +1,0,0,0,36,1,1,84.75,1 +0,0,0,0,4,1,1,64.4,0 +1,0,0,0,53,1,0,85.45,1 +1,0,0,0,10,1,1,45.8,0 +1,0,0,0,4,0,0,30.5,0 +1,0,1,1,1,1,0,19.9,1 +0,0,1,0,51,1,0,69.15,0 +1,1,0,0,12,1,1,99.45,1 +0,0,0,0,6,0,1,49.25,0 +1,0,1,1,63,0,0,39.35,0 +0,0,0,0,1,1,1,70.6,1 +0,0,1,0,48,1,1,105.1,0 +0,0,0,0,5,1,1,81.0,1 +0,0,0,1,35,1,1,20.1,0 +1,0,0,0,6,1,1,84.85,1 +1,0,0,0,2,1,0,19.75,0 +0,0,0,0,50,1,0,19.75,0 +0,0,0,0,33,1,1,70.4,0 +1,0,0,0,31,1,0,20.45,0 +0,0,1,1,9,1,0,20.35,0 +0,0,1,1,54,1,1,86.2,0 +0,0,0,0,46,1,1,95.65,0 +1,0,0,1,34,1,1,103.8,0 +1,0,1,1,71,1,1,97.2,0 +0,0,1,1,63,1,0,63.55,0 +0,0,0,0,51,1,0,24.95,0 +0,1,0,0,26,1,1,89.15,1 +0,0,1,0,64,1,1,99.0,0 +0,1,1,0,1,0,1,24.8,1 +1,1,1,0,61,1,1,85.55,0 +0,0,0,0,15,1,1,94.0,0 +1,0,0,0,64,1,1,105.65,1 +0,0,0,0,18,1,1,50.3,0 +0,0,1,1,57,1,1,95.0,0 +1,0,1,1,14,1,1,61.4,0 +1,1,0,0,18,1,1,80.55,0 +0,1,1,0,72,1,0,78.5,0 +1,0,1,0,70,1,0,114.3,0 +0,0,0,0,38,1,0,20.05,0 +1,0,1,1,68,1,0,62.65,0 +1,0,0,0,13,1,1,80.85,1 +1,1,1,0,65,1,1,92.7,0 +0,0,0,0,30,1,0,100.45,0 +1,0,1,0,51,1,1,75.2,0 +0,0,0,0,31,1,1,84.75,0 +0,0,1,0,9,1,0,89.45,1 +0,0,1,1,72,1,1,79.5,0 +1,0,0,0,10,1,1,72.15,1 +0,0,0,0,37,1,1,19.8,0 +0,0,0,0,2,1,0,76.4,1 +1,0,0,0,55,1,1,100.9,0 +1,0,0,1,33,1,1,95.3,0 +0,0,1,1,46,1,0,90.95,0 +0,0,0,1,1,1,0,54.5,0 +0,1,0,0,20,1,1,61.6,1 +1,0,1,0,9,1,1,79.9,1 +1,1,0,0,32,1,1,96.15,1 +0,0,1,1,19,1,1,49.6,0 +0,0,1,0,70,1,0,65.3,1 +0,0,0,1,61,1,1,25.0,0 +1,0,0,0,26,1,0,45.45,0 +1,0,1,0,45,1,1,107.75,0 +1,0,1,1,62,1,1,89.1,0 +1,0,0,0,1,1,0,19.65,1 +0,0,0,0,3,1,0,44.75,0 +0,0,1,1,41,1,1,101.6,0 +1,0,1,1,67,1,0,103.15,0 +1,0,0,0,1,1,1,84.65,1 +0,0,1,0,71,1,0,95.65,0 +0,0,1,1,37,1,0,75.1,0 +1,0,1,0,60,1,1,61.35,0 +0,1,1,0,1,1,1,69.55,1 +0,0,0,0,6,1,0,19.7,0 +0,0,0,0,13,0,1,31.05,1 +0,0,1,1,11,1,0,51.0,0 +1,0,0,0,7,1,1,51.0,1 +0,0,1,1,10,1,1,88.85,0 +1,0,1,0,34,1,0,20.05,0 +0,0,0,0,62,1,1,65.1,0 +1,0,1,0,64,1,1,70.15,0 +0,0,1,1,1,1,1,44.35,1 +1,0,0,0,25,1,1,20.75,0 +0,0,0,0,26,1,1,56.05,0 +1,0,0,1,10,1,1,19.95,0 +0,0,0,0,53,1,0,98.6,0 +0,0,0,0,7,1,1,79.7,1 +1,0,0,0,33,1,1,79.0,0 +0,1,1,0,71,1,0,89.45,0 +0,0,0,0,29,1,1,74.2,0 +1,0,1,1,24,1,0,81.0,0 +1,0,1,1,20,1,1,49.6,0 +0,0,0,0,1,1,1,84.6,0 +1,0,0,1,54,1,1,55.0,1 +0,1,0,0,5,1,1,84.85,1 +0,0,1,1,72,1,1,84.2,0 +1,0,1,0,52,1,1,106.3,0 +0,0,0,0,9,1,0,69.05,0 +0,0,0,0,1,1,1,45.4,0 +1,1,0,0,1,1,1,73.65,1 +1,0,1,1,33,1,1,73.9,1 +0,0,1,0,55,1,1,77.75,1 +1,0,1,1,69,1,1,99.35,0 +1,0,0,0,1,1,1,50.75,0 +1,0,0,0,54,1,0,87.1,0 +1,0,0,1,33,1,1,20.15,0 +1,1,1,0,45,1,1,98.7,0 +0,0,0,1,11,0,0,25.2,0 +1,0,0,0,6,1,1,55.7,0 +1,0,0,0,21,1,0,65.35,0 +0,0,1,1,65,1,1,25.3,0 +0,1,1,0,6,1,1,84.35,1 +0,0,0,0,8,1,0,84.95,1 +1,0,0,0,11,1,1,73.85,1 +1,0,1,1,43,1,0,24.25,0 +1,0,1,1,49,0,1,51.8,1 +0,1,1,0,1,1,0,46.0,1 +1,1,0,0,15,1,1,79.4,1 +1,0,1,1,60,1,0,60.5,0 +1,0,0,0,17,0,0,25.1,0 +1,1,1,0,16,1,1,71.8,1 +1,0,1,1,35,1,0,20.05,0 +1,1,1,0,44,1,0,88.4,1 +0,0,1,1,12,0,0,30.25,0 +1,0,0,0,1,1,0,20.2,0 +0,0,0,0,28,1,1,59.9,0 +1,0,1,0,70,1,0,25.15,0 +0,0,0,1,5,1,0,46.0,1 +1,0,0,0,18,1,0,101.3,0 +1,0,1,0,70,1,1,76.95,0 +0,0,1,1,9,1,1,55.3,0 +0,1,0,0,67,1,1,92.45,0 +0,0,0,0,1,1,1,48.45,0 +0,0,1,1,18,1,0,19.35,0 +1,0,0,0,4,1,0,51.75,1 +1,1,1,1,71,1,1,86.7,0 +1,0,1,1,30,1,1,94.4,1 +1,0,1,0,1,1,0,55.7,0 +0,0,0,0,55,1,1,84.25,0 +1,0,0,0,59,1,1,64.65,0 +0,0,0,0,1,1,1,70.15,1 +0,0,1,0,7,1,1,69.2,0 +1,0,1,1,45,1,0,54.65,0 +0,0,1,1,54,1,1,24.75,0 +1,0,1,1,51,1,1,23.95,0 +0,1,1,0,72,1,0,105.0,0 +1,0,1,0,44,1,1,59.85,0 +1,0,0,0,2,1,0,20.05,0 +0,0,0,0,66,1,1,92.15,0 +1,0,1,1,68,0,0,44.8,0 +0,0,0,0,31,1,0,20.9,0 +0,1,0,0,21,1,1,95.4,0 +1,0,0,1,21,1,0,80.35,0 +0,0,1,1,55,1,1,85.1,0 +1,0,0,0,9,0,1,34.7,1 +1,1,1,0,71,1,1,115.05,0 +0,0,0,0,1,1,1,81.1,1 +1,0,1,1,22,1,0,19.95,0 +0,0,1,1,1,1,0,20.55,1 +0,0,0,0,61,1,1,106.6,1 +0,0,1,0,67,1,0,86.15,0 +0,1,0,0,14,1,0,78.85,0 +1,0,1,0,59,1,1,106.75,1 +1,1,1,0,21,1,0,86.55,0 +1,0,0,0,4,0,0,42.4,0 +0,0,0,0,3,1,1,89.45,1 +1,0,1,0,70,1,0,24.25,0 +0,0,0,0,3,1,1,97.9,1 +1,1,0,0,21,1,0,20.5,0 +1,0,0,0,20,1,1,19.6,0 +1,0,1,1,22,1,0,20.25,0 +1,0,0,0,1,1,1,55.7,1 +0,0,0,0,63,1,1,20.6,0 +0,0,1,1,70,1,0,19.8,0 +1,0,0,0,13,1,1,79.8,1 +0,0,0,0,5,1,0,80.2,0 +0,0,1,1,72,1,1,116.4,0 +0,0,0,0,13,0,1,31.65,0 +1,0,1,0,61,1,0,94.15,0 +1,0,0,0,1,1,0,20.65,0 +0,1,1,0,56,1,1,76.85,0 +0,0,0,0,4,1,0,20.15,0 +1,0,0,0,35,1,0,55.25,0 +0,0,1,0,18,0,1,39.05,1 +1,0,1,0,72,1,0,82.15,0 +0,1,0,0,49,1,0,103.0,0 +0,0,1,0,44,1,1,95.1,0 +0,1,1,0,3,1,1,83.9,1 +0,0,1,1,37,1,1,95.15,0 +1,0,1,0,61,1,1,79.8,0 +1,0,1,0,70,1,1,74.8,0 +0,1,0,0,1,1,1,69.85,1 +0,0,0,0,41,1,0,20.45,0 +1,0,1,1,70,1,0,78.35,0 +0,0,0,0,1,1,1,53.55,1 +1,0,0,0,51,1,0,19.1,0 +0,0,1,1,42,1,0,20.0,0 +0,0,1,1,70,1,0,93.9,1 +1,0,0,0,48,1,0,19.95,0 +1,0,1,1,68,1,1,113.15,1 +0,0,0,0,48,1,0,24.0,0 +0,1,1,0,26,1,0,84.95,1 +1,0,1,0,11,1,1,80.5,1 +1,0,0,0,1,1,1,19.3,1 +0,0,0,0,27,1,0,19.15,0 +0,1,0,0,46,1,1,91.3,0 +1,0,0,0,1,1,1,49.65,1 +0,0,0,0,46,1,0,54.35,1 +1,0,1,1,25,1,1,19.15,0 +1,0,0,0,4,1,1,88.45,1 +1,0,0,0,13,1,0,19.75,0 +1,0,1,0,31,1,1,75.5,0 +0,0,1,1,23,1,1,83.75,0 +0,0,0,0,2,1,0,19.4,0 +0,0,0,0,65,1,0,26.5,0 +1,1,0,0,22,1,1,90.5,1 +0,0,1,1,55,1,0,19.15,0 +1,0,1,0,9,1,1,94.85,1 +1,0,1,1,7,1,1,69.95,1 +0,0,1,1,35,0,0,40.9,0 +1,0,0,0,6,1,1,80.25,0 +0,0,0,0,1,1,1,48.6,1 +1,0,0,0,17,1,1,70.8,0 +1,0,1,1,10,1,0,60.2,0 +1,0,0,1,15,1,0,55.2,0 +0,1,0,0,40,0,1,55.8,1 +0,0,1,1,13,1,0,54.15,0 +1,0,1,0,29,1,1,80.15,1 +0,0,0,0,3,1,1,75.5,1 +0,1,1,0,58,1,1,100.4,0 +0,0,0,0,45,1,1,62.55,0 +0,0,1,1,72,1,1,70.45,0 +1,0,1,1,68,1,1,85.5,0 +1,0,0,0,1,1,1,20.2,1 +0,0,1,1,38,1,0,54.5,0 +1,0,0,0,2,1,0,20.75,0 +1,0,0,0,11,1,0,20.35,0 +0,1,1,0,20,1,1,91.0,0 +1,0,1,0,72,1,1,104.8,0 +0,0,1,0,3,1,1,74.75,1 +1,0,0,0,23,1,1,104.05,1 +1,0,0,0,40,1,1,51.1,0 +1,1,1,0,62,1,1,89.8,0 +0,0,0,1,22,1,1,20.55,0 +0,0,0,0,11,1,0,64.05,0 +1,1,1,0,7,1,1,74.85,0 +0,0,0,0,13,1,1,96.65,1 +1,1,0,0,1,1,0,20.05,1 +0,0,0,0,39,1,1,103.45,1 +1,0,1,0,3,0,0,25.0,0 +1,0,0,0,58,1,0,20.3,0 +1,0,0,1,6,1,0,26.35,0 +0,0,1,1,1,1,1,19.9,1 +0,0,1,0,22,1,1,54.7,0 +1,0,1,0,14,0,0,46.35,1 +1,0,1,1,64,1,0,90.25,0 +1,0,0,0,1,1,0,19.95,1 +1,0,0,0,6,1,0,20.65,0 +1,0,0,0,1,1,0,79.6,1 +1,0,0,1,39,1,0,25.45,0 +0,0,0,0,20,1,0,19.5,0 +1,0,0,0,1,1,1,75.9,1 +1,0,1,0,1,1,0,76.2,1 +1,0,1,0,64,1,1,66.15,0 +1,0,0,1,1,1,0,19.25,1 +0,0,1,0,46,1,1,69.1,0 +0,1,1,1,28,0,1,39.1,0 +0,0,1,0,33,1,0,20.05,0 +1,0,1,1,39,1,0,59.8,0 +0,0,1,0,42,1,1,84.3,1 +0,0,0,0,1,1,1,48.6,0 +0,0,0,0,7,1,1,79.0,1 +1,1,1,0,70,1,0,105.35,0 +1,0,0,0,65,1,1,25.1,0 +1,0,0,0,1,1,0,49.75,0 +1,0,1,0,18,1,1,94.75,0 +1,0,1,0,24,1,1,93.0,0 +1,0,0,0,63,1,1,71.9,0 +0,0,0,1,44,1,1,77.55,0 +1,0,0,0,4,1,1,19.85,0 +0,0,0,0,1,1,1,70.25,1 +0,0,1,1,37,1,1,95.25,0 +0,1,0,0,10,1,1,84.6,1 +1,0,0,0,34,0,1,25.05,0 +1,0,1,0,35,0,0,53.15,0 +0,0,1,0,4,1,0,20.15,0 +0,1,1,0,39,1,1,101.25,0 +1,1,1,0,43,1,1,100.55,0 +0,0,1,1,17,1,0,24.1,1 +0,0,1,0,61,1,0,25.3,0 +0,0,1,0,49,1,0,71.8,0 +1,0,0,0,4,1,0,19.7,0 +0,0,1,1,64,0,0,49.85,0 +1,0,0,0,3,1,1,69.6,0 +1,0,1,1,1,1,0,19.75,0 +1,0,1,0,40,1,0,80.8,0 +0,0,0,1,1,1,1,60.0,1 +1,0,0,0,8,1,1,86.55,1 +0,1,1,0,1,1,1,20.85,1 +0,1,1,0,34,1,0,64.2,0 +0,0,1,0,1,0,0,35.0,0 +0,0,0,0,39,0,1,50.75,1 +0,1,1,0,58,1,1,105.5,1 +1,0,1,1,45,1,0,19.2,0 +1,1,0,0,6,1,1,85.15,1 +1,0,0,0,43,1,1,90.65,0 +1,0,1,1,41,1,1,20.0,0 +1,0,0,0,5,1,1,74.65,0 +1,0,0,0,72,0,1,61.2,0 +1,0,0,0,4,1,0,19.95,0 +1,0,1,1,9,1,0,54.8,0 +1,1,1,0,72,1,1,73.45,0 +0,0,1,0,33,1,1,51.45,0 +0,0,1,0,72,1,0,80.45,0 +1,0,1,0,22,1,1,54.2,1 +0,0,1,0,70,1,1,109.5,1 +1,0,1,1,21,1,0,104.4,1 +1,0,0,0,15,1,0,85.3,0 +1,1,1,0,29,1,1,79.3,0 +0,0,1,1,15,1,0,76.5,0 +1,1,1,1,71,1,1,105.1,1 +1,1,0,0,72,1,0,25.4,0 +0,0,1,0,19,1,1,86.85,0 +1,0,0,0,1,1,0,19.65,0 +0,0,0,0,1,1,1,75.7,1 +0,0,0,0,2,1,0,45.55,0 +0,1,1,1,11,1,1,78.1,0 +0,0,0,0,12,1,0,19.3,0 +0,0,1,0,70,1,1,110.5,0 +0,1,1,0,20,1,0,90.8,1 +0,0,0,0,23,1,1,20.3,0 +1,1,0,0,49,1,0,81.35,0 +0,0,1,1,4,1,1,97.95,1 +1,0,0,0,32,1,1,108.15,1 +1,0,0,1,2,1,1,55.3,0 +1,1,1,0,69,0,0,56.55,0 +1,0,0,0,6,1,1,80.5,1 +0,0,1,1,24,1,1,19.7,0 +0,0,0,0,32,1,1,104.05,0 +0,0,0,0,27,1,0,52.85,0 +0,1,1,0,27,1,1,104.3,1 +1,0,0,0,58,1,0,80.65,0 +1,0,0,0,1,1,1,71.35,1 +0,0,1,1,18,1,1,24.65,0 +0,0,1,1,47,1,1,21.3,0 +0,0,1,1,70,1,1,110.2,0 +0,0,0,0,13,1,0,89.4,1 +0,0,1,1,36,1,0,51.05,0 +1,0,0,0,67,1,1,19.8,0 +0,0,0,0,10,1,1,19.9,0 +1,1,0,0,19,1,1,87.3,0 +0,0,1,1,71,1,0,19.85,0 +1,0,1,1,72,1,1,89.4,0 +0,0,1,1,48,1,0,20.0,0 +1,0,0,0,1,1,0,20.05,0 +1,0,1,1,18,1,0,83.25,0 +1,0,0,0,1,1,0,20.6,1 +1,1,1,0,67,1,0,102.9,0 +1,0,1,1,69,0,0,39.1,0 +1,0,0,0,19,1,1,99.95,1 +1,1,1,0,72,1,1,114.5,0 +0,1,0,0,38,1,0,20.2,0 +1,1,1,0,40,1,0,55.8,0 +0,0,1,1,61,1,1,24.2,0 +0,0,0,0,10,1,1,81.0,1 +1,0,1,0,32,1,1,72.8,0 +0,0,0,0,21,1,1,99.85,0 +0,1,0,0,59,1,1,99.5,0 +0,1,1,0,13,1,1,70.15,1 +0,0,0,0,47,1,0,20.25,0 +1,0,1,1,69,1,1,26.0,0 +1,0,0,0,2,1,1,19.9,0 +0,0,1,1,22,1,0,19.05,0 +1,1,1,0,15,1,1,96.5,0 +0,0,0,0,53,1,0,19.85,0 +0,1,1,0,28,1,0,25.7,0 +1,0,0,0,22,1,0,20.3,0 +0,0,0,0,1,1,1,70.15,1 +1,1,1,0,16,1,1,91.55,0 +0,0,1,1,48,0,0,39.4,0 +1,1,1,0,30,1,1,105.7,0 +0,0,0,0,3,1,1,70.25,0 +1,1,0,0,57,1,0,93.75,0 +0,1,1,0,68,1,1,96.55,1 +0,0,1,0,23,1,0,60.0,0 +0,0,1,0,65,1,1,59.8,0 +1,0,1,0,44,1,1,90.65,0 +0,0,1,1,71,1,1,109.0,0 +0,0,1,0,37,1,0,68.1,0 +0,0,0,0,12,1,0,20.4,0 +1,0,1,1,69,1,1,81.95,0 +0,0,0,0,35,1,0,60.55,0 +1,0,0,0,5,1,1,65.6,0 +1,0,1,1,58,1,0,82.5,0 +1,0,1,0,72,1,1,82.3,0 +1,0,1,0,72,1,0,68.15,0 +0,0,0,0,1,1,0,20.3,0 +0,0,0,0,39,1,1,95.55,1 +1,0,1,1,53,1,0,20.2,0 +0,0,0,0,27,1,1,89.2,0 +0,1,0,0,1,1,1,69.65,1 +0,1,0,0,1,1,1,89.3,1 +0,0,1,0,18,1,0,74.8,0 +1,0,1,1,46,1,1,20.2,0 +0,0,1,0,72,1,1,84.4,0 +0,0,0,0,36,1,1,87.55,1 +0,0,1,0,4,0,1,25.15,0 +0,0,0,0,25,1,0,19.8,0 +0,0,1,1,40,0,1,50.85,0 +1,0,1,0,63,1,1,102.4,0 +0,1,0,0,15,1,1,96.3,1 +1,0,0,0,14,1,1,55.5,0 +1,1,1,0,72,1,1,109.75,0 +1,0,0,0,39,1,1,106.4,0 +0,0,1,1,47,0,1,60.0,0 +1,0,1,0,19,1,1,88.8,0 +0,0,0,0,5,1,1,85.2,1 +0,0,0,0,13,0,1,35.1,1 +0,0,0,0,17,1,0,80.05,0 +1,1,1,0,34,1,1,75.55,0 +0,0,0,0,42,1,1,49.55,0 +1,0,1,0,5,1,1,81.3,1 +0,0,1,1,71,1,0,23.9,0 +1,1,1,0,19,1,0,66.4,0 +0,0,0,1,2,1,1,19.6,1 +1,0,0,0,57,1,0,18.8,0 +1,0,1,0,72,1,1,108.4,0 +0,0,0,0,6,1,1,85.95,0 +0,0,1,1,17,1,1,85.45,1 +1,0,1,0,61,1,0,80.9,0 +1,0,1,1,1,1,1,71.0,1 +1,0,1,1,48,1,0,111.8,0 +1,0,0,0,16,1,1,20.6,0 +1,1,0,0,9,1,1,85.05,1 +0,0,0,0,3,1,0,44.6,0 +1,0,0,1,1,1,1,44.4,1 +1,0,0,0,65,1,0,105.1,0 +0,0,1,1,70,1,1,115.15,0 +1,0,1,0,60,1,1,59.8,0 +0,0,1,0,69,1,1,26.3,0 +0,1,0,0,35,1,0,70.55,0 +0,0,0,0,22,1,1,20.05,0 +1,0,1,1,66,1,0,79.85,0 +1,1,1,0,1,1,1,70.3,1 +0,0,1,0,1,1,1,79.35,1 +1,0,1,1,34,1,1,90.05,0 +0,0,1,1,72,1,0,24.45,0 +1,0,1,1,31,0,0,59.95,0 +1,0,0,1,30,1,0,25.35,0 +0,0,0,0,9,1,1,90.8,1 +1,0,1,1,20,1,1,70.45,1 +1,1,1,0,19,0,1,34.3,0 +0,0,1,0,65,1,1,105.05,0 +0,0,1,1,30,1,0,19.3,0 +1,0,0,0,6,1,0,19.15,0 +0,0,0,0,2,0,0,51.4,0 +1,0,1,1,53,1,0,71.85,0 +1,1,1,0,7,1,1,75.4,0 +0,0,1,1,61,1,1,49.7,0 +1,1,0,0,70,0,1,45.25,1 +0,0,0,0,13,1,1,78.75,0 +1,1,1,0,35,1,1,81.6,0 +0,0,1,0,2,1,1,70.4,0 +0,0,0,0,3,1,1,75.8,1 +0,0,0,0,3,1,0,76.1,0 +0,0,0,0,62,1,1,94.0,0 +1,0,1,1,72,1,0,103.95,0 +1,0,1,0,63,1,1,19.95,0 +1,1,0,0,20,1,0,71.3,1 +0,1,0,0,35,1,1,110.8,0 +1,1,1,0,21,1,1,69.1,1 +1,0,1,0,62,1,0,96.1,0 +0,0,0,0,15,1,1,48.8,0 +0,0,0,0,55,1,1,50.55,0 +0,0,0,0,11,1,1,44.65,0 +0,0,1,1,17,1,0,88.25,1 +0,0,0,0,61,1,0,19.45,0 +0,0,1,0,71,1,0,89.3,0 +0,0,0,0,2,1,0,70.0,1 +1,0,0,0,35,1,0,19.25,0 +0,0,0,0,17,1,0,70.5,0 +0,0,0,0,21,1,1,97.35,1 +0,0,1,0,47,1,0,19.65,0 +0,0,1,0,3,1,0,20.85,0 +1,0,0,0,3,1,1,19.65,0 +1,1,1,0,44,1,1,19.35,0 +0,0,0,0,1,1,1,44.0,0 +0,0,1,1,44,1,0,94.4,0 +1,0,1,1,5,1,1,25.9,1 +1,0,0,0,24,1,1,55.65,1 +0,0,0,1,1,1,1,69.65,1 +0,0,0,0,18,1,1,75.4,0 +0,0,0,0,10,1,1,100.6,1 +0,0,1,0,65,1,0,71.0,0 +0,1,0,0,1,1,1,86.0,1 +0,0,0,0,53,1,1,106.95,1 +1,0,0,0,3,1,0,21.2,0 +1,0,1,0,33,1,1,61.05,0 +1,0,0,0,3,0,1,29.6,1 +0,0,0,0,34,1,1,79.95,0 +0,0,1,1,14,1,1,19.7,0 +0,0,0,0,13,1,1,20.3,0 +1,1,1,0,46,0,1,59.9,1 +1,0,1,1,23,1,0,24.35,0 +0,0,1,1,47,1,0,19.75,0 +1,0,0,1,17,1,1,50.3,0 +0,0,1,1,49,1,1,95.6,1 +1,1,1,0,59,0,1,50.25,0 +0,0,0,0,69,1,1,85.35,0 +1,0,0,0,11,0,1,41.6,1 +1,0,0,0,10,1,1,51.65,0 +1,0,1,1,12,1,1,24.0,0 +1,0,0,0,45,1,1,100.85,1 +0,0,1,1,39,1,1,59.85,0 +1,1,1,0,71,1,0,25.45,0 +1,0,1,1,71,1,0,23.9,0 +0,0,1,1,33,1,0,24.15,0 +1,1,0,0,67,1,1,75.7,0 +1,0,1,1,37,0,0,40.2,1 +1,0,1,1,49,1,0,84.5,1 +0,0,1,0,9,1,0,50.85,0 +1,0,1,0,52,1,1,91.6,0 +0,0,0,0,70,1,0,98.9,0 +1,0,0,0,1,1,1,85.0,0 +0,1,0,0,14,1,1,78.95,1 +1,0,0,0,1,1,1,44.3,0 +1,0,0,0,1,1,0,20.2,1 +0,0,0,0,52,1,1,80.2,0 +1,0,0,0,6,1,0,60.9,0 +1,0,1,0,7,0,0,34.2,0 +0,1,0,0,47,1,1,85.2,1 +0,0,0,0,26,1,1,87.15,0 +1,0,1,1,25,1,0,54.3,0 +1,0,0,0,69,1,1,19.1,0 +0,0,0,0,72,1,1,112.75,0 +1,0,0,0,4,1,1,19.95,0 +1,0,1,1,59,1,0,19.5,0 +1,0,0,0,67,1,0,65.55,0 +0,1,0,0,26,1,1,78.8,0 +0,0,0,0,27,1,0,78.2,0 +1,0,1,1,72,1,0,105.25,0 +0,0,0,0,6,1,1,89.25,0 +1,0,1,1,62,1,0,20.65,0 +1,0,0,0,20,1,1,68.7,0 +1,0,0,0,6,1,0,78.65,0 +1,0,0,0,51,1,0,24.75,0 +0,0,1,1,61,1,0,19.75,0 +1,1,1,0,62,1,1,89.1,0 +0,0,0,0,72,1,1,84.7,0 +1,1,1,0,13,1,1,98.0,1 +1,0,1,0,5,1,1,94.45,1 +1,1,0,0,3,1,1,105.0,1 +0,1,1,0,26,1,1,93.85,1 +1,1,0,0,13,1,1,59.9,0 +0,0,1,1,38,1,1,19.95,0 +0,1,1,0,8,1,1,84.0,1 +1,1,1,1,34,1,1,108.9,0 +1,0,0,0,18,0,0,33.6,0 +1,0,1,1,56,1,1,85.85,0 +0,0,0,0,36,0,1,34.85,0 +0,0,1,0,9,0,1,48.75,1 +1,0,0,0,1,1,1,84.85,1 +1,0,0,0,12,1,0,56.65,1 +0,1,1,1,57,1,1,95.3,0 +0,0,0,0,42,1,0,73.9,1 +0,0,1,1,33,1,1,24.5,1 +1,0,1,0,70,1,0,84.6,0 +0,0,0,0,68,0,0,44.95,0 +1,0,0,1,1,0,1,24.7,0 +0,0,0,0,37,1,0,100.3,0 +0,0,0,1,4,1,1,25.45,0 +1,0,0,0,1,1,1,50.7,0 +1,0,0,0,20,0,1,55.0,0 +1,0,1,1,72,1,0,68.4,0 +0,0,0,0,31,1,1,89.9,1 +1,1,1,0,18,1,0,78.55,1 +1,0,1,0,11,1,1,55.05,0 +0,0,1,1,33,1,0,19.8,0 +0,1,0,0,62,1,0,84.45,0 +0,0,0,0,1,0,0,35.9,0 +1,0,1,0,16,1,0,80.75,0 +1,0,1,1,22,1,1,78.65,0 +0,0,1,1,49,1,0,61.75,0 +1,0,1,1,36,1,1,63.7,0 +1,0,1,0,42,1,1,99.45,1 +1,1,0,0,4,0,1,25.2,1 +0,0,0,0,12,1,0,74.05,1 +0,0,0,0,31,1,0,87.6,0 +1,0,1,0,5,1,1,89.15,0 +1,0,1,1,66,1,0,20.0,0 +0,1,0,0,15,1,0,55.0,1 +1,0,0,0,64,1,1,104.4,0 +1,0,1,1,10,1,1,20.05,0 +1,0,1,1,7,1,1,89.75,1 +1,0,0,0,29,0,0,34.3,0 +1,0,0,0,57,1,0,20.65,0 +0,0,0,0,46,1,0,84.25,0 +1,0,0,0,53,1,0,19.65,0 +0,0,0,0,17,1,0,79.85,0 +0,0,1,1,38,1,1,20.2,0 +1,0,0,0,15,1,0,19.8,0 +0,0,0,0,22,0,1,50.35,0 +1,0,1,0,14,1,1,85.15,1 +0,0,1,0,57,1,0,74.6,0 +1,1,0,0,11,1,1,79.15,0 +0,0,1,1,1,1,0,20.35,0 +1,0,1,1,12,1,0,21.05,0 +1,1,1,0,3,1,1,94.6,1 +1,0,0,1,36,1,1,94.7,0 +1,0,0,0,16,1,1,94.25,1 +1,0,1,1,65,1,0,72.45,1 +1,0,0,0,2,1,0,74.95,0 +0,0,0,0,42,1,1,105.2,1 +1,0,1,1,72,1,0,111.95,0 +1,0,0,0,62,1,0,19.85,0 +0,0,0,0,6,1,1,89.75,0 +1,0,1,0,48,1,1,20.05,0 +1,0,0,0,35,1,1,108.95,0 +1,0,0,1,52,1,0,19.65,0 +0,0,0,0,1,0,1,24.9,0 +1,0,1,0,6,1,1,82.85,1 +0,0,1,0,71,1,0,93.2,0 +0,0,1,1,67,1,0,84.8,0 +1,1,0,0,60,1,1,71.75,0 +1,0,1,1,23,0,1,30.35,0 +1,0,0,1,39,0,0,54.85,0 +1,0,1,1,15,1,1,19.5,0 +1,1,1,0,53,1,1,103.85,1 +1,0,1,1,24,1,0,24.2,0 +0,0,1,1,37,1,0,19.35,0 +0,0,1,1,5,1,1,83.6,1 +0,1,1,0,50,1,1,100.65,0 +0,0,0,0,54,1,1,94.1,0 +0,0,0,0,3,1,1,74.55,0 +1,0,0,0,68,1,0,108.45,1 +1,0,0,0,5,1,0,56.15,0 +1,0,0,0,33,1,0,20.35,0 +0,0,0,0,41,1,1,80.55,0 +0,0,1,1,34,0,0,61.25,0 +0,0,1,1,13,1,1,20.45,0 +0,0,0,0,20,1,1,18.9,0 +0,1,0,0,51,1,0,19.6,0 +0,0,1,0,3,1,1,91.5,1 +0,0,0,1,41,1,0,45.2,0 +0,0,0,0,13,1,0,19.45,0 +1,0,1,1,35,1,0,25.45,0 +1,0,1,0,12,1,0,80.85,1 +1,0,0,0,4,1,1,94.9,0 +0,0,0,0,43,0,1,49.05,1 +0,1,1,1,12,0,1,29.3,0 +1,1,1,0,68,1,1,105.3,1 +1,1,0,0,25,1,1,88.95,1 +0,0,0,0,7,1,0,20.25,0 +1,1,1,0,66,1,1,110.85,1 +0,0,1,0,53,1,0,110.5,0 +1,1,0,0,63,1,1,109.4,0 +0,0,1,1,70,1,1,114.2,1 +1,1,1,0,27,0,0,36.5,1 +0,0,0,0,1,1,0,70.75,1 +0,0,0,0,5,1,0,19.95,0 +0,1,1,0,37,1,0,19.6,0 +1,0,0,0,3,0,1,40.15,1 +0,0,0,1,12,1,1,76.6,0 +0,0,1,1,38,1,0,19.6,0 +0,0,0,0,9,1,1,85.3,0 +1,0,1,0,13,1,1,65.85,0 +1,1,1,0,29,1,1,94.45,1 +0,0,1,1,47,1,0,20.05,0 +1,0,1,0,61,1,0,99.4,0 +1,0,0,0,16,1,0,20.0,0 +0,0,1,1,41,1,0,78.45,0 +0,0,0,1,43,1,1,25.1,0 +0,0,1,1,36,1,1,97.35,1 +0,0,0,0,6,1,1,55.0,0 +0,0,0,0,58,1,1,71.1,0 +1,0,0,0,19,1,1,61.55,0 +1,0,1,0,11,1,1,45.9,0 +0,0,0,0,39,0,1,40.3,0 +0,1,0,0,8,1,1,87.1,0 +0,0,0,1,26,1,1,49.5,0 +0,1,0,0,53,1,1,73.8,0 +0,0,1,1,70,1,1,19.2,0 +1,0,0,0,1,0,1,45.3,1 +1,0,0,0,59,1,0,25.0,0 +1,0,0,0,2,1,0,94.95,1 +1,0,0,0,7,0,0,35.3,0 +0,0,0,1,12,1,1,44.55,1 +1,0,1,1,59,1,0,76.75,0 +1,0,1,1,61,1,1,81.0,0 +1,0,1,1,72,1,1,105.55,0 +0,0,1,1,13,1,0,18.8,0 +0,0,1,1,64,1,0,24.9,0 +1,0,1,0,1,0,1,23.45,1 +0,0,0,0,10,1,0,64.9,0 +0,0,1,1,65,1,0,61.35,0 +0,0,1,0,62,1,0,113.95,0 +0,0,1,0,55,1,1,90.15,0 +0,0,1,0,25,1,0,54.1,0 +1,0,0,0,1,0,0,29.7,1 +1,0,0,0,1,1,1,49.8,0 +0,0,1,0,59,1,0,101.1,1 +1,1,1,1,64,1,1,24.4,0 +1,0,1,0,36,1,1,95.0,0 +0,0,0,0,3,1,1,50.65,1 +1,0,1,0,61,1,1,69.9,0 +1,0,0,1,26,0,1,39.95,0 +0,0,0,0,1,1,1,55.4,1 +0,1,1,0,1,1,1,90.6,1 +1,0,1,1,68,1,1,103.25,0 +1,1,1,0,2,1,1,86.85,1 +0,0,1,0,72,1,1,94.25,0 +0,0,1,0,71,0,1,47.05,0 +1,0,0,0,57,1,0,20.55,0 +1,0,0,0,4,1,1,19.65,0 +0,1,0,0,1,1,1,70.2,0 +1,0,1,1,72,1,0,81.0,0 +1,0,1,1,21,1,1,75.9,0 +0,0,1,1,71,1,0,24.7,0 +0,1,1,0,29,1,1,99.05,1 +0,1,0,0,69,1,0,110.25,0 +0,0,1,0,64,1,1,85.0,0 +1,0,0,0,16,1,0,19.75,0 +0,0,0,0,4,1,0,23.9,0 +0,0,0,0,52,1,1,111.25,1 +1,0,0,0,2,1,1,55.1,1 +1,0,0,0,1,1,0,19.95,0 +1,0,0,0,18,0,0,25.15,0 +0,0,0,0,2,1,0,54.15,0 +0,0,1,0,19,1,1,59.8,0 +0,0,0,0,40,1,0,83.85,0 +0,1,1,1,66,1,1,104.9,0 +1,0,0,0,21,1,0,75.3,0 +1,0,0,0,8,1,1,66.65,0 +0,0,1,1,72,1,1,109.5,0 +0,0,0,0,48,1,1,73.85,0 +1,0,0,0,69,1,1,19.3,0 +1,0,0,0,72,1,1,118.2,0 +0,0,0,0,14,1,0,51.45,0 +1,0,0,0,6,1,0,59.45,0 +0,0,1,1,8,1,0,19.5,0 +0,0,0,0,17,1,0,19.55,0 +1,0,0,0,65,1,0,93.55,0 +0,0,1,1,57,1,1,59.3,0 +1,0,1,0,13,1,1,102.25,1 +1,1,0,0,19,1,1,95.9,1 +0,0,1,0,56,1,0,109.8,0 +0,0,1,0,14,1,1,78.1,0 +1,0,1,0,52,0,1,39.9,0 +0,0,0,0,58,1,1,64.9,0 +0,1,0,0,47,1,1,95.05,1 +0,0,0,0,67,0,1,53.4,0 +1,0,0,0,2,0,1,24.9,0 +1,1,0,0,6,1,0,44.7,0 +1,0,1,1,71,1,1,114.0,0 +0,0,1,1,46,1,0,20.25,0 +0,0,0,0,5,1,0,53.85,1 +1,1,1,0,67,1,0,83.85,0 +1,0,0,1,3,1,0,20.2,0 +0,0,0,0,3,1,0,19.95,0 +1,1,1,0,52,1,1,104.2,1 +0,0,1,0,42,1,1,50.25,1 +1,0,1,1,50,1,1,20.35,0 +1,1,1,0,23,1,1,90.0,0 +0,0,1,1,67,0,0,54.2,0 +0,0,0,0,25,1,1,99.5,1 +0,1,1,0,39,1,0,99.1,0 +0,0,0,0,69,1,1,66.9,0 +0,0,0,0,1,0,0,25.85,0 +1,0,0,0,32,1,0,91.05,0 +0,0,0,0,9,1,0,71.0,1 +0,0,0,0,16,1,1,93.2,1 +1,0,1,1,60,1,1,20.95,0 +0,0,1,1,72,1,1,109.2,0 +1,0,1,0,5,1,0,19.35,1 +0,1,0,0,26,1,1,85.8,0 +1,0,0,0,3,1,0,19.85,1 +1,0,0,0,2,1,1,19.65,0 +0,0,0,1,2,1,0,20.5,0 +0,0,0,0,36,1,1,89.65,0 +1,0,0,0,7,1,0,74.35,0 +0,1,1,0,60,0,1,49.45,0 +0,0,1,0,19,1,1,89.1,0 +1,1,1,0,45,1,0,75.15,0 +1,1,0,0,4,1,1,70.65,0 +0,0,1,1,31,1,1,104.2,1 +1,0,1,1,47,1,0,90.05,0 +1,0,0,0,1,1,1,79.25,1 +0,0,0,0,1,1,1,44.9,1 +0,0,0,0,1,1,0,19.4,0 +0,1,1,1,59,1,1,88.75,0 +1,0,1,0,10,1,1,70.1,1 +1,1,0,0,35,1,0,91.0,0 +1,0,0,0,4,0,1,29.65,1 +1,0,1,1,32,1,1,90.8,0 +1,0,0,0,43,1,1,77.85,1 +1,0,0,0,4,1,0,54.3,1 +0,1,1,0,54,1,1,18.95,0 +0,1,0,0,11,1,1,95.15,1 +0,1,0,0,66,1,1,102.4,0 +1,0,1,1,61,1,1,99.9,0 +1,0,1,1,72,1,0,88.7,0 +1,0,1,1,44,0,1,54.3,0 +1,0,0,0,41,1,1,55.7,0 +1,0,1,0,50,1,1,103.95,0 +1,0,1,0,47,1,1,110.85,1 +1,0,1,1,8,1,0,20.15,0 +1,0,0,0,18,1,0,20.05,0 +1,0,1,1,72,1,1,91.95,0 +1,0,0,0,1,1,0,80.5,1 +0,1,0,0,42,1,0,55.65,0 +0,1,0,0,18,1,1,74.7,0 +0,0,0,1,13,1,1,104.15,0 +0,0,1,1,68,1,1,83.65,0 +1,0,0,0,4,1,1,72.2,1 +1,0,0,0,69,1,1,110.05,0 +1,0,0,0,17,1,0,51.5,1 +1,0,1,1,25,1,0,25.5,0 +1,1,0,0,43,1,1,89.55,1 +0,0,1,1,59,1,0,19.5,0 +0,1,0,0,5,1,0,80.7,0 +1,0,1,1,21,1,0,77.5,1 +0,0,1,1,69,1,1,105.1,0 +1,0,0,0,13,0,1,25.15,0 +1,0,1,0,42,1,1,95.25,1 +1,0,1,0,52,1,1,95.65,0 +1,1,0,0,46,1,0,85.0,1 +1,0,1,0,61,1,1,80.8,0 +1,0,0,0,29,0,1,24.85,0 +0,0,0,1,25,1,1,54.75,0 +0,0,1,1,5,1,1,85.75,1 +1,0,0,0,15,0,0,50.75,0 +0,0,1,1,19,1,0,20.15,0 +1,0,0,0,44,1,0,20.05,0 +0,1,0,0,6,1,1,98.25,1 +1,0,1,1,58,1,0,71.6,0 +1,0,1,1,62,1,1,81.45,0 +0,0,1,1,70,0,1,58.4,0 +0,1,0,0,1,0,1,25.7,1 +1,0,1,1,10,0,0,53.7,0 +1,0,0,0,26,1,1,19.6,0 +1,0,0,0,66,1,0,89.4,0 +0,0,1,1,7,1,1,69.0,1 +1,0,1,1,51,1,0,84.2,0 +1,0,1,1,72,1,1,106.1,0 +1,0,0,0,65,1,0,25.75,0 +1,0,0,0,2,1,0,46.05,1 +1,0,0,1,70,1,0,64.95,0 +1,0,1,0,72,1,1,85.45,0 +0,0,1,1,1,1,0,20.05,0 +0,1,1,0,1,1,1,76.4,1 +0,0,0,0,5,1,1,100.5,1 +1,0,0,0,3,1,0,20.7,0 +1,0,0,0,58,1,1,25.3,0 +1,1,1,1,22,0,0,40.05,1 +1,1,1,0,33,1,1,100.6,0 +1,0,0,0,1,1,0,69.95,1 +1,1,1,0,54,1,0,74.0,0 +1,0,1,0,72,1,1,99.4,0 +1,0,0,1,1,1,1,93.3,1 +1,0,0,0,3,1,1,49.15,1 +0,0,1,1,72,1,0,107.45,0 +0,0,1,1,72,1,1,83.6,0 +1,1,1,0,54,1,1,99.05,0 +0,0,1,0,59,1,1,80.1,0 +1,0,0,0,54,1,1,65.3,0 +1,0,0,0,60,1,1,89.55,0 +0,0,1,0,60,0,0,60.8,0 +1,0,0,0,3,1,0,74.5,0 +0,0,1,0,69,1,0,99.15,0 +0,0,1,1,1,1,0,19.25,0 +1,0,1,1,50,0,1,39.45,0 +0,0,0,0,56,0,1,44.85,0 +0,0,1,0,60,1,1,97.2,0 +1,1,1,0,69,1,1,110.55,0 +0,0,0,0,1,0,0,35.05,1 +0,1,0,0,1,1,1,73.0,1 +0,0,1,0,3,1,1,19.9,0 +1,0,1,1,60,1,0,76.95,0 +0,0,0,0,13,0,0,35.4,0 +1,0,1,1,62,1,0,20.45,0 +0,0,0,0,45,1,0,96.75,0 +0,0,0,0,25,0,0,54.2,0 +1,0,0,0,44,1,0,100.1,0 +0,0,0,0,2,1,1,45.25,0 +1,1,0,0,33,1,1,83.85,1 +0,0,0,0,1,1,1,70.1,1 +0,0,0,0,22,1,0,20.85,0 +0,0,0,0,35,0,1,33.45,0 +0,0,1,1,29,1,0,20.2,0 +1,1,1,0,27,1,1,85.9,0 +1,0,0,1,54,1,1,61.0,0 +0,1,0,0,2,1,1,70.65,1 +1,0,0,0,57,1,1,86.9,0 +1,0,0,0,62,1,0,69.4,0 +0,0,1,1,15,1,0,20.35,0 +1,0,0,0,2,1,0,20.35,1 +0,0,1,0,70,1,1,104.3,0 +0,0,1,1,21,1,1,44.95,0 +0,0,0,1,23,1,1,49.45,0 +1,0,0,0,6,1,0,20.6,0 +1,0,1,1,4,1,0,19.55,0 +0,0,0,0,3,1,1,99.0,1 +0,0,0,0,23,1,1,93.5,0 +1,0,0,0,26,0,0,54.55,0 +0,0,0,1,8,1,0,20.05,0 +1,0,0,0,26,1,1,83.95,1 +1,0,0,0,2,1,1,79.45,0 +1,0,0,0,67,1,0,116.2,1 +0,0,1,0,71,1,1,93.7,1 +0,0,0,0,59,1,0,79.85,0 +1,0,1,1,39,1,0,100.0,0 +1,0,0,1,21,1,0,19.6,0 +1,0,0,0,1,1,0,19.7,1 +0,0,1,1,48,1,0,20.2,0 +0,1,1,0,31,0,1,50.4,0 +0,0,1,1,64,1,0,113.35,0 +1,0,1,1,46,1,1,80.0,0 +0,0,0,0,52,1,1,80.95,0 +0,0,1,1,67,1,1,24.9,0 +0,1,0,0,67,1,0,54.9,0 +0,0,0,0,5,1,0,75.55,1 +0,0,1,0,71,1,0,109.25,0 +0,0,0,0,9,1,1,77.65,1 +0,1,0,0,26,1,1,95.0,1 +1,0,0,0,71,1,1,116.3,0 +0,0,0,0,32,1,0,19.9,0 +0,0,0,0,2,1,0,70.35,0 +0,0,1,0,71,1,0,25.6,0 +0,0,0,0,60,0,1,44.45,0 +0,1,0,0,55,1,1,100.15,0 +1,0,0,0,54,1,1,105.4,1 +1,0,0,0,2,1,1,95.85,1 +0,0,0,0,6,1,1,73.85,0 +0,0,1,1,48,1,1,70.1,0 +1,0,1,1,63,1,0,25.25,0 +1,0,0,0,1,1,1,79.15,1 +1,0,0,1,12,1,0,21.05,0 +1,1,1,0,54,0,1,24.95,0 +0,0,1,1,30,1,1,64.5,0 +0,0,1,0,30,1,0,19.65,1 +0,0,0,0,4,1,1,79.0,1 +0,0,0,0,40,1,1,105.95,0 +0,0,1,1,9,1,1,75.85,0 +0,0,1,1,17,1,0,91.85,1 +0,0,0,0,62,0,1,43.6,0 +1,0,0,0,28,1,1,91.25,0 +0,0,0,0,70,1,0,89.75,0 +0,0,0,0,46,1,1,104.4,0 +0,0,1,0,23,1,0,90.15,0 +1,0,1,1,47,0,0,40.3,0 +1,0,1,1,68,1,1,105.25,0 +0,1,0,0,60,1,1,106.0,1 +0,0,0,1,67,1,1,104.0,0 +0,0,0,0,14,1,1,69.65,0 +1,0,1,1,57,1,1,74.3,0 +0,0,1,1,55,1,0,100.9,0 +1,0,0,0,1,1,1,20.25,0 +1,0,0,1,1,1,1,49.9,1 +1,0,0,0,23,1,1,96.9,0 +0,0,0,0,13,1,1,100.35,1 +1,0,1,0,47,1,1,104.1,0 +1,0,0,0,38,1,0,20.1,0 +0,1,1,0,38,1,1,74.95,1 +0,1,0,0,2,1,1,56.55,0 +1,1,1,1,1,1,1,49.25,1 +1,0,1,0,15,1,1,68.6,0 +0,0,0,0,26,1,1,69.05,0 +0,0,1,1,35,1,0,19.7,0 +1,0,0,1,3,1,1,20.05,0 +1,0,1,1,50,1,0,103.7,1 +1,0,1,0,42,1,1,94.4,0 +1,0,1,0,10,1,1,54.95,0 +0,0,1,0,61,1,0,93.7,0 +0,0,0,0,68,1,0,110.25,0 +1,0,0,0,10,1,1,98.9,0 +1,0,1,0,65,1,0,89.75,1 +0,0,1,1,72,1,1,80.45,0 +1,0,1,1,55,1,0,79.4,0 +0,0,0,0,1,1,1,20.3,1 +0,0,0,0,7,1,0,62.8,0 +0,0,0,0,2,1,1,74.9,0 +0,0,0,0,9,1,1,74.85,0 +1,0,0,1,27,1,1,25.85,0 +1,1,1,0,7,1,1,101.95,1 +0,0,1,0,64,1,1,68.3,0 +1,0,0,0,70,0,0,48.4,0 +1,1,0,0,2,1,1,94.0,1 +1,1,0,0,67,1,1,105.05,0 +0,0,0,0,45,1,1,89.3,1 +0,0,0,0,24,1,0,25.15,0 +1,0,1,1,4,1,0,19.5,0 +1,0,1,1,44,1,1,92.95,0 +0,0,1,1,72,1,1,20.7,0 +0,0,0,0,1,1,1,74.3,1 +1,0,0,0,66,1,0,19.35,0 +1,0,0,0,1,0,1,44.65,1 +1,0,1,1,13,1,0,84.05,1 +1,0,0,0,10,1,1,80.7,1 +1,1,1,0,65,1,1,104.35,0 +1,0,0,1,1,1,0,19.55,0 +1,0,1,1,38,1,0,74.05,0 +1,0,0,1,23,0,0,40.1,0 +0,0,1,0,10,1,0,20.1,0 +1,0,0,1,4,1,1,101.7,1 +1,0,1,1,72,1,1,83.55,0 +0,0,1,0,35,1,0,56.85,0 +0,0,0,0,1,1,0,20.4,1 +0,0,1,1,58,1,0,19.55,0 +1,0,1,1,70,1,1,106.15,0 +1,0,1,1,38,1,0,78.95,0 +0,0,1,1,60,0,1,49.75,0 +1,0,0,0,26,1,1,92.4,0 +0,0,0,0,8,1,0,58.2,0 +1,0,1,1,41,1,1,102.6,1 +0,1,1,0,36,1,1,91.95,0 +1,1,0,0,54,1,0,65.25,0 +1,0,1,1,71,1,1,106.0,1 +0,0,0,0,55,1,1,73.1,0 +0,0,0,0,72,1,0,59.75,0 +0,0,0,1,3,1,1,55.1,1 +0,0,1,1,54,1,1,59.8,0 +1,0,1,1,72,1,1,116.6,0 +1,0,0,0,52,1,1,109.3,0 +0,1,0,0,60,1,1,101.4,0 +0,0,0,0,39,0,1,50.65,0 +0,0,0,0,15,1,0,56.15,0 +1,0,0,0,69,1,1,106.5,1 +1,0,1,1,43,1,1,19.2,0 +0,1,0,0,63,1,0,83.0,0 +1,1,1,0,2,1,0,70.1,0 +0,0,1,1,72,1,1,108.3,0 +0,0,1,1,32,1,1,91.05,1 +1,0,1,1,40,1,0,25.25,0 +0,0,1,0,58,0,1,45.35,0 +1,0,0,0,67,0,0,43.9,0 +0,1,1,0,51,1,1,77.5,1 +1,0,1,0,31,1,1,79.3,0 +1,1,1,0,69,1,1,84.9,0 +1,0,1,0,32,1,1,79.25,0 +0,0,0,0,21,1,0,71.05,0 +1,0,0,0,52,1,0,53.75,0 +0,0,1,1,72,1,0,24.25,0 +0,0,1,0,72,0,1,54.2,1 +1,0,1,1,52,0,0,44.25,0 +0,0,0,0,41,1,0,50.05,0 +1,0,0,0,41,1,0,20.15,0 +0,0,0,0,6,1,1,69.25,1 +1,0,1,1,67,1,1,69.35,0 +0,0,1,1,16,1,0,19.35,0 +1,0,0,0,17,1,0,19.15,0 +1,0,1,0,35,1,0,61.0,0 +0,0,1,1,58,1,0,20.5,0 +1,0,0,0,1,1,1,50.5,1 +1,0,1,1,52,0,0,50.2,0 +0,0,0,0,70,1,0,79.6,0 +0,0,1,1,19,1,1,24.9,0 +1,1,0,0,1,1,1,74.4,1 +0,0,1,1,35,1,1,106.9,0 +0,0,0,0,32,1,1,101.35,0 +0,0,1,1,17,1,1,55.35,0 +0,0,1,1,67,1,0,50.55,0 +0,0,0,0,9,1,0,19.5,0 +1,0,0,1,31,1,1,79.45,1 +1,0,0,0,4,1,0,90.65,0 +1,1,1,1,58,1,1,89.85,0 +1,0,0,0,60,1,0,79.0,0 +1,0,0,0,58,1,1,104.65,1 +1,0,0,0,1,1,0,19.55,0 +0,0,1,1,27,1,0,19.9,0 +1,1,1,1,66,1,1,116.25,0 +1,0,0,0,15,1,1,87.75,0 +1,1,1,0,47,1,1,100.05,1 +0,0,0,0,41,1,1,81.3,0 +1,0,1,0,59,0,1,44.3,0 +0,0,0,1,50,1,0,70.35,0 +1,0,1,1,17,0,0,44.45,0 +1,0,1,1,6,1,1,49.15,0 +1,1,1,0,51,0,1,29.45,0 +1,0,0,0,44,1,0,100.55,1 +1,0,1,0,49,1,1,85.3,0 +1,0,0,0,2,1,0,95.65,1 +1,0,1,0,59,1,1,69.1,0 +1,1,0,0,50,1,1,70.35,0 +0,0,1,1,59,1,0,20.6,0 +1,0,0,0,18,1,0,74.15,0 +1,0,0,0,10,1,0,75.05,0 +1,0,1,0,14,1,0,44.6,0 +1,0,0,0,35,1,0,21.45,0 +1,0,1,1,8,1,1,43.45,0 +1,0,1,1,18,1,0,20.05,0 +0,0,1,1,60,1,0,94.15,0 +0,0,0,0,1,1,0,94.4,1 +0,0,0,0,6,1,0,19.55,0 +0,0,0,1,19,1,1,75.9,0 +1,0,1,1,53,1,0,64.15,0 +1,1,1,0,72,1,1,109.55,0 +0,0,1,0,60,1,1,110.8,0 +0,0,0,0,1,1,1,55.0,1 +0,0,0,1,13,1,0,53.45,0 +0,0,1,1,5,1,0,69.95,0 +1,0,0,0,1,1,1,101.45,1 +1,0,1,1,13,1,0,97.0,0 +1,0,0,0,37,1,1,90.6,0 +1,0,1,0,64,1,1,73.55,0 +0,0,1,0,5,1,0,67.95,1 +0,0,1,0,61,1,1,94.35,0 +0,0,0,0,1,1,1,69.5,1 +1,0,0,0,1,1,1,18.85,1 +1,0,0,0,26,1,0,19.4,0 +0,0,0,0,1,1,1,69.2,1 +1,0,1,0,24,1,0,19.75,0 +1,0,1,0,17,0,0,54.6,0 +0,0,0,1,26,0,1,29.8,0 +1,0,0,0,1,1,1,69.65,1 +1,1,1,0,40,1,0,101.85,1 +1,0,0,0,52,1,1,103.05,0 +0,0,0,0,1,1,1,82.3,1 +1,0,0,0,1,1,0,20.3,0 +0,0,0,0,21,0,0,35.1,0 +0,0,1,0,67,1,1,105.7,0 +0,0,1,1,44,1,0,56.25,0 +1,0,1,1,70,0,0,60.35,0 +1,0,0,0,3,1,0,79.25,1 +1,0,1,1,56,1,1,59.8,0 +0,0,0,0,13,1,1,84.6,1 +0,0,1,1,58,1,1,93.4,1 +0,0,1,1,42,1,1,94.2,1 +1,1,1,0,1,0,0,25.05,1 +0,0,1,1,46,1,0,99.65,0 +0,0,1,1,63,1,1,50.65,0 +1,0,0,0,11,1,1,60.9,0 +1,0,1,1,15,1,1,59.65,0 +1,0,1,0,72,0,1,64.7,0 +0,0,0,0,29,0,1,25.1,1 +1,0,0,1,1,1,0,48.95,1 +0,0,1,1,6,1,0,54.85,0 +1,0,0,0,1,1,0,45.3,1 +1,0,1,1,63,1,1,91.35,0 +1,0,0,0,2,1,1,85.85,1 +0,0,1,1,18,1,0,25.1,0 +0,0,1,0,43,0,0,34.0,0 +0,0,0,0,15,0,0,45.9,0 +1,0,0,1,10,1,0,95.2,1 +1,0,1,1,55,1,0,20.5,0 +1,0,0,1,49,1,1,100.6,1 +1,0,1,1,6,1,1,55.3,1 +1,0,1,1,70,1,0,20.35,0 +1,1,0,0,2,1,1,74.85,1 +1,1,1,0,63,0,0,36.1,0 +0,0,0,0,25,1,1,65.8,0 +0,1,0,0,18,1,0,20.35,0 +1,1,1,0,28,1,1,105.8,0 +0,1,0,0,53,1,1,96.75,0 +1,0,0,0,35,1,1,102.35,1 +1,0,0,0,1,0,0,24.4,0 +1,0,1,0,70,1,0,115.65,1 +1,0,0,0,2,1,1,79.85,1 +0,0,1,0,26,1,1,73.05,0 +0,0,0,0,34,1,0,64.35,0 +0,0,0,1,19,1,0,20.5,0 +1,0,0,0,15,1,1,76.0,1 +0,0,1,1,62,1,0,54.75,0 +0,1,0,0,42,1,1,104.75,1 +0,0,0,0,9,1,1,74.65,1 +1,0,0,0,24,1,1,51.15,0 +1,1,1,0,68,0,1,41.95,0 +1,0,1,1,31,1,0,54.35,0 +0,0,0,0,1,1,1,56.25,1 +1,0,1,0,21,1,1,106.1,1 +0,0,1,0,63,1,1,96.0,0 +0,1,0,0,2,1,1,79.75,1 +0,0,1,1,61,0,1,61.45,0 +0,0,0,0,1,1,0,68.65,1 +1,0,0,0,18,1,0,19.65,0 +0,0,1,1,6,1,0,19.0,0 +0,0,0,0,33,1,1,100.0,0 +1,0,0,0,16,1,0,20.25,1 +0,0,1,0,56,1,1,98.7,0 +1,0,0,1,23,1,0,19.8,0 +1,0,0,0,9,1,1,73.8,0 +0,1,1,0,14,1,1,100.2,1 +1,0,1,1,15,1,1,74.9,1 +1,0,0,0,5,1,0,20.05,0 +1,0,1,0,61,1,1,106.2,0 +1,0,1,1,70,1,1,116.55,0 +1,0,0,0,15,1,1,99.7,0 +1,0,1,1,8,1,0,19.7,0 +0,0,1,1,8,1,0,19.5,0 +0,0,0,0,4,0,1,29.15,0 +0,0,0,0,34,1,0,55.0,0 +1,0,1,0,68,1,1,90.8,0 +0,0,1,1,45,0,0,51.0,0 +0,1,0,0,9,1,1,90.1,0 +0,0,0,0,22,1,1,59.05,0 +0,0,0,0,2,1,0,20.3,0 +1,0,1,0,70,1,0,72.95,0 +0,0,0,1,10,1,0,73.55,0 +1,0,0,0,72,1,0,84.3,0 +0,0,1,1,49,1,0,78.0,0 +0,1,0,0,54,1,0,72.1,0 +0,0,0,0,71,1,1,106.75,0 +0,0,0,0,22,1,1,19.25,0 +0,0,1,1,50,1,0,20.55,0 +0,0,1,1,43,1,0,20.0,0 +0,0,1,1,45,1,1,24.65,0 +1,1,0,0,64,1,1,103.5,0 +0,0,1,1,23,1,0,23.85,0 +0,0,1,0,68,1,0,25.8,0 +0,0,0,0,1,1,1,70.85,1 +1,0,0,0,2,1,1,69.8,1 +1,0,0,0,26,1,0,59.45,0 +1,0,1,0,55,0,1,54.55,1 +1,0,0,0,14,1,1,20.05,0 +1,0,1,0,71,1,1,82.55,0 +1,0,0,0,64,1,0,81.25,0 +0,0,0,0,7,1,1,70.75,1 +0,0,0,0,57,1,1,74.3,0 +0,0,1,0,13,1,0,94.1,1 +0,0,1,1,3,0,0,29.7,1 +1,1,1,0,72,1,0,109.7,0 +0,0,1,1,40,1,1,96.35,0 +1,0,1,0,14,1,1,66.6,0 +1,0,1,1,2,1,1,44.5,0 +1,1,0,0,66,1,0,110.9,1 +0,0,1,0,38,1,1,105.0,1 +1,0,0,1,1,0,1,25.3,1 +1,0,0,0,22,1,1,55.15,1 +1,0,0,0,1,1,1,20.1,1 +1,0,0,0,5,1,1,80.1,0 +1,0,1,1,29,1,0,69.05,0 +1,0,1,1,1,1,1,69.9,1 +0,0,0,0,3,1,0,20.4,0 +1,0,1,1,71,1,0,19.7,0 +1,0,0,1,9,1,1,50.1,0 +1,0,0,0,43,1,1,101.4,1 +0,0,0,0,48,1,1,83.45,0 +1,0,0,0,26,1,1,86.65,0 +0,0,0,0,9,1,0,20.15,0 +1,0,0,0,1,1,1,80.8,1 +0,0,1,1,46,1,0,19.4,0 +1,0,0,0,2,1,0,62.05,1 +1,1,0,0,1,1,1,76.45,1 +1,0,1,1,64,0,1,60.05,0 +0,1,0,0,12,1,1,91.3,1 +1,1,1,0,6,1,1,95.75,1 +0,0,1,0,59,1,0,20.35,0 +0,0,0,0,7,1,1,94.05,0 +0,1,1,0,72,1,1,84.1,0 +1,1,0,0,16,1,1,78.75,0 +1,0,1,0,25,1,0,55.55,0 +0,0,1,0,34,1,0,62.65,1 +0,0,0,0,1,1,1,74.5,1 +0,0,1,1,10,1,1,102.1,1 +1,0,1,0,24,1,0,20.1,0 +0,0,1,1,10,1,0,70.3,0 +1,0,1,0,69,1,1,53.65,0 +1,0,0,0,57,1,0,20.75,0 +1,0,1,1,50,1,1,103.4,0 +1,0,1,1,28,0,0,50.8,0 +0,0,0,0,16,1,1,50.15,1 +1,0,0,0,25,1,1,79.0,0 +0,1,1,0,3,1,1,74.6,0 +1,0,1,0,61,1,1,96.5,0 +0,0,0,0,2,1,0,20.1,0 +1,0,1,1,51,1,0,19.4,0 +0,0,1,1,71,1,0,77.55,0 +0,0,1,1,20,1,0,20.05,0 +1,0,1,1,6,1,0,19.85,0 +0,0,0,0,6,1,0,20.2,0 +0,0,0,0,29,1,0,67.45,0 +1,0,0,0,36,1,1,18.55,0 +0,0,0,0,28,0,1,29.75,0 +0,0,1,0,7,1,1,86.5,1 +0,0,0,0,63,1,0,24.2,0 +1,0,1,1,48,1,0,23.55,0 +0,0,1,0,49,1,0,20.45,0 +1,1,0,0,27,1,1,81.45,1 +1,0,1,0,72,1,0,92.3,0 +1,0,1,0,1,1,1,69.15,1 +0,0,1,1,72,0,0,53.65,0 +0,0,0,0,47,0,0,39.65,0 +0,0,0,0,1,1,1,54.65,0 +0,0,0,0,36,1,1,104.8,0 +1,0,1,1,43,0,0,29.3,0 +0,1,1,0,27,1,0,83.85,0 +0,0,0,0,9,1,1,79.55,1 +0,0,0,0,38,1,1,103.65,0 +0,1,0,0,35,1,1,99.05,0 +0,0,1,0,59,1,1,100.05,0 +1,0,0,0,27,1,0,20.35,0 +0,1,0,0,2,1,0,43.95,0 +1,0,0,0,7,1,0,23.5,0 +0,0,0,0,36,1,1,70.7,0 +0,0,1,1,41,1,1,94.3,0 +0,0,0,0,13,0,0,29.15,0 +1,0,0,1,19,1,0,20.85,0 +0,0,1,0,60,0,0,37.7,0 +0,0,0,1,48,1,1,95.5,1 +1,1,0,0,3,1,0,91.05,1 +1,0,1,0,69,1,1,92.45,0 +1,0,0,0,43,0,0,44.15,0 +0,0,0,1,11,0,1,36.05,0 +0,0,1,0,45,1,1,50.25,0 +1,0,1,0,72,1,1,109.75,0 +0,1,1,0,2,1,0,79.2,1 +0,0,1,1,12,1,0,20.3,0 +0,0,1,1,67,1,1,112.35,0 +1,0,1,0,37,1,0,94.3,0 +0,0,0,0,39,0,0,41.15,0 +0,0,0,0,41,1,1,74.65,0 +0,0,0,0,25,0,1,48.25,0 +1,0,1,1,8,1,1,76.15,0 +0,0,1,1,71,1,0,71.1,0 +1,0,0,0,5,1,0,96.55,0 +0,0,0,0,30,1,1,79.3,0 +1,0,0,0,40,1,1,89.6,0 +0,0,0,0,54,1,1,20.5,0 +1,0,1,0,72,1,1,106.3,0 +1,0,1,1,28,1,0,100.35,0 +1,0,1,1,18,1,1,85.6,0 +0,0,0,0,2,0,1,45.25,1 +0,0,1,1,59,1,1,106.15,0 +1,0,1,1,22,1,1,51.1,0 +0,0,0,0,1,1,0,19.9,0 +0,1,1,0,72,1,1,25.7,0 +0,1,0,0,14,1,1,74.3,1 +1,0,1,0,50,1,0,99.4,0 +0,0,1,1,48,1,0,69.7,0 +0,0,1,1,49,1,1,98.35,0 +1,0,1,1,28,1,0,85.45,0 +1,1,0,0,68,1,1,95.9,0 +1,0,0,0,13,1,0,100.75,0 +0,0,0,0,11,1,1,89.2,0 +0,0,1,0,3,1,1,74.1,1 +1,1,1,0,57,1,0,100.6,1 +1,0,0,0,3,1,0,75.0,1 +1,0,1,0,72,1,0,25.75,0 +1,0,1,1,70,1,1,84.1,0 +0,0,1,1,49,1,0,79.3,0 +0,1,1,0,67,1,1,107.05,0 +1,0,0,0,46,1,0,20.05,0 +0,1,0,0,64,1,1,70.2,1 +0,0,1,0,37,1,0,19.5,0 +0,1,0,0,2,1,0,70.75,1 +0,1,1,0,13,0,0,45.3,0 +0,0,1,0,72,1,0,115.15,0 +1,0,1,1,68,1,1,72.95,0 +1,0,1,1,15,1,0,19.65,0 +0,0,0,0,24,1,1,19.55,0 +0,0,0,0,24,1,1,89.55,0 +1,0,0,0,27,1,0,50.35,0 +1,0,0,0,12,1,0,50.25,1 +0,0,1,1,71,1,0,87.25,0 +1,0,1,1,67,1,1,20.8,0 +0,0,1,0,63,1,1,109.25,0 +1,0,0,0,1,1,0,20.35,0 +1,0,0,0,4,1,1,55.9,0 +0,1,0,0,40,1,1,79.2,1 +0,0,0,0,12,1,1,96.0,1 +1,0,1,1,52,1,0,79.2,0 +1,0,0,0,10,1,1,24.0,0 +1,0,0,0,68,1,0,101.35,0 +0,0,0,0,54,1,1,100.1,1 +0,0,1,1,4,1,0,56.5,1 +0,0,1,0,52,0,0,35.45,0 +0,1,0,0,1,1,1,85.0,1 +1,0,1,0,70,1,0,79.4,0 +1,0,0,0,43,0,1,35.2,0 +1,0,0,0,52,1,0,19.65,0 +0,0,0,0,12,0,0,49.85,0 +0,0,1,1,56,1,0,68.75,0 +1,0,0,0,42,1,0,79.9,0 +1,1,1,0,22,1,1,89.75,0 +1,0,1,1,51,0,0,59.3,1 +1,0,0,0,27,1,1,19.4,0 +1,1,1,0,51,1,1,93.65,0 +1,0,0,1,4,1,1,49.4,1 +1,0,0,0,1,1,1,19.9,0 +1,0,0,0,35,1,0,55.0,1 +1,1,1,1,71,1,1,72.9,0 +0,0,0,0,1,1,1,69.2,1 +0,0,1,1,69,1,1,25.6,0 +1,0,1,1,14,1,0,19.75,0 +1,0,1,0,57,1,0,55.7,0 +0,0,1,1,72,1,0,117.5,0 +1,0,0,0,48,1,0,19.85,0 +0,0,1,1,4,1,1,78.9,0 +1,0,1,1,31,1,1,20.65,0 +1,0,0,0,38,1,1,62.3,1 +1,1,1,0,37,1,1,92.5,1 +0,0,0,0,1,1,0,19.65,0 +1,1,0,0,57,1,1,79.75,0 +0,1,1,0,62,1,1,79.95,0 +1,0,1,0,3,0,1,29.9,0 +0,0,0,1,72,1,1,19.75,0 +1,0,0,1,29,0,1,45.0,0 +1,0,1,1,13,1,0,44.8,0 +1,0,0,1,3,1,0,69.65,1 +0,0,0,0,11,1,0,51.1,0 +0,0,0,1,21,0,0,53.15,0 +0,0,0,0,19,1,0,24.7,0 +1,0,0,0,61,1,1,111.6,1 +0,0,0,0,11,1,0,48.55,1 +1,0,1,1,35,1,1,109.95,0 +1,0,0,1,25,1,0,20.8,0 +0,0,0,0,1,1,1,20.2,1 +0,0,0,0,67,1,1,25.6,0 +1,0,0,0,19,0,1,39.65,1 +1,0,0,0,56,1,0,24.9,1 +1,0,1,1,72,1,1,108.4,0 +1,0,0,0,43,1,0,19.55,0 +0,0,1,1,55,1,1,85.1,0 +1,0,1,1,2,1,0,56.7,1 +1,0,0,0,27,1,1,69.05,0 +0,0,0,0,13,1,1,70.15,0 +0,0,0,0,70,1,1,111.15,0 +0,0,1,0,14,1,0,105.95,1 +0,0,1,1,19,1,1,89.35,0 +0,0,0,0,20,1,1,89.1,0 +1,0,1,1,43,1,1,91.25,0 +1,0,1,1,5,1,1,90.35,0 +0,1,1,0,70,1,1,105.55,0 +0,0,1,0,40,1,0,19.1,0 +1,0,1,1,6,1,1,20.4,0 +1,0,0,0,39,1,1,100.45,0 +1,1,1,0,4,1,0,74.95,1 +1,0,0,0,15,0,1,29.7,1 +1,0,1,0,1,0,1,50.35,1 +0,1,0,0,45,1,1,85.7,0 +0,0,1,0,64,0,0,47.85,1 +0,1,1,0,57,1,0,94.0,0 +1,0,1,1,72,1,0,69.85,0 +1,0,0,0,1,1,1,70.3,1 +1,0,1,0,72,1,0,25.85,0 +0,0,0,0,3,1,0,71.1,0 +1,1,0,0,55,1,1,98.8,1 +0,0,1,0,59,1,0,93.35,0 +0,0,0,0,18,1,1,99.85,1 +1,1,1,0,32,1,1,80.3,1 +0,0,0,0,4,1,1,50.55,0 +0,1,0,0,66,1,1,80.45,1 +1,0,0,0,27,1,1,81.3,0 +1,0,0,0,4,1,1,20.7,0 +1,0,1,1,60,1,1,79.05,0 +0,0,1,1,8,1,0,19.05,0 +1,0,1,1,8,1,0,19.6,0 +1,0,0,0,35,1,1,20.2,0 +1,0,0,0,7,1,1,86.8,1 +0,0,1,1,53,1,0,20.9,0 +0,1,0,0,18,1,1,103.6,0 +0,0,0,0,15,0,1,38.8,0 +1,0,1,0,67,1,1,88.4,0 +1,1,1,0,6,1,1,84.2,1 +1,1,0,0,6,1,1,79.7,0 +1,0,0,0,13,1,1,99.0,1 +0,0,0,0,11,1,1,100.75,1 +1,0,0,1,1,1,1,19.3,0 +1,0,0,0,5,1,1,55.75,0 +1,0,0,0,13,1,1,19.95,0 +0,0,1,0,9,1,0,91.75,1 +1,0,0,0,29,1,0,89.65,0 +1,1,0,0,1,1,1,45.85,0 +0,0,0,0,1,1,1,79.55,1 +0,0,1,1,18,1,0,55.95,0 +0,0,1,0,2,1,0,69.0,0 +1,0,1,1,30,1,1,83.55,0 +1,0,0,1,66,1,0,65.7,0 +1,0,1,1,38,1,1,94.9,0 +1,0,1,1,44,1,1,61.9,0 +0,0,0,0,54,1,0,111.1,1 +1,0,0,0,2,1,0,20.0,0 +0,0,0,0,42,1,1,67.7,0 +0,0,1,1,58,1,0,25.15,0 +1,0,1,1,58,1,1,92.85,0 +0,0,1,1,25,1,1,89.1,1 +0,0,0,0,71,1,0,111.3,0 +0,0,0,0,37,1,1,101.9,1 +0,0,1,1,14,1,1,91.65,1 +0,1,0,0,4,1,1,88.85,1 +0,0,1,0,48,1,1,60.6,0 +0,1,0,0,3,0,0,25.3,1 +0,0,1,0,8,1,0,65.5,0 +1,0,0,0,1,1,1,95.45,1 +1,0,0,0,67,1,0,19.95,0 +1,0,0,0,13,1,1,91.1,1 +0,0,1,1,45,1,1,54.15,1 +1,0,0,0,49,1,1,74.6,0 +0,0,1,0,52,1,0,94.6,0 +0,0,1,0,63,1,1,81.15,0 +0,0,1,1,68,1,1,89.05,0 +0,0,1,0,31,1,1,49.2,0 +0,0,1,0,64,1,0,19.45,0 +0,0,1,0,62,1,1,104.3,0 +0,0,0,0,1,1,0,69.7,1 +0,0,0,0,6,1,1,89.5,1 +0,0,1,0,21,1,1,86.05,0 +0,0,1,1,72,1,0,25.2,0 +0,0,1,1,32,0,1,35.15,0 +0,1,0,0,71,1,1,99.65,0 +0,0,0,1,34,1,1,105.35,0 +1,0,1,0,3,0,1,35.15,1 +1,0,0,1,12,1,1,73.75,1 +0,1,0,0,8,1,0,101.35,1 +0,0,1,1,35,1,0,24.3,0 +0,0,1,1,3,1,1,80.7,0 +1,0,0,0,3,1,1,89.85,0 +1,0,0,0,53,1,1,61.1,0 +0,0,1,0,4,0,1,29.05,0 +0,0,1,1,48,1,1,99.7,0 +0,0,1,1,6,1,0,55.9,1 +1,1,1,0,3,1,1,105.9,1 +1,0,1,1,54,0,0,46.0,0 +0,0,0,0,1,1,0,43.95,1 +1,0,0,0,62,1,1,80.4,0 +1,0,1,1,22,1,1,100.05,0 +1,0,0,0,1,1,1,45.1,1 +1,1,0,0,51,1,1,94.0,0 +0,0,0,0,30,1,1,68.95,0 +0,1,1,0,56,1,1,68.45,0 +1,0,1,0,35,1,1,69.0,0 +0,1,0,0,64,0,1,43.85,0 +1,0,0,1,30,0,1,44.5,0 +0,0,1,1,25,1,1,18.7,0 +0,0,0,0,41,1,0,70.25,1 +1,0,0,1,9,1,0,55.35,1 +0,0,1,0,1,1,1,53.55,0 +1,0,0,1,70,1,1,114.6,0 +0,0,1,1,57,1,1,20.1,0 +1,0,0,0,9,1,1,85.5,0 +0,0,1,1,69,1,1,108.75,0 +1,1,1,0,43,1,1,103.0,1 +0,0,1,0,72,1,1,97.85,0 +1,0,0,1,44,1,0,19.55,0 +0,0,1,0,72,1,1,84.05,0 +0,0,1,0,33,1,1,103.75,1 +1,0,0,0,54,1,0,89.4,0 +1,0,0,1,27,1,0,19.7,0 +1,0,0,0,54,1,1,79.85,0 +1,0,0,0,3,1,0,74.45,0 +0,0,1,0,53,1,0,74.1,0 +1,0,0,0,1,1,1,69.35,1 +1,0,1,0,15,1,0,18.8,0 +0,0,0,0,56,1,1,73.85,1 +1,0,1,1,5,1,0,64.4,0 +1,0,1,1,48,1,1,55.8,0 +0,0,0,1,25,1,0,20.05,0 +0,0,1,0,3,1,1,75.15,1 +1,0,0,0,58,1,0,99.15,0 +1,0,0,0,10,1,1,56.75,0 +1,0,0,0,1,1,1,69.6,1 +1,0,1,0,71,1,1,104.15,0 +0,0,1,1,65,1,1,110.8,0 +1,0,1,1,5,1,1,80.15,1 +0,0,0,0,28,0,1,35.75,0 +0,0,1,1,67,1,1,69.9,0 +1,0,0,0,35,1,1,89.2,0 +0,0,1,1,72,0,0,55.65,0 +0,0,1,1,61,0,1,50.7,0 +1,1,0,0,68,1,1,20.0,0 +0,0,1,1,1,0,0,30.5,1 +1,0,0,0,3,1,1,19.1,0 +1,0,1,1,70,1,0,98.3,1 +0,0,0,1,48,0,0,45.55,0 +1,0,1,1,68,1,1,101.05,0 +0,0,0,0,47,1,1,103.7,0 +1,0,1,1,32,0,1,36.25,0 +0,0,1,1,5,1,1,49.4,0 +1,0,0,0,49,1,1,19.9,0 +0,0,0,0,48,1,1,107.4,1 +0,1,0,0,13,1,1,82.0,1 +1,0,0,0,15,1,1,19.8,0 +0,0,0,0,12,1,1,45.05,0 +1,1,0,0,67,1,1,64.55,0 +1,0,0,0,9,1,0,86.25,0 +0,0,1,1,13,1,1,19.75,0 +0,0,0,0,38,1,1,89.1,0 +0,1,1,0,42,1,1,95.55,0 +0,0,1,0,24,1,1,75.4,1 +0,1,1,0,27,1,1,101.25,1 +1,0,1,1,9,1,1,102.6,0 +0,0,1,0,49,0,1,56.3,0 +0,1,1,0,61,1,1,94.2,0 +1,0,0,1,50,0,1,43.05,0 +1,1,0,0,25,1,1,89.5,1 +0,1,0,0,22,1,1,74.4,1 +1,0,0,0,1,1,0,20.5,1 +1,0,0,0,4,1,1,74.35,1 +0,1,1,0,18,1,0,99.75,1 +0,1,0,0,56,1,1,111.95,1 +0,1,1,0,53,1,1,94.0,0 +0,0,1,0,51,1,1,98.85,0 +0,0,1,1,24,1,0,64.35,0 +0,0,1,0,62,1,1,72.0,0 +1,0,0,0,24,1,1,49.7,0 +0,0,1,1,70,1,0,80.7,0 +1,0,0,1,1,0,0,24.2,0 +1,1,0,0,16,0,1,39.0,1 +0,0,0,0,8,1,1,65.45,0 +0,0,1,1,72,1,1,74.35,0 +0,0,0,0,23,1,0,83.2,0 +1,0,0,1,31,0,0,25.0,0 +1,0,1,1,37,0,1,40.2,0 +0,0,1,0,30,1,1,94.1,1 +0,1,0,0,35,1,1,108.35,0 +0,0,1,1,23,1,1,69.5,0 +0,0,1,1,20,1,0,76.0,0 +1,0,1,0,36,1,1,93.6,0 +0,0,0,0,8,1,0,95.65,1 +1,0,1,1,71,1,0,100.55,0 +0,1,1,0,50,1,1,88.05,1 +0,0,1,1,43,1,1,24.45,0 +1,0,0,1,57,1,0,89.55,0 +0,0,1,1,41,1,1,66.5,1 +0,0,1,0,27,1,1,76.1,0 +0,0,0,0,13,1,1,80.5,0 +1,0,0,0,3,0,1,35.45,1 +0,0,0,0,67,1,0,20.55,0 +1,0,0,0,3,1,1,49.9,1 +0,0,1,0,64,1,1,105.4,0 +1,0,0,0,26,0,0,35.75,0 +1,0,0,0,38,1,1,95.1,0 +1,0,1,0,23,1,0,19.3,0 +1,0,0,0,40,1,1,104.5,1 +1,1,1,0,72,0,1,63.1,0 +0,1,0,0,3,1,1,75.05,1 +1,0,0,0,23,1,1,81.0,1 +0,1,1,0,1,1,1,74.45,1 +0,0,0,0,4,1,1,60.4,1 +0,0,1,0,62,1,1,84.95,0 +0,0,0,0,40,1,1,93.4,0 +1,0,0,0,41,1,1,89.2,0 +1,1,1,0,34,1,1,85.2,0 +0,0,0,0,1,1,0,49.95,0 +0,0,0,0,51,1,0,20.65,0 +1,0,1,1,1,1,1,70.65,1 +0,0,0,0,39,1,0,20.15,0 +1,0,1,1,12,1,1,19.2,0 +1,0,0,0,12,1,1,59.8,1 +1,0,0,0,72,1,1,104.95,0 +0,1,1,0,63,1,1,103.5,0 +1,0,1,0,44,1,1,84.8,0 +0,0,0,0,18,1,1,95.05,0 +0,0,0,0,9,1,1,44.2,1 +1,0,0,0,13,1,0,73.35,0 +0,0,1,0,68,1,0,64.1,0 +0,1,0,0,6,0,1,44.4,0 +0,0,0,0,2,1,1,20.05,0 +1,1,1,0,55,1,0,60.0,0 +1,1,0,0,1,1,1,75.75,1 +1,0,0,0,38,1,1,69.5,0 +0,0,0,0,67,1,1,102.95,1 +1,0,0,0,19,1,1,78.7,0 +0,0,0,0,12,0,0,60.65,0 +0,0,0,0,72,1,1,21.15,0 +1,0,1,1,24,1,1,84.8,0 +0,0,1,1,72,1,1,103.2,0 +0,0,1,1,11,0,1,29.6,0 +1,1,1,0,4,1,1,74.4,1 +1,0,0,0,66,1,1,105.65,0 diff --git a/tests/optimization/test_bhhh.py b/tests/optimization/test_bhhh.py index 8375714a5..b2af0bc14 100644 --- a/tests/optimization/test_bhhh.py +++ b/tests/optimization/test_bhhh.py @@ -2,9 +2,12 @@ from functools import partial import numpy as np +import pandas as pd import pytest import statsmodels.api as sm -from estimagic.optimization.bhhh import bhhh_internal +from estimagic.config import TEST_FIXTURES_DIR +from estimagic.optimization.bhhh import bhhh_box_constrained +from estimagic.optimization.bhhh import bhhh_unconstrained from estimagic.utilities import get_rng from numpy.testing import assert_array_almost_equal as aaae from scipy.stats import norm @@ -27,6 +30,20 @@ def generate_test_data(): return endog, exog +def ibm_test_data(): + df = pd.read_csv(TEST_FIXTURES_DIR / "telco_churn_clean.csv") + + exog = df.drop(columns="Churn").to_numpy() + intercept = np.ones((exog.shape[0], 1)) + exog = np.hstack((intercept, exog)) + endog = df[["Churn"]].to_numpy() + endog = endog.reshape( + len(endog), + ) + + return endog, exog + + def _cdf_logit(x): return 1 / (1 + np.exp(-x)) @@ -62,38 +79,132 @@ def get_score_probit(endog, exog, x): return derivative_loglikelihood[:, None] * exog -def criterion_and_derivative_logit(x): +def criterion_and_derivative_logit(x, task="criterion_and_derivative"): """Return Logit criterion and derivative. Args: x (np.ndarray): Parameter vector of shape (n_obs,). + task (str): If task=="criterion", compute log-likelihood. + If task=="derivative", compute derivative. + If task="criterion_and_derivative", compute both. Returns: - tuple: first entry is the criterion, second entry is the score - + (np.ndarray or tuple): If task=="criterion" it returns the output of + criterion, which is a 1d numpy array. + If task=="derivative" it returns the first derivative of criterion, + which is 2d numpy array. + If task=="criterion_and_derivative" it returns both as a tuple. """ endog, exog = generate_test_data() - score = partial(get_score_logit, endog, exog) - loglike = partial(get_loglikelihood_logit, endog, exog) + result = () + + if "criterion" in task: + loglike = partial(get_loglikelihood_logit, endog, exog) + result += (-loglike(x),) + if "derivative" in task: + score = partial(get_score_logit, endog, exog) + result += (score(x),) + + if len(result) == 1: + (result,) = result + + return result + + +def criterion_and_derivative_logit_ibm(x, task="criterion_and_derivative"): + """Return Logit criterion and derivative. + + Args: + x (np.ndarray): Parameter vector of shape (n_obs,). + task (str): If task=="criterion", compute log-likelihood. + If task=="derivative", compute derivative. + If task="criterion_and_derivative", compute both. + + Returns: + (np.ndarray or tuple): If task=="criterion" it returns the output of + criterion, which is a 1d numpy array. + If task=="derivative" it returns the first derivative of criterion, + which is 2d numpy array. + If task=="criterion_and_derivative" it returns both as a tuple. + """ + endog, exog = ibm_test_data() + result = () - return -loglike(x), score(x) + if "criterion" in task: + loglike = partial(get_loglikelihood_logit, endog, exog) + result += (-loglike(x),) + if "derivative" in task: + score = partial(get_score_logit, endog, exog) + result += (score(x),) + if len(result) == 1: + (result,) = result -def criterion_and_derivative_probit(x): + return result + + +def criterion_and_derivative_probit(x, task="criterion_and_derivative"): """Return Probit criterion and derivative. Args: x (np.ndarray): Parameter vector of shape (n_obs,). + task (str): If task=="criterion", compute log-likelihood. + If task=="derivative", compute derivative. + If task="criterion_and_derivative", compute both. Returns: - tuple: first entry is the criterion, second entry is the score + (np.ndarray or tuple): If task=="criterion" it returns the output of + criterion, which is a 1d numpy array. + If task=="derivative" it returns the first derivative of criterion, + which is 2d numpy array. + If task=="criterion_and_derivative" it returns both as a tuple. """ endog, exog = generate_test_data() + result = () + + if "criterion" in task: + loglike = partial(get_loglikelihood_probit, endog, exog) + result += (-loglike(x),) + if "derivative" in task: + score = partial(get_score_probit, endog, exog) + result += (score(x),) + + if len(result) == 1: + (result,) = result + + return result + + +def criterion_and_derivative_probit_ibm(x, task="criterion_and_derivative"): + """Return Probit criterion and derivative. + + Args: + x (np.ndarray): Parameter vector of shape (n_obs,). + task (str): If task=="criterion", compute log-likelihood. + If task=="derivative", compute derivative. + If task="criterion_and_derivative", compute both. + + Returns: + (np.ndarray or tuple): If task=="criterion" it returns the output of + criterion, which is a 1d numpy array. + If task=="derivative" it returns the first derivative of criterion, + which is 2d numpy array. + If task=="criterion_and_derivative" it returns both as a tuple. + """ + endog, exog = ibm_test_data() + result = () + + if "criterion" in task: + loglike = partial(get_loglikelihood_probit, endog, exog) + result += (-loglike(x),) + if "derivative" in task: + score = partial(get_score_probit, endog, exog) + result += (score(x),) - score = partial(get_score_probit, endog, exog) - loglike = partial(get_loglikelihood_probit, endog, exog) + if len(result) == 1: + (result,) = result - return -loglike(x), score(x) + return result # ===================================================================================== @@ -106,7 +217,7 @@ def result_logit_unbounded(): endog, exog = generate_test_data() result_unbounded = sm.Logit(endog, exog).fit(disp=True) - return result_unbounded.params + return result_unbounded @pytest.fixture @@ -114,52 +225,96 @@ def result_probit_unbounded(): endog, exog = generate_test_data() result_unbounded = sm.Probit(endog, exog).fit(disp=True) - return result_unbounded.params + return result_unbounded @pytest.fixture def result_logit_bounded(): - return np.array([-1.866, -1.5223, 2.7153]) + endog, exog = generate_test_data() + result_bounded = sm.Logit(endog, exog).fit( + method="lbfgs", bounds=((-5, np.inf), (-10, 10), (-10, 10)), disp=False + ) + + return result_bounded + + +@pytest.fixture +def result_probit_bounded(): + endog, exog = generate_test_data() + result_bounded = sm.Logit(endog, exog).fit( + method="lbfgs", bounds=((-5, np.inf), (-10, 10), (-10, 10)), disp=False + ) + + return result_bounded + + +@pytest.fixture +def result_logit_ibm(): + endog, exog = ibm_test_data() + result_unbounded = sm.Logit(endog, exog).fit(disp=False) + + return result_unbounded + + +@pytest.fixture +def result_probit_ibm(): + endog, exog = ibm_test_data() + result_unbounded = sm.Probit(endog, exog).fit(disp=False) + + return result_unbounded # ===================================================================================== # Tests # ===================================================================================== -TEST_CASES = [ +TEST_CASES_UNBOUNDED = [ ( criterion_and_derivative_logit, - np.array([-np.inf, -np.inf, -np.inf]), - np.array([np.inf, np.inf, np.inf]), + np.zeros(3), + -np.ones(3) * np.inf, + np.ones(3) * np.inf, "result_logit_unbounded", ), ( criterion_and_derivative_probit, - np.array([-np.inf, -np.inf, -np.inf]), - np.array([np.inf, np.inf, np.inf]), + np.zeros(3), + -np.ones(3) * np.inf, + np.ones(3) * np.inf, "result_probit_unbounded", ), ( - criterion_and_derivative_logit, - np.array([-5, -1_000, -1_000]), - np.array([1_000, 1_000, 1_000]), - "result_logit_bounded", + criterion_and_derivative_logit_ibm, + np.zeros(9), + -np.ones(9) * np.inf, + np.ones(9) * np.inf, + "result_logit_ibm", + ), + ( + criterion_and_derivative_probit_ibm, + np.zeros(9), + -np.ones(9) * np.inf, + np.ones(9) * np.inf, + "result_probit_ibm", ), ] @pytest.mark.parametrize( - "criterion_and_derivative, lower_bounds, upper_bounds, result_statsmodels", - TEST_CASES, + "criterion_and_derivative, x0, lower_bounds, upper_bounds, expected", + TEST_CASES_UNBOUNDED, ) def test_maximum_likelihood( - criterion_and_derivative, lower_bounds, upper_bounds, result_statsmodels, request + criterion_and_derivative, + x0, + lower_bounds, + upper_bounds, + expected, + request, ): - params_expected = request.getfixturevalue(result_statsmodels) - - x0 = np.zeros(3) + params_expected = request.getfixturevalue(expected) - result_bhhh = bhhh_internal( + result_bhhh = bhhh_unconstrained( criterion_and_derivative, x=x0, lower_bounds=lower_bounds, @@ -169,4 +324,51 @@ def test_maximum_likelihood( stopping_max_iterations=200, ) - aaae(result_bhhh["solution_x"], params_expected, decimal=4) + aaae(result_bhhh["solution_x"], params_expected.params, decimal=4) + + +TEST_CASES_BOUNDED = [ + ( + criterion_and_derivative_logit, + np.zeros(3), + np.array([-5, -100, -100]), + np.array([100, 100, 100]), + "result_logit_bounded", + 4, + ), + ( + criterion_and_derivative_probit, + np.zeros(3), + np.array([-5, -np.inf, -np.inf]), + np.array([10, np.inf, np.inf]), + "result_probit_bounded", + 0, + ), +] + + +@pytest.mark.parametrize( + "criterion_and_derivative, x0, lower_bounds, upper_bounds, expected, digits", + TEST_CASES_BOUNDED, +) +def test_maximum_likelihood_bounded( + criterion_and_derivative, + x0, + lower_bounds, + upper_bounds, + expected, + decimals, + request, +): + params_expected = request.getfixturevalue(expected) + + result_bhhh = bhhh_box_constrained( + criterion_and_derivative, + x=x0, + lower_bounds=lower_bounds, + upper_bounds=upper_bounds, + convergence_absolute_gradient_tolerance=1e-4, + stopping_max_iterations=200, + ) + + aaae(result_bhhh["solution_x"], params_expected.params, decimal=decimals) From 4bfc0174beef5a64d6a3294e77400cb1179f0b0c Mon Sep 17 00:00:00 2001 From: Sebastian Gsell Date: Mon, 29 Aug 2022 20:32:27 +0200 Subject: [PATCH 05/12] Fix. --- src/estimagic/optimization/bhhh.py | 92 ++++++++++++++++-------------- tests/optimization/test_bhhh.py | 20 +++---- 2 files changed, 59 insertions(+), 53 deletions(-) diff --git a/src/estimagic/optimization/bhhh.py b/src/estimagic/optimization/bhhh.py index 7f6ddfaee..5c463f481 100644 --- a/src/estimagic/optimization/bhhh.py +++ b/src/estimagic/optimization/bhhh.py @@ -188,45 +188,6 @@ def bhhh_unconstrained( return result_dict -def estimate_epsilon_inactive_set(x, norm_gradient, lower_bounds, upper_bounds): - """Estimate the set of epsilon-inactive bound constraints up to a tolerance. - - The set of epsilon-inactive indices underestimates (overestimates) the actual - set of inactive (active) indices. - - x (np.ndarray): Current candidate vector. - norm_gradient (float): Norm of the projected gradient. - lower_bounds (np.ndarray): 1d array of shape (n_params,) with lower bounds - for the parameter vector x. - upper_bounds (np.ndarray): 1d array of shape (n_params,) with upper bounds - for the parameter vector x - """ - epsilon = min(np.min(upper_bounds - lower_bounds) / 2, norm_gradient) - - inactive_set = np.where( - (lower_bounds + epsilon < x) & (x < upper_bounds - epsilon) - )[0] - - return inactive_set - - -def determine_descent_direction( - gradient_candidate, gradient_reduced, hessian_reduced, inactive_set, n_params -): - """Determine the new descent (search) direction.""" - direction = np.linalg.solve(hessian_reduced, gradient_reduced) - - direction_active = gradient_candidate.copy() - direction_active[inactive_set] = 0 - - direction_projected = np.zeros(n_params) - direction_projected[inactive_set] = direction - - direction_all = direction_active + direction_projected - - return direction_all - - def bhhh_box_constrained( criterion_and_derivative, x, @@ -276,8 +237,12 @@ def bhhh_box_constrained( jacobian = criterion_and_derivative(x, task="derivative") gradient = np.sum(jacobian, axis=0) - norm_pg = np.linalg.norm(x - np.clip(x - gradient, lower_bounds, upper_bounds)) - inactive_set = estimate_epsilon_inactive_set(x, norm_pg, lower_bounds, upper_bounds) + norm_proj_grad = np.linalg.norm( + x - np.clip(x - gradient, lower_bounds, upper_bounds) + ) + inactive_set = estimate_epsilon_inactive_set( + x, norm_proj_grad, lower_bounds, upper_bounds + ) for _n_iter in range(stopping_max_iterations): jacobian = criterion_and_derivative(x, task="derivative") @@ -314,9 +279,11 @@ def bhhh_box_constrained( if crit < critic_limit: break - norm_pg = np.linalg.norm(x - np.clip(x - gradient, lower_bounds, upper_bounds)) + norm_proj_grad = np.linalg.norm( + x - np.clip(x - gradient, lower_bounds, upper_bounds) + ) inactive_set = estimate_epsilon_inactive_set( - x, norm_pg, lower_bounds, upper_bounds + x, norm_proj_grad, lower_bounds, upper_bounds ) solution_criterion = criterion_and_derivative(x, task="criterion") @@ -332,6 +299,45 @@ def bhhh_box_constrained( return result_dict +def estimate_epsilon_inactive_set(x, norm_gradient, lower_bounds, upper_bounds): + """Estimate the set of epsilon-inactive bound constraints up to a tolerance. + + The set of epsilon-inactive indices underestimates (overestimates) the actual + set of inactive (active) indices. + + x (np.ndarray): Current candidate vector. + norm_gradient (float): Norm of the projected gradient. + lower_bounds (np.ndarray): 1d array of shape (n_params,) with lower bounds + for the parameter vector x. + upper_bounds (np.ndarray): 1d array of shape (n_params,) with upper bounds + for the parameter vector x + """ + epsilon = min(np.min(upper_bounds - lower_bounds) / 2, norm_gradient) + + inactive_set = np.where( + (lower_bounds + epsilon < x) & (x < upper_bounds - epsilon) + )[0] + + return inactive_set + + +def determine_descent_direction( + gradient_candidate, gradient_reduced, hessian_reduced, inactive_set, n_params +): + """Determine the new descent (search) direction.""" + direction = np.linalg.solve(hessian_reduced, gradient_reduced) + + direction_active = gradient_candidate.copy() + direction_active[inactive_set] = 0 + + direction_projected = np.zeros(n_params) + direction_projected[inactive_set] = direction + + direction_all = direction_active + direction_projected + + return direction_all + + def find_optimal_step_len( x, direction_projected, diff --git a/tests/optimization/test_bhhh.py b/tests/optimization/test_bhhh.py index b2af0bc14..6260daa58 100644 --- a/tests/optimization/test_bhhh.py +++ b/tests/optimization/test_bhhh.py @@ -272,29 +272,29 @@ def result_probit_ibm(): ( criterion_and_derivative_logit, np.zeros(3), - -np.ones(3) * np.inf, - np.ones(3) * np.inf, + np.full(3, -np.inf), + np.full(3, np.inf), "result_logit_unbounded", ), ( criterion_and_derivative_probit, np.zeros(3), - -np.ones(3) * np.inf, - np.ones(3) * np.inf, + np.full(3, -np.inf), + np.full(3, np.inf), "result_probit_unbounded", ), ( criterion_and_derivative_logit_ibm, np.zeros(9), - -np.ones(9) * np.inf, - np.ones(9) * np.inf, + np.full(9, -np.inf), + np.full(9, np.inf), "result_logit_ibm", ), ( criterion_and_derivative_probit_ibm, np.zeros(9), - -np.ones(9) * np.inf, - np.ones(9) * np.inf, + np.full(9, -np.inf), + np.full(9, np.inf), "result_probit_ibm", ), ] @@ -357,7 +357,7 @@ def test_maximum_likelihood_bounded( lower_bounds, upper_bounds, expected, - decimals, + digits, request, ): params_expected = request.getfixturevalue(expected) @@ -371,4 +371,4 @@ def test_maximum_likelihood_bounded( stopping_max_iterations=200, ) - aaae(result_bhhh["solution_x"], params_expected.params, decimal=decimals) + aaae(result_bhhh["solution_x"], params_expected.params, decimal=digits) From ae34e79e4037d624915346221c14330067181ba9 Mon Sep 17 00:00:00 2001 From: Sebastian Gsell Date: Mon, 29 Aug 2022 21:15:22 +0200 Subject: [PATCH 06/12] Renaming. --- src/estimagic/optimization/bhhh.py | 170 +++++++++-------------------- tests/optimization/test_bhhh.py | 87 +++++++-------- 2 files changed, 90 insertions(+), 167 deletions(-) diff --git a/src/estimagic/optimization/bhhh.py b/src/estimagic/optimization/bhhh.py index 5c463f481..84986a765 100644 --- a/src/estimagic/optimization/bhhh.py +++ b/src/estimagic/optimization/bhhh.py @@ -16,7 +16,7 @@ def bhhh( upper_bounds, *, convergence_absolute_gradient_tolerance=1e-8, - convergence_relative_gradient_tolerance=1e-8, + convergence_relative_params_tolerance=1e-8, stopping_max_iterations=200, ): """Minimize a likelihood function using the box-constrained BHHH algorithm. @@ -27,10 +27,7 @@ def bhhh( result_dict = bhhh_unconstrained( criterion_and_derivative, x, - lower_bounds, - upper_bounds, convergence_absolute_gradient_tolerance, - convergence_relative_gradient_tolerance, stopping_max_iterations, ) else: @@ -39,8 +36,7 @@ def bhhh( x, lower_bounds, upper_bounds, - convergence_absolute_gradient_tolerance, - convergence_relative_gradient_tolerance, + convergence_relative_params_tolerance, stopping_max_iterations, ) @@ -50,13 +46,10 @@ def bhhh( def bhhh_unconstrained( criterion_and_derivative, x, - lower_bounds, - upper_bounds, convergence_absolute_gradient_tolerance, - convergence_relative_gradient_tolerance, stopping_max_iterations, ): - """Minimize a likelihood function using the bounded BHHH algorithm. + """Minimize a likelihood function using the unconstrained BHHH algorithm. Args: criterion_and_derivative (callable): A function returning the tuple: @@ -67,12 +60,10 @@ def bhhh_unconstrained( for the parameter vector x. upper_bounds (np.ndarray): 1d array of shape (n_params,) with upper bounds for the parameter vector x - convergence_absolute_gradient_tolerance (float): Stopping criterion for the - absolute gradient tolerance. - convergence_relative_gradient_tolerance (float): Stopping criterion for the - relative gradient tolerance. - stopping_max_iterations (int): Maximum number of iterations. If reached, - terminate. + convergence_absolute_gradient_tolerance (float): Stop if all elements of the + gradient are smaller than this. + stopping_max_iterations (int): If the maximum number of iterations is reached, + the optimization stops, but we do not count this as convergence. Returns: (dict) Result dictionary containing: @@ -85,100 +76,52 @@ def bhhh_unconstrained( solution vector or reaching stopping_max_iterations. - message (str): Message to the user. Currently it says: "Under development." """ - tol = { - "abs": convergence_absolute_gradient_tolerance, - "rel": convergence_relative_gradient_tolerance, - } - n_params = len(x) + criterion_accepted, jacobian = criterion_and_derivative(x) - x_accepted = x - criterion_accepted, jacobian = criterion_and_derivative(x_accepted) gradient = np.sum(jacobian, axis=0) - - norm_pg0 = np.linalg.norm( - x_accepted - np.clip(x_accepted - gradient, lower_bounds, upper_bounds) - ) - norm_pg = norm_pg0 - - inactive_set = estimate_epsilon_inactive_set( - x_accepted, norm_pg, lower_bounds, upper_bounds - ) - - gradient_reduced = gradient[inactive_set] hessian_approx = jacobian.T @ jacobian - hessian_reduced = hessian_approx[inactive_set[:, np.newaxis], inactive_set] - - direction = determine_descent_direction( - gradient, gradient_reduced, hessian_reduced, inactive_set, n_params - ) + direction = np.linalg.solve(hessian_approx, gradient) initial_step_size = 1 step_size = initial_step_size for _n_iter in range(stopping_max_iterations): - x_candidate = np.clip( - x_accepted + step_size * direction, lower_bounds, upper_bounds - ) + x_candidate = x + step_size * direction criterion_candidate, jacobian = criterion_and_derivative(x_candidate) if step_size == initial_step_size: hessian_approx = jacobian.T @ jacobian - hessian_reduced = hessian_approx[inactive_set[:, np.newaxis], inactive_set] if np.sum(criterion_candidate) > np.sum(criterion_accepted): step_size /= 2 if step_size <= 0.01: - x_accepted = x_candidate + x = x_candidate criterion_accepted = criterion_candidate step_size = initial_step_size else: - x_accepted = x_candidate + x = x_candidate criterion_accepted = criterion_candidate gradient = np.sum(jacobian, axis=0) - gradient_reduced = gradient[inactive_set] - - direction = determine_descent_direction( - gradient, - gradient_reduced, - hessian_reduced, - inactive_set, - n_params, - ) - - norm_pg = np.linalg.norm( - x_accepted - np.clip(x_accepted - gradient, lower_bounds, upper_bounds) - ) - inactive_set = estimate_epsilon_inactive_set( - x_accepted, norm_pg, lower_bounds, upper_bounds - ) - - if norm_pg < 0: - gradient_reduced = gradient[inactive_set] + direction = np.linalg.solve(hessian_approx, gradient) + + norm_grad = gradient @ direction + + if norm_grad < 0: hessian_approx = jacobian.T @ jacobian - hessian_reduced = hessian_approx[ - inactive_set[:, np.newaxis], inactive_set - ] - - direction = determine_descent_direction( - gradient, - gradient_reduced, - hessian_reduced, - inactive_set, - n_params, - ) + direction = np.linalg.solve(hessian_approx, gradient) step_size = initial_step_size - if norm_pg < tol["abs"] + tol["rel"] * norm_pg0: + if norm_grad < convergence_absolute_gradient_tolerance: break result_dict = { - "solution_x": x_accepted, + "solution_x": x, "solution_criterion": criterion_accepted, "solution_loglikelihood": np.sum(criterion_accepted), "n_iterations": _n_iter, @@ -193,7 +136,7 @@ def bhhh_box_constrained( x, lower_bounds, upper_bounds, - convergence_absolute_gradient_tolerance, + convergence_relative_params_tolerance, stopping_max_iterations, ): """Minimize a likelihood function using the box-constrained BHHH algorithm. @@ -207,12 +150,10 @@ def bhhh_box_constrained( for the parameter vector x. upper_bounds (np.ndarray): 1d array of shape (n_params,) with upper bounds for the parameter vector x - convergence_absolute_gradient_tolerance (float): Stopping criterion for the - absolute gradient tolerance. - convergence_relative_gradient_tolerance (float): Stopping criterion for the - relative gradient tolerance. - stopping_max_iterations (int): Maximum number of iterations. If reached, - terminate. + convergence_relative_params_tolerance (float): Stop when the relative movement + between parameter vectors is smaller than this. + stopping_max_iterations (int): If the maximum number of iterations is reached, + the optimization stops, but we do not count this as convergence. Returns: (dict) Result dictionary containing: @@ -225,23 +166,15 @@ def bhhh_box_constrained( solution vector or reaching stopping_max_iterations. - message (str): Message to the user. Currently it says: "Under development." """ - _zero_threshold = np.finfo(float).eps n_params = len(x) - step_min = 1e-6 - - critic_limit = convergence_absolute_gradient_tolerance - - crit = 1 - step_len_optimal = 1 + min_step_size = 1e-6 + _zero_threshold = np.finfo(float).eps jacobian = criterion_and_derivative(x, task="derivative") gradient = np.sum(jacobian, axis=0) - norm_proj_grad = np.linalg.norm( - x - np.clip(x - gradient, lower_bounds, upper_bounds) - ) inactive_set = estimate_epsilon_inactive_set( - x, norm_proj_grad, lower_bounds, upper_bounds + x, gradient, lower_bounds, upper_bounds ) for _n_iter in range(stopping_max_iterations): @@ -261,7 +194,7 @@ def bhhh_box_constrained( direction_projected, lower_bounds, upper_bounds, - step_min, + min_step_size, criterion_and_derivative, ) @@ -269,21 +202,17 @@ def bhhh_box_constrained( x + step_len_optimal * direction_projected, lower_bounds, upper_bounds ) - crit = np.max( - np.abs(((x_candidate - x) + _zero_threshold) / (x + _zero_threshold)) - / step_len_optimal + relative_params_difference = np.max( + np.abs(((x_candidate - x)) / (x + _zero_threshold)) / step_len_optimal ) x = x_candidate - if crit < critic_limit: + if relative_params_difference < convergence_relative_params_tolerance: break - norm_proj_grad = np.linalg.norm( - x - np.clip(x - gradient, lower_bounds, upper_bounds) - ) inactive_set = estimate_epsilon_inactive_set( - x, norm_proj_grad, lower_bounds, upper_bounds + x, gradient, lower_bounds, upper_bounds ) solution_criterion = criterion_and_derivative(x, task="criterion") @@ -299,20 +228,23 @@ def bhhh_box_constrained( return result_dict -def estimate_epsilon_inactive_set(x, norm_gradient, lower_bounds, upper_bounds): +def estimate_epsilon_inactive_set(x, gradient, lower_bounds, upper_bounds): """Estimate the set of epsilon-inactive bound constraints up to a tolerance. The set of epsilon-inactive indices underestimates (overestimates) the actual set of inactive (active) indices. - x (np.ndarray): Current candidate vector. - norm_gradient (float): Norm of the projected gradient. + x (np.ndarray): Current parameter vector of shape (n_params,). + gradient (np.ndarray): Current gradient vector of shape (n_params,). lower_bounds (np.ndarray): 1d array of shape (n_params,) with lower bounds for the parameter vector x. upper_bounds (np.ndarray): 1d array of shape (n_params,) with upper bounds for the parameter vector x """ - epsilon = min(np.min(upper_bounds - lower_bounds) / 2, norm_gradient) + norm_proj_grad = np.linalg.norm( + x - np.clip(x - gradient, lower_bounds, upper_bounds) + ) + epsilon = min(np.min(upper_bounds - lower_bounds) / 2, norm_proj_grad) inactive_set = np.where( (lower_bounds + epsilon < x) & (x < upper_bounds - epsilon) @@ -343,34 +275,36 @@ def find_optimal_step_len( direction_projected, lower_bounds, upper_bounds, - step_min, + min_step_size, criterion_and_derivative, ): """Find optimal step length.""" step_len_trial = 2 step_len_optimal = 1 - loglike_higher = 1 - loglike_lower = 0 + loglike_full_step = 1 + loglike_half_step = 0 - while (loglike_higher > loglike_lower) & (step_len_trial >= step_min): - step_len_trial = step_len_trial / 2 + while (loglike_full_step > loglike_half_step) & (step_len_trial >= min_step_size): + step_len_trial /= 2 - criterion_candidate_higher = criterion_and_derivative( + criterion_full_step = criterion_and_derivative( np.clip( x + step_len_trial * direction_projected, lower_bounds, upper_bounds ), task="criterion", ) - criterion_candidate_lower = criterion_and_derivative( + criterion_half_step = criterion_and_derivative( np.clip( - x + step_len_trial * direction_projected / 2, lower_bounds, upper_bounds + x + (step_len_trial / 2) * direction_projected, + lower_bounds, + upper_bounds, ), task="criterion", ) - loglike_higher = np.sum(criterion_candidate_higher) - loglike_lower = np.sum(criterion_candidate_lower) + loglike_full_step = np.sum(criterion_full_step) + loglike_half_step = np.sum(criterion_half_step) step_len_optimal = step_len_trial diff --git a/tests/optimization/test_bhhh.py b/tests/optimization/test_bhhh.py index 6260daa58..36a65a3a5 100644 --- a/tests/optimization/test_bhhh.py +++ b/tests/optimization/test_bhhh.py @@ -30,7 +30,7 @@ def generate_test_data(): return endog, exog -def ibm_test_data(): +def load_ibm_data(): df = pd.read_csv(TEST_FIXTURES_DIR / "telco_churn_clean.csv") exog = df.drop(columns="Churn").to_numpy() @@ -127,7 +127,7 @@ def criterion_and_derivative_logit_ibm(x, task="criterion_and_derivative"): which is 2d numpy array. If task=="criterion_and_derivative" it returns both as a tuple. """ - endog, exog = ibm_test_data() + endog, exog = load_ibm_data() result = () if "criterion" in task: @@ -191,7 +191,7 @@ def criterion_and_derivative_probit_ibm(x, task="criterion_and_derivative"): which is 2d numpy array. If task=="criterion_and_derivative" it returns both as a tuple. """ - endog, exog = ibm_test_data() + endog, exog = load_ibm_data() result = () if "criterion" in task: @@ -213,102 +213,94 @@ def criterion_and_derivative_probit_ibm(x, task="criterion_and_derivative"): @pytest.fixture -def result_logit_unbounded(): +def result_logit_unconstrained(): endog, exog = generate_test_data() - result_unbounded = sm.Logit(endog, exog).fit(disp=True) + result = sm.Logit(endog, exog).fit(disp=True) - return result_unbounded + return result.params @pytest.fixture -def result_probit_unbounded(): +def result_probit_unconstrained(): endog, exog = generate_test_data() - result_unbounded = sm.Probit(endog, exog).fit(disp=True) + result = sm.Probit(endog, exog).fit(disp=True) - return result_unbounded + return result.params @pytest.fixture -def result_logit_bounded(): +def result_logit_constrained(): endog, exog = generate_test_data() - result_bounded = sm.Logit(endog, exog).fit( - method="lbfgs", bounds=((-5, np.inf), (-10, 10), (-10, 10)), disp=False + result = sm.Logit(endog, exog).fit( + method="lbfgs", bounds=((-5, 10), (-100, 100), (-100, 100)), disp=False ) - return result_bounded + return result.params @pytest.fixture -def result_probit_bounded(): +def result_probit_constrained(): endog, exog = generate_test_data() - result_bounded = sm.Logit(endog, exog).fit( - method="lbfgs", bounds=((-5, np.inf), (-10, 10), (-10, 10)), disp=False + result = sm.Logit(endog, exog).fit( + method="lbfgs", + bounds=((-5, np.inf), (-np.inf, np.inf), (-np.inf, np.inf)), + disp=False, ) - return result_bounded + return result.params @pytest.fixture def result_logit_ibm(): - endog, exog = ibm_test_data() - result_unbounded = sm.Logit(endog, exog).fit(disp=False) + endog, exog = load_ibm_data() + result = sm.Logit(endog, exog).fit(disp=False) - return result_unbounded + return result.params @pytest.fixture def result_probit_ibm(): - endog, exog = ibm_test_data() - result_unbounded = sm.Probit(endog, exog).fit(disp=False) + endog, exog = load_ibm_data() + result = sm.Probit(endog, exog).fit(disp=False) - return result_unbounded + return result.params # ===================================================================================== # Tests # ===================================================================================== -TEST_CASES_UNBOUNDED = [ +TEST_CASES_UNCONSTRAINED = [ ( criterion_and_derivative_logit, np.zeros(3), - np.full(3, -np.inf), - np.full(3, np.inf), - "result_logit_unbounded", + "result_logit_unconstrained", ), ( criterion_and_derivative_probit, np.zeros(3), - np.full(3, -np.inf), - np.full(3, np.inf), - "result_probit_unbounded", + "result_probit_unconstrained", ), ( criterion_and_derivative_logit_ibm, np.zeros(9), - np.full(9, -np.inf), - np.full(9, np.inf), "result_logit_ibm", ), ( criterion_and_derivative_probit_ibm, np.zeros(9), - np.full(9, -np.inf), - np.full(9, np.inf), "result_probit_ibm", ), ] @pytest.mark.parametrize( - "criterion_and_derivative, x0, lower_bounds, upper_bounds, expected", - TEST_CASES_UNBOUNDED, + "criterion_and_derivative, x0, expected", + TEST_CASES_UNCONSTRAINED, ) def test_maximum_likelihood( criterion_and_derivative, x0, - lower_bounds, - upper_bounds, expected, request, ): @@ -317,23 +309,20 @@ def test_maximum_likelihood( result_bhhh = bhhh_unconstrained( criterion_and_derivative, x=x0, - lower_bounds=lower_bounds, - upper_bounds=upper_bounds, convergence_absolute_gradient_tolerance=1e-8, - convergence_relative_gradient_tolerance=1e-8, stopping_max_iterations=200, ) - aaae(result_bhhh["solution_x"], params_expected.params, decimal=4) + aaae(result_bhhh["solution_x"], params_expected, decimal=4) -TEST_CASES_BOUNDED = [ +TEST_CASES_CONSTRAINED = [ ( criterion_and_derivative_logit, np.zeros(3), np.array([-5, -100, -100]), - np.array([100, 100, 100]), - "result_logit_bounded", + np.array([10, 100, 100]), + "result_logit_constrained", 4, ), ( @@ -341,7 +330,7 @@ def test_maximum_likelihood( np.zeros(3), np.array([-5, -np.inf, -np.inf]), np.array([10, np.inf, np.inf]), - "result_probit_bounded", + "result_probit_constrained", 0, ), ] @@ -349,7 +338,7 @@ def test_maximum_likelihood( @pytest.mark.parametrize( "criterion_and_derivative, x0, lower_bounds, upper_bounds, expected, digits", - TEST_CASES_BOUNDED, + TEST_CASES_CONSTRAINED, ) def test_maximum_likelihood_bounded( criterion_and_derivative, @@ -367,8 +356,8 @@ def test_maximum_likelihood_bounded( x=x0, lower_bounds=lower_bounds, upper_bounds=upper_bounds, - convergence_absolute_gradient_tolerance=1e-4, + convergence_relative_params_tolerance=1e-4, stopping_max_iterations=200, ) - aaae(result_bhhh["solution_x"], params_expected.params, decimal=digits) + aaae(result_bhhh["solution_x"], params_expected, decimal=digits) From d11d614d6160b5de40d1b4c37d2195de14c24e11 Mon Sep 17 00:00:00 2001 From: Sebastian Gsell Date: Tue, 30 Aug 2022 15:47:14 +0200 Subject: [PATCH 07/12] Harmonize stopping criteria. --- src/estimagic/optimization/bhhh.py | 56 ++++++++++++++++++++++-------- tests/optimization/test_bhhh.py | 20 ++++++++--- 2 files changed, 58 insertions(+), 18 deletions(-) diff --git a/src/estimagic/optimization/bhhh.py b/src/estimagic/optimization/bhhh.py index 84986a765..245c31d83 100644 --- a/src/estimagic/optimization/bhhh.py +++ b/src/estimagic/optimization/bhhh.py @@ -27,6 +27,7 @@ def bhhh( result_dict = bhhh_unconstrained( criterion_and_derivative, x, + convergence_relative_params_tolerance, convergence_absolute_gradient_tolerance, stopping_max_iterations, ) @@ -37,6 +38,7 @@ def bhhh( lower_bounds, upper_bounds, convergence_relative_params_tolerance, + convergence_absolute_gradient_tolerance, stopping_max_iterations, ) @@ -46,6 +48,7 @@ def bhhh( def bhhh_unconstrained( criterion_and_derivative, x, + convergence_relative_params_tolerance, convergence_absolute_gradient_tolerance, stopping_max_iterations, ): @@ -60,6 +63,8 @@ def bhhh_unconstrained( for the parameter vector x. upper_bounds (np.ndarray): 1d array of shape (n_params,) with upper bounds for the parameter vector x + convergence_relative_params_tolerance (float): Stop when the relative movement + between parameter vectors is smaller than this. convergence_absolute_gradient_tolerance (float): Stop if all elements of the gradient are smaller than this. stopping_max_iterations (int): If the maximum number of iterations is reached, @@ -76,18 +81,22 @@ def bhhh_unconstrained( solution vector or reaching stopping_max_iterations. - message (str): Message to the user. Currently it says: "Under development." """ + _zero_threshold = np.finfo(float).eps + criterion_accepted, jacobian = criterion_and_derivative(x) gradient = np.sum(jacobian, axis=0) hessian_approx = jacobian.T @ jacobian direction = np.linalg.solve(hessian_approx, gradient) + norm_grad = gradient @ direction + initial_step_size = 1 step_size = initial_step_size - for _n_iter in range(stopping_max_iterations): + x_candidate = x + step_size * direction - x_candidate = x + step_size * direction + for _n_iter in range(stopping_max_iterations): criterion_candidate, jacobian = criterion_and_derivative(x_candidate) @@ -117,13 +126,23 @@ def bhhh_unconstrained( step_size = initial_step_size - if norm_grad < convergence_absolute_gradient_tolerance: + x_candidate = x + step_size * direction + + relative_params_difference = np.max( + np.abs(((x_candidate - x)) / (x + _zero_threshold)) / step_size + ) + + if relative_params_difference < convergence_relative_params_tolerance: + break + elif norm_grad < convergence_absolute_gradient_tolerance: break result_dict = { "solution_x": x, "solution_criterion": criterion_accepted, "solution_loglikelihood": np.sum(criterion_accepted), + "relative_params_difference": relative_params_difference, + "absolute_gradient_norm": norm_grad, "n_iterations": _n_iter, "message": "Under develpment", } @@ -137,6 +156,7 @@ def bhhh_box_constrained( lower_bounds, upper_bounds, convergence_relative_params_tolerance, + convergence_absolute_gradient_tolerance, stopping_max_iterations, ): """Minimize a likelihood function using the box-constrained BHHH algorithm. @@ -152,6 +172,8 @@ def bhhh_box_constrained( for the parameter vector x convergence_relative_params_tolerance (float): Stop when the relative movement between parameter vectors is smaller than this. + convergence_absolute_gradient_tolerance (float): Stop if all elements of the + projected gradient are smaller than this. stopping_max_iterations (int): If the maximum number of iterations is reached, the optimization stops, but we do not count this as convergence. @@ -173,8 +195,11 @@ def bhhh_box_constrained( jacobian = criterion_and_derivative(x, task="derivative") gradient = np.sum(jacobian, axis=0) + norm_proj_grad = np.linalg.norm( + x - np.clip(x - gradient, lower_bounds, upper_bounds) + ) inactive_set = estimate_epsilon_inactive_set( - x, gradient, lower_bounds, upper_bounds + x, norm_proj_grad, lower_bounds, upper_bounds ) for _n_iter in range(stopping_max_iterations): @@ -201,18 +226,22 @@ def bhhh_box_constrained( x_candidate = np.clip( x + step_len_optimal * direction_projected, lower_bounds, upper_bounds ) - relative_params_difference = np.max( np.abs(((x_candidate - x)) / (x + _zero_threshold)) / step_len_optimal ) - x = x_candidate + norm_proj_grad = np.linalg.norm( + x - np.clip(x - gradient, lower_bounds, upper_bounds) + ) + if relative_params_difference < convergence_relative_params_tolerance: break + elif norm_proj_grad < convergence_absolute_gradient_tolerance: + break inactive_set = estimate_epsilon_inactive_set( - x, gradient, lower_bounds, upper_bounds + x, norm_proj_grad, lower_bounds, upper_bounds ) solution_criterion = criterion_and_derivative(x, task="criterion") @@ -221,6 +250,8 @@ def bhhh_box_constrained( "solution_x": x, "solution_criterion": solution_criterion, "solution_loglikelihood": np.sum(solution_criterion), + "relative_params_difference": relative_params_difference, + "absolute_gradient_norm": norm_proj_grad, "n_iterations": _n_iter, "message": "Under develpment", } @@ -228,23 +259,20 @@ def bhhh_box_constrained( return result_dict -def estimate_epsilon_inactive_set(x, gradient, lower_bounds, upper_bounds): - """Estimate the set of epsilon-inactive bound constraints up to a tolerance. +def estimate_epsilon_inactive_set(x, norm_grad, lower_bounds, upper_bounds): + """Estimate the set of epsilon-inactive bound constraints. The set of epsilon-inactive indices underestimates (overestimates) the actual set of inactive (active) indices. x (np.ndarray): Current parameter vector of shape (n_params,). - gradient (np.ndarray): Current gradient vector of shape (n_params,). + norm_grad (float): Norm of the projected gradient. lower_bounds (np.ndarray): 1d array of shape (n_params,) with lower bounds for the parameter vector x. upper_bounds (np.ndarray): 1d array of shape (n_params,) with upper bounds for the parameter vector x """ - norm_proj_grad = np.linalg.norm( - x - np.clip(x - gradient, lower_bounds, upper_bounds) - ) - epsilon = min(np.min(upper_bounds - lower_bounds) / 2, norm_proj_grad) + epsilon = min(np.min(upper_bounds - lower_bounds) / 2, norm_grad) inactive_set = np.where( (lower_bounds + epsilon < x) & (x < upper_bounds - epsilon) diff --git a/tests/optimization/test_bhhh.py b/tests/optimization/test_bhhh.py index 36a65a3a5..756456849 100644 --- a/tests/optimization/test_bhhh.py +++ b/tests/optimization/test_bhhh.py @@ -306,14 +306,25 @@ def test_maximum_likelihood( ): params_expected = request.getfixturevalue(expected) - result_bhhh = bhhh_unconstrained( + result_unconstr = bhhh_unconstrained( criterion_and_derivative, x=x0, + convergence_relative_params_tolerance=1e-6, + convergence_absolute_gradient_tolerance=1e-8, + stopping_max_iterations=200, + ) + result_constr = bhhh_box_constrained( + criterion_and_derivative, + x=x0, + lower_bounds=np.full(len(x0), -np.inf), + upper_bounds=np.full(len(x0), np.inf), + convergence_relative_params_tolerance=1e-6, convergence_absolute_gradient_tolerance=1e-8, stopping_max_iterations=200, ) - aaae(result_bhhh["solution_x"], params_expected, decimal=4) + aaae(result_unconstr["solution_x"], params_expected, decimal=4) + aaae(result_constr["solution_x"], params_expected, decimal=4) TEST_CASES_CONSTRAINED = [ @@ -351,13 +362,14 @@ def test_maximum_likelihood_bounded( ): params_expected = request.getfixturevalue(expected) - result_bhhh = bhhh_box_constrained( + result = bhhh_box_constrained( criterion_and_derivative, x=x0, lower_bounds=lower_bounds, upper_bounds=upper_bounds, convergence_relative_params_tolerance=1e-4, + convergence_absolute_gradient_tolerance=1e-4, stopping_max_iterations=200, ) - aaae(result_bhhh["solution_x"], params_expected, decimal=digits) + aaae(result["solution_x"], params_expected, decimal=digits) From 61163efb0b3bcf2f4c18cc9a46dc2b2d4e512a64 Mon Sep 17 00:00:00 2001 From: Sebastian Gsell Date: Tue, 30 Aug 2022 18:32:38 +0200 Subject: [PATCH 08/12] Update documentation. --- docs/source/algorithms.md | 23 ++++++++++++++++------- docs/source/refs.bib | 9 +++++++++ src/estimagic/optimization/bhhh.py | 28 ++++++++++++++++------------ 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/docs/source/algorithms.md b/docs/source/algorithms.md index 871e9d70c..7eeb18c10 100644 --- a/docs/source/algorithms.md +++ b/docs/source/algorithms.md @@ -578,14 +578,20 @@ We implement a few algorithms from scratch. They are currently considered experi "bhhh" - Minimize a likelihood function using the bounded BHHH algorithm. + Minimize a likelihood function using the box-constraint BHHH algorithm. BHHH (:cite:`Berndt1974`) can - and should ONLY - be used for minimizing - (or maximizing) a likelihood. It is similar to the Newton-Raphson + (or maximizing) a likelihood function. It is similar to the Newton-Raphson algorithm, but replaces the Hessian matrix with the outer product of the gradient. This approximation is based on the information matrix equality (:cite:`Halbert1982`) and is thus only vaid when minimizing (or maximizing) - a likelihood. Bounds, i.e. box constraints, are supported. + a likelihood. + + Bounds, i.e. box constraints, are supported. In order to identify the active + constraints in the set of inequality constraints, an epsilon-active-set approach is + used (see, e.g. :cite:`Nocedal2006`, p. 308, for the active-set method in general and + :cite:`Kelley1999`, p. 97, on the estimation of epsilon-active sets a la the + Projected BFGS–Armijo algorithm). The criterion function :func:`func` should return a dictionary with at least the entry ``{"contributions": array_or_pytree}`` where ``array_or_pytree`` @@ -593,10 +599,13 @@ We implement a few algorithms from scratch. They are currently considered experi bhhh supports the following options: - - **convergence_absolute_gradient_tolerance** (float): Stopping criterion for the - gradient tolerance. Default is 1e-8. - - **stopping_max_iterations** (int): Maximum number of iterations. - If reached, terminate. Default is 200. + - **convergence.relative_params_tolerance** (float): Stop when the relative movement + between parameter vectors is smaller than this. The default is 1e-8. + - **convergence.absolute_gradient_tolerance** (float): Stop if all elements of the + projected gradient are smaller than this. The default is 1e-8. + - **stopping.max_iterations** (int): If the maximum number of iterations is reached, + the optimization stops, but we do not count this as convergence. + The default is 200. ``` diff --git a/docs/source/refs.bib b/docs/source/refs.bib index 0ee68d3d3..bbc713ac0 100644 --- a/docs/source/refs.bib +++ b/docs/source/refs.bib @@ -884,4 +884,13 @@ @article{Zhang2010 URL = {https://doi.org/10.1137/09075531X}, } +@book{Kelley1999, +author = {Kelley, C. T.}, +title = {Iterative Methods for Optimization}, +publisher = {Society for Industrial and Applied Mathematics}, +year = {1999}, +doi = {10.1137/1.9781611970920}, +URL = {https://epubs.siam.org/doi/abs/10.1137/1.9781611970920}, +} + @Comment{jabref-meta: databaseType:bibtex;} diff --git a/src/estimagic/optimization/bhhh.py b/src/estimagic/optimization/bhhh.py index 245c31d83..2345be6c7 100644 --- a/src/estimagic/optimization/bhhh.py +++ b/src/estimagic/optimization/bhhh.py @@ -161,6 +161,10 @@ def bhhh_box_constrained( ): """Minimize a likelihood function using the box-constrained BHHH algorithm. + The (in)active constraints are identified via an epsilon-active-set method, + similar to the approach used by the Projected BFGS-Armijo algorithm + (see :cite:`Kelley1999`, p. 97). + Args: criterion_and_derivative (callable): A function returning the tuple: - criterion (np.ndarray): Likelihood contributions of shape (n_obs,) @@ -214,7 +218,7 @@ def bhhh_box_constrained( gradient, gradient_reduced, hessian_reduced, inactive_set, n_params ) - step_len_optimal = find_optimal_step_len( + step_size = find_optimal_step_size( x, direction_projected, lower_bounds, @@ -224,10 +228,10 @@ def bhhh_box_constrained( ) x_candidate = np.clip( - x + step_len_optimal * direction_projected, lower_bounds, upper_bounds + x + step_size * direction_projected, lower_bounds, upper_bounds ) relative_params_difference = np.max( - np.abs(((x_candidate - x)) / (x + _zero_threshold)) / step_len_optimal + np.abs(((x_candidate - x)) / (x + _zero_threshold)) / step_size ) x = x_candidate @@ -298,7 +302,7 @@ def determine_descent_direction( return direction_all -def find_optimal_step_len( +def find_optimal_step_size( x, direction_projected, lower_bounds, @@ -307,24 +311,24 @@ def find_optimal_step_len( criterion_and_derivative, ): """Find optimal step length.""" - step_len_trial = 2 - step_len_optimal = 1 + step_size_trial = 2 + step_size_optimal = 1 loglike_full_step = 1 loglike_half_step = 0 - while (loglike_full_step > loglike_half_step) & (step_len_trial >= min_step_size): - step_len_trial /= 2 + while (loglike_full_step > loglike_half_step) & (step_size_trial >= min_step_size): + step_size_trial /= 2 criterion_full_step = criterion_and_derivative( np.clip( - x + step_len_trial * direction_projected, lower_bounds, upper_bounds + x + step_size_trial * direction_projected, lower_bounds, upper_bounds ), task="criterion", ) criterion_half_step = criterion_and_derivative( np.clip( - x + (step_len_trial / 2) * direction_projected, + x + (step_size_trial / 2) * direction_projected, lower_bounds, upper_bounds, ), @@ -334,6 +338,6 @@ def find_optimal_step_len( loglike_full_step = np.sum(criterion_full_step) loglike_half_step = np.sum(criterion_half_step) - step_len_optimal = step_len_trial + step_size_optimal = step_size_trial - return step_len_optimal + return step_size_optimal From 730ed940ae44f1b7cfa35af39ed40e77f6fb96c5 Mon Sep 17 00:00:00 2001 From: Sebastian Gsell Date: Wed, 31 Aug 2022 13:48:44 +0200 Subject: [PATCH 09/12] Add variable on convergence status. --- src/estimagic/optimization/bhhh.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/estimagic/optimization/bhhh.py b/src/estimagic/optimization/bhhh.py index 2345be6c7..80dee10bb 100644 --- a/src/estimagic/optimization/bhhh.py +++ b/src/estimagic/optimization/bhhh.py @@ -96,6 +96,7 @@ def bhhh_unconstrained( x_candidate = x + step_size * direction + converged = False for _n_iter in range(stopping_max_iterations): criterion_candidate, jacobian = criterion_and_derivative(x_candidate) @@ -133,14 +134,17 @@ def bhhh_unconstrained( ) if relative_params_difference < convergence_relative_params_tolerance: + converged = True break elif norm_grad < convergence_absolute_gradient_tolerance: + converged = True break result_dict = { "solution_x": x, "solution_criterion": criterion_accepted, "solution_loglikelihood": np.sum(criterion_accepted), + "converged": converged, "relative_params_difference": relative_params_difference, "absolute_gradient_norm": norm_grad, "n_iterations": _n_iter, @@ -206,6 +210,7 @@ def bhhh_box_constrained( x, norm_proj_grad, lower_bounds, upper_bounds ) + converged = False for _n_iter in range(stopping_max_iterations): jacobian = criterion_and_derivative(x, task="derivative") gradient = np.sum(jacobian, axis=0) @@ -240,8 +245,10 @@ def bhhh_box_constrained( ) if relative_params_difference < convergence_relative_params_tolerance: + converged = True break elif norm_proj_grad < convergence_absolute_gradient_tolerance: + converged = True break inactive_set = estimate_epsilon_inactive_set( @@ -254,6 +261,7 @@ def bhhh_box_constrained( "solution_x": x, "solution_criterion": solution_criterion, "solution_loglikelihood": np.sum(solution_criterion), + "converged": converged, "relative_params_difference": relative_params_difference, "absolute_gradient_norm": norm_proj_grad, "n_iterations": _n_iter, From 3f6bc889d54e4dbb4e6437e028dac750e5440546 Mon Sep 17 00:00:00 2001 From: Sebastian Gsell Date: Wed, 31 Aug 2022 14:12:42 +0200 Subject: [PATCH 10/12] Add more tests. --- src/estimagic/optimization/bhhh.py | 14 ++++---- tests/optimization/test_bhhh.py | 55 ++++++++++++------------------ 2 files changed, 29 insertions(+), 40 deletions(-) diff --git a/src/estimagic/optimization/bhhh.py b/src/estimagic/optimization/bhhh.py index 80dee10bb..8bfce4534 100644 --- a/src/estimagic/optimization/bhhh.py +++ b/src/estimagic/optimization/bhhh.py @@ -206,7 +206,7 @@ def bhhh_box_constrained( norm_proj_grad = np.linalg.norm( x - np.clip(x - gradient, lower_bounds, upper_bounds) ) - inactive_set = estimate_epsilon_inactive_set( + inactive_set = _estimate_epsilon_inactive_set( x, norm_proj_grad, lower_bounds, upper_bounds ) @@ -219,11 +219,11 @@ def bhhh_box_constrained( hessian_approx = jacobian.T @ jacobian hessian_reduced = hessian_approx[inactive_set[:, np.newaxis], inactive_set] - direction_projected = determine_descent_direction( + direction_projected = _determine_descent_direction( gradient, gradient_reduced, hessian_reduced, inactive_set, n_params ) - step_size = find_optimal_step_size( + step_size = _find_optimal_step_size( x, direction_projected, lower_bounds, @@ -251,7 +251,7 @@ def bhhh_box_constrained( converged = True break - inactive_set = estimate_epsilon_inactive_set( + inactive_set = _estimate_epsilon_inactive_set( x, norm_proj_grad, lower_bounds, upper_bounds ) @@ -271,7 +271,7 @@ def bhhh_box_constrained( return result_dict -def estimate_epsilon_inactive_set(x, norm_grad, lower_bounds, upper_bounds): +def _estimate_epsilon_inactive_set(x, norm_grad, lower_bounds, upper_bounds): """Estimate the set of epsilon-inactive bound constraints. The set of epsilon-inactive indices underestimates (overestimates) the actual @@ -293,7 +293,7 @@ def estimate_epsilon_inactive_set(x, norm_grad, lower_bounds, upper_bounds): return inactive_set -def determine_descent_direction( +def _determine_descent_direction( gradient_candidate, gradient_reduced, hessian_reduced, inactive_set, n_params ): """Determine the new descent (search) direction.""" @@ -310,7 +310,7 @@ def determine_descent_direction( return direction_all -def find_optimal_step_size( +def _find_optimal_step_size( x, direction_projected, lower_bounds, diff --git a/tests/optimization/test_bhhh.py b/tests/optimization/test_bhhh.py index 756456849..263ab66dc 100644 --- a/tests/optimization/test_bhhh.py +++ b/tests/optimization/test_bhhh.py @@ -269,57 +269,46 @@ def result_probit_ibm(): # ===================================================================================== # Tests # ===================================================================================== - TEST_CASES_UNCONSTRAINED = [ - ( - criterion_and_derivative_logit, - np.zeros(3), - "result_logit_unconstrained", - ), - ( - criterion_and_derivative_probit, - np.zeros(3), - "result_probit_unconstrained", - ), - ( - criterion_and_derivative_logit_ibm, - np.zeros(9), - "result_logit_ibm", - ), - ( - criterion_and_derivative_probit_ibm, - np.zeros(9), - "result_probit_ibm", - ), + (criterion_and_derivative_logit, 3, "result_logit_unconstrained", 1e-6, 0), + (criterion_and_derivative_logit, 3, "result_logit_unconstrained", 0, 1e-8), + (criterion_and_derivative_probit, 3, "result_probit_unconstrained", 1e-6, 0), + (criterion_and_derivative_probit, 3, "result_probit_unconstrained", 0, 1e-8), + (criterion_and_derivative_logit_ibm, 9, "result_logit_ibm", 1e-6, 0), + (criterion_and_derivative_logit_ibm, 9, "result_logit_ibm", 0, 1e-8), + (criterion_and_derivative_probit_ibm, 9, "result_probit_ibm", 1e-6, 0), + (criterion_and_derivative_probit_ibm, 9, "result_probit_ibm", 0, 1e-8), ] @pytest.mark.parametrize( - "criterion_and_derivative, x0, expected", + "criterion_and_derivative, n_params, expected, params_tol, gradient_tol", TEST_CASES_UNCONSTRAINED, ) -def test_maximum_likelihood( +def test_maximum_likelihood_unconstrained( criterion_and_derivative, - x0, + n_params, expected, + params_tol, + gradient_tol, request, ): params_expected = request.getfixturevalue(expected) result_unconstr = bhhh_unconstrained( criterion_and_derivative, - x=x0, - convergence_relative_params_tolerance=1e-6, - convergence_absolute_gradient_tolerance=1e-8, + x=np.zeros(n_params), + convergence_relative_params_tolerance=params_tol, + convergence_absolute_gradient_tolerance=gradient_tol, stopping_max_iterations=200, ) result_constr = bhhh_box_constrained( criterion_and_derivative, - x=x0, - lower_bounds=np.full(len(x0), -np.inf), - upper_bounds=np.full(len(x0), np.inf), - convergence_relative_params_tolerance=1e-6, - convergence_absolute_gradient_tolerance=1e-8, + x=np.zeros(n_params), + lower_bounds=np.full(n_params, -np.inf), + upper_bounds=np.full(n_params, np.inf), + convergence_relative_params_tolerance=params_tol, + convergence_absolute_gradient_tolerance=gradient_tol, stopping_max_iterations=200, ) @@ -351,7 +340,7 @@ def test_maximum_likelihood( "criterion_and_derivative, x0, lower_bounds, upper_bounds, expected, digits", TEST_CASES_CONSTRAINED, ) -def test_maximum_likelihood_bounded( +def test_maximum_likelihood_constrained( criterion_and_derivative, x0, lower_bounds, From a3c2d9011b2265e1a2b7a18782aa10ffb7e6c5a3 Mon Sep 17 00:00:00 2001 From: Sebastian Gsell Date: Fri, 21 Oct 2022 13:03:38 +0200 Subject: [PATCH 11/12] Remove constrained probit test and put references in docstrings. --- src/estimagic/optimization/bhhh.py | 9 +++++++++ tests/optimization/test_bhhh.py | 14 ++------------ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/estimagic/optimization/bhhh.py b/src/estimagic/optimization/bhhh.py index 8bfce4534..3317f39bd 100644 --- a/src/estimagic/optimization/bhhh.py +++ b/src/estimagic/optimization/bhhh.py @@ -54,6 +54,10 @@ def bhhh_unconstrained( ): """Minimize a likelihood function using the unconstrained BHHH algorithm. + This implementation is based on the Matlab code by Fedor Iskhakov, which can + be found on his `Github page `. + Args: criterion_and_derivative (callable): A function returning the tuple: - criterion (np.ndarray): Likelihood contributions of shape (n_obs,) @@ -169,6 +173,11 @@ def bhhh_box_constrained( similar to the approach used by the Projected BFGS-Armijo algorithm (see :cite:`Kelley1999`, p. 97). + The unconstrained version of this algorithm is based on the Matlab implementation + by Adam E. Theising. See `Assignment 4 ` + on Maximum Likelihood Estimation on the course page of Applied Econometrics II. + + Args: criterion_and_derivative (callable): A function returning the tuple: - criterion (np.ndarray): Likelihood contributions of shape (n_obs,) diff --git a/tests/optimization/test_bhhh.py b/tests/optimization/test_bhhh.py index 263ab66dc..9248758dd 100644 --- a/tests/optimization/test_bhhh.py +++ b/tests/optimization/test_bhhh.py @@ -323,21 +323,12 @@ def test_maximum_likelihood_unconstrained( np.array([-5, -100, -100]), np.array([10, 100, 100]), "result_logit_constrained", - 4, - ), - ( - criterion_and_derivative_probit, - np.zeros(3), - np.array([-5, -np.inf, -np.inf]), - np.array([10, np.inf, np.inf]), - "result_probit_constrained", - 0, ), ] @pytest.mark.parametrize( - "criterion_and_derivative, x0, lower_bounds, upper_bounds, expected, digits", + "criterion_and_derivative, x0, lower_bounds, upper_bounds, expected", TEST_CASES_CONSTRAINED, ) def test_maximum_likelihood_constrained( @@ -346,7 +337,6 @@ def test_maximum_likelihood_constrained( lower_bounds, upper_bounds, expected, - digits, request, ): params_expected = request.getfixturevalue(expected) @@ -361,4 +351,4 @@ def test_maximum_likelihood_constrained( stopping_max_iterations=200, ) - aaae(result["solution_x"], params_expected, decimal=digits) + aaae(result["solution_x"], params_expected, decimal=4) From c78c111030e967e27fa9b7c7dcdf378898c17c78 Mon Sep 17 00:00:00 2001 From: Sebastian Gsell Date: Fri, 21 Oct 2022 22:02:34 +0200 Subject: [PATCH 12/12] Remove constrained probit test. --- src/estimagic/optimization/bhhh.py | 11 +++-- tests/optimization/test_bhhh.py | 40 +++++++------------ .../optimization/test_pounders_integration.py | 17 -------- 3 files changed, 22 insertions(+), 46 deletions(-) diff --git a/src/estimagic/optimization/bhhh.py b/src/estimagic/optimization/bhhh.py index 3317f39bd..f3c0a7fcc 100644 --- a/src/estimagic/optimization/bhhh.py +++ b/src/estimagic/optimization/bhhh.py @@ -75,7 +75,7 @@ def bhhh_unconstrained( the optimization stops, but we do not count this as convergence. Returns: - (dict) Result dictionary containing: + dict: Result dictionary containing: - solution_x (np.ndarray): Solution vector of shape (n_params,). - solution_criterion (np.ndarray): Likelihood contributions at the solution. @@ -195,7 +195,7 @@ def bhhh_box_constrained( the optimization stops, but we do not count this as convergence. Returns: - (dict) Result dictionary containing: + dict: Result dictionary containing: - solution_x (np.ndarray): Solution vector of shape (n_params,). - solution_criterion (np.ndarray): Likelihood contributions at the solution. @@ -286,12 +286,17 @@ def _estimate_epsilon_inactive_set(x, norm_grad, lower_bounds, upper_bounds): The set of epsilon-inactive indices underestimates (overestimates) the actual set of inactive (active) indices. + Args: x (np.ndarray): Current parameter vector of shape (n_params,). norm_grad (float): Norm of the projected gradient. lower_bounds (np.ndarray): 1d array of shape (n_params,) with lower bounds for the parameter vector x. upper_bounds (np.ndarray): 1d array of shape (n_params,) with upper bounds - for the parameter vector x + for the parameter vector x/ + + Returns: + np.ndarray: 1d array of shape (n_inactive_constraints,) containing the set + of inactive constraints. """ epsilon = min(np.min(upper_bounds - lower_bounds) / 2, norm_grad) diff --git a/tests/optimization/test_bhhh.py b/tests/optimization/test_bhhh.py index 9248758dd..1e54eff83 100644 --- a/tests/optimization/test_bhhh.py +++ b/tests/optimization/test_bhhh.py @@ -89,7 +89,7 @@ def criterion_and_derivative_logit(x, task="criterion_and_derivative"): If task="criterion_and_derivative", compute both. Returns: - (np.ndarray or tuple): If task=="criterion" it returns the output of + np.ndarray or tuple: If task=="criterion" it returns the output of criterion, which is a 1d numpy array. If task=="derivative" it returns the first derivative of criterion, which is 2d numpy array. @@ -121,7 +121,7 @@ def criterion_and_derivative_logit_ibm(x, task="criterion_and_derivative"): If task="criterion_and_derivative", compute both. Returns: - (np.ndarray or tuple): If task=="criterion" it returns the output of + np.ndarray or tuple: If task=="criterion" it returns the output of criterion, which is a 1d numpy array. If task=="derivative" it returns the first derivative of criterion, which is 2d numpy array. @@ -153,7 +153,7 @@ def criterion_and_derivative_probit(x, task="criterion_and_derivative"): If task="criterion_and_derivative", compute both. Returns: - (np.ndarray or tuple): If task=="criterion" it returns the output of + np.ndarray or tuple: If task=="criterion" it returns the output of criterion, which is a 1d numpy array. If task=="derivative" it returns the first derivative of criterion, which is 2d numpy array. @@ -185,7 +185,7 @@ def criterion_and_derivative_probit_ibm(x, task="criterion_and_derivative"): If task="criterion_and_derivative", compute both. Returns: - (np.ndarray or tuple): If task=="criterion" it returns the output of + np.ndarray or tuple: If task=="criterion" it returns the output of criterion, which is a 1d numpy array. If task=="derivative" it returns the first derivative of criterion, which is 2d numpy array. @@ -228,28 +228,6 @@ def result_probit_unconstrained(): return result.params -@pytest.fixture -def result_logit_constrained(): - endog, exog = generate_test_data() - result = sm.Logit(endog, exog).fit( - method="lbfgs", bounds=((-5, 10), (-100, 100), (-100, 100)), disp=False - ) - - return result.params - - -@pytest.fixture -def result_probit_constrained(): - endog, exog = generate_test_data() - result = sm.Logit(endog, exog).fit( - method="lbfgs", - bounds=((-5, np.inf), (-np.inf, np.inf), (-np.inf, np.inf)), - disp=False, - ) - - return result.params - - @pytest.fixture def result_logit_ibm(): endog, exog = load_ibm_data() @@ -266,6 +244,16 @@ def result_probit_ibm(): return result.params +@pytest.fixture +def result_logit_constrained(): + endog, exog = generate_test_data() + result = sm.Logit(endog, exog).fit( + method="lbfgs", bounds=((-5, 10), (-100, 100), (-100, 100)), disp=False + ) + + return result.params + + # ===================================================================================== # Tests # ===================================================================================== diff --git a/tests/optimization/test_pounders_integration.py b/tests/optimization/test_pounders_integration.py index a90e763e6..c61921b93 100644 --- a/tests/optimization/test_pounders_integration.py +++ b/tests/optimization/test_pounders_integration.py @@ -11,23 +11,6 @@ from numpy.testing import assert_array_almost_equal as aaae -def load_history(start_vec, solver_sub): - start_vec_str = np.array2string( - start_vec, precision=3, separator=",", suppress_small=False - ) - - history_x = np.genfromtxt( - TEST_FIXTURES_DIR / f"history_x_{start_vec_str}_{solver_sub}_3_8.csv", - delimiter=",", - ) - history_criterion = np.genfromtxt( - TEST_FIXTURES_DIR / f"history_criterion_{start_vec_str}_{solver_sub}_3_8.csv", - delimiter=",", - ) - - return history_x, history_criterion - - @pytest.fixture def criterion(): data = pd.read_csv(TEST_FIXTURES_DIR / "pounders_example_data.csv")