[postgis-tickets] [SCM] PostGIS branch master updated. 3.1.0alpha1-106-g9e5df19
git at osgeo.org
git at osgeo.org
Fri May 8 08:49:01 PDT 2020
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "PostGIS".
The branch, master has been updated
via 9e5df19ed0a3fca351fa6c72ea8ca702fb64da2e (commit)
from 575ae8580b36b093c90fb6fdde7c00c16cf2e755 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 9e5df19ed0a3fca351fa6c72ea8ca702fb64da2e
Author: Raúl Marín <git at rmr.ninja>
Date: Fri May 8 16:18:06 2020 +0200
Update wagyu to 0.5.0
Closes https://github.com/postgis/postgis/pull/563
Closes #4620
diff --git a/LICENSE.TXT b/LICENSE.TXT
index 8578dd5..b70a7af 100644
--- a/LICENSE.TXT
+++ b/LICENSE.TXT
@@ -3,7 +3,7 @@ PostGIS Licensing
This file attempts to include all licenses that apply within the PostGIS
source tree, in particular any that are supposed to be exposed to the end
-user for credit requirements for instance.
+user for credit requirements for instance.
PostGIS General
----------------
@@ -44,7 +44,8 @@ license. Copyright (c) 2005-2018, Troy D. Hanson.
-- deps/wagyu (see LICENSE.README in folder) includes code released under the
ISC license (copyrighted by Mapbox) and the Boost Software License (copyrighted
-by Angus Johnson and Mapbox).
+by Angus Johnson and Mapbox). Copyright for "almost_equal.hpp" file is held by
+Google Inc and its license is listed at the top of that file.
The documentation for PostGIS is under a creative commons share-alike
3.0 license. http://creativecommons.org/licenses/by-sa/3.0/
@@ -58,4 +59,4 @@ Data used in documentation falls in one of the following categories
utilizes ImageMagick) as described
http://trac.osgeo.org/postgis/wiki/DevWikiDocNewFeature
- PostGIS raster output functions such as the ST_AsPNG etc.
-- raster/vector data from MassGIS: http://www.mass.gov/mgis/laylist.htm
+- raster/vector data from MassGIS: http://www.mass.gov/mgis/laylist.htm
diff --git a/NEWS b/NEWS
index 1a84412..7203935 100644
--- a/NEWS
+++ b/NEWS
@@ -19,6 +19,7 @@ Only tickets not included in 3.1.0alpha1
- #4672, Cache getSRSbySRID and getSRIDbySRS (Raúl Marín)
- #4676, Avoid decompressing toasted geometries to read only the header (Raúl Marín)
Optimize cast to Postgresql point type (Raúl Marín)
+ - #4620, Update internal wagyu to 0.5.0 (Raúl Marín)
* Bug fixes *
- #4652, Fix several memory related bugs in ST_GeomFromGML (Raúl Marín)
diff --git a/deps/wagyu/README.md b/deps/wagyu/README.md
index 94a0eda..d5e0461 100644
--- a/deps/wagyu/README.md
+++ b/deps/wagyu/README.md
@@ -25,3 +25,4 @@ It is integrated in the project as an static library inside postgis.so, so it do
- 2019-02-05 - [Wagyu] Library extraction from https://github.com/mapbox/wagyu
- 2019-02-05 - [geometry.hpp] Library extraction from https://github.com/mapbox/geometry.hpp
+ - 2020-05-08 - [Wagyu] Update to 0.5.0
diff --git a/deps/wagyu/include/mapbox/geometry/wagyu/active_bound_list.hpp b/deps/wagyu/include/mapbox/geometry/wagyu/active_bound_list.hpp
index dc113ee..d3a6ec2 100644
--- a/deps/wagyu/include/mapbox/geometry/wagyu/active_bound_list.hpp
+++ b/deps/wagyu/include/mapbox/geometry/wagyu/active_bound_list.hpp
@@ -90,11 +90,11 @@ struct bound_insert_location {
auto const& bound1 = *b;
if (values_are_equal(bound2.current_x, bound1.current_x)) {
if (bound2.current_edge->top.y > bound1.current_edge->top.y) {
- return static_cast<double>(bound2.current_edge->top.x) <
- get_current_x(*(bound1.current_edge), bound2.current_edge->top.y);
+ return less_than(static_cast<double>(bound2.current_edge->top.x),
+ get_current_x(*(bound1.current_edge), bound2.current_edge->top.y));
} else {
- return static_cast<double>(bound1.current_edge->top.x) >
- get_current_x(*(bound2.current_edge), bound1.current_edge->top.y);
+ return greater_than(static_cast<double>(bound1.current_edge->top.x),
+ get_current_x(*(bound2.current_edge), bound1.current_edge->top.y));
}
} else {
return bound2.current_x < bound1.current_x;
diff --git a/deps/wagyu/include/mapbox/geometry/wagyu/almost_equal.hpp b/deps/wagyu/include/mapbox/geometry/wagyu/almost_equal.hpp
new file mode 100644
index 0000000..71ef122
--- /dev/null
+++ b/deps/wagyu/include/mapbox/geometry/wagyu/almost_equal.hpp
@@ -0,0 +1,277 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+
+// This template class serves as a compile-time function from size to
+// type. It maps a size in bytes to a primitive type with that
+// size. e.g.
+//
+// TypeWithSize<4>::UInt
+//
+// is typedef-ed to be unsigned int (unsigned integer made up of 4
+// bytes).
+//
+// Such functionality should belong to STL, but I cannot find it
+// there.
+//
+// Google Test uses this class in the implementation of floating-point
+// comparison.
+//
+// For now it only handles UInt (unsigned int) as that's all Google Test
+// needs. Other types can be easily added in the future if need
+// arises.
+namespace mapbox {
+namespace geometry {
+namespace wagyu {
+namespace util {
+
+template <size_t size>
+class TypeWithSize {
+public:
+ // This prevents the user from using TypeWithSize<N> with incorrect
+ // values of N.
+ typedef void UInt;
+};
+
+// The specialization for size 4.
+template <>
+class TypeWithSize<4> {
+public:
+ // unsigned int has size 4 in both gcc and MSVC.
+ //
+ // As base/basictypes.h doesn't compile on Windows, we cannot use
+ // uint32, uint64, and etc here.
+ typedef int Int;
+ typedef unsigned int UInt;
+};
+
+// The specialization for size 8.
+template <>
+class TypeWithSize<8> {
+public:
+#if GTEST_OS_WINDOWS
+ typedef __int64 Int;
+ typedef unsigned __int64 UInt;
+#else
+ typedef long long Int; // NOLINT
+ typedef unsigned long long UInt; // NOLINT
+#endif // GTEST_OS_WINDOWS
+};
+
+// This template class represents an IEEE floating-point number
+// (either single-precision or double-precision, depending on the
+// template parameters).
+//
+// The purpose of this class is to do more sophisticated number
+// comparison. (Due to round-off error, etc, it's very unlikely that
+// two floating-points will be equal exactly. Hence a naive
+// comparison by the == operation often doesn't work.)
+//
+// Format of IEEE floating-point:
+//
+// The most-significant bit being the leftmost, an IEEE
+// floating-point looks like
+//
+// sign_bit exponent_bits fraction_bits
+//
+// Here, sign_bit is a single bit that designates the sign of the
+// number.
+//
+// For float, there are 8 exponent bits and 23 fraction bits.
+//
+// For double, there are 11 exponent bits and 52 fraction bits.
+//
+// More details can be found at
+// http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
+//
+// Template parameter:
+//
+// RawType: the raw floating-point type (either float or double)
+template <typename RawType>
+class FloatingPoint {
+public:
+ // Defines the unsigned integer type that has the same size as the
+ // floating point number.
+ typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
+
+ // Constants.
+
+ // # of bits in a number.
+ static const size_t kBitCount = 8 * sizeof(RawType);
+
+ // # of fraction bits in a number.
+ static const size_t kFractionBitCount = std::numeric_limits<RawType>::digits - 1;
+
+ // # of exponent bits in a number.
+ static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
+
+ // The mask for the sign bit.
+ static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
+
+ // The mask for the fraction bits.
+ static const Bits kFractionBitMask = ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
+
+ // The mask for the exponent bits.
+ static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
+
+ // How many ULP's (Units in the Last Place) we want to tolerate when
+ // comparing two numbers. The larger the value, the more error we
+ // allow. A 0 value means that two numbers must be exactly the same
+ // to be considered equal.
+ //
+ // The maximum error of a single floating-point operation is 0.5
+ // units in the last place. On Intel CPU's, all floating-point
+ // calculations are done with 80-bit precision, while double has 64
+ // bits. Therefore, 4 should be enough for ordinary use.
+ //
+ // See the following article for more details on ULP:
+ // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm.
+ static const size_t kMaxUlps = 4;
+
+ // Constructs a FloatingPoint from a raw floating-point number.
+ //
+ // On an Intel CPU, passing a non-normalized NAN (Not a Number)
+ // around may change its bits, although the new value is guaranteed
+ // to be also a NAN. Therefore, don't expect this constructor to
+ // preserve the bits in x when x is a NAN.
+ explicit FloatingPoint(const RawType& x) : u_(x) {
+ }
+
+ // Static methods
+
+ // Reinterprets a bit pattern as a floating-point number.
+ //
+ // This function is needed to test the AlmostEquals() method.
+ static RawType ReinterpretBits(const Bits bits) {
+ FloatingPoint fp(0);
+ fp.u_.bits_ = bits;
+ return fp.u_.value_;
+ }
+
+ // Returns the floating-point number that represent positive infinity.
+ static RawType Infinity() {
+ return ReinterpretBits(kExponentBitMask);
+ }
+
+ // Non-static methods
+
+ // Returns the bits that represents this number.
+ const Bits& bits() const {
+ return u_.bits_;
+ }
+
+ // Returns the exponent bits of this number.
+ Bits exponent_bits() const {
+ return kExponentBitMask & u_.bits_;
+ }
+
+ // Returns the fraction bits of this number.
+ Bits fraction_bits() const {
+ return kFractionBitMask & u_.bits_;
+ }
+
+ // Returns the sign bit of this number.
+ Bits sign_bit() const {
+ return kSignBitMask & u_.bits_;
+ }
+
+ // Returns true iff this is NAN (not a number).
+ bool is_nan() const {
+ // It's a NAN if the exponent bits are all ones and the fraction
+ // bits are not entirely zeros.
+ return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
+ }
+
+ // Returns true iff this number is at most kMaxUlps ULP's away from
+ // rhs. In particular, this function:
+ //
+ // - returns false if either number is (or both are) NAN.
+ // - treats really large numbers as almost equal to infinity.
+ // - thinks +0.0 and -0.0 are 0 DLP's apart.
+ bool AlmostEquals(const FloatingPoint& rhs) const {
+ // The IEEE standard says that any comparison operation involving
+ // a NAN must return false.
+ if (is_nan() || rhs.is_nan())
+ return false;
+
+ return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_) <= kMaxUlps;
+ }
+
+private:
+ // The data type used to store the actual floating-point number.
+ union FloatingPointUnion {
+ explicit FloatingPointUnion(RawType val) : value_(val) {
+ }
+ RawType value_; // The raw floating-point number.
+ Bits bits_; // The bits that represent the number.
+ };
+
+ // Converts an integer from the sign-and-magnitude representation to
+ // the biased representation. More precisely, let N be 2 to the
+ // power of (kBitCount - 1), an integer x is represented by the
+ // unsigned number x + N.
+ //
+ // For instance,
+ //
+ // -N + 1 (the most negative number representable using
+ // sign-and-magnitude) is represented by 1;
+ // 0 is represented by N; and
+ // N - 1 (the biggest number representable using
+ // sign-and-magnitude) is represented by 2N - 1.
+ //
+ // Read http://en.wikipedia.org/wiki/Signed_number_representations
+ // for more details on signed number representations.
+ static Bits SignAndMagnitudeToBiased(const Bits& sam) {
+ if (kSignBitMask & sam) {
+ // sam represents a negative number.
+ return ~sam + 1;
+ } else {
+ // sam represents a positive number.
+ return kSignBitMask | sam;
+ }
+ }
+
+ // Given two numbers in the sign-and-magnitude representation,
+ // returns the distance between them as an unsigned number.
+ static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits& sam1, const Bits& sam2) {
+ const Bits biased1 = SignAndMagnitudeToBiased(sam1);
+ const Bits biased2 = SignAndMagnitudeToBiased(sam2);
+ return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
+ }
+
+ FloatingPointUnion u_;
+};
+
+} // namespace util
+} // namespace wagyu
+} // namespace geometry
+} // namespace mapbox
diff --git a/deps/wagyu/include/mapbox/geometry/wagyu/interrupt.hpp b/deps/wagyu/include/mapbox/geometry/wagyu/interrupt.hpp
index 083cf36..d4d68ae 100644
--- a/deps/wagyu/include/mapbox/geometry/wagyu/interrupt.hpp
+++ b/deps/wagyu/include/mapbox/geometry/wagyu/interrupt.hpp
@@ -9,7 +9,7 @@
#ifdef USE_WAGYU_INTERRUPT
namespace {
-bool WAGYU_INTERRUPT_REQUESTED = false;
+thread_local bool WAGYU_INTERRUPT_REQUESTED = false;
}
namespace mapbox {
diff --git a/deps/wagyu/include/mapbox/geometry/wagyu/process_horizontal.hpp b/deps/wagyu/include/mapbox/geometry/wagyu/process_horizontal.hpp
index 5dbbe54..ecd6691 100644
--- a/deps/wagyu/include/mapbox/geometry/wagyu/process_horizontal.hpp
+++ b/deps/wagyu/include/mapbox/geometry/wagyu/process_horizontal.hpp
@@ -54,7 +54,7 @@ active_bound_list_itr<T> process_horizontal_left_to_right(T scanline_y,
++hp_itr;
}
- if ((*bnd)->current_x > static_cast<double>((*horz_bound)->current_edge->top.x)) {
+ if (greater_than((*bnd)->current_x, static_cast<double>((*horz_bound)->current_edge->top.x))) {
break;
}
@@ -75,7 +75,7 @@ active_bound_list_itr<T> process_horizontal_left_to_right(T scanline_y,
// OK, so far we're still in range of the horizontal Edge but make sure
// we're at the last of consec. horizontals when matching with eMaxPair
if (is_maxima_edge && bnd == bound_max_pair) {
- if ((*horz_bound)->ring) {
+ if ((*horz_bound)->ring && (*bound_max_pair)->ring) {
add_local_maximum_point(*(*horz_bound), *(*bound_max_pair), (*horz_bound)->current_edge->top, rings,
active_bounds);
}
@@ -159,7 +159,7 @@ active_bound_list_itr<T> process_horizontal_right_to_left(T scanline_y,
++hp_itr;
}
- if ((*bnd)->current_x < static_cast<double>((*horz_bound)->current_edge->top.x)) {
+ if (less_than((*bnd)->current_x, static_cast<double>((*horz_bound)->current_edge->top.x))) {
break;
}
@@ -180,7 +180,7 @@ active_bound_list_itr<T> process_horizontal_right_to_left(T scanline_y,
// OK, so far we're still in range of the horizontal Edge but make sure
// we're at the last of consec. horizontals when matching with eMaxPair
if (is_maxima_edge && bnd == bound_max_pair) {
- if ((*horz_bound)->ring) {
+ if ((*horz_bound)->ring && (*bound_max_pair)->ring) {
add_local_maximum_point(*(*horz_bound), *(*bound_max_pair), (*horz_bound)->current_edge->top, rings,
active_bounds);
}
diff --git a/deps/wagyu/include/mapbox/geometry/wagyu/ring_util.hpp b/deps/wagyu/include/mapbox/geometry/wagyu/ring_util.hpp
index 8aa3950..64d3a13 100644
--- a/deps/wagyu/include/mapbox/geometry/wagyu/ring_util.hpp
+++ b/deps/wagyu/include/mapbox/geometry/wagyu/ring_util.hpp
@@ -74,18 +74,17 @@ struct hot_pixel_sorter {
}
};
-// Due to the nature of floating point calculations
-// and the high likely hood of values around X.5, we
-// need to fudge what is X.5 some for our rounding.
-const double rounding_offset = 1e-12;
-const double rounding_offset_y = 5e-13;
-
template <typename T>
T round_towards_min(double val) {
// 0.5 rounds to 0
// 0.0 rounds to 0
// -0.5 rounds to -1
- return static_cast<T>(std::ceil(val - 0.5 + rounding_offset));
+ double half = std::floor(val) + 0.5;
+ if (values_are_equal(val, half)) {
+ return static_cast<T>(std::floor(val));
+ } else {
+ return static_cast<T>(std::llround(val));
+ }
}
template <typename T>
@@ -93,7 +92,12 @@ T round_towards_max(double val) {
// 0.5 rounds to 1
// 0.0 rounds to 0
// -0.5 rounds to 0
- return static_cast<T>(std::floor(val + 0.5 + rounding_offset));
+ double half = std::floor(val) + 0.5;
+ if (values_are_equal(val, half)) {
+ return static_cast<T>(std::ceil(val));
+ } else {
+ return static_cast<T>(std::llround(val));
+ }
}
template <typename T>
@@ -117,8 +121,8 @@ inline T get_edge_min_x(edge<T> const& edge, const T current_y) {
if (current_y == edge.bot.y) {
return edge.bot.x;
} else {
- double return_val = static_cast<double>(edge.bot.x) +
- edge.dx * (static_cast<double>(current_y - edge.bot.y) + 0.5 - rounding_offset_y);
+ double return_val =
+ static_cast<double>(edge.bot.x) + edge.dx * (static_cast<double>(current_y - edge.bot.y) + 0.5);
T value = round_towards_min<T>(return_val);
return value;
}
@@ -146,8 +150,8 @@ inline T get_edge_max_x(edge<T> const& edge, const T current_y) {
if (current_y == edge.bot.y) {
return edge.bot.x;
} else {
- double return_val = static_cast<double>(edge.bot.x) +
- edge.dx * (static_cast<double>(current_y - edge.bot.y) + 0.5 - rounding_offset_y);
+ double return_val =
+ static_cast<double>(edge.bot.x) + edge.dx * (static_cast<double>(current_y - edge.bot.y) + 0.5);
T value = round_towards_max<T>(return_val);
return value;
}
diff --git a/deps/wagyu/include/mapbox/geometry/wagyu/util.hpp b/deps/wagyu/include/mapbox/geometry/wagyu/util.hpp
index f8acdb4..974afc4 100644
--- a/deps/wagyu/include/mapbox/geometry/wagyu/util.hpp
+++ b/deps/wagyu/include/mapbox/geometry/wagyu/util.hpp
@@ -4,6 +4,7 @@
#include <mapbox/geometry/point.hpp>
#include <mapbox/geometry/polygon.hpp>
+#include <mapbox/geometry/wagyu/almost_equal.hpp>
#include <mapbox/geometry/wagyu/point.hpp>
namespace mapbox {
@@ -30,18 +31,26 @@ double area(mapbox::geometry::linear_ring<T> const& poly) {
return -a * 0.5;
}
-inline bool value_is_zero(double val) {
- return std::fabs(val) < (5.0 * std::numeric_limits<double>::epsilon());
+inline bool values_are_equal(double x, double y) {
+ return util::FloatingPoint<double>(x).AlmostEquals(util::FloatingPoint<double>(y));
}
-inline bool values_are_equal(double x, double y) {
- return value_is_zero(x - y);
+inline bool value_is_zero(double val) {
+ return values_are_equal(val, static_cast<double>(0.0));
}
inline bool greater_than_or_equal(double x, double y) {
return x > y || values_are_equal(x, y);
}
+inline bool greater_than(double x, double y) {
+ return (!values_are_equal(x, y) && x > y);
+}
+
+inline bool less_than(double x, double y) {
+ return (!values_are_equal(x, y) && x < y);
+}
+
template <typename T>
bool slopes_equal(mapbox::geometry::point<T> const& pt1,
mapbox::geometry::point<T> const& pt2,
diff --git a/deps/wagyu/include/mapbox/geometry/wagyu/wagyu.hpp b/deps/wagyu/include/mapbox/geometry/wagyu/wagyu.hpp
index 4401418..157e36e 100644
--- a/deps/wagyu/include/mapbox/geometry/wagyu/wagyu.hpp
+++ b/deps/wagyu/include/mapbox/geometry/wagyu/wagyu.hpp
@@ -17,8 +17,8 @@
#include <mapbox/geometry/wagyu/vatti.hpp>
#define WAGYU_MAJOR_VERSION 0
-#define WAGYU_MINOR_VERSION 4
-#define WAGYU_PATCH_VERSION 3
+#define WAGYU_MINOR_VERSION 5
+#define WAGYU_PATCH_VERSION 0
#define WAGYU_VERSION (WAGYU_MAJOR_VERSION * 100000) + (WAGYU_MINOR_VERSION * 100) + (WAGYU_PATCH_VERSION)
diff --git a/regress/core/mvt.sql b/regress/core/mvt.sql
index 0476e44..d0513ca 100644
--- a/regress/core/mvt.sql
+++ b/regress/core/mvt.sql
@@ -707,7 +707,7 @@ SELECT '#4348Reversed2', ST_NPoints(ST_AsMVTGeom(
2048,
8,
true
- )) BETWEEN 2150 AND 2250;
+ )) BETWEEN 2140 AND 2250;
SELECT '#4348Point', ST_AsMVTGeom(
ST_GeomFromTWKB('\x06002309ee39cc89e70dc491e30348347411ce01c40110ce02b001c602033c3d48139a015a8e011b281e3e900176151426500382012fba011cf2028e019e027a8e015ac6022a2a0f3a9602b602420d3722185e536c2dca01620ce604f203be01e2018c01fa01141901404adc010eaa0124002304057a437087012c6f17533e1b4a08ba023daa0187017ea7011861314aa30173b801570d241c274655088501580e2d230303ae01768401205e1774340b3c5ebe01445219e001a301067dc6014bd4031ef4068e011855005ec606b2018802c6019001259a03a001183f1542cc01547c9e0120113e342a60dc012e5296011d2834369802689202da01141dba018c0148079c02c8014a0c08460c39ae046ade020fdc02420024361b80033c6a220224360fc4014a1fac02d004ec01218e011098014686017c6aaf01f5011191011c8b01423014b20162a001202b940357e40254a002b401240fbf02b301df013b8d0119b1024a49f1018e028b020041be010106f201920103038f019e020508a00304c502ca0347c6012a0834161d90025a88049a02fe03d202f602a002c601de019001c40216ec012b6e89016e51370135270021b801270e1c1e210668dc01094e3cb8017c50b8010594015a92010f003598018d0102453e3b96011fa4025c141f251d3a41a802df
01c101800191037f02cf012805271b2114158e0147056d6d1ab1016e61680615a201501a2b111499015a65ab0267f8023e232b9201bf01f601e1019001458a022bf80114463a40f60154528201027027c601b50170d10254639c0135545fc001178e0250062d7a0da00232900229e803e601f40228f802a602426e800341ec04b605fa028a04de02ec04a201b4040a040f0e05be04970108a40203105cf30102575aa7021b6b269c020623c60191015af301050a95021dea02693e6915d5014e1f3ecf01127963c50140a10188014d8a022d04185016214012062cae012c5a46262d6c2ee602149c01ec014db00104622e28e601186c6e9e040ce6015596010998015ef0024890017c5c04ae01b001c601f60282015880034e9201f802073841380e243102ca017ada01043822e60247bc01900158272a14529c01253a721838528e0202c80136443e8a0121f6014e601f763c600f4ebe013a2813900154f40525f40293012a494a241c187c07810150070e3a004d98013b8a02da019003c8011c3c6e435e46149e02b101e2062ca8011193013cb90138160e471c060524360a07280c25b8035a1f9e012b072a1207286a162acf01b2012453ec02860354f001ae081d564c2a0ff2040936310832000b3e4905361841344c0b23e00135bc0273f001a10103064717202b1110232d220337333
4034113427511ff013c9f0321f705cd01ff08df0823af026d6f0d45910283021b4d2249b701cb01b901679d02269b022dcd017b3ba901389b01af01531fbb0171b90139d402cf01ac03a502d003c7038a04123423219102ec018f027a4d31795287011aa70141bf0276cd01c5046ae4028904b201132d1030290e319501f7013c8e01fa018301280d3f093c850115c501890123bf01d20171402c373b4f8d025f202d8d01ea04d701df069e026537658f01bf01c303d301cd0112332b004555196926594775246371cb01773dcd014a8f02bd0141109d017579170f3252ce012530200e11569401bc01033829489b022e9b01bc01dc012a5658ae0151787c3e86026dc601322d3e6865b0010d68091f171e6a62048201306268365e8e01aa015e4eb6010072506e2aa001c403e20182028c037052a604b4019201a50135af015eed02d6019301d2029101fa0130ae029601d2028a028202e6034492041bf805c2017c8f03c402810278e7012ec9017d1e211f0f08bd018b014500970223d8026974598c02b501dc022a502f458b028c03f3019402cd0184019901cf014e7a8703a8023b69326efb0148278d017322288c0199025011430c426b2063c101351c2b535e396332457540211c8501783f0639a401c501e701ea01ef035ac303d3018b041b05260025d10113e301c101ed03e5012f
8d01e301c90243ab01068b011f452f35ff01015747212b12719901b90107554318270f06294b1a1f1dd90124493165f50125077702c901b401b70146c701b7014d84012c348a018a043ad0032350242607b80129ae0181014a3630013e3b083810044a356814bc014d7a10a001436e1b9e012c130718bd02a40281027c10741573c701030c47ad01519e0189027d704fa00181027aed02d4021654195135225525451c538201910148d101a4030fb60158cc02669a029401ee01ee039a020c38ec01c80184012594011ec001669c0120161b321c052a940117be0156c20261c6025e9c017464121e48bc017a3a722e005144342846011847201206393d276a6b08616671064f9801a1017e07206a131c664c50291b0d1e1701d3017e5fc40118dc0192018001b401675e743d161a468e010192015dc80183015189012888011f92015c1d2e190f63d201503a6e3f243485015af7028f03e401b402e301d40259c8021ed802e801fc0316bc015344009e016c9a01344d2e5811c10138110c2b2234037196018b01a2059301a00581048004cd029407a50286015fc80135b60539cc0312e608c601c807fa01d8098404a803f201a2049e033c6d674d4b99018c016733910130cf011fd0013496018501681e061c7cae014fac01e5011b508d019a01ab01526c64436aae02e2018009d20808303
7323226442f2434131ccc0164be01aa0126480dc401300b303a0e769e01bc014805423a07646e0e4252588a02d002b403cc01bc0434d80359d6026976422095023a69c10166c2012b20f2010805744f8a019d01a5018801a6017744970113158f03118a028b02096d80015b4f4d5c5a505d6e26266362ed01d10113e701a602d3021111af02e20212f801e401c60102402a020d1e2a0e02282112047471402a1803245f2c381a02466548004673140e3e5109563e45081848434742504d3c085a21261e2239008201e8019c011d666668a8032364290a4a2a1966351824121cac0123d201289801463c26a001151c5492013c389c011a94015e0b1ce8017a20223b642e011e532c1a376c2a3e40211845065e267116400a375e160260347b3008051c7415223e5c13282a0f30360d566466010e548c01401a36782f46125a441d322e0b0a4034062842500a0a2e082d400b1e467cd70147c3018601cb019a013524480c35420b0f1b2406625f84024b80010d9a045c9101af020033320a66dc0290020ed40176709a01439601c001061660ac011e373e2028340e143f261a064114588a010f788c016c1e242532120b1ba4017f8002604a2db20106ba059802f401940120cc012c44c803bc01ea01a401d801fa01b401608e0130b0012584012c8601be019401348c01b001da038e02d802e4
024e6e3adc0129b001ef01aa010eca016c709e010b94024a2c073e63f401169204b202be01a60220b0014bc001792c1e90057d94019201910101c7028a02191a9e01450c480222d0014f10105cc0011d1066450c480620ca01310a360a063229cc029101090245c901bf0295017394019001ae01b6023188029501b00127b20114d6012b86011aac0239fe0106b8016fde040098011f20201c36e802304e25364e175256032c2e1a14c8018a0161032394010576641b3c44102f1c4622460aa001653210406f11178401211b438e010f0ca7014485018c03d70238614a0f2234c801472a360b393e06123d42027249111338176adf016e030c3df401679001e301b8016b509d01f60177ae02334c2f00341a432c010b41d403d701682e183d96010444414a0a22271f0d2881015895017a2b1224542546149a01a5010349d801e904067d72f901cc02cb0186022f6e6d8c0123647524671165698b014bfd01065536170d27300c0b2d54433b20c502b50275eb0115bb012408810197028d03cd02a301e9019e01f001d2029e020c7e8a01e0010694013306052b8b0112354ed901bb0172435591015f362741361f3d125da1016f342548713f204b437a9f015d02310724470c538b01940111ad0103e203e501e503e0011117e40189018d014261bb011e99022c2b42223b274697010f73a90
191018b013bad0250bb016d71e3010afb014d8f0187016f1559326f0a93019601b7028a05f9072c1d1a240849ba013e7609ad01150149328b017e8b018405b60245c801bc0187036fb401bf015b224d3719234e8903bd0194014b4088012b7fb101a70136221a213551227d55e7010181021f020c57588b01c801e5011cd70288038b032d0407492738370f8b017f568902b801e701e402a302e4068503f608f102f806cf01aa0cc901a60725cc0612ca0272b604940396021e04363451281e4431ca0215d4028b018c01280c37e602734631165b9c02d1028102b905ae01ef021543ac01e7010347556b546d6f648502c1019702c7057191039301a101398d012bd9035332c50224850137cf01d5056f052f46a001a8014ab60233086b9d019c0186022201229c014d52e9027a2b2d528301129d02159c0251820104d902252c21ac04e701bc0136ba0213a6012b1a0b82017dd401531a06486f5eab0101d7019b017f21ef020ead0eaf04d001f306300a8008d306f205a904222b068901660406a806b806348001581c5e281517511ea70172fb02ad010a13f1019c010f31bd024b3544df015247a8019502250b8e01d501dc02ff029c03df02e0049303ba058502ce0371da0357bc05178403486c98012f722a1101703c1a0862a00158ae012bec01ab01e203c501b20397038e0584019a
07bc02a409cc04f604a003034e64aa01503824132852a201188e02b001222a339a01429301aa0116f101900a880187059e024a45f60324101a338c014013348201506b9202ff019c014b07313327cb0133012738ab019101a201a20161a6010c9201355e323a9e01037c5c2ec0024c6e840152de14b0010dff0100ec01c502114e810aae010a1e9a02139902f4012ba001e00471d5038401251e6c0f7b380e17159c013152c002bb0112480c451a481609217e2162f202d3025c1f5918625c1738da017730340f052854211c70a70124061aa6013112489b037af205c3018a02fe02c20255bd02468501bd01a80145cc019f018c0261aa04017455b403ab01ec0308ac013115e601b3025ec0025516ed01e809bb023290028e02068302112f8702581b8a032b86045246326f306c940190016169675e1aea02399c02668e02e2014fa601f3012f88024258af01ac026c47b201b2015697015754cf01820227be013cd801a6016ebc011642850182019d013dae0152ca02c502b0029e0143624a595a44112236031f2e242bb801840119221e1f40309701d60181038f0220414d70b803b402dc04ae020c1b4b1d142fa2015dd6012e729001d202cf01d6011b8801284a580b2c370e2024151258621532430a4405022e650e0022ea01212cb2023107128a011ab40130050e6e9e02210d42300
5162b15261b35c0044f32dc0229e3022c012b0335ff02cc033d3a2c009c0144051faf013317fe02332ca90132112b0b50b9022a1625252073221a0e2b2b01185b20280e352d04227f4b130e396214b10147a8011412437c0c771f640c61132c85013d0f123534004281022c1fc704414be801b9024b6e9d029c0143d001fd03cc0496012282018b01b401ac0188018403fd03ea03fe01ef01d403d60170fc01eb03cc06b403213a2439763c8903840685068d03e305ea02a806b0039906980c9409de04509901190d74e1011a0eb206c70cc402a80137f00140eb01e202b00179920189019002a4018801b2016d2c36ea0193011826462b65b5012c499c01bc01a101ed0135661d355e6f665261552429a204be034f642719261c13181f1d1e221b222b172a1c33031e204154311b1a2d1b2c3b1f1c4b1f4a713f3f289802d0028903f801d305dc04e404ea05d4038203c701c401be02f206c005f001ec0275052466232513b402650646ae01370a242b1a661f2f060f23b0026518482d18661f33041543f606ab0266d802e501426007329801260ba001da0387025e1729240b75e3022b1141c70120152d101c56bf01425cac02ad0f980531442f1f2c26151cee03ce0b8a04b801561db4028e07bd099c03a406de1249fb01a605e301c201bc049f05e6015de50150f401b4159707be01bc
03232e38ca0225402c382f58304e310e54000232492e5076148e0137be02272d3c6b04a101616e0fbc013e361d223d1c3b3b9101289301156d742220e50276c10112a5024fa702e101cf0104c10bec03ad02de04d423ce11b8010be20a9903326415221c17263ccc029e050440250a3e2c07b80187018004fb019c02ef02e201431b8b014637a8010aac01298801b5019202f50186056bc8019503e8030aba01588c0192012eee021b82013aca02e00160aa018a0176682246980180016041601996012b14082222110f7a2ac4014f323a1c14401f1c380b08265f9a021c1e3f1b3a5e157e738e02eb01dc02bf02a6028f02600cad02659301e1088001132d4930970695017d3d799102ad04a702e9035bf10160a1045feb027bbb03d701cb02f701de01c303e301bc0371658f01dd0115a7021c81018a019d026c244729ce01d1029a016b9c0105a202f4010587014f6b2005b90123ad01cd01e5013f9a0109ff014b8f03c101a9029502639901e10147af01cb01af08f9020148d70157830d8b02c50ce102a7067db3079302b7048b0263673fbb018c018d01371c9b02c901658b01161b1b149f03a904cb017283028701930293034ff1030f8d0312455e272b0435552b9d0267b9021ecb01583041613029136729175fdd037c9503420a1b176e91011c0a2b2f3417184bb802544ca3013
391016353103d213d85026f9f059101d3025c9902a2018f0380039103d4049301769b014efd0200a7038001b902b6018f03c2029305fa01fd0107fd029b012d3ddd03a9029501b301f50188038d01c6027b744b053a0caf02c2044b4a27212628330a1e161122cd018802e90196038903aa0397048601610b93046e3315a503be01003cae0add01f40a19c00858900f9c02be0370e8038402c8029c02ac01d2018a04a202b80213e0048e01a605c601ce0af803e80bc805dc0d9a08a80afe06c205d604e8058a04900c920af00184024532083822083c4fa2019801244c434c6e109601a001173e400f9c019401144c33362c1738388402a0033554069001cb01e2010d703e930188039703665a2d349a028202ab02de013329a901b001f50253f60262b001af015c5e151bfa01b501622ca604c803a209b40b7eca0208d001b501cc012836153e3486015d44121a0c1905647ea6013b5c1e2a3e2362cc0106403d3438091cc201174e4486010bc8015e9e011566541424580d92013f281a4eac018201192c125848456030f401be0168940130ec012f241a3625600e80022e25b8017c20252a8a017e64ce0352ac013f3a55092741707738eb0349755d27732e0b2a4af8013046dd028e0114604c596d8b0119082f33091879360eb4019301ec01c2016bb20176b101f101c701266dac017f
389e015e6a77b701158b0234061abe013e86013d9b01142b7c45e20113f6069002da02b6018e02d801e802ae01da018202ba0168b001aa01b803e201dc049e03e2049804a607a207ba08bc0af00290042dda021a00269902b801e0012d664b9e0442060acf0196025c9801b001769802027ebb011e05329802352e1409222021015c3632a401a003e6019003f8049e0ce603d80cb001d60572d0051b74470846081a3c7104740822a802b505f60129aa02241020ab02cc026b408802751a061e78193e80024a110c2ead024c4fb302261381012f3a4e60860324130f3bb003538001da0166cc034aca053dfa062734538204f701c607dd01f802af018a04e302ae042d00c502bc029505900351db01d301508104e505c703ff01ba039202bc01fa0163442d3b8701683882012b14300d54c201271c2c15b801ac032c0ba201a603ab014a22412d36331d9d018903e70189038501c901e502df028601a902c101cc028b0223e301a10126bf011b2d142e25c201cf028b01688f013522479a018302ce01022cf101840233a5011488022d0326382b5424f6021dbe014bb001673a590b024721137bbe014222551e6e423d402c103b82011315232a2c28131a22a0012b342e142b1020d40129661c042092013114421e0f50474c94030db8016ea601d6018002d003769c03840182021ada02354
23f0c0b6c190f3fa4011fca010ce6013f9e01d301a201c7015a0f1e42179301700f1624042d3c1b1f231a074ac701fe0128162f860118050ecc0229ae014e4e1e1111243213504a0a70715c0d4e9f01247d1961440f2c2c0d27720e3a67820167244c0d06225f80013001092c60153e54241d32183e96019a01092422223d4c150b48424c7c19305a3410122b1896014c1e10292b0931732e142c5d24201851342c2e4d28563619032d2c18112d1e0e2b433e2d3ccf02254e3d1d194322413a3410190ab7023a8101594d0d5d68b701ec018501d401256836be0125e4016ea203092a3f5c3246370b24261e143b0e2e5e6137752057766380010db205d0018e06a403de058005f6049a0613262e0d371c4a18f001de02ea03b807e0019604cc02c407a203a80cbc02fe0d24de0376e80328e20651e0031536cb0119820116115a7d8001c7015e3761125e6bc201a301a00149062e4609321c25121814c2012d4c39ec03e701dc035e8a011f8001340b002d6800162e8e012c0530300f1a49721d316b2e87023455960139103fec04663cf502c40119d1010c39f202e5023b0e59240624cd013000a5011b3a870258336a1a3ba60114300c2d2e0850ff01ca012819c00126bd011791024a4bc80255e0011c043c406f5428251f0a2f605d7a01c60c9a023c3af80246f802900122520a458802
523213d00154c4019801c60232c802b0019605c4019805c202c403ec02c207d404ac03b003d202f6018c059a07b403aa06fa01c2040866a001c602d001d005d904781052033bf202499201e405712888023322c001470e1ce801a70108067af0010d1ce2038902100442f4011c073e77820289012c2b9d012f0c2ca0016f2e1c68bd014e4b1176d9031d0726a50133ad01450741930132a6014606329e01af01c605fd03d80419de01469201197642204c290346342719542c712a010f31340024ab016a79ec059301800729b00230c2012b900222c60607d2016014502a1005627e1e36502c658801270d5d343ba80241ee02448e01a001e8029e01a603420f265223ae0116c402a00192037cda016782041ac80135d20106b6015d940101ee017644a4012f123690012e107847390507238a02ab0166fd02116d4a8301a2021fa602bd023f31d701a0021d87010a78472eb5010c239703fc0115187813dd01d70112095f2d040bc701bc0141384943389f010a56d9026454107c00774d5b1e33d202ae017fb20252a6032da5038201b702b30293019201ab02940103542dbe01f9012a75dc019501ac0207345db001066e6fd601480e3b4c2d4e42400769369401130c41343298012d6b0526172683015a2bde0761d2104d8c0738bc0211a408624cee011c0f3dd70188013608323c4fac0
130ce084cf20bcc02e201109e04a601f60ec203ae05c601d0028c01741b2ce601223728081976346d7a019c0c9c058a05ec02a60266f007d204a203c602b0013c46582a9601a8015e288a019401de010d4c4eb80158b0045f98019801d9019a0162aa02bb02b2038003ad02d6033e4be4019401dd019d01ca01bb029c038a0222359201568101c801c302164a2ec40101577c8a018101a201eb01f403fe02195e85014c1ba4016d3801c2014b0a2b88014d1e3f647c4700263411093044385080030bd0018102b601710c37270d2c4b0c182723004d565b033198011e0702382d060b31619c01850142417a18020b4a101260612a463c3b1822c401a101ca02a6021429a502f701e2039b039202f001dd01fe015a4ede01fd0124201e2190018201b901d601e001d70174701cc4011758a90182014306417e6f77265439208901a00215ae011f0b8f01a6010b724f740a344954721d9c01b9011257200c1fa8011c94011b4a2eca011f20067a2c04c2018702360b00312c0d407f3811085f5007023e5a531b587075f80264ae0294020c6828032c409d01860302a6014e3516365c06763bac01cf013c0b098e01648b01940162075c4839564241701a2c9c01698a013a36582d32006252310c3230073033c6011c9804a402ea029a02ac05a205f602a807aa018a0268f0010d80029701bc01
8a0155bd018801e50147e4014c417c45164e0b4c8b015039bc0184021fee01bf01190c9101139201590b03244812002ec7018a01594778810141b701309a019f01d201c90195016e8b0104e7011f2f0a9402af01de01940176a101a601220309362a0d3f60260906308401a1012828bf01c202169c0135253956420614212d521c44461d124da2019d0137bc01103040271f583864523b012344018c02d502261c362312688a018901222ab2029b034817d8023896028e01a0034cce0190014cd801fa01ea019c038e01b40215ec03c202da01a501de010ba20126e4018501d4031fe60148ac018701ae01499e0138643bee0260b0017c70021052d2013e309d01a201bb01ce0109cc0145a2014afe01d9010428781e2a3131454455f4012d6ead019a01371e6166339e05479603348602607c9602280b63e30298010bfa03d5011121b201c7011313b701d201d3015ca401a1022513a301de02d5013e5ba702ba013b2571b7013a39b701c6013d0721c7014425810129030c8f01f2022409960160da010e2f498f01e8014f5e8602518302ae014d97011e13632e5f724d104a2b40361f024d477b840291022022424dc0020f0a2d84011c9101439b02137b95018a0263565090010eb4019402c001a4011e920190023785021a85018b05c6035ff202900f16033dc70244cc022106a102f50
b36fc02a701248b01a4013c28689f019a011fda01e208441555d3022e00259b02f210080030b00302320000318802020bf60e89160502bd04150201d004a8160601e40cde13e00201ba02ac03425e8e01559901a7033f0a9302be011e00c2011c0400c101c0011e00c2011c0400c101cc013a00e80135343c279c011689011f02f501f0023a00fe0173687455e601b601d501bb01068910930f8f0206f50b8e0f04028d0a8d13e708479c01b303c901a905bc029501cb026e31a7018703ec011c281b502e071f600f0f3b3c190e241a2bd80132ee0193027b8401eb0133208f01b3012514512d0910472e0c0a2bf2036e074a165dcd03653e49d804048405aa028105b502c10306c4030bb21e880e10259a0144e803ee0e8c0cab01132284010d041f04229c09a501da20b303b207f504bd07f004e7021ccb018304b60ae306c8049801b0017fcc04af078f01c9071b020f5115b50259eb0217820191011a03258b023c451e0e4e25060b4bdd08c001c30495034bf703350949fd03b0034938c6028e038c02ba044b3c1309353a030832003526051252a8044fa2012c328202bb01d7091504f101850b440b018901170002768101161b8901032744092e22112f44bd0123ef0161ad01260d2321092ac30331d10253f3018501ed03f302bc01a10190039e020a2fa1039b02d901b001bb0de3
0fd90281028303c7018b011ff9118001cf032f1ca60383010827bb03dd022722aa0381010e27c303cb0231169403672627cb037713022221000d2bbb011f20a203690a1fc503b90281010c21280a2713732017313b28fd0123152a4f1b3120233f770001406f37233c1d0104394b36152d8102030d3f6b0d8f0a9306ae019102ce098406f609489e016bc40ce801d601af05b31ce5085d069501310c29bd04b3010f2ed30141ed0f9705d903b801980283010e27ab04e401122c496e21170b222a018102de04351726180d22271717383e080f403734f101f8041d3a3909381879a0027c38c301dc034d26c5013bf901d901ae07a7111e361c433708285d20081d0966eb01072fed01eb02cf038b010d2e7d25038b017f625663bf01211b542702c304b101c002d1028009e202152c200a003340143e2b202c19204a2b4d21860161164a161127397a532032212a644f351a252f44317001ba02562132200a0839ca013e1b36220a043b501813283a12022d5018192c220a0231f0014a233a2c0e044398012e1340722414411c0a19263e141a25113eec05e601143f280e0f3668201037f807ba020b262c0e032b9c01301544ac025c1643820a8c039501cb02140b9903bd062995018c01c10114e0015854e601450d18c805820cfc05ea011c5db805d801a901bf030d1a9f03ff06b204a80
1ea04ae0a5258b008ee022a13d00262ac0340a4014a1423f40494019a018e01aa03c005f602ec011514ae01c8025c686e22189f0140513cb1070e294c09478301ae01f1098d08810d49e302d1088201153428c8023f112dfb022825c20777de0206d6047ab004a202dc01d0018002f4022607d40188030768df02ee069d018407b7019e0b388a02ce01c601a406c003144eb809d20475d20140b003e2018201518a01ee01a201e101a3013c67880152042812191b30201c151f1e2f7c4a0b604b1b6634304552202e2e0354d403e801f30280054ef803763ede02db042717aa01a3024e13f40196062012a503da0525134d820122142f540ab401b801920848545a0b54de035b5070980586028c02b21d840d60542811f2028a01142b3016132c6e4ce0058c01de01c303b901cc03840ca00294037fa205c305bd04d404d9015f7ecb022b13296dec01b104b203b8018e012d860197022f15193a210f4b25063da114fb08be01b3031f0dcc02d705d4016c96021a9618d20a1e1fa603ce049d03d504be04dd042d9f01a315b30b8f03a50193058703f703170721850111e301ef0892045322aa012782023440240f8401a30238fe0133fd01a2016726b302bc0171aa0380039b02c601a002c1018603e002e503a004b301a101b201b201e610b0098f0153cc02fd04ae03e4019d029e040902
a20abc05a008d508d40134fe0187028102fc01bd012dd802e902cc0134c002cd02c102c002c9013190029b02ff059503f801d903ba02a40113293015ee02c6010b2790028a011728a404c1048405ca02fd04cf02545fcf16850ca707f202e101ff02a201ef0284019801c802c30109343825290f90098d0690018801ef01c803fa08e204686dde02ca029e0cee038e09c50904cb02c10f29ed05d7058f02ab03cf01a3019901ed0135e901da05b2017ee803fa030a10260025ae0104529201ae017c11185f2962421c275e3e1443880376174b2c068803760479bc040c0a049502bb029702054d8f01402d412a2b514e355132d302f70422261823614d9601bf01562b8e012afc020200234a00787af602b8052c0f4c90013d0f32600b292015488601211e2a508c060e960192029203e001d2050ed502119901f304fd02038501fb018c0306b005a2039c011478e8039814fa038406a20587017f9201b3018602e4019f01b2018209ec07a006ec069201d801013874d2015fd101443b3234b001ea0169503b27a402a8035db1017053d201a60224a801712eea01d8043204454b662954de0122270957b2014caf01620742ce02b6058601bc0301a101b4013b117c9b01d4012ed201ea02a00564b8023c156aae01da01e6019a01fc0304b002c9026b7ba50348d3014fd001ca038a0cf901e
106fe0154e801c00663b601ce06f20dc20eea07d901ac02f809d007ab03e502c201f901ec04e003779e01d2019202b30191028c01a5018002e002e2019f018501c1015e4b96011c8a01c6019702cc01203c5b545b574866a301764ad00359a8078e010e34a504365192010317f2044492012b8f0116cd01f001bf019e011553de027b9801591f4c20af018c042503301023b001371a2b4b0b733e394736029c0153010841dd021c32020442410e029c013230157a70de0247705a9801017e605e6cec01a20237fe01b701cc022ff80117b6019201b0031fb206ff04a701e101fc02d701548201f4023f22d4018502281bfe01c6099a01fc0cea021429ac03c0010d1c600800220c1d60061519382f1d0b1225c103dd05b7019901e9051bd10133074d4c1019172643980407f60238f601a001ac02c0031b1e4c7a43751a1b94016c2130342a151e4319ce01a2012e2f8401581d488c018e0117201e234c3c25342834ff019e01c00eac0de60abb0405599705dd0440ef0163f801cb03be01d103a9031f4dd409fb032e2a233380016b50446f7e2b119807c4068a10d10659df01bd036b439d02ca0377a6035e388002298002672c8001272a8102459302cc0260762f64632ab50241db0224354329d501d9033317f701cb02910113153d0f2c631581015beb01a10439ed022aa901465d8a01
2568a001540f786b1416091f563fc801f10205d7014e1343006d8104165f5c731d452623270d1c55c301f101db04599102cc01b90210cd0171c102ef02e201f4029f017217b6018b02bf010129bc013be7022b17239501404f4d9d01cb012391012ca30342890129432c519102fd01003909404b3a390f2bbf05548501361aa402dd0206c301604b68e70127040f6bd303ab01479501363f2914532f49cf01658f019b01a301df04b503b102cb03492f1b73333e1a82012a263b38940146a4018c029c018e01870131111c9a02a8019301170c2b9b014d034959096d5f1577e101006051c401109d015b2daf018d0198013e7109736ef30192019101e2013cfe028101f2021dac0132262030b0018101530f183a48710be80288010328d7028c01c9011a1e22760dbe04a101a402db01661a2f6b528b0132f301464f8e044d684fd0018001706109318d013527280f25450c9502f10612152717a702588b013f718301736a311d0d47411a7b215349082d1128a90304593d555c9101125b2945597bc30217c50163252643ba01582267dd0159a3029d02598f032a5182012d3a7903712823238d010aa70128990174af01c801339402b8014a2512b30189019101083b3b6b9d01233e192111751eb502bf01d9013be3016c8d011471478502b702ae028203b903ea053321b901a802b905fb0
38e02ef02ea01068e03930291038a02d701049b017352593309af01ef01ff035f8101435ba301a10127e901a501dd011d4f416c638e013bc60204c401fb062e47f702bb02ce047d3e3630a60182010dac0159a1012f0b472904113daa10e50357d9036a190353ae0365729004e10290021f7a3200165bee029f02c307d7209604f5019f04bc018d01ad04bb072cbf02e40211b60596042234c801392cd1019d017d047741ed01b4010b2e283e681b6e3ad001e402462e4e273371038b01689f01d50138474f0c598801078e0162360953a40224c201d7012ca301a102870120171bc802980b9307d40127414d0621ed034f061ff1034d061fef03c10105099003430109fe03c90154bd01d50327755e2526d10b630100396402169107397335148b029d04042e3b01f104a706f8038d03910156bb01e701b0029902fa02e003313c4029e0048406c010671767d2010bd501078708a123c7064cfb019a0787032411c903b401531a7d3e457da101156722175a22442da30199010f6d2e8301d3019f021c252122d702ad0181018902a102cf011b6b4e6162af02d905e701c201dd043b009701ba03d103212ffa03a3010c3197023a592f0e7f6d10315dad01203d98011b68fd048402449202fa0189028f0210f703c00214b3053b2bb10106b1019901ad039707a0026fc001a7014387010811
379f01361034ed0aae0348ac01d505b601d7048f125f7f7d4f8a07ab0f84118406081bf00158b80619006e126ff201051478018901cb0820eb12c50624534e298a02a504213bd802f505cc04e50de616f804f516ff040a8301a8178805ea05d306602c10561c9d01d60184011480015e3e5bf2013c8101e40298018b01d002c003be0186011185010ab703b901728d028e03aa013bc40168f701b6014c358201470f50223a8d01be26a8108c0d8b1fef05ab021b180c0c120d82059802ef03a209363c779a0225003ba601515cc507f702a402b9056f91019c018901ad017a514be5038803bf0799038405850c8608b901f3022691059001119101038801e9035a0824d40355e704e60b712de509de01db02c406df01619605b10c580fea01a904f4035f85011a15cb010ece01e502405fcb02bb031a2d3ab9029d014e04c705a902c303f50402526b9501b702021c27af01030c2ab9020b3fa105450a4587040c399c03a1014cc60239cb02e502b70735091343240ff301d302e7018701048901224db60138248801a001bc015026361b1428840261d4028607b4013fa404b40b0d22d8098c048805a5036cf1019f04db01306f8d07dd0271a101da019d01fe02a6028804af05ae01e60139564c57a101e5017ca501448102cc03c7089901d104eb06c5053c45f902b702c305b1047b0ebd0
3e302384f9e0120a6011dbc019101b80160a40127d801b201203bc803de01203faa03e2019601c901af03db0220239f04b703e402bd03cc158011648101f601c001bd04b409ca04b90985017517591c53dc0885122b212a3b1b0f2b36bd02f3010127ab1adf13304f18161b6b6095018c02bd02b6018701178102f001df022b790a7b5538264342a9067e619801cd0180018303dc03b7039e02d2012f5c461e395e410aa7018a025bde0354aa019202c603cd02f7045cd103fc01cf027a503f648603f801c101b202b302c3014770f002ee01619a0159394f1a4c05a40176bb0149173a3a860170381b362e3186010cde03c0021635cc0141a0020e8a01319a01e9011b3112758e01eb03604b2c36320f5c6d4c090dc9014ad5011943391d53bd0195018d0152cf0340515d513a95020387014bcc036d0fc501583d740f788a014e29aa01e7012776a10334071b35ac0289043e20311d404d0855df05cb093933b301255e970266095d6345ed013e65d8016cb00378148701b20208380c1e40095039282c153e36112760c501604162070133ba0177058901327930315401118901aa01b5023d5b20fd05225f564f146fb601049801556d222b797c85044275a2012c0a19f701571779f00189061b151a51dc04d10d8802f7049e01eb0110890168d701e601a90138a701b201e501361fb002
f6029803cd023024bd01e9012a4c3d32242c4b3e232b7b64b501df01f601c50156527983015aab01a003ec031611ad03ff030e4b6c0a0937302993012d25512e5d621da001c901188d01ec02a7012d5d4823249101415f630e02338201351e5b460e112b2453542f8c01322dd701476134e301420f613b28170fc701b6019101194514335e1c513b70a3015e2d628d019a029d014c0f6438c40161820130cc01157061682c32a8013a01de0190018002f502ee0afe0374b902ad05f90159df01a001e101a701d80153c9018504a501024d9a010dc0014a426d74285a41c201d201b5028f039201bf028801a3011ecd0160ad01785de6010b7a8f012289033600330f3407330f0eb30174771b1f26013d110c3dd2018703dc02a906ae09aa0464db0127114faa0151250f268b05bd028701b5018a014f5e624f6ba2019301a602c9033ceb01037d7eb502260a074bca02cf051e89041a21154d4c6f2f0a1e130d39b0012d570527470bd90138b701aa01b502c009f104a00de111ac01b1042e412206611d0c375e144d17e804ed11237fe5015d1b170c31a402eb01663430880129910187014328af01723f3ab201233cb602a4078f02a107fc014b9a0220604adc014f0b711e359004b304f201c903d803e10428f101404b360694016b970158e3011502c5012a7b9c014c304a2157a3014d7
dab037a4fc6013aca032f5e810209b7022c7398039b04e001cf01ec015dd0022b66025c427c1196028901be033d268c02d2010c1a50f301a80605ce05aa090439e90cca010624238a0128fc01dc016378034c76bd011c161d325e202c449301ba0153631e449e0180014092020bb20333048302d803cf013819e4021e0a1ce302b0013bea01ab03260327b403f1017c2b800bc8090f460708532c011c40037f17382d00079f02b6010502d502a00269b001dc01d001768902c5018302dd03078f03f6020912d803a604139007d301285519c901fe0123a101940443023e0c154edb02d201cb03e20301c804f6020e16a9058405e903b0089701002526228e0447be04d4030625cb03ef028c018f012f194bad010161464b620c0f482b05b6024c39150827c80168b101d001b50130c8029a026631417f8e03cf01074d76022ab0039505da02c90108032ad20117b805db0249cd05e4024d9a01d101fa01830110734666e6013d034d0e4c5213343676170d752678aa0385012d713c6e280dd603ed02032999015fb401684c270d3bab016f520e27512c260025705d5e1d17393446193f5011132b1c260a278601511588013e48329d01729301c8027d23774462ac02a301115520508e011b024d224cd80422880129ea014c14640059360bc0052dda01c603b0019c013762d802308004009a
03425e8405ac078201cc046112720475240521d3011d0618508b02361d7f1482016b12198101108401c901220d530556bf034983011825df01b8046718c8010a539c01191375ec045d126c8b01268e011542de0273ed05a3019901d401e1039c012769a1028d05a508cf04c308df0283068101d704d2019d0916e502758d03a701bd029f01b101d303e702d101bd028501df0455df0b68d90750a702b402c904c802e102aa0cf70ab602f501f202b901d205fd09b80189044c970301a303559d049703b10d26df03b501dd04ff01f903d503b5049106ff05bf0489039d01d3035fb101910ceb078f0249f9039104397325f5011c85018e02d5028802a5016a830176870323a904af018703378b036fa50207bd0148f70178cb01c0019d01d0069902ce017ff601eb027edb02ba01d9014a97012cbd013f69a502a301bd037bc10553e101cb01c3049a01ff01ca01c10150b703e403c7069701890340e70235a301a3013f8b02453fd30478e70105af0141b101eb01730095014f9b0126f501d6018f02e501a1058901c30248b70406e307e201930367f702bd01274f048d0134f9022b6b3b2dfb0245570267646d26850723bb0244ed0327a5023ef5017cdd018e0295021793019c0297021b1db00257c801c704d401eb024ecb010685013fa3015e0c6f2bcb01eb01d7014b1f990124f3013
fc502d301671a8f01397322792d89012eb501237180011afe012964432e85010273707d0aab0156970135b10110f102a901d90303c7017b534ecd0105a90151f9012fdf010abb015bd90122ad036f4d36379e012b1e8f05f701551cfd01f2012ba6012d26ef0108d5015fc90314c702f60179e002a904fa01af02079b014091019101ef016de9010dc50141910128bf02a901850303dd0161ad022fe70296044728df0330b702e20177115985016507c9019b019b02261d201c8402dd02840343c203c701563774fb016ecf049a03476241d601c301fe019b036de9011cc9021b8b01618d029401553b9301e7019702cf066bb101fb019502850168f10122ad0143a10126e702cb01c3012c830115cf03af0267e102a3014fa501c301890100b7019001f30138a5016c87024d910230a904be01b702235d208303c802dd031c8d02f101fb0167c502cd01a50130cf018301b5010b890163e1025ffd01b501692a69a001713ad103ef02e102a101e90136c701377918b1011fe9028801e1028701f301168b032bad0155dd02f902c3023477257f618501c101c301bb04bf01a3023fb501fb028101990211ff0383038501b3018b02231871138f01475f1275bf01cb01329702238b01bf01459d0215c102b3019b019501bd0225b903bb036d39a9010f7143bd0383049d0207f10375eb02c901
af02ff017f1383012e3f511f850121c3028d018f01e3139322aa010f1681012bf304c101f50106a7014fe70107c9019101870135b7015971f102ed02cb02006faf01af010dc3029101ed012a9f0243d903f90195038d0155e301f104ad06b101418902e50145155d4ad501387b87015b1f7970950128f30183017b85019f031ea30245890150c901134d3563ab029904d102dd0379bc03a90476bf0701870230af015d8b0201fd019502c90302b90129950173c101f1029303ad019702fb01b1018b01a70404e102f801c90110930161d90276c5031291032c8901193bd70177656507af03bd01890281019d02114b3ccd0157c101b402a10312776dfd03f801ff0272dd03b101a701db010e739301e301189d023130db014fcd027fa302d201c70369e50113b3028d01c1024ecf0135af03830181048f01950339af0261cb014ee904d001970339d7036ebd0253d9019001fd0103b302717be103c3018d0459810162f1023743db03273729209d01a603dd014abb05b501c9013ae1037f8f029301cb013be1019a01af02198b0258c1021f890161e9028b05a9028b03880187020fe7018901b3013ca90112df02388d0249c7029601731ac701a601b10250d7028f01fb018502df01d10128e7017f39bf017717574d4c85011135a103cb01e1029502d701579b04e305c101bb01f705ad03b
903239b02ad015991010e8701628501073fb3018b022b7f67231d9b01890153418f018d026b659d01bb0151b501ad01cf024dc803ad079e019b01be03ef01b803ef032eaf0152830126ef0162a701a0018901541bb401224c44368e010b9e014da801bf02a40216d001e201e202b80204dc0139cc03ef01f801f70184039505ee01a7046c91037085028605d1059701e701e90183018702e90129bb01169501b001f70234d901b201d1011cbb035ebf011acb018601e901b6018104b0012e1e9503ec01b90422cd016051b4024737a30142f903be01cb046f8502d701b30113b102c601b10258df029801d5019e018501f80195031f930360a302b601bd0135a1012eb90163c301eb018b02216b9d01d301cf0191015708a101ab016f1b8702cd02b105bb0397019901b302ef035b8702e301cd0289018701cf01e504ca019501da018102c602b101ee01146297020ec9018001c90329f102f6028f04960143b601ef010e87019403c601d40202880132e0011da6037654c70115db0242fb0335bb01df02e902db0205bd01e501b70144b90104db018801ed0345b90142d9020ccf02b6017f4f950102713f930193028702ab0199014ca7011d930278cb02d5049303bd02c9013faf0433c10254cb0101d501a201ab0132b903c9018f01779f028602f701a2019d01c501bd0106d10147a501
1ccb014f9702fb01a501ff02dd02c7023d6d3e9f0153d70342b5028a028f0692029d04a902b90216e9038502a50210539a01970176bf021661299d03ac03ff01a0029502660e7aa501ce018901d2028601c2036360637c9a01e6017ba6020190023d82022cc20267e0010dda0154be0643aa018b01f0064dc00135b8016b6281018a026d8e013cec0175d4028502440528690fbd013b4f83014745df011eab011d6745415f2b9701480f3e7d52eb022e774f9101ed01c102c9018b011b55ab01e702bf01df010241ea014139fd04fd0106fd0397019701328f02b702e501ad01253d9501bb0131cd0116b902bb018f02a3032d9f029101c70245d10215c901246bc603b3018e0207626970eb01bc03a302c4014788039f05ee0265328f0102b101fa01559402e501ee011b800145d001a302a40101c40273e2028903cc0313c6016d94019102ea01b9019401f501b6029f0136a9016e6b42b7017e01f002e801a6032c92033b5843f601e703221d8202027835d401f10194014f428702f80325b803a101f4012b9e05d702c002ac01ce01b1017a3790020922510735a501b50171e9019c01e9044bfd0108ff019f01e10124950169c701249704f9037fbf01a901a5014fb70138a505c3011b257afb028101f90159457111d501b1012f3121e301b502cd017f9b01156f1a45d402870368d90
1e001d1010ceb026ca101238d025ae70159d501079701e403f90508fd015db302880179047b3e8b018301df019f015973ef013f299b0101c301e101236b9b02c7014303ad019201c301a9010d950181028f018301f70100db014173057d1ebb025ec3022199019301cb01d501eb030d774ac102499d0111b501f101bf03c701e701117940dd010dcf013a9d019d01e301196319a90343850104eb01cf02cd0216518d01a103d1014b2b3f058301a3025b7506d50171a7019701fc01a70248fd018401c5011b693ca5014b2b79ab01810137b101f901bd01550fd3015f9f01830247cf02c101fb02910445c303b50277a7017bfb0112551d85018d01c30126bb022dcd0156a70241533115b301bf016f8d0193023f15ab0132a30263454103d101c301348902495312ab01c2026d4451198b023281026b87027eb9016b95010df301d202910122f90139b30230ab02cf01af01258102647f19af0124b102880112fc02bc018e012a502bd2011ae60161e601fb019c019301b2028b015807e8012f24bd038d015b1c4f5ce3011a8102a201d102a603fd010199029701f10122e701596f2a8502f801c102422ba201df016e8301097d7a9f02a201335a9b02fc01af033151288f02b802970124a101233f64ad017029f401ad0152f5045a83018101c70200717d6113f7039a03c30101fd014a55
0fcd019b01a30124759501c10102c10189019101ec01ab049202e5010da704c7013fbe018f01ec018902be0165a602f703ec01b5010ddf0284054cec01a701ec016d3a311b438f029b01576f50cd013d83011ecd012f8103d8019502b8027b00192811725bac0107aa01810180014ef4013bac01eb028602a7047e9901a602c30180017506b301940295015a8101d801a5023e7f5eeb01698101145d5641aa014d5a8f02840161800161265b8c01b70118216008e00265b2026d5c31be018501820135d802db0188011ee6011960736aeb01347f7c8b023685011d9f0130df036f7d5575d3019d06db02a5011fa30140a5028802d10259ff01a802cf0188018b0130970107d3018601d70210890150e9014f0ccf013fa501d502d5032f09d3016a392d2fd1015b0a870180018f041b9302ca02094a2a4c8d01108d01195b5101b9011f25c9028a02f50113a90164c301044b197dcb01ab023ac301d10133a1015d39a1023cd101ba0132900341be0244960116d2018201e00100e202e601c40206446f9401519c02e901be0159fc0102dc019b021a6742d101b202d301d601117e20702b5ccf01aa01bb01de018104c6015b309b01c8018b039201555d8d01d30247b702c301f9011c538802bd01498b02178903798f018502c3019704c101bd02dd0155bb012bb502b901c1018304cf029b0
13f8f01226945e501fb030a8f063b9903488f020397017ec30224a102b30193032bd10332a101b001cd01980195023ef9017cc9010c4fbb01af0377b501f30373830155e902dd021b3f6ff70402c303373d7d242d291ed305e102af05087966d701519f0363db012085045091011ecf01b701f5022cdf012d3dab013bcf0214f7015883021c27253fff025efb03f8020e7067b80245d8019d0246b5011b33e30297018f03676d1a415c9303880295057875c502e901c701cb01318b0320232206507ec8029502d6011b543082022f34b50433ed02226b607fd001471ce7025d494179df028102097930e503c403d3010eb101179501636fb702a50197014104b701a401712661118b0165b7020489016197012b830138f10117a5021eb9025dcd0136352123cf01d302fd01d102b301a7021765389501217d7e7d20bd010fcf0252c3019801950376a7019202b101ba018f0290018b019001ab01e8011490013724d70203ad06b101890118df038b02eb01aa01970135d90146c30300c701d602ff0166e7010e910264331b1979352d83048101692a8d0196019f012c7d5e9b01830173216577ed021455af02fb01a501ff018b02e701850101b701b302b902ad01810228930351a901d102a301d902638b03689b01d701d10373ad02b70103a1016e6d0a4108a90149b9028a01d701f10181
0147a30307e304e201ad017eed028e02bb01628b02de018d01076d67ab01157360e70274950100c5012561b30257890159f5054b61197969d30576b703c504c701594d87013b15d501a801af01408901c6014b1995016deb01b302027376a9021563533fc1022d4718b5016a8501c401ab018a01850179ed011f4f530da801930109d701b5025da102632be303116b3da301d3017527314b27cb0398014157eb011a6719c701234771223979bb015500f102355b33d90283010b13478c01035e8b029f01d1019301142b1dab018302281d9201762c0d08430dff02ab01d10107c5014d093d4cbb01469501e801a7035aed01cc01e30144db02cd01cf0132890137f7031bf1013bb10305493f03c701ed025f99019f0139c50251a701fd0cff058f023b02432b2d8b012f04e1032963f304b902c507ff05dd01b303778f013f9d011e4fb203ab04a20293068603df024881016239bc01bd03e402ab0268df02aa01af0127850263b70217950324af018e01c901066b3ff7010e87018a0183034bd1011091016a45546d08479a028d019e01810130b7038e0212ac013d8a0215f8019f02306d018502a401e502228502399b039201a101c601c502ec017f4071168f04a5013bbb0102497d27ff02bb02810211673efb017961a90115eb0366471377e90197025b3161508304e701b90257148d0
196013f7a1998015562c3027aa504b002830236b1017dab0263b902bd01960181022b19ab011259603103251b148f012b041d624d3eaf028101db02d101850311c9038b01f30100bf018301a701153155fd01f001df018601ad0490014300e702ed014be701d7013c970155e3012d87019c01b7017197011ad9018c01e70362654a970121b5043ee10149b904064d7ae9011bdf016eaf0670b9023bf3030bef0244d501c5018302a101df018c0181020dcb028f01bd04a0014726498801af09e2028d0e50e70533c512f50529248101a203811da708f901b6042708189403649e017264d616fc098a021fe202ab02a00139c6021d16200521d20439063c0a3d78020a3012333603062c0e2d5e117c1212488d02a0051b1113301e0cad02fc0551ba01612751cc01581e2372bf01ee027918bf07990750d1019901fd0285018701cd1dd30c901dce0cc201f403cd03c00818c001e018e4173201d601da01db04d4083d4b00383a1cf501f004e204a41256a60d649c01f00132c402ca01c304cc0cbd08b619711f6598011410628f015a222dba014982019f013fa0014e0744250f8d01d8023f15c502f00505d404440003289303c80261267196010b84012eb40101b2012d340a7c4c9601da01da01c505a806d70169bd01128d0780037f0ea5109206c705b802172df302a201930384033582
0240b201c00ff01170c00374c0018d03ba018b0100af0c8006e5198411a101cc0157dc024eca02e405c6088002b2028d01aa023113eb01d8034fcc0444a8012e111028cf02aa02154e46b40466e00383028a04f303c7019b015b041f85069902a913e6024eda112fa20a8904c810c302841008ee0932d204a401a208eb0aa60326c80107d0019d014c8301fa01df01f40151ee019d02fe0169d001c3031805b40571b6058301fa0d07f6042cce03408802a801b402ba02d202e4019401a20272860228c60b31fa0468d0015482029c01ca029802f6048e07c801c601d8049602e602e2018404dc01c006bc02f4035ee602769002ac018c01a20164e0010e900109f8082ac604e104b4046ddc01656e794ef50238cf04f4068b01ca0303fe0144c201aa038003a801d60170d804e0012c8c0152880255a202d301c201c7035873c0063f9804bb017c04f004f405cc03ea0370e0033ac80304fe0249b402970294045da20225e60344aa03c801c402e001bc01f8018601b202557eb601c6010ca2025dec02318e03cd01ea01d3027acd0218b503371325bd0422f901a001a7032ed503f20bcc019a04c401c603ba02d002de02e802b2049a059e0e339001d7018c0247e801168801a501de013b8e0200e801269a01b801a20386028203e6028a02960418ea0139421e9c03c102f202840203fc0
1f801e801529e0134de022fea03b4019405565c2690015dc20227ec0669be02a7017a8102120278b90186016dca035af601c6019801a605fa02f00420c8028902b00155b002b102447fae012171a105ab01fb020c617af501098f02b301c70335195726572365fb0153a70301ff054a8705563901cf0262c104fa049d08aa02e101c603ff01b20249c60300940242b205f80276fc012e92044fc803c302da05f3019c051ad0038001ea0292059a069a029e036046be026c8406a1019205d201e0089e03ac02fe0152840206840179da029102ce02a7029201ff0cf40487029401c101f20173a00211980472ec04a601da02d201aa02ea01c401ba029e01f2039401e40858c00303620b0f9b018e02191aae01d00d55ea0558aa04b601b401e601d803ce0b8602e8048a02e60316d20121f801f3019c02a3018802c504384f4ecb03aa01bd04da038103e0038302a40313860164fe029001de011c6a86016aba01860296018c0196028e01c801bc01fe02a001920537b801535653ce02850484017b9a079504e802bd02e805ed01ac04b803c80594064c86019a01e00709e0062ad6045cd0028201ee019201c601be018601ba03ac019c0220aa024dd202b301ba06f904a80467ce08399e011cc005de04b203b604c6019603e201391599032a51d001af01fe0177ee01f00c10ae05bc01ba07
ba02a6072ee80114ac0324be01301c28a00206a004500a1ce6018e023c0b880632880729a80724e60545c00618e00a0fa81129d0070cea0975aa13209408018e023fb2030e8e03a904a80781016e6db80141800761a20235d602fd01b80431ba019401e4012caa01114c79740bce01f402ee0199029403c1013a1888017d440a2eab018c0161228f0435f301b201359001e70292018701a401f30174c702228103ee02870260af010cfd0557c5029a048b058a02a101b401a7025918671d5740db010ab301478101d50197010a7f57ab0225733721bf022a619a01bb028402087035788904b401e301870143370555930159b30103b1028101f50108b701437f18cb01253b7da5010f5f7d3deb01189501e5022b1f2326638b02a30255df01ff03529f0160b501152d5f1dfb018702f101cf01119f014b8f0319c301c301a901575b77b1018a016dce01f101146dde015338590fe702eb038501b3023331ad02c501f90143c701eb01f9026b9703c1037bfb01e903a503ed02db019501008b01587f9301f101a701a901f302b7014d3b698801870461eb0112cb042733ad014593020fbf0564ff0161910183017933d1010cab0144fd0121df0161a702f101d101db01558f019103b301eb01f70242950106cf014fad01a70293023c5d8402a901076d4d178d01d301b501ed030587017fed0
17f6585026f3491028a01db021a93024eaf022d47c7019101930111db01b301a5023ff90130c9011dd502c10183018901ed0281016320e301d2019b02108d0274c9043a6d8001b501765bf401c101b201810114b5019d01cf016bd9018102f7023f758f0115bd01569901970191024541b1026f3141670f056e67a601d70190019503920421c60134b2040da201c203f401729e019e012c6682028c028c03065e74b601a601469601da01748802623445c801662ac0012738120426d9028801b702264b60f902b801bf02a4024922a101118703fa012f4e1a8002d704c6018901da019f01980132ca028b017c6f8e025b4abb013a1bd001372c9903338101800163b202205ad201fc010668394ca3014c0d8802ab028802532279b501a50127f70103e104a9018303069d013eab02dc037720e7047d512ddb019502a303c501c3020f8302d101292429ca0118ba0287014e6f940133aa02a102c202c704cc027d840245116da20191012c5fe60104ee01bb02f6023f1d35bd02c901e7014719d50308a90154af019e0181016bad0107b102639701083165b9012059636316ad01da0181011a312d2def016739db01a401b90190036950478a01e701a80105c8018901d8025950f901284d360478294aff01ae02258e01a101860171b002910164ad01ac02890175b30125bb0112775a970116
970188015121659f01950117f30108bd028a01ad01031aa002679c0112a802d101c2020cc40161a8016742e704ac01f301fc01ff03e202ad01a801d7016c717c89022e8d03be01778401e101ac03df01465d509d0600ab0235c50183014b042da4025d601eb40143d201675ad501147fbc01e70118cf014c8302078f01688901207d785337c3018b02b50145bb01a70191010b311071ca013d28ad053ac3027cf301ce019101cc03bd0156a101a601ab01409b02b40435c001bd0150e9030b4b70cd017ad301be02b7027abb019401ff02e2039105900375141b382c9201d101d002db01d2018303d601d303216f3b89012a9b01767d5bd5024bef01bb01bb010acb01c101d7010763311b43ab0398016377dd02d501a105a501dd01ef0195019302d3017395029d03ab0193017db7019503378b0145b30266bd012fdf019401c901bc025792028502fc01e7010c635c611081048b01eb010b93014547124b800136c4011f90011a3c5b586f9802575ad10164e101138b01287fb801bb029301d7021caf05c103651785029201e7013e9302d601f502a50187068e015be601f1017251603d14fd0139d50388026514e1030135388b011de10266d3032eed01218d015079dd018503bb016d5e83024897029001a301b3013aa701339301fc01c1028501df01af04d201e101a9035d65b90114a
d0121ed0174470f8b01513d89019503bd0131f90116db0135a501609d033123af0246a301411f351cfd033d7ffb05a903e50353b10209d90160810106e902cb012716117071b801634ab50300b90133fb0178c70303db03a8029b0378636a276e09900134c8016d9c02af0228473adf0184039902cc01b901d8015b1ac10161ef01ce02a50108a7014ba90138bd0113810272e701099d01a801970133c70207379b02538b01bd03e102c50251fd024c759501218b01cb01df026955bd01435fcd016351c102ba02ad03ec01cb0107d90394028301ea01b7024cdb018c02af042fdf017ca107990189038e018f0237c1019d01a301129b02278b03548b011bf5048e01c30276b5029e03d7011e870165c701f5027d29930130eb012f53990217cd026599032151f501e701b303f501e9032fa1048f0191014bf90222b7028701b702068103e201850201614cff01777f0fb30156656fdb01186957a10373773445d4016307bb017ad5013695024183018901d70121b902cc01c30138f5018202b3015aa101d2017b4cfb0383019d04a102c3013e6b5bb30275af0105531a9b019c01b102268f0159e702fb02870128a50153c901034b176b89014d38459c013f18ed02df01b7012fc90114a5028701a701870195011bb1039401f303d402fb02c80104b01288260005040003060704050c113d
91011e230f3e4482011f0804929201a0401a170b1c0d03041a171c43860149a1018e0104a2018d010a0703040504060a070e132b065e55461185017604b740c4740201091a08170507181d501a28231b285b0104d8709532bb059701bc059a010001010594f501ae753c1b5c3a5d3d3920010400003b18030a4021018301b302c242b0047b641c611fd0018f0136a501ea01e70190013d8801a1010599014295028d018d0500595a01550b20af0152d901b4019302fc05e30650ad01ee01bb023f4d16f50235fb029601b90356494f1a217314212b09115950ad026065796d3c079f02147769c501f3025ab7019d01692ca1013555224d2f503856299c011d0a1165230c265e53052b1114311530230f18371b388102870166a3028e0272df02a30148bb014566756519850280014d30302549a701665d17076b09564928712d1889013372b70121a1019b011730f301348f0187013f0c1a57450e3543448301a501588f012a531d85015cb1011f294f8501a8015fe6019101406bbe025b78098e02454423ae016b488f011e4b5256c8022bc0034d8c0283012c7c384cbe01ac04c604c001a406ba01c8020450394e76fe010f90025f98012ba80257a8010dd0015fac0122641da0013684013182012e80011f8e0232a2032254a403ea03c202a4010104fa65d621180b13150322010400000
502060000010104fccc09a40f360d0d1b272a010400000100020000000123c3e308b01cb001597c75d602a703180c0f159202eb02a005ad0d1085011b71bb01f102ad01dd01d30fed07ef01f20395028701e401f903d703ce07dd15cd0a276a5f35d902ba05d904a502001fcf04ea09088c028a01d401980c9406e409c0067b5d58df01b403de0189019e02ce0cbc08fe043492041101b401a3d301ca1d023912240a2330062b35162db0014968a10140269e011d463fda0135092b2c41be010c14251d25280e1927142770531c4326060b31503f0a599801c30172c5057487013003248902a602ab03d6016994029504860197033abb046e9f019401793c5f15392a012bb50206ef02c802c903a0016d9c02cb039a01279d011ed501c0029502270d518801cb03ca013c50428e01258b0120a301870114eb01a601f9010a4121457f34d5010157a301ab018b01ae019a016cca01694c1721d9023c05289d010b2d9903f1024f150f3a4b3d48d101b701a601bf0180021805623f5c465b0a7f6419eb030de501ae01694b8d048601a1025787019201571ccb016f8f01088f016c9f03086f322b321b9601291414263b3c43a8024d6a8301484f1f3d6c9101763d0735434f0c278c01224e15728d0186012e4a37d4026d6ae70183018303840486019d01980176232e3a30e501ac025d475a50
9701c601738f012a8f01150b355e0c5e50622f3a14582712321a28ee014db80243626f362e9c0342c20139e201123e4358af02445d409301840153a20154ca01ae01ce01076e3608aa01c001e002fa0366d602079401358201329e0103d801d60171b20320800134fc011bf4028c013c5a1f38289001a001498601062c1e0f52460d284b2a2878022e620158db7aba0a5a53a80201a4027be20112425bb402579601752c160247e202bd036891021a9d022b5b36c3010b8301352f176d584163a704b201e70125c301bd015f1ca70127a001d702af0163615c6c9e04940220b8015f8201870147182da10153286f77ea01c501650fbd012202066719000d5a00575f0002a001cb01010d8d01008e01c901081967d201cf011919dd03c4030f7c2430a702ce01ab01a802310a1c20558001e7025835b6019d01ac0145c801a101743b480a2c352213341a4e235e470e24201b2e281c5364204a179c013c1a36e8015866e4013a5a7eb20209083c9201063250243f0104d2da0a8c4f00009c02509b024f0152cbf008d6484039820102a8038f01a8021eae05fd019202a50190011d880795056aa9018a01db03465ba401394e768e012bdc013a5277673b2a81018f019901a5021459218504ea03f7011aa70143b30103d905d40195015bd701228f02b401371f0c296b331a391f3ed9019d019
101db018e015f78b801c6029001c90161f502b10408291f54166a567295015e7dd5011b75420b0d3d2e3f5a3d5e165b333c8f02402a5757058d01360dc1011d693499021275688901ce028302f6019701ca014d8a0317800316dc018a01bc01012c3604507e169401237e9002e6020472b201d4016e07422e321b0104ce9801d82340103d11010201046d326e3115055738010400000000000000000104e8d607dc280a0607070102010500000f099304a2033e00e60397030104af38ce4725132b09521e01040000e0017a73516b27010bca64911b7ac5050ea502f30fdd027f12830de04cec10ee028002cd0221b9079405f91e9205931c0104c760a41e010303030608010400009e09820fd508a50e475b0104dd01e90115152d17442e01040000d801e201799f015d410104abee069c18399302369002040401048ace05985a0a0ab2025ebb026701aa028d9406982d741d9e01183cb6014e623ccb013e139e02091cb4011e102807368b016a799c01489c018501301c1a605ad5011b51561b267780011556f50160141a5f19a1012b001d7435304d2d2147b40183020d4d3d1b55263b211323302d153151169101751e1b006b7d50c9013d758f02af014771cb0191016911830142b1014c4d422a1233292d4a35a701733710dd0291028002e401bf01ca0102367328e901d901a001cd
0159508702d502b7015255990129b701b401df0165ef01b201c9010b23d4029301f501d104be018c04b90280019901ff020d7d0384019201b003a301c601b301062b2d74af018d01b2012a2e671b4645390e4337e601ad02271d8f02d002db018f0376453850221d2d4b623b263a2e25253f82020d471325d3030ed403ab011297015c3dbb010fc601b101648f01ab0131033019307b3dbd017b283dd1019a01314f870290053c6c705b7fff054141850208ff0123cf0120a301b301a50125dd02419b01679d01e701b9016103cf0178ff011523452b031b62970178bb0250a5038802890112e901558b011a9502e002d50166a901880181012e570de5018e01b10266e9023f4f5833002b7e715a7519cf014e0158a8012c18321982018501900176b001116eeb0396018f015851313338074a4a2b28261b647d4e2994017460d801093a2c2c7c45c601960101468201298801778801810118c7016d4550483628234a16242e5ae0021ebe0282028a0150600a820177c601ff015e8902c001367a644ee001061f26145ab7013c2d132b42a00186018401654010146659569001343e5e17687746184a7813d801d501fc012fe001b20102387017860254303f400f1b242010403f4a164e700b783724146a361c64066059b60140302311296e198403588a0271c002cf019e021e0b3a3e34606
172c3011f252a1ff8058f02c8020bf601669e01b60136a6011de201376459455f1a096434341f5e7ea601800148273408403c10322fb601a401148201441a267f2e03920164720d403334c301782f0125ba015a183e292a0a3858627e0f84016942083a42210a13721a4a46158a01ad017c4f01a9018e56d5024e350d695c13760c30582e08022e301b022c3c2dfe012a9002a701129901522d123064266a2b204e200e082b3c363a4b441a18c501220148764409158d01726519752271e40191021e142931506f351f4a025b433289024807331b2c3f0289018e01af01d8026dba01f101ac02af04e0018d014c3a404140039002f3010c7fb802c10484039908bd019001cd028803fd02a60187029f0129a3012a3303673b273d301cde016b3565262f7f23103692017154113b45245381012902034d2404789501840261a40171f5048c02e901381146810160770e3a4a1da8013b4a053e282c69a8017b6c7b09fb02bb015b2c2404375a64121698012dc401597405cc012442476a3c3e053a4b38340c2916183631463680011db0023226a70131762e73b601633a8301291d4124038c01a702290255b401e3017532dd0349aa034396015d3054281d1624012c7c472a1a142b4ecf01940124101b5c3e90011b54e10164262acf01a0014b980139220c3625022a105d8201fd0108c10150
003047421a5276092c220938d6014213741822b2010f15644e04174e46362916380b0139b4ac04f049c201c703fe03dc01f803a109980c9c05112c5826142bc403c401002c9a02780e1f341634325d15a60148112c75310920c00988040e1d7b35142986013a5d3d0c178c03ac0198169d16e8098604a521930e1c43b50fcd06cb01e70252be01ad069004273de306b604ed03ff05e20df70876d40171d70170537931a1018102b1010e8905fc079f0ada06e732aa053d34be065d0cb80bd50b0901de0be2260c802eda13b91e9d0d367d0104ce62ff49480f05034114010500004f123f1b402250170104d4ca01df9e01350be1021798032401040000d60134712b6307'::bytea),
-----------------------------------------------------------------------
Summary of changes:
LICENSE.TXT | 7 +-
NEWS | 1 +
deps/wagyu/README.md | 1 +
.../mapbox/geometry/wagyu/active_bound_list.hpp | 8 +-
.../include/mapbox/geometry/wagyu/almost_equal.hpp | 277 +++++++++++++++++++++
.../include/mapbox/geometry/wagyu/interrupt.hpp | 2 +-
.../mapbox/geometry/wagyu/process_horizontal.hpp | 8 +-
.../include/mapbox/geometry/wagyu/ring_util.hpp | 28 ++-
deps/wagyu/include/mapbox/geometry/wagyu/util.hpp | 17 +-
deps/wagyu/include/mapbox/geometry/wagyu/wagyu.hpp | 4 +-
regress/core/mvt.sql | 2 +-
11 files changed, 324 insertions(+), 31 deletions(-)
create mode 100644 deps/wagyu/include/mapbox/geometry/wagyu/almost_equal.hpp
hooks/post-receive
--
PostGIS
More information about the postgis-tickets
mailing list