From 511d9ccd2a1af56de81e8fa0b6d93bf3813c05d2 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Wed, 30 Jun 2021 11:52:12 +0200 Subject: [PATCH 01/49] Adding a basic framework to build RegTAP constraints, and the first Author and Freetext constraints --- pyvo/registry/datasearch.py | 132 +++++++++++++++++++++++++ pyvo/registry/tests/test_datasearch.py | 81 +++++++++++++++ pyvo/registry/tests/test_regtap.py | 2 +- 3 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 pyvo/registry/datasearch.py create mode 100644 pyvo/registry/tests/test_datasearch.py diff --git a/pyvo/registry/datasearch.py b/pyvo/registry/datasearch.py new file mode 100644 index 000000000..a31fb8e9e --- /dev/null +++ b/pyvo/registry/datasearch.py @@ -0,0 +1,132 @@ +# Licensed under a 3-clause BSD style license - see LICENSE.rst +""" +data discovery searches in the VO registry. + +Searches are built using constraints, which should generally derive +from Constraint; see its docstring for how to write your own constraints. +""" + +import datetime + +import numpy + +from ..dal import tap + + +def make_sql_literal(value): + """returns the python value as a SQL-embeddable literal. + + This is not suitable as a device to ward against SQL injections; + in what we produce, callers could produce arbitrary SQL anyway. + The point of this function is to minimize surprises when building + constraints. + """ + if isinstance(value, str): + return "'{}'".format(value.replace("'", "''")) + + elif isinstance(value, bytes): + return "'{}'".format(value.decode("ascii").replace("'", "''")) + + elif isinstance(value, int): + return "{:d}".format(value) + + elif isinstance(value, (float, numpy.floating)): + return repr(value) + + elif isinstance(value, datetime.datetime): + return "'{}'".format(value.isoformat()) + + else: + raise ValueError("Cannot format {} as a SQL literal" + .format(repr(value))) + + +class Constraint: + """an abstract base class for data discovery contraints. + + These, essentially, are configurable RegTAP query fragments, + consisting of a where clause, parameters for filling that, + and possibly additional tables. + + Users construct concrete constraints with whatever they would like + to constrain things with. + + To implement a new constraint, set ``_condition`` to a string with + {}-type replacement fields (assume all parameters are strings), and define + ``fillers`` to be a dictionary with values for the _condition template. + Don't worry about SQL-serialising the values, Constraint takes care of that. + + If your constraints need extra tables, give them in a list + in _extra_tables. + """ + _extra_tables = [] + _condition = None + _fillers = None + + def get_search_condition(self): + if self._condition is None: + raise NotImplementedError("{} is an abstract Constraint" + .format(self.__class__.__name__)) + + return self._condition.format(**self._get_sql_literals()) + + def _get_sql_literals(self): + return {k: make_sql_literal(v) for k, v in self._fillers.items()} + + +class Freetext(Constraint): + """plain text to match against title, description, and person names. + + Note that in contrast to regsearch, this will not do a pattern + search in subjects. + + You can pass in phrases (i.e., multiple words separated by space), + but behaviour can then change quite significantly between different + registries. + """ + def __init__(self, word:str): + self._condition = ("1=ivo_hasword(res_description, {word})" + " OR 1=ivo_hasword(res_title, {word})" + " OR 1=ivo_hasword(role_name, {word})") + self._fillers = {"word": word} + + +class Author(Constraint): + """constrain by a pattern for the creator (“author”) of a resource. + + Note that regrettably there are no guarantees as to how authors + are written in the VO. This means that you will generally have + to write things like ``%Hubble%`` (% being “zero or more characters” + in SQL) here. + + The match is case-sensitive. + """ + def __init__(self, name:str): + self._condition = "role_name LIKE {auth} AND base_role='creator'" + self._fillers = {"auth": name} + + +def _build_regtap_query(constraints): + """returns a RegTAP query ready for submission from a list of + Constraint instances. + """ + serialized = [] + for constraint in constraints: + serialized.append("("+constraint.get_search_condition()+")") + + fragments = ["SELECT ivoid, res_title, res_description", + "FROM rr.resource", + "NATURAL JOIN rr.capabilities", + "WHERE", + "\n AND ".join(serialized)] + + return "\n".join(fragments) + + +def datasearch(*constraints:Constraint): + """... + + Pass in one or more constraints; a resource matches when it matches + all of them. + """ + tap_query = _build_regtap_query(constraints) diff --git a/pyvo/registry/tests/test_datasearch.py b/pyvo/registry/tests/test_datasearch.py new file mode 100644 index 000000000..fae728314 --- /dev/null +++ b/pyvo/registry/tests/test_datasearch.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python +# Licensed under a 3-clause BSD style license - see LICENSE.rst +""" +Tests for pyvo.registry.datasearch +""" + +import datetime + +import numpy +import pytest + +from pyvo.registry import datasearch + + +class TestAbstractConstraint: + def test_no_search_condition(self): + with pytest.raises(NotImplementedError): + datasearch.Constraint().get_search_condition() + + + +class TestSQLLiterals: + @pytest.fixture(scope="class", autouse=True) + def literals(self): + class _WithFillers(datasearch.Constraint): + _fillers = { + "aString": "some harmless stuff", + "nastyString": "that's not nasty", + "bytes": b"keep this ascii for now", + "anInt": 210, + "aFloat": 5e7, + "numpyStuff": numpy.float96(23.7), + "timestamp": datetime.datetime(2021, 6, 30, 9, 1),} + + return _WithFillers()._get_sql_literals() + + + def test_strings(self, literals): + assert literals["aString"] == "'some harmless stuff'" + assert literals["nastyString"] == "'that''s not nasty'" + + def test_bytes(self, literals): + assert literals["bytes"] == "'keep this ascii for now'" + + def test_int(self, literals): + assert literals["anInt"] == "210" + + def test_float(self, literals): + assert literals["aFloat"] == "50000000.0" + + def test_numpy(self, literals): + assert literals["numpyStuff"][:14] == "23.69999999999" + + def test_timestamp(self, literals): + assert literals["timestamp"] == "'2021-06-30T09:01:00'" + + def test_odd_type_rejected(self): + with pytest.raises(ValueError) as excinfo: + datasearch.make_sql_literal({}) + assert str(excinfo.value) == "Cannot format {} as a SQL literal" + + +class TestFreetextConstraint: + def test_basic(self): + assert (datasearch.Freetext("star").get_search_condition() + == "1=ivo_hasword(res_description, 'star')" + " OR 1=ivo_hasword(res_title, 'star')" + " OR 1=ivo_hasword(role_name, 'star')") + + def test_interesting_literal(self): + assert (datasearch.Freetext("α Cen's planets").get_search_condition() + == "1=ivo_hasword(res_description, 'α Cen''s planets')" + " OR 1=ivo_hasword(res_title, 'α Cen''s planets')" + " OR 1=ivo_hasword(role_name, 'α Cen''s planets')") + + +class TestAuthorConstraint: + def test_basic(self): + assert (datasearch.Author("%Hubble%").get_search_condition() + == "role_name LIKE '%Hubble%' AND base_role='creator'") + diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index cfc631327..7c2ce6b80 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ -Tests for pyvo.dal.query +Tests for pyvo.registry.regtap """ from functools import partial from urllib.parse import parse_qsl From 8077a3afa73a438f3439db8d0e3c88866b7b9d6c Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Fri, 2 Jul 2021 12:03:51 +0200 Subject: [PATCH 02/49] Adding support for legacy keywords arguments in datasearch. --- pyvo/registry/datasearch.py | 39 ++++++++++++++++++++-- pyvo/registry/tests/test_datasearch.py | 45 +++++++++++++++++++++++++- 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/pyvo/registry/datasearch.py b/pyvo/registry/datasearch.py index a31fb8e9e..8239dfc67 100644 --- a/pyvo/registry/datasearch.py +++ b/pyvo/registry/datasearch.py @@ -58,10 +58,15 @@ class Constraint: If your constraints need extra tables, give them in a list in _extra_tables. + + For the legacy x_search with keywords, define a _keyword + attribute containing the name of the parameter that should + generate such a constraint. """ _extra_tables = [] _condition = None _fillers = None + _keyword = None def get_search_condition(self): if self._condition is None: @@ -84,6 +89,8 @@ class Freetext(Constraint): but behaviour can then change quite significantly between different registries. """ + _keyword = "keywords" + def __init__(self, word:str): self._condition = ("1=ivo_hasword(res_description, {word})" " OR 1=ivo_hasword(res_title, {word})" @@ -101,15 +108,24 @@ class Author(Constraint): The match is case-sensitive. """ + _keyword = "author" + def __init__(self, name:str): self._condition = "role_name LIKE {auth} AND base_role='creator'" self._fillers = {"auth": name} -def _build_regtap_query(constraints): +def _build_regtap_query(constraints, keywords): """returns a RegTAP query ready for submission from a list of Constraint instances. """ + for keyword, value in keywords.items(): + if keyword not in _KEYWORD_TO_CONSTRAINT: + raise TypeError(f"{keyword} is not a valid registry" + " constraint keyword. Use one of {}.".format( + ", ".join(_KEYWORD_TO_CONSTRAINT))) + constraints.append(_KEYWORD_TO_CONSTRAINT[keyword](value)) + serialized = [] for constraint in constraints: serialized.append("("+constraint.get_search_condition()+")") @@ -123,10 +139,27 @@ def _build_regtap_query(constraints): return "\n".join(fragments) -def datasearch(*constraints:Constraint): +def datasearch(*constraints:Constraint, **kwargs): """... Pass in one or more constraints; a resource matches when it matches all of them. """ - tap_query = _build_regtap_query(constraints) + tap_query = _build_regtap_query(list(constraints), keywords) + + +def _make_constraint_map(): + """returns a map of _keyword to constraint classes. + + This is used in module initialisation. + """ + keyword_to_constraint = {} + for att_name, obj in globals().items(): + if (isinstance(obj, type) + and issubclass(obj, Constraint) + and obj._keyword): + keyword_to_constraint[obj._keyword] = obj + return keyword_to_constraint + + +_KEYWORD_TO_CONSTRAINT = _make_constraint_map() diff --git a/pyvo/registry/tests/test_datasearch.py b/pyvo/registry/tests/test_datasearch.py index fae728314..be9987ef9 100644 --- a/pyvo/registry/tests/test_datasearch.py +++ b/pyvo/registry/tests/test_datasearch.py @@ -18,7 +18,6 @@ def test_no_search_condition(self): datasearch.Constraint().get_search_condition() - class TestSQLLiterals: @pytest.fixture(scope="class", autouse=True) def literals(self): @@ -79,3 +78,47 @@ def test_basic(self): assert (datasearch.Author("%Hubble%").get_search_condition() == "role_name LIKE '%Hubble%' AND base_role='creator'") + +class TestQueryBuilding: + @staticmethod + def where_clause_for(*args, **kwargs): + return datasearch._build_regtap_query(list(args), kwargs + ).split("\nWHERE\n", 1)[1] + + def test_from_constraints(self): + assert self.where_clause_for( + datasearch.Freetext("star galaxy"), + datasearch.Author("%Hubble%") + ) == ("(1=ivo_hasword(res_description, 'star galaxy')" + " OR 1=ivo_hasword(res_title, 'star galaxy')" + " OR 1=ivo_hasword(role_name, 'star galaxy'))" + "\n AND (role_name LIKE '%Hubble%' AND base_role='creator')") + + def test_from_keywords(self): + assert self.where_clause_for( + keywords="star galaxy", + author="%Hubble%" + ) == ("(1=ivo_hasword(res_description, 'star galaxy')" + " OR 1=ivo_hasword(res_title, 'star galaxy')" + " OR 1=ivo_hasword(role_name, 'star galaxy'))" + "\n AND (role_name LIKE '%Hubble%' AND base_role='creator')") + + def test_mixed(self): + assert self.where_clause_for( + datasearch.Freetext("star galaxy"), + author="%Hubble%" + ) == ("(1=ivo_hasword(res_description, 'star galaxy')" + " OR 1=ivo_hasword(res_title, 'star galaxy')" + " OR 1=ivo_hasword(role_name, 'star galaxy'))" + "\n AND (role_name LIKE '%Hubble%' AND base_role='creator')") + + def test_bad_keyword(self): + with pytest.raises(TypeError) as excinfo: + datasearch._build_regtap_query((), {"foo": "bar"}) + # the following assertion will fail when new constraints are + # defined (or old ones vanish). I'd say that's a convenient + # way to track changes; so, let's update the assertion as we + # go. + assert str(excinfo.value) == ("foo is not a valid registry" + " constraint keyword. Use one of " + "keywords, author.") From e095876607f716878d48c1889b064a28c2eeea41 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Fri, 2 Jul 2021 12:46:09 +0200 Subject: [PATCH 03/49] Column selection and grouping for datasearch. This introduces expected_columns in existing regtap.RegistryResource, which I now intend to re-use (and evolve) for the data discovery, too. It will now declare what columns are required from the queries itself (where I suspect we'll have to be a bit niftier if we want more advanced categories of data we get in the initial discovery query). --- pyvo/registry/datasearch.py | 28 ++++++++++++++-- pyvo/registry/regtap.py | 36 +++++++++++++++++++- pyvo/registry/tests/test_datasearch.py | 46 ++++++++++++++++++++++++-- 3 files changed, 104 insertions(+), 6 deletions(-) diff --git a/pyvo/registry/datasearch.py b/pyvo/registry/datasearch.py index 8239dfc67..a9bce0b19 100644 --- a/pyvo/registry/datasearch.py +++ b/pyvo/registry/datasearch.py @@ -11,6 +11,7 @@ import numpy from ..dal import tap +from .import regtap def make_sql_literal(value): @@ -130,11 +131,25 @@ def _build_regtap_query(constraints, keywords): for constraint in constraints: serialized.append("("+constraint.get_search_condition()+")") - fragments = ["SELECT ivoid, res_title, res_description", + # see comment in regtap.RegistryResource for the following + # oddity + select_clause, plain_columns = [], [] + for col_desc in regtap.RegistryResource.expected_columns: + if isinstance(col_desc, str): + select_clause.append(col_desc) + plain_columns.append(col_desc) + else: + select_clause.append("{} AS {}".format(*col_desc)) + + fragments = ["SELECT", + ", ".join(select_clause), "FROM rr.resource", "NATURAL JOIN rr.capabilities", + "NATURAL JOIN rr.interfaces", "WHERE", - "\n AND ".join(serialized)] + "\n AND ".join(serialized), + "GROUP BY", + ", ".join(plain_columns)] return "\n".join(fragments) @@ -145,7 +160,14 @@ def datasearch(*constraints:Constraint, **kwargs): Pass in one or more constraints; a resource matches when it matches all of them. """ - tap_query = _build_regtap_query(list(constraints), keywords) + regtap_query = _build_regtap_query(list(constraints), keywords) + service = tap.TAPService(regtap.REGISTRY_BASEURL) + query = regtap.RegistryQuery( + service.baseurl, + regtap_query, + maxrec=service.hardlimit) + + return query.execute() def _make_constraint_map(): diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 695234757..018823864 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -24,6 +24,15 @@ REGISTRY_BASEURL = os.environ.get("IVOA_REGISTRY") or "http://dc.g-vo.org/tap" + +# ADQL only has string_agg, where we need string arrays. We fake arrays +# by joining elements with a token separator that we think shouldn't +# turn up in the things joined. Of course, people could create +# resources that break us; let's assume there's nothing be gained +# from that ever. +TOKEN_SEP = ":::py VO sep:::" + + _service_type_map = { "image": "sia", "spectrum": "ssa", @@ -208,6 +217,31 @@ class RegistryResource(dalq.Record): _service = None + # the following attribute is used by datasearch._build_regtap_query + # to figure build the select clause; it is maintained here + # because this class knows what it expects to get. + # + # Each item is either a plain string for a column name, or + # a 2-tuple for an as clause; all plain strings are used + # used in the group by, and so it is assumed they are + # 1:1 to ivoid. + expected_columns = [ + "ivoid", + "res_type", + "short_name", + "title", + "content_level", + "res_description", + "reference_url", + "creator_seq", + "content_type", + "source_format", + "region_of_regard", + "waveband", + (f"ivo_string_agg(access_url, '{TOKEN_SEP}')", "access_urls"), + (f"ivo_string_agg(standard_id, '{TOKEN_SEP}')", "standard_ids"),] + + @property def ivoid(self): """ @@ -430,7 +464,7 @@ def describe(self, verbose=False, width=78, file=None): def ivoid2service(ivoid, servicetype=None): - """Retern service(s) for a given IVOID. + """Return service(s) for a given IVOID. The servicetype option specifies the kind of service requested (conesearch, sia, ssa, slap, or tap). By default, if none is diff --git a/pyvo/registry/tests/test_datasearch.py b/pyvo/registry/tests/test_datasearch.py index be9987ef9..83e7363a7 100644 --- a/pyvo/registry/tests/test_datasearch.py +++ b/pyvo/registry/tests/test_datasearch.py @@ -79,11 +79,11 @@ def test_basic(self): == "role_name LIKE '%Hubble%' AND base_role='creator'") -class TestQueryBuilding: +class TestWhereClauseBuilding: @staticmethod def where_clause_for(*args, **kwargs): return datasearch._build_regtap_query(list(args), kwargs - ).split("\nWHERE\n", 1)[1] + ).split("\nWHERE\n", 1)[1].split("\nGROUP BY\n")[0] def test_from_constraints(self): assert self.where_clause_for( @@ -122,3 +122,45 @@ def test_bad_keyword(self): assert str(excinfo.value) == ("foo is not a valid registry" " constraint keyword. Use one of " "keywords, author.") + + +class TestSelectClause: + def test_expected_columns(self): + # This will break as regtap.RegistryResource.expected_columns + # is changed. Just update the assertion then. + assert datasearch._build_regtap_query([], {"author": "%Hubble%"} + ).split("\nFROM rr.resource\n")[0] == ( + "SELECT\n" + "ivoid, " + "res_type, " + "short_name, " + "title, " + "content_level, " + "res_description, " + "reference_url, " + "creator_seq, " + "content_type, " + "source_format, " + "region_of_regard, " + "waveband, " + "ivo_string_agg(access_url, ':::py VO sep:::') AS access_urls, " + "ivo_string_agg(standard_id, ':::py VO sep:::') AS standard_ids") + + def test_group_by_columns(self): + # Again, this will break as regtap.RegistryResource.expected_columns + # is changed. Just update the assertion then. + assert datasearch._build_regtap_query([], {"author": "%Hubble%"} + ).split("\nGROUP BY\n")[-1] == ( + "ivoid, " + "res_type, " + "short_name, " + "title, " + "content_level, " + "res_description, " + "reference_url, " + "creator_seq, " + "content_type, " + "source_format, " + "region_of_regard, " + "waveband") + From c95758bac5ed901b2d707c682dacab2bd554565e Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Fri, 2 Jul 2021 13:03:46 +0200 Subject: [PATCH 04/49] Now caching the RegTAP service object. --- pyvo/registry/datasearch.py | 6 +++--- pyvo/registry/regtap.py | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/pyvo/registry/datasearch.py b/pyvo/registry/datasearch.py index a9bce0b19..71369c641 100644 --- a/pyvo/registry/datasearch.py +++ b/pyvo/registry/datasearch.py @@ -144,8 +144,8 @@ def _build_regtap_query(constraints, keywords): fragments = ["SELECT", ", ".join(select_clause), "FROM rr.resource", - "NATURAL JOIN rr.capabilities", - "NATURAL JOIN rr.interfaces", + "LEFT OUTER NATURAL JOIN rr.capabilities", + "LEFT OUTER NATURAL JOIN rr.interfaces", "WHERE", "\n AND ".join(serialized), "GROUP BY", @@ -161,7 +161,7 @@ def datasearch(*constraints:Constraint, **kwargs): all of them. """ regtap_query = _build_regtap_query(list(constraints), keywords) - service = tap.TAPService(regtap.REGISTRY_BASEURL) + service = regtap.get_RegTAP_service() query = regtap.RegistryQuery( service.baseurl, regtap_query, diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 018823864..58659ad29 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -15,6 +15,7 @@ This module provides basic, low-level access to the RegTAP Registries using standardized TAP-based services. """ +import functools import os from ..dal import scs, sia, ssa, sla, tap, query as dalq from ..utils.formatting import para_format_desc @@ -43,6 +44,17 @@ } +@functools.lru_cache(1) +def get_RegTAP_service(): + """a lazily created TAP service offering the RegTAP services. + + This uses regtap.REGISTRY_BASEURL. Always get the TAP service + there using this function to avoid re-creating the server + and profit from caching of capabilties, tables, etc. + """ + return tap.TAPService(REGISTRY_BASEURL) + + def search(keywords=None, servicetype=None, waveband=None, datamodel=None, includeaux=False): """ execute a simple query to the RegTAP registry. @@ -163,7 +175,7 @@ def _unions(): ("WHERE " if wheres else "") + " AND ".join(wheres) ) - service = tap.TAPService(REGISTRY_BASEURL) + service = get_RegTAP_service() query = RegistryQuery(service.baseurl, query, maxrec=service.hardlimit) return query.execute() @@ -471,7 +483,7 @@ def ivoid2service(ivoid, servicetype=None): given, a list of all matching services is returned. """ - service = tap.TAPService(REGISTRY_BASEURL) + service = get_RegTAP_service() results = service.run_sync(""" SELECT DISTINCT access_url, standard_id FROM rr.capability NATURAL JOIN rr.interface From 5cdfef03ef2f8e815729af8c44fcd676115b03a8 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Mon, 19 Jul 2021 16:11:14 +0200 Subject: [PATCH 05/49] Adding a Servicetype constraint. Also, I've found that we can keep the existing registry.search interface (and adding another interface isn't worth the extra effort). Hence, I've renamed the previous datasearch to rtcons ("RegTAP constraints"). This breaks regtap.search, though, because I'm already preparing the move to using rtcons in there (maintaining includeaux). --- pyvo/registry/regtap.py | 17 ++--- pyvo/registry/{datasearch.py => rtcons.py} | 69 +++++++++++++++++-- .../{test_datasearch.py => test_rtcons.py} | 62 +++++++++++++---- 3 files changed, 118 insertions(+), 30 deletions(-) rename pyvo/registry/{datasearch.py => rtcons.py} (67%) rename pyvo/registry/tests/{test_datasearch.py => test_rtcons.py} (69%) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 58659ad29..e73355175 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -17,6 +17,7 @@ """ import functools import os +from . import rtcons from ..dal import scs, sia, ssa, sla, tap, query as dalq from ..utils.formatting import para_format_desc @@ -34,16 +35,6 @@ TOKEN_SEP = ":::py VO sep:::" -_service_type_map = { - "image": "sia", - "spectrum": "ssa", - "scs": "conesearch", - "line": "slap", - "sla": "slap", - "table": "tap" -} - - @functools.lru_cache(1) def get_RegTAP_service(): """a lazily created TAP service offering the RegTAP services. @@ -144,8 +135,12 @@ def _unions(): else: raise dalq.DALQueryError("Invalid servicetype parameter passed to registry search") + # maintain legacy includeaux by locating any Servicetype constraints + # and replacing them with ones that includes auxiliaries. if includeaux: - match_caps |= {s+"#aux" for s in match_caps} + for index, constraint in enumerate(constraints): + if isinstance(constraint, rtcons.Servicetype): + constraints[index] = constraint.include_auxiliary_services() wheres.append('standard_id IN ({})'.format( ",".join( diff --git a/pyvo/registry/datasearch.py b/pyvo/registry/rtcons.py similarity index 67% rename from pyvo/registry/datasearch.py rename to pyvo/registry/rtcons.py index 71369c641..436477763 100644 --- a/pyvo/registry/datasearch.py +++ b/pyvo/registry/rtcons.py @@ -1,9 +1,13 @@ # Licensed under a 3-clause BSD style license - see LICENSE.rst """ -data discovery searches in the VO registry. - -Searches are built using constraints, which should generally derive -from Constraint; see its docstring for how to write your own constraints. +Constraints for doing registry searches. + +The Constraint class encapsulates a query fragment in a RegTAP query: A +keyword, a sky location, an author name, a class of services. They are used +either directly as arguments to registry.search, or by passing keyword +arguments into registry.search. The mapping from keyword arguments to +constraint classes happens through the _keyword attribute in Constraint-derived +classes. """ import datetime @@ -116,6 +120,63 @@ def __init__(self, name:str): self._fillers = {"auth": name} +class Servicetype(Constraint): + """constrain by the type of service. + + The constraint is either a bespoke keyword (of which there are at least + image, spectrum, scs, line, and table; the fullist is in this class' + _service_type_map) or the standards' ivoid (which generally looks like + ``ivo://ivoa.net/std/`` and have to be URIs with + a scheme part in any case). + + Multiple service types can be passed in; a match in that case + is for records having any of the service types passed in. + + The match is literal (i.e., no patterns are allowed); this means + that you will not receive records that only have auxiliary + services, which is what you want when enumerating all services + of a certain type in the VO. In data discovery (where, however, + you generally should not have Servicetype constraints), you + can use ``Servicetype(...).include_auxiliary_services()`` or + use registry.search's ``includeaux`` parameter. + """ + _service_type_map = { + "image": "sia", + "spectrum": "ssa", + "scs": "conesearch", + "line": "slap", + "table": "tap" + } + def __init__(self, *stds): + self.stdids = set() + + for std in stds: + if std in self._service_type_map: + self.stdids.add('ivo://ivoa.net/std/'+ + self._service_type_map[std]) + elif "://" in std: + self.stdids.add(std) + else: + raise ValueError("Service type {} is neither a full" + " standard URI nor one of the bespoke identifiers" + " {}".format(std, ", ".join(self._service_type_map))) + + def get_search_condition(self): + # we sort the stdids to make it easy for tests (and it's + # virtually free for the small sets we have here). + return "standard_id IN ({})".format( + ", ".join(make_sql_literal(s) for s in sorted(self.stdids))) + + def include_auxiliary_services(self): + """returns a Servicetype constraint that has self's + service types but includes the associated auxiliary services. + + This is a convenience to maintain registry.search's signature. + """ + return Servicetype(*(self.stdids | set( + std+'#aux' for std in self.stdids))) + + def _build_regtap_query(constraints, keywords): """returns a RegTAP query ready for submission from a list of Constraint instances. diff --git a/pyvo/registry/tests/test_datasearch.py b/pyvo/registry/tests/test_rtcons.py similarity index 69% rename from pyvo/registry/tests/test_datasearch.py rename to pyvo/registry/tests/test_rtcons.py index 83e7363a7..8ef6ce027 100644 --- a/pyvo/registry/tests/test_datasearch.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ -Tests for pyvo.registry.datasearch +Tests for pyvo.registry.rtcons, i.e. RegTAP constraints and query building. """ import datetime @@ -9,19 +9,19 @@ import numpy import pytest -from pyvo.registry import datasearch +from pyvo.registry import rtcons class TestAbstractConstraint: def test_no_search_condition(self): with pytest.raises(NotImplementedError): - datasearch.Constraint().get_search_condition() + rtcons.Constraint().get_search_condition() class TestSQLLiterals: @pytest.fixture(scope="class", autouse=True) def literals(self): - class _WithFillers(datasearch.Constraint): + class _WithFillers(rtcons.Constraint): _fillers = { "aString": "some harmless stuff", "nastyString": "that's not nasty", @@ -55,19 +55,19 @@ def test_timestamp(self, literals): def test_odd_type_rejected(self): with pytest.raises(ValueError) as excinfo: - datasearch.make_sql_literal({}) + rtcons.make_sql_literal({}) assert str(excinfo.value) == "Cannot format {} as a SQL literal" class TestFreetextConstraint: def test_basic(self): - assert (datasearch.Freetext("star").get_search_condition() + assert (rtcons.Freetext("star").get_search_condition() == "1=ivo_hasword(res_description, 'star')" " OR 1=ivo_hasword(res_title, 'star')" " OR 1=ivo_hasword(role_name, 'star')") def test_interesting_literal(self): - assert (datasearch.Freetext("α Cen's planets").get_search_condition() + assert (rtcons.Freetext("α Cen's planets").get_search_condition() == "1=ivo_hasword(res_description, 'α Cen''s planets')" " OR 1=ivo_hasword(res_title, 'α Cen''s planets')" " OR 1=ivo_hasword(role_name, 'α Cen''s planets')") @@ -75,20 +75,52 @@ def test_interesting_literal(self): class TestAuthorConstraint: def test_basic(self): - assert (datasearch.Author("%Hubble%").get_search_condition() + assert (rtcons.Author("%Hubble%").get_search_condition() == "role_name LIKE '%Hubble%' AND base_role='creator'") +class TestServicetypeConstraint: + def test_standardmap(self): + assert (rtcons.Servicetype("scs").get_search_condition() + == "standard_id IN ('ivo://ivoa.net/std/conesearch')") + + def test_fulluri(self): + assert (rtcons.Servicetype("http://extstandards/invention" + ).get_search_condition() + == "standard_id IN ('http://extstandards/invention')") + + def test_multi(self): + assert (rtcons.Servicetype("http://extstandards/invention", "image" + ).get_search_condition() + == "standard_id IN ('http://extstandards/invention'," + " 'ivo://ivoa.net/std/sia')") + + def test_includeaux(self): + assert (rtcons.Servicetype("http://extstandards/invention", "image" + ).include_auxiliary_services().get_search_condition() + == "standard_id IN ('http://extstandards/invention'," + " 'http://extstandards/invention#aux'," + " 'ivo://ivoa.net/std/sia'," + " 'ivo://ivoa.net/std/sia#aux')") + + def test_junk_rejected(self): + with pytest.raises(ValueError) as excinfo: + rtcons.Servicetype("junk") + assert str(excinfo.value) == ("Service type junk is neither" + " a full standard URI nor one of the bespoke identifiers" + " image, spectrum, scs, line, table") + + class TestWhereClauseBuilding: @staticmethod def where_clause_for(*args, **kwargs): - return datasearch._build_regtap_query(list(args), kwargs + return rtcons._build_regtap_query(list(args), kwargs ).split("\nWHERE\n", 1)[1].split("\nGROUP BY\n")[0] def test_from_constraints(self): assert self.where_clause_for( - datasearch.Freetext("star galaxy"), - datasearch.Author("%Hubble%") + rtcons.Freetext("star galaxy"), + rtcons.Author("%Hubble%") ) == ("(1=ivo_hasword(res_description, 'star galaxy')" " OR 1=ivo_hasword(res_title, 'star galaxy')" " OR 1=ivo_hasword(role_name, 'star galaxy'))" @@ -105,7 +137,7 @@ def test_from_keywords(self): def test_mixed(self): assert self.where_clause_for( - datasearch.Freetext("star galaxy"), + rtcons.Freetext("star galaxy"), author="%Hubble%" ) == ("(1=ivo_hasword(res_description, 'star galaxy')" " OR 1=ivo_hasword(res_title, 'star galaxy')" @@ -114,7 +146,7 @@ def test_mixed(self): def test_bad_keyword(self): with pytest.raises(TypeError) as excinfo: - datasearch._build_regtap_query((), {"foo": "bar"}) + rtcons._build_regtap_query((), {"foo": "bar"}) # the following assertion will fail when new constraints are # defined (or old ones vanish). I'd say that's a convenient # way to track changes; so, let's update the assertion as we @@ -128,7 +160,7 @@ class TestSelectClause: def test_expected_columns(self): # This will break as regtap.RegistryResource.expected_columns # is changed. Just update the assertion then. - assert datasearch._build_regtap_query([], {"author": "%Hubble%"} + assert rtcons._build_regtap_query([], {"author": "%Hubble%"} ).split("\nFROM rr.resource\n")[0] == ( "SELECT\n" "ivoid, " @@ -149,7 +181,7 @@ def test_expected_columns(self): def test_group_by_columns(self): # Again, this will break as regtap.RegistryResource.expected_columns # is changed. Just update the assertion then. - assert datasearch._build_regtap_query([], {"author": "%Hubble%"} + assert rtcons._build_regtap_query([], {"author": "%Hubble%"} ).split("\nGROUP BY\n")[-1] == ( "ivoid, " "res_type, " From f47dde257f203ec348d9460b93ff54c3666e0591 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Mon, 19 Jul 2021 16:25:22 +0200 Subject: [PATCH 06/49] Adding a waveband constraint --- pyvo/registry/rtcons.py | 24 ++++++++++++++++++++++++ pyvo/registry/tests/test_rtcons.py | 8 ++++++++ 2 files changed, 32 insertions(+) diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 436477763..f3052d13a 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -177,6 +177,30 @@ def include_auxiliary_services(self): std+'#aux' for std in self.stdids))) +class Waveband(Constraint): + """A constraint on messenger particles. + + This builds a constraint against rr.resource.waveband, i.e., + a verbal indication of the messenger particle, coming + from the IVOA vocabulary http://www.ivoa.net/messenger. + + The Spectral constraint enables selections by particle energy, + but few resources actually give the necessary metadata (in 2021). + + Multiple wavebands can be given (and are effectively combined with OR). + + TODO: validate inputs against the vocabulary. + """ + def __init__(self, *bands): + self.bands = list(bands) + + def get_search_condition(self): + return " OR ".join( + "1 = ivo_hashlist_has(rr.resource.waveband, {})".format( + make_sql_literal(band)) + for band in self.bands) + + def _build_regtap_query(constraints, keywords): """returns a RegTAP query ready for submission from a list of Constraint instances. diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index 8ef6ce027..5169fe907 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -111,6 +111,14 @@ def test_junk_rejected(self): " image, spectrum, scs, line, table") +# TODO: add a vocabulary check and mark this as requiring networking +class TestWavebandConstraint: + def test_basic(self): + assert (rtcons.Waveband("Infrared", "EUV").get_search_condition() + == "1 = ivo_hashlist_has(rr.resource.waveband, 'Infrared')" + " OR 1 = ivo_hashlist_has(rr.resource.waveband, 'EUV')") + + class TestWhereClauseBuilding: @staticmethod def where_clause_for(*args, **kwargs): From 4622f68b91e1336b7cff9b516330addb36331120 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Mon, 19 Jul 2021 17:02:52 +0200 Subject: [PATCH 07/49] Adding a datamodel keyword. Also, adding the forgotten _keyword attributes for Waveband and Servicetype so they'll later be found when moving regtap.search. --- pyvo/registry/regtap.py | 4 +-- pyvo/registry/rtcons.py | 58 +++++++++++++++++++++++++++++- pyvo/registry/tests/test_rtcons.py | 37 +++++++++++++++++-- 3 files changed, 94 insertions(+), 5 deletions(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index e73355175..64d28b998 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -77,11 +77,11 @@ def search(keywords=None, servicetype=None, waveband=None, datamodel=None, inclu 'x-ray' 'gamma-ray' datamodel : str - the name of the datamodel to search for; makes only sence in + the name of the datamodel to search for; makes only sense in conjunction with servicetype tap (or no servicetype). See http://wiki.ivoa.net/twiki/bin/view/IVOA/IvoaDataModel for more - informations about data models. + information about data models. includeaux : boolean Flag for whether to include auxiliary capabilities in results. This may result in duplicate capabilities being returned, diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index f3052d13a..2a237dac4 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -140,6 +140,7 @@ class Servicetype(Constraint): can use ``Servicetype(...).include_auxiliary_services()`` or use registry.search's ``includeaux`` parameter. """ + _keyword = "servicetype" _service_type_map = { "image": "sia", "spectrum": "ssa", @@ -191,6 +192,8 @@ class Waveband(Constraint): TODO: validate inputs against the vocabulary. """ + _keyword = "waveband" + def __init__(self, *bands): self.bands = list(bands) @@ -201,6 +204,59 @@ def get_search_condition(self): for band in self.bands) +class Datamodel(Constraint): + """A constraint on the adherence to a data model. + + This constraint only lets resources pass that declare support for + one of several well-known data models; the SQL produced depends + on the data model identifier. + + Known data models at this point include: + + * obscore -- generic observational data + * epntap -- solar system data + * regtap -- the VO registry. + + DM names are matched case-insensitively here mainly for + historical reasons. + """ + _keyword = "datamodel" + + # if you add to this list, you have to define a method + # _make__constraint. + _known_dms = {"obscore", "epntap", "regtap"} + + def __init__(self, dmname): + dmname = dmname.lower() + if dmname not in self._known_dms: + raise ValueError("Unknown data model id {}. Known are: {}." + .format(dmname, ", ".join(sorted(self._known_dms)))) + self.get_search_condition = getattr(self, f"_make_{dmname}_constraint") + + def _make_obscore_constraint(self): + # There was a bit of chaos with the DM ids for Obscore. + # Be lenient here + self._extra_tables = ["rr.res_detail"] + obscore_pat = 'ivo://ivoa.net/std/obscore%' + return ("detail_xpath = '/capability/dataModel/@ivo-id'" + f" AND 1 = ivo_nocasematch(detail_value, '{obscore_pat}')") + + def _make_epntap_constraint(self): + self._extra_tables = ["rr.res_table"] + # we include legacy, pre-IVOA utypes for matches; lowercase + # any new identifiers (utypes case-fold). + return " OR ".join( + f"table_utype LIKE {pat}'" for pat in + ['ivo://vopdc.obspm/std/epncore#schema-2.%', + 'ivo://ivoa.net/std/epntap#table-2.%']) + + def _make_regtap_constraint(self): + self._extra_tables = ["rr.res_detail"] + regtap_pat = 'ivo://ivoa.net/std/RegTAP#1.%' + return ("detail_xpath = '/capability/dataModel/@ivo-id'" + f" AND 1 = ivo_nocasematch(detail_value, '{regtap_pat}')") + + def _build_regtap_query(constraints, keywords): """returns a RegTAP query ready for submission from a list of Constraint instances. @@ -209,7 +265,7 @@ def _build_regtap_query(constraints, keywords): if keyword not in _KEYWORD_TO_CONSTRAINT: raise TypeError(f"{keyword} is not a valid registry" " constraint keyword. Use one of {}.".format( - ", ".join(_KEYWORD_TO_CONSTRAINT))) + ", ".join(sorted(_KEYWORD_TO_CONSTRAINT)))) constraints.append(_KEYWORD_TO_CONSTRAINT[keyword](value)) serialized = [] diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index 5169fe907..66274e452 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -119,6 +119,39 @@ def test_basic(self): " OR 1 = ivo_hashlist_has(rr.resource.waveband, 'EUV')") +class TestDatamodelConstraint: + def test_junk_rejected(self): + with pytest.raises(ValueError) as excinfo: + rtcons.Datamodel("junk") + assert str(excinfo.value) == ( + "Unknown data model id junk. Known are: epntap, obscore, regtap.") + + def test_obscore(self): + cons = rtcons.Datamodel("ObsCore") + assert (cons.get_search_condition() + == "detail_xpath = '/capability/dataModel/@ivo-id'" + " AND 1 = ivo_nocasematch(detail_value," + " 'ivo://ivoa.net/std/obscore%')") + assert(cons._extra_tables==["rr.res_detail"]) + + def test_epntap(self): + cons = rtcons.Datamodel("epntap") + assert (cons.get_search_condition() + == "table_utype LIKE ivo://vopdc.obspm/std/epncore#schema-2.%'" + " OR table_utype LIKE ivo://ivoa.net/std/epntap#table-2.%'") + assert(cons._extra_tables==["rr.res_table"]) + + def test_regtap(self): + cons = rtcons.Datamodel("regtap") + assert (cons.get_search_condition() + == "detail_xpath = '/capability/dataModel/@ivo-id'" + " AND 1 = ivo_nocasematch(detail_value," + " 'ivo://ivoa.net/std/RegTAP#1.%')") + assert(cons._extra_tables==["rr.res_detail"]) + + + + class TestWhereClauseBuilding: @staticmethod def where_clause_for(*args, **kwargs): @@ -160,8 +193,8 @@ def test_bad_keyword(self): # way to track changes; so, let's update the assertion as we # go. assert str(excinfo.value) == ("foo is not a valid registry" - " constraint keyword. Use one of " - "keywords, author.") + " constraint keyword. Use one of" + " author, datamodel, keywords, servicetype, waveband.") class TestSelectClause: From 65121040d6ac7208cc0347f912b67710de00f812 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Tue, 20 Jul 2021 12:44:35 +0200 Subject: [PATCH 08/49] Reworking regtap.query to work with our new constraints. This required changing some of the constraints in order to keep the existing call patterns stable. --- pyvo/registry/regtap.py | 117 +++++------------------------ pyvo/registry/rtcons.py | 85 +++++++++++++++------ pyvo/registry/tests/test_regtap.py | 47 ++++-------- pyvo/registry/tests/test_rtcons.py | 53 ++++++------- 4 files changed, 122 insertions(+), 180 deletions(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 64d28b998..570af14f2 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -46,42 +46,22 @@ def get_RegTAP_service(): return tap.TAPService(REGISTRY_BASEURL) -def search(keywords=None, servicetype=None, waveband=None, datamodel=None, includeaux=False): +def search(*constraints:rtcons.Constraint, includeaux=False, **kwargs): """ execute a simple query to the RegTAP registry. Parameters ---------- - keywords : str or list of str - keyword terms to match to registry records. - Use this parameter to find resources related to a - particular topic. - servicetype : str - the service type to restrict results to. - Allowed values include - 'conesearch', - 'sia' , - 'ssa', - 'slap', - 'tap' - waveband : str - the name of a desired waveband; resources returned - will be restricted to those that indicate as having - data in that waveband. Allowed values include - 'radio', - 'millimeter', - 'infrared', - 'optical', - 'uv', - 'euv', - 'x-ray' - 'gamma-ray' - datamodel : str - the name of the datamodel to search for; makes only sense in - conjunction with servicetype tap (or no servicetype). - - See http://wiki.ivoa.net/twiki/bin/view/IVOA/IvoaDataModel for more - information about data models. + The function accepts query constraint either as Constraint objects + passed in as positional arguments or as their associated keywords. + For what constraints are available, see TODO. + + The values of keyword arguments may be tuples or lists when the associated + Constraint objects take multiple arguments. + + All constraints, whether passed in directly or via keywords, are + evaluated as a conjunction (i.e., in an AND clause). + includeaux : boolean Flag for whether to include auxiliary capabilities in results. This may result in duplicate capabilities being returned, @@ -96,44 +76,7 @@ def search(keywords=None, servicetype=None, waveband=None, datamodel=None, inclu -------- RegistryResults """ - if not any((keywords, servicetype, waveband, datamodel)): - raise dalq.DALQueryError( - "No search parameters passed to registry search") - - wheres = list() - wheres.append("intf_role = 'std'") - - if isinstance(keywords, str): - keywords = [keywords] - - if keywords: - def _unions(): - for i, keyword in enumerate(keywords): - yield """ - SELECT isub{i}.ivoid FROM rr.res_subject AS isub{i} - WHERE isub{i}.res_subject ILIKE '%{keyword}%' - """.format(i=i, keyword=tap.escape(keyword)) - - yield """ - SELECT ires{i}.ivoid FROM rr.resource AS ires{i} - WHERE 1=ivo_hasword(ires{i}.res_description, '{keyword}') - OR 1=ivo_hasword(ires{i}.res_title, '{keyword}') - """.format(i=i, keyword=tap.escape(keyword)) - - unions = ' UNION '.join(_unions()) - wheres.append('rr.interface.ivoid IN ({})'.format(unions)) - - # capabilities as specified by servicetype and includeaux: - # default to all known service types - # limit to one servicetype if specified by known key or value - match_caps = set(_service_type_map.values()) - if servicetype: - if servicetype in _service_type_map.values(): - match_caps = set([servicetype]) - elif _service_type_map.get(servicetype) is not None: - match_caps= set([_service_type_map.get(servicetype)]) - else: - raise dalq.DALQueryError("Invalid servicetype parameter passed to registry search") + constraints = list(constraints)+rtcons.keywords_to_constraints(kwargs) # maintain legacy includeaux by locating any Servicetype constraints # and replacing them with ones that includes auxiliaries. @@ -142,36 +85,13 @@ def _unions(): if isinstance(constraint, rtcons.Servicetype): constraints[index] = constraint.include_auxiliary_services() - wheres.append('standard_id IN ({})'.format( - ",".join( - "'ivo://ivoa.net/std/"+s+"'" - for s in match_caps))) - - if waveband: - wheres.append("1 = ivo_hashlist_has(rr.resource.waveband, '{}')".format( - tap.escape(waveband))) - - if datamodel: - wheres.append(""" - rr.interface.ivoid IN ( - SELECT idet.ivoid FROM rr.res_detail as idet - WHERE idet.detail_xpath = '/capability/dataModel/@ivo-id' - AND 1 = ivo_nocasematch( - idet.detail_value, 'ivo://ivoa.net/std/{}%') - ) - """.format(tap.escape(datamodel))) - - query = """SELECT DISTINCT rr.interface.*, rr.capability.*, rr.resource.* - FROM rr.capability - NATURAL JOIN rr.interface - NATURAL JOIN rr.resource - {} - """.format( - ("WHERE " if wheres else "") + " AND ".join(wheres) - ) + query_sql = rtcons.build_regtap_query(constraints) service = get_RegTAP_service() - query = RegistryQuery(service.baseurl, query, maxrec=service.hardlimit) + query = RegistryQuery( + service.baseurl, + query_sql, + maxrec=service.hardlimit) return query.execute() @@ -246,7 +166,8 @@ class RegistryResource(dalq.Record): "region_of_regard", "waveband", (f"ivo_string_agg(access_url, '{TOKEN_SEP}')", "access_urls"), - (f"ivo_string_agg(standard_id, '{TOKEN_SEP}')", "standard_ids"),] + (f"ivo_string_agg(standard_id, '{TOKEN_SEP}')", "standard_ids"), + (f"ivo_string_agg(intf_role, '{TOKEN_SEP}')", "intf_roles"),] @property diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 2a237dac4..84ca059fb 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -15,6 +15,7 @@ import numpy from ..dal import tap +from ..dal import query as dalq from .import regtap @@ -56,10 +57,13 @@ class Constraint: Users construct concrete constraints with whatever they would like to constrain things with. - To implement a new constraint, set ``_condition`` to a string with - {}-type replacement fields (assume all parameters are strings), and define - ``fillers`` to be a dictionary with values for the _condition template. - Don't worry about SQL-serialising the values, Constraint takes care of that. + To implement a new constraint, in the constructor set ``_condition`` to a + string with {}-type replacement fields (assume all parameters are strings), + and define ``fillers`` to be a dictionary with values for the _condition + template. Don't worry about SQL-serialising the values, Constraint takes + care of that. If you need your Constraint to be "lazy" + (cf. Servicetype), it's ok to overrride get_search_condition without + an upcall to Constraint. If your constraints need extra tables, give them in a list in _extra_tables. @@ -81,7 +85,9 @@ def get_search_condition(self): return self._condition.format(**self._get_sql_literals()) def _get_sql_literals(self): - return {k: make_sql_literal(v) for k, v in self._fillers.items()} + if self._fillers: + return {k: make_sql_literal(v) for k, v in self._fillers.items()} + return {} class Freetext(Constraint): @@ -96,11 +102,31 @@ class Freetext(Constraint): """ _keyword = "keywords" - def __init__(self, word:str): - self._condition = ("1=ivo_hasword(res_description, {word})" - " OR 1=ivo_hasword(res_title, {word})" - " OR 1=ivo_hasword(role_name, {word})") - self._fillers = {"word": word} + def __init__(self, *words:str): + # cross-table ORs kill the query planner. We therefore + # write the constraint as an IN condition on a UNION + # of subqueries; it may look as if this has to be + # really slow, but in fact it's almost always a lot + # faster than direct ORs. + base_queries = [ + "SELECT ivoid FROM rr.resource WHERE" + " 1=ivo_hasword(res_description, {{{parname}}})", + "SELECT ivoid FROM rr.resource WHERE" + " 1=ivo_hasword(res_title, {{{parname}}})", + "SELECT ivoid FROM rr.res_subject WHERE" + " res_subject ILIKE {{{parpatname}}}"] + self._fillers, subqueries = {}, [] + + for index, word in enumerate(words): + parname = "fulltext{}".format(index) + parpatname = "fulltextpar{}".format(index) + self._fillers[parname] = word + self._fillers[parpatname] = '%'+word+'%' + for q in base_queries: + subqueries.append(q.format(**locals())) + + self._condition = "ivoid IN ({})".format( + " UNION ".join(subqueries)) class Author(Constraint): @@ -158,7 +184,7 @@ def __init__(self, *stds): elif "://" in std: self.stdids.add(std) else: - raise ValueError("Service type {} is neither a full" + raise dalq.DALQueryError("Service type {} is neither a full" " standard URI nor one of the bespoke identifiers" " {}".format(std, ", ".join(self._service_type_map))) @@ -196,9 +222,7 @@ class Waveband(Constraint): def __init__(self, *bands): self.bands = list(bands) - - def get_search_condition(self): - return " OR ".join( + self._condition = " OR ".join( "1 = ivo_hashlist_has(rr.resource.waveband, {})".format( make_sql_literal(band)) for band in self.bands) @@ -229,9 +253,9 @@ class Datamodel(Constraint): def __init__(self, dmname): dmname = dmname.lower() if dmname not in self._known_dms: - raise ValueError("Unknown data model id {}. Known are: {}." + raise dalq.DALQueryError("Unknown data model id {}. Known are: {}." .format(dmname, ", ".join(sorted(self._known_dms)))) - self.get_search_condition = getattr(self, f"_make_{dmname}_constraint") + self._condition = getattr(self, f"_make_{dmname}_constraint")() def _make_obscore_constraint(self): # There was a bit of chaos with the DM ids for Obscore. @@ -257,16 +281,13 @@ def _make_regtap_constraint(self): f" AND 1 = ivo_nocasematch(detail_value, '{regtap_pat}')") -def _build_regtap_query(constraints, keywords): +def build_regtap_query(constraints): """returns a RegTAP query ready for submission from a list of Constraint instances. """ - for keyword, value in keywords.items(): - if keyword not in _KEYWORD_TO_CONSTRAINT: - raise TypeError(f"{keyword} is not a valid registry" - " constraint keyword. Use one of {}.".format( - ", ".join(sorted(_KEYWORD_TO_CONSTRAINT)))) - constraints.append(_KEYWORD_TO_CONSTRAINT[keyword](value)) + if not constraints: + raise dalq.DALQueryError( + "No search parameters passed to registry search") serialized = [] for constraint in constraints: @@ -295,6 +316,24 @@ def _build_regtap_query(constraints, keywords): return "\n".join(fragments) +def keywords_to_constraints(keywords): + """returns constraints expressed as keywords as Constraint instances. + + This will raise a DALQueryError for unknown keywords. + """ + constraints = [] + for keyword, value in keywords.items(): + if keyword not in _KEYWORD_TO_CONSTRAINT: + raise TypeError(f"{keyword} is not a valid registry" + " constraint keyword. Use one of {}.".format( + ", ".join(sorted(_KEYWORD_TO_CONSTRAINT)))) + if isinstance(value, (tuple, list)): + constraints.append(_KEYWORD_TO_CONSTRAINT[keyword](*value)) + else: + constraints.append(_KEYWORD_TO_CONSTRAINT[keyword](value)) + return constraints + + def datasearch(*constraints:Constraint, **kwargs): """... diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index 7c2ce6b80..ab49fd844 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -34,19 +34,13 @@ def keywordstest_callback(request, context): data = dict(parse_qsl(request.body)) query = data['QUERY'] - assert "WHERE isub0.res_subject ILIKE '%vizier%'" in query - assert "WHERE 1=ivo_hasword(ires0.res_description, 'vizier')" in query - assert "OR 1=ivo_hasword(ires0.res_title, 'vizier')" in query - - assert "WHERE isub1.res_subject ILIKE '%pulsar%'" in query - assert "WHERE 1=ivo_hasword(ires1.res_description, 'pulsar')" in query - assert "OR 1=ivo_hasword(ires1.res_title, 'pulsar')" in query - - assert "'ivo://ivoa.net/std/conesearch'" in query - assert "'ivo://ivoa.net/std/sia'" in query - assert "'ivo://ivoa.net/std/ssa'" in query - assert "'ivo://ivoa.net/std/slap'" in query - assert "'ivo://ivoa.net/std/tap'" in query + assert "res_subject ILIKE '%vizier%'" in query + assert "ivo_hasword(res_description, 'vizier')" in query + assert "1=ivo_hasword(res_title, 'vizier')" in query + + assert " res_subject ILIKE '%pulsar%'" in query + assert "1=ivo_hasword(res_description, 'pulsar')" in query + assert "1=ivo_hasword(res_title, 'pulsar')" in query return get_pkg_data_contents('data/regtap.xml') @@ -63,15 +57,9 @@ def keywordstest_callback(request, context): data = dict(parse_qsl(request.body)) query = data['QUERY'] - assert "WHERE isub0.res_subject ILIKE '%single%'" in query - assert "WHERE 1=ivo_hasword(ires0.res_description, 'single')" in query - assert "OR 1=ivo_hasword(ires0.res_title, 'single')" in query - - assert "'ivo://ivoa.net/std/conesearch'" in query - assert "'ivo://ivoa.net/std/sia'" in query - assert "'ivo://ivoa.net/std/ssa'" in query - assert "'ivo://ivoa.net/std/slap'" in query - assert "'ivo://ivoa.net/std/tap'" in query + assert "WHERE res_subject ILIKE '%single%'" in query + assert "WHERE 1=ivo_hasword(res_description, 'single') UNION" in query + assert "1=ivo_hasword(res_title, 'single')" in query return get_pkg_data_contents('data/regtap.xml') @@ -127,9 +115,11 @@ def datamodeltest_callback(request, content): query = data['QUERY'] assert ( - "WHERE idet.detail_xpath = '/capability/dataModel/@ivo-id" in query - ) - assert "idet.detail_value, 'ivo://ivoa.net/std/tap%')" in query + "(detail_xpath = '/capability/dataModel/@ivo-id'" in query) + + assert ( + "ivo_nocasematch(detail_value, 'ivo://ivoa.net/std/obscore%'))" + in query) return get_pkg_data_contents('data/regtap.xml') @@ -180,7 +170,7 @@ def test_waveband(): @pytest.mark.usefixtures('datamodel_fixture', 'capabilities') def test_datamodel(): - regsearch(datamodel='tap') + regsearch(datamodel='ObsCore') @pytest.mark.usefixtures('aux_fixture', 'capabilities') @@ -188,11 +178,6 @@ def test_servicetype_aux(): regsearch(servicetype='table', includeaux=True) -@pytest.mark.usefixtures('aux_fixture', 'capabilities') -def test_keyword_aux(): - regsearch(keywords=['pulsar'], includeaux=True) - - @pytest.mark.usefixtures('aux_fixture', 'capabilities') def test_bad_servicetype_aux(): with pytest.raises(dalq.DALQueryError): diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index 66274e452..07b490fee 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -10,6 +10,7 @@ import pytest from pyvo.registry import rtcons +from pyvo.dal import query as dalq class TestAbstractConstraint: @@ -62,15 +63,11 @@ def test_odd_type_rejected(self): class TestFreetextConstraint: def test_basic(self): assert (rtcons.Freetext("star").get_search_condition() - == "1=ivo_hasword(res_description, 'star')" - " OR 1=ivo_hasword(res_title, 'star')" - " OR 1=ivo_hasword(role_name, 'star')") + == "ivoid IN (SELECT ivoid FROM rr.resource WHERE 1=ivo_hasword(res_description, 'star') UNION SELECT ivoid FROM rr.resource WHERE 1=ivo_hasword(res_title, 'star') UNION SELECT ivoid FROM rr.res_subject WHERE res_subject ILIKE '%star%')") def test_interesting_literal(self): assert (rtcons.Freetext("α Cen's planets").get_search_condition() - == "1=ivo_hasword(res_description, 'α Cen''s planets')" - " OR 1=ivo_hasword(res_title, 'α Cen''s planets')" - " OR 1=ivo_hasword(role_name, 'α Cen''s planets')") + == "ivoid IN (SELECT ivoid FROM rr.resource WHERE 1=ivo_hasword(res_description, 'α Cen''s planets') UNION SELECT ivoid FROM rr.resource WHERE 1=ivo_hasword(res_title, 'α Cen''s planets') UNION SELECT ivoid FROM rr.res_subject WHERE res_subject ILIKE '%α Cen''s planets%')") class TestAuthorConstraint: @@ -104,7 +101,7 @@ def test_includeaux(self): " 'ivo://ivoa.net/std/sia#aux')") def test_junk_rejected(self): - with pytest.raises(ValueError) as excinfo: + with pytest.raises(dalq.DALQueryError) as excinfo: rtcons.Servicetype("junk") assert str(excinfo.value) == ("Service type junk is neither" " a full standard URI nor one of the bespoke identifiers" @@ -121,7 +118,7 @@ def test_basic(self): class TestDatamodelConstraint: def test_junk_rejected(self): - with pytest.raises(ValueError) as excinfo: + with pytest.raises(dalq.DALQueryError) as excinfo: rtcons.Datamodel("junk") assert str(excinfo.value) == ( "Unknown data model id junk. Known are: epntap, obscore, regtap.") @@ -155,39 +152,37 @@ def test_regtap(self): class TestWhereClauseBuilding: @staticmethod def where_clause_for(*args, **kwargs): - return rtcons._build_regtap_query(list(args), kwargs + cons = list(args)+rtcons.keywords_to_constraints(kwargs) + return rtcons.build_regtap_query(cons ).split("\nWHERE\n", 1)[1].split("\nGROUP BY\n")[0] def test_from_constraints(self): assert self.where_clause_for( - rtcons.Freetext("star galaxy"), + rtcons.Waveband("EUV"), rtcons.Author("%Hubble%") - ) == ("(1=ivo_hasword(res_description, 'star galaxy')" - " OR 1=ivo_hasword(res_title, 'star galaxy')" - " OR 1=ivo_hasword(role_name, 'star galaxy'))" - "\n AND (role_name LIKE '%Hubble%' AND base_role='creator')") + ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'EUV'))\n" + " AND (role_name LIKE '%Hubble%' AND base_role='creator')") def test_from_keywords(self): assert self.where_clause_for( - keywords="star galaxy", + waveband="EUV", author="%Hubble%" - ) == ("(1=ivo_hasword(res_description, 'star galaxy')" - " OR 1=ivo_hasword(res_title, 'star galaxy')" - " OR 1=ivo_hasword(role_name, 'star galaxy'))" - "\n AND (role_name LIKE '%Hubble%' AND base_role='creator')") + ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'EUV'))\n" + " AND (role_name LIKE '%Hubble%' AND base_role='creator')") + def test_mixed(self): assert self.where_clause_for( - rtcons.Freetext("star galaxy"), + rtcons.Waveband("EUV"), author="%Hubble%" - ) == ("(1=ivo_hasword(res_description, 'star galaxy')" - " OR 1=ivo_hasword(res_title, 'star galaxy')" - " OR 1=ivo_hasword(role_name, 'star galaxy'))" - "\n AND (role_name LIKE '%Hubble%' AND base_role='creator')") + ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'EUV'))\n" + " AND (role_name LIKE '%Hubble%' AND base_role='creator')") + def test_bad_keyword(self): with pytest.raises(TypeError) as excinfo: - rtcons._build_regtap_query((), {"foo": "bar"}) + rtcons.build_regtap_query( + *rtcons.keywords_to_constraints({"foo": "bar"})) # the following assertion will fail when new constraints are # defined (or old ones vanish). I'd say that's a convenient # way to track changes; so, let's update the assertion as we @@ -201,7 +196,8 @@ class TestSelectClause: def test_expected_columns(self): # This will break as regtap.RegistryResource.expected_columns # is changed. Just update the assertion then. - assert rtcons._build_regtap_query([], {"author": "%Hubble%"} + assert rtcons.build_regtap_query( + rtcons.keywords_to_constraints({"author": "%Hubble%"}) ).split("\nFROM rr.resource\n")[0] == ( "SELECT\n" "ivoid, " @@ -217,12 +213,13 @@ def test_expected_columns(self): "region_of_regard, " "waveband, " "ivo_string_agg(access_url, ':::py VO sep:::') AS access_urls, " - "ivo_string_agg(standard_id, ':::py VO sep:::') AS standard_ids") + "ivo_string_agg(standard_id, ':::py VO sep:::') AS standard_ids, " + "ivo_string_agg(intf_role, ':::py VO sep:::') AS intf_roles") def test_group_by_columns(self): # Again, this will break as regtap.RegistryResource.expected_columns # is changed. Just update the assertion then. - assert rtcons._build_regtap_query([], {"author": "%Hubble%"} + assert rtcons.build_regtap_query([rtcons.Author("%Hubble%")] ).split("\nGROUP BY\n")[-1] == ( "ivoid, " "res_type, " From 767f16dc91455f9fa79c1c33ece2290478576991 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Tue, 20 Jul 2021 13:04:26 +0200 Subject: [PATCH 09/49] Adding vocabulary checks to the waveband constraint --- pyvo/registry/rtcons.py | 15 +++- pyvo/registry/tests/data/messenger.desise | 103 ++++++++++++++++++++++ pyvo/registry/tests/test_rtcons.py | 30 +++++-- 3 files changed, 137 insertions(+), 11 deletions(-) create mode 100644 pyvo/registry/tests/data/messenger.desise diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 84ca059fb..fb04939b9 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -16,6 +16,7 @@ from ..dal import tap from ..dal import query as dalq +from ..utils import vocabularies from .import regtap @@ -215,16 +216,24 @@ class Waveband(Constraint): but few resources actually give the necessary metadata (in 2021). Multiple wavebands can be given (and are effectively combined with OR). - - TODO: validate inputs against the vocabulary. """ _keyword = "waveband" + _vocab = None def __init__(self, *bands): + if self.__class__._vocab is None: + self.__class__._vocab = vocabularies.get_vocabulary("messenger") + + for band in bands: + if band not in self._vocab["terms"]: + raise dalq.DALQueryError( + f"Waveband {band} is not in the IVOA messenger" + " vocabulary http://www.ivoa.net/rdf/messenger.") + self.bands = list(bands) self._condition = " OR ".join( "1 = ivo_hashlist_has(rr.resource.waveband, {})".format( - make_sql_literal(band)) + make_sql_literal(band.lower())) for band in self.bands) diff --git a/pyvo/registry/tests/data/messenger.desise b/pyvo/registry/tests/data/messenger.desise new file mode 100644 index 000000000..63fb6e3af --- /dev/null +++ b/pyvo/registry/tests/data/messenger.desise @@ -0,0 +1,103 @@ +{ + "uri": "http://www.ivoa.net/rdf/messenger", + "flavour": "RDF Class", + "terms": { + "Photon": { + "label": "Photon", + "description": " Carrier particles of the electromagnetic interaction", + "preliminary": "", + "wider": [], + "narrower": [ + "Radio", + "Millimeter", + "Infrared", + "Optical", + "UV", + "X-ray", + "Gamma-ray", + "EUV" + ] + }, + "Radio": { + "label": "Radio", + "description": " Photon with a wavelength longer than 10 mm (or \u03bd<30 GHz)", + "preliminary": "", + "wider": [ + "Photon" + ], + "narrower": [] + }, + "Millimeter": { + "label": "Millimeter", + "description": " Photon with a wavelength between 0.1 mm and 10 mm (or 30 GHz<=\u03bd<300 GHz)", + "preliminary": "", + "wider": [ + "Photon" + ], + "narrower": [] + }, + "Infrared": { + "label": "Infrared", + "description": " Photon with a wavelength between 1 \u00b5m and 100 \u00b5m", + "preliminary": "", + "wider": [ + "Photon" + ], + "narrower": [] + }, + "Optical": { + "label": "Optical", + "description": " Photon with a wavelength between 300 nm and 1000 nm", + "preliminary": "", + "wider": [ + "Photon" + ], + "narrower": [] + }, + "UV": { + "label": "Ultraviolet", + "description": " Photon with a wavelength between 100 nm and 300 nm", + "preliminary": "", + "wider": [ + "Photon" + ], + "narrower": [ + "EUV" + ] + }, + "EUV": { + "label": "Extreme UV", + "description": " Photon with an energy between 12 eV and 120 eV", + "preliminary": "", + "wider": [ + "UV" + ], + "narrower": [] + }, + "X-ray": { + "label": "X-Ray", + "description": " Photon with an energy between 120 eV and 120 keV", + "preliminary": "", + "wider": [ + "Photon" + ], + "narrower": [] + }, + "Gamma-ray": { + "label": "Gamma Ray", + "description": " Photon with an energy above 120 keV", + "preliminary": "", + "wider": [ + "Photon" + ], + "narrower": [] + }, + "Neutrino": { + "label": "Neutrino", + "description": " This term comprises all generations of neutrinos (electron, \u00b5, \u03c4), and particles as well as antiparticles.", + "preliminary": "", + "wider": [], + "narrower": [] + } + } +} \ No newline at end of file diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index 07b490fee..78f89f0ce 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -13,6 +13,17 @@ from pyvo.dal import query as dalq +@pytest.fixture() +def messenger_vocabulary(mocker): + def callback(request, context): + return get_pkg_data_contents('data/messenger.desise') + + with mocker.register_uri( + 'GET', 'http://www.ivoa.net/rdf/messenger', content=callback + ) as matcher: + yield matcher + + class TestAbstractConstraint: def test_no_search_condition(self): with pytest.raises(NotImplementedError): @@ -108,12 +119,17 @@ def test_junk_rejected(self): " image, spectrum, scs, line, table") -# TODO: add a vocabulary check and mark this as requiring networking +@pytest.mark.usefixtures('messenger_vocabulary') class TestWavebandConstraint: def test_basic(self): assert (rtcons.Waveband("Infrared", "EUV").get_search_condition() - == "1 = ivo_hashlist_has(rr.resource.waveband, 'Infrared')" - " OR 1 = ivo_hashlist_has(rr.resource.waveband, 'EUV')") + == "1 = ivo_hashlist_has(rr.resource.waveband, 'infrared')" + " OR 1 = ivo_hashlist_has(rr.resource.waveband, 'euv')") + + def test_junk_rejected(self): + with pytest.raises(dalq.DALQueryError) as excinfo: + rtcons.Waveband("junk") + assert str(excinfo.value) == ("Waveband junk is not in the IVOA messenger vocabulary http://www.ivoa.net/rdf/messenger.") class TestDatamodelConstraint: @@ -147,8 +163,6 @@ def test_regtap(self): assert(cons._extra_tables==["rr.res_detail"]) - - class TestWhereClauseBuilding: @staticmethod def where_clause_for(*args, **kwargs): @@ -160,14 +174,14 @@ def test_from_constraints(self): assert self.where_clause_for( rtcons.Waveband("EUV"), rtcons.Author("%Hubble%") - ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'EUV'))\n" + ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'euv'))\n" " AND (role_name LIKE '%Hubble%' AND base_role='creator')") def test_from_keywords(self): assert self.where_clause_for( waveband="EUV", author="%Hubble%" - ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'EUV'))\n" + ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'euv'))\n" " AND (role_name LIKE '%Hubble%' AND base_role='creator')") @@ -175,7 +189,7 @@ def test_mixed(self): assert self.where_clause_for( rtcons.Waveband("EUV"), author="%Hubble%" - ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'EUV'))\n" + ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'euv'))\n" " AND (role_name LIKE '%Hubble%' AND base_role='creator')") From aa930d3d31f7fd670556e15f777e7697cacdcfea Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Tue, 20 Jul 2021 13:53:52 +0200 Subject: [PATCH 10/49] Adding an Interface class to regtap to hold results for our now regularly multi-interface results. We're now also retrieving the interface type because we may want to do something with web interfaces at some point. Also, waveband validation is now case-insenstitive. --- pyvo/registry/regtap.py | 56 +++++++++++++++++++++++++++++- pyvo/registry/rtcons.py | 12 ++++--- pyvo/registry/tests/test_regtap.py | 39 +++++++++++++++++++++ pyvo/registry/tests/test_rtcons.py | 5 +++ 4 files changed, 106 insertions(+), 6 deletions(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 570af14f2..188be0269 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -131,6 +131,50 @@ def getrecord(self, index): return RegistryResource(self, index) +class Interface: + """ + a service interface. + + These consist of an access URL, a standard id for the capability + (typically the ivoid of an IVOA standard, or None for free services), + an interface type (something like vs:paramhttp or vr:webbrowser) + and an indication if the interface is the "standard" interface + of the capability. + + Such interfaces can be turned into services using the ``to_service`` + method if pyvo knows how to talk to the interface. + + Note that the constructor arguments are assumed to be normalised + as in regtap (e.g., lowercased for the standardIDs). + """ + service_for_standardid = { + "ivo://ivoa.net/std/conesearch": scs.SCSService, + "ivo://ivoa.net/std/sia": sia.SIAService, + "ivo://ivoa.net/std/ssa": ssa.SSAService, + "ivo://ivoa.net/std/sla": sla.SLAService, + "ivo://ivoa.net/std/tap": tap.TAPService} + + def __init__(self, access_url, standard_id, intf_type, intf_role): + self.access_url = access_url + self.standard_id = standard_id or None + self.type = intf_type or None + self.role = intf_role or None + self.is_standard = self.role=="std" + + def to_service(self): + if self.standard_id is None or not self.is_standard: + raise ValueError("This is not a standard interface. PyVO" + " cannot speak to it.") + + service_class = self.service_for_standardid.get( + self.standard_id.split("#")[0]) + if service_class is None: + raise ValueError("PyVO has no support for interfaces with" + f" standard id {self.standard_id}.") + + return service_class(self.access_url) + + class RegistryResource(dalq.Record): """ a dictionary for the resource metadata returned in one record of a @@ -167,8 +211,18 @@ class RegistryResource(dalq.Record): "waveband", (f"ivo_string_agg(access_url, '{TOKEN_SEP}')", "access_urls"), (f"ivo_string_agg(standard_id, '{TOKEN_SEP}')", "standard_ids"), + (f"ivo_string_agg(intf_type, '{TOKEN_SEP}')", "intf_types"), (f"ivo_string_agg(intf_role, '{TOKEN_SEP}')", "intf_roles"),] + def __init__(self, results, index, session=None): + dalq.Record.__init__(self, results, index, session) + + self.interfaces = [Interface(*props) + for props in zip( + results["access_urls"].split(TOKEN_SEP), + results["standard_ids"].split(TOKEN_SEP), + results["intf_types"].split(TOKEN_SEP), + results["intf_roles"].split(TOKEN_SEP))] @property def ivoid(self): @@ -282,7 +336,7 @@ def service(self): return an appropriate DALService subclass for this resource that can be used to search the resource. Return None if the resource is not a recognized DAL service. Currently, only Conesearch, SIA, SSA, - and SLA services are supported. + TAP, and SLA services are supported. """ if self.access_url: for key, value in { diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index fb04939b9..978ac35c9 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -218,14 +218,16 @@ class Waveband(Constraint): Multiple wavebands can be given (and are effectively combined with OR). """ _keyword = "waveband" - _vocab = None + _legal_terms = None def __init__(self, *bands): - if self.__class__._vocab is None: - self.__class__._vocab = vocabularies.get_vocabulary("messenger") + if self.__class__._legal_terms is None: + self.__class__._legal_terms = {w.lower() for w in + vocabularies.get_vocabulary("messenger")["terms"]} + bands = [band.lower() for band in bands] for band in bands: - if band not in self._vocab["terms"]: + if band not in self._legal_terms: raise dalq.DALQueryError( f"Waveband {band} is not in the IVOA messenger" " vocabulary http://www.ivoa.net/rdf/messenger.") @@ -233,7 +235,7 @@ def __init__(self, *bands): self.bands = list(bands) self._condition = " OR ".join( "1 = ivo_hashlist_has(rr.resource.waveband, {})".format( - make_sql_literal(band.lower())) + make_sql_literal(band)) for band in self.bands) diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index ab49fd844..b6a9d8001 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -7,8 +7,10 @@ from urllib.parse import parse_qsl import pytest +from pyvo.registry import regtap from pyvo.registry import search as regsearch from pyvo.dal import query as dalq +from pyvo.dal import tap from astropy.utils.data import get_pkg_data_contents @@ -147,6 +149,43 @@ def auxtest_callback(request, context): yield matcher +class TestInterfaceClass: + def test_basic(self): + intf = regtap.Interface("http://example.org", "", "", "") + assert intf.access_url == "http://example.org" + assert intf.standard_id is None + assert intf.type is None + assert intf.role is None + assert intf.is_standard == False + + def test_unknown_standard(self): + intf = regtap.Interface("http://example.org", "ivo://gavo/std/a", + "vs:paramhttp", "std") + assert intf.is_standard + with pytest.raises(ValueError) as excinfo: + intf.to_service() + + assert str(excinfo.value) == ( + "PyVO has no support for interfaces with standard" + " id ivo://gavo/std/a.") + + def test_known_standard(self): + intf = regtap.Interface("http://example.org", + "ivo://ivoa.net/std/tap#aux", "vs:paramhttp", "std") + assert isinstance(intf.to_service(), tap.TAPService) + + def test_secondary_interface(self): + intf = regtap.Interface("http://example.org", + "ivo://ivoa.net/std/tap#aux", + "vs:webbrowser", "web") + + with pytest.raises(ValueError) as excinfo: + intf.to_service() + + assert str(excinfo.value) == ( + "This is not a standard interface. PyVO cannot speak to it.") + + @pytest.mark.usefixtures('keywords_fixture', 'capabilities') def test_keywords(): regsearch(keywords=['vizier', 'pulsar']) diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index 78f89f0ce..e77847593 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -131,6 +131,10 @@ def test_junk_rejected(self): rtcons.Waveband("junk") assert str(excinfo.value) == ("Waveband junk is not in the IVOA messenger vocabulary http://www.ivoa.net/rdf/messenger.") + def test_normalisation(self): + assert (rtcons.Waveband("oPtIcAl").get_search_condition() + == "1 = ivo_hashlist_has(rr.resource.waveband, 'optical')") + class TestDatamodelConstraint: def test_junk_rejected(self): @@ -228,6 +232,7 @@ def test_expected_columns(self): "waveband, " "ivo_string_agg(access_url, ':::py VO sep:::') AS access_urls, " "ivo_string_agg(standard_id, ':::py VO sep:::') AS standard_ids, " + "ivo_string_agg(intf_type, ':::py VO sep:::') AS intf_types, " "ivo_string_agg(intf_role, ':::py VO sep:::') AS intf_roles") def test_group_by_columns(self): From 85e9f007efddf4967c10397175c39401f46dd938 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Thu, 22 Jul 2021 15:09:19 +0200 Subject: [PATCH 11/49] Extracting registry.search query building to a get_RegTAP_query function. Also, refactoring service type selection to use a global SERVICE_TYPE_MAP for the various aliases for the standards. Also, adding an Ivoid constraint for just retrieving a specific resource. --- pyvo/registry/regtap.py | 160 ++++++++++++++++++----------- pyvo/registry/rtcons.py | 60 +++++------ pyvo/registry/tests/test_regtap.py | 5 + pyvo/registry/tests/test_rtcons.py | 11 +- 4 files changed, 146 insertions(+), 90 deletions(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 188be0269..3f564954e 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -22,10 +22,20 @@ from ..utils.formatting import para_format_desc -__all__ = ["search", "RegistryResource", "RegistryResults", "ivoid2service"] +__all__ = ["search", "get_RegTAP_query", + "RegistryResource", "RegistryResults", "ivoid2service"] REGISTRY_BASEURL = os.environ.get("IVOA_REGISTRY") or "http://dc.g-vo.org/tap" +# a mapping from (base) ivoids (normalised to lowercase as in RegTAP) +# to the service classes handling the standard. +STANDARD_TO_SERVICE_CLASS = { + "ivo://ivoa.net/std/conesearch": scs.SCSService, + "ivo://ivoa.net/std/sia": sia.SIAService, + "ivo://ivoa.net/std/ssa": ssa.SSAService, + "ivo://ivoa.net/std/sla": sla.SLAService, + "ivo://ivoa.net/std/tap": tap.TAPService, +} # ADQL only has string_agg, where we need string arrays. We fake arrays # by joining elements with a token separator that we think shouldn't @@ -37,7 +47,8 @@ @functools.lru_cache(1) def get_RegTAP_service(): - """a lazily created TAP service offering the RegTAP services. + """ + a lazily created TAP service offering the RegTAP services. This uses regtap.REGISTRY_BASEURL. Always get the TAP service there using this function to avoid re-creating the server @@ -46,13 +57,33 @@ def get_RegTAP_service(): return tap.TAPService(REGISTRY_BASEURL) +def get_RegTAP_query(*constraints:rtcons.Constraint, + includeaux=False, **kwargs): + """returns SQL for a RegTAP query for constraints and keywords. + + This function's parameters are as for search; this is basically + a wrapper for rtcons.build_regtap_query maintaining the legacy + keyword-based interface. + """ + constraints = list(constraints)+rtcons.keywords_to_constraints(kwargs) + + # maintain legacy includeaux by locating any Servicetype constraints + # and replacing them with ones that includes auxiliaries. + if includeaux: + for index, constraint in enumerate(constraints): + if isinstance(constraint, rtcons.Servicetype): + constraints[index] = constraint.include_auxiliary_services() + + return rtcons.build_regtap_query(constraints) + + def search(*constraints:rtcons.Constraint, includeaux=False, **kwargs): """ execute a simple query to the RegTAP registry. Parameters ---------- - The function accepts query constraint either as Constraint objects + The function accepts query constraints either as Constraint objects passed in as positional arguments or as their associated keywords. For what constraints are available, see TODO. @@ -62,7 +93,7 @@ def search(*constraints:rtcons.Constraint, includeaux=False, **kwargs): All constraints, whether passed in directly or via keywords, are evaluated as a conjunction (i.e., in an AND clause). - includeaux : boolean + includeaux : bool Flag for whether to include auxiliary capabilities in results. This may result in duplicate capabilities being returned, especially if the servicetype is not specified. @@ -76,21 +107,10 @@ def search(*constraints:rtcons.Constraint, includeaux=False, **kwargs): -------- RegistryResults """ - constraints = list(constraints)+rtcons.keywords_to_constraints(kwargs) - - # maintain legacy includeaux by locating any Servicetype constraints - # and replacing them with ones that includes auxiliaries. - if includeaux: - for index, constraint in enumerate(constraints): - if isinstance(constraint, rtcons.Servicetype): - constraints[index] = constraint.include_auxiliary_services() - - query_sql = rtcons.build_regtap_query(constraints) - service = get_RegTAP_service() query = RegistryQuery( service.baseurl, - query_sql, + get_RegTAP_query(*constraints, includeaux=includeaux, **kwargs), maxrec=service.hardlimit) return query.execute() @@ -331,25 +351,54 @@ def standard_id(self): return self.get("standard_id", decode=True) @property - def service(self): + def service(self, service_type:str=None, lax:bool=False): """ return an appropriate DALService subclass for this resource that can be used to search the resource. Return None if the resource is not a recognized DAL service. Currently, only Conesearch, SIA, SSA, TAP, and SLA services are supported. - """ - if self.access_url: - for key, value in { - "ivo://ivoa.net/std/conesearch": scs.SCSService, - "ivo://ivoa.net/std/sia": sia.SIAService, - "ivo://ivoa.net/std/ssa": ssa.SSAService, - "ivo://ivoa.net/std/sla": sla.SLAService, - "ivo://ivoa.net/std/tap": tap.TAPService, - }.items(): - if key in self.standard_id: - self._service = value(self.access_url) - - return self._service + + Parameters + ---------- + service_type : str + If you leave out ``service_type``, this will return a service + for "the" standard interface of the resource. If a resource + has multiple standard capabilities (e.g., both TAP and SSAP + endpoints), this will raise a DALQueryError. + + Otherwise, a service of the given service type will be returned. + Pass in an ivoid of a standard or one of the shorthands from + rtcons.SERVICE_TYPE_MAP. + + lax : bool + If there are multiple capabilities for service_type, the + function will raise a DALQueryError by default. Pass + lax=True to just return the first such capability found. + """ + if self._service is not None: + return self._service + + if service_type is not None: + service_type = rtcons.SERVICE_TYPE_MAP.get( + service_type, service_type) + + candidates = [intf for intf in self.interfaces + if intf.is_standard and + (not service_type and intf.standard_id==service_type)] + + if not candidates: + raise dalq.DALQueryError("No suitable interface found.") + if len(set(c.standard_id for c in candidates))>1 and not lax: + raise dalq.DALQueryError("Multiple interfaces found." + " Either pass service_type or use a Servicetype" + " constrain in the registry.search.") + + stdid = candidates[0].standard_id.split("#")[0] + if not stdid in STANDARD_TO_SERVICE_CLASS: + raise dalq.DALQueryError("PyVO does not know how to talk" + " to a {stdid} service.") + + return STANDARD_TO_SERVICE_CLASS[stdid](candidates[0].access_url) def search(self, *args, **keys): """ @@ -453,33 +502,26 @@ def ivoid2service(ivoid, servicetype=None): given, a list of all matching services is returned. """ - service = get_RegTAP_service() - results = service.run_sync(""" - SELECT DISTINCT access_url, standard_id FROM rr.capability - NATURAL JOIN rr.interface - WHERE ivoid = '{}' - """.format(tap.escape(ivoid))) - services = [] - ivo_cls = { - "ivo://ivoa.net/std/conesearch": scs.SCSService, - "ivo://ivoa.net/std/sia": sia.SIAService, - "ivo://ivoa.net/std/ssa": ssa.SSAService, - "ivo://ivoa.net/std/sla": sla.SLAService, - "ivo://ivoa.net/std/tap": tap.TAPService - } - for result in results: - thistype = result["standard_id"] - if thistype not in ivo_cls.keys(): - # This one is not a VO service - continue - cls = ivo_cls[thistype] - if servicetype is not None and servicetype not in thistype: - # Not the type of service you want - continue - elif servicetype is not None: - # Return only one service, the first of the requested type - return(cls(result["access_url"])) + constraints = [rtcons.Ivoid(ivoid)] + if servicetype is not None: + constraints.append(rtcons.Servicetype(servicetype)) + resources = search(*constraints) + if len(resources)==0: + if servicetype: + raise dalq.DALQueryError(f"No resource {ivoid} with" + f" {servicetype} capability.") else: - # Return a list of services - services.append(cls(result["access_url"])) - return services + raise dalq.DALQueryError(f"No resource {ivoid}") + + # We're grouping by ivoid in search, so if there's a result + # there is only one. + resource = resources[0] + + if servicetype: + return resource.get_service(servicetype, lax=True) + + else: + return [STANDARD_TO_SERVICE_CLASS[interface.standard_id + ](interface.access_url) + for interface in resource.interfaces + if interface.standard_id in STANDARD_TO_SERVICE_CLASS] diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 978ac35c9..7f99ba27b 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -20,6 +20,21 @@ from .import regtap +# a mapping of service type shorthands to the ivoids of the +# corresponding standards. +SERVICE_TYPE_MAP = dict((k, "ivo://ivoa.net/std/"+v) + for k, v in [ + ("image", "sia"), + ("sia", "sia"), + ("spectrum", "ssa"), + ("ssap", "ssa"), + ("scs", "conesearch"), + ("line", "slap"), + ("table", "tap"), + ("tap", "tap"), +]) + + def make_sql_literal(value): """returns the python value as a SQL-embeddable literal. @@ -151,8 +166,8 @@ class Servicetype(Constraint): """constrain by the type of service. The constraint is either a bespoke keyword (of which there are at least - image, spectrum, scs, line, and table; the fullist is in this class' - _service_type_map) or the standards' ivoid (which generally looks like + image, spectrum, scs, line, and table; the fullist is in + SERVICE_TYPE_MAP) or the standards' ivoid (which generally looks like ``ivo://ivoa.net/std/`` and have to be URIs with a scheme part in any case). @@ -168,26 +183,19 @@ class Servicetype(Constraint): use registry.search's ``includeaux`` parameter. """ _keyword = "servicetype" - _service_type_map = { - "image": "sia", - "spectrum": "ssa", - "scs": "conesearch", - "line": "slap", - "table": "tap" - } + def __init__(self, *stds): self.stdids = set() for std in stds: - if std in self._service_type_map: - self.stdids.add('ivo://ivoa.net/std/'+ - self._service_type_map[std]) + if std in SERVICE_TYPE_MAP: + self.stdids.add(SERVICE_TYPE_MAP[std]) elif "://" in std: self.stdids.add(std) else: raise dalq.DALQueryError("Service type {} is neither a full" " standard URI nor one of the bespoke identifiers" - " {}".format(std, ", ".join(self._service_type_map))) + " {}".format(std, ", ".join(SERVICE_TYPE_MAP))) def get_search_condition(self): # we sort the stdids to make it easy for tests (and it's @@ -292,6 +300,16 @@ def _make_regtap_constraint(self): f" AND 1 = ivo_nocasematch(detail_value, '{regtap_pat}')") +class Ivoid(Constraint): + """A constraint selecting a single resource by its IVOA identifier. + """ + _keyword = "ivoid" + + def __init__(self, ivoid): + self._condition = "ivoid = {ivoid}" + self._fillers = {"ivoid": ivoid} + + def build_regtap_query(constraints): """returns a RegTAP query ready for submission from a list of Constraint instances. @@ -345,22 +363,6 @@ def keywords_to_constraints(keywords): return constraints -def datasearch(*constraints:Constraint, **kwargs): - """... - - Pass in one or more constraints; a resource matches when it matches - all of them. - """ - regtap_query = _build_regtap_query(list(constraints), keywords) - service = regtap.get_RegTAP_service() - query = regtap.RegistryQuery( - service.baseurl, - regtap_query, - maxrec=service.hardlimit) - - return query.execute() - - def _make_constraint_map(): """returns a map of _keyword to constraint classes. diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index b6a9d8001..83e045f50 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -221,3 +221,8 @@ def test_servicetype_aux(): def test_bad_servicetype_aux(): with pytest.raises(dalq.DALQueryError): regsearch(servicetype='bad_servicetype', includeaux=True) + + +class TestInterfaceSelection: + def test_interfaces_shown(self): + print(regtap.get_RegTAP_query(ivoid="ivo://org.gavo.dc/flashheros/q/ssa")) diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index e77847593..7bc65c4a0 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -116,7 +116,7 @@ def test_junk_rejected(self): rtcons.Servicetype("junk") assert str(excinfo.value) == ("Service type junk is neither" " a full standard URI nor one of the bespoke identifiers" - " image, spectrum, scs, line, table") + " image, sia, spectrum, ssap, scs, line, table, tap") @pytest.mark.usefixtures('messenger_vocabulary') @@ -167,6 +167,13 @@ def test_regtap(self): assert(cons._extra_tables==["rr.res_detail"]) +class TestIvoidConstraint: + def test_basic(self): + cons = rtcons.Ivoid("ivo://example/some_path") + assert (cons.get_search_condition() == + "ivoid = 'ivo://example/some_path'") + + class TestWhereClauseBuilding: @staticmethod def where_clause_for(*args, **kwargs): @@ -207,7 +214,7 @@ def test_bad_keyword(self): # go. assert str(excinfo.value) == ("foo is not a valid registry" " constraint keyword. Use one of" - " author, datamodel, keywords, servicetype, waveband.") + " author, datamodel, ivoid, keywords, servicetype, waveband.") class TestSelectClause: From a9ca306e5f282817861512889bffad63faf75eee Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Wed, 28 Jul 2021 11:31:51 +0200 Subject: [PATCH 12/49] Further steps towards improved service selection. Interfaces now know if they're VOSI and are filtered by service, new way of expanding and shortinging standard ids. But we're stuck a bit because of a conspiracy between RegTAP's NULL mapping rules, ivo_string_agg's NULL skipping, and the lack of COALESCE in ADQL. --- pyvo/registry/regtap.py | 122 +++++++++++++++---- pyvo/registry/rtcons.py | 15 ++- pyvo/registry/tests/data/multi-interface.xml | 39 ++++++ pyvo/registry/tests/test_regtap.py | 53 ++++++-- 4 files changed, 193 insertions(+), 36 deletions(-) create mode 100644 pyvo/registry/tests/data/multi-interface.xml diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 3f564954e..1626892e7 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -25,7 +25,8 @@ __all__ = ["search", "get_RegTAP_query", "RegistryResource", "RegistryResults", "ivoid2service"] -REGISTRY_BASEURL = os.environ.get("IVOA_REGISTRY") or "http://dc.g-vo.org/tap" +REGISTRY_BASEURL = os.environ.get("IVOA_REGISTRY", "http://dc.g-vo.org/tap" + ).rstrip("/") # a mapping from (base) ivoids (normalised to lowercase as in RegTAP) # to the service classes handling the standard. @@ -45,6 +46,30 @@ TOKEN_SEP = ":::py VO sep:::" +def shorten_stdid(s): + """removes leading ivo://ivoa.net/std/ from s if present. + + We're using this to make the display and naming of standard ivoids + less ugly in several places. + + Nones remain Nones. + """ + if s and s.startswith("ivo://ivoa.net/std/"): + return s[19:] + return s + + +def expand_stdid(s): + """returns s if it already looks like a URI, and it prepends + ivo://ivoa.net/std otherwise. + + This is the (approximate) reverse of shorten_stdid. + """ + if s is None or "://" in s: + return s + return "ivo://ivoa.net/std/"+s + + @functools.lru_cache(1) def get_RegTAP_service(): """ @@ -177,6 +202,7 @@ class Interface: def __init__(self, access_url, standard_id, intf_type, intf_role): self.access_url = access_url self.standard_id = standard_id or None + self.is_vosi = standard_id.startswith("ivo://ivoa.net/std/vosi") self.type = intf_type or None self.role = intf_role or None self.is_standard = self.role=="std" @@ -220,7 +246,7 @@ class RegistryResource(dalq.Record): "ivoid", "res_type", "short_name", - "title", + "res_title", "content_level", "res_description", "reference_url", @@ -235,14 +261,23 @@ class RegistryResource(dalq.Record): (f"ivo_string_agg(intf_role, '{TOKEN_SEP}')", "intf_roles"),] def __init__(self, results, index, session=None): + results["access_urls"][index + ] = results["access_urls"][index].split(TOKEN_SEP) + results["standard_ids"][index + ] = results["standard_ids"][index].split(TOKEN_SEP) + results["intf_types"][index + ] = results["intf_types"][index].split(TOKEN_SEP) + results["intf_roles"][index + ] = results["intf_roles"][index].split(TOKEN_SEP) + dalq.Record.__init__(self, results, index, session) self.interfaces = [Interface(*props) for props in zip( - results["access_urls"].split(TOKEN_SEP), - results["standard_ids"].split(TOKEN_SEP), - results["intf_types"].split(TOKEN_SEP), - results["intf_roles"].split(TOKEN_SEP))] + self["access_urls"], + self["standard_ids"], + self["intf_types"], + self["intf_roles"])] @property def ivoid(self): @@ -341,7 +376,11 @@ def access_url(self): """ the URL that can be used to access the service resource. """ - return self.get("access_url", decode=True) + if len(self["access_urls"])==1: + return self["access_urls"][0] + else: + raise dalq.DALQueryError( + "No unique access URL. Use get_service.") @property def standard_id(self): @@ -350,13 +389,34 @@ def standard_id(self): """ return self.get("standard_id", decode=True) - @property - def service(self, service_type:str=None, lax:bool=False): + def access_modes(self): + """ + returns a list of interface identifiers available on + this resource. + + For standard interfaces, get_service will return a service + suitable for querying if you pass in an identifier from this + list as the service_type. + """ + import pdb;pdb.set_trace() + return [shorten_stdid(intf.standard_id) or "web" + for intf in self.interfaces + if intf.standard_id or intf.type=="vr:webbrowser"] + + def get_service(self, + service_type:str=None, + lax:bool=True, + std_only:bool=True): """ return an appropriate DALService subclass for this resource that - can be used to search the resource. Return None if the resource is - not a recognized DAL service. Currently, only Conesearch, SIA, SSA, - TAP, and SLA services are supported. + can be used to search the resource using service_type. + + Raise a DALQueryError if the service_type is not offerend on + the resource (or no standard service is offered). With + lax=False, also raise a DALQueryError if multiple interfaces + exist for the given service_type. + + VOSI (infrastructure) services are always ignored here. Parameters ---------- @@ -372,19 +432,22 @@ def service(self, service_type:str=None, lax:bool=False): lax : bool If there are multiple capabilities for service_type, the - function will raise a DALQueryError by default. Pass - lax=True to just return the first such capability found. + function choose the first matching capability by default + Pass lax=False to instead raise a DALQueryError. + + std_only : bool + Only return the interfaces complying to the standard (true + by default). This typically filters out interfaces that + can be operated by web browsers. """ - if self._service is not None: - return self._service - - if service_type is not None: - service_type = rtcons.SERVICE_TYPE_MAP.get( - service_type, service_type) + service_type = expand_stdid( + rtcons.SERVICE_TYPE_MAP.get( + service_type, service_type)) candidates = [intf for intf in self.interfaces - if intf.is_standard and - (not service_type and intf.standard_id==service_type)] + if ((not std_only) and intf.is_standard) + and not intf.is_vosi + and (not service_type and intf.standard_id==service_type)] if not candidates: raise dalq.DALQueryError("No suitable interface found.") @@ -400,6 +463,21 @@ def service(self, service_type:str=None, lax:bool=False): return STANDARD_TO_SERVICE_CLASS[stdid](candidates[0].access_url) + @property + def service(self): + """ + return a service for this resource. + + This will in general only work if the registry query has + constrained the service type; otherwise, many resources will + have multiple capabilities. Use get_service instead in + such cases. + """ + if self._service is not None: + return self._service + self._service = self.get_service(None, True) + return self._service + def search(self, *args, **keys): """ assuming this resource refers to a searchable service, execute a diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 7f99ba27b..10eaea1c9 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -21,7 +21,9 @@ # a mapping of service type shorthands to the ivoids of the -# corresponding standards. +# corresponding standards. This is mostly to keep legacy APIs. +# In the future, preferably rely on shorten_stdid and expand_stdid +# from regtap. SERVICE_TYPE_MAP = dict((k, "ivo://ivoa.net/std/"+v) for k, v in [ ("image", "sia"), @@ -318,9 +320,13 @@ def build_regtap_query(constraints): raise dalq.DALQueryError( "No search parameters passed to registry search") - serialized = [] + serialized, extra_tables = [], set() for constraint in constraints: serialized.append("("+constraint.get_search_condition()+")") + extra_tables |= set(constraint._extra_tables) + + joined_tables = ["rr.resource", "rr.capability", "rr.interface" + ]+list(extra_tables) # see comment in regtap.RegistryResource for the following # oddity @@ -334,9 +340,8 @@ def build_regtap_query(constraints): fragments = ["SELECT", ", ".join(select_clause), - "FROM rr.resource", - "LEFT OUTER NATURAL JOIN rr.capabilities", - "LEFT OUTER NATURAL JOIN rr.interfaces", + "FROM", + "\nNATURAL LEFT OUTER JOIN ".join(joined_tables), "WHERE", "\n AND ".join(serialized), "GROUP BY", diff --git a/pyvo/registry/tests/data/multi-interface.xml b/pyvo/registry/tests/data/multi-interface.xml new file mode 100644 index 000000000..7522bdf11 --- /dev/null +++ b/pyvo/registry/tests/data/multi-interface.xml @@ -0,0 +1,39 @@ + + Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ The resources (like services, data collections, organizations) +present in this registry. Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ Information on access modes of a capability. Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ Pieces of behaviour of a resource.Query successfulFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.resourceFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.interfaceFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.capability +The terms are taken from the vocabulary +http://ivoa.net/rdf/voresource/content_level. +The terms are taken from the vocabulary +http://ivoa.net/rdf/voresource/content_type. +The allowed values for waveband include: +Radio, Millimeter, Infrared, Optical, UV, EUV, X-ray, Gamma-ray.Unambiguous reference to the resource conforming to the IVOA standard for identifiers.Resource type (something like vs:datacollection, vs:catalogservice, etc).A short name or abbreviation given to something, for presentation in space-constrained fields (up to 16 characters).The full name given to the resource.A hash-separated list of content levels specifying the intended audience.An account of the nature of the resource.URL pointing to a human-readable document describing this resource.The creator(s) of the resource in the order given by the resource record author, separated by semicolons.A hash-separated list of natures or genres of the content of the resource.The format of source_value. This, in particular, can be ``bibcode''.A single numeric value representing the angle, given in decimal degrees, by which a positional query against this resource should be ``blurred'' in order to get an appropriate match.A hash-separated list of regions of the electro-magnetic spectrum that the resource's spectral coverage overlaps with.AAAAIml2bzovL29yZy5nYXZvLmRjL2ZsYXNoaGVyb3MvcS9zc2EAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQRmxhc2gvSGVyb3MgU1NBUAAAABAARgBsAGEAcwBoAC8ASABlAHIAbwBzACAAUwBTAEEAUAAAAAAAAAEVAFMAcABlAGMAdAByAGEAIABmAHIAbwBtACAAdABoAGUAIABGAGwAYQBzAGgAIABhAG4AZAAgAEgAZQByAG8AcwAgAEUAYwBoAGUAbABsAGUAIABzAHAAZQBjAHQAcgBvAGcAcgBhAHAAaABzACAAZABlAHYAZQBsAG8AcABlAGQAIABhAHQACgBMAGEAbgBkAGUAcwBzAHQAZQByAG4AdwBhAHIAdABlACAASABlAGkAZABlAGwAYgBlAHIAZwAgAGEAbgBkACAAbQBvAHUAbgB0AGUAZAAgAGEAdAAgAEwAYQAgAFMAaQBsAGwAYQAgAGEAbgBkACAAdgBhAHIAaQBvAHUAcwAgAG8AdABoAGUAcgAKAG8AYgBzAGUAcgB2AGEAdABvAHIAaQBlAHMALgAgAFQAaABlACAAZABhAHQAYQAgAG0AbwBzAHQAbAB5ACAAYwBvAG4AdABhAGkAbgBzACAAcwBwAGUAYwB0AHIAYQAgAG8AZgAgAE8AQgAgAHMAdABhAHIAcwAuACAASABlAHIAbwBzACAAdwBhAHMACgB0AGgAZQAgAG4AYQBtAGUAIABvAGYAIAB0AGgAZQAgAGkAbgBzAHQAcgB1AG0AZQBuAHQAIABhAGYAdABlAHIAIABGAGwAYQBzAGgAIABnAG8AdAAgAGEAIABzAGUAYwBvAG4AZAAgAGMAaABhAG4AbgBlAGwAIABpAG4AIAAxADkAOQA1AC4AAAA1aHR0cDovL2RjLnphaC51bmktaGVpZGVsYmVyZy5kZS9mbGFzaGhlcm9zL3Evc3NhL2luZm8AAAArAFcAbwBsAGYALAAgAEIALgA7ACAASwBhAHUAZgBlAHIALAAgAEEALgA7ACAATQBhAG4AZABlAGwALAAgAEgALgA7ACAAUwB0AGEAaABsACwAIABPAC4AAAAAAAAAB2JpYmNvZGV/wAAAAAAAB29wdGljYWwAAAIMaHR0cDovL2RjLnphaC51bmktaGVpZGVsYmVyZy5kZS9maHNzYT86OjpweSBWTyBzZXA6OjpodHRwOi8vZGMuemFoLnVuaS1oZWlkZWxiZXJnLmRlL2ZsYXNoaGVyb3MvcS93ZWIvZm9ybTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly9kYy56YWgudW5pLWhlaWRlbGJlcmcuZGUvZmxhc2hoZXJvcy9xL3NzYS9hdmFpbGFiaWxpdHk6OjpweSBWTyBzZXA6OjpodHRwOi8vZGMuemFoLnVuaS1oZWlkZWxiZXJnLmRlL2ZsYXNoaGVyb3MvcS9zc2EvY2FwYWJpbGl0aWVzOjo6cHkgVk8gc2VwOjo6aHR0cDovL2RjLnphaC51bmktaGVpZGVsYmVyZy5kZS9mbGFzaGhlcm9zL3Evc3NhL3RhYmxlTWV0YWRhdGE6OjpweSBWTyBzZXA6OjpodHRwOi8vZGMuemFoLnVuaS1oZWlkZWxiZXJnLmRlL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly9kYy56YWgudW5pLWhlaWRlbGJlcmcuZGUvZmxhc2hoZXJvcy9xL3NkbC9kbGdldDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly9kYy56YWgudW5pLWhlaWRlbGJlcmcuZGUvZmxhc2hoZXJvcy9xL3NkbC9kbG1ldGEAAAE1aXZvOi8vaXZvYS5uZXQvc3RkL3NzYTo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC92b3NpI2F2YWlsYWJpbGl0eTo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC92b3NpI2NhcGFiaWxpdGllczo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC92b3NpI3RhYmxlczo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3NvZGEjc3luYy0xLjA6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvZGF0YWxpbmsjbGlua3MtMS4wAAAAynZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHAAAABvc3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3Rk
\ No newline at end of file diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index 83e045f50..24d747fa9 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -8,6 +8,7 @@ import pytest from pyvo.registry import regtap +from pyvo.registry.regtap import REGISTRY_BASEURL from pyvo.registry import search as regsearch from pyvo.dal import query as dalq from pyvo.dal import tap @@ -25,7 +26,7 @@ def callback(request, context): return get_pkg_data_contents('data/capabilities.xml') with mocker.register_uri( - 'GET', 'http://dc.g-vo.org/tap/capabilities', content=callback + 'GET', REGISTRY_BASEURL+'/capabilities', content=callback ) as matcher: yield matcher @@ -47,7 +48,7 @@ def keywordstest_callback(request, context): return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( - 'POST', 'http://dc.g-vo.org/tap/sync', + 'POST', REGISTRY_BASEURL+'/sync', content=keywordstest_callback ) as matcher: yield matcher @@ -66,7 +67,7 @@ def keywordstest_callback(request, context): return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( - 'POST', 'http://dc.g-vo.org/tap/sync', + 'POST', REGISTRY_BASEURL+'/sync', content=keywordstest_callback ) as matcher: yield matcher @@ -87,7 +88,7 @@ def servicetypetest_callback(request, context): return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( - 'POST', 'http://dc.g-vo.org/tap/sync', + 'POST', REGISTRY_BASEURL+'/sync', content=servicetypetest_callback ) as matcher: yield matcher @@ -104,7 +105,7 @@ def wavebandtest_callback(request, content): return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( - 'POST', 'http://dc.g-vo.org/tap/sync', + 'POST', REGISTRY_BASEURL+'/sync', content=wavebandtest_callback ) as matcher: yield matcher @@ -126,7 +127,7 @@ def datamodeltest_callback(request, content): return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( - 'POST', 'http://dc.g-vo.org/tap/sync', + 'POST', REGISTRY_BASEURL+'/sync', content=datamodeltest_callback ) as matcher: yield matcher @@ -143,8 +144,26 @@ def auxtest_callback(request, context): return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( - 'POST', 'http://dc.g-vo.org/tap/sync', - content=auxtest_callback + 'POST', REGISTRY_BASEURL+'/sync', + content=auxtest_callback, + ) as matcher: + yield matcher + + +@pytest.fixture() +def multi_interface_fixture(mocker): +# to update this, run +# import requests +# from pyvo.registry import regtap +# +# with open("data/multi-interface.xml", "wb") as f: +# f.write(requests.get("http://dc.g-vo.org/tap/sync", { +# "LANG": "ADQL", +# "QUERY": regtap.get_RegTAP_query( +# ivoid="ivo://org.gavo.dc/flashheros/q/ssa")}).content) + with mocker.register_uri( + 'POST', REGISTRY_BASEURL+'/sync', + content=get_pkg_data_contents('data/multi-interface.xml') ) as matcher: yield matcher @@ -157,6 +176,7 @@ def test_basic(self): assert intf.type is None assert intf.role is None assert intf.is_standard == False + assert not intf.is_vosi def test_unknown_standard(self): intf = regtap.Interface("http://example.org", "ivo://gavo/std/a", @@ -173,6 +193,7 @@ def test_known_standard(self): intf = regtap.Interface("http://example.org", "ivo://ivoa.net/std/tap#aux", "vs:paramhttp", "std") assert isinstance(intf.to_service(), tap.TAPService) + assert not intf.is_vosi def test_secondary_interface(self): intf = regtap.Interface("http://example.org", @@ -185,6 +206,12 @@ def test_secondary_interface(self): assert str(excinfo.value) == ( "This is not a standard interface. PyVO cannot speak to it.") + def test_VOSI(self): + intf = regtap.Interface("http://example.org", + "ivo://ivoa.net/std/vosi#capabilities", + "vs:ParamHTTP", "std") + assert intf.is_vosi + @pytest.mark.usefixtures('keywords_fixture', 'capabilities') def test_keywords(): @@ -223,6 +250,14 @@ def test_bad_servicetype_aux(): regsearch(servicetype='bad_servicetype', includeaux=True) +@pytest.mark.usefixtures('multi_interface_fixture', 'capabilities') class TestInterfaceSelection: def test_interfaces_shown(self): - print(regtap.get_RegTAP_query(ivoid="ivo://org.gavo.dc/flashheros/q/ssa")) + results = regtap.search( + ivoid="ivo://org.gavo.dc/flashheros/q/ssa") + assert len(results) == 1 + rec = results[0] + assert set(rec.access_modes()) == { + 'datalink#links-1.0', 'soda#sync-1.0', 'ssa', 'tap#aux', + 'vosi#availability', 'vosi#capabilities', 'vosi#tables', + 'web'} From c1fb437458d039029c237540d4733c76e1f95f75 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Wed, 28 Jul 2021 13:07:02 +0200 Subject: [PATCH 13/49] RegTAP now employs COALESCE in the interface aggregates. This is nice and makes our "get all interfaces"-queries work. It's only downside: This only exists in bleeding-edge DaCHSes, as far as ADQL is concerned. --- pyvo/registry/regtap.py | 13 ++++++++----- pyvo/registry/tests/data/multi-interface.xml | 18 +++++++++--------- pyvo/registry/tests/test_regtap.py | 2 +- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 1626892e7..9a97faa4d 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -255,10 +255,14 @@ class RegistryResource(dalq.Record): "source_format", "region_of_regard", "waveband", - (f"ivo_string_agg(access_url, '{TOKEN_SEP}')", "access_urls"), - (f"ivo_string_agg(standard_id, '{TOKEN_SEP}')", "standard_ids"), - (f"ivo_string_agg(intf_type, '{TOKEN_SEP}')", "intf_types"), - (f"ivo_string_agg(intf_role, '{TOKEN_SEP}')", "intf_roles"),] + (f"ivo_string_agg(COALESCE(access_url, ''), '{TOKEN_SEP}')", + "access_urls"), + (f"ivo_string_agg(COALESCE(standard_id, ''), '{TOKEN_SEP}')", + "standard_ids"), + (f"ivo_string_agg(COALESCE(intf_type, ''), '{TOKEN_SEP}')", + "intf_types"), + (f"ivo_string_agg(COALESCE(intf_role, ''), '{TOKEN_SEP}')", + "intf_roles"),] def __init__(self, results, index, session=None): results["access_urls"][index @@ -398,7 +402,6 @@ def access_modes(self): suitable for querying if you pass in an identifier from this list as the service_type. """ - import pdb;pdb.set_trace() return [shorten_stdid(intf.standard_id) or "web" for intf in self.interfaces if intf.standard_id or intf.type=="vr:webbrowser"] diff --git a/pyvo/registry/tests/data/multi-interface.xml b/pyvo/registry/tests/data/multi-interface.xml index 7522bdf11..e945cc2e5 100644 --- a/pyvo/registry/tests/data/multi-interface.xml +++ b/pyvo/registry/tests/data/multi-interface.xml @@ -1,6 +1,6 @@ - The resources (like services, data collections, organizations) -present in this registry. Tables containing the information in the IVOA Registry. To query +specification: http://www.ivoa.net/documents/RegTAP/ Pieces of behaviour of a resource. Tables containing the information in the IVOA Registry. To query these tables, use `our TAP service`_. For more information and example queries, see the `RegTAP specification`_. .. _our TAP service: /__system__/tap/run/info .. _RegTAP -specification: http://www.ivoa.net/documents/RegTAP/ Information on access modes of a capability. Tables containing the information in the IVOA Registry. To query +specification: http://www.ivoa.net/documents/RegTAP/ The resources (like services, data collections, organizations) +present in this registry. Tables containing the information in the IVOA Registry. To query these tables, use `our TAP service`_. For more information and example queries, see the `RegTAP specification`_. .. _our TAP service: /__system__/tap/run/info .. _RegTAP -specification: http://www.ivoa.net/documents/RegTAP/ Pieces of behaviour of a resource.Query successfulFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.resourceFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.interfaceFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.capability +specification: http://www.ivoa.net/documents/RegTAP/ Information on access modes of a capability.Query successfulFor advice on how to cite the resource(s) that contributed to this result, see http://localhost:8080/tableinfo/rr.capabilityFor advice on how to cite the resource(s) that contributed to this result, see http://localhost:8080/tableinfo/rr.resourceFor advice on how to cite the resource(s) that contributed to this result, see http://localhost:8080/tableinfo/rr.interface
The terms are taken from the vocabulary -http://ivoa.net/rdf/voresource/content_level. +http://ivoa.net/rdf/voresource/content_level. The terms are taken from the vocabulary -http://ivoa.net/rdf/voresource/content_type. +http://ivoa.net/rdf/voresource/content_type. The allowed values for waveband include: -Radio, Millimeter, Infrared, Optical, UV, EUV, X-ray, Gamma-ray.Unambiguous reference to the resource conforming to the IVOA standard for identifiers.Resource type (something like vs:datacollection, vs:catalogservice, etc).A short name or abbreviation given to something, for presentation in space-constrained fields (up to 16 characters).The full name given to the resource.A hash-separated list of content levels specifying the intended audience.An account of the nature of the resource.URL pointing to a human-readable document describing this resource.The creator(s) of the resource in the order given by the resource record author, separated by semicolons.A hash-separated list of natures or genres of the content of the resource.The format of source_value. This, in particular, can be ``bibcode''.A single numeric value representing the angle, given in decimal degrees, by which a positional query against this resource should be ``blurred'' in order to get an appropriate match.A hash-separated list of regions of the electro-magnetic spectrum that the resource's spectral coverage overlaps with.AAAAIml2bzovL29yZy5nYXZvLmRjL2ZsYXNoaGVyb3MvcS9zc2EAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQRmxhc2gvSGVyb3MgU1NBUAAAABAARgBsAGEAcwBoAC8ASABlAHIAbwBzACAAUwBTAEEAUAAAAAAAAAEVAFMAcABlAGMAdAByAGEAIABmAHIAbwBtACAAdABoAGUAIABGAGwAYQBzAGgAIABhAG4AZAAgAEgAZQByAG8AcwAgAEUAYwBoAGUAbABsAGUAIABzAHAAZQBjAHQAcgBvAGcAcgBhAHAAaABzACAAZABlAHYAZQBsAG8AcABlAGQAIABhAHQACgBMAGEAbgBkAGUAcwBzAHQAZQByAG4AdwBhAHIAdABlACAASABlAGkAZABlAGwAYgBlAHIAZwAgAGEAbgBkACAAbQBvAHUAbgB0AGUAZAAgAGEAdAAgAEwAYQAgAFMAaQBsAGwAYQAgAGEAbgBkACAAdgBhAHIAaQBvAHUAcwAgAG8AdABoAGUAcgAKAG8AYgBzAGUAcgB2AGEAdABvAHIAaQBlAHMALgAgAFQAaABlACAAZABhAHQAYQAgAG0AbwBzAHQAbAB5ACAAYwBvAG4AdABhAGkAbgBzACAAcwBwAGUAYwB0AHIAYQAgAG8AZgAgAE8AQgAgAHMAdABhAHIAcwAuACAASABlAHIAbwBzACAAdwBhAHMACgB0AGgAZQAgAG4AYQBtAGUAIABvAGYAIAB0AGgAZQAgAGkAbgBzAHQAcgB1AG0AZQBuAHQAIABhAGYAdABlAHIAIABGAGwAYQBzAGgAIABnAG8AdAAgAGEAIABzAGUAYwBvAG4AZAAgAGMAaABhAG4AbgBlAGwAIABpAG4AIAAxADkAOQA1AC4AAAA1aHR0cDovL2RjLnphaC51bmktaGVpZGVsYmVyZy5kZS9mbGFzaGhlcm9zL3Evc3NhL2luZm8AAAArAFcAbwBsAGYALAAgAEIALgA7ACAASwBhAHUAZgBlAHIALAAgAEEALgA7ACAATQBhAG4AZABlAGwALAAgAEgALgA7ACAAUwB0AGEAaABsACwAIABPAC4AAAAAAAAAB2JpYmNvZGV/wAAAAAAAB29wdGljYWwAAAIMaHR0cDovL2RjLnphaC51bmktaGVpZGVsYmVyZy5kZS9maHNzYT86OjpweSBWTyBzZXA6OjpodHRwOi8vZGMuemFoLnVuaS1oZWlkZWxiZXJnLmRlL2ZsYXNoaGVyb3MvcS93ZWIvZm9ybTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly9kYy56YWgudW5pLWhlaWRlbGJlcmcuZGUvZmxhc2hoZXJvcy9xL3NzYS9hdmFpbGFiaWxpdHk6OjpweSBWTyBzZXA6OjpodHRwOi8vZGMuemFoLnVuaS1oZWlkZWxiZXJnLmRlL2ZsYXNoaGVyb3MvcS9zc2EvY2FwYWJpbGl0aWVzOjo6cHkgVk8gc2VwOjo6aHR0cDovL2RjLnphaC51bmktaGVpZGVsYmVyZy5kZS9mbGFzaGhlcm9zL3Evc3NhL3RhYmxlTWV0YWRhdGE6OjpweSBWTyBzZXA6OjpodHRwOi8vZGMuemFoLnVuaS1oZWlkZWxiZXJnLmRlL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly9kYy56YWgudW5pLWhlaWRlbGJlcmcuZGUvZmxhc2hoZXJvcy9xL3NkbC9kbGdldDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly9kYy56YWgudW5pLWhlaWRlbGJlcmcuZGUvZmxhc2hoZXJvcy9xL3NkbC9kbG1ldGEAAAE1aXZvOi8vaXZvYS5uZXQvc3RkL3NzYTo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC92b3NpI2F2YWlsYWJpbGl0eTo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC92b3NpI2NhcGFiaWxpdGllczo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC92b3NpI3RhYmxlczo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3NvZGEjc3luYy0xLjA6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvZGF0YWxpbmsjbGlua3MtMS4wAAAAynZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHAAAABvc3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3Rk
\ No newline at end of file +Radio, Millimeter, Infrared, Optical, UV, EUV, X-ray, Gamma-ray.Unambiguous reference to the resource conforming to the IVOA standard for identifiers.Resource type (something like vs:datacollection, vs:catalogservice, etc).A short name or abbreviation given to something, for presentation in space-constrained fields (up to 16 characters).The full name given to the resource.A hash-separated list of content levels specifying the intended audience.An account of the nature of the resource.URL pointing to a human-readable document describing this resource.The creator(s) of the resource in the order given by the resource record author, separated by semicolons.A hash-separated list of natures or genres of the content of the resource.The format of source_value. This, in particular, can be ``bibcode''.A single numeric value representing the angle, given in decimal degrees, by which a positional query against this resource should be ``blurred'' in order to get an appropriate match.A hash-separated list of regions of the electro-magnetic spectrum that the resource's spectral coverage overlaps with.AAAAIml2bzovL29yZy5nYXZvLmRjL2ZsYXNoaGVyb3MvcS9zc2EAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQRmxhc2gvSGVyb3MgU1NBUAAAABAARgBsAGEAcwBoAC8ASABlAHIAbwBzACAAUwBTAEEAUAAAAAAAAAEVAFMAcABlAGMAdAByAGEAIABmAHIAbwBtACAAdABoAGUAIABGAGwAYQBzAGgAIABhAG4AZAAgAEgAZQByAG8AcwAgAEUAYwBoAGUAbABsAGUAIABzAHAAZQBjAHQAcgBvAGcAcgBhAHAAaABzACAAZABlAHYAZQBsAG8AcABlAGQAIABhAHQACgBMAGEAbgBkAGUAcwBzAHQAZQByAG4AdwBhAHIAdABlACAASABlAGkAZABlAGwAYgBlAHIAZwAgAGEAbgBkACAAbQBvAHUAbgB0AGUAZAAgAGEAdAAgAEwAYQAgAFMAaQBsAGwAYQAgAGEAbgBkACAAdgBhAHIAaQBvAHUAcwAgAG8AdABoAGUAcgAKAG8AYgBzAGUAcgB2AGEAdABvAHIAaQBlAHMALgAgAFQAaABlACAAZABhAHQAYQAgAG0AbwBzAHQAbAB5ACAAYwBvAG4AdABhAGkAbgBzACAAcwBwAGUAYwB0AHIAYQAgAG8AZgAgAE8AQgAgAHMAdABhAHIAcwAuACAASABlAHIAbwBzACAAdwBhAHMACgB0AGgAZQAgAG4AYQBtAGUAIABvAGYAIAB0AGgAZQAgAGkAbgBzAHQAcgB1AG0AZQBuAHQAIABhAGYAdABlAHIAIABGAGwAYQBzAGgAIABnAG8AdAAgAGEAIABzAGUAYwBvAG4AZAAgAGMAaABhAG4AbgBlAGwAIABpAG4AIAAxADkAOQA1AC4AAAA1aHR0cDovL2RjLnphaC51bmktaGVpZGVsYmVyZy5kZS9mbGFzaGhlcm9zL3Evc3NhL2luZm8AAAArAFcAbwBsAGYALAAgAEIALgA7ACAASwBhAHUAZgBlAHIALAAgAEEALgA7ACAATQBhAG4AZABlAGwALAAgAEgALgA7ACAAUwB0AGEAaABsACwAIABPAC4AAAAAAAAAB2JpYmNvZGV/wAAAAAAAB29wdGljYWwAAAIMaHR0cDovL2RjLnphaC51bmktaGVpZGVsYmVyZy5kZS9maHNzYT86OjpweSBWTyBzZXA6OjpodHRwOi8vZGMuemFoLnVuaS1oZWlkZWxiZXJnLmRlL2ZsYXNoaGVyb3MvcS93ZWIvZm9ybTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly9kYy56YWgudW5pLWhlaWRlbGJlcmcuZGUvZmxhc2hoZXJvcy9xL3NzYS9hdmFpbGFiaWxpdHk6OjpweSBWTyBzZXA6OjpodHRwOi8vZGMuemFoLnVuaS1oZWlkZWxiZXJnLmRlL2ZsYXNoaGVyb3MvcS9zc2EvY2FwYWJpbGl0aWVzOjo6cHkgVk8gc2VwOjo6aHR0cDovL2RjLnphaC51bmktaGVpZGVsYmVyZy5kZS9mbGFzaGhlcm9zL3Evc3NhL3RhYmxlTWV0YWRhdGE6OjpweSBWTyBzZXA6OjpodHRwOi8vZGMuemFoLnVuaS1oZWlkZWxiZXJnLmRlL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly9kYy56YWgudW5pLWhlaWRlbGJlcmcuZGUvZmxhc2hoZXJvcy9xL3NkbC9kbGdldDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly9kYy56YWgudW5pLWhlaWRlbGJlcmcuZGUvZmxhc2hoZXJvcy9xL3NkbC9kbG1ldGEAAAFEaXZvOi8vaXZvYS5uZXQvc3RkL3NzYTo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC92b3NpI2F2YWlsYWJpbGl0eTo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC92b3NpI2NhcGFiaWxpdGllczo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC92b3NpI3RhYmxlczo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3NvZGEjc3luYy0xLjA6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvZGF0YWxpbmsjbGlua3MtMS4wAAAAynZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHAAAAB+c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3Rk \ No newline at end of file diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index 24d747fa9..398e54977 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -157,7 +157,7 @@ def multi_interface_fixture(mocker): # from pyvo.registry import regtap # # with open("data/multi-interface.xml", "wb") as f: -# f.write(requests.get("http://dc.g-vo.org/tap/sync", { +# f.write(requests.get(regtap.REGISTRY_BASEURL+"/sync", { # "LANG": "ADQL", # "QUERY": regtap.get_RegTAP_query( # ivoid="ivo://org.gavo.dc/flashheros/q/ssa")}).content) From eed306e60760c0c552d7bdc49056aee67ef716b0 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Mon, 2 Aug 2021 17:32:44 +0200 Subject: [PATCH 14/49] Work on interface selection by ~standard id. The effect of this commit is that you can say svc.get_service("tap") and receive a TAP service if there's a tap or tap#aux capability. You can now also say svc.get_service("web") to get a browser interface. --- pyvo/registry/regtap.py | 175 ++++++++++++++++++----------- pyvo/registry/tests/test_regtap.py | 163 ++++++++++++++++++++++++++- pyvo/registry/tests/test_rtcons.py | 14 +-- 3 files changed, 277 insertions(+), 75 deletions(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 9a97faa4d..b1b78f111 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -28,15 +28,6 @@ REGISTRY_BASEURL = os.environ.get("IVOA_REGISTRY", "http://dc.g-vo.org/tap" ).rstrip("/") -# a mapping from (base) ivoids (normalised to lowercase as in RegTAP) -# to the service classes handling the standard. -STANDARD_TO_SERVICE_CLASS = { - "ivo://ivoa.net/std/conesearch": scs.SCSService, - "ivo://ivoa.net/std/sia": sia.SIAService, - "ivo://ivoa.net/std/ssa": ssa.SSAService, - "ivo://ivoa.net/std/sla": sla.SLAService, - "ivo://ivoa.net/std/tap": tap.TAPService, -} # ADQL only has string_agg, where we need string arrays. We fake arrays # by joining elements with a token separator that we think shouldn't @@ -176,6 +167,18 @@ def getrecord(self, index): return RegistryResource(self, index) +class _BrowserService: + """A pseudo-service class just opening a web browser for browser-based + services. + """ + def __init__(self, access_url): + self.access_url = access_url + + def query(self): + import webbrowser + webbrowser.open(self.access_url, 2) + + class Interface: """ a service interface. @@ -208,6 +211,9 @@ def __init__(self, access_url, standard_id, intf_type, intf_role): self.is_standard = self.role=="std" def to_service(self): + if self.type=="vr:webbrowser": + return _BrowserService(self.access_url) + if self.standard_id is None or not self.is_standard: raise ValueError("This is not a standard interface. PyVO" " cannot speak to it.") @@ -220,6 +226,27 @@ def to_service(self): return service_class(self.access_url) + def supports(self, standard_id): + """returns true if we believe the interface should be able to talk + standard_id. + + At this point, we naively check if the interfaces's standard_id + has standard_id as a prefix. At this point, we cut off standard_id + fragments for this purpose. This works for all current DAL + standards but would, for instance, not work for VOSI. Hence, + this may need further logic if we wanted to extend our service + generation to VOSI or, perhaps, VOSpace. + + Parameters + ---------- + + standard_id : str + The ivoid of a standard. + """ + if not self.standard_id: + return False + return self.standard_id.split("#")[0]==standard_id.split("#")[0] + class RegistryResource(dalq.Record): """ @@ -255,27 +282,28 @@ class RegistryResource(dalq.Record): "source_format", "region_of_regard", "waveband", - (f"ivo_string_agg(COALESCE(access_url, ''), '{TOKEN_SEP}')", + (f"\n ivo_string_agg(COALESCE(access_url, ''), '{TOKEN_SEP}')", "access_urls"), - (f"ivo_string_agg(COALESCE(standard_id, ''), '{TOKEN_SEP}')", + (f"\n ivo_string_agg(COALESCE(standard_id, ''), '{TOKEN_SEP}')", "standard_ids"), - (f"ivo_string_agg(COALESCE(intf_type, ''), '{TOKEN_SEP}')", + (f"\n ivo_string_agg(COALESCE(intf_type, ''), '{TOKEN_SEP}')", "intf_types"), - (f"ivo_string_agg(COALESCE(intf_role, ''), '{TOKEN_SEP}')", + (f"\n ivo_string_agg(COALESCE(intf_role, ''), '{TOKEN_SEP}')", "intf_roles"),] def __init__(self, results, index, session=None): - results["access_urls"][index - ] = results["access_urls"][index].split(TOKEN_SEP) - results["standard_ids"][index - ] = results["standard_ids"][index].split(TOKEN_SEP) - results["intf_types"][index - ] = results["intf_types"][index].split(TOKEN_SEP) - results["intf_roles"][index - ] = results["intf_roles"][index].split(TOKEN_SEP) - dalq.Record.__init__(self, results, index, session) + self._mapping["access_urls" + ] = self._mapping["access_urls"].split(TOKEN_SEP) + self._mapping["standard_ids" + ] = self._mapping["standard_ids"].split(TOKEN_SEP) + self._mapping["intf_types" + ] = self._mapping["intf_types"].split(TOKEN_SEP) + self._mapping["intf_roles" + ] = self._mapping["intf_roles"].split(TOKEN_SEP) + + self.interfaces = [Interface(*props) for props in zip( self["access_urls"], @@ -401,26 +429,77 @@ def access_modes(self): For standard interfaces, get_service will return a service suitable for querying if you pass in an identifier from this list as the service_type. + + This will ignore VOSI (infrastructure) services. """ return [shorten_stdid(intf.standard_id) or "web" for intf in self.interfaces - if intf.standard_id or intf.type=="vr:webbrowser"] + if (intf.standard_id or intf.type=="vr:webbrowser") + and not intf.is_vosi] + + def get_interface(self, + service_type:str, + lax:bool=True, + std_only:bool=False): + """returns a regtap.Interface class for service_type. + + Parameters + ---------- + + The meaning of the parameters is as for get_service. This + method does not return services, though, so you can use it to + obtain access URLs and such for interfaces that pyVO does + not (directly) support. In addition, + + std_only : bool + Only return interfaces declared as "std". This is what you + want when you want to construct pyVO service objects later. + This parameter is ignored for the "web" service type. + """ + if service_type=="web": + # this works very much differently in the Registry + # than do the proper services + candidates = [intf for intf in self.interfaces + if intf.type=="vr:webbrowser"] + + else: + service_type = expand_stdid( + rtcons.SERVICE_TYPE_MAP.get( + service_type, service_type)) + + candidates = [intf for intf in self.interfaces + if ((not std_only) or intf.is_standard) + and not intf.is_vosi + and ((not service_type) or intf.supports(service_type))] + + if not candidates: + raise ValueError( + "No matching interface.") + if len(candidates)>1 and not lax: + raise ValueError("Multiple matching interfaces found." + " Perhaps pass in service_type or use a Servicetype" + " constrain in the registry.search? Or use lax=True?") + + return candidates[0] def get_service(self, service_type:str=None, - lax:bool=True, - std_only:bool=True): + lax:bool=True): """ return an appropriate DALService subclass for this resource that can be used to search the resource using service_type. - Raise a DALQueryError if the service_type is not offerend on + Raise a ValueError if the service_type is not offerend on the resource (or no standard service is offered). With - lax=False, also raise a DALQueryError if multiple interfaces + lax=False, also raise a ValueError if multiple interfaces exist for the given service_type. VOSI (infrastructure) services are always ignored here. + A magic service_type "web" can be passed in to get non-standard, + browser-based interfaces. The service in this case is an + object that opens a web browser if its query() method is called. + Parameters ---------- service_type : str @@ -431,40 +510,17 @@ def get_service(self, Otherwise, a service of the given service type will be returned. Pass in an ivoid of a standard or one of the shorthands from - rtcons.SERVICE_TYPE_MAP. + rtcons.SERVICE_TYPE_MAP, or "web" for a web page (the "service" + for this will be an object opening a web browser when you call + its query method). lax : bool If there are multiple capabilities for service_type, the function choose the first matching capability by default Pass lax=False to instead raise a DALQueryError. - - std_only : bool - Only return the interfaces complying to the standard (true - by default). This typically filters out interfaces that - can be operated by web browsers. """ - service_type = expand_stdid( - rtcons.SERVICE_TYPE_MAP.get( - service_type, service_type)) - - candidates = [intf for intf in self.interfaces - if ((not std_only) and intf.is_standard) - and not intf.is_vosi - and (not service_type and intf.standard_id==service_type)] - - if not candidates: - raise dalq.DALQueryError("No suitable interface found.") - if len(set(c.standard_id for c in candidates))>1 and not lax: - raise dalq.DALQueryError("Multiple interfaces found." - " Either pass service_type or use a Servicetype" - " constrain in the registry.search.") - - stdid = candidates[0].standard_id.split("#")[0] - if not stdid in STANDARD_TO_SERVICE_CLASS: - raise dalq.DALQueryError("PyVO does not know how to talk" - " to a {stdid} service.") - - return STANDARD_TO_SERVICE_CLASS[stdid](candidates[0].access_url) + return self.get_interface(service_type, lax, std_only=True + ).to_service() @property def service(self): @@ -598,11 +654,4 @@ def ivoid2service(ivoid, servicetype=None): # there is only one. resource = resources[0] - if servicetype: - return resource.get_service(servicetype, lax=True) - - else: - return [STANDARD_TO_SERVICE_CLASS[interface.standard_id - ](interface.access_url) - for interface in resource.interfaces - if interface.standard_id in STANDARD_TO_SERVICE_CLASS] + return resource.get_service(servicetype, lax=True) diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index 398e54977..ed5826319 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -168,6 +168,12 @@ def multi_interface_fixture(mocker): yield matcher +@pytest.fixture() +def flash_service(multi_interface_fixture): + return regtap.search( + ivoid="ivo://org.gavo.dc/flashheros/q/ssa")[0] + + class TestInterfaceClass: def test_basic(self): intf = regtap.Interface("http://example.org", "", "", "") @@ -250,14 +256,161 @@ def test_bad_servicetype_aux(): regsearch(servicetype='bad_servicetype', includeaux=True) -@pytest.mark.usefixtures('multi_interface_fixture', 'capabilities') +@pytest.mark.usefixtures('multi_interface_fixture', 'capabilities', + 'flash_service') class TestInterfaceSelection: - def test_interfaces_shown(self): + def test_exactly_one_result(self): results = regtap.search( ivoid="ivo://org.gavo.dc/flashheros/q/ssa") assert len(results) == 1 - rec = results[0] - assert set(rec.access_modes()) == { + + def test_access_modes(self, flash_service): + assert set(flash_service.access_modes()) == { 'datalink#links-1.0', 'soda#sync-1.0', 'ssa', 'tap#aux', - 'vosi#availability', 'vosi#capabilities', 'vosi#tables', 'web'} + + def test_get_web_interface(self, flash_service): + svc = flash_service.get_service("web") + assert isinstance(svc, + regtap._BrowserService) + assert (svc.access_url + == "http://dc.zah.uni-heidelberg.de/flashheros/q/web/form") + + def test_get_aux_interface(self, flash_service): + svc = flash_service.get_service("tap#aux") + assert (svc._baseurl + == "http://dc.zah.uni-heidelberg.de/tap") + + def test_get_aux_as_main(self, flash_service): + assert (flash_service.get_service("tap")._baseurl + == "http://dc.zah.uni-heidelberg.de/tap") + + def test_get__main_from_aux(self, flash_service): + assert (flash_service.get_service("tap")._baseurl + == "http://dc.zah.uni-heidelberg.de/tap") + + def test_get_by_alias(self, flash_service): + assert (flash_service.get_service("spectrum")._baseurl + == "http://dc.zah.uni-heidelberg.de/fhssa?") + + def test_get_unsupported_standard(self, flash_service): + with pytest.raises(ValueError) as excinfo: + flash_service.get_service("soda#sync-1.0") + + assert str(excinfo.value) == ( + "PyVO has no support for interfaces with standard id" + " ivo://ivoa.net/std/soda#sync-1.0.") + + def test_get_nonexisting_standard(self, flash_service): + with pytest.raises(ValueError) as excinfo: + flash_service.get_service("http://nonsense#fancy") + + assert str(excinfo.value) == ( + "No matching interface.") + + def test_unconstrained(self, flash_service): + with pytest.raises(ValueError) as excinfo: + flash_service.get_service(lax=False) + + assert str(excinfo.value) == ( + "Multiple matching interfaces found. Perhaps pass in" + " service_type or use a Servicetype constrain in the" + " registry.search? Or use lax=True?") + + +class _FakeResult: + """A fake class just sufficient for giving dal.query.Record enough + to pull in the dict this is constructed. + + As an extra service, list values are stringified with + regtap.TOKEN_SEP -- this is how they ought to come in from + RegTAP services. + """ + def __init__(self, d): + self.fieldnames = list(d.keys()) + vals = [regtap.TOKEN_SEP.join(v) if isinstance(v, list) else v + for v in d.values()] + class _: + class array: + data = [vals] + self.resultstable = _ + + +def _makeRegistryRecord(overrides): + """returns a minimal RegistryResource instance, overriding + some built-in defaults with the dict overrides. + """ + defaults = { + "access_urls": "", + "standard_ids": "", + "intf_types": "", + "intf_roles": "", + } + defaults.update(overrides) + return regtap.RegistryResource(_FakeResult(defaults), 0) + + +class TestInterfaceRejection: + """tests for various artificial corner cases where interface selection + should fail (or just not fail). + """ + def test_nonunique(self): + rsc = _makeRegistryRecord({ + "access_urls": ["http://a", "http://b"], + "standard_ids": ["ivo://ivoa.net/std/tap"]*2, + "intf_types": ["vs:paramhttp"]*2, + "intf_roles": ["std"]*2, + }) + with pytest.raises(ValueError) as excinfo: + rsc.get_service("tap", lax=False) + + assert str(excinfo.value) == ( + "Multiple matching interfaces found. Perhaps pass in" + " service_type or use a Servicetype constrain in the" + " registry.search? Or use lax=True?") + + def test_nonunique_lax(self): + rsc = _makeRegistryRecord({ + "access_urls": ["http://a", "http://b"], + "standard_ids": ["ivo://ivoa.net/std/tap"]*2, + "intf_types": ["vs:paramhttp"]*2, + "intf_roles": ["std"]*2, + }) + + assert (rsc.get_service("tap")._baseurl + == "http://a") + + def test_nonstd_ignored(self): + rsc = _makeRegistryRecord({ + "access_urls": ["http://a", "http://b"], + "standard_ids": ["ivo://ivoa.net/std/tap"]*2, + "intf_types": ["vs:paramhttp"]*2, + "intf_roles": ["std", ""] + }) + + assert (rsc.get_service("tap", lax=False)._baseurl + == "http://a") + + def test_select_single_matching_service(self): + rsc = _makeRegistryRecord({ + "access_urls": ["http://a", "http://b"], + "standard_ids": ["", "ivo://ivoa.net/std/tap"], + "intf_types": ["vs:webbrowser", "vs:paramhttp"], + "intf_roles": ["", "std"] + }) + + assert (rsc.service._baseurl == "http://b") + + def test_capless(self): + rsc = _makeRegistryRecord({ + "access_urls": "", + "standard_ids": "", + "intf_types": "", + "intf_roles": "", + }) + + with pytest.raises(ValueError) as excinfo: + rsc.service._baseurl + + assert str(excinfo.value) == ( + "No matching interface.") diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index 7bc65c4a0..47bd6b28e 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -223,12 +223,12 @@ def test_expected_columns(self): # is changed. Just update the assertion then. assert rtcons.build_regtap_query( rtcons.keywords_to_constraints({"author": "%Hubble%"}) - ).split("\nFROM rr.resource\n")[0] == ( + ).split("\nFROM\nrr.resource\n")[0] == ( "SELECT\n" "ivoid, " "res_type, " "short_name, " - "title, " + "res_title, " "content_level, " "res_description, " "reference_url, " @@ -237,10 +237,10 @@ def test_expected_columns(self): "source_format, " "region_of_regard, " "waveband, " - "ivo_string_agg(access_url, ':::py VO sep:::') AS access_urls, " - "ivo_string_agg(standard_id, ':::py VO sep:::') AS standard_ids, " - "ivo_string_agg(intf_type, ':::py VO sep:::') AS intf_types, " - "ivo_string_agg(intf_role, ':::py VO sep:::') AS intf_roles") + "\n ivo_string_agg(COALESCE(access_url, ''), ':::py VO sep:::') AS access_urls, " + "\n ivo_string_agg(COALESCE(standard_id, ''), ':::py VO sep:::') AS standard_ids, " + "\n ivo_string_agg(COALESCE(intf_type, ''), ':::py VO sep:::') AS intf_types, " + "\n ivo_string_agg(COALESCE(intf_role, ''), ':::py VO sep:::') AS intf_roles") def test_group_by_columns(self): # Again, this will break as regtap.RegistryResource.expected_columns @@ -250,7 +250,7 @@ def test_group_by_columns(self): "ivoid, " "res_type, " "short_name, " - "title, " + "res_title, " "content_level, " "res_description, " "reference_url, " From df923b0bf737eac092b2b99f995c51220a88fe88 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Tue, 3 Aug 2021 11:01:13 +0200 Subject: [PATCH 15/49] Adding to_table() to RegistryResults for nicer interactive results. --- pyvo/registry/regtap.py | 22 ++++++++++++++++++++++ pyvo/registry/tests/test_regtap.py | 15 +++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index b1b78f111..3328cfbff 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -17,6 +17,9 @@ """ import functools import os + +from astropy import table + from . import rtcons from ..dal import scs, sia, ssa, sla, tap, query as dalq from ..utils.formatting import para_format_desc @@ -166,6 +169,25 @@ def getrecord(self, index): """ return RegistryResource(self, index) + def to_table(self): + """ + returns a brief overview of the matched results as an astropy table. + + This is mainly intended for interactive use, where people would + like to inspect the matches in, perhaps, notebooks. + """ + return table.Table([ + list(range(len(self))), + [r.res_title for r in self], + [r.res_description for r in self], + [", ".join(r.access_modes()) for r in self]], + names=("index", "title", "description", "interfaces"), + descriptions=( + "Index to access the resource within self", + "Resource title", + "Resource description", + "Access modes offered")) + class _BrowserService: """A pseudo-service class just opening a web browser for browser-based diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index ed5826319..58463b641 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -256,6 +256,21 @@ def test_bad_servicetype_aux(): regsearch(servicetype='bad_servicetype', includeaux=True) +@pytest.mark.usefixtures('multi_interface_fixture', 'capabilities') +class TestResultsExtras: + def test_to_table(self): + t = regtap.search( + ivoid="ivo://org.gavo.dc/flashheros/q/ssa").to_table() + assert (list(t.columns.keys()) + == ['index', 'title', 'description', 'interfaces']) + assert t["index"][0] == 0 + assert t["title"][0] == 'Flash/Heros SSAP' + assert (t["description"][0][:40] + == 'Spectra from the Flash and Heros Echelle') + assert (t["interfaces"][0] + == 'ssa, web, tap#aux, soda#sync-1.0, datalink#links-1.0') + + @pytest.mark.usefixtures('multi_interface_fixture', 'capabilities', 'flash_service') class TestInterfaceSelection: From c411f8bb6021fe325fe475e9ac061d79db071974 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Tue, 3 Aug 2021 11:22:16 +0200 Subject: [PATCH 16/49] Adding a get_contact method to RegistryResource to figure out who could do tech support. --- pyvo/registry/regtap.py | 25 +++++++++++++++++++++++++ pyvo/registry/tests/test_regtap.py | 25 +++++++++++++++++++------ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 3328cfbff..c3a70ef47 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -652,6 +652,31 @@ def describe(self, verbose=False, width=78, file=None): if self.reference_url: print("More info: " + self.reference_url, file=file) + def get_contact(self): + """ + return contact information for this resource in a string. + + Use this to report bugs or unexpected downtime. + """ + res = get_RegTAP_service().run_sync(""" + SELECT role_name, email, telephone + FROM rr.res_role + WHERE + base_role='contact' + AND ivoid={}""".format( + rtcons.make_sql_literal(self.ivoid))) + + contacts = [] + for row in res: + contact = row["role_name"] + if row["telephone"]: + contact += f" ({row['telephone']})" + if row["email"]: + contact += f" <{row['email']}>" + contacts.append(contact) + + return "\n".join(contacts) + def ivoid2service(ivoid, servicetype=None): """Return service(s) for a given IVOID. diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index 58463b641..298b88986 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -274,6 +274,10 @@ def test_to_table(self): @pytest.mark.usefixtures('multi_interface_fixture', 'capabilities', 'flash_service') class TestInterfaceSelection: + """ + tests for the selection and generation of services within + RegistryResource. + """ def test_exactly_one_result(self): results = regtap.search( ivoid="ivo://org.gavo.dc/flashheros/q/ssa") @@ -417,15 +421,24 @@ def test_select_single_matching_service(self): assert (rsc.service._baseurl == "http://b") def test_capless(self): - rsc = _makeRegistryRecord({ - "access_urls": "", - "standard_ids": "", - "intf_types": "", - "intf_roles": "", - }) + rsc = _makeRegistryRecord({}) with pytest.raises(ValueError) as excinfo: rsc.service._baseurl assert str(excinfo.value) == ( "No matching interface.") + + +class TestExtraResourceMethods: + """ + tests for methods of RegistryResource containing some non-trivial + logic (except service selection, which is in TestInterfaceSelection. + """ + @pytest.mark.remote_data + def test_get_contact(self): + rsc = _makeRegistryRecord( + {"ivoid": "ivo://org.gavo.dc/flashheros/q/ssa"}) + assert (rsc.get_contact() + == "GAVO Data Center Team (++49 6221 54 1837)" + " ") From ee73babb047828decdbee8cc1e31a339757987b0 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Tue, 3 Aug 2021 12:38:23 +0200 Subject: [PATCH 17/49] Adding a get_tables method to RegistryResources --- pyvo/registry/regtap.py | 82 +++++++++++++++++++++++++++++- pyvo/registry/rtcons.py | 2 +- pyvo/registry/tests/test_regtap.py | 70 ++++++++++++++++++++++++- 3 files changed, 150 insertions(+), 4 deletions(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index c3a70ef47..4bea7c86e 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -22,6 +22,7 @@ from . import rtcons from ..dal import scs, sia, ssa, sla, tap, query as dalq +from ..io.vosi import vodataservice from ..utils.formatting import para_format_desc @@ -676,10 +677,87 @@ def get_contact(self): contacts.append(contact) return "\n".join(contacts) - + + def _build_vosi_column(self, column_row): + """ + return a io.vosi.vodataservice.Column element for a + query result from get_tables. + """ + res = vodataservice.TableParam() + for att_name in ["name", "ucd", "unit", "utype"]: + setattr(res, att_name, column_row[att_name]) + res.description = column_row["column_description"] + +# TODO: be more careful with the type; this isn't necessarily a +# VOTable type (regrettably) + res.datatype = vodataservice.VOTableType( + arraysize=column_row["arraysize"], + extendedType=column_row["extended_type"]) + res.datatype.content = column_row["datatype"] + + return res + + def _build_vosi_table(self, table_row, columns): + """ + return a io.vosi.vodataservice.Table element for a + query result from get_tables. + """ + res = vodataservice.Table() + res.name = table_row["table_name"] + res.title = table_row["table_title"] + res.description = table_row["table_description"] + res._columns = [ + self._build_vosi_column(row) + for row in columns] + return res + + def get_tables(self, table_limit=20): + """ + return the structure of the tables underlying the service. + + This returns a dict with table names as keys and vosi.Table + objects as values (pretty much what tables returns for a TAP + service). + + Note that not only TAP services can (and do) define table + structures. The meaning of non-TAP tables is not always + as clear. + + Also note that resources do not need to define tables at all. + You will receive an empty dictionary if they don't. + """ + svc = get_RegTAP_service() + + tables = svc.run_sync( + """SELECT table_name, table_description, table_index, table_title + FROM rr.res_table + WHERE ivoid={}""".format( + rtcons.make_sql_literal(self.ivoid))) + if len(tables)>table_limit: + raise dalq.DALQueryError(f"Resource {self.ivoid} reports" + f" {len(tables)} tables. Pass a higher table_limit" + " to see them all.") + + res = {} + for table_row in tables: + columns = svc.run_sync( + """ + SELECT name, ucd, unit, utype, datatype, arraysize, + extended_type, column_description + FROM rr.table_column + WHERE ivoid={} + AND table_index={}""".format( + rtcons.make_sql_literal(self.ivoid), + rtcons.make_sql_literal(table_row["table_index"]))) + res[table_row["table_name"]] = self._build_vosi_table( + table_row, columns) + + return res + def ivoid2service(ivoid, servicetype=None): - """Return service(s) for a given IVOID. + """ + return service(s) for a given IVOID. The servicetype option specifies the kind of service requested (conesearch, sia, ssa, slap, or tap). By default, if none is diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 10eaea1c9..eaebf1ddc 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -51,7 +51,7 @@ def make_sql_literal(value): elif isinstance(value, bytes): return "'{}'".format(value.decode("ascii").replace("'", "''")) - elif isinstance(value, int): + elif isinstance(value, (int, numpy.integer)): return "{:d}".format(value) elif isinstance(value, (float, numpy.floating)): diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index 298b88986..ee558e182 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -3,8 +3,11 @@ """ Tests for pyvo.registry.regtap """ + +import re from functools import partial from urllib.parse import parse_qsl + import pytest from pyvo.registry import regtap @@ -433,7 +436,8 @@ def test_capless(self): class TestExtraResourceMethods: """ tests for methods of RegistryResource containing some non-trivial - logic (except service selection, which is in TestInterfaceSelection. + logic (except service selection, which is in TestInterfaceSelection, + and get_tables, which is in TestGetTables). """ @pytest.mark.remote_data def test_get_contact(self): @@ -442,3 +446,67 @@ def test_get_contact(self): assert (rsc.get_contact() == "GAVO Data Center Team (++49 6221 54 1837)" " ") + + +# TODO: While I suppose the contact test should keep requiring network, +# I think we should can the network responses involved in the following; +# the stuff might change upstream any time and then break our unit tests. +@pytest.mark.remote_data +@pytest.fixture() +def flash_tables(): + rsc = _makeRegistryRecord( + {"ivoid": "ivo://org.gavo.dc/flashheros/q/ssa"}) + return rsc.get_tables() + + +@pytest.mark.usefixtures("flash_tables") +class TestGetTables: + @pytest.mark.remote_data + def test_get_tables_limit_enforced(self): + rsc = _makeRegistryRecord( + {"ivoid": "ivo://org.gavo.dc/tap"}) + with pytest.raises(dalq.DALQueryError) as excinfo: + rsc.get_tables() + + assert re.match(r"Resource ivo://org.gavo.dc/tap reports \d+ tables." + " Pass a higher table_limit to see them all.", str(excinfo.value)) + + @pytest.mark.remote_data + def test_get_tables_names(self, flash_tables): + assert (list(sorted(flash_tables.keys())) + == ["flashheros.data", "ivoa.obscore"]) + + @pytest.mark.remote_data + def test_get_tables_table_instance(self, flash_tables): + assert (flash_tables["ivoa.obscore"].name + == "ivoa.obscore") + assert (flash_tables["ivoa.obscore"].description + == "This data collection is queriable in GAVO Data" + " Center's obscore table.") + assert (flash_tables["flashheros.data"].title + == "Flash/Heros SSA table") + + @pytest.mark.remote_data + def test_get_tables_column_meta(self, flash_tables): + def getflashcol(name): + for col in flash_tables["flashheros.data"].columns: + if name==col.name: + return col + raise KeyError(name) + + assert getflashcol("accref").datatype.content == "char" + assert getflashcol("accref").datatype.arraysize == "*" + +# TODO: upstream bug: the following needs to fixed in DaCHS before +# the assertion passes + # assert getflashcol("ssa_region").datatype._extendedtype == "point" + + assert getflashcol("mime").ucd == 'meta.code.mime' + + assert getflashcol("ssa_specend").unit == "m" + + assert (getflashcol("ssa_specend").utype + == "ssa:char.spectralaxis.coverage.bounds.stop") + + assert (getflashcol("ssa_fluxcalib").description + == "Type of flux calibration") From 10ce5ceadfc2b2d3940194ea3079234f508a9a13 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Thu, 5 Aug 2021 13:19:57 +0200 Subject: [PATCH 18/49] Adding a UCD constraint. Also, changing the default endpoint to reg.g-vo.org, which is dc.g-vo with failovers in case anything is funny in Heidelberg. --- pyvo/registry/__init__.py | 4 ++++ pyvo/registry/regtap.py | 8 ++++---- pyvo/registry/rtcons.py | 20 ++++++++++++++++++++ pyvo/registry/tests/test_rtcons.py | 9 ++++++++- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/pyvo/registry/__init__.py b/pyvo/registry/__init__.py index 0e50e28fa..94a94680d 100644 --- a/pyvo/registry/__init__.py +++ b/pyvo/registry/__init__.py @@ -5,6 +5,10 @@ The regtap module supports access to the IVOA Registries """ from . import regtap +from .rtcons import (Constraint, + Freetext, Author, Servicetype, Waveband, Datamodel, Ivoid, + UCD, + build_regtap_query) search = regtap.search ivoid2service = regtap.ivoid2service diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 4bea7c86e..96c523461 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -29,7 +29,7 @@ __all__ = ["search", "get_RegTAP_query", "RegistryResource", "RegistryResults", "ivoid2service"] -REGISTRY_BASEURL = os.environ.get("IVOA_REGISTRY", "http://dc.g-vo.org/tap" +REGISTRY_BASEURL = os.environ.get("IVOA_REGISTRY", "http://reg.g-vo.org/tap" ).rstrip("/") @@ -181,7 +181,7 @@ def to_table(self): list(range(len(self))), [r.res_title for r in self], [r.res_description for r in self], - [", ".join(r.access_modes()) for r in self]], + [", ".join(sorted(r.access_modes())) for r in self]], names=("index", "title", "description", "interfaces"), descriptions=( "Index to access the resource within self", @@ -455,10 +455,10 @@ def access_modes(self): This will ignore VOSI (infrastructure) services. """ - return [shorten_stdid(intf.standard_id) or "web" + return set(shorten_stdid(intf.standard_id) or "web" for intf in self.interfaces if (intf.standard_id or intf.type=="vr:webbrowser") - and not intf.is_vosi] + and not intf.is_vosi) def get_interface(self, service_type:str, diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index eaebf1ddc..808a05cf4 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -312,6 +312,26 @@ def __init__(self, ivoid): self._fillers = {"ivoid": ivoid} +class UCD(Constraint): + """ + A constraint selecting resources having tables with columns having + UCDs matching a SQL pattern (% as wildcard). Multiple patterns may + be passed in and are joined by OR. + """ + _keyword = "ucd" + + def __init__(self, *patterns): + self._extra_tables = ["rr.table_column"] + self._condition = " OR ".join( + f"ucd LIKE {{ucd{i}}}" for i in range(len(patterns))) + self._fillers = dict((f"ucd{index}", pattern) + for index, pattern in enumerate(patterns)) + + +# NOTE: If you add new Contraint-s, don't forget to add them in +# registry.__init__ and in docs/registry/index.rst. + + def build_regtap_query(constraints): """returns a RegTAP query ready for submission from a list of Constraint instances. diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index 47bd6b28e..a8d1c9887 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -174,6 +174,13 @@ def test_basic(self): "ivoid = 'ivo://example/some_path'") +class TestUCDConstraint: + def test_basic(self): + cons = rtcons.UCD("phot.mag;em.opt.%", "phot.mag;em.ir.%") + assert (cons.get_search_condition() == + "ucd LIKE 'phot.mag;em.opt.%' OR ucd LIKE 'phot.mag;em.ir.%'") + + class TestWhereClauseBuilding: @staticmethod def where_clause_for(*args, **kwargs): @@ -214,7 +221,7 @@ def test_bad_keyword(self): # go. assert str(excinfo.value) == ("foo is not a valid registry" " constraint keyword. Use one of" - " author, datamodel, ivoid, keywords, servicetype, waveband.") + " author, datamodel, ivoid, keywords, servicetype, ucd, waveband.") class TestSelectClause: From da6d4c37dba09266b87a28c6498760758cc562ce Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Thu, 5 Aug 2021 16:06:21 +0200 Subject: [PATCH 19/49] Draft update of the registry introduction. --- docs/registry/index.rst | 276 ++++++++++++++++++++++++++++++++++---- pyvo/registry/__init__.py | 9 +- pyvo/registry/regtap.py | 2 +- 3 files changed, 253 insertions(+), 34 deletions(-) diff --git a/docs/registry/index.rst b/docs/registry/index.rst index 886f3d391..7038129f0 100644 --- a/docs/registry/index.rst +++ b/docs/registry/index.rst @@ -4,58 +4,280 @@ Registry (`pyvo.registry`) ************************** -This subpackage let you find data access services using search parameters. +This is an interface to the Virtual Observatory Registry, a collection +of metadata records of the VO's “resources” (which is jargon for: a +collection of datasets, usually with a service in front of it). For a +wider background, see `2014A&C.....7..101D`_ for the general +architecture and `2015A&C....10...88D`_ for the search interfaces. -Getting started +.. _2014A&C.....7..101D: https://ui.adsabs.harvard.edu/abs/2014A%26C.....7..101D/abstract +.. _2015A&C....10...88D: https://ui.adsabs.harvard.edu/abs/2015A%26C....10...88D/abstract + +There are two fundamental modes of searching in the VO: + +(a) Data discovery: This is when you are looking for some sort of data + collection based on its metadata; a classical example would be: “I + need redshifts of extragalactic H II regions.” + +(b) Service discovery: This is what you need when you want to query all + services of a certain kind (e.g., „all spectral services claiming to + have infrared data“), which in turn is the basis of all-VO *dataset* + discovery (“give me all infrared spectra of 3C273”) + +Both modes are supported by this module; in principle, for (b) you +generally constrain the service type. + + +Basic interface =============== -Registry searches are performed using the :py:meth:`pyvo.registry.search` -method. - >>> from pyvo.registry import search as regsearch -It is possible to match against a list of ``keywords`` to find resources -related to a particular topic, for instances services containing data about -quasars. +The main interface for the module is :py:meth:`pyvo.registry.search`; +the examples below assume:: + + >>> from pyvo import registry + +This function accepts one or more search constraints, which can be +either specificed using constraint objects as positional arguments or as +keyword arguments. The following constraints are available: + +* :py:class:`pyvo.registry.Freetext` (``keywords``): one or more + freetext words, mached in the title, description or subject of the + resource. +* :py:class:`pyvo.registry.Servicetype` (``servicetype``): constrain to + one of tap, ssa, sia, conesearch. This is the constraint you want + to use for service discovery. +* :py:class:`pyvo.registry.UCD` (``ucd``): constrain by one or more UCD + patterns; resources match when they serve columns having a matching + UCD (e.g., ``phot.mag;em.ir.%`` for “any infrared magnitude”). +* :py:class:`pyvo.registry.Waveband` (``waveband``): one or more terms + from the vocabulary at http://www.ivoa.net/messenger giving the rough + spectral location of the resource. +* :py:class:`pyvo.registry.Author` (``author``): an author (“creator”). + This is a single SQL pattern, and given the sloppy practicies in the + VO, you should probably generously use wildcards. +* :py:class:`pyvo.registry.Datamodel` (``datamodel``): one of obscore, + epntap, or regtap: only return TAP services having tables of this + kind. +* :py:class:`pyvo.registry.Ivoid` (``ivoid``): exactly match a single + IVOA identifier (that is, in effect, the primary key in the VO). + +Hence, to look for for resources with UV data mentioning white dwarfs +you could either run:: + + >>> registry.search(keywords="white dwarf", waveband="UV") + +or:: + + >>> registry.search(registry.Fulltext("white dwarf"), + ... registry.Waveband("UV")) + +or a mixture between the two. In general, constructing using explicit +constraints is generally preferable with more complex queries. Where +the constraints accept multiple arguments, you can pass in sequences to +the keyword arguments; for instance:: + + >>> registry.search(registry.Waveband("Radio", "Submillimeter")) + +is equivalent to:: + + >>> registry.search(waveband=["Radio", "Submillimeter"]) + +There is also :py:meth:pyvo.registry.get_RegTAP_query, accepting the +same arguments as :py:meth:`pyvo.registry.search`. This function simply +returns the ADQL query that search would execute. This is may be useful +to construct custom RegTAP queries. These queries should execute on all +TAP services implementing the ``regtap`` data model. + + +Data Discovery +============== + +In data discovery, you look for resources matching your constraints and +then figure out in a second step how to query them. For instance, to +look for resources giving redshifts for quasars, you would say:: + + >>> resources = registry.search(registry.UCD("src.redshift"), + ... registry.Freetext("supernova")) -.. doctest-remote-data:: +``resources`` now is an instance of +:py:class:`pyvo.registry.RegistryResults`, which you can iterate. In +interactive data discovery, however, it is usually preferable to use the +``to_table`` method for an overview of the resources available:: - >>> services = regsearch(keywords=['quasar']) + >>> resources.to_table() + + index title ... interfaces + int32 str67 ... str24 + ----- --------------------------------------------------------------- ... ------------------------ + 0 Asiago Supernova Catalogue (Barbon et al., 1999-) ... conesearch, tap#aux, web + 1 Asiago Supernova Catalogue (Version 2008-Mar) ... conesearch, tap#aux, web + 2 Sloan Digital Sky Survey-II Supernova Survey (Sako+, 2018) ... conesearch, tap#aux, web + ... -A single keyword can be specified as a single string instead of a list. -.. doctest-remote-data:: +The idea is that in notebook-like interfaces you can pick resources by +title, description, and perhaps the access mode (“interface”) offered. +In the list of interfaces, ignore any ``#aux``; it is a minor VO +technicality, and you can construct :py:class:`pyvo.dal.TAPService`-s +(say) from ``tap#aux`` interfaces. - >>> services = regsearch(keywords='quasar') +Once you have found a resource you would like to query, pick it by index +(which, obviously will not be stable across time; use a resource's ivoid +to recover it later; cf. the :py:class:`pyvo.registry.Ivoid` +constraint). Use the ``get_service`` method of +:py:class:`pyvo.registry.RegistryResource` to obtain a DAL service +object. To query the fourth match using simple conesearch, you would +thus say:: -Furthermore the search can be limited to a certain ``servicetype``, one of -sia, ssa, scs, sla, tap. + >>> resources[4].get_service("conesearch").search(pos=(120, 73), sr=1) +
+ _r recno SN r_SN z sI e_sI t1 e_t1 I1 e_I1 t2 e_t2 I2 e_I2 chi2 N Simbad _RA _DE + deg d d mag mag d d mag mag deg deg + float64 int32 str6 uint8 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 int16 str6 float64 float64 + -------- ----- ----- ----- ------- ------- ------- ------- ------- ------- ------- ------- ------- ------- ------- ------- ----- ------ --------- --------- + 0.588592 19 1995E 3 0.012 1.026 0.040 0.067 0.635 15.393 0.024 26.340 0.950 16.093 0.050 6.78 14 Simbad 117.98646 73.00961 -.. doctest-remote-data:: - >>> services = regsearch(keywords=['quasar'], servicetype='tap') +To operate TAP services, you need to know what tables make up a +resource. Use the ``get_tables`` method for that, which returns a +dictionary much like what :py:class:pyvo.dal.TAPService's ``tables`` +attribute:: -Filtering by the desired waveband is also possible. + >>> tables = resources[4].get_tables() + >>> list(tables.keys()) + ['J/A+A/437/789/table2'] + >>> tables['J/A+A/437/789/table2'].columns + [, , , , , , , , , , , , , , , , , , ] -.. doctest-remote-data:: +In this case, this is a table with one of VizieR's somewhat funky names. +To run a TAP query based on this metadata, do something like:: - >>> services = regsearch( - ... keywords=['quasar'], servicetype='tap', waveband='x-ray') + >>> resources[4].get_service("tap#aux").run_sync( + ... 'SELECT sn, z FROM "J/A+A/437/789/table2" WHERE z>0.04') +
+ SN z + object float64 + ------ ------- + 1992bh 0.045 + 1992bp 0.079 + 1993ag 0.049 + 1993O 0.051 -And at last, the data model can be specified. +A special sort of access mode is ``web``. This is some facility related +to the resource that works in a web browser. You can ask for a +“service” there, too; you will then receive an object that has a +``search`` method, and when you call this, a browser window should open +with the query facility (this uses python's webbrowser module):: -.. doctest-remote-data:: + resources[4].get_service("web").query() - >>> obscore_services = regsearch(datamodel='ObsCore') +Note that for interactive data discovery in the VO Registry, you may +also want to have a look at Aladin's discovery tree, TOPCAT's VO menu, +or at services like DataScope_ or WIRR_ in your web browser. + +.. _DataScope: https://heasarc.gsfc.nasa.gov/cgi-bin/vo/datascope/init.pl +.. _WIRR: https://dc.g-vo.org/WIRR + + +Service Discovery +================= + +Service discovery is what you want typcially in connection with a search +for datasets, as in “Give me all infrared spectra of Bellatrix“. To to +that, you want to run the same DAL query against all the services of a +given sort. This means that you will have to include a servicetype +constraint. + +The result of this is that the ``access_modes`` of your results are +always of the same sort. When that is the case, you can use +RegistryResource's ``service`` attribute, which returns a DAL service +instance. The opening example could be written like this:: + +>>> from astropy.coordinates import SkyCoord +>>> my_obj = SkyCoord.from_name("Bellatrix") +>>> for res in registry.search(waveband="infrared", servicetype="spectrum"): +... print(res.service.search(pos=my_obj, size=0.001)) +... + +In reality, you will have to add some error handling to this kind of +all-VO queries: in a wide and distributed network, some service is +always down. + +The central point is: With a servicetype constraint, each result has +a well-defined ``service`` attribute that contains some subclass of +dal.Service and that can be queried in a uniform fashion. + +TAP services may provide tables in well-defined data models, like +EPN-TAP or obscore. These can be queried in similar loops, although +some care has to be taken. In the obscore case, an all-VO query would +look like this:: + +>>> for svc_rec in registry.search(datamodel="obscore"): +... print(svc_rec.service.run_sync( +... "SELECT DISTINCT dataproduct_type FROM ivoa.obscore")) + +Again, in production this needs explicit handling of failing services. +For an example of how this might look like, see `GAVO's plate tutorial`_ + +.. _GAVO's plate tutorial: http://docs.g-vo.org/gavo_plates.pdf Search results ============== -Registry search results are similar to :ref:`pyvo-resultsets`. -See :py:class:`pyvo.registry.regtap.RegistryResource` for a listing of row -attributes. +What is coming back from registry.search is rather similar to +:ref:`pyvo-resultsets`; just remember that for interactive use there is +the ``to_tables`` method introduced above. + +The individual items are instances of +:py:class:`pyvo.registry.regtap.RegistryResource`, which expose many +pieces of metadata (e.g., title, description, creators, etc) in +attributes named like their RegTAP counterparts (see the class +documentation). A few attributes deserve a second look. + +First, ``service`` will, for resources that only have a single +capability, return a DAL service object ready for querying using the +respective protocol. You should only use that attribute when the +original reqistry query constrained the service type, because otherwise +there is no telling what kind of service you will get back. + +When the registry query did not constrain the service type, you can use +the ``access_modes`` method to see what capabilities are available. For +instance:: + + >>> res = registry.search(ivoid="ivo://org.gavo.dc/flashheros/q/ssa")[0] + >>> res.access_modes() + {'ssa', 'datalink#links-1.0', 'tap#aux', 'web', 'soda#sync-1.0'} + +– this service can be accessed through SSA, TAP, a web interface, and +two special capabilities that pyvo cannot produce services for (mainly +because standalone service objects do not make much sense for them). + +To obtain a service for one of the access modes, use +``get_service(mode)``. For ``web``, this returns an object that opens a +web browser window when its ``query`` method is called. + +RegistryResource-s also have a ``get_contact`` method. Use this if the +service is down or seems to have bugs; you should in general get at +least an e-Mail address:: + + >>> res.get_contact() + 'GAVO Data Center Team (++49 6221 54 1837) ' + +Finally, the registry has an idea of what kind of tables are published +through a resource, much like the VOSI tables endpoint (as a matter of +fact, the Registry should contain exactly what is there; but you can +access that data all in one table in the registry). Not all publishers +properly provide table metadata to the Registry, but most do these days, +and then you can run:: + + >>> res.get_tables() + {'ivoa.obscore':
... 0 columns ...
, 'flashheros.data': ... 29 columns ...
} + Reference/API ============= .. automodapi:: pyvo.registry .. automodapi:: pyvo.registry.regtap +.. automodapi:: pyvo.registry.rtcons diff --git a/pyvo/registry/__init__.py b/pyvo/registry/__init__.py index 94a94680d..9dab36e64 100644 --- a/pyvo/registry/__init__.py +++ b/pyvo/registry/__init__.py @@ -4,13 +4,10 @@ The regtap module supports access to the IVOA Registries """ -from . import regtap +from .regtap import search, ivoid2service, get_RegTAP_query + from .rtcons import (Constraint, Freetext, Author, Servicetype, Waveband, Datamodel, Ivoid, - UCD, - build_regtap_query) - -search = regtap.search -ivoid2service = regtap.ivoid2service + UCD) __all__ = ["search"] diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 96c523461..f56cc66c1 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -197,7 +197,7 @@ class _BrowserService: def __init__(self, access_url): self.access_url = access_url - def query(self): + def search(self): import webbrowser webbrowser.open(self.access_url, 2) From e9a2be8635de7a800b5dfc47cf52ec93b1c998cd Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Fri, 6 Aug 2021 11:09:42 +0200 Subject: [PATCH 20/49] Editorial work on the documentation --- docs/registry/index.rst | 92 +++++++++++++++++++++------------------ pyvo/registry/__init__.py | 3 +- pyvo/registry/rtcons.py | 28 ++++++++---- 3 files changed, 70 insertions(+), 53 deletions(-) diff --git a/docs/registry/index.rst b/docs/registry/index.rst index 7038129f0..afecf9788 100644 --- a/docs/registry/index.rst +++ b/docs/registry/index.rst @@ -5,7 +5,7 @@ Registry (`pyvo.registry`) ************************** This is an interface to the Virtual Observatory Registry, a collection -of metadata records of the VO's “resources” (which is jargon for: a +of metadata records of the VO's “resources” (“resource” is jargon for: a collection of datasets, usually with a service in front of it). For a wider background, see `2014A&C.....7..101D`_ for the general architecture and `2015A&C....10...88D`_ for the search interfaces. @@ -16,16 +16,15 @@ architecture and `2015A&C....10...88D`_ for the search interfaces. There are two fundamental modes of searching in the VO: (a) Data discovery: This is when you are looking for some sort of data - collection based on its metadata; a classical example would be: “I - need redshifts of extragalactic H II regions.” + collection based on its metadata; a classical example would be + something like “I need redshifts of supernovae”. (b) Service discovery: This is what you need when you want to query all services of a certain kind (e.g., „all spectral services claiming to have infrared data“), which in turn is the basis of all-VO *dataset* discovery (“give me all infrared spectra of 3C273”) -Both modes are supported by this module; in principle, for (b) you -generally constrain the service type. +Both modes are supported by this module. Basic interface @@ -62,6 +61,8 @@ keyword arguments. The following constraints are available: * :py:class:`pyvo.registry.Ivoid` (``ivoid``): exactly match a single IVOA identifier (that is, in effect, the primary key in the VO). +Multiple contratints are combined conjunctively (”AND”). + Hence, to look for for resources with UV data mentioning white dwarfs you could either run:: @@ -72,7 +73,7 @@ or:: >>> registry.search(registry.Fulltext("white dwarf"), ... registry.Waveband("UV")) -or a mixture between the two. In general, constructing using explicit +or a mixture between the two. Constructing using explicit constraints is generally preferable with more complex queries. Where the constraints accept multiple arguments, you can pass in sequences to the keyword arguments; for instance:: @@ -83,10 +84,10 @@ is equivalent to:: >>> registry.search(waveband=["Radio", "Submillimeter"]) -There is also :py:meth:pyvo.registry.get_RegTAP_query, accepting the +There is also :py:meth:`pyvo.registry.get_RegTAP_query`, accepting the same arguments as :py:meth:`pyvo.registry.search`. This function simply returns the ADQL query that search would execute. This is may be useful -to construct custom RegTAP queries. These queries should execute on all +to construct custom RegTAP queries, which could then be executed on TAP services implementing the ``regtap`` data model. @@ -95,13 +96,14 @@ Data Discovery In data discovery, you look for resources matching your constraints and then figure out in a second step how to query them. For instance, to -look for resources giving redshifts for quasars, you would say:: +look for resources giving redshifts in connection with supernovae, +you would say:: >>> resources = registry.search(registry.UCD("src.redshift"), ... registry.Freetext("supernova")) -``resources`` now is an instance of -:py:class:`pyvo.registry.RegistryResults`, which you can iterate. In +After that, ``resources`` is an instance of +:py:class:`pyvo.registry.RegistryResults`, which you can iterate over. In interactive data discovery, however, it is usually preferable to use the ``to_table`` method for an overview of the resources available:: @@ -118,16 +120,19 @@ interactive data discovery, however, it is usually preferable to use the The idea is that in notebook-like interfaces you can pick resources by title, description, and perhaps the access mode (“interface”) offered. -In the list of interfaces, ignore any ``#aux``; it is a minor VO -technicality, and you can construct :py:class:`pyvo.dal.TAPService`-s -(say) from ``tap#aux`` interfaces. +In the list of interfaces, you will sometimes spot an ``#aux`` after a +standard id; this is a minor VO technicality that you can in practice +ignore. For instance, you can simply construct +:py:class:`pyvo.dal.TAPService`-s from ``tap#aux`` interfaces. Once you have found a resource you would like to query, pick it by index -(which, obviously will not be stable across time; use a resource's ivoid -to recover it later; cf. the :py:class:`pyvo.registry.Ivoid` +(which, obviously will not be stable across multiple executions. +Use a resource's ivoid to identify resources over multiple runs +of a programme; cf. the :py:class:`pyvo.registry.Ivoid` constraint). Use the ``get_service`` method of :py:class:`pyvo.registry.RegistryResource` to obtain a DAL service -object. To query the fourth match using simple conesearch, you would +object for a particular sort of interface. +To query the fourth match using simple cone search, you would thus say:: >>> resources[4].get_service("conesearch").search(pos=(120, 73), sr=1) @@ -140,9 +145,9 @@ thus say:: To operate TAP services, you need to know what tables make up a -resource. Use the ``get_tables`` method for that, which returns a -dictionary much like what :py:class:pyvo.dal.TAPService's ``tables`` -attribute:: +resource; you could construct a TAP service and access its ``tables`` +attribute, but you can take a shortcut and call a RegistryResource's +``get_tables`` method for a rather similar result:: >>> tables = resources[4].get_tables() >>> list(tables.keys()) @@ -164,10 +169,10 @@ To run a TAP query based on this metadata, do something like:: 1993ag 0.049 1993O 0.051 -A special sort of access mode is ``web``. This is some facility related +A special sort of access mode is ``web``, which represents some facility related to the resource that works in a web browser. You can ask for a -“service” there, too; you will then receive an object that has a -``search`` method, and when you call this, a browser window should open +“service” for it, too; you will then receive an object that has a +``search`` method, and when you call it, a browser window should open with the query facility (this uses python's webbrowser module):: resources[4].get_service("web").query() @@ -184,21 +189,21 @@ Service Discovery ================= Service discovery is what you want typcially in connection with a search -for datasets, as in “Give me all infrared spectra of Bellatrix“. To to +for datasets, as in “Give me all infrared spectra of Bellatrix“. To do that, you want to run the same DAL query against all the services of a given sort. This means that you will have to include a servicetype -constraint. +constraint such that all resources in your registry results can be +queried in the same way. -The result of this is that the ``access_modes`` of your results are -always of the same sort. When that is the case, you can use -RegistryResource's ``service`` attribute, which returns a DAL service +When that is the case, you can use each +RegistryResource's ``service`` attribute, which contains a DAL service instance. The opening example could be written like this:: ->>> from astropy.coordinates import SkyCoord ->>> my_obj = SkyCoord.from_name("Bellatrix") ->>> for res in registry.search(waveband="infrared", servicetype="spectrum"): -... print(res.service.search(pos=my_obj, size=0.001)) -... + >>> from astropy.coordinates import SkyCoord + >>> my_obj = SkyCoord.from_name("Bellatrix") + >>> for res in registry.search(waveband="infrared", servicetype="spectrum"): + ... print(res.service.search(pos=my_obj, size=0.001)) + ... In reality, you will have to add some error handling to this kind of all-VO queries: in a wide and distributed network, some service is @@ -210,12 +215,13 @@ dal.Service and that can be queried in a uniform fashion. TAP services may provide tables in well-defined data models, like EPN-TAP or obscore. These can be queried in similar loops, although -some care has to be taken. In the obscore case, an all-VO query would -look like this:: +in some cases you will have to adapt the queries to the resources found. + +In the obscore case, an all-VO query would look like this:: ->>> for svc_rec in registry.search(datamodel="obscore"): -... print(svc_rec.service.run_sync( -... "SELECT DISTINCT dataproduct_type FROM ivoa.obscore")) + >>> for svc_rec in registry.search(datamodel="obscore"): + ... print(svc_rec.service.run_sync( + ... "SELECT DISTINCT dataproduct_type FROM ivoa.obscore")) Again, in production this needs explicit handling of failing services. For an example of how this might look like, see `GAVO's plate tutorial`_ @@ -227,7 +233,7 @@ Search results What is coming back from registry.search is rather similar to :ref:`pyvo-resultsets`; just remember that for interactive use there is -the ``to_tables`` method introduced above. +the ``to_tables`` method discussed above. The individual items are instances of :py:class:`pyvo.registry.regtap.RegistryResource`, which expose many @@ -253,7 +259,7 @@ instance:: two special capabilities that pyvo cannot produce services for (mainly because standalone service objects do not make much sense for them). -To obtain a service for one of the access modes, use +To obtain a service for one of the access modes pyVO does support, use ``get_service(mode)``. For ``web``, this returns an object that opens a web browser window when its ``query`` method is called. @@ -266,9 +272,9 @@ least an e-Mail address:: Finally, the registry has an idea of what kind of tables are published through a resource, much like the VOSI tables endpoint (as a matter of -fact, the Registry should contain exactly what is there; but you can -access that data all in one table in the registry). Not all publishers -properly provide table metadata to the Registry, but most do these days, +fact, the Registry should contain exactly what is there, as VOSI tables +in effect just gives a part of the registry record). Not all publishers +properly provide table metadata to the Registry, though, but most do these days, and then you can run:: >>> res.get_tables() diff --git a/pyvo/registry/__init__.py b/pyvo/registry/__init__.py index 9dab36e64..6c3923336 100644 --- a/pyvo/registry/__init__.py +++ b/pyvo/registry/__init__.py @@ -10,4 +10,5 @@ Freetext, Author, Servicetype, Waveband, Datamodel, Ivoid, UCD) -__all__ = ["search"] +__all__ = ["search", "get_RegTAP_query", "Freetext", "Author", + "Servicetype", "Waveband", "Datamodel", "Ivoid", "UCD"] diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 808a05cf4..4fb024e01 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -109,7 +109,9 @@ def _get_sql_literals(self): class Freetext(Constraint): - """plain text to match against title, description, and person names. + """ + A contraint using plain text to match against title, description, + and person names. Note that in contrast to regsearch, this will not do a pattern search in subjects. @@ -148,7 +150,9 @@ def __init__(self, *words:str): class Author(Constraint): - """constrain by a pattern for the creator (“author”) of a resource. + """ + A constraint for creators (“authors”) of a resource; you can use SQL + patterns here. Note that regrettably there are no guarantees as to how authors are written in the VO. This means that you will generally have @@ -165,10 +169,12 @@ def __init__(self, name:str): class Servicetype(Constraint): - """constrain by the type of service. + """ + A constraint for for the availability of a certain kind of service + on the result. The constraint is either a bespoke keyword (of which there are at least - image, spectrum, scs, line, and table; the fullist is in + image, spectrum, scs, line, and table; the full list is in SERVICE_TYPE_MAP) or the standards' ivoid (which generally looks like ``ivo://ivoa.net/std/`` and have to be URIs with a scheme part in any case). @@ -216,7 +222,8 @@ def include_auxiliary_services(self): class Waveband(Constraint): - """A constraint on messenger particles. + """ + A constraint on messenger particles. This builds a constraint against rr.resource.waveband, i.e., a verbal indication of the messenger particle, coming @@ -250,7 +257,8 @@ def __init__(self, *bands): class Datamodel(Constraint): - """A constraint on the adherence to a data model. + """ + A constraint on the adherence to a data model. This constraint only lets resources pass that declare support for one of several well-known data models; the SQL produced depends @@ -303,7 +311,8 @@ def _make_regtap_constraint(self): class Ivoid(Constraint): - """A constraint selecting a single resource by its IVOA identifier. + """ + A constraint selecting a single resource by its IVOA identifier. """ _keyword = "ivoid" @@ -315,8 +324,9 @@ def __init__(self, ivoid): class UCD(Constraint): """ A constraint selecting resources having tables with columns having - UCDs matching a SQL pattern (% as wildcard). Multiple patterns may - be passed in and are joined by OR. + UCDs matching a SQL pattern (% as wildcard). + + Multiple patterns may be passed in and are joined by OR. """ _keyword = "ucd" From 663befecd7832b6054358683bae444bf64199294 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Thu, 23 Dec 2021 09:07:56 +0100 Subject: [PATCH 21/49] registry: Adding a workaround for automatic access URL selection when services declare multiple data models with matching prefixes. --- pyvo/registry/regtap.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index f56cc66c1..01a8ddba5 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -431,8 +431,12 @@ def access_url(self): """ the URL that can be used to access the service resource. """ - if len(self["access_urls"])==1: - return self["access_urls"][0] + # some services declare some data models using multiple + # identifiers; in this case, we'll get the same access URL + # multiple times in here. Don't be alarmed when that happens: + access_urls = list(set(self["access_urls"])) + if len(access_urls)==1: + return access_urls[0] else: raise dalq.DALQueryError( "No unique access URL. Use get_service.") From d4f4661855a765c3acfa83c4a7ba37298042c684 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Thu, 23 Dec 2021 10:36:41 +0100 Subject: [PATCH 22/49] Docstring regularisation in rtcons --- pyvo/registry/rtcons.py | 143 +++++++++++++++++++++++++---- pyvo/registry/tests/test_regtap.py | 6 +- 2 files changed, 126 insertions(+), 23 deletions(-) diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 4fb024e01..e1ff23d01 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -2,7 +2,7 @@ """ Constraints for doing registry searches. -The Constraint class encapsulates a query fragment in a RegTAP query: A +The Constraint class encapsulates a query fragment in a RegTAP query, e.g., a keyword, a sky location, an author name, a class of services. They are used either directly as arguments to registry.search, or by passing keyword arguments into registry.search. The mapping from keyword arguments to @@ -38,12 +38,27 @@ def make_sql_literal(value): - """returns the python value as a SQL-embeddable literal. + """makes a SQL literal from a python value. This is not suitable as a device to ward against SQL injections; in what we produce, callers could produce arbitrary SQL anyway. The point of this function is to minimize surprises when building constraints. + + Parameters + ---------- + + value : object + Conceptually, the function should produces SQL literals + for anything that might reasonably add up in a registry + query. In reality, a ValueError will be raised for anything + we do not know about. + + Returns + ------- + + str + A SQL literal. """ if isinstance(value, str): return "'{}'".format(value.replace("'", "''")) @@ -96,6 +111,14 @@ class Constraint: _keyword = None def get_search_condition(self): + """ + Formats this constraint to an ADQL fragment. + + Returns + ------- + str + A string ready for inclusion into a WHERE clause. + """ if self._condition is None: raise NotImplementedError("{} is an abstract Constraint" .format(self.__class__.__name__)) @@ -103,6 +126,10 @@ def get_search_condition(self): return self._condition.format(**self._get_sql_literals()) def _get_sql_literals(self): + """ + returns self._fillers as a dictionary of properly SQL-escaped + literals. + """ if self._fillers: return {k: make_sql_literal(v) for k, v in self._fillers.items()} return {} @@ -111,18 +138,21 @@ def _get_sql_literals(self): class Freetext(Constraint): """ A contraint using plain text to match against title, description, - and person names. - - Note that in contrast to regsearch, this will not do a pattern - search in subjects. - - You can pass in phrases (i.e., multiple words separated by space), - but behaviour can then change quite significantly between different - registries. + subjects, and person names. """ _keyword = "keywords" def __init__(self, *words:str): + """ + + Parameters + ---------- + *words: tuple of str + It is recommended to pass multiple words in multiple strings + arguments. You can pass in phrases (i.e., multiple words + separated by space), but behaviour might then vary quite + significantly between different registries. + """ # cross-table ORs kill the query planner. We therefore # write the constraint as an IN condition on a UNION # of subqueries; it may look as if this has to be @@ -154,16 +184,21 @@ class Author(Constraint): A constraint for creators (“authors”) of a resource; you can use SQL patterns here. - Note that regrettably there are no guarantees as to how authors - are written in the VO. This means that you will generally have - to write things like ``%Hubble%`` (% being “zero or more characters” - in SQL) here. - The match is case-sensitive. """ _keyword = "author" def __init__(self, name:str): + """ + + Parameters + ---------- + name: str + Note that regrettably there are no guarantees as to how authors + are written in the VO. This means that you will generally have + to write things like ``%Hubble%`` (% being “zero or more + characters” in SQL) here. + """ self._condition = "role_name LIKE {auth} AND base_role='creator'" self._fillers = {"auth": name} @@ -188,11 +223,21 @@ class Servicetype(Constraint): of a certain type in the VO. In data discovery (where, however, you generally should not have Servicetype constraints), you can use ``Servicetype(...).include_auxiliary_services()`` or - use registry.search's ``includeaux`` parameter. + use registry.search's ``includeaux`` parameter; but, really, there + is little point using this constraint in data discovery in the first + place. """ _keyword = "servicetype" def __init__(self, *stds): + """ + + Parameters + ---------- + *stds: tuple of str + one or more standards identifiers. The constraint will + match records that have any of them. + """ self.stdids = set() for std in stds: @@ -238,6 +283,15 @@ class Waveband(Constraint): _legal_terms = None def __init__(self, *bands): + """ + + Parameters + ---------- + *bands: tuple of strings + One or more of the terms given in http://www.ivoa.net/messenger. + The constraint matches when a resource declares at least + one of the messengers listed. + """ if self.__class__._legal_terms is None: self.__class__._legal_terms = {w.lower() for w in vocabularies.get_vocabulary("messenger")["terms"]} @@ -280,6 +334,13 @@ class Datamodel(Constraint): _known_dms = {"obscore", "epntap", "regtap"} def __init__(self, dmname): + """ + + Parameters + ---------- + dmname : string + A well-known name; currently one of obscore, epntap, and regtap. + """ dmname = dmname.lower() if dmname not in self._known_dms: raise dalq.DALQueryError("Unknown data model id {}. Known are: {}." @@ -317,20 +378,38 @@ class Ivoid(Constraint): _keyword = "ivoid" def __init__(self, ivoid): + """ + + Parameters + ---------- + + ivoid : string + The IVOA identifier of the resource to match. As RegTAP + requires lowercasing ivoids on ingestion, the constraint + lowercases the ivoid passed in, too. + """ self._condition = "ivoid = {ivoid}" - self._fillers = {"ivoid": ivoid} + self._fillers = {"ivoid": ivoid.lower()} class UCD(Constraint): """ A constraint selecting resources having tables with columns having UCDs matching a SQL pattern (% as wildcard). - - Multiple patterns may be passed in and are joined by OR. """ _keyword = "ucd" def __init__(self, *patterns): + """ + + Parameters + ---------- + + patterns : tuple of strings + SQL patterns (i.e., ``%`` is 0 or more characters) for + UCDs. The constraint will match when a resource has + at least one column matching one of the patterns. + """ self._extra_tables = ["rr.table_column"] self._condition = " OR ".join( f"ucd LIKE {{ucd{i}}}" for i in range(len(patterns))) @@ -345,6 +424,18 @@ def __init__(self, *patterns): def build_regtap_query(constraints): """returns a RegTAP query ready for submission from a list of Constraint instances. + + Parameters + ---------- + constraints: sequence of `Constraint`-s + A sequence of constraints for a RegTAP query. All of them + will become part of a conjunction (i.e., all of them have + to be satisfied for a record to match). + + Returns + ------- + str + An ADQL literal ready for submission to a RegTAP service. """ if not constraints: raise dalq.DALQueryError( @@ -383,7 +474,19 @@ def build_regtap_query(constraints): def keywords_to_constraints(keywords): """returns constraints expressed as keywords as Constraint instances. - This will raise a DALQueryError for unknown keywords. + Parameters + ---------- + keywords : dict + regsearch arguments as a kwargs-style dictionary. + + Returns + ------- + sequence of `Constraint`-s + + Raises + ------ + DALQueryError + if an unknown keyword is encountered. """ constraints = [] for keyword, value in keywords.items(): diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index ee558e182..2edfa00df 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -264,14 +264,14 @@ class TestResultsExtras: def test_to_table(self): t = regtap.search( ivoid="ivo://org.gavo.dc/flashheros/q/ssa").to_table() - assert (list(t.columns.keys()) - == ['index', 'title', 'description', 'interfaces']) + assert (set(t.columns.keys()) + == {'index', 'title', 'description', 'interfaces'}) assert t["index"][0] == 0 assert t["title"][0] == 'Flash/Heros SSAP' assert (t["description"][0][:40] == 'Spectra from the Flash and Heros Echelle') assert (t["interfaces"][0] - == 'ssa, web, tap#aux, soda#sync-1.0, datalink#links-1.0') + == 'datalink#links-1.0, soda#sync-1.0, ssa, tap#aux, web') @pytest.mark.usefixtures('multi_interface_fixture', 'capabilities', From 16d3d7895cca8cdb767d802e8fe8b58af255991e Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Thu, 23 Dec 2021 11:33:34 +0100 Subject: [PATCH 23/49] + Constraint for regtap 1.1 spatial coverage --- pyvo/registry/__init__.py | 5 +- pyvo/registry/rtcons.py | 100 +++++++++++++++++++++++++++-- pyvo/registry/tests/test_regtap.py | 6 ++ pyvo/registry/tests/test_rtcons.py | 24 +++++++ 4 files changed, 128 insertions(+), 7 deletions(-) diff --git a/pyvo/registry/__init__.py b/pyvo/registry/__init__.py index 6c3923336..32b52f608 100644 --- a/pyvo/registry/__init__.py +++ b/pyvo/registry/__init__.py @@ -8,7 +8,8 @@ from .rtcons import (Constraint, Freetext, Author, Servicetype, Waveband, Datamodel, Ivoid, - UCD) + UCD, Spatial) __all__ = ["search", "get_RegTAP_query", "Freetext", "Author", - "Servicetype", "Waveband", "Datamodel", "Ivoid", "UCD"] + "Servicetype", "Waveband", "Datamodel", "Ivoid", "UCD", + "Spatial"] diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index e1ff23d01..3367acd9d 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -37,6 +37,11 @@ ]) +class _AsIs(str): + """a sentinel class make `make_sql_literal` not escape a string. + """ + + def make_sql_literal(value): """makes a SQL literal from a python value. @@ -60,6 +65,9 @@ def make_sql_literal(value): str A SQL literal. """ + if isinstance(value, _AsIs): + return value + if isinstance(value, str): return "'{}'".format(value.replace("'", "''")) @@ -80,6 +88,27 @@ def make_sql_literal(value): .format(repr(value))) +def format_function_call(func_name, args): + """make an ADQL literal for a function call with arguments. + + Parameters + ---------- + func_name : str + the name of the function to call. + + args : sequence of anything + python values for the arguments for the function. + + Returns + ------- + str + ADQL ready for inclusion into a query. + """ + return "{}({})".format( + func_name, + ", ".join(make_sql_literal(a) for a in args)) + + class Constraint: """an abstract base class for data discovery contraints. @@ -103,13 +132,18 @@ class Constraint: For the legacy x_search with keywords, define a _keyword attribute containing the name of the parameter that should - generate such a constraint. + generate such a constraint. When pickung up such keywords, + sequence values will in general be unpacked and turned into + sequences of constraints. Constraints that want to the all + arguments in the constructor can set takes_sequence to True. """ _extra_tables = [] _condition = None _fillers = None _keyword = None + takes_sequence = False + def get_search_condition(self): """ Formats this constraint to an ADQL fragment. @@ -415,7 +449,60 @@ def __init__(self, *patterns): f"ucd LIKE {{ucd{i}}}" for i in range(len(patterns))) self._fillers = dict((f"ucd{index}", pattern) for index, pattern in enumerate(patterns)) - + + +class Spatial(Constraint): + """ + A RegTAP constraint selecting resources covering a geometry in + space. + + This is a RegTAP 1.1 extension not yet available on all Registries + (in 2022). + """ + _keyword = "spatial" + _condition = "1 = CONTAINS({geom}, coverage)" + _extra_tables = ["rr.stc_spatial"] + + takes_sequence = True + + def __init__(self, geom_spec, order=6): + """ + + Parameters + ---------- + geom_spec : object + For now, this is DALI-style: a 2-sequence is interpreted + as a DALI point, a 3-sequence as a DALI circle, a 2n sequence + as a DALI polygon. Additionally, strings are interpreted + as ASCII MOCs. Other types (proper geometries or pymoc + objects) might be supported in the future. + order : int, optional + Non-MOC geometries are converted to MOCs before comparing + them to the resource coverage. By default, this contrains + uses order 6, which corresponds to about a degree of resolution + and is what RegTAP recommends as a sane default for the + order actually used for the coverages in the database. + """ + def tomoc(s): + return _AsIs("MOC({}, {})".format(order, s)) + + if isinstance(geom_spec, str): + geom = _AsIs("MOC({})".format( + make_sql_literal(geom_spec))) + + elif len(geom_spec)==2: + geom = tomoc(format_function_call("POINT", geom_spec)) + + elif len(geom_spec)==3: + geom = tomoc(format_function_call("CIRCLE", geom_spec)) + + elif len(geom_spec)%2==0: + geom = tomoc(format_function_call("POLYGON", geom_spec)) + + else: + raise ValueError("This constraint needs DALI-style geometries.") + + self._fillers = {"geom": geom} # NOTE: If you add new Contraint-s, don't forget to add them in # registry.__init__ and in docs/registry/index.rst. @@ -494,10 +581,13 @@ def keywords_to_constraints(keywords): raise TypeError(f"{keyword} is not a valid registry" " constraint keyword. Use one of {}.".format( ", ".join(sorted(_KEYWORD_TO_CONSTRAINT)))) - if isinstance(value, (tuple, list)): - constraints.append(_KEYWORD_TO_CONSTRAINT[keyword](*value)) + + constraint_class = _KEYWORD_TO_CONSTRAINT[keyword] + if (isinstance(value, (tuple, list)) + and not constraint_class.takes_sequence): + constraints.append(constraint_class(*value)) else: - constraints.append(_KEYWORD_TO_CONSTRAINT[keyword](value)) + constraints.append(constraint_class(value)) return constraints diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index 2edfa00df..e27470fc4 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -11,6 +11,7 @@ import pytest from pyvo.registry import regtap +from pyvo.registry import rtcons from pyvo.registry.regtap import REGISTRY_BASEURL from pyvo.registry import search as regsearch from pyvo.dal import query as dalq @@ -258,6 +259,11 @@ def test_bad_servicetype_aux(): with pytest.raises(dalq.DALQueryError): regsearch(servicetype='bad_servicetype', includeaux=True) +def test_spatial(): + assert (rtcons.keywords_to_constraints({ + "spatial": (23, -40)})[0].get_search_condition() + == "1 = CONTAINS(MOC(6, POINT(23, -40)), coverage)") + @pytest.mark.usefixtures('multi_interface_fixture', 'capabilities') class TestResultsExtras: diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index a8d1c9887..498f721e6 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -181,6 +181,30 @@ def test_basic(self): "ucd LIKE 'phot.mag;em.opt.%' OR ucd LIKE 'phot.mag;em.ir.%'") +class TestSpatialConstraint: + def test_point(self): + cons = rtcons.Spatial([23, -40]) + assert (cons.get_search_condition() == + "1 = CONTAINS(MOC(6, POINT(23, -40)), coverage)") + assert(cons._extra_tables==["rr.stc_spatial"]) + + def test_circle_and_order(self): + cons = rtcons.Spatial([23, -40, 0.25], order=7) + assert (cons.get_search_condition() == + "1 = CONTAINS(MOC(7, CIRCLE(23, -40, 0.25)), coverage)") + + def test_polygon(self): + cons = rtcons.Spatial([23, -40, 26, -39, 25, -43]) + assert (cons.get_search_condition() == + "1 = CONTAINS(MOC(6, POLYGON(23, -40, 26, -39, 25, -43))," + " coverage)") + + def test_moc(self): + cons = rtcons.Spatial("0/1-3 3/") + assert (cons.get_search_condition() == + "1 = CONTAINS(MOC('0/1-3 3/'), coverage)") + + class TestWhereClauseBuilding: @staticmethod def where_clause_for(*args, **kwargs): From 4611a4e912931e28af480bdcebd3098de958ecc9 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Thu, 23 Dec 2021 12:08:59 +0100 Subject: [PATCH 24/49] + RegTAP Spectral constraint. --- pyvo/registry/__init__.py | 4 +- pyvo/registry/rtcons.py | 69 ++++++++++++++++++++++++++++++ pyvo/registry/tests/test_regtap.py | 6 +++ pyvo/registry/tests/test_rtcons.py | 55 ++++++++++++++++++++++-- 4 files changed, 128 insertions(+), 6 deletions(-) diff --git a/pyvo/registry/__init__.py b/pyvo/registry/__init__.py index 32b52f608..c5f32b5de 100644 --- a/pyvo/registry/__init__.py +++ b/pyvo/registry/__init__.py @@ -8,8 +8,8 @@ from .rtcons import (Constraint, Freetext, Author, Servicetype, Waveband, Datamodel, Ivoid, - UCD, Spatial) + UCD, Spatial, Spectral) __all__ = ["search", "get_RegTAP_query", "Freetext", "Author", "Servicetype", "Waveband", "Datamodel", "Ivoid", "UCD", - "Spatial"] + "Spatial", "Spectral"] diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 3367acd9d..58b4421db 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -12,6 +12,8 @@ import datetime +from astropy import units +from astropy import constants import numpy from ..dal import tap @@ -504,6 +506,73 @@ def tomoc(s): self._fillers = {"geom": geom} + +class Spectral(Constraint): + """ + A RegTAP constraint on the sectral coverage of resources. + + This is a RegTAP 1.1 extension not yet available on all Registries + (in 2022). Worse, not too many resources bother declaring this + at this point; for robustness, it might be preferable to use + the `Waveband` constraint for the time being.. + """ + _keyword = "spectral" + _extra_tables = ["rr.stc_spectral"] + + takes_sequence = True + + def __init__(self, spec): + """ + + Parameters + ---------- + spec : astropy.Quantity or a 2-tuple of astropy.Quantity-s + A spectral point to cover. This must be a wavelength, + a frequency, or an energy, or a pair of such quantities, + in which case the argument is interpreted as an interval. + All resources *overlapping* the interval are returned. + """ + if isinstance(spec, tuple): + self._fillers = { + "spec_lo": self._to_joule(spec[0]), + "spec_hi": self._to_joule(spec[1])} + self._condition = ("1 = ivo_interval_overlaps(" + "spectral_start, spectral_end, {spec_lo}, {spec_hi})") + + else: + self._fillers = { + "spec": self._to_joule(spec)} + self._condition = "{spec} BETWEEN spectral_start AND spectral_end" + + def _to_joule(self, quant): + """returns a spectral quantity as a float in joule. + + A plain float is returned as-is. + """ + if isinstance(quant, float): + return quant + + try: + # is it an energy? + return quant.to(units.Joule).value + except units.UnitConversionError: + pass # try next + + try: + # is it a wavelength? + return (constants.h*constants.c/quant.to(units.m)).value + except units.UnitConversionError: + pass # try next + + try: + # is it a frequency? + return (constants.h*quant.to(units.Hz)).value + except units.UnitConversionError: + pass # fall through to give up + + raise ValueError(f"Cannot make a spectral quantity out of {quant}") + + # NOTE: If you add new Contraint-s, don't forget to add them in # registry.__init__ and in docs/registry/index.rst. diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index e27470fc4..d5137dbab 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -265,6 +265,12 @@ def test_spatial(): == "1 = CONTAINS(MOC(6, POINT(23, -40)), coverage)") +def test_spectral(): + assert (rtcons.keywords_to_constraints({ + "spectral": (1e-17, 2e-17)})[0].get_search_condition() == + "1 = ivo_interval_overlaps(spectral_start, spectral_end, 1e-17, 2e-17)") + + @pytest.mark.usefixtures('multi_interface_fixture', 'capabilities') class TestResultsExtras: def test_to_table(self): diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index 498f721e6..4972f5282 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -6,9 +6,11 @@ import datetime +from astropy import units import numpy import pytest +from pyvo import registry from pyvo.registry import rtcons from pyvo.dal import query as dalq @@ -183,28 +185,73 @@ def test_basic(self): class TestSpatialConstraint: def test_point(self): - cons = rtcons.Spatial([23, -40]) + cons = registry.Spatial([23, -40]) assert (cons.get_search_condition() == "1 = CONTAINS(MOC(6, POINT(23, -40)), coverage)") assert(cons._extra_tables==["rr.stc_spatial"]) def test_circle_and_order(self): - cons = rtcons.Spatial([23, -40, 0.25], order=7) + cons = registry.Spatial([23, -40, 0.25], order=7) assert (cons.get_search_condition() == "1 = CONTAINS(MOC(7, CIRCLE(23, -40, 0.25)), coverage)") def test_polygon(self): - cons = rtcons.Spatial([23, -40, 26, -39, 25, -43]) + cons = registry.Spatial([23, -40, 26, -39, 25, -43]) assert (cons.get_search_condition() == "1 = CONTAINS(MOC(6, POLYGON(23, -40, 26, -39, 25, -43))," " coverage)") def test_moc(self): - cons = rtcons.Spatial("0/1-3 3/") + cons = registry.Spatial("0/1-3 3/") assert (cons.get_search_condition() == "1 = CONTAINS(MOC('0/1-3 3/'), coverage)") +class TestSpectralConstraint: + # These tests might need some float literal fuzziness. I'm just + # too lazy at this point to see if pytest has something on board + # that would be useful there. + def test_energy_float(self): + cons = registry.Spectral(1e-19) + assert (cons.get_search_condition() == + "1e-19 BETWEEN spectral_start AND spectral_end") + + def test_energy_eV(self): + cons = registry.Spectral(5*units.eV) + assert (cons.get_search_condition() == + "8.01088317e-19 BETWEEN spectral_start AND spectral_end") + + def test_energy_interval(self): + cons = registry.Spectral((1e-10*units.erg, 2e-10*units.erg)) + assert (cons.get_search_condition() == + "1 = ivo_interval_overlaps(spectral_start, spectral_end," + " 1e-17, 2e-17)") + + def test_wavelength(self): + cons = registry.Spectral(5000*units.Angstrom) + assert (cons.get_search_condition() == + "3.9728917142978567e-19 BETWEEN spectral_start AND spectral_end") + + def test_wavelength_interval(self): + cons = registry.Spectral((20*units.cm, 22*units.cm)) + assert (cons.get_search_condition() == + "1 = ivo_interval_overlaps(spectral_start, spectral_end," + " 9.932229285744642e-25, 9.029299350676949e-25)") + + def test_frequency(self): + cons = registry.Spectral(2*units.GHz) + assert (cons.get_search_condition() == + "1.32521403e-24 BETWEEN spectral_start AND spectral_end") + + def test_frequency_interval(self): + cons = registry.Spectral((88*units.MHz, 102*units.MHz)) + assert (cons.get_search_condition() == + "1 = ivo_interval_overlaps(spectral_start, spectral_end," + " 5.830941732e-26, 6.758591553e-26)") + + + + class TestWhereClauseBuilding: @staticmethod def where_clause_for(*args, **kwargs): From 52e5b29029a92aa821f6b1c880ae09d5ca4d83ed Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Mon, 10 Jan 2022 16:02:26 +0100 Subject: [PATCH 25/49] Documenting Spatial and Spectral RegTAP constraints --- docs/registry/index.rst | 18 +++++++-- pyvo/registry/rtcons.py | 63 +++++++++++++++++++++++++----- pyvo/registry/tests/test_rtcons.py | 2 - 3 files changed, 69 insertions(+), 14 deletions(-) diff --git a/docs/registry/index.rst b/docs/registry/index.rst index afecf9788..458b3f079 100644 --- a/docs/registry/index.rst +++ b/docs/registry/index.rst @@ -53,16 +53,28 @@ keyword arguments. The following constraints are available: from the vocabulary at http://www.ivoa.net/messenger giving the rough spectral location of the resource. * :py:class:`pyvo.registry.Author` (``author``): an author (“creator”). - This is a single SQL pattern, and given the sloppy practicies in the - VO, you should probably generously use wildcards. + This is a single SQL pattern, and given the sloppy practices in the + VO for how to write author names, you should probably generously use + wildcards. * :py:class:`pyvo.registry.Datamodel` (``datamodel``): one of obscore, epntap, or regtap: only return TAP services having tables of this kind. * :py:class:`pyvo.registry.Ivoid` (``ivoid``): exactly match a single IVOA identifier (that is, in effect, the primary key in the VO). +* :py:class:`pyvo.registry.Spatial` (``spatial``): match resources + covering a certain geometry (point, circle, polygon, or MOC). + *RegTAP 1.2 Extension*. +* :py:class:`pyvo.registry.Spectral` (``spectral``): match resources + covering a certain part of the spectrum (usually, but not limited to, + the electromagnetic spectrum). *RegTAP 1.2 Extension*. Multiple contratints are combined conjunctively (”AND”). +Constraints marked with *RegTAP 1.2 Extension* are not available on all +IVOA RegTAP services (they are on pyVO's default RegTAP endpoint, +though). Also refer to the class documentation for further caveats on +these. + Hence, to look for for resources with UV data mentioning white dwarfs you could either run:: @@ -126,7 +138,7 @@ ignore. For instance, you can simply construct :py:class:`pyvo.dal.TAPService`-s from ``tap#aux`` interfaces. Once you have found a resource you would like to query, pick it by index -(which, obviously will not be stable across multiple executions. +(which will not be stable across multiple executions. Use a resource's ivoid to identify resources over multiple runs of a programme; cf. the :py:class:`pyvo.registry.Ivoid` constraint). Use the ``get_service`` method of diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 58b4421db..dcf6134b9 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -244,11 +244,20 @@ class Servicetype(Constraint): A constraint for for the availability of a certain kind of service on the result. - The constraint is either a bespoke keyword (of which there are at least - image, spectrum, scs, line, and table; the full list is in - SERVICE_TYPE_MAP) or the standards' ivoid (which generally looks like + The constraint normally is a custom keyword, one of: + + * ``image`` + * ``spectrum`` + * ``scs`` (for cone search services) + * ``line`` (for SLAP services) + * ``table`` (for TAP services) + + You can also pass in the standards' ivoid (which + generally looks like ``ivo://ivoa.net/std/`` and have to be URIs with - a scheme part in any case). + a scheme part in any case); note, however, that for standards + pyVO does not know about it will not build service instances for + you. Multiple service types can be passed in; a match in that case is for records having any of the service types passed in. @@ -310,7 +319,7 @@ class Waveband(Constraint): a verbal indication of the messenger particle, coming from the IVOA vocabulary http://www.ivoa.net/messenger. - The Spectral constraint enables selections by particle energy, + The :py:class:`pyvo.registry.Spectral` constraint enables selections by particle energy, but few resources actually give the necessary metadata (in 2021). Multiple wavebands can be given (and are effectively combined with OR). @@ -459,7 +468,26 @@ class Spatial(Constraint): space. This is a RegTAP 1.1 extension not yet available on all Registries - (in 2022). + (in 2022). Also note that not all data providers give spatial coverage + for their resources. + + To find resources having data for RA/Dec 347.38/8.6772:: + + >>> registry.Spatial((347.38, 8.6772)) + + To find resources claiming to have data for a spherical circle 2 degrees + around that point:: + + >>> registry.Spatial(347.38, 8.6772, 2)) + + To find resources claiming to have data for a polygon described by + the vertices (23, -40), (26, -39), (25, -43) in ICRS RA/Dec:: + + >>> registry.Spatial([23, -40, 26, -39, 25, -43]) + + To find resources claiming to cover a MOC, pass an ASCII MOC:: + + >>> registry.Spatial("0/1-3 3/") """ _keyword = "spatial" _condition = "1 = CONTAINS({geom}, coverage)" @@ -509,12 +537,29 @@ def tomoc(s): class Spectral(Constraint): """ - A RegTAP constraint on the sectral coverage of resources. + A RegTAP constraint on the spectral coverage of resources. This is a RegTAP 1.1 extension not yet available on all Registries (in 2022). Worse, not too many resources bother declaring this - at this point; for robustness, it might be preferable to use + at this point. For robustness, it might be preferable to use the `Waveband` constraint for the time being.. + + This constraint accepts quantities, i.e., values with units, and will + convert them to RegTAP's representation (which is Joule of particle energy) + if it can. This ought to work for wavelengths, frequencies, and energies. + Plain numbers are interpreted as particle energies in Joule. + + To find resources covering the messenger particle energy 5 eV:: + + >>> registry.Spectral(5*units.eV) + + To find resources overlapping the band between 5000 and 6000 Ångström:: + + >>> registry.Spectral((5000*units.Angstrom, 6000*units.Angstrom)) + + To find resources having data in the FM band:: + + >>> registry.Spectral((88*units.MHz, 102*units.MHz)) """ _keyword = "spectral" _extra_tables = ["rr.stc_spectral"] @@ -527,7 +572,7 @@ def __init__(self, spec): Parameters ---------- spec : astropy.Quantity or a 2-tuple of astropy.Quantity-s - A spectral point to cover. This must be a wavelength, + A spectral point or interval to cover. This must be a wavelength, a frequency, or an energy, or a pair of such quantities, in which case the argument is interpreted as an interval. All resources *overlapping* the interval are returned. diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index 4972f5282..8b2af3971 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -250,8 +250,6 @@ def test_frequency_interval(self): " 5.830941732e-26, 6.758591553e-26)") - - class TestWhereClauseBuilding: @staticmethod def where_clause_for(*args, **kwargs): From d3741aadc7d5e1e2a571450b68bd398b6fee0c84 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Mon, 10 Jan 2022 16:57:52 +0100 Subject: [PATCH 26/49] + RegTAP Temporal constraints --- docs/registry/index.rst | 8 +- pyvo/registry/__init__.py | 4 +- pyvo/registry/rtcons.py | 153 ++++++++++++++++++++++++++++- pyvo/registry/tests/test_rtcons.py | 29 +++++- 4 files changed, 185 insertions(+), 9 deletions(-) diff --git a/docs/registry/index.rst b/docs/registry/index.rst index 458b3f079..784febf0e 100644 --- a/docs/registry/index.rst +++ b/docs/registry/index.rst @@ -63,12 +63,14 @@ keyword arguments. The following constraints are available: IVOA identifier (that is, in effect, the primary key in the VO). * :py:class:`pyvo.registry.Spatial` (``spatial``): match resources covering a certain geometry (point, circle, polygon, or MOC). - *RegTAP 1.2 Extension*. + *RegTAP 1.2 Extension* * :py:class:`pyvo.registry.Spectral` (``spectral``): match resources covering a certain part of the spectrum (usually, but not limited to, - the electromagnetic spectrum). *RegTAP 1.2 Extension*. + the electromagnetic spectrum). *RegTAP 1.2 Extension* +* :py:class:`pyvo.registry.Temporal` (``temporal``): match resources + covering a some point or interval in time. *RegTAP 1.2 Extension* -Multiple contratints are combined conjunctively (”AND”). +Multiple constraints are combined conjunctively (”AND”). Constraints marked with *RegTAP 1.2 Extension* are not available on all IVOA RegTAP services (they are on pyVO's default RegTAP endpoint, diff --git a/pyvo/registry/__init__.py b/pyvo/registry/__init__.py index c5f32b5de..2f1eb92b5 100644 --- a/pyvo/registry/__init__.py +++ b/pyvo/registry/__init__.py @@ -8,8 +8,8 @@ from .rtcons import (Constraint, Freetext, Author, Servicetype, Waveband, Datamodel, Ivoid, - UCD, Spatial, Spectral) + UCD, Spatial, Spectral, Temporal) __all__ = ["search", "get_RegTAP_query", "Freetext", "Author", "Servicetype", "Waveband", "Datamodel", "Ivoid", "UCD", - "Spatial", "Spectral"] + "Spatial", "Spectral", "Temporal"] diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index dcf6134b9..3a660f942 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -467,7 +467,80 @@ class Spatial(Constraint): A RegTAP constraint selecting resources covering a geometry in space. - This is a RegTAP 1.1 extension not yet available on all Registries + This is a RegTAP 1.2 extension not yet available on all Registries + (in 2022). Also note that not all data providers give spatial coverage + for their resources. + + To find resources having data for RA/Dec 347.38/8.6772:: + + >>> registry.Spatial((347.38, 8.6772)) + + To find resources claiming to have data for a spherical circle 2 degrees + around that point:: + + >>> registry.Spatial(347.38, 8.6772, 2)) + + To find resources claiming to have data for a polygon described by + the vertices (23, -40), (26, -39), (25, -43) in ICRS RA/Dec:: + + >>> registry.Spatial([23, -40, 26, -39, 25, -43]) + + To find resources claiming to cover a MOC, pass an ASCII MOC:: + + >>> registry.Spatial("0/1-3 3/") + """ + _keyword = "spatial" + _condition = "1 = CONTAINS({geom}, coverage)" + _extra_tables = ["rr.stc_spatial"] + + takes_sequence = True + + def __init__(self, geom_spec, order=6): + """ + + Parameters + ---------- + geom_spec : object + For now, this is DALI-style: a 2-sequence is interpreted + as a DALI point, a 3-sequence as a DALI circle, a 2n sequence + as a DALI polygon. Additionally, strings are interpreted + as ASCII MOCs. Other types (proper geometries or pymoc + objects) might be supported in the future. + order : int, optional + Non-MOC geometries are converted to MOCs before comparing + them to the resource coverage. By default, this contrains + uses order 6, which corresponds to about a degree of resolution + and is what RegTAP recommends as a sane default for the + order actually used for the coverages in the database. + """ + def tomoc(s): + return _AsIs("MOC({}, {})".format(order, s)) + + if isinstance(geom_spec, str): + geom = _AsIs("MOC({})".format( + make_sql_literal(geom_spec))) + + elif len(geom_spec)==2: + geom = tomoc(format_function_call("POINT", geom_spec)) + + elif len(geom_spec)==3: + geom = tomoc(format_function_call("CIRCLE", geom_spec)) + + elif len(geom_spec)%2==0: + geom = tomoc(format_function_call("POLYGON", geom_spec)) + + else: + raise ValueError("This constraint needs DALI-style geometries.") + + self._fillers = {"geom": geom} + + +class Spatial(Constraint): + """ + A RegTAP constraint selecting resources covering a geometry in + space. + + This is a RegTAP 1.2 extension not yet available on all Registries (in 2022). Also note that not all data providers give spatial coverage for their resources. @@ -539,7 +612,7 @@ class Spectral(Constraint): """ A RegTAP constraint on the spectral coverage of resources. - This is a RegTAP 1.1 extension not yet available on all Registries + This is a RegTAP 1.2 extension not yet available on all Registries (in 2022). Worse, not too many resources bother declaring this at this point. For robustness, it might be preferable to use the `Waveband` constraint for the time being.. @@ -549,6 +622,10 @@ class Spectral(Constraint): if it can. This ought to work for wavelengths, frequencies, and energies. Plain numbers are interpreted as particle energies in Joule. + RegTAP uses the observer frame at the solar system barycenter, but + it is probably wise to use constraints suitably relaxed such that + frame and reference position (within reason) do not matter. + To find resources covering the messenger particle energy 5 eV:: >>> registry.Spectral(5*units.eV) @@ -594,7 +671,7 @@ def _to_joule(self, quant): A plain float is returned as-is. """ - if isinstance(quant, float): + if isinstance(quant, (float, int)): return quant try: @@ -618,6 +695,76 @@ def _to_joule(self, quant): raise ValueError(f"Cannot make a spectral quantity out of {quant}") +class Temporal(Constraint): + """ + A RegTAP constraint on the temporal coverage of resources. + + This is a RegTAP 1.2 extension not yet available on all Registries + (in 2022). Worse, not too many resources bother declaring this + at this point. Until this changes, you will probably have a lot of false + negatives (i.e., resources that should match but do not because they + are not declaring their time coverage) if you use this constraint. + + This constraint accepts astropy Time instances or pairs of Times + when specifying intervals. Plain numbers will be interpreted as + MJD. RegTAP uses TDB times at the solar system barycenter, and it is + probably wise to relax constraints such that such details do not matter. + This constraint does not attempt any conversions of time scales or + reference positions. + + To find resources claiming to have data for Jan 10, 2022:: + + >>> registry.Temporal(astropy.time.Time('2022-01-10')) + + To find resources claiming to have data for some time between + MJD 54130 and 54200:: + + >>> registry.Temporal((54130, 54200)) + """ + _keyword = "temporal" + _extra_tables = ["rr.stc_temporal"] + + takes_sequence = True + + def __init__(self, times): + """ + + Parameters + ---------- + spec : astropy.Time or a 2-tuple of astropy.Time-s + A point in time or time interval to cover. Plain numbers + are interpreted as MJD. All resources *overlapping* the + interval are returned. + """ + if isinstance(times, tuple): + self._fillers = { + "time_lo": self._to_mjd(times[0]), + "time_hi": self._to_mjd(times[1])} + self._condition = ("1 = ivo_interval_overlaps(" + "time_start, time_end, {time_lo}, {time_hi})") + + else: + self._fillers = { + "time": self._to_mjd(times)} + self._condition = "{time} BETWEEN time_start AND time_end" + + def _to_mjd(self, quant): + """returns a time specification in MJD. + + Times not corresponding to a single point in time are rejected. + + A plain float is returned as-is. + """ + if isinstance(quant, (float, int)): + return quant + + val = quant.to_value('mjd') + if not isinstance(val, numpy.number): + raise ValueError("RegTAP time constraints must be made from" + " single time instants.") + return val + + # NOTE: If you add new Contraint-s, don't forget to add them in # registry.__init__ and in docs/registry/index.rst. diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index 8b2af3971..0befd33e0 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -6,6 +6,7 @@ import datetime +from astropy import time from astropy import units import numpy import pytest @@ -250,6 +251,31 @@ def test_frequency_interval(self): " 5.830941732e-26, 6.758591553e-26)") +class TestTemporalConstraint: + def test_plain_float(self): + cons = registry.Temporal((54130, 54200)) + assert (cons.get_search_condition() == + "1 = ivo_interval_overlaps(time_start, time_end," + " 54130, 54200)") + + def test_single_time(self): + cons = registry.Temporal(time.Time('2022-01-10')) + assert (cons.get_search_condition() == + "59589.0 BETWEEN time_start AND time_end") + + def test_time_interval(self): + cons = registry.Temporal((time.Time(2459000, format='jd'), + time.Time(59002, format='mjd'))) + assert (cons.get_search_condition() == + "1 = ivo_interval_overlaps(time_start, time_end, 58999.5, 59002.0)") + + def test_multi_times_rejected(self): + with pytest.raises(ValueError) as excinfo: + cons = registry.Temporal(time.Time(['1999-01-01', '2010-01-01'])) + assert (str(excinfo.value) == "RegTAP time constraints must" + " be made from single time instants.") + + class TestWhereClauseBuilding: @staticmethod def where_clause_for(*args, **kwargs): @@ -290,7 +316,8 @@ def test_bad_keyword(self): # go. assert str(excinfo.value) == ("foo is not a valid registry" " constraint keyword. Use one of" - " author, datamodel, ivoid, keywords, servicetype, ucd, waveband.") + " author, datamodel, ivoid, keywords, servicetype," + " spatial, spectral, temporal, ucd, waveband.") class TestSelectClause: From b8c84becf9702224c5c877f9f71322551dbfb1d0 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Tue, 11 Jan 2022 11:00:22 +0100 Subject: [PATCH 27/49] Making resource lists accessibles through short names, too Actually, you can even use ivoids if things really need to be repeatable. --- pyvo/registry/regtap.py | 41 +- pyvo/registry/tests/data/README | 15 + pyvo/registry/tests/data/regtap.xml | 1660 +-------------------------- pyvo/registry/tests/test_regtap.py | 74 +- 4 files changed, 176 insertions(+), 1614 deletions(-) create mode 100644 pyvo/registry/tests/data/README diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 01a8ddba5..97fd6c7e3 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -157,6 +157,14 @@ class RegistryResults(dalq.DALResults): """ an iterable set of results from a registry query. Each record is returned as RegistryResults + + You can iterate over these, or access them by (numeric) index; note, + however, that these indexes will not be stable across different + executions and thus should only be used in interactive sessions. + Alternatively, you can use short names as indexes; there *might* + be clashes for these, as they are not unique VO-wide. Where this + matters, you need to use full ivoids as index. + """ def getrecord(self, index): """ @@ -179,16 +187,47 @@ def to_table(self): """ return table.Table([ list(range(len(self))), + [r.short_name for r in self], [r.res_title for r in self], [r.res_description for r in self], [", ".join(sorted(r.access_modes())) for r in self]], - names=("index", "title", "description", "interfaces"), + names=("index", "short_name", "title", "description", "interfaces"), descriptions=( "Index to access the resource within self", + "Short name", "Resource title", "Resource description", "Access modes offered")) + @functools.lru_cache(maxsize=None) + def _get_ivo_index(self): + return dict((r.ivoid, index) + for index, r in enumerate(self)) + + @functools.lru_cache(maxsize=None) + def _get_short_name_index(self): + return dict((r.short_name, index) + for index, r in enumerate(self)) + + def __getitem__(self, item): + """ + returns a record by numeric index, short names, or ivoid. + + This will raise an IndexError or a KeyError when item does + not match a record returned. + """ + if isinstance(item, int): + return self.getrecord(item) + + elif isinstance(item, str): + if item.startswith("ivo://"): + return self.getrecord(self._get_ivo_index()[item]) + else: + return self.getrecord(self._get_short_name_index()[item]) + + else: + raise IndexError(f"No resource matching {item}") + class _BrowserService: """A pseudo-service class just opening a web browser for browser-based diff --git a/pyvo/registry/tests/data/README b/pyvo/registry/tests/data/README new file mode 100644 index 000000000..8c6c01dde --- /dev/null +++ b/pyvo/registry/tests/data/README @@ -0,0 +1,15 @@ +regtap.xml is used as a generic regtap query response in many of +test_regtap's fixtures; most tests don't actually inspect its contents. + +To update it (necessary after changes to regtap.get_RegTAP_query), run +this to update it: + +import requests +from pyvo.registry import regtap + +with open("regtap.xml", "wb") as f: + f.write(requests.get(regtap.REGISTRY_BASEURL+"/sync", { + "LANG": "ADQL", + "QUERY": regtap.get_RegTAP_query( + keywords="pulsar", ucd=["pos.distance"])}).content) + diff --git a/pyvo/registry/tests/data/regtap.xml b/pyvo/registry/tests/data/regtap.xml index 8cb9b41ff..e20e51060 100644 --- a/pyvo/registry/tests/data/regtap.xml +++ b/pyvo/registry/tests/data/regtap.xml @@ -1,1600 +1,60 @@ - - - - - - - - The parent resource. - - - - - The index of the parent capability. - - - - - - An arbitrary identifier for the interfaces of a resource. - - - - - - The type of the interface (vr:webbrowser, vs:paramhttp, etc). - - - - - An identifier for the role the interface plays in the particular - capability. If the value is equal to "std" or begins with "std:", - then the interface refers to a standard interface defined by the - standard referred to by the capability's standardID attribute. - - - - - The version of a standard interface specification that this - interface complies with. When the interface is provided in the - context of a Capability element, then the standard being refered - to is the one identified by the Capability's standardID element. - - - - - Hash-joined list of expected HTTP method (get or post) supported - by the service. - - - - - The MIME type of a document returned in the HTTP response. - - - - - The location of the WSDL that describes this Web Service. If - NULL, the location can be assumed to be the accessURL with - '?wsdl' appended. - - - - - A flag indicating whether this should be interpreted as a base - URL ('base'), a full URL ('full'), or a URL to a directory that - will produce a listing of files ('dir'). - - - - - The URL at which the interface is found. - - - - - Secondary access URLs of this interface, separated by hash - characters. - - - - - An identifier of an authentication method required on this - interface, or NULL for interfaces publicly available. The - identifiers of authentication schemes recommended in the VO are - declared in the IVOA recommendation “SSO: Authentication - Mechanisms.“ - - - - - The parent resource. - - - - - An arbitrary identifier of this capability within the resource. - - - - - - The type of capability covered here. If looking for endpoints - implementing a certain standard, you should not use this column - but rather match against standard_id. - - - - - A human-readable description of what this capability provides as - part of the over-all service. - - - - - A URI for a standard this capability conforms to. - - - - - Unambiguous reference to the resource conforming to the IVOA - standard for identifiers. - - - - - Resource type (something like vs:datacollection, - vs:catalogservice, etc). - - - - - The UTC date and time this resource metadata description was - created. - - - - - A short name or abbreviation given to something, for presentation - in space-constrained fields (up to 16 characters). - - - - - The full name given to the resource. - - - - - The UTC date this resource metadata description was last updated. - - - - - A hash-separated list of content levels specifying the intended - audience. - - - - - An account of the nature of the resource. - - - - - URL pointing to a human-readable document describing this - resource. - - - - - The creator(s) of the resource in the order given by the resource - record author, separated by semicolons. - - - - - A hash-separated list of natures or genres of the content of the - resource. - - - - - The format of source_value. This, in particular, can be - ``bibcode''. - - - - - A bibliographic reference from which the present resource is - derived or extracted. - - - - - Label associated with creation or availablilty of a version of a - resource. - - - - - A single numeric value representing the angle, given in decimal - degrees, by which a positional query against this resource should - be ``blurred'' in order to get an appropriate match. - - - - - A hash-separated list of regions of the electro-magnetic spectrum - that the resource's spectral coverage overlaps with. - - - - - A statement of usage conditions (license, attribution, embargo, - etc). - - - - - A URI identifying a license the data is made available under. - - - - - IVOID of the registry this record came from. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ivo://cds.vizier/b/cb44vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/B/cb/cbdata? - - ivo://cds.vizier/b/cb4cs:conesearchCone search capability for table B/cb/cbdata (Catalogue of Cataclysmic Binaries)ivo://ivoa.net/std/conesearchivo://cds.vizier/b/cbvs:catalogservice2017-05-23T11:05:12B/cbCataclysmic Binaries, LMXBs, and related objects (Ritter+, 2004)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, and stellar parameters of the components and other characteristic properties of 1429 cataclysmic binaries, 108 low-mass X-ray binaries and 619 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 2035 of the 2156 objects, and a cross-reference list of alias object designations. Literature published before 1 July 2016 has, as far as possible, been taken into account. Old editions include catalogue <V/59> (5th edition), <V/99> (6th edition) and <V/113> (7th edition); the successive versions of the 7th edition are available in dedicated subdirectories (v7.00 to v7.20)http://cdsarc.u-strasbg.fr/cgi-bin/Cat?B/cbRitter H., Kolb U.catalogbibcode2003A&A...404..301R29-Sep-2011 - - public - ivo://cds.vizier/registry
ivo://cds.vizier/b/cb55vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/B/cb/lmxbdata? - - ivo://cds.vizier/b/cb5cs:conesearchCone search capability for table B/cb/lmxbdata (Catalogue of Low-Mass X-Ray Binaries)ivo://ivoa.net/std/conesearchivo://cds.vizier/b/cbvs:catalogservice2017-05-23T11:05:12B/cbCataclysmic Binaries, LMXBs, and related objects (Ritter+, 2004)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, and stellar parameters of the components and other characteristic properties of 1429 cataclysmic binaries, 108 low-mass X-ray binaries and 619 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 2035 of the 2156 objects, and a cross-reference list of alias object designations. Literature published before 1 July 2016 has, as far as possible, been taken into account. Old editions include catalogue <V/59> (5th edition), <V/99> (6th edition) and <V/113> (7th edition); the successive versions of the 7th edition are available in dedicated subdirectories (v7.00 to v7.20)http://cdsarc.u-strasbg.fr/cgi-bin/Cat?B/cbRitter H., Kolb U.catalogbibcode2003A&A...404..301R29-Sep-2011 - - public - ivo://cds.vizier/registry
ivo://cds.vizier/b/cb66vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/B/cb/pcbdata? - - ivo://cds.vizier/b/cb6cs:conesearchCone search capability for table B/cb/pcbdata (Catalogue of Related Objects)ivo://ivoa.net/std/conesearchivo://cds.vizier/b/cbvs:catalogservice2017-05-23T11:05:12B/cbCataclysmic Binaries, LMXBs, and related objects (Ritter+, 2004)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, and stellar parameters of the components and other characteristic properties of 1429 cataclysmic binaries, 108 low-mass X-ray binaries and 619 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 2035 of the 2156 objects, and a cross-reference list of alias object designations. Literature published before 1 July 2016 has, as far as possible, been taken into account. Old editions include catalogue <V/59> (5th edition), <V/99> (6th edition) and <V/113> (7th edition); the successive versions of the 7th edition are available in dedicated subdirectories (v7.00 to v7.20)http://cdsarc.u-strasbg.fr/cgi-bin/Cat?B/cbRitter H., Kolb U.catalogbibcode2003A&A...404..301R29-Sep-2011 - - public - ivo://cds.vizier/registry
ivo://cds.vizier/j/a+a/506/72944vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/A+A/506/729/table2? - - ivo://cds.vizier/j/a+a/506/7294cs:conesearchCone search capability for table J/A+A/506/729/table2 (Properties of the targeted member stars)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/a+a/506/729vs:catalogservice2009-12-30T09:41:09J/A+A/506/729Abundances in globular cluster Pal 3 (Koch+, 2009)2018-04-05T10:00:00researchChemical abundances of 25 alpha-, iron peak-, and neutron-capture elements in the remote (R=90kpc) outer halo globular cluster have been determined for 4 red giants observed with the Magellan/MIKE spectrograph and from integrated spectra of 19 stars obtained with the Keck/HIRES instrument. The resulting abundance ratios show that Pal 3 is very similar to globular clusters of the inner halo and very dissimilar from dwarf spheroidal galaxy stars. Its neutron capture element ratios are compatible with a pure r-process enrichment.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/A+A/506/729Koch A., Cote P., McWilliam A.catalogbibcode2009A&A...506..729K10-Sep-2009 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/a+a/530/a2844vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/A+A/530/A28/targets? - - ivo://cds.vizier/j/a+a/530/a284cs:conesearchCone search capability for table J/A+A/530/A28/targets (Priority targets for follow-up)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/a+a/530/a28vs:catalogservice2017-06-22T14:29:01J/A+A/530/A28Priority targets for the MUCHFUSS project (Geier+, 2011)2018-04-05T10:00:00researchThe project Massive Unseen Companions to Hot Faint Underluminous Stars from SDSS (MUCHFUSS) aims at finding sdBs with compact companions like supermassive white dwarfs (M>1.0M_{sun}_), neutron stars or black holes. The existence of such systems is predicted by binary evolution theory and recent discoveries indicate that they are likely to exist in our Galaxy. A determination of the orbital parameters is sufficient to put a lower limit on the companion mass by calculating the binary mass function. If this lower limit exceeds the Chandrasekhar mass and no sign of a companion is visible in the spectra, the existence of a massive compact companion is proven without the need for any additional assumptions. We identified about 1100 hot subdwarf stars from the SDSS by colour selection and visual inspection of their spectra. Stars with high velocities have been reobserved and individual SDSS spectra have been analysed. In total 127 radial velocity variable subdwarfs have been discovered. Binaries with high RV shifts and binaries with moderate shifts within short timespans have the highest probability of hosting massive compact companions. Atmospheric parameters of 69 hot subdwarfs in these binary systems have been determined by means of a quantitative spectral analysis. The atmospheric parameter distribution of the selected sample does not differ from previously studied samples of hot subdwarfs. The systems are considered the best candidates to search for massive compact companions by follow-up time resolved spectroscopy.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/A+A/530/A28Geier S., Hirsch H., Tillich A., Maxted P.F.L., Bentley S.J., Ostensen R.H., Heber U., Gaensicke B.T., Marsh T.R., Napiwotzki R., Barlow B.N., O'Toole S.J.catalogbibcode2011A&A...530A..28G30-Aug-2011 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/a+a/530/a2855vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/A+A/530/A28/tablea1? - - ivo://cds.vizier/j/a+a/530/a285cs:conesearchCone search capability for table J/A+A/530/A28/tablea1 (Orbital parameters of all known hot subdwarf binaries from literature)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/a+a/530/a28vs:catalogservice2017-06-22T14:29:01J/A+A/530/A28Priority targets for the MUCHFUSS project (Geier+, 2011)2018-04-05T10:00:00researchThe project Massive Unseen Companions to Hot Faint Underluminous Stars from SDSS (MUCHFUSS) aims at finding sdBs with compact companions like supermassive white dwarfs (M>1.0M_{sun}_), neutron stars or black holes. The existence of such systems is predicted by binary evolution theory and recent discoveries indicate that they are likely to exist in our Galaxy. A determination of the orbital parameters is sufficient to put a lower limit on the companion mass by calculating the binary mass function. If this lower limit exceeds the Chandrasekhar mass and no sign of a companion is visible in the spectra, the existence of a massive compact companion is proven without the need for any additional assumptions. We identified about 1100 hot subdwarf stars from the SDSS by colour selection and visual inspection of their spectra. Stars with high velocities have been reobserved and individual SDSS spectra have been analysed. In total 127 radial velocity variable subdwarfs have been discovered. Binaries with high RV shifts and binaries with moderate shifts within short timespans have the highest probability of hosting massive compact companions. Atmospheric parameters of 69 hot subdwarfs in these binary systems have been determined by means of a quantitative spectral analysis. The atmospheric parameter distribution of the selected sample does not differ from previously studied samples of hot subdwarfs. The systems are considered the best candidates to search for massive compact companions by follow-up time resolved spectroscopy.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/A+A/530/A28Geier S., Hirsch H., Tillich A., Maxted P.F.L., Bentley S.J., Ostensen R.H., Heber U., Gaensicke B.T., Marsh T.R., Napiwotzki R., Barlow B.N., O'Toole S.J.catalogbibcode2011A&A...530A..28G30-Aug-2011 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/a+a/537/a8344vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/A+A/537/A83/stars? - - ivo://cds.vizier/j/a+a/537/a834cs:conesearchCone search capability for table J/A+A/537/A83/stars (Properties and stellar parameters of target stars)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/a+a/537/a83vs:catalogservice2017-12-18T08:57:20J/A+A/537/A83Abunbances of 9 red giants of Pal 14 (Caliskan+, 2012)2018-04-05T10:00:00researchChemical abundances of 25 elements, which include {alpha}-, iron peak-, and neutron-capture elements, in the outer halo globular cluster Palomar 14 have been determined for the nine red giants observed with the FLAMES/UVES spectrograph. The abundance pattern of Pal 14 is similar to the inner halo GCs, halo field stars, and GCs of recognized extragalactic origin, but differs from what is customarily found in dSphs field stars. The abundance properties of Pal 14 as well as those of the other outer halo GCs are thus compatible with an accretion origin from dSphs. The neutron-capture elements show an r-process signature.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/A+A/537/A83Caliskan S., Christlieb N., Grebel E.K.catalogbibcode2012A&A...537A..83C21-Nov-2011 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/an/331/34944vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/AN/331/349/table2? - - ivo://cds.vizier/j/an/331/3494cs:conesearchCone search capability for table J/AN/331/349/table2 (All values obtained from the catalogues cited in the paper)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/an/331/349vs:catalogservice2017-12-05T06:09:54J/AN/331/349O, B-type & red supergiant masses and luminosities (Hohle+, 2010)2018-04-05T10:00:00researchMassive stars are of interest as progenitors of supernovae, i.e. neutron stars and black holes, which can be sources of gravitational waves. Recent population synthesis models can predict neutron star and gravitational wave observations but deal with a fixed supernova rate or an assumed initial mass function for the population of massive stars. Here we investigate those massive stars, which are supernova progenitors, i.e. with O- and early B-type stars, and also all supergiants within 3kpc. We restrict our sample to those massive stars detected both in 2MASS and observed by Hipparcos, i.e. only those stars with parallax and precise photometry. To determine the luminosities we calculated the extinctions from published multi-colour photometry, spectral types, luminosity class, all corrected for multiplicity and recently revised Hipparcos distances. We use luminosities and temperatures to estimate the masses and ages of these stars using different models from different authors.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AN/331/349Hohle M.M., Neuhauser R., Schutz B.F.catalogbibcode2010AN....331..349H03-May-2010 - infraredpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/an/331/34955vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/AN/331/349/single? - - ivo://cds.vizier/j/an/331/3495cs:conesearchCone search capability for table J/AN/331/349/single (Input data and derived mass and luminosity for single stars)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/an/331/349vs:catalogservice2017-12-05T06:09:54J/AN/331/349O, B-type & red supergiant masses and luminosities (Hohle+, 2010)2018-04-05T10:00:00researchMassive stars are of interest as progenitors of supernovae, i.e. neutron stars and black holes, which can be sources of gravitational waves. Recent population synthesis models can predict neutron star and gravitational wave observations but deal with a fixed supernova rate or an assumed initial mass function for the population of massive stars. Here we investigate those massive stars, which are supernova progenitors, i.e. with O- and early B-type stars, and also all supergiants within 3kpc. We restrict our sample to those massive stars detected both in 2MASS and observed by Hipparcos, i.e. only those stars with parallax and precise photometry. To determine the luminosities we calculated the extinctions from published multi-colour photometry, spectral types, luminosity class, all corrected for multiplicity and recently revised Hipparcos distances. We use luminosities and temperatures to estimate the masses and ages of these stars using different models from different authors.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AN/331/349Hohle M.M., Neuhauser R., Schutz B.F.catalogbibcode2010AN....331..349H03-May-2010 - infraredpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/an/331/34966vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/AN/331/349/mult1? - - ivo://cds.vizier/j/an/331/3496cs:conesearchCone search capability for table J/AN/331/349/mult1 (Input data and derived mass and luminosity for primaries of Pourbaix multiple stars)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/an/331/349vs:catalogservice2017-12-05T06:09:54J/AN/331/349O, B-type & red supergiant masses and luminosities (Hohle+, 2010)2018-04-05T10:00:00researchMassive stars are of interest as progenitors of supernovae, i.e. neutron stars and black holes, which can be sources of gravitational waves. Recent population synthesis models can predict neutron star and gravitational wave observations but deal with a fixed supernova rate or an assumed initial mass function for the population of massive stars. Here we investigate those massive stars, which are supernova progenitors, i.e. with O- and early B-type stars, and also all supergiants within 3kpc. We restrict our sample to those massive stars detected both in 2MASS and observed by Hipparcos, i.e. only those stars with parallax and precise photometry. To determine the luminosities we calculated the extinctions from published multi-colour photometry, spectral types, luminosity class, all corrected for multiplicity and recently revised Hipparcos distances. We use luminosities and temperatures to estimate the masses and ages of these stars using different models from different authors.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AN/331/349Hohle M.M., Neuhauser R., Schutz B.F.catalogbibcode2010AN....331..349H03-May-2010 - infraredpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/578/40544vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/578/405/table1? - - ivo://cds.vizier/j/apj/578/4054cs:conesearchCone search capability for table J/ApJ/578/405/table1 (Chandra X-Ray Sources in the Field of NGC 5139)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/apj/578/405vs:catalogservice2003-03-29T10:46:43J/ApJ/578/405Neutron stars in NGC 5139 (Rutledge+, 2002)2018-04-05T10:00:00researchThe Chandra/ACIS-I detectors observed NGC 5139 in imaging mode for two continuous periods (2000 January 24 02:15-09:46 and January 25 04:33-17:24 TT) for a total exposure of ~68.6ks. We combined the two observations and analyzed them as one. We searched for point sources using CELLDETECT, using only the 0.1-2.5keV energy range, excluding regions less than 16 pixels from the detector edges and keeping only sources with signal-to-noise ratio (S/N)>5.0. We find 40 X-ray point sources over the four ACIS-I chips and chip S2 of ACIS-S, which are numbered in order of decreasing S/N in Table 1.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/578/405Rutledge R.E., Bildsten L., Brown E.F., Pavlov G.G., Zavlin V.E.catalogbibcode2002ApJ...578..405R09-Dec-2002 - x-ray#radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/714/142444vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/714/1424/table1? - - ivo://cds.vizier/j/apj/714/14244cs:conesearchCone search capability for table J/ApJ/714/1424/table1 (Candidates RASS/BSC sources and identifications)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/apj/714/1424vs:catalogservice2017-11-06T13:23:26J/ApJ/714/1424Isolated neutron stars from Rosat and Swift (Turner+, 2010)2018-04-05T10:00:00researchFollowing selection of the isolated neutron star (INS) candidates, short (~1ks) follow-up observations with Swift/XRT were obtained on 92 of the candidates; these observations decrease the X-ray positional uncertainty (the systematic positional error associated with Swift blind pointing observations is on the order of 3.5"), and obtain (where possible) contemporaneous UV observations with Swift/UVOT for counterpart identification with off-band objects.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/714/1424Turner M.L., Rutledge R.E., Letcavage R., Shevchuk A.S.H., Fox D.B.catalogbibcode2010ApJ...714.1424T23-Apr-2012 - x-ray#radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/714/142455vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/714/1424/table2? - - ivo://cds.vizier/j/apj/714/14245cs:conesearchCone search capability for table J/ApJ/714/1424/table2 (Objects observed and detected with Swift/XRT)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/apj/714/1424vs:catalogservice2017-11-06T13:23:26J/ApJ/714/1424Isolated neutron stars from Rosat and Swift (Turner+, 2010)2018-04-05T10:00:00researchFollowing selection of the isolated neutron star (INS) candidates, short (~1ks) follow-up observations with Swift/XRT were obtained on 92 of the candidates; these observations decrease the X-ray positional uncertainty (the systematic positional error associated with Swift blind pointing observations is on the order of 3.5"), and obtain (where possible) contemporaneous UV observations with Swift/UVOT for counterpart identification with off-band objects.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/714/1424Turner M.L., Rutledge R.E., Letcavage R., Shevchuk A.S.H., Fox D.B.catalogbibcode2010ApJ...714.1424T23-Apr-2012 - x-ray#radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/797/2144vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/797/21/table3? - - ivo://cds.vizier/j/apj/797/214cs:conesearchCone search capability for table J/ApJ/797/21/table3 (Data for literature stars)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/apj/797/21vs:catalogservice2017-08-29T07:03:13J/ApJ/797/21Carbon-enhanced metal-poor stars (Placco+, 2014)2018-04-05T10:00:00researchWe revisit the observed frequencies of carbon-enhanced metal-poor (CEMP) stars as a function of the metallicity in the Galaxy, using data from the literature with available high-resolution spectroscopy. Our analysis excludes stars exhibiting clear overabundances of neutron-capture elements and takes into account the expected depletion of surface carbon abundance that occurs due to CN processing on the upper red giant branch. This allows for the recovery of the initial carbon abundance of these stars, and thus for an accurate assessment of the frequencies of carbon-enhanced stars. The correction procedure we develop is based on stellar-evolution models and depends on the surface gravity, log g, of a given star.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/797/21Placco V.M., Frebel A., Beers T.C., Stancliffe R.J.catalogbibcode2014ApJ...797...21P26-Jan-2017 - - public - ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/804/11444vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/804/114/sample? - - ivo://cds.vizier/j/apj/804/1144cs:conesearchCone search capability for table J/ApJ/804/114/sample (Simulated binary neutron-star (BNS) signals of detected events for 2015 scenario using recolored noise (table C1), detections and sky-localization areas (table C2) and accuracy estimations (table C3))ivo://ivoa.net/std/conesearchivo://cds.vizier/j/apj/804/114vs:catalogservice2017-06-22T14:28:22J/ApJ/804/114Parameter-estimation performance with LIGO (Berry+, 2015)2018-04-05T10:00:00researchAdvanced ground-based gravitational-wave (GW) detectors begin operation imminently. Their intended goal is not only to make the first direct detection of GWs, but also to make inferences about the source systems. Binary neutron-star mergers are among the most promising sources. We investigate the performance of the parameter-estimation (PE) pipeline that will be used during the first observing run of the Advanced Laser Interferometer Gravitational-wave Observatory (aLIGO) in 2015: we concentrate on the ability to reconstruct the source location on the sky, but also consider the ability to measure masses and the distance. Accurate, rapid sky localization is necessary to alert electromagnetic (EM) observatories so that they can perform follow-up searches for counterpart transient events. We consider PE accuracy in the presence of non-stationary, non-Gaussian noise. We find that the character of the noise makes negligible difference to the PE performance at a given signal-to-noise ratio. The source luminosity distance can only be poorly constrained, since the median 90% (50%) credible interval scaled with respect to the true distance is 0.85 (0.38). However, the chirp mass is well measured. Our chirp-mass estimates are subject to systematic error because we used gravitational-waveform templates without component spin to carry out inference on signals with moderate spins, but the total error is typically less than 10^-3^M_{sun}_. The median 90% (50%) credible region for sky localization is ~600deg^2^ (~150deg^2^), with 3% (30%) of detected events localized within 100deg^2^. Early aLIGO, with only two detectors, will have a sky-localization accuracy for binary neutron stars of hundreds of square degrees; this makes EM follow-up challenging, but not impossible.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/804/114Berry C.P.L., Mandel I., Middleton H., Singer L.P., Urban A.L., Vecchio A., Vitale S., Cannon K., Farr B., Farr W.M., Graff P.B., Hanna C., Haster C.-J., Mohapatra S., Pankow C., Price L.R., Sidery T., Veitch J.catalogbibcode2015ApJ...804..114B26-Aug-2015 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/829/2044vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/829/20/table1? - - ivo://cds.vizier/j/apj/829/204cs:conesearchCone search capability for table J/ApJ/829/20/table1 (X-Ray point source populations in 343 nearby galaxies)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/apj/829/20vs:catalogservice2018-05-16T07:05:17J/ApJ/829/20Chandra ACIS survey in nearby galaxies. II (Wang+, 2016)2018-05-16T07:05:17researchBased on the recently completed Chandra/ACIS survey of X-ray point sources in nearby galaxies, we study the X-ray luminosity functions (XLFs) for X-ray point sources in different types of galaxies and the statistical properties of ultraluminous X-ray sources (ULXs). Uniform procedures are developed to compute the detection threshold, to estimate the foreground/background contamination, and to calculate the XLFs for individual galaxies and groups of galaxies, resulting in an XLF library of 343 galaxies of different types. With the large number of surveyed galaxies, we have studied the XLFs and ULX properties across different host galaxy types, and confirm with good statistics that the XLF slope flattens from lenticular ({alpha}{\sim}1.50{\pm}0.07) to elliptical ({\sim}1.21{\pm}0.02), to spirals ({\sim}0.80{\pm}0.02), to peculiars ({\sim}0.55{\pm}0.30), and to irregulars ({\sim}0.26{\pm}0.10). The XLF break dividing the neutron star and black hole binaries is also confirmed, albeit at quite different break luminosities for different types of galaxies. A radial dependency is found for ellipticals, with a flatter XLF slope for sources located between D_25_ and 2D_25_, suggesting the XLF slopes in the outer region of early-type galaxies are dominated by low-mass X-ray binaries in globular clusters. This study shows that the ULX rate in early-type galaxies is 0.24{\pm}0.05 ULXs per surveyed galaxy, on a 5{sigma} confidence level. The XLF for ULXs in late-type galaxies extends smoothly until it drops abruptly around 4x10^40^erg/s, and this break may suggest a mild boundary between the stellar black hole population possibly including 30M{\sun} black holes with super-Eddington radiation and intermediate mass black holes.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/829/20Wang S., Qiu Y., Liu J., Bregman J.N.catalogbibcode2016ApJ...829...20W06-Mar-2018 - x-raypublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/apjs/179/36044vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJS/179/360/sources? - - ivo://cds.vizier/j/apjs/179/3604cs:conesearchCone search capability for table J/ApJS/179/360/sources (Sources list)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/apjs/179/360vs:catalogservice2018-01-31T07:09:53J/ApJS/179/360Thermonuclear X-ray bursts observed by RXTE (Galloway+, 2008)2018-04-05T10:00:00researchWe present a sample of 1187 thermonuclear (type-I) X-ray bursts from public (archival) observations of 48 low-mass X-ray binaries accreting neutron stars by the Rossi X-ray Timing Explorer, spanning 1996 January - 2007 June 3. For each burst, we list results of analysis of data from the Proportional Counter Array, including observed count rates, time-resolved spectroscopy, evolution of the burst lightcurve, and details of the persistent flux and source spectral state at the time of the burst.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJS/179/360Galloway D.K., Muno M.P., Hartman J.M., Psaltis D., Chakrabarty D.catalogbibcode2008ApJS..179..360G23-Sep-2008 - x-raypublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/azh/81/20944vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/AZh/81/209/table1? - - ivo://cds.vizier/j/azh/81/2094cs:conesearchCone search capability for table J/AZh/81/209/table1 (Stellar parameters of the selected sample and the final [Nd/Fe] ratios)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/azh/81/209vs:catalogservice2017-12-22T06:32:10J/AZh/81/209Neutron capture elements in stars: neodymium (Mashonkina+, 2004)2018-04-05T10:00:00researchWe determined the neodymium abundances for 60 of the 78 stars studied by Mashonkina et al. (2003A&A...397..275M). We obtained spectroscopic observations of seven stars in April 2001 with the UVES echelle spectrometer mounted on the 8-m VLT2 telescope of the European Southern Observatoryin Chile. These observations cover 3800-4500{AA} and 4750-6650{AA}. Spectroscopic observations of 53 stars at 4100-6700{AA} were obtained in 1995-2001 with the FOCES echelle spectrometer mounted on the 2.2-m telescope of the German-Spanish Astronomical Center in Calar Alto, Spain.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AZh/81/209Mashonkina L.I., Kamaeva L.A., Samotoev V.A., Sakhibullin N.A.catalogbibcode2004AZh....81..209M10-Dec-2004 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/azh/83/54244vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/AZh/83/542/pulsars? - - ivo://cds.vizier/j/azh/83/5424cs:conesearchCone search capability for table J/AZh/83/542/pulsars (Luminosities of short- and long-period pulsars)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/azh/83/542vs:catalogservice2018-01-05T09:56:22J/AZh/83/542Integrated Radio Luminosities of Pulsars (Malov+, 2006)2018-04-05T10:00:00researchThe integrated radio luminosities of 311 long-period (P>0.1s) and 27 short-period (P<0.1s) pulsars have been calculated using a new compilation of radio spectra. The luminosities are in the range 10^27^-10^30^erg/s for 88% of the long-period pulsars and 10^28^-10^31^erg/s for 88% of the short-period pulsars. We find a high correlation between the luminosity L and the estimate L1=S_(400)_*d^2^ from the catalog of Taylor et al. (1993, See Cat. <VII/189>. The factor 'eta' for transformation of the rotational energy of the neutron star into radio emission increases/decreases with increasing period for long-period/short-period pulsars. The mean value of 'eta'=-3.73 for the long-period and -4.85 for the short-period pulsars.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AZh/83/542Malov I.F., Malov O.I.catalogbibcode2006AZh...83...542M01-Jul-2007 - radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/azh/88/2244vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/AZh/88/22/pulsars? - - ivo://cds.vizier/j/azh/88/224cs:conesearchCone search capability for table J/AZh/88/22/pulsars (Pulsars studied: initial parameters and calculated {beta} angles)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/azh/88/22vs:catalogservice2017-07-05T07:00:11J/AZh/88/22Angles rotation/magnetic moment in pulsars (Malov+, 2011)2018-04-05T10:00:00researchData on the pulse structure and variations of the linear polarization angle at frequencies near 1GHz have been used to estimate the angles {beta} between the rotational axis and magnetic moment of the neutron stars associated with 80 pulsars.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AZh/88/22Malov I.F., Nikitina E.B.catalogbibcode2011AZh....88...22M27-Jan-2011 - radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/azh/88/95444vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/AZh/88/954/table1? - - ivo://cds.vizier/j/azh/88/9544cs:conesearchCone search capability for table J/AZh/88/954/table1 (*Calculated values of {beta}1 for 10cm and 20cm)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/azh/88/954vs:catalogservice2017-10-18T08:24:25J/AZh/88/954Geometry of radio pulsar magnetospheres (Malov+, 2011)2018-04-05T10:00:00researchData on the profiles and polarization of the 10- and 20-cm emission of radio pulsars are used to calculate the angle {beta} between the rotational axis of the neutron star and its magnetic moment. It is shown that, for these calculations, it is sufficient to use catalog values of the pulse width at the 10% level W10, since the broadening of the observed pulses due to the transition to the full width W0 and narrowing of the pulses associated with the emission of radiation along tangents to the field lines approximately cancel each other out. The angles {beta}1 are calculated for 283 pulsars at 20cm and 132 pulsars at 10cm, assuming that the line of sight passes through the center of the emission cone.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AZh/88/954Malov I.F., Nikitina E.B.catalogbibcode2011AZh....88..954M14-Nov-2011 - optical#radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/mnras/287/29344vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/MNRAS/287/293/table1? - - ivo://cds.vizier/j/mnras/287/2934cs:conesearchCone search capability for table J/MNRAS/287/293/table1 (Unidentified EUV sources)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/mnras/287/293vs:catalogservice1998-02-08T13:48:38J/MNRAS/287/293BR photometry of EUVE sources (Maoz+ 1997)2018-04-05T10:00:00researchMost of the sources detected in the extreme ultraviolet (EUV; 100-600{AA}) by the ROSAT/WFC and EUVE all-sky surveys have been identified with active late-type stars and hot white dwarfs that are near enough to the Earth to escape absorption by interstellar gas. However, about 15 per cent of EUV sources are as yet unidentified with any optical counterparts. We examine whether the unidentified EUV sources may consist of the same population of late-type stars and white dwarfs. We present B and R photometry of stars in the fields of seven of the unidentified EUV sources. We detect in the optical the entire main-sequence and white dwarf population out to the greatest distances where they could still avoid absorption. We use colour-magnitude diagrams to demonstrate that, in most of the fields, none of the observed stars has the colours and magnitudes of late-type dwarfs at distances less than 100pc. Similarly, none of the observed stars is a white dwarf within 500pc that is hot enough to be a EUV emitter. The unidentified EUV sources we study are not detected in X-rays, while cataclysmic variables, X-ray binaries, and active galactic nuclei generally are. We conclude that some of the EUV sources may be a new class of nearby objects, which are either very faint at optical bands or which mimic the colours and magnitudes of distant late-type stars or cool white dwarfs. One candidate for optically faint objects is isolated old neutron stars, slowly accreting interstellar matter. Such neutron stars are expected to be abundant in the Galaxy, and have not been unambiguously detected.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/MNRAS/287/293Maoz D., Ofek E.O., Shemi A.catalogbibcode1997MNRAS.287..293M24-Oct-1997 - x-ray#uvpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/mnras/342/129944vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/MNRAS/342/1299/table1? - - ivo://cds.vizier/j/mnras/342/12994cs:conesearchCone search capability for table J/MNRAS/342/1299/table1 (*Positions, flux densities and widths for 200 pulsars discovered in the Parkes Multibeam Pulsar Survey (PMPS))ivo://ivoa.net/std/conesearchivo://cds.vizier/j/mnras/342/1299vs:catalogservice2017-06-14T07:31:14J/MNRAS/342/1299Parkes Multi-Beam Pulsar Survey. III. (Kramer+, 2003)2018-04-05T10:00:00researchThe Parkes Multibeam Pulsar Survey has unlocked vast areas of the Galactic plane, which were previously invisible to earlier low-frequency and less-sensitive surveys. The survey has discovered more than 600 new pulsars so far, including many that are young and exotic. In this paper we report the discovery of 200 pulsars for which we present positional and spin-down parameters, dispersion measures, flux densities and pulse profiles. A large number of these new pulsars are young and energetic, and we review possible associations of {gamma}-ray sources with the sample of about 1300 pulsars for which timing solutions are known. Based on a statistical analysis, we estimate that about 19+/-6 associations are genuine. The survey has also discovered 12 pulsars with spin properties similar to those of the Vela pulsar, nearly doubling the known population of such neutron stars. Studying the properties of all known 'Vela-like' pulsars, we find their radio luminosities to be similar to normal pulsars, implying that they are very inefficient radio sources. Finally, we review the use of the newly discovered pulsars as Galactic probes and discuss the implications of the new NE2001 Galactic electron density model for the determination of pulsar distances and luminosities.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/MNRAS/342/1299Kramer M., Bell J.F., Manchester R.N., Lyne A.G., Camilo F., Stairs I.H., D'Amico N., Kaspi V.M., Hobbs G., Morris D.J., Crawford F., Possenti A., Joshi B.C., McLaughlin M.A., Lorimer D.R., Faulkner A.J.catalogbibcode2003MNRAS.342.1299K12-Sep-2003 - gamma-ray#radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/mnras/402/236944vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/MNRAS/402/2369/assoc? - - ivo://cds.vizier/j/mnras/402/23694cs:conesearchCone search capability for table J/MNRAS/402/2369/assoc (Positional and kinematical data for OB associations and clusters (table A1 in the paper))ivo://ivoa.net/std/conesearchivo://cds.vizier/j/mnras/402/2369vs:catalogservice2015-02-06T11:52:18J/MNRAS/402/2369Kinematics of young associations/clusters (Tetzlaff+, 2010)2018-04-05T10:00:00researchGiven a distance of 1kpc and typical neutron star velocities of 100-500km/s (Arzoumanian et al. 2002ApJ...568..289A; Hobbs et al., 2005, Cat. J/MNRAS/360/974) and maximum ages of 5Myr for neutron stars to be detectable in the optical (see cooling curves in Gusakov et al. 2005MNRAS.363..555G and Popov, Grigorian & Blaschke 2006, Phys. Rev. C, 74, 025803), we restricted our search for birth associations and clusters of young nearby neutron stars to within 3kpc. We chose a sample of OB associations and young clusters (we use the term `association' for both in the following) within 3kpc from the Sun with available kinematic data and distance. We collected those from Dambis, Mel'nik & Rastorguev (2001AstL...27...58D) and Hoogerwerf (2001A&A...365...49H) and associations to which stars from the Galactic O-star catalogue from Maiz-Apellaniz et al. (2004, Cat. J/ApJS/151/103) are associated with. Furthermore, we added young local associations (YLA) from Fernandez, Figueras & Torra (2008A&A...480..735F) since they are possible hosts of a few SNe in the near past. We also included the Hercules-Lyrae association (Her-Lyr) and the Pleiades and massive star-forming regions (Reipurth 2008, ASP Monograph Publ. Vol. 4 and Vol. 5). We set the lower limit of the association age to 2Myr to account for the minimum lifetime of a progenitor star that can produce a neutron star (progenitor mass smaller than 30M_{sun}_ see e.g. Heger et al. 2003ApJ...591..288H). The list of all explored associations and their properties can be found in Appendix A. Coordinates as well as heliocentric velocity components are given for a right-handed coordinate system with the x-axis pointing towards the galactic centre and y is positive in the direction of galactic rotation.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/MNRAS/402/2369Tetzlaff N., Neuhaeuser R., Hohle M.M., Maciejewski G.catalogbibcode2010MNRAS.402.2369T09-Mar-2010 - radiopublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/mnras/419/209544vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/MNRAS/419/2095/hmxb? - - ivo://cds.vizier/j/mnras/419/20954cs:conesearchCone search capability for table J/MNRAS/419/2095/hmxb (High-mass X-ray binaries Catalogue)ivo://ivoa.net/std/conesearchivo://cds.vizier/j/mnras/419/2095vs:catalogservice2017-11-28T14:21:30J/MNRAS/419/2095HMXBs in nearby galaxies (Mineo+, 2012)2018-04-05T10:00:00researchBased on a homogeneous set of X-ray, infrared and ultraviolet observations from Chandra, Spitzer, GALEX and 2MASS archives, we study populations of high-mass X-ray binaries (HMXBs) in a sample of 29 nearby star-forming galaxies and their relation with the star formation rate (SFR). In agreement with previous results, we find that HMXBs are a good tracer of the recent star formation activity in the host galaxy and their collective luminosity and number scale with the SFR, in particular, LX~~2.6x10^39^SFR. However, the scaling relations still bear a rather large dispersion of rms~0.4dex, which we believe is of a physical origin. We present the catalog of 1057 X-ray sources detected within the D25 ellipse for galaxies of our sample and construct the average X-ray luminosity function (XLF) of HMXBs with substantially improved statistical accuracy and better control of systematic effects than achieved in previous studies. The XLF follows a power law with slope of 1.6 in the log(LX)~35-40 luminosity range with a moderately significant evidence for a break or cut-off at LX~10^40^erg/s. As before, we did not find any features at the Eddington limit for a neutron star or a stellar mass black hole. We discuss implications of our results for the theory of binary evolution. In particular we estimate the fraction of compact objects that once upon their lifetime experienced an X-ray active phase powered by accretion from a high mass companion and obtain a rather large number, fX~0.2x(0.1Myr/{tau}x) ({tau}x is the life time of the X-ray active phase). This is about 4 orders of magnitude more frequent than in LMXBs. We also derive constrains on the mass distribution of the secondary star in HMXBs.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/MNRAS/419/2095Mineo S., Gilfanov M., Sunyaev R.catalogbibcode2012MNRAS.419.2095M26-Sep-2011 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/j/other/sci/292.229044vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/J/other/Sci/292.2290/table1? - - ivo://cds.vizier/j/other/sci/292.22904cs:conesearchCone search capability for table J/other/Sci/292.2290/table1 (47 Tuc X-Ray Source Parameters (MS 61135))ivo://ivoa.net/std/conesearchivo://cds.vizier/j/other/sci/292.2290vs:catalogservice2003-11-11T20:38:15J/other/Sci/292.Chandra compact binaries in 47 Tuc (Grindlay+, 2001)2018-04-05T10:00:00researchWe have obtained high-resolution (<~1") deep X-ray images of the globular cluster 47 Tucanae (NGC 104) with the Chandra X-ray Observatory to study the population of compact binaries in the high stellar density core. A 70-kilosecond exposure of the cluster reveals a centrally concentrated population of faint (L_X_~10^30-33^ergs/s) X-ray sources, with at least 108 located within the central 2'x2.5' and >~half with L_X_<~10^30.5^ergs/s. All 15 millisecond pulsars (MSPs) recently located precisely by radio observations are identified, though 2 are unresolved by Chandra. The X-ray spectral and temporal characteristics, as well as initial optical identifications with the Hubble Space Telescope, suggest that >~50 percent are MSPs, about 30 percent are accreting white dwarfs, about 15 percent are main-sequence binaries in flare outbursts, and only two to three are quiescent low-mass X-ray binaries containing neutron stars, the conventional progenitors of MSPs. An upper limit of about 470 times the mass of the sun is derived for the mass of an accreting central black hole in the cluster. These observations provide the first X-ray ``color-magnitude'' diagram for a globular cluster and census of its compact object and binary population. Observations were made on UT 16.31 - 17.22 March, 2000.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/other/Sci/292.2290Grindlay J.E., Heinke C., Edmonds P.D., Murray S.S.catalogbibcode2001Sci...292.2290G31-Jan-2002 - x-raypublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/113d44vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/113D/cbdata? - - ivo://cds.vizier/v/113d4cs:conesearchCone search capability for table V/113D/cbdata (Catalogue of Cataclysmic Binaries)ivo://ivoa.net/std/conesearchivo://cds.vizier/v/113dvs:catalogservice2018-01-05T09:56:04V/113DCataclysmic Binaries, LMXBs, and related objects (Ritter+, 2003)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 572 cataclysmic binaries, 80 low-mass X-ray binaries and 142 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 761 of the 794 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 31 December 2004 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated lists by Ritter and Kolb (1995; catalogue <V/82>) (1998; catalogue <V/99>).http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/113DRitter H., Kolb U.catalogbibcode2003A&A...404..301R24-Mar-2005 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/113d55vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/113D/lmxbdata? - - ivo://cds.vizier/v/113d5cs:conesearchCone search capability for table V/113D/lmxbdata (Catalogue of Low-Mass X-Ray Binaries)ivo://ivoa.net/std/conesearchivo://cds.vizier/v/113dvs:catalogservice2018-01-05T09:56:04V/113DCataclysmic Binaries, LMXBs, and related objects (Ritter+, 2003)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 572 cataclysmic binaries, 80 low-mass X-ray binaries and 142 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 761 of the 794 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 31 December 2004 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated lists by Ritter and Kolb (1995; catalogue <V/82>) (1998; catalogue <V/99>).http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/113DRitter H., Kolb U.catalogbibcode2003A&A...404..301R24-Mar-2005 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/113d66vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/113D/pcbdata? - - ivo://cds.vizier/v/113d6cs:conesearchCone search capability for table V/113D/pcbdata (Catalogue of Related Objects)ivo://ivoa.net/std/conesearchivo://cds.vizier/v/113dvs:catalogservice2018-01-05T09:56:04V/113DCataclysmic Binaries, LMXBs, and related objects (Ritter+, 2003)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 572 cataclysmic binaries, 80 low-mass X-ray binaries and 142 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 761 of the 794 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 31 December 2004 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated lists by Ritter and Kolb (1995; catalogue <V/82>) (1998; catalogue <V/99>).http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/113DRitter H., Kolb U.catalogbibcode2003A&A...404..301R24-Mar-2005 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/9044vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/90/table1? - - ivo://cds.vizier/v/904cs:conesearchCone search capability for table V/90/table1 (Low mass X-ray binaries (LMXB))ivo://ivoa.net/std/conesearchivo://cds.vizier/v/90vs:catalogservice2013-03-06T07:14:45V/90Catalogue of X-Ray Binaries (van Paradijs 1995)2018-04-05T10:00:00researchThe objects described in this catalog are X-Ray binaries, i.e., semi-detached binary stars in which matter is transferred from a usually more or less normal star to a neutron star or black hole. Thus, cataclysmic variables are not included. The tables provide basic information of the systems as well as selected references. The tables contain 124 low-mass and 69 high mass X-ray binaries.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/90van Paradijs J.catalogbibcode - 09-Jan-1997 - x-raypublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/9055vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/90/table2? - - ivo://cds.vizier/v/905cs:conesearchCone search capability for table V/90/table2 (High mass X-ray binaries (HMXB))ivo://ivoa.net/std/conesearchivo://cds.vizier/v/90vs:catalogservice2013-03-06T07:14:45V/90Catalogue of X-Ray Binaries (van Paradijs 1995)2018-04-05T10:00:00researchThe objects described in this catalog are X-Ray binaries, i.e., semi-detached binary stars in which matter is transferred from a usually more or less normal star to a neutron star or black hole. Thus, cataclysmic variables are not included. The tables provide basic information of the systems as well as selected references. The tables contain 124 low-mass and 69 high mass X-ray binaries.http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/90van Paradijs J.catalogbibcode - 09-Jan-1997 - x-raypublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/9944vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/99/cbdata? - - ivo://cds.vizier/v/994cs:conesearchCone search capability for table V/99/cbdata (Catalogue of Cataclysmic Binaries)ivo://ivoa.net/std/conesearchivo://cds.vizier/v/99vs:catalogservice2003-06-08T16:50:32V/99Cataclysmic Binaries and LMXB Catalogue (Ritter+ 1998)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 318 cataclysmic binaries, 47 low-mass X-ray binaries and 49 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 394 of the 414 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 30 June 1997 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated list by Ritter and Kolb (1995; catalogue <V/82>).http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/99Ritter H., Kolb U.catalogbibcode1998A&AS..129...83R16-Dec-1997 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/9955vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/99/lmxbdata? - - ivo://cds.vizier/v/995cs:conesearchCone search capability for table V/99/lmxbdata (Catalogue of Low-Mass X-Ray Binaries)ivo://ivoa.net/std/conesearchivo://cds.vizier/v/99vs:catalogservice2003-06-08T16:50:32V/99Cataclysmic Binaries and LMXB Catalogue (Ritter+ 1998)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 318 cataclysmic binaries, 47 low-mass X-ray binaries and 49 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 394 of the 414 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 30 June 1997 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated list by Ritter and Kolb (1995; catalogue <V/82>).http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/99Ritter H., Kolb U.catalogbibcode1998A&AS..129...83R16-Dec-1997 - opticalpublic - ivo://cds.vizier/registry
ivo://cds.vizier/v/9966vs:paramhttpstd - gettext/xml+votable - basehttp://vizier.u-strasbg.fr/viz-bin/conesearch/V/99/pcbdata? - - ivo://cds.vizier/v/996cs:conesearchCone search capability for table V/99/pcbdata (Catalogue of Related Objects)ivo://ivoa.net/std/conesearchivo://cds.vizier/v/99vs:catalogservice2003-06-08T16:50:32V/99Cataclysmic Binaries and LMXB Catalogue (Ritter+ 1998)2018-04-05T10:00:00researchCataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 318 cataclysmic binaries, 47 low-mass X-ray binaries and 49 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 394 of the 414 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 30 June 1997 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated list by Ritter and Kolb (1995; catalogue <V/82>).http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/99Ritter H., Kolb U.catalogbibcode1998A&AS..129...83R16-Dec-1997 - opticalpublic - ivo://cds.vizier/registry
ivo://nasa.heasarc/rasscndins11vs:paramhttpstd - gettext/xml - basehttps://heasarc.gsfc.nasa.gov/cgi-bin/vo/cone/coneGet.pl?table=rasscndins& - - ivo://nasa.heasarc/rasscndins1cs:conesearch - ivo://ivoa.net/std/conesearchivo://nasa.heasarc/rasscndinsvs:catalogservice2018-09-11T00:00:00RASSCNDINSROSAT All-Sky Survey Candidate Isolated Neutron Stars2018-09-11T00:00:00researchNo Description Availablehttps://heasarc.gsfc.nasa.gov/W3Browse/all/rasscndins.htmlTurner et al.catalog - 2010ApJ...714.1424T - - optical - - ivo://nasa.heasarc/registry
-
-
+ + Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ The resources (like services, data collections, organizations) +present in this registry. Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ Information on access modes of a capability. Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ Metadata on columns of a resource's tables. Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ Pieces of behaviour of a resource. Tables containing the information in the IVOA Registry. To query +these tables, use `our TAP service`_. + +For more information and example queries, see the `RegTAP +specification`_. + +.. _our TAP service: /__system__/tap/run/info .. _RegTAP +specification: http://www.ivoa.net/documents/RegTAP/ Topics, object types, or other descriptive keywords about the +resource.Query successfulFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.resourceFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.interfaceFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.table_columnFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.capabilityFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.res_subject +The terms are taken from the vocabulary +http://ivoa.net/rdf/voresource/content_level. +The terms are taken from the vocabulary +http://ivoa.net/rdf/voresource/content_type. +The allowed values for waveband include: +Radio, Millimeter, Infrared, Optical, UV, EUV, X-ray, Gamma-ray.Unambiguous reference to the resource conforming to the IVOA standard for identifiers.Resource type (something like vg:authority, vs:catalogservice, etc).A short name or abbreviation given to something, for presentation in space-constrained fields (up to 16 characters).The full name given to the resource.A hash-separated list of content levels specifying the intended audience.An account of the nature of the resource.URL pointing to a human-readable document describing this resource.The creator(s) of the resource in the order given by the resource record author, separated by semicolons.A hash-separated list of natures or genres of the content of the resource.The format of source_value. This, in particular, can be ``bibcode''.A single numeric value representing the angle, given in decimal degrees, by which a positional query against this resource should be ``blurred'' in order to get an appropriate match.A hash-separated list of regions of the electro-magnetic spectrum that the resource's spectral coverage overlaps with.AAAAHml2bzovL2Nkcy52aXppZXIvai9hK2EvNDkyLzkyMwAAABF2czpjYXRhbG9nc2VydmljZQAAAA1KL0ErQS80OTIvOTIzAAAAMQBQAHUAbABzAGEAcgAgAFQAaQBtAGkAbgBnACAAZgBvAHIAIABGAGUAcgBtAGkAIABHAGEAbQBtAGEALQByAGEAeQAgAFMAcABhAGMAZQAgAFQAZQBsAGUAcwBjAG8AcABlAAAACHJlc2VhcmNoAAADhABXAGUAIABkAGUAcwBjAHIAaQBiAGUAIABhACAAYwBvAG0AcAByAGUAaABlAG4AcwBpAHYAZQAgAHAAdQBsAHMAYQByACAAbQBvAG4AaQB0AG8AcgBpAG4AZwAgAGMAYQBtAHAAYQBpAGcAbgAgAGYAbwByACAAdABoAGUAIABMAGEAcgBnAGUAIABBAHIAZQBhACAAVABlAGwAZQBzAGMAbwBwAGUAIAAoAEwAQQBUACkAIABvAG4AIAB0AGgAZQAgAEYAZQByAG0AaQAgAEcAYQBtAG0AYQAtAHIAYQB5ACAAUwBwAGEAYwBlACAAVABlAGwAZQBzAGMAbwBwAGUAIAAoAGYAbwByAG0AZQByAGwAeQAgAEcATABBAFMAVAApAC4AIABUAGgAZQAgAGQAZQB0AGUAYwB0AGkAbwBuACAAYQBuAGQAIABzAHQAdQBkAHkAIABvAGYAIABwAHUAbABzAGEAcgBzACAAaQBuACAAZwBhAG0AbQBhACAAcgBhAHkAcwAgAGcAaQB2AGUAIABpAG4AcwBpAGcAaAB0AHMAIABpAG4AdABvACAAdABoAGUAIABwAG8AcAB1AGwAYQB0AGkAbwBuAHMAIABvAGYAIABuAGUAdQB0AHIAbwBuACAAcwB0AGEAcgBzACAAYQBuAGQAIABzAHUAcABlAHIAbgBvAHYAYQAgAHIAYQB0AGUAcwAgAGkAbgAgAHQAaABlACAARwBhAGwAYQB4AHkALAAgAGkAbgB0AG8AIABwAGEAcgB0AGkAYwBsAGUAIABhAGMAYwBlAGwAZQByAGEAdABpAG8AbgAgAG0AZQBjAGgAYQBuAGkAcwBtAHMAIABpAG4AIABuAGUAdQB0AHIAbwBuACAAcwB0AGEAcgAgAG0AYQBnAG4AZQB0AG8AcwBwAGgAZQByAGUAcwAsACAAYQBuAGQAIABpAG4AdABvACAAdABoAGUAIAAiAGUAbgBnAGkAbgBlAHMAIgAgAGQAcgBpAHYAaQBuAGcAIABwAHUAbABzAGEAcgAgAHcAaQBuAGQAIABuAGUAYgB1AGwAYQBlAC4AIABMAEEAVAAnAHMAIAB1AG4AcAByAGUAYwBlAGQAZQBuAHQAZQBkACAAcwBlAG4AcwBpAHQAaQB2AGkAdAB5ACAAYgBlAHQAdwBlAGUAbgAgADIAMABNAGUAVgAgAGEAbgBkACAAMwAwADAARwBlAFYAIAB0AG8AZwBlAHQAaABlAHIAIAB3AGkAdABoACAAaQB0AHMAIAAyAC4ANABzAHIAIABmAGkAZQBsAGQALQBvAGYALQB2AGkAZQB3ACAAbQBhAGsAZQBzACAAZABlAHQAZQBjAHQAaQBvAG4AIABvAGYAIABtAGEAbgB5ACAAZwBhAG0AbQBhAC0AcgBhAHkAIABwAHUAbABzAGEAcgBzACAAbABpAGsAZQBsAHkALAAgAGoAdQBzAHQAaQBmAHkAaQBuAGcAIAB0AGgAZQAgAG0AbwBuAGkAdABvAHIAaQBuAGcAIABvAGYAIABvAHYAZQByACAAdAB3AG8AIABoAHUAbgBkAHIAZQBkACAAcAB1AGwAcwBhAHIAcwAgAHcAaQB0AGgAIABsAGEAcgBnAGUAIABzAHAAaQBuAC0AZABvAHcAbgAgAHAAbwB3AGUAcgBzAC4AIABUAG8AIABzAGUAYQByAGMAaAAgAGYAbwByACAAZwBhAG0AbQBhAC0AcgBhAHkAIABwAHUAbABzAGEAdABpAG8AbgBzACAAZgByAG8AbQAgAG0AbwBzAHQAIABvAGYAIAB0AGgAZQBzAGUAIABwAHUAbABzAGEAcgBzACAAcgBlAHEAdQBpAHIAZQBzACAAYQAgAHMAZQB0ACAAbwBmACAAcABoAGEAcwBlAC0AYwBvAG4AbgBlAGMAdABlAGQAIAB0AGkAbQBpAG4AZwAgAHMAbwBsAHUAdABpAG8AbgBzACAAcwBwAGEAbgBuAGkAbgBnACAAYQAgAHkAZQBhAHIAIABvAHIAIABtAG8AcgBlACAAdABvACAAcAByAG8AcABlAHIAbAB5ACAAYQBsAGkAZwBuACAAdABoAGUAIABzAHAAYQByAHMAZQAgAHAAaABvAHQAbwBuACAAYQByAHIAaQB2AGEAbAAgAHQAaQBtAGUAcwAuACAAVwBlACAAZABlAHMAYwByAGkAYgBlACAAdABoAGUAIABjAGgAbwBpAGMAZQAgAG8AZgAgAHAAdQBsAHMAYQByAHMAIABhAG4AZAAgAHQAaABlACAAaQBuAHMAdAByAHUAbQBlAG4AdABzACAAaQBuAHYAbwBsAHYAZQBkACAAaQBuACAAdABoAGUAIABjAGEAbQBwAGEAaQBnAG4ALgAAADJodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9BK0EvNDkyLzkyMwAAAXkAUwBtAGkAdABoACAARAAuAEEALgA7ACAARwB1AGkAbABsAGUAbQBvAHQAIABMAC4AOwAgAEMAYQBtAGkAbABvACAARgAuADsAIABDAG8AZwBuAGEAcgBkACAASQAuADsAIABEAHUAbQBvAHIAYQAgAEQALgA7ACAARQBzAHAAaQBuAG8AegBhACAAQwAuADsAIABGAHIAZQBpAHIAZQAgAFAALgBDAC4AQwAuADsAIABHAG8AdAB0AGgAZQBsAGYAIABFAC4AVgAuADsAIABIAGEAcgBkAGkAbgBnACAAQQAuAEsALgA7ACAASABvAGIAYgBzACAARwAuAEIALgA7ACAASgBvAGgAbgBzAHQAbwBuACAAUwAuADsAIABLAGEAcwBwAGkAIABWAC4ATQAuADsAIABLAHIAYQBtAGUAcgAgAE0ALgA7ACAATABpAHYAaQBuAGcAcwB0AG8AbgBlACAATQAuAEEALgA7ACAATAB5AG4AZQAgAEEALgBHAC4AOwAgAE0AYQBuAGMAaABlAHMAdABlAHIAIABSAC4ATgAuADsAIABNAGEAcgBzAGgAYQBsAGwAIABGAC4ARQAuADsAIABNAGMATABhAHUAZwBoAGwAaQBuACAATQAuAEEALgA7ACAATgBvAHUAdABzAG8AcwAgAEEALgA7ACAAUgBhAG4AcwBvAG0AIABTAC4ATQAuADsAIABSAG8AYgBlAHIAdABzACAATQAuAFMALgBFAC4AOwAgAFIAbwBtAGEAbgBpACAAUgAuAFcALgA7ACAAUwB0AGEAcABwAGUAcgBzACAAQgAuAFcALgA7ACAAVABoAGUAdQByAGUAYQB1ACAARwAuADsAIABUAGgAbwBtAHAAcwBvAG4AIABEAC4ASgAuADsAIABUAGgAbwByAHMAZQB0AHQAIABTAC4ARQAuADsAIABXAGEAbgBnACAATgAuADsAIABXAGUAbAB0AGUAdgByAGUAZABlACAAUAAuAAAAB2NhdGFsb2cAAAAHYmliY29kZX/AAAAAAAAPZ2FtbWEtcmF5I3JhZGlvAAABFmh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNDkyLzkyMy90YWJsZTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL0ErQS80OTIvOTIzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovQStBLzQ5Mi85MjM6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwAAAAZGl2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXgAAABednM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADNzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAdaXZvOi8vY2RzLnZpemllci9qL2ErYS82MTIvYTEAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAMSi9BK0EvNjEyL0ExAAAAHgBIAC4ARQAuAFMALgBTAC4AIABHAGEAbABhAGMAdABpAGMAIABQAGwAYQBuAGUAIABTAHUAcgB2AGUAeQAAAAhyZXNlYXJjaAAACCoAVwBlACAAcAByAGUAcwBlAG4AdAAgAHQAaABlACAAcgBlAHMAdQBsAHQAcwAgAG8AZgAgAHQAaABlACAAbQBvAHMAdAAgAGMAbwBtAHAAcgBlAGgAZQBuAHMAaQB2AGUAIABzAHUAcgB2AGUAeQAgAG8AZgAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlACAAaQBuACAAdgBlAHIAeQAgAGgAaQBnAGgALQBlAG4AZQByAGcAeQAgACgAVgBIAEUAKQAgAGcAYQBtAG0AYQAtAHIAYQB5AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQAgAHAAdQBiAGwAaQBjACAAcgBlAGwAZQBhAHMAZQAgAG8AZgAgAEcAYQBsAGEAYwB0AGkAYwAgAHMAawB5ACAAbQBhAHAAcwAsACAAYQAgAGMAYQB0AGEAbABvAGcAIABvAGYAIABWAEgARQAgAHMAbwB1AHIAYwBlAHMALAAgAGEAbgBkACAAdABoAGUAIABkAGkAcwBjAG8AdgBlAHIAeQAgAG8AZgAgADEANgAgAG4AZQB3ACAAcwBvAHUAcgBjAGUAcwAgAG8AZgAgAFYASABFACAAZwBhAG0AbQBhAC0AcgBhAHkAcwAuACAAVABoAGUAIABIAGkAZwBoACAARQBuAGUAcgBnAHkAIABTAHAAZQBjAHQAcgBvAHMAYwBvAHAAaQBjACAAUwB5AHMAdABlAG0AIAAoAEgALgBFAC4AUwAuAFMALgApACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlACAAcwB1AHIAdgBlAHkAIAAoAEgARwBQAFMAKQAgAHcAYQBzACAAYQAgAGQAZQBjAGEAZABlAC0AbABvAG4AZwAgAG8AYgBzAGUAcgB2AGEAdABpAG8AbgAgAHAAcgBvAGcAcgBhAG0AIABjAGEAcgByAGkAZQBkACAAbwB1AHQAIABiAHkAIAB0AGgAZQAgAEgALgBFAC4AUwAuAFMALgAgAEkAIABhAHIAcgBhAHkAIABvAGYAIABDAGgAZQByAGUAbgBrAG8AdgAgAHQAZQBsAGUAcwBjAG8AcABlAHMAIABpAG4AIABOAGEAbQBpAGIAaQBhACAAZgByAG8AbQAgADIAMAAwADQAIAB0AG8AIAAyADAAMQAzAC4AIABUAGgAZQAgAG8AYgBzAGUAcgB2AGEAdABpAG8AbgBzACAAYQBtAG8AdQBuAHQAIAB0AG8AIABuAGUAYQByAGwAeQAgADIANwAwADAAIABoACAAbwBmACAAcQB1AGEAbABpAHQAeQAtAHMAZQBsAGUAYwB0AGUAZAAgAGQAYQB0AGEALAAgAGMAbwB2AGUAcgBpAG4AZwAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlACAAYQB0ACAAbABvAG4AZwBpAHQAdQBkAGUAcwAgAGYAcgBvAG0AIABsAD0AMgA1ADAAewBkAGUAZwB9ACAAdABvACAANgA1AHsAZABlAGcAfQAgAGEAbgBkACAAbABhAHQAaQB0AHUAZABlAHMAIAB8AGIAfAA8AD0AMwAuACAASQBuACAAYQBkAGQAaQB0AGkAbwBuACAAdABvACAAdABoAGUAIAB1AG4AcAByAGUAYwBlAGQAZQBuAHQAZQBkACAAcwBwAGEAdABpAGEAbAAgAGMAbwB2AGUAcgBhAGcAZQAsACAAdABoAGUAIABIAEcAUABTACAAYQBsAHMAbwAgAGYAZQBhAHQAdQByAGUAcwAgAGEAIAByAGUAbABhAHQAaQB2AGUAbAB5ACAAaABpAGcAaAAgAGEAbgBnAHUAbABhAHIAIAByAGUAcwBvAGwAdQB0AGkAbwBuACAAKAAwAC4AMAA4AHsAZABlAGcAfQB+ADUALQBhAHIAYwBtAGkAbgAgAG0AZQBhAG4AIABwAG8AaQBuAHQAIABzAHAAcgBlAGEAZAAgAGYAdQBuAGMAdABpAG8AbgAgADYAOAAlACAAYwBvAG4AdABhAGkAbgBtAGUAbgB0ACAAcgBhAGQAaQB1AHMAKQAsACAAcwBlAG4AcwBpAHQAaQB2AGkAdAB5ACAAKAAxAC4ANQAlACAAQwByAGEAYgAgAGYAbAB1AHgAIABmAG8AcgAgAHAAbwBpAG4AdAAtAGwAaQBrAGUAIABzAG8AdQByAGMAZQBzACkALAAgAGEAbgBkACAAZQBuAGUAcgBnAHkAIAByAGEAbgBnAGUAIAAoADAALgAyAC0AMQAwADAAVABlAFYAKQAuACAAVwBlACAAYwBvAG4AcwB0AHIAdQBjAHQAZQBkACAAYQAgAGMAYQB0AGEAbABvAGcAIABvAGYAIABWAEgARQAgAGcAYQBtAG0AYQAtAHIAYQB5ACAAcwBvAHUAcgBjAGUAcwAgAGYAcgBvAG0AIAB0AGgAZQAgAEgARwBQAFMAIABkAGEAdABhACAAcwBlAHQAIAB3AGkAdABoACAAYQAgAHMAeQBzAHQAZQBtAGEAdABpAGMAIABwAHIAbwBjAGUAZAB1AHIAZQAgAGYAbwByACAAYgBvAHQAaAAgAHMAbwB1AHIAYwBlACAAZABlAHQAZQBjAHQAaQBvAG4AIABhAG4AZAAgAGMAaABhAHIAYQBjAHQAZQByAGkAegBhAHQAaQBvAG4AIABvAGYAIABtAG8AcgBwAGgAbwBsAG8AZwB5ACAAYQBuAGQAIABzAHAAZQBjAHQAcgB1AG0ALgAgAFcAZQAgAHAAcgBlAHMAZQBuAHQAIAB0AGgAaQBzACAAbABpAGsAZQBsAGkAaABvAG8AZAAtACAAYgBhAHMAZQBkACAAbQBlAHQAaABvAGQAIABpAG4AIABkAGUAdABhAGkAbAAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIAB0AGgAZQAgAGkAbgB0AHIAbwBkAHUAYwB0AGkAbwBuACAAbwBmACAAYQAgAG0AbwBkAGUAbAAgAGMAbwBtAHAAbwBuAGUAbgB0ACAAdABvACAAYQBjAGMAbwB1AG4AdAAgAGYAbwByACAAdQBuAHIAZQBzAG8AbAB2AGUAZAAsACAAbABhAHIAZwBlAC0AcwBjAGEAbABlACAAZQBtAGkAcwBzAGkAbwBuACAAYQBsAG8AbgBnACAAdABoAGUAIABHAGEAbABhAGMAdABpAGMAIABwAGwAYQBuAGUALgAgAEkAbgAgAHQAbwB0AGEAbAAsACAAdABoAGUAIAByAGUAcwB1AGwAdABpAG4AZwAgAEgARwBQAFMAIABjAGEAdABhAGwAbwBnACAAYwBvAG4AdABhAGkAbgBzACAANwA4ACAAVgBIAEUAIABzAG8AdQByAGMAZQBzACwAIABvAGYAIAB3AGgAaQBjAGgAIAAxADQAIABhAHIAZQAgAG4AbwB0ACAAcgBlAGEAbgBhAGwAeQB6AGUAZAAgAGgAZQByAGUALAAgAGYAbwByACAAZQB4AGEAbQBwAGwAZQAsACAAZAB1AGUAIAB0AG8AIAB0AGgAZQBpAHIAIABjAG8AbQBwAGwAZQB4ACAAbQBvAHIAcABoAG8AbABvAGcAeQAsACAAbgBhAG0AZQBsAHkAIABzAGgAZQBsAGwALQBsAGkAawBlACAAcwBvAHUAcgBjAGUAcwAgAGEAbgBkACAAdABoAGUAIABHAGEAbABhAGMAdABpAGMAIABjAGUAbgB0AGUAcgAgAHIAZQBnAGkAbwBuAC4AIABXAGgAZQByAGUAIABwAG8AcwBzAGkAYgBsAGUALAAgAHcAZQAgAHAAcgBvAHYAaQBkAGUAIABhACAAZgBpAHIAbQAgAGkAZABlAG4AdABpAGYAaQBjAGEAdABpAG8AbgAgAG8AZgAgAHQAaABlACAAVgBIAEUAIABzAG8AdQByAGMAZQAgAG8AcgAgAHAAbABhAHUAcwBpAGIAbABlACAAYQBzAHMAbwBjAGkAYQB0AGkAbwBuAHMAIAB3AGkAdABoACAAcwBvAHUAcgBjAGUAcwAgAGkAbgAgAG8AdABoAGUAcgAgAGEAcwB0AHIAbwBuAG8AbQBpAGMAYQBsACAAYwBhAHQAYQBsAG8AZwBzAC4AIABXAGUAIABhAGwAcwBvACAAcwB0AHUAZABpAGUAZAAgAHQAaABlACAAYwBoAGEAcgBhAGMAdABlAHIAaQBzAHQAaQBjAHMAIABvAGYAIAB0AGgAZQAgAFYASABFACAAcwBvAHUAcgBjAGUAcwAgAHcAaQB0AGgAIABzAG8AdQByAGMAZQAgAHAAYQByAGEAbQBlAHQAZQByACAAZABpAHMAdAByAGkAYgB1AHQAaQBvAG4AcwAuACAAMQA2ACAAbgBlAHcAIABzAG8AdQByAGMAZQBzACAAdwBlAHIAZQAgAHAAcgBlAHYAaQBvAHUAcwBsAHkAIAB1AG4AawBuAG8AdwBuACAAbwByACAAdQBuAHAAdQBiAGwAaQBzAGgAZQBkACwAIABhAG4AZAAgAHcAZQAgAGkAbgBkAGkAdgBpAGQAdQBhAGwAbAB5ACAAZABpAHMAYwB1AHMAcwAgAHQAaABlAGkAcgAgAGkAZABlAG4AdABpAGYAaQBjAGEAdABpAG8AbgBzACAAbwByACAAcABvAHMAcwBpAGIAbABlACAAYQBzAHMAbwBjAGkAYQB0AGkAbwBuAHMALgAgAFcAZQAgAGYAaQByAG0AbAB5ACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgADMAMQAgAHMAbwB1AHIAYwBlAHMAIABhAHMAIABwAHUAbABzAGEAcgAgAHcAaQBuAGQAIABuAGUAYgB1AGwAYQBlACAAKABQAFcATgBlACkALAAgAHMAdQBwAGUAcgBuAG8AdgBhACAAcgBlAG0AbgBhAG4AdABzACAAKABTAE4AUgBzACkALAAgAGMAbwBtAHAAbwBzAGkAdABlACAAUwBOAFIAcwAsACAAbwByACAAZwBhAG0AbQBhAC0AcgBhAHkAIABiAGkAbgBhAHIAaQBlAHMALgAgAEEAbQBvAG4AZwAgAHQAaABlACAANAA3ACAAcwBvAHUAcgBjAGUAcwAgAG4AbwB0ACAAeQBlAHQAIABpAGQAZQBuAHQAaQBmAGkAZQBkACwAIABtAG8AcwB0ACAAbwBmACAAdABoAGUAbQAgACgAMwA2ACkAIABoAGEAdgBlACAAcABvAHMAcwBpAGIAbABlACAAYQBzAHMAbwBjAGkAYQB0AGkAbwBuAHMAIAB3AGkAdABoACAAYwBhAHQAYQBsAG8AZwBlAGQAIABvAGIAagBlAGMAdABzACwAIABuAG8AdABhAGIAbAB5ACAAUABXAE4AZQAgAGEAbgBkACAAZQBuAGUAcgBnAGUAdABpAGMAIABwAHUAbABzAGEAcgBzACAAdABoAGEAdAAgAGMAbwB1AGwAZAAgAHAAbwB3AGUAcgAgAFYASABFACAAUABXAE4AZQAuAAAAMWh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL0ErQS82MTIvQTEAAAysAEgALgBFAC4AUwAuAFMALgAgAEMAbwBsAGwAYQBiAG8AcgBhAHQAaQBvAG4AOwAgAEEAYgBkAGEAbABsAGEAIABIAC4AOwAgAEEAYgByAGEAbQBvAHcAcwBrAGkAIABBAC4AOwAgAEEAaABhAHIAbwBuAGkAYQBuACAARgAuADsAIABBAGkAdAAgAEIAZQBuAGsAaABhAGwAaQAgAEYALgA7ACAAQQBuAGcAdQBlAG4AZQByACAARQAuAE8ALgA7ACAAQQByAGEAawBhAHcAYQAgAE0ALgA7ACAAQQByAHIAaQBlAHQAYQAgAE0ALgA7ACAAQQB1AGIAZQByAHQAIABQAC4AOwAgAEIAYQBjAGsAZQBzACAATQAuADsAIABCAGEAbAB6AGUAcgAgAEEALgA7ACAAQgBhAHIAbgBhAHIAZAAgAE0ALgA7ACAAQgBlAGMAaABlAHIAaQBuAGkAIABZAC4AOwAgAEIAZQBjAGsAZQByACAAVABqAHUAcwAgAEoALgA7ACAAQgBlAHIAZwBlACAARAAuADsAIABCAGUAcgBuAGgAYQByAGQAIABTAC4AOwAgAEIAZQByAG4AbABvAGUAaAByACAASwAuADsAIABCAGwAYQBjAGsAdwBlAGwAbAAgAFIALgA7ACAAQgBvAGUAdAB0AGMAaABlAHIAIABNAC4AOwAgAEIAbwBpAHMAcwBvAG4AIABDAC4AOwAgAEIAbwBsAG0AbwBuAHQAIABKAC4AOwAgAEIAbwBuAG4AZQBmAG8AeQAgAFMALgA7ACAAQgBvAHIAZABhAHMAIABQAC4AOwAgAEIAcgBlAGcAZQBvAG4AIABKAC4AOwAgAEIAcgB1AG4AIABGAC4AOwAgAEIAcgB1AG4AIABQAC4AOwAgAEIAcgB5AGEAbgAgAE0ALgA7ACAAQgB1AGUAYwBoAGUAbABlACAATQAuADsAIABCAHUAbABpAGsAIABUAC4AOwAgAEMAYQBwAGEAcwBzAG8AIABNAC4AOwAgAEMAYQByAHIAaQBnAGEAbgAgAFMALgA7ACAAQwBhAHIAbwBmAGYAIABTAC4AOwAgAEMAYQByAG8AcwBpACAAQQAuADsAIABDAGEAcwBhAG4AbwB2AGEAIABTAC4AOwAgAEMAZQByAHIAdQB0AGkAIABNAC4AOwAgAEMAaABhAGsAcgBhAGIAbwByAHQAeQAgAE4ALgA7ACAAQwBoAGEAdgBlAHMAIABSAC4AQwAuAEcALgA7ACAAQwBoAGUAbgAgAEEALgA7ACAAQwBoAGUAdgBhAGwAaQBlAHIAIABKAC4AOwAgAEMAbwBsAGEAZgByAGEAbgBjAGUAcwBjAG8AIABTAC4AOwAgAEMAbwBuAGQAbwBuACAAQgAuADsAIABDAG8AbgByAGEAZAAgAEoALgA7ACAARABhAHYAaQBkAHMAIABJAC4ARAAuADsAIABEAGUAYwBvAGMAawAgAEoALgA7ACAARABlAGkAbAAgAEMALgA7ACAARABlAHYAaQBuACAASgAuADsAIABkAGUAVwBpAGwAdAAgAFAALgA7ACAARABpAHIAcwBvAG4AIABMAC4AOwAgAEQAagBhAG4AbgBhAHQAaQAtAEEAdABhAGkAIABBAC4AOwAgAEQAbwBtAGEAaQBuAGsAbwAgAFcALgA7ACAARABvAG4AYQB0AGgAIABBAC4AOwAgAEQAcgB1AHIAeQAgAEwALgBPACcAQwAuADsAIABEAHUAdABzAG8AbgAgAEsALgA7ACAARAB5AGsAcwAgAEoALgA7ACAARQBkAHcAYQByAGQAcwAgAFQALgA7ACAARQBnAGIAZQByAHQAcwAgAEsALgA7ACAARQBnAGUAcgAgAFAALgA7ACAARQBtAGUAcgB5ACAARwAuADsAIABFAHIAbgBlAG4AdwBlAGkAbgAgAEoALgAtAFAALgA7ACAARQBzAGMAaABiAGEAYwBoACAAUwAuADsAIABGAGEAcgBuAGkAZQByACAAQwAuADsAIABGAGUAZwBhAG4AIABTAC4AOwAgAEYAZQByAG4AYQBuAGQAZQBzACAATQAuAFYALgA7ACAARgBpAGEAcwBzAG8AbgAgAEEALgA7ACAARgBvAG4AdABhAGkAbgBlACAARwAuADsAIABGAG8AZQByAHMAdABlAHIAIABBAC4AOwAgAEYAdQBuAGsAIABTAC4AOwAgAEYAdQBlAHMAcwBsAGkAbgBnACAATQAuADsAIABHAGEAYgBpAGMAaQAgAFMALgA7ACAARwBhAGwAbABhAG4AdAAgAFkALgBBAC4AOwAgAEcAYQByAHIAaQBnAG8AdQB4ACAAVAAuADsAIABHAGEAcwB0ACAASAAuADsAIABHAGEAdABlACAARgAuADsAIABHAGkAYQB2AGkAdAB0AG8AIABHAC4AOwAgAEcAaQBlAGIAZQBsAHMAIABCAC4AOwAgAEcAbABhAHcAaQBvAG4AIABEAC4AOwAgAEcAbABpAGMAZQBuAHMAdABlAGkAbgAgAEoALgBGAC4AOwAgAEcAbwB0AHQAcwBjAGgAYQBsAGwAIABEAC4AOwAgAEcAcgBvAG4AZABpAG4AIABNAC4ALQBIAC4AOwAgAEgAYQBoAG4AIABKAC4AOwAgAEgAYQB1AHAAdAAgAE0ALgA7ACAASABhAHcAawBlAHMAIABKAC4AOwAgAEgAZQBpAG4AegBlAGwAbQBhAG4AbgAgAEcALgA7ACAASABlAG4AcgBpACAARwAuADsAIABIAGUAcgBtAGEAbgBuACAARwAuADsAIABIAGkAbgB0AG8AbgAgAEoALgBBAC4AOwAgAEgAbwBmAG0AYQBuAG4AIABXAC4AOwAgAEgAbwBpAHMAYwBoAGUAbgAgAEMALgA7ACAASABvAGwAYwBoACAAVAAuAEwALgA7ACAASABvAGwAbABlAHIAIABNAC4AOwAgAEgAbwByAG4AcwAgAEQALgA7ACAASQB2AGEAcwBjAGUAbgBrAG8AIABBAC4AOwAgAEkAdwBhAHMAYQBrAGkAIABIAC4AOwAgAEoAYQBjAGgAbwBsAGsAbwB3AHMAawBhACAAQQAuADsAIABKAGEAbQByAG8AegB5ACAATQAuADsAIABKAGEAbgBrAG8AdwBzAGsAeQAgAEQALgA7ACAASgBhAG4AawBvAHcAcwBrAHkAIABGAC4AOwAgAEoAaQBuAGcAbwAgAE0ALgA7ACAASgBvAHUAdgBpAG4AIABMAC4AOwAgAEoAdQBuAGcALQBSAGkAYwBoAGEAcgBkAHQAIABJAC4AOwAgAEsAYQBzAHQAZQBuAGQAaQBlAGMAawAgAE0ALgBBAC4AOwAgAEsAYQB0AGEAcgB6AHkATgBzAGsAaQAgAEsALgA7ACAASwBhAHQAcwB1AHIAYQBnAGEAdwBhACAATQAuADsAIABLAGEAdAB6ACAAVQAuADsAIABLAGUAcgBzAHoAYgBlAHIAZwAgAEQALgA7ACAASwBoAGEAbgBnAHUAbAB5AGEAbgAgAEQALgA7ACAASwBoAGUAbABpAGYAaQAgAEIALgA7ACAASwBpAG4AZwAgAEoALgA7ACAASwBsAGUAcABzAGUAcgAgAFMALgA7ACAASwBsAG8AYwBoAGsAbwB2ACAARAAuADsAIABLAGwAdQB6AG4AaQBhAGsAIABXAC4AOwAgAEsAbwBtAGkAbgAgAE4AdQAuADsAIABLAG8AcwBhAGMAawAgAEsALgA7ACAASwByAGEAawBhAHUAIABTAC4AOwAgAEsAcgBhAHUAcwAgAE0ALgA7ACAASwByAHUAZQBnAGUAcgAgAFAALgBQAC4AOwAgAEwAYQBmAGYAbwBuACAASAAuADsAIABMAGEAbQBhAG4AbgBhACAARwAuADsAIABMAGEAdQAgAEoALgA7ACAATABlAGUAcwAgAEoALgAtAFAALgA7ACAATABlAGYAYQB1AGMAaABlAHUAcgAgAEoALgA7ACAATABlAG0AaQBlAHIAZQAgAEEALgA7ACAATABlAG0AbwBpAG4AZQAtAEcAbwB1AG0AYQByAGQAIABNAC4AOwAgAEwAZQBuAGEAaQBuACAASgAuAC0AUAAuADsAIABMAGUAcwBlAHIAIABFAC4AOwAgAEwAbwBoAHMAZQAgAFQALgA7ACAATABvAHIAZQBuAHQAegAgAE0ALgA7ACAATABpAHUAIABSAC4AOwAgAEwAbwBwAGUAegAtAEMAbwB0AG8AIABSAC4AOwAgAEwAeQBwAG8AdgBhACAASQAuADsAIABNAGEAcgBhAG4AZABvAG4AIABWAC4AOwAgAE0AYQBsAHkAcwBoAGUAdgAgAEQALgA7ACAATQBhAHIAYwBvAHcAaQB0AGgAIABBAC4AOwAgAE0AYQByAGkAYQB1AGQAIABDAC4AOwAgAE0AYQByAHgAIABSAC4AOwAgAE0AYQB1AHIAaQBuACAARwAuADsAIABNAGEAeAB0AGUAZAAgAE4ALgA7ACAATQBhAHkAZQByACAATQAuADsAIABNAGUAaQBuAHQAagBlAHMAIABQAC4ASgAuADsAIABNAGUAeQBlAHIAIABNAC4AOwAgAE0AaQB0AGMAaABlAGwAbAAgAEEALgBNAC4AVwAuADsAIABNAG8AZABlAHIAcwBrAGkAIABSAC4AOwAgAE0AbwBoAGEAbQBlAGQAIABNAC4AOwAgAE0AbwBoAHIAbQBhAG4AbgAgAEwALgA7ACAATQBvAHIAYQAgAEsALgA7ACAATQBvAHUAbABpAG4AIABFAC4AOwAgAE0AdQByAGEAYwBoACAAVAAuADsAIABOAGEAawBhAHMAaABpAG0AYQAgAFMALgA7ACAAZABlACAATgBhAHUAcgBvAGkAcwAgAE0ALgA7ACAATgBkAGkAeQBhAHYAYQBsAGEAIABIAC4AOwAgAE4AaQBlAGQAZQByAHcAYQBuAGcAZQByACAARgAuADsAIABOAGkAZQBtAGkAZQBjACAASgAuADsAIABPAGEAawBlAHMAIABMAC4AOwAgAE8AJwBCAHIAaQBlAG4AIABQAC4AOwAgAE8AZABhAGsAYQAgAEgALgA7ACAATwBoAG0AIABTAC4AOwAgAE8AcwB0AHIAbwB3AHMAawBpACAATQAuADsAIABPAHkAYQAgAEkALgA7ACAAUABhAGQAbwB2AGEAbgBpACAATQAuADsAIABQAGEAbgB0AGUAcgAgAE0ALgA7ACAAUABhAHIAcwBvAG4AcwAgAFIALgBEAC4AOwAgAFAAYQB6ACAAQQByAHIAaQBiAGEAcwAgAE0ALgA7ACAAUABlAGsAZQB1AHIAIABOAC4AVwAuADsAIABQAGUAbABsAGUAdABpAGUAcgAgAEcALgA7ACAAUABlAHIAZQBuAG4AZQBzACAAQwAuADsAIABQAGUAdAByAHUAYwBjAGkAIABQAC4ALQBPAC4AOwAgAFAAZQB5AGEAdQBkACAAQgAuADsAIABQAGkAZQBsACAAUQAuADsAIABQAGkAdABhACAAUwAuADsAIABQAG8AaQByAGUAYQB1ACAAVgAuADsAIABQAG8AbwBuACAASAAuADsAIABQAHIAbwBrAGgAbwByAG8AdgAgAEQALgA7ACAAUAByAG8AawBvAHAAaAAgAEgALgA7ACAAUAB1AGUAaABsAGgAbwBmAGUAcgAgAEcALgA7ACAAUAB1AG4AYwBoACAATQAuADsAIABRAHUAaQByAHIAZQBuAGIAYQBjAGgAIABBAC4AOwAgAFIAYQBhAGIAIABTAC4AOwAgAFIAYQB1AHQAaAAgAFIALgA7ACAAUgBlAGkAbQBlAHIAIABBAC4AOwAgAFIAZQBpAG0AZQByACAATwAuADsAIABSAGUAbgBhAHUAZAAgAE0ALgA7ACAAZABlACAAbABvAHMAIABSAGUAeQBlAHMAIABSAC4AOwAgAFIAaQBlAGcAZQByACAARgAuADsAIABSAGkAbgBjAGgAaQB1AHMAbwAgAEwALgA7ACAAUgBvAG0AbwBsAGkAIABDAC4AOwAgAFIAbwB3AGUAbABsACAARwAuADsAIABSAHUAZABhAGsAIABCAC4AOwAgAFIAdQBsAHQAZQBuACAAQwAuAEIALgA7ACAAUwBhAGYAaQAtAEgAYQByAGIAIABTAC4AOwAgAFMAYQBoAGEAawBpAGEAbgAgAFYALgA7ACAAUwBhAGkAdABvACAAUwAuADsAIABTAGEAbgBjAGgAZQB6ACAARAAuAEEALgA7ACAAUwBhAG4AdABhAG4AZwBlAGwAbwAgAEEALgA7ACAAUwBhAHMAYQBrAGkAIABNAC4AOwAgAFMAYwBoAGEAbgBkAHIAaQAgAE0ALgA7ACAAUwBjAGgAbABpAGMAawBlAGkAcwBlAHIAIABSAC4AOwAgAFMAYwBoAHUAZQBzAHMAbABlAHIAIABGAC4AOwAgAFMAYwBoAHUAbAB6ACAAQQAuADsAIABTAGMAaAB3AGEAbgBrAGUAIABVAC4AOwAgAFMAYwBoAHcAZQBtAG0AZQByACAAUwAuADsAIABTAGUAZwBsAGEAcgAtAEEAcgByAG8AeQBvACAATQAuADsAIABTAGUAdAB0AGkAbQBvACAATQAuADsAIABTAGUAeQBmAGYAZQByAHQAIABBAC4AUwAuADsAIABTAGgAYQBmAGkAIABOAC4AOwAgAFMAaABpAGwAbwBuACAASQAuADsAIABTAGgAaQBuAGkAbgBnAGEAeQBhAG0AdwBlACAASwAuADsAIABTAGkAbQBvAG4AaQAgAFIALgA7ACAAUwBvAGwAIABIAC4AOwAgAFMAcABhAG4AaQBlAHIAIABGAC4AOwAgAFMAcABpAHIALQBKAGEAYwBvAGIAIABNAC4AOwAgAFMAdABhAHcAYQByAHoAIABMAC4AOwAgAFMAdABlAGUAbgBrAGEAbQBwACAAUgAuADsAIABTAHQAZQBnAG0AYQBuAG4AIABDAC4AOwAgAFMAdABlAHAAcABhACAAQwAuADsAIABTAHUAcwBoAGMAaAAgAEkALgA7ACAAVABhAGsAYQBoAGEAcwBoAGkAIABUAC4AOwAgAFQAYQB2AGUAcgBuAGUAdAAgAEoALgAtAFAALgA7ACAAVABhAHYAZQByAG4AaQBlAHIAIABUAC4AOwAgAFQAYQB5AGwAbwByACAAQQAuAE0ALgA7ACAAVABlAHIAcgBpAGUAcgAgAFIALgA7ACAAVABpAGIAYQBsAGQAbwAgAEwALgA7ACAAVABpAHoAaQBhAG4AaQAgAEQALgA7ACAAVABsAHUAYwB6AHkAawBvAG4AdAAgAE0ALgA7ACAAVAByAGkAYwBoAGEAcgBkACAAQwAuADsAIABUAHMAaQByAG8AdQAgAE0ALgA7ACAAVABzAHUAagBpACAATgAuADsAIABUAHUAZgBmAHMAIABSAC4AOwAgAFUAYwBoAGkAeQBhAG0AYQAgAFkALgA7ACAAdgBhAG4AIABkAGUAcgAgAFcAYQBsAHQAIABEAC4ASgAuADsAIAB2AGEAbgAgAEUAbABkAGkAawAgAEMALgA7ACAAdgBhAG4AIABSAGUAbgBzAGIAdQByAGcAIABDAC4AOwAgAHYAYQBuACAAUwBvAGUAbABlAG4AIABCAC4AOwAgAFYAYQBzAGkAbABlAGkAYQBkAGkAcwAgAEcALgA7ACAAVgBlAGgAIABKAC4AOwAgAFYAZQBuAHQAZQByACAAQwAuADsAIABWAGkAYQBuAGEAIABBAC4AOwAgAFYAaQBuAGMAZQBuAHQAIABQAC4AOwAgAFYAaQBuAGsAIABKAC4AOwAgAFYAbwBpAHMAaQBuACAARgAuADsAIABWAG8AZQBsAGsAIABIAC4ASgAuADsAIABWAHUAaQBsAGwAYQB1AG0AZQAgAFQALgA7ACAAVwBhAGQAaQBhAHMAaQBuAGcAaAAgAFoALgA7ACAAVwBhAGcAbgBlAHIAIABTAC4ASgAuADsAIABXAGEAZwBuAGUAcgAgAFAALgA7ACAAVwBhAGcAbgBlAHIAIABSAC4ATQAuADsAIABXAGgAaQB0AGUAIABSAC4AOwAgAFcAaQBlAHIAegBjAGgAbwBsAHMAawBhACAAQQAuADsAIABXAGkAbABsAG0AYQBuAG4AIABQAC4AOwAgAFcAbwBlAHIAbgBsAGUAaQBuACAAQQAuADsAIABXAG8AdQB0AGUAcgBzACAARAAuADsAIABZAGEAbgBnACAAUgAuADsAIABaAGEAYgBvAHIAbwB2ACAARAAuADsAIABaAGEAYwBoAGEAcgBpAGEAcwAgAE0ALgA7ACAAWgBhAG4AaQBuACAAUgAuADsAIABaAGQAegBpAGEAcgBzAGsAaQAgAEEALgBBAC4AOwAgAFoAZQBjAGgAIABBAC4AOwAgAFoAZQBmAGkAIABGAC4AOwAgAFoAaQBlAGcAbABlAHIAIABBAC4AOwAgAFoAbwByAG4AIABKAC4AOwAgAFoAeQB3AHUAYwBrAGEAIABOAC4AAAAHY2F0YWxvZwAAAAdiaWJjb2Rlf8AAAAAAAAlnYW1tYS1yYXkAAASraHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL3NucmNhdD86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYxMi9BMS9sc2NvbXA/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTIvQTEvY29tcG9uPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0ErQS82MTIvQTE6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYxMi9BMS9saXN0Pzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL3NvdXJjZXM/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTIvQTEvc25yY2F0Pzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL2xzY29tcD86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYxMi9BMS9jb21wb24/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0ErQS82MTIvQTE6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQStBLzYxMi9BMTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL2xpc3Q/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTIvQTEvc291cmNlcz86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQStBLzYxMi9BMQAAAjdpdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6OjoAAAGjdnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXIAAAEFc3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6AAAAH2l2bzovL2Nkcy52aXppZXIvai9hK2EvNjE4L2ExODYAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAOSi9BK0EvNjE4L0ExODYAAAAdAEQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAbwBmACAAMQAwACAAcAB1AGwAcwBhAHIAcwAAAAhyZXNlYXJjaAAABwUAUAB1AGwAcwBhAHIAcwAgAHMAYwBpAG4AdABpAGwAbABhAHQAZQAuACAARAB5AG4AYQBtAGkAYwAgAHMAcABlAGMAdAByAGEAIABzAGgAbwB3ACAAYgByAGkAZwBoAHQAbgBlAHMAcwAgAHYAYQByAGkAYQB0AGkAbwBuACAAbwBmACAAcAB1AGwAcwBhAHIAcwAgAGkAbgAgAHQAaABlACAAdABpAG0AZQAgAGEAbgBkACAAZgByAGUAcQB1AGUAbgBjAHkAIABkAG8AbQBhAGkAbgAuACAAUwBlAGMAbwBuAGQAYQByAHkAIABzAHAAZQBjAHQAcgBhACAAZABlAG0AbwBuAHMAdAByAGEAdABlACAAdABoAGUAIABkAGkAcwB0AHIAaQBiAHUAdABpAG8AbgAgAG8AZgAgAGYAbAB1AGMAdAB1AGEAdABpAG8AbgAgAHAAbwB3AGUAcgAgAGkAbgAgAHQAaABlACAAZAB5AG4AYQBtAGkAYwAgAHMAcABlAGMAdAByAGEALgAgAEQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAcwB0AHIAbwBuAGcAbAB5ACAAZABlAHAAZQBuAGQAIABvAG4AIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AYQBsACAAZgByAGUAcQB1AGUAbgBjAGkAZQBzACwAIABiAHUAdAAgAHcAZQByAGUAIABvAGYAdABlAG4AIABvAGIAcwBlAHIAdgBlAGQAIABhAHQAIABmAHIAZQBxAHUAZQBuAGMAaQBlAHMAIABsAG8AdwBlAHIAIAB0AGgAYQBuACAAMQAuADUARwBIAHoALgAgAFMAYwBpAG4AdABpAGwAbABhAHQAaQBvAG4AIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAGEAdAAgAGgAaQBnAGgAZQByACAAZgByAGUAcQB1AGUAbgBjAGkAZQBzACAAaABlAGwAcAAgAHQAbwAgAGMAbwBuAHMAdAByAGEAaQBuACAAdABoAGUAIAB0AHUAcgBiAHUAbABlAG4AYwBlACAAZgBlAGEAdAB1AHIAZQAgAG8AZgAgAHQAaABlACAAaQBuAHQAZQByAHMAdABlAGwAbABhAHIAIABtAGUAZABpAHUAbQAgAG8AdgBlAHIAIABhACAAdwBpAGQAZQAgAGYAcgBlAHEAdQBlAG4AYwB5ACAAcgBhAG4AZwBlACAAYQBuAGQAIABjAGEAbgAgAGQAZQB0AGUAYwB0ACAAdABoAGUAIABzAGMAaQBuAHQAaQBsAGwAYQB0AGkAbwBuAHMAIABvAGYAIABtAG8AcgBlACAAZABpAHMAdABhAG4AdAAgAHAAdQBsAHMAYQByAHMALgAgAFQAZQBuACAAcAB1AGwAcwBhAHIAcwAgAHcAZQByAGUAIABvAGIAcwBlAHIAdgBlAGQAIABhAHQAIAAyADIANQAwAE0ASAB6ACAAKABTAC0AYgBhAG4AZAApACAAdwBpAHQAaAAgAHQAaABlACAASgBpAGEAbQB1AHMAaQAgADYANgBtACAAdABlAGwAZQBzAGMAbwBwAGUAIAB0AG8AIABzAHQAdQBkAHkAIAB0AGgAZQBpAHIAIABzAGMAaQBuAHQAaQBsAGwAYQB0AGkAbwBuAHMALgAgAFQAaABlAGkAcgAgAGQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAdwBlAHIAZQAgAGYAaQByAHMAdAAgAG8AYgB0AGEAaQBuAGUAZAAsACAAZgByAG8AbQAgAHcAaABpAGMAaAAgAHQAaABlACAAZABlAGMAbwByAHIAZQBsAGEAdABpAG8AbgAgAGIAYQBuAGQAdwBpAGQAdABoAHMAIABhAG4AZAAgAHQAaQBtAGUAIABzAGMAYQBsAGUAcwAgAG8AZgAgAGQAaQBmAGYAcgBhAGMAdABpAHYAZQAgAHMAYwBpAG4AdABpAGwAbABhAHQAaQBvAG4AIAB3AGUAcgBlACAAdABoAGUAbgAgAGQAZQByAGkAdgBlAGQAIABiAHkAIABhAHUAdABvAGMAbwByAHIAZQBsAGEAdABpAG8AbgAuACAAUwBlAGMAbwBuAGQAYQByAHkAIABzAHAAZQBjAHQAcgBhACAAdwBlAHIAZQAgAGMAYQBsAGMAdQBsAGEAdABlAGQAIABiAHkAIABmAG8AcgBtAGkAbgBnACAAdABoAGUAIABGAG8AdQByAGkAZQByACAAcABvAHcAZQByACAAcwBwAGUAYwB0AHIAYQAgAG8AZgAgAHQAaABlACAAZAB5AG4AYQBtAGkAYwAgAHMAcABlAGMAdAByAGEALgAgAE0AbwBzAHQAIABvAGYAIAB0AGgAZQAgAG4AZQB3AGwAeQAgAG8AYgB0AGEAaQBuAGUAZAAgAGQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAYQByAGUAIABhAHQAIAB0AGgAZQAgAGgAaQBnAGgAZQBzAHQAIABmAHIAZQBxAHUAZQBuAGMAeQAgAG8AcgAgAGgAYQB2AGUAIAB0AGgAZQAgAGwAbwBuAGcAZQBzAHQAIAB0AGkAbQBlACAAcwBwAGEAbgAgAG8AZgAgAGEAbgB5ACAAcAB1AGIAbABpAHMAaABlAGQAIABkAGEAdABhACAAZgBvAHIAIAB0AGgAZQBzAGUAIABwAHUAbABzAGEAcgBzAC4AIABGAG8AcgAgAFAAUwBSAHMAIABCADAANQA0ADAAKwAyADMALAAgAEIAMgAzADIANAArADYAMAAgAGEAbgBkACAAQgAyADMANQAxACsANgAxACwAIAB0AGgAZQBzAGUAIAB3AGUAcgBlACAAdABoAGUAIABmAGkAcgBzAHQAIABkAHkAbgBhAG0AaQBjACAAcwBwAGUAYwB0AHIAYQAgAGUAdgBlAHIAIAByAGUAcABvAHIAdABlAGQALgAgAFQAaABlACAAZgByAGUAcQB1AGUAbgBjAHkALQBkAGUAcABlAG4AZABlAG4AYwBlACAAbwBmACAAcwBjAGkAbgB0AGkAbABsAGEAdABpAG8AbgAgAHAAYQByAGEAbQBlAHQAZQByAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAHQAaABhAHQAIAB0AGgAZQAgAGkAbgB0AGUAcgB2AGUAbgBpAG4AZwAgAG0AZQBkAGkAdQBtACAAYwBhAG4AIAByAGEAcgBlAGwAeQAgAGIAZQAgAGkAZABlAGEAbABsAHkAIAB0AHUAcgBiAHUAbABlAG4AdAAgAHcAaQB0AGgAIABhACAASwBvAGwAbQBvAGcAbwByAG8AdgAgAHMAcABlAGMAdAByAHUAbQAuACAAVABoAGUAIAB0AGgAaQBuACAAcwBjAHIAZQBlAG4AIABtAG8AZABlAGwAIAB3AG8AcgBrAGUAZAAgAHcAZQBsAGwAIABhAHQAIABTAC0AYgBhAG4AZAAgAGYAbwByACAAdABoAGUAIABzAGMAaQBuAHQAaQBsAGwAYQB0AGkAbwBuACAAbwBmACAAUABTAFIAIABCADEAOQAzADMAKwAxADYALgAgAFAAYQByAGEAYgBvAGwAaQBjACAAYQByAGMAcwAgAHcAZQByAGUAIABkAGUAdABlAGMAdABlAGQAIABpAG4AIAB0AGgAZQAgAHMAZQBjAG8AbgBkAGEAcgB5ACAAcwBwAGUAYwB0AHIAYQAgAG8AZgAgAHQAaAByAGUAZQAgAHAAdQBsAHMAYQByAHMALAAgAFAAUwBSAHMAIABCADAAMwA1ADUAKwA1ADQALAAgAEIAMAA1ADQAMAArADIAMwAgAGEAbgBkACAAQgAyADEANQA0ACsANAAwACwAIABhAGwAbAAgAG8AZgAgAHcAaABpAGMAaAAgAHcAZQByAGUAIABhAHMAeQBtAG0AZQB0AHIAaQBjAGEAbABsAHkAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQALgAgAFQAaABlACAAaQBuAHYAZQByAHQAZQBkACAAYQByAGMAbABlAHQAcwAgAG8AZgAgAFAAUwBSACAAQgAwADMANQA1ACsANQA0ACAAdwBlAHIAZQAgAHMAZQBlAG4AIAB0AG8AIABlAHYAbwBsAHYAZQAgAGEAbABvAG4AZwAgAHQAaABlACAAbQBhAGkAbgAgAHAAYQByAGEAYgBvAGwAYQAgAHcAaQB0AGgAaQBuACAAYQAgAGMAbwBuAHQAaQBuAHUAbwB1AHMAIABvAGIAcwBlAHIAdgBpAG4AZwAgAHMAZQBzAHMAaQBvAG4AIABvAGYAIAAxADIAIABoAG8AdQByAHMALAAgAGYAcgBvAG0AIAB3AGgAaQBjAGgAIAB0AGgAZQAgAGEAbgBnAHUAbABhAHIAIAB2AGUAbABvAGMAaQB0AHkAIABvAGYAIAB0AGgAZQAgAHAAdQBsAHMAYQByACAAdwBhAHMAIABlAHMAdABpAG0AYQB0AGUAZAAgAHQAaABhAHQAIAB3AGEAcwAgAGMAbwBuAHMAaQBzAHQAZQBuAHQAIAB3AGkAdABoACAAdABoAGUAIABtAGUAYQBzAHUAcgBlAG0AZQBuAHQAIABiAHkAIAB2AGUAcgB5ACAAbABvAG4AZwAgAGIAYQBzAGUAbABpAG4AZQAgAGkAbgB0AGUAcgBmAGUAcgBvAG0AZQB0AHIAeQAgACgAVgBMAEIASQApAC4AAAAzaHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovQStBLzYxOC9BMTg2AAAAVABXAGEAbgBnACAAUAAuAEYALgA7ACAASABhAG4AIABKAC4ATAAuADsAIABIAGEAbgAgAEwALgA7ACAAWgBoAGEAbgBnACAASgAuAEgALgA7ACAATABpACAASgAuAFEALgA7ACAAVwBhAG4AZwAgAEMALgA7ACAASABhAG4AIABKAC4AOwAgAFcAYQBuAGcAIABUAC4AOwAgAEcAYQBvACAAWAAuAFkALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGV/wAAAAAAABXJhZGlvAAABGWh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9BK0EvNjE4L0ExODY6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9BK0EvNjE4L0ExODY6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTgvQTE4Ni90YWJsZTE/AAAAZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAABednI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADM6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQAAAAfaXZvOi8vY2RzLnZpemllci9qL2ErYS82MTkvYTEyNAAAABF2czpjYXRhbG9nc2VydmljZQAAAA5KL0ErQS82MTkvQTEyNAAAACYAVABIAE8AUgAgAHMAdQByAHYAZQB5ACAAaQBuACAAbgBvAHIAdABoAGUAcgBuACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlAAAACHJlc2VhcmNoAAAJAQBSAGEAZABpAG8AIABjAG8AbgB0AGkAbgB1AHUAbQAgAHMAdQByAHYAZQB5AHMAIABvAGYAIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAHAAbABhAG4AZQAgAGMAYQBuACAAZgBpAG4AZAAgAGEAbgBkACAAYwBoAGEAcgBhAGMAdABlAHIAaQB6AGUAIABIAEkASQAgAHIAZQBnAGkAbwBuAHMALAAgAHMAdQBwAGUAcgBuAG8AdgBhACAAcgBlAG0AbgBhAG4AdABzACAAKABTAE4AUgBzACkALAAgAHAAbABhAG4AZQB0AGEAcgB5ACAAbgBlAGIAdQBsAGEAZQAgACgAUABOAGUAKQAsACAAYQBuAGQAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAcwBvAHUAcgBjAGUAcwAuACAAQQAgAG4AdQBtAGIAZQByACAAbwBmACAAcwB1AHIAdgBlAHkAcwAgAGEAdAAgAGgAaQBnAGgAIABhAG4AZwB1AGwAYQByACAAcgBlAHMAbwBsAHUAdABpAG8AbgAgACgAPAB+ADIANQAiACkAIABhAHQAIABkAGkAZgBmAGUAcgBlAG4AdAAgAHcAYQB2AGUAbABlAG4AZwB0AGgAcwAgAGUAeABpAHMAdAAgAHQAbwAgAHMAdAB1AGQAeQAgAHQAaABlACAAaQBuAHQAZQByAHMAdABlAGwAbABhAHIAIABtAGUAZABpAHUAbQAgACgASQBTAE0AKQAsACAAYgB1AHQAIABuAG8AIABjAG8AbQBwAGEAcgBhAGIAbABlACAAaABpAGcAaAAtAHIAZQBzAG8AbAB1AHQAaQBvAG4AIABhAG4AZAAgAGgAaQBnAGgALQBzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABzAHUAcgB2AGUAeQAgAGUAeABpAHMAdABzACAAYQB0ACAAbABvAG4AZwAgAHIAYQBkAGkAbwAgAHcAYQB2AGUAbABlAG4AZwB0AGgAcwAgAGEAcgBvAHUAbgBkACAAMgAxAGMAbQAuACAATwB1AHIAIABnAG8AYQBsACAAaQBzACAAdABvACAAaQBuAHYAZQBzAHQAaQBnAGEAdABlACAAdABoAGUAIAAyADEAYwBtACAAcgBhAGQAaQBvACAAYwBvAG4AdABpAG4AdQB1AG0AIABlAG0AaQBzAHMAaQBvAG4AIABpAG4AIAB0AGgAZQAgAG4AbwByAHQAaABlAHIAbgAgAEcAYQBsAGEAYwB0AGkAYwAgAHAAbABhAG4AZQAgAGEAdAAgADwAMgA1ACIAIAByAGUAcwBvAGwAdQB0AGkAbwBuAC4AIABXAGUAIABvAGIAcwBlAHIAdgBlAGQAIABhACAAbABhAHIAZwBlACAAZgByAGEAYwB0AGkAbwBuACAAbwBmACAAdABoAGUAIABHAGEAbABhAGMAdABpAGMAIABwAGwAYQBuAGUAIABpAG4AIAB0AGgAZQAgAGYAaQByAHMAdAAgAHEAdQBhAGQAcgBhAG4AdAAgAG8AZgAgAHQAaABlACAATQBpAGwAawB5ACAAVwBhAHkAIAAoAGwAPQAxADQALgAwAHsAZABlAGcAfQAtADYANwAuADQAewBkAGUAZwB9ACAAYQBuAGQAIAB8AGIAfAA8AD0AMQAuADIANQB7AGQAZQBnAH0AKQAgAHcAaQB0AGgAIAB0AGgAZQAgAEsAYQByAGwAIABHAC4AIABKAGEAbgBzAGsAeQAgAFYAZQByAHkAIABMAGEAcgBnAGUAIABBAHIAcgBhAHkAIAAoAFYATABBACkAIABpAG4AIAB0AGgAZQAgAEMALQBjAG8AbgBmAGkAZwB1AHIAYQB0AGkAbwBuACAAYwBvAHYAZQByAGkAbgBnACAAcwBpAHgAIABjAG8AbgB0AGkAbgB1AHUAbQAgAHMAcABlAGMAdAByAGEAbAAgAHcAaQBuAGQAbwB3AHMALgAgAFQAaABlAHMAZQAgAGQAYQB0AGEAIABwAHIAbwB2AGkAZABlACAAYQAgAGQAZQB0AGEAaQBsAGUAZAAgAHYAaQBlAHcAIABvAG4AIAB0AGgAZQAgAGMAbwBtAHAAYQBjAHQAIABhAHMAIAB3AGUAbABsACAAYQBzACAAZQB4AHQAZQBuAGQAZQBkACAAcgBhAGQAaQBvACAAZQBtAGkAcwBzAGkAbwBuACAAbwBmACAAbwB1AHIAIABHAGEAbABhAHgAeQAgAGEAbgBkACAAdABoAG8AdQBzAGEAbgBkAHMAIABvAGYAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAYgBhAGMAawBnAHIAbwB1AG4AZAAgAHMAbwB1AHIAYwBlAHMALgAgAFcAZQAgAHUAcwBlAGQAIAB0AGgAZQAgAEIATABPAEIAQwBBAFQAIABzAG8AZgB0AHcAYQByAGUAIABhAG4AZAAgAGUAeAB0AHIAYQBjAHQAZQBkACAAMQAwADkAMQA2ACAAcwBvAHUAcgBjAGUAcwAuACAAQQBmAHQAZQByACAAcgBlAG0AbwB2AGkAbgBnACAAcwBwAHUAcgBpAG8AdQBzACAAcwBvAHUAcgBjAGUAIABkAGUAdABlAGMAdABpAG8AbgBzACAAYwBhAHUAcwBlAGQAIABiAHkAIAB0AGgAZQAgAHMAaQBkAGUAbABvAGIAZQBzACAAbwBmACAAdABoAGUAIABzAHkAbgB0AGgAZQBzAGkAcwBlAGQAIABiAGUAYQBtACwAIAB3AGUAIABjAGwAYQBzAHMAaQBmAGkAZQBkACAAMQAwADMAOAA3ACAAcwBvAHUAcgBjAGUAcwAgAGEAcwAgAHIAZQBsAGkAYQBiAGwAZQAgAGQAZQB0AGUAYwB0AGkAbwBuAHMALgBXAGUAIABzAG0AbwBvAHQAaABlAGQAIAB0AGgAZQAgAGkAbQBhAGcAZQBzACAAdABvACAAYQAgAGMAbwBtAG0AbwBuACAAcgBlAHMAbwBsAHUAdABpAG8AbgAgAG8AZgAgADIANQAiACAAYQBuAGQAIABlAHgAdAByAGEAYwB0AGUAZAAgAHQAaABlACAAcABlAGEAawAgAGYAbAB1AHgAIABkAGUAbgBzAGkAdAB5ACAAbwBmACAAZQBhAGMAaAAgAHMAbwB1AHIAYwBlACAAaQBuACAAZQBhAGMAaAAgAHMAcABlAGMAdAByAGEAbAAgAHcAaQBuAGQAbwB3ACAAKABTAFAAVwApACAAdABvACAAZABlAHQAZQByAG0AaQBuAGUAIAB0AGgAZQAgAHMAcABlAGMAdAByAGEAbAAgAGkAbgBkAGkAYwBlAHMAIAB7AGEAbABwAGgAYQB9ACAAKABhAHMAcwB1AG0AaQBuAGcAIABJACgAbgB1ACkAewBwAHIAbwBwAC4AdABvAH0AbgB1AF4AYQBsAHAAaABhAF4AKQAuACAAQgB5ACAAYwByAG8AcwBzAC0AbQBhAHQAYwBoAGkAbgBnACAAdwBpAHQAaAAgAGMAYQB0AGEAbABvAGcAcwAgAG8AZgAgAEgASQBJACAAcgBlAGcAaQBvAG4AcwAsACAAUwBOAFIAcwAsACAAUABOAGUALAAgAGEAbgBkACAAcAB1AGwAcwBhAHIAcwAsACAAdwBlACAAZgBvAHUAbgBkACAAcgBhAGQAaQBvACAAYwBvAHUAbgB0AGUAcgBwAGEAcgB0AHMAIABmAG8AcgAgADgANAAwACAASABJAEkAIAByAGUAZwBpAG8AbgBzACwAIAA1ADIAIABTAE4AUgBzACwAIAAxADYANAAgAFAATgBlACwAIABhAG4AZAAgADMAOAAgAHAAdQBsAHMAYQByAHMALgAgAFcAZQAgAGYAbwB1AG4AZAAgADcAOQAgAGMAbwBuAHQAaQBuAHUAdQBtACAAcwBvAHUAcgBjAGUAcwAgAHQAaABhAHQAIABhAHIAZQAgAGEAcwBzAG8AYwBpAGEAdABlAGQAIAB3AGkAdABoACAAWAAtAHIAYQB5ACAAcwBvAHUAcgBjAGUAcwAuACAAVwBlACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgADYAOQA5ACAAdQBsAHQAcgBhAHMAdABlAGUAcAAgAHMAcABlAGMAdAByAGEAbAAgAHMAbwB1AHIAYwBlAHMAIAAoAGEAbABwAGgAYQA8AC0AMQAuADMAKQAgAHQAaABhAHQAIABjAG8AdQBsAGQAIABiAGUAIABoAGkAZwBoAC0AcgBlAGQAcwBoAGkAZgB0ACAAZwBhAGwAYQB4AGkAZQBzAC4AIABBAHIAbwB1AG4AZAAgADkAMAAwADAAIABvAGYAIAB0AGgAZQAgAHMAbwB1AHIAYwBlAHMAIAB3AGUAIABlAHgAdAByAGEAYwB0AGUAZAAgAGEAcgBlACAAbgBvAHQAIABjAGwAYQBzAHMAaQBmAGkAZQBkACAAcwBwAGUAYwBpAGYAaQBjAGEAbABsAHkALAAgAGIAdQB0ACAAYgBhAHMAZQBkACAAbwBuACAAdABoAGUAaQByACAAcwBwAGEAdABpAGEAbAAgAGEAbgBkACAAcwBwAGUAYwB0AHIAYQBsACAAZABpAHMAdAByAGkAYgB1AHQAaQBvAG4ALAAgAGEAIABsAGEAcgBnAGUAIABmAHIAYQBjAHQAaQBvAG4AIABvAGYAIAB0AGgAZQBtACAAaQBzACAAbABpAGsAZQBsAHkAIAB0AG8AIABiAGUAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAYgBhAGMAawBnAHIAbwB1AG4AZAAgAHMAbwB1AHIAYwBlAHMALgAgAE0AbwByAGUAIAB0AGgAYQBuACAANwA3ADUAMAAgAHMAbwB1AHIAYwBlAHMAIABkAG8AIABuAG8AdAAgAGgAYQB2AGUAIABjAG8AdQBuAHQAZQByAHAAYQByAHQAcwAgAGkAbgAgAHQAaABlACAAUwBJAE0AQgBBAEQAIABkAGEAdABhAGIAYQBzAGUALAAgAGEAbgBkACAAbQBvAHIAZQAgAHQAaABhAG4AIAAzADcANgAwACAAcwBvAHUAcgBjAGUAcwAgAGQAbwAgAG4AbwB0ACAAaABhAHYAZQAgAGMAbwB1AG4AdABlAHIAcABhAHIAdABzACAAaQBuACAAdABoAGUAIABOAEUARAAgAGQAYQB0AGEAYgBhAHMAZQAuACAAUwB0AHUAZAB5AGkAbgBnACAAdABoAGUAIABsAG8AbgBnACAAdwBhAHYAZQBsAGUAbgBnAHQAaABzACAAYwBtACAAYwBvAG4AdABpAG4AdQB1AG0AIABlAG0AaQBzAHMAaQBvAG4AIABhAG4AZAAgAHQAaABlACAAYQBzAHMAbwBjAGkAYQB0AGUAZAAgAHMAcABlAGMAdAByAGEAbAAgAGkAbgBkAGkAYwBlAHMAIABhAGwAbABvAHcAcwAgAHUAcwAgAHQAbwAgAGMAaABhAHIAYQBjAHQAZQByAGkAegBlACAAYQAgAGwAYQByAGcAZQAgAGYAcgBhAGMAdABpAG8AbgAgAG8AZgAgAEcAYQBsAGEAYwB0AGkAYwAgAGEAbgBkACAAZQB4AHQAcgBhAGcAYQBsAGEAYwB0AGkAYwAgAHIAYQBkAGkAbwAgAHMAbwB1AHIAYwBlAHMAIABpAG4AIAB0AGgAZQAgAGEAcgBlAGEAIABvAGYAIAB0AGgAZQAgAG4AbwByAHQAaABlAHIAbgAgAGkAbgBuAGUAcgAgAE0AaQBsAGsAeQAgAFcAYQB5AC4AIABUAGgAaQBzACAAZABhAHQAYQBiAGEAcwBlACAAdwBpAGwAbAAgAGIAZQAgAGUAeAB0AHIAZQBtAGUAbAB5ACAAdQBzAGUAZgB1AGwAIABmAG8AcgAgAGYAdQB0AHUAcgBlACAAcwB0AHUAZABpAGUAcwAgAG8AZgAgAGEAIABkAGkAdgBlAHIAcwBlACAAcwBlAHQAIABvAGYAIABhAHMAdAByAG8AcABoAHkAcwBpAGMAYQBsACAAbwBiAGoAZQBjAHQAcwAuAAAAM2h0dHA6Ly9j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AHMAbQBzACAAZABvAG0AaQBuAGEAdABpAG4AZwAgAHQAaABlACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIAB3AGkAdABoAGkAbgAgAHQAaABlACAAbgBlAGIAdQBsAGEALAAgAGEAYwBjAG8AdQBuAHQAaQBuAGcAIABmAG8AcgAgAGkAdABzACAAYQBuAG8AbQBhAGwAbwB1AHMAbAB5ACAAbABhAHIAZwBlACAAcwBpAHoAZQAgAGEAbgBkACAAcwBwAGUAYwB0AHIAYQBsACAAYwBoAGEAcgBhAGMAdABlAHIAaQBzAHQAaQBjAHMALgAgAFQAaABlACAAbgBlAGIAdQBsAGEAIABpAHMAIABzAHQAdQBkAGkAZQBkACAAdQBzAGkAbgBnACAAYQAgAGQAZQBlAHAAIABlAHgAcABvAHMAdQByAGUAIABmAHIAbwBtACAAbwB2AGUAcgAgADEAMgAgAHkAZQBhAHIAcwAgAG8AZgAgAEgALgBFAC4AUwAuAFMALgAgAEkAIABvAHAAZQByAGEAdABpAG8AbgAsACAAdABvAGcAZQB0AGgAZQByACAAdwBpAHQAaAAgAGQAYQB0AGEAIABmAHIAbwBtACAASAAuAEUALgBTAC4AUwAuACAASQBJACAAaQBtAHAAcgBvAHYAaQBuAGcAIAB0AGgAZQAgAGwAbwB3ACAAZQBuAGUAcgBnAHkAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkALgAgAEUAbgBoAGEAbgBjAGUAZAAgAGUAbgBlAHIAZwB5AC0AIABkAGUAcABlAG4AZABlAG4AdAAgAG0AbwByAHAAaABvAGwAbwBnAGkAYwBhAGwAIABhAG4AZAAgAHMAcABhAHQAaQBhAGwAbAB5AC0AcgBlAHMAbwBsAHYAZQBkACAAcwBwAGUAYwB0AHIAYQBsACAAYQBuAGEAbAB5AHMAZQBzACAAcAByAG8AYgBlACAAdABoAGUAIABWAGUAcgB5ACAASABpAGcAaAAgAEUAbgBlAHIAZwB5ACAAKABWAEgARQAsACAARQA+ADAALgAxAFQAZQBWACkAIABnAGEAbQBtAGEALQByAGEAeQAgAHAAcgBvAHAAZQByAHQAaQBlAHMAIABvAGYAIAB0AGgAZQAgAG4AZQBiAHUAbABhAC4AIABUAGgAZQAgAG4AZQBiAHUAbABhACAAZQBtAGkAcwBzAGkAbwBuACAAaQBzACAAcgBlAHYAZQBhAGwAZQBkACAAdABvACAAZQB4AHQAZQBuAGQAIABvAHUAdAAgAHQAbwAgADEALgA1ACAAZABlAGcAcgBlAGUAcwAgAGYAcgBvAG0AIAB0AGgAZQAgAHAAdQBsAHMAYQByACwAIAB+ADEALgA1ACAAdABpAG0AZQBzACAAZgB1AHIAdABoAGUAcgAgAHQAaABhAG4AIABwAHIAZQB2AGkAbwB1AHMAbAB5ACAAcwBlAGUAbgAsACAAbQBhAGsAaQBuAGcAIABIAEUAUwBTACAASgAxADgAMgA1AC0AMQAzADcALAAgAHcAaQB0AGgAIABhAG4AIABpAG4AdAByAGkAbgBzAGkAYwAgAGQAaQBhAG0AZQB0AGUAcgAgAG8AZgAgAH4AMQAwADAAcABjACwAIABwAG8AdABlAG4AdABpAGEAbABsAHkAIAB0AGgAZQAgAGwAYQByAGcAZQBzAHQAIABnAGEAbQBtAGEALQByAGEAeQAgAFAAVwBOACAAYwB1AHIAcgBlAG4AdABsAHkAIABrAG4AbwB3AG4ALgAgAEMAaABhAHIAYQBjAHQAZQByAGkAcwBhAHQAaQBvAG4AIABvAGYAIAB0AGgAZQAgAG4AZQBiAHUAbABhACcAcwAgAHMAdAByAG8AbgBnAGwAeQAgAGUAbgBlAHIAZwB5AC0AZABlAHAAZQBuAGQAZQBuAHQAIABtAG8AcgBwAGgAbwBsAG8AZwB5ACAAZQBuAGEAYgBsAGUAcwAgAHQAaABlACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIABtAGUAYwBoAGEAbgBpAHMAbQBzACAAdABvACAAYgBlACAAYwBvAG4AcwB0AHIAYQBpAG4AZQBkAC4AIABBACAAZABlAHAAZQBuAGQAZQBuAGMAZQAgAG8AZgAgAHQAaABlACAAbgBlAGIAdQBsAGEAIABlAHgAdABlAG4AdAAgAHcAaQB0AGgAIABlAG4AZQByAGcAeQAgAG8AZgAgAFIAewBwAHIAbwBwAC4AdABvAH0AIABFAF4AYQBsAHAAaABhAF4AIAB3AGkAdABoACAAYQBsAHAAaABhAD0ALQAwAC4AMgA5ACsALwAtADAALgAwADQAKABzAHQAYQB0ACkAKwAvAC0AMAAuADAANQAoAHMAeQBzACkAIABkAGkAcwBmAGEAdgBvAHUAcgBzACAAYQAgAHAAdQByAGUAIABkAGkAZgBmAHUAcwBpAG8AbgAgAHMAYwBlAG4AYQByAGkAbwAgAGYAbwByACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIAB3AGkAdABoAGkAbgAgAHQAaABlACAAbgBlAGIAdQBsAGEALgAgAFQAaABlACAAdABvAHQAYQBsACAAZwBhAG0AbQBhAC0AcgBhAHkAIABmAGwAdQB4ACAAbwBmACAAdABoAGUAIABuAGUAYgB1AGwAYQAgAGEAYgBvAHYAZQAgADEAfgBUAGUAVgAgAGkAcwAgAGYAbwB1AG4AZAAgAHQAbwAgAGIAZQAgACgAMQAuADEAMgArAC8ALQAwAC4AMAAzACgAcwB0AGEAdAApACsALwAtADAALgAyADUAKABzAHkAcwApACkAeAAxADAAXgAtADEAMQBeAGMAbQBeAC0AMgBeAHMAXgAtADEAXgAsACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAHQAbwAgAH4ANgA0ACUAIABvAGYAIAB0AGgAZQAgAGYAbAB1AHgAIABvAGYAIAB0AGgAZQAgAEMAcgBhAGIAIABOAGUAYgB1AGwAYQAuACAASABFAFMAUwAgAEoAMQA4ADIANQAtADEAMwA3ACAAaQBzACAAYQAgAFAAVwBOACAAdwBpAHQAaAAgAGMAbABlAGEAcgAgAGUAbgBlAHIAZwB5AC0AZABlAHAAZQBuAGQAZQBuAHQAIABtAG8AcgBwAGgAbwBsAG8AZwB5ACAAYQB0ACAAVgBIAEUAIABnAGEAbQBtAGEALQByAGEAeQAgAGUAbgBlAHIAZwBpAGUAcwAuACAAVABoAGkAcwAgAHMAbwB1AHIAYwBlACAAaQBzACAAdQBzAGUAZAAgAGEAcwAgAGEAIABsAGEAYgBvAHIAYQB0AG8AcgB5ACAAdABvACAAaQBuAHYAZQBzAHQAaQBnAGEAdABlACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIAB3AGkAdABoAGkAbgAgAG0AaQBkAGQAbABlAC0AYQBnAGUAZAAgAFAAVwBOAGUALgAgAEQAZQBlAHAAIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAG8AZgAgAHQAaABpAHMAIABoAGkAZwBoAGwAeQAgAHMAcABhAHQAaQBhAGwAbAB5AC0AZQB4AHQAZQBuAGQAZQBkACAAUABXAE4AIABlAG4AYQBiAGwAZQAgAGEAIABzAHAAZQBjAHQAcgBhAGwAIABtAGEAcAAgAG8AZgAgAHQAaABlACAAcgBlAGcAaQBvAG4AIAB0AG8AIABiAGUAIABwAHIAbwBkAHUAYwBlAGQALAAgAHAAcgBvAHYAaQBkAGkAbgBnACAAaQBuAHMAaQBnAGgAdABzACAAaQBuAHQAbwAgAHQAaABlACAAcwBwAGUAYwB0AHIAYQBsACAAdgBhAHIAaQBhAHQAaQBvAG4AIAB3AGkAdABoAGkAbgAgAHQAaABlACAAbgBlAGIAdQBsAGEALgAAADNodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9BK0EvNjIxL0ExMTYAAAs2AEgALgBFAC4AUwAuAFMALgAgAEMAbwBsAGwAYQBiAG8AcgBhAHQAaQBvAG4AOwAgAEEAYgBkAGEAbABsAGEAIABIAC4AOwAgAEEAaABhAHIAbwBuAGkAYQBuACAARgAuADsAIABBAGkAdAAgAEIAZQBuAGsAaABhAGwAaQAgAEYALgA7ACAAQQBuAGcAdQBlAG4AZQByACAARQAuAE8ALgA7ACAAQQByAGEAawBhAHcAYQAgAE0ALgA7ACAAQQByAGMAYQByAG8AIABDAC4AOwAgAEEAcgBtAGEAbgBkACAAQwAuADsAIABBAHIAcgBpAGUAdABhACAATQAuADsAIABCAGEAYwBrAGUAcwAgAE0ALgA7ACAAQgBhAHIAbgBhAHIAZAAgAE0ALgA7ACAAQgBlAGMAaABlAHIAaQBuAGkAIABZAC4AOwAgAEIAZQBjAGsAZQByACAAVABqAHUAcwAgAEoALgA7ACAAQgBlAHIAZwBlACAARAAuADsAIABCAGUAcgBuAGwAbwBlAGgAcgAgAEsALgA7ACAAQgBsAGEAYwBrAHcAZQBsAGwAIABSAC4AOwAgAEIAbwBlAHQAdABjAGgAZQByACAATQAuADsAIABCAG8AaQBzAHMAbwBuACAAQwAuADsAIABCAG8AbABtAG8AbgB0ACAASgAuADsAIABCAG8AbgBuAGUAZgBvAHkAIABTAC4AOwAgAEIAbwByAGQAYQBzACAAUAAuADsAIABCAHIAZQBnAGUAbwBuACAASgAuADsAIABCAHIAdQBuACAARgAuADsAIABCAHIAdQBuACAAUAAuADsAIABCAHIAeQBhAG4AIABNAC4AOwAgAEIAdQBlAGMAaABlAGwAZQAgAE0ALgA7ACAAQgB1AGwAaQBrACAAVAAuADsAIABCAHkAbAB1AG4AZAAgAFQALgA7ACAAQwBhAHAAYQBzAHMAbwAgAE0ALgA7ACAAQwBhAHIAbwBmAGYAIABTAC4AOwAgAEMAYQByAG8AcwBpACAAQQAuADsAIABDAGEAcwBhAG4AbwB2AGEAIABTAC4AOwAgAEMAZQByAHIAdQB0AGkAIABNAC4AOwAgAEMAaABhAGsAcgBhAGIAbwByAHQAeQAgAE4ALgA7ACAAQwBoAGEAbgBkACAAVAAuADsAIABDAGgAYQBuAGQAcgBhACAAUwAuADsAIABDAGgAYQB2AGUAcwAgAFIALgBDAC4ARwAuADsAIABDAGgAZQBuACAAQQAuADsAIABDAG8AbABhAGYAcgBhAG4AYwBlAHMAYwBvACAAUwAuADsAIABDAG8AbgBkAG8AbgAgAEIALgA7ACAARABhAHYAaQBkAHMAIABJAC4ARAAuADsAIABEAGUAaQBsACAAQwAuADsAIABEAGUAdgBpAG4AIABKAC4AOwAgAGQAZQBXAGkAbAB0ACAAUAAuADsAIABEAGkAcgBzAG8AbgAgAEwALgA7ACAARABqAGEAbgBuAGEAdABpAC0AQQB0AGEAaQAgAEEALgA7ACAARABtAHkAdAByAGkAaQBlAHYAIABBAC4AOwAgAEQAbwBuAGEAdABoACAAQQAuADsAIABEAG8AcgBvAHMAaABlAG4AawBvACAAVgAuADsAIABEAHIAdQByAHkAIABMAC4ATwAnAEMALgA7ACAARAB5AGsAcwAgAEoALgA7ACAARQBnAGIAZQByAHQAcwAgAEsALgA7ACAARQBtAGUAcgB5ACAARwAuADsAIABFAHIAbgBlAG4AdwBlAGkAbgAgAEoALgAtAFAALgA7ACAARQBzAGMAaABiAGEAYwBoACAAUwAuADsAIABGAGUAZwBhAG4AIABTAC4AOwAgAEYAaQBhAHMAcwBvAG4AIABBAC4AOwAgAEYAbwBuAHQAYQBpAG4AZQAgAEcALgA7ACAARgB1AG4AawAgAFMALgA7ACAARgB1AGUAcwBzAGwAaQBuAGcAIABNAC4AOwAgAEcAYQBiAGkAYwBpACAAUwAuADsAIABHAGEAbABsAGEAbgB0ACAAWQAuAEEALgA7ACAARwBhAHQAZQAgAEYALgA7ACAARwBpAGEAdgBpAHQAdABvACAARwAuADsAIABHAGwAYQB3AGkAbwBuACAARAAuADsAIABHAGwAaQBjAGUAbgBzAHQAZQBpAG4AIABKAC4ARgAuADsAIABHAG8AdAB0AHMAYwBoAGEAbABsACAARAAuADsAIABHAHIAbwBuAGQAaQBuACAATQAuAC0ASAAuADsAIABIAGEAaABuACAASgAuADsAIABIAGEAdQBwAHQAIABNAC4AOwAgAEgAZQBpAG4AegBlAGwAbQBhAG4AbgAgAEcALgA7ACAASABlAG4AcgBpACAARwAuADsAIABIAGUAcgBtAGEAbgBuACAARwAuADsAIABIAGkAbgB0AG8AbgAgAEoALgBBAC4AOwAgAEgAbwBmAG0AYQBuAG4AIABXAC4AOwAgAEgAbwBpAHMAYwBoAGUAbgAgAEMALgA7ACAASABvAGwAYwBoACAAVAAuAEwALgA7ACAASABvAGwAbABlAHIAIABNAC4AOwAgAEgAbwByAG4AcwAgAEQALgA7ACAASAB1AGIAZQByACAARAAuADsAIABJAHcAYQBzAGEAawBpACAASAAuADsAIABKAGEAYwBoAG8AbABrAG8AdwBzAGsAYQAgAEEALgA7ACAASgBhAG0AcgBvAHoAeQAgAE0ALgA7ACAASgBhAG4AawBvAHcAcwBrAHkAIABEAC4AOwAgAEoAYQBuAGsAbwB3AHMAawB5ACAARgAuADsAIABKAG8AdQB2AGkAbgAgAEwALgA7ACAASgB1AG4AZwAtAFIAaQBjAGgAYQByAGQAdAAgAEkALgA7ACAASwBhAHMAdABlAG4AZABpAGUAYwBrACAATQAuAEEALgA7ACAASwBhAHQAYQByAHoAeQBuAHMAawBpACAASwAuADsAIABLAGEAdABzAHUAcgBhAGcAYQB3AGEAIABNAC4AOwAgAEsAYQB0AHoAIABVAC4AOwAgAEsAZQByAHMAegBiAGUAcgBnACAARAAuADsAIABLAGgAYQBuAGcAdQBsAHkAYQBuACAARAAuADsAIABLAGgAZQBsAGkAZgBpACAAQgAuADsAIABLAGkAbgBnACAASgAuADsAIABLAGwAZQBwAHMAZQByACAAUwAuADsAIABLAGwAdQB6AG4AaQBhAGsAIABXAC4AOwAgAEsAbwBtAGkAbgAgAE4AdQAuADsAIABLAG8AcwBhAGMAawAgAEsALgA7ACAASwByAGEAdQBzACAATQAuADsAIABMAGEAbQBhAG4AbgBhACAARwAuADsAIABMAGEAdQAgAEoALgA7ACAATABlAGYAYQB1AGMAaABlAHUAcgAgAEoALgA7ACAATABlAG0AaQBlAHIAZQAgAEEALgA7ACAATABlAG0AbwBpAG4AZQAtAEcAbwB1AG0AYQByAGQAIABNAC4AOwAgAEwAZQBuAGEAaQBuACAASgAuAC0AUAAuADsAIABMAGUAcwBlAHIAIABFAC4AOwAgAEwAbwBoAHMAZQAgAFQALgA7ACAATABvAHAAZQB6AC0AQwBvAHQAbwAgAFIALgA7ACAATAB5AHAAbwB2AGEAIABJAC4AOwAgAE0AYQBsAHkAcwBoAGUAdgAgAEQALgA7ACAATQBhAHIAYQBuAGQAbwBuACAAVgAuADsAIABNAGEAcgBjAG8AdwBpAHQAaAAgAEEALgA7ACAATQBhAHIAaQBhAHUAZAAgAEMALgA7ACAATQBhAHIAdABpAC0ARABlAHYAZQBzAGEAIABHAC4AOwAgAE0AYQByAHgAIABSAC4AOwAgAE0AYQB1AHIAaQBuACAARwAuADsAIABNAGUAaQBuAHQAagBlAHMAIABQAC4ASgAuADsAIABNAGkAdABjAGgAZQBsAGwAIABBAC4ATQAuAFcALgA7ACAATQBvAGQAZQByAHMAawBpACAAUgAuADsAIABNAG8AaABhAG0AZQBkACAATQAuADsAIABNAG8AaAByAG0AYQBuAG4AIABMAC4AOwAgAE0AbwBvAHIAZQAgAEMALgA7ACAATQBvAHUAbABpAG4AIABFAC4AOwAgAE0AdQByAGEAYwBoACAAVAAuADsAIABOAGEAawBhAHMAaABpAG0AYQAgAFMALgA7ACAAZABlACAATgBhAHUAcgBvAGkAcwAgAE0ALgA7ACAATgBkAGkAeQBhAHYAYQBsAGEAIABIAC4AOwAgAE4AaQBlAGQAZQByAHcAYQBuAGcAZQByACAARgAuADsAIABOAGkAZQBtAGkAZQBjACAASgAuADsAIABPAGEAawBlAHMAIABMAC4AOwAgAE8AJwBCAHIAaQBlAG4AIABQAC4AOwAgAE8AZABhAGsAYQAgAEgALgA7ACAATwBoAG0AIABTAC4AOwAgAE8AcwB0AHIAbwB3AHMAawBpACAATQAuADsAIABPAHkAYQAgAEkALgA7ACAAUABhAG4AdABlAHIAIABNAC4AOwAgAFAAYQByAHMAbwBuAHMAIABSAC4ARAAuADsAIABQAGUAcgBlAG4AbgBlAHMAIABDAC4AOwAgAFAAZQB0AHIAdQBjAGMAaQAgAFAALgAtAE8ALgA7ACAAUABlAHkAYQB1AGQAIABCAC4AOwAgAFAAaQBlAGwAIABRAC4AOwAgAFAAaQB0AGEAIABTAC4AOwAgAFAAbwBpAHIAZQBhAHUAIABWAC4AOwAgAFAAcgBpAHkAYQBuAGEAIABOAG8AZQBsACAAQQAuADsAIABQAHIAbwBrAGgAbwByAG8AdgAgAEQALgBBAC4AOwAgAFAAcgBvAGsAbwBwAGgAIABIAC4AOwAgAFAAdQBlAGgAbABoAG8AZgBlAHIAIABHAC4AOwAgAFAAdQBuAGMAaAAgAE0ALgA7ACAAUQB1AGkAcgByAGUAbgBiAGEAYwBoACAAQQAuADsAIABSAGEAYQBiACAAUwAuADsAIABSAGEAdQB0AGgAIABSAC4AOwAgAFIAZQBpAG0AZQByACAAQQAuADsAIABSAGUAaQBtAGUAcgAgAE8ALgA7ACAAUgBlAG4AYQB1AGQAIABNAC4AOwAgAFIAaQBlAGcAZQByACAARgAuADsAIABSAGkAbgBjAGgAaQB1AHMAbwAgAEwALgA7ACAAUgBvAG0AbwBsAGkAIABDAC4AOwAgAFIAbwB3AGUAbABsACAARwAuADsAIABSAHUAZABhAGsAIABCAC4AOwAgAFIAdQBpAHoALQBWAGUAbABhAHMAYwBvACAARQAuADsAIABTAGEAaABhAGsAaQBhAG4AIABWAC4AOwAgAFMAYQBpAHQAbwAgAFMALgA7ACAAUwBhAG4AYwBoAGUAegAgAEQALgBBAC4AOwAgAFMAYQBuAHQAYQBuAGcAZQBsAG8AIABBAC4AOwAgAFMAYQBzAGEAawBpACAATQAuADsAIABTAGMAaABsAGkAYwBrAGUAaQBzAGUAcgAgAFIALgA7ACAAUwBjAGgAdQBlAHMAcwBsAGUAcgAgAEYALgA7ACAAUwBjAGgAdQBsAHoAIABBAC4AOwAgAFMAYwBoAHUAdAB0AGUAIABIAC4AOwAgAFMAYwBoAHcAYQBuAGsAZQAgAFUALgA7ACAAUwBjAGgAdwBlAG0AbQBlAHIAIABTAC4AOwAgAFMAZQBnAGwAYQByAC0AQQByAHIAbwB5AG8AIABNAC4AOwAgAFMAZQBuAG4AaQBhAHAAcABhAG4AIABNAC4AOwAgAFMAZQB5AGYAZgBlAHIAdAAgAEEALgBTAC4AOwAgAFMAaABhAGYAaQAgAE4ALgA7ACAAUwBoAGkAbABvAG4AIABJAC4AOwAgAFMAaABpAG4AaQBuAGcAYQB5AGEAbQB3AGUAIABLAC4AOwAgAFMAaQBtAG8AbgBpACAAUgAuADsAIABTAGkAbgBoAGEAIABBAC4AOwAgAFMAbwBsACAASAAuADsAIABTAHAAZQBjAG8AdgBpAHUAcwAgAEEALgA7ACAAUwBwAGkAcgAtAEoAYQBjAG8AYgAgAE0ALgA7ACAAUwB0AGEAdwBhAHIAegAgAEwALgA7ACAAUwB0AGUAZQBuAGsAYQBtAHAAIABSAC4AOwAgAFMAdABlAGcAbQBhAG4AbgAgAEMALgA7ACAAUwB0AGUAcABwAGEAIABDAC4AOwAgAFQAYQBrAGEAaABhAHMAaABpACAAVAAuADsAIABUAGEAdgBlAHIAbgBlAHQAIABKAC4ALQBQAC4AOwAgAFQAYQB2AGUAcgBuAGkAZQByACAAVAAuADsAIABUAGEAeQBsAG8AcgAgAEEALgBNAC4AOwAgAFQAZQByAHIAaQBlAHIAIABSAC4AOwAgAFQAaQBiAGEAbABkAG8AIABMAC4AOwAgAFQAaQB6AGkAYQBuAGkAIABEAC4AOwAgAFQAbAB1AGMAegB5AGsAbwBuAHQAIABNAC4AOwAgAFQAcgBpAGMAaABhAHIAZAAgAEMALgA7ACAAVABzAGkAcgBvAHUAIABNAC4AOwAgAFQAcwB1AGoAaQAgAE4ALgA7ACAAVAB1AGYAZgBzACAAUgAuADsAIABVAGMAaABpAHkAYQBtAGEAIABZAC4AOwAgAHYAYQBuACAAZABlAHIAIABXAGEAbAB0ACAARAAuAEoALgA7ACAAdgBhAG4AIABFAGwAZABpAGsAIABDAC4AOwAgAHYAYQBuACAAUgBlAG4AcwBiAHUAcgBnACAAQwAuADsAIAB2AGEAbgAgAFMAbwBlAGwAZQBuACAAQgAuADsAIABWAGEAcwBpAGwAZQBpAGEAZABpAHMAIABHAC4AOwAgAFYAZQBoACAASgAuADsAIABWAGUAbgB0AGUAcgAgAEMALgA7ACAAVgBpAG4AYwBlAG4AdAAgAFAALgA7ACAAVgBpAG4AawAgAEoALgA7ACAAVgBvAGkAcwBpAG4AIABGAC4AOwAgAFYAbwBlAGwAawAgAEgALgBKAC4AOwAgAFYAdQBpAGwAbABhAHUAbQBlACAAVAAuADsAIABXAGEAZABpAGEAcwBpAG4AZwBoACAAWgAuADsAIABXAGEAZwBuAGUAcgAgAFMALgBKAC4AOwAgAFcAYQBnAG4AZQByACAAUgAuAE0ALgA7ACAAVwBoAGkAdABlACAAUgAuADsAIABXAGkAZQByAHoAYwBoAG8AbABzAGsAYQAgAEEALgA7ACAAWQBhAG4AZwAgAFIALgA7ACAAWQBvAG4AZQBkAGEAIABIAC4AOwAgAFoAYQBiAG8AcgBvAHYAIABEAC4AOwAgAFoAYQBjAGgAYQByAGkAYQBzACAATQAuADsAIABaAGEAbgBpAG4AIABSAC4AOwAgAFoAZAB6AGkAYQByAHMAawBpACAAQQAuAEEALgA7ACAAWgBlAGMAaAAgAEEALgA7ACAAWgBlAGYAaQAgAEYALgA7ACAAWgBpAGUAZwBsAGUAcgAgAEEALgA7ACAAWgBvAHIAbgAgAEoALgA7ACAAWgB5AHcAdQBjAGsAYQAgAE4ALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGV/wAAAAAAAD3JhZGlvI2dhbW1hLXJheQAAAWlodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYyMS9BMTE2L2JveGZpdHM/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0ErQS82MjEvQTExNjo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9BK0EvNjIxL0ExMTY6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYyMS9BMTE2L2xpc3Q/AAAAkGl2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaAAAAHl2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwAAAARXN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZAAAAB9pdm86Ly9jZHMudml6aWVyL2ovYSthLzYyNi9hMTA0AAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAADkovQStBLzYyNi9BMTA0AAAAGQBMAE8AVABBAEEAUwAgAHAAdQBsAHMAYQByACAAZABpAHMAYwBvAHYAZQByAGkAZQBzAAAACHJlc2VhcmNoAAAG1wBXAGUAIABwAHIAZQBzAGUAbgB0ACAAYQBuACAAbwB2AGUAcgB2AGkAZQB3ACAAbwBmACAAdABoAGUAIABMAE8ARgBBAFIAIABUAGkAZQBkAC0AQQByAHIAYQB5ACAAQQBsAGwALQBTAGsAeQAgAFMAdQByAHYAZQB5ACAAKABMAE8AVABBAEEAUwApACAAZgBvAHIAIAByAGEAZABpAG8AIABwAHUAbABzAGEAcgBzACAAYQBuAGQAIABmAGEAcwB0ACAAdAByAGEAbgBzAGkAZQBuAHQAcwAuACAAVABoAGUAIABzAHUAcgB2AGUAeQAgAHUAcwBlAHMAIAB0AGgAZQAgAGgAaQBnAGgALQBiAGEAbgBkACAAYQBuAHQAZQBuAG4AYQBzACAAbwBmACAAdABoAGUAIABMAE8ARgBBAFIAIABTAHUAcABlAHIAdABlAHIAcAAsACAAdABoAGUAIABkAGUAbgBzAGUAIABpAG4AbgBlAHIAIABwAGEAcgB0ACAAbwBmACAAdABoAGUAIABMAE8ARgBBAFIAIABjAG8AcgBlACwAIAB0AG8AIABzAHUAcgB2AGUAeQAgAHQAaABlACAAbgBvAHIAdABoAGUAcgBuACAAcwBrAHkAIAAoAHsAZABlAGwAdABhAH0APgAwAHsAZABlAGcAfQApACAAYQB0ACAAYQAgAGMAZQBuAHQAcgBhAGwAIABvAGIAcwBlAHIAdgBpAG4AZwAgAGYAcgBlAHEAdQBlAG4AYwB5ACAAbwBmACAAMQAzADUATQBIAHoALgAgAEEAIAB0AG8AdABhAGwAIABvAGYAIAAyADEAOQAgAHQAaQBlAGQALQBhAHIAcgBhAHkAIABiAGUAYQBtAHMAIAAoAGMAbwBoAGUAcgBlAG4AdAAgAHMAdQBtAG0AYQB0AGkAbwBuACAAbwBmACAAcwB0AGEAdABpAG8AbgAgAHMAaQBnAG4AYQBsAHMALAAgAGMAbwB2AGUAcgBpAG4AZwAgADEAMgAgAHMAcQB1AGEAcgBlACAAZABlAGcAcgBlAGUAcwApACwAIABhAHMAIAB3AGUAbABsACAAYQBzACAAdABoAHIAZQBlACAAaQBuAGMAbwBoAGUAcgBlAG4AdAAgAGIAZQBhAG0AcwAgACgAYwBvAHYAZQByAGkAbgBnACAANgA3ACAAcwBxAHUAYQByAGUAIABkAGUAZwByAGUAZQBzACkAIABhAHIAZQAgAGYAbwByAG0AZQBkACAAaQBuACAAZQBhAGMAaAAgAHMAdQByAHYAZQB5ACAAcABvAGkAbgB0AGkAbgBnAC4AIABGAG8AcgAgAGUAYQBjAGgAIABvAGYAIAB0AGgAZQAgADIAMgAyACAAYgBlAGEAbQBzACwAIAB0AG8AdABhAGwAIABpAG4AdABlAG4AcwBpAHQAeQAgAGkAcwAgAHIAZQBjAG8AcgBkAGUAZAAgAGEAdAAgADQAOQAxAC4ANQAyACAAewBtAHUAfQBzACAAdABpAG0AZQAgAHIAZQBzAG8AbAB1AHQAaQBvAG4ALgAgAEUAYQBjAGgAIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AIABpAG4AdABlAGcAcgBhAHQAZQBzACAAZgBvAHIAIAAxAGgAcgAgAGEAbgBkACAAYwBvAHYAZQByAHMAIAAyADUAOQAyACAAYwBoAGEAbgBuAGUAbABzACAAZgByAG8AbQAgADEAMQA5ACAAdABvACAAMQA1ADEATQBIAHoALgAgAFQAaABpAHMAIABpAG4AcwB0AHIAdQBtAGUAbgB0AGEAbAAgAHMAZQB0AHUAcAAgAGEAbABsAG8AdwBzACAATABPAFQAQQBBAFMAIAB0AG8AIAByAGUAYQBjAGgAIABhACAAZABlAHQAZQBjAHQAaQBvAG4AIAB0AGgAcgBlAHMAaABvAGwAZAAgAG8AZgAgADEALQA1AG0ASgB5ACAAZgBvAHIAIABwAGUAcgBpAG8AZABpAGMAIABlAG0AaQBzAHMAaQBvAG4ALgAgAFQAaAB1AHMAIABmAGEAcgAsACAAdABoAGUAIABMAE8AVABBAEEAUwAgAHMAdQByAHYAZQB5ACAAaABhAHMAIAByAGUAcwB1AGwAdABlAGQAIABpAG4AIAB0AGgAZQAgAGQAaQBzAGMAbwB2AGUAcgB5ACAAbwBmACAANwAzACAAcgBhAGQAaQBvACAAcAB1AGwAcwBhAHIAcwAuACAAQQBtAG8AbgBnACAAdABoAGUAcwBlACAAYQByAGUAIAB0AHcAbwAgAG0AaQBsAGQAbAB5ACAAcgBlAGMAeQBjAGwAZQBkACAAYgBpAG4AYQByAHkAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACAAKABQAD0AMQAzACAAYQBuAGQAIAAzADMAbQBzACkALAAgAGEAcwAgAHcAZQBsAGwAIABhAHMAIAB0AGgAZQAgAHMAbABvAHcAZQBzAHQALQBzAHAAaQBuAG4AaQBuAGcAIAByAGEAZABpAG8AIABwAHUAbABzAGEAcgAgAGMAdQByAHIAZQBuAHQAbAB5ACAAawBuAG8AdwBuACAAKABQAD0AMgAzAC4ANQBzACkALgAgAFQAaABlACAAcwB1AHIAdgBlAHkAIABoAGEAcwAgAHQAaAB1AHMAIABmAGEAcgAgAGQAZQB0AGUAYwB0AGUAZAAgADMAMQAxACAAawBuAG8AdwBuACAAcAB1AGwAcwBhAHIAcwAsACAAdwBpAHQAaAAgAHMAcABpAG4AIABwAGUAcgBpAG8AZABzACAAcgBhAG4AZwBpAG4AZwAgAGYAcgBvAG0AIAA0AG0AcwAgAHQAbwAgADUALgAwAHMAIABhAG4AZAAgAGQAaQBzAHAAZQByAHMAaQBvAG4AIABtAGUAYQBzAHUAcgBlAHMAIABmAHIAbwBtACAAMwAuADAAIAB0AG8AIAAyADEANwBwAGMALwBjAG0AXgAzAF4ALgAgAEsAbgBvAHcAbgAgAHAAdQBsAHMAYQByAHMAIABhAHIAZQAgAGQAZQB0AGUAYwB0AGUAZAAgAGEAdAAgAGYAbAB1AHgAIABkAGUAbgBzAGkAdABpAGUAcwAgAGMAbwBuAHMAaQBzAHQAZQBuAHQAIAB3AGkAdABoACAAbABpAHQAZQByAGEAdAB1AHIAZQAgAHYAYQBsAHUAZQBzAC4AIABXAGUAIABmAGkAbgBkACAAdABoAGEAdAAgAHQAaABlACAATABPAFQAQQBBAFMAIABwAHUAbABzAGEAcgAgAGQAaQBzAGMAbwB2AGUAcgBpAGUAcwAgAGgAYQB2AGUALAAgAG8AbgAgAGEAdgBlAHIAYQBnAGUALAAgAGwAbwBuAGcAZQByACAAcwBwAGkAbgAgAHAAZQByAGkAbwBkAHMAIAB0AGgAYQBuACAAdABoAGUAIABrAG4AbwB3AG4AIABwAHUAbABzAGEAcgAgAHAAbwBwAHUAbABhAHQAaQBvAG4ALgAgAFQAaABpAHMAIABtAGEAeQAgAHIAZQBmAGwAZQBjAHQAIABkAGkAZgBmAGUAcgBlAG4AdAAgAHMAZQBsAGUAYwB0AGkAbwBuACAAYgBpAGEAcwBlAHMAIABiAGUAdAB3AGUAZQBuACAATABPAFQAQQBBAFMAIABhAG4AZAAgAHAAcgBlAHYAaQBvAHUAcwAgAHMAdQByAHYAZQB5AHMALAAgAHQAaABvAHUAZwBoACAAaQB0ACAAaQBzACAAYQBsAHMAbwAgAHAAbwBzAHMAaQBiAGwAZQAgAHQAaABhAHQAIABzAGwAbwB3AGUAcgAtAHMAcABpAG4AbgBpAG4AZwAgAHAAdQBsAHMAYQByAHMAIABwAHIAZQBmAGUAcgBlAG4AdABpAGEAbABsAHkAIABoAGEAdgBlACAAcwB0AGUAZQBwAGUAcgAgAHIAYQBkAGkAbwAgAHMAcABlAGMAdAByAGEALgAgAEwATwBUAEEAQQBTACAAaQBzACAAdABoAGUAIABkAGUAZQBwAGUAcwB0ACAAYQBsAGwALQBzAGsAeQAgAHAAdQBsAHMAYQByACAAcwB1AHIAdgBlAHkAIAB1AHMAaQBuAGcAIABhACAAZABpAGcAaQB0AGEAbAAgAGEAcABlAHIAdAB1AHIAZQAgAGEAcgByAGEAeQA7ACAAdwBlACAAZABpAHMAYwB1AHMAcwAgAHMAbwBtAGUAIABvAGYAIAB0AGgAZQAgAGwAZQBzAHMAbwBuAHMAIABsAGUAYQByAG4AZQBkACAAdABoAGEAdAAgAGMAYQBuACAAaQBuAGYAbwByAG0AIAB0AGgAZQAgAGEAcABwAHIAbwBhAGMAaAAgAGYAbwByACAAcwBpAG0AaQBsAGEAcgAgAHMAdQByAHYAZQB5AHMAIAB1AHMAaQBuAGcAIABmAHUAdAB1AHIAZQAgAHIAYQBkAGkAbwAgAHQAZQBsAGUAcwBjAG8AcABlAHMAIABzAHUAYwBoACAAYQBzACAAdABoAGUAIABTAHEAdQBhAHIAZQAgAEsAaQBsAG8AbQBlAHQAcgBlACAAQQByAHIAYQB5AC4AAAAzaHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovQStBLzYyNi9BMTA0AAABMgBTAGEAbgBpAGQAYQBzACAAUwAuADsAIABDAG8AbwBwAGUAcgAgAFMALgA7ACAAQgBhAHMAcwBhACAAQwAuAEcALgA7ACAASABlAHMAcwBlAGwAcwAgAEoALgBXAC4AVAAuADsAIABLAG8AbgBkAHIAYQB0AGkAZQB2ACAAVgAuAEkALgA7ACAATQBpAGMAaABpAGwAbABpACAARAAuADsAIABT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AHMAdABlAG0AIABhAG4AZAAgAHQAaABlACAAVwBpAGQAZQBiAGEAbgBkACAAQQByAGUAYwBpAGIAbwAgAFAAdQBsAHMAYQByACAAUAByAG8AYwBlAHMAcwBvAHIAIABzAHAAZQBjAHQAcgBhAGwAIABwAHIAbwBjAGUAcwBzAG8AcgBzAC4AIABXAGgAaQBsAGUAIAB0AGgAZQBzAGUAIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAHcAZQByAGUAIABnAGUAYQByAGUAZAAgAG0AYQBpAG4AbAB5ACAAYQB0ACAAdABlAHMAdABpAG4AZwAgAGEAbgBkACAAZABlAGIAdQBnAGcAaQBuAGcAIABzAHUAcgB2AGUAeQAgAHMAdAByAGEAdABlAGcAeQAsACAAaABhAHIAZAB3AGEAcgBlACwAIABhAG4AZAAgAHMAbwBmAHQAdwBhAHIAZQAsACAAYQBwAHAAcgBvAHgAaQBtAGEAdABlAGwAeQAgADQAOABoAHIAIABvAGYAIAB0AGUAbABlAHMAYwBvAHAAZQAgAHQAaQBtAGUAIAB5AGkAZQBsAGQAZQBkACAAcwBjAGkAZQBuAGMAZQAtAHEAdQBhAGwAaQB0AHkAIABkAGEAdABhAC4AIABUAG8AIAB0AGUAcwB0ACAAbwB1AHIAIABhAGIAaQBsAGkAdAB5ACAAdABvACAAZABpAHMAYwByAGkAbQBpAG4AYQB0AGUAIABjAG8AcwBtAGkAYwAgAHMAaQBnAG4AYQBsAHMAIABmAHIAbwBtACAAcgBhAGQAaQBvAC0AZgByAGUAcQB1AGUAbgBjAHkAIABpAG4AdABlAHIAZgBlAHIAZQBuAGMAZQAgAGEAbgBkACAAbgBvAGkAcwBlACwAIAAxADYANQAgAGMAYQBuAGQAaQBkAGEAdABlAHMAIAByAGEAbgBnAGkAbgBnACAAaQBuACAAcgBlAGwAaQBhAGIAaQBsAGkAdAB5ACAAbABpAGsAZQBsAGkAaABvAG8AZAAgAHcAZQByAGUAIAByAGUAbwBiAHMAZQByAHYAZQBkACAAdwBpAHQAaAAgAHQAaABlACAAcwBpAG4AZwBsAGUALQBiAGUAYQBtACAATAAtAGIAYQBuAGQAIAB3AGkAZABlACAAcwB5AHMAdABlAG0AIABhAHQAIABBAHIAZQBjAGkAYgBvACAAaQBuACAAMgAwADAANQAgAEoAYQBuAHUAYQByAHkALQBGAGUAYgByAHUAYQByAHkALgAgAE8AZgAgAHQAaABvAHMAZQAsACAANAAxACUAIAB3AGUAcgBlACAAYwBvAG4AZgBpAHIAbQBlAGQAIABhAHMAIAByAGUAYQBsAC4AIABXAGUAIABwAHIAZQBzAGUAbgB0ACAAdABoAGUAIAByAGUAcwB1AGwAdABzACAAbwBmACAAYgBvAHQAaAAgAHQAaABlACAAQQBMAEYAQQAgAGEAbgBkACAAdABoAGUAIABzAGkAbgBnAGwAZQAtAGIAZQBhAG0AIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAGYAbwByACAAdABoAGUAIABzAGEAbQBwAGwAZQAgAG8AZgAgADEANgA2ACAAYwBvAG4AZgBpAHIAbQBlAGQAIABIAEkAIABzAG8AdQByAGMAZQBzACwAIABhAHMAIAB3AGUAbABsACAAYQBzACAAbwB1AHIAIABhAHMAcwBlAHMAcwBtAGUAbgB0ACAAbwBmACAAdABoAGUAaQByACAAbwBwAHQAaQBjAGEAbAAgAGMAbwB1AG4AdABlAHIAcABhAHIAdABzAC4AAAAyaHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovQUovMTMwLzI2MTMAAAEWAEcAaQBvAHYAYQBuAGUAbABsAGkAIABSAC4AOwAgAEgAYQB5AG4AZQBzACAATQAuAFAALgA7ACAASwBlAG4AdAAgAEIALgBSAC4AOwAgAFAAZQByAGkAbABsAGEAdAAgAFAALgA7ACAAQwBhAHQAaQBuAGUAbABsAGEAIABCAC4AOwAgAEgAbwBmAGYAbQBhAG4AIABHAC4ATAAuADsAIABNAG8AbQBqAGkAYQBuACAARQAuADsAIABSAG8AcwBlAG4AYgBlAHIAZwAgAEoALgBMAC4AOwAgAFMAYQBpAG4AdABvAG4AZwBlACAAQQAuADsAIABTAHAAZQBrAGsAZQBuAHMAIABLAC4AOwAgAFMAdABpAGUAcgB3AGEAbAB0ACAAUwAuADsAIABCAHIAbwBzAGMAaAAgAE4ALgA7ACAATQBhAHMAdABlAHIAcwAgAEsALgBMAC4AOwAgAFMAcAByAGkAbgBnAG8AYgAgAEMALgBNAC4AOwAgAEsAYQByAGEAYwBoAGUAbgB0AHMAZQB2ACAASQAuAEQALgA7ACAASwBhAHIAYQBjAGgAZQBuAHQAcwBlAHYAYQAgAFYALgBFAC4AOwAgAEsAbwBvAHAAbQBhAG4AbgAgAFIALgBBAC4AOwAgAE0AdQBsAGwAZQByACAARQAuADsAIAB2AGEAbgAgAEQAcgBpAGUAbAAgAFcALgA7ACAAdgBhAG4AIABaAGUAZQAgAEwALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGV/wAAAAAAABXJhZGlvAAAC12h0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9BSi8xMzAvMjYxMzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0FKLzEzMC8yNjEzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BSi8xMzAvMjYxMy9kYXRhPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BSi8xMzAvMjYxMy90YWJsZTM/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL0FKLzEzMC8yNjEzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovQUovMTMwLzI2MTM6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FKLzEzMC8yNjEzL2RhdGE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FKLzEzMC8yNjEzL3RhYmxlMz8AAAEvOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoAAABAXZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwAAAAmTo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZAAAAB5pdm86Ly9jZHMudml6aWVyL2ovYXBqLzY0Mi84NjgAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAANSi9BcEovNjQyLzg2OAAAACEAUgBvAHQAYQB0AGkAbwBuACAAbQBlAGEAcwB1AHIAZQBzACAAZgBvAHIAIAAyADIAMwAgAHAAdQBsAHMAYQByAHMAAAAIcmVzZWFyY2gAAAEdAFQAaABlACAAbABhAHIAZwBlAC0AcwBjAGEAbABlACAAbQBhAGcAbgBlAHQAaQBjACAAZgBpAGUAbABkACAAbwBmACAAbwB1AHIAIABHAGEAbABhAHgAeQAgAGMAYQBuACAAYgBlACAAcAByAG8AYgBlAGQAIABpAG4AIAB0AGgAcgBlAGUAIABkAGkAbQBlAG4AcwBpAG8AbgBzACAAdQBzAGkAbgBnACAARgBhAHIAYQBkAGEAeQAgAHIAbwB0AGEAdABpAG8AbgAgAG8AZgAgAHAAdQBsAHMAYQByACAAcwBpAGcAbgBhAGwAcwAuACAAVwBlACAAcgBlAHAAbwByAHQAIABvAG4AIAB0AGgAZQAgAGQAZQB0AGUAcgBtAGkAbgBhAHQAaQBvAG4AIABvAGYAIAAyADIAMwAgAHIAbwB0AGEAdABpAG8AbgAgAG0AZQBhAHMAdQByAGUAcwAgAGYAcgBvAG0AIABwAG8AbABhAHIAaQB6AGEAdABpAG8AbgAgAG8AYgBzAGUAcgB2AGEAdABpAG8AbgBzACAAbwBmACAAcgBlAGwAYQB0AGkAdgBlAGwAeQAgAGQAaQBzAHQAYQBuAHQAIABzAG8AdQB0AGgAZQByAG4AIABwAHUAbABzAGEAcgBzACAAbQBhAGQAZQAgAHUAcwBpAG4AZwAgAHQAaABlACAAUABhAHIAawBlAHMAIAByAGEAZABpAG8AIAB0AGUAbABlAHMAYwBvAHAAZQAuAAAAMmh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL0FwSi82NDIvODY4AAAAPwBIAGEAbgAgAEoALgBMAC4AOwAgAE0AYQBuAGMAaABlAHMAdABlAHIAIABSAC4ATgAuADsAIABMAHkAbgBlACAAQQAuAEcALgA7ACAAUQBpAGEAbwAgAEcALgBKAC4AOwAgAFYAYQBuACAAUwB0AHIAYQB0AGUAbgAgAFcALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGV/wAAAAAAABXJhZGlvAAABFmh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0FwSi82NDIvODY4Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BcEovNjQyLzg2OC90YWJsZTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL0FwSi82NDIvODY4AAAAZDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6OjoAAABednM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3NlcgAAADM6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjoAAAAdaXZvOi8vY2RzLnZpemllci9qL2Fwai83NjkvNjYAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAMSi9BcEovNzY5LzY2AAAAJwBUAGgAZQAgAEUATABNACAAcwB1AHIAdgBlAHkALgAgAFYALgAgAFcAaABpAHQAZQAgAGQAdwBhAHIAZgAgAGIAaQBuAGEAcgBpAGUAcwAAAAhyZXNlYXJjaAAAA4wAVwBlACAAcAByAGUAcwBlAG4AdAAgAHQAaABlACAAZABpAHMAYwBvAHYAZQByAHkAIABvAGYAIAAxADcAIABsAG8AdwAtAG0AYQBzAHMAIAB3AGgAaQB0AGUAIABkAHcAYQByAGYAcwAgACgAVwBEAHMAKQAgAGkAbgAgAHMAaABvAHIAdAAtAHAAZQByAGkAbwBkACAAKABQADwAPQAxACAAZABhAHkAKQAgAGIAaQBuAGEAcgBpAGUAcwAuACAATwB1AHIAIABzAGEAbQBwAGwAZQAgAGkAbgBjAGwAdQBkAGUAcwAgAGYAbwB1AHIAIABvAGIAagBlAGMAdABzACAAdwBpAHQAaAAgAHIAZQBtAGEAcgBrAGEAYgBsAGUAIABsAG8AZwBnAD0AfgA1ACAAcwB1AHIAZgBhAGMAZQAgAGcAcgBhAHYAaQB0AGkAZQBzACAAYQBuAGQAIABvAHIAYgBpAHQAYQBsACAAcwBvAGwAdQB0AGkAbwBuAHMAIAB0AGgAYQB0ACAAcgBlAHEAdQBpAHIAZQAgAHQAaABlAG0AIAB0AG8AIABiAGUAIABkAG8AdQBiAGwAZQAgAGQAZQBnAGUAbgBlAHIAYQB0AGUAIABiAGkAbgBhAHIAaQBlAHMALgAgAEEAbABsACAAbwBmACAAdABoAGUAIABsAG8AdwBlAHMAdAAgAHMAdQByAGYAYQBjAGUAIABnAHIAYQB2AGkAdAB5ACAAVwBEAHMAIABoAGEAdgBlACAAbQBlAHQAYQBsACAAbABpAG4AZQBzACAAaQBuACAAdABoAGUAaQByACAAcwBwAGUAYwB0AHIAYQAgAGkAbQBwAGwAeQBpAG4AZwAgAGwAbwBuAGcAIABnAHIAYQB2AGkAdABhAHQAaQBvAG4AYQBsACAAcwBlAHQAdABsAGkAbgBnACAAdABpAG0AZQBzACAAbwByACAAbwBuAGcAbwBpAG4AZwAgAGEAYwBjAHIAZQB0AGkAbwBuAC4AIABOAG8AdABhAGIAbAB5ACwAIABzAGkAeAAgAG8AZgAgAHQAaABlACAAVwBEAHMAIABpAG4AIABvAHUAcgAgAHMAYQBtAHAAbABlACAAaABhAHYAZQAgAGIAaQBuAGEAcgB5ACAAbQBlAHIAZwBlAHIAIAB0AGkAbQBlAHMAIAA8ADEAMABHAHkAcgAuACAARgBvAHUAcgAgAGgAYQB2AGUAIAA+AH4AMAAuADkATQBfAHsAcwB1AG4AfQBfACAAYwBvAG0AcABhAG4AaQBvAG4AcwAuACAASQBmACAAdABoAGUAIABjAG8AbQBwAGEAbgBpAG8AbgBzACAAYQByAGUAIABtAGEAcwBzAGkAdgBlACAAVwBEAHMALAAgAHQAaABlAHMAZQAgAGYAbwB1AHIAIABiAGkAbgBhAHIAaQBlAHMAIAB3AGkAbABsACAAZQB2AG8AbAB2AGUAIABpAG4AdABvACAAcwB0AGEAYgBsAGUAIABtAGEAcwBzACAAdAByAGEAbgBzAGYAZQByACAAQQBNACAAQwBWAG4AIABzAHkAcwB0AGUAbQBzACAAYQBuAGQAIABwAG8AcwBzAGkAYgBsAHkAIABlAHgAcABsAG8AZABlACAAYQBzACAAdQBuAGQAZQByAGwAdQBtAGkAbgBvAHUAcwAgAHMAdQBwAGUAcgBuAG8AdgBhAGUALgAgAEkAZgAgAHQAaABlACAAYwBvAG0AcABhAG4AaQBvAG4AcwAgAGEAcgBlACAAbgBlAHUAdAByAG8AbgAgAHMAdABhAHIAcwAsACAAdABoAGUAbgAgAHQAaABlAHMAZQAgAG0AYQB5ACAAYgBlACAAbQBpAGwAbABpAHMAZQBjAG8AbgBkACAAcAB1AGwAcwBhAHIAIABiAGkAbgBhAHIAaQBlAHMALgAgAFQAaABlAHMAZQAgAGQAaQBzAGMAbwB2AGUAcgBpAGUAcwAgAGkAbgBjAHIAZQBhAHMAZQAgAHQAaABlACAAbgB1AG0AYgBlAHIAIABvAGYAIABkAGUAdABhAGMAaABlAGQALAAgAGQAbwB1AGIAbABlACAAZABlAGcAZQBuAGUAcgBhAHQAZQAgAGIAaQBuAGEAcgBpAGUAcwAgAGkAbgAgAHQAaABlACAARQB4AHQAcgBlAG0AZQBsAHkAIABsAG8AdwAgAG0AYQBzAHMAIAAoAEUATABNACkAIABTAHUAcgB2AGUAeQAgAHQAbwAgADUANAA7ACAAMwAxACAAbwBmACAAdABoAGUAcwBlACAAYgBpAG4AYQByAGkAZQBzACAAdwBpAGwAbAAgAG0AZQByAGcAZQAgAHcAaQB0AGgAaQBuACAAYQAgAEgAdQBiAGIAbABlACAAdABpAG0AZQAuAAAAMWh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL0FwSi83NjkvNjYAAABCAEIAcgBvAHcAbgAgAFcALgBSAC4AOwAgAEsAaQBsAGkAYwAgAE0ALgA7ACAAQQBsAGwAZQBuAGQAZQAgAFAAcgBpAGUAdABvACAAQwAuADsAIABHAGkAYQBuAG4AaQBuAGEAcwAgAEEALgA7ACAASwBlAG4AeQBvAG4AIABTAC4ASgAuAAAAB2NhdGFsb2cAAAAHYmliY29kZX/AAAAAAAAHb3B0aWNhbAAAARJodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQXBKLzc2OS82Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9BcEovNzY5LzY2Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FwSi83NjkvNjYvd2RiaW4/AAAAZDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAABednI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADM6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAeaXZvOi8vY2RzLnZpemllci9qL2Fwai84NjEvMTEzAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAADUovQXBKLzg2MS8xMTMAAAAsAFYATABCAEEAIABhAHMAdAByAG8AbQBlAHQAcgB5ACAAYwBvAG0AYgBpAG4AZQBkACAAdwBpAHQAaAAgAEcAYQBpAGEAIABEAFIAMQAgAGUAcABvAGMAaAAAAAhyZXNlYXJjaAAABXUAVABoAGUAIABjAGEAbgBvAG4AaQBjAGEAbAAgAG0AZQB0AGgAbwBkAHMAIABmAG8AcgAgAGcAcgBhAHYAaQB0AGEAdABpAG8AbgBhAGwAIAB3AGEAdgBlACAAZABlAHQAZQBjAHQAaQBvAG4AIABhAHIAZQAgAGcAcgBvAHUAbgBkAC0AIABhAG4AZAAgAHMAcABhAGMAZQAtACAAYgBhAHMAZQBkACAAbABhAHMAZQByACAAaQBuAHQAZQByAGYAZQByAG8AbQBlAHQAcgB5ACwAIABwAHUAbABzAGEAcgAgAHQAaQBtAGkAbgBnACwAIABhAG4AZAAgAHAAbwBsAGEAcgBpAHoAYQB0AGkAbwBuACAAbwBmACAAdABoAGUAIABjAG8AcwBtAGkAYwAgAG0AaQBjAHIAbwB3AGEAdgBlACAAYgBhAGMAawBnAHIAbwB1AG4AZAAuACAAQgB1AHQAIABhAHMAIABoAGEAcwAgAGIAZQBlAG4AIABzAHUAZwBnAGUAcwB0AGUAZAAgAGIAeQAgAG4AdQBtAGUAcgBvAHUAcwAgAGkAbgB2AGUAcwB0AGkAZwBhAHQAbwByAHMALAAgAGEAcwB0AHIAbwBtAGUAdAByAHkAIABvAGYAZgBlAHIAcwAgAGEAbgAgAGEAZABkAGkAdABpAG8AbgBhAGwAIABwAGEAdABoACAAdABvACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAIABkAGUAdABlAGMAdABpAG8AbgAuACAARwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAcwAgAGQAZQBmAGwAZQBjAHQAIABsAGkAZwBoAHQAIAByAGEAeQBzACAAbwBmACAAZQB4AHQAcgBhAGcAYQBsAGEAYwB0AGkAYwAgAG8AYgBqAGUAYwB0AHMALAAgAGMAcgBlAGEAdABpAG4AZwAgAGEAcABwAGEAcgBlAG4AdAAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAgAGkAbgAgAGEAIABxAHUAYQBkAHIAdQBwAG8AbABhAHIAIAAoAGEAbgBkACAAaABpAGcAaABlAHIALQBvAHIAZABlAHIAIABtAG8AZABlAHMAKQAgAHAAYQB0AHQAZQByAG4ALgAgAEEAcwB0AHIAbwBtAGUAdAByAHkAIABvAGYAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAcgBhAGQAaQBvACAAcwBvAHUAcgBjAGUAcwAgAGkAcwAgAHMAZQBuAHMAaQB0AGkAdgBlACAAdABvACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAcwAgAHcAaQB0AGgAIABmAHIAZQBxAHUAZQBuAGMAaQBlAHMAIABiAGUAdAB3AGUAZQBuACAAcgBvAHUAZwBoAGwAeQAgADEAMABeAC0AMQA4AF4AIABhAG4AZAAgADEAMABeAC0AOABeAEgAegAgACgASABfADAAXwAgAGEAbgBkACAAMQAvADMAeQByAF4ALQAxAF4AKQAsACAAbwB2AGUAcgBsAGEAcABwAGkAbgBnACAAYQBuAGQAIABiAHIAaQBkAGcAaQBuAGcAIAB0AGgAZQAgAHAAdQBsAHMAYQByACAAdABpAG0AaQBuAGcAIABhAG4AZAAgAEMATQBCACAAcABvAGwAYQByAGkAegBhAHQAaQBvAG4AIAByAGUAZwBpAG0AZQBzAC4AIABXAGUAIABwAHIAZQBzAGUAbgB0ACAAYQAgAG0AZQB0AGgAbwBkAG8AbABvAGcAeQAgAGYAbwByACAAYQBzAHQAcgBvAG0AZQB0AHIAaQBjACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAIABkAGUAdABlAGMAdABpAG8AbgAgAGkAbgAgAHQAaABlACAAcAByAGUAcwBlAG4AYwBlACAAbwBmACAAbABhAHIAZwBlACAAaQBuAHQAcgBpAG4AcwBpAGMAIAB1AG4AYwBvAHIAcgBlAGwAYQB0AGUAZAAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAgACgAaQAuAGUALgAsACAAcgBhAGQAaQBvACAAagBlAHQAcwApAC4AIABXAGUAIABvAGIAdABhAGkAbgAgADkANQAlACAAYwBvAG4AZgBpAGQAZQBuAGMAZQAgAGwAaQBtAGkAdABzACAAbwBuACAAdABoAGUAIABzAHQAbwBjAGgAYQBzAHQAaQBjACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAIABiAGEAYwBrAGcAcgBvAHUAbgBkACAAdQBzAGkAbgBnACAANwAxADEAIAByAGEAZABpAG8AIABzAG8AdQByAGMAZQBzACwAIAB7AE8AbQBlAGcAYQB9AF8ARwBXAF8APAAwAC4AMAAwADYANAAsACAAYQBuAGQAIAB1AHMAaQBuAGcAIAA1ADAAOAAgAHIAYQBkAGkAbwAgAHMAbwB1AHIAYwBlAHMAIABjAG8AbQBiAGkAbgBlAGQAIAB3AGkAdABoACAAdABoAGUAIABmAGkAcgBzAHQAIABHAGEAaQBhACAAZABhAHQAYQAgAHIAZQBsAGUAYQBzAGUAOgAgAHsATwBtAGUAZwBhAH0AXwBHAFcAXwA8ADAALgAwADEAMQAuACAAVABoAGUAcwBlACAAbABpAG0AaQB0AHMAIABwAHIAbwBiAGUAIABnAHIAYQB2AGkAdABhAHQAaQBvAG4AYQBsACAAdwBhAHYAZQAgAGYAcgBlAHEAdQBlAG4AYwBpAGUAcwAgADYAeAAxADAAXgAtADEAOABeAEgAegA8AH4AZgA8AH4AMQB4ADEAMABeAC0AOQBeAEgAegAuACAAVQBzAGkAbgBnACAAYQAgAFcASQBTAEUALQBHAGEAaQBhACAAYwBhAHQAYQBsAG8AZwAgAG8AZgAgADUANgA3ADcAMgAxACAAQQBHAE4ALAAgAHcAZQAgAHAAcgBlAGQAaQBjAHQAIABhACAAbABpAG0AaQB0ACAAZQB4AHAAZQBjAHQAZQBkACAAZgByAG8AbQAgAEcAYQBpAGEAIABhAGwAbwBuAGUAIABvAGYAIAB7AE8AbQBlAGcAYQB9AF8ARwBXAF8APAAwAC4AMAAwADAANgAsACAAdwBoAGkAYwBoACAAaQBzACAAcwBpAGcAbgBpAGYAaQBjAGEAbgB0AGwAeQAgAGgAaQBnAGgAZQByACAAdABoAGEAbgAgAHcAYQBzACAAbwByAGkAZwBpAG4AYQBsAGwAeQAgAGYAbwByAGUAYwBhAHMAdAAuACAASQBuAGMAaQBkAGUAbgB0AGEAbABsAHkALAAgAHcAZQAgAGQAZQB0AGUAYwB0ACAAYQBuAGQAIAByAGUAcABvAHIAdAAgAG8AbgAgADIAMgAgAG4AZQB3ACAAZQB4AGEAbQBwAGwAZQBzACAAbwBmACAAbwBwAHQAaQBjAGEAbAAgAHMAdQBwAGUAcgBsAHUAbQBpAG4AYQBsACAAbQBvAHQAaQBvAG4AIAB3AGkAdABoACAAcgBlAGQAcwBoAGkAZgB0AHMAIAAwAC4AMQAzAC0AMwAuADgAOQAuAAAAMmh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL0FwSi84NjEvMTEzAAAAJgBEAGEAcgBsAGkAbgBnACAASgAuADsAIABUAHIAdQBlAGIAZQBuAGIAYQBjAGgAIABBAC4ARQAuADsAIABQAGEAaQBuAGUAIABKAC4AAAAHY2F0YWxvZwAAAAdiaWJjb2Rlf8AAAAAAAA1vcHRpY2FsI3JhZGlvAAABFmh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0FwSi84NjEvMTEzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FwSi84NjEvMTEzL3RhYmxlNz86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQXBKLzg2MS8xMTM6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwAAAAZDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXgAAABednM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADM6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAhaXZvOi8vY2RzLnZpemllci9qL21ucmFzLzM1OS8xNTI0AAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAAEEovTU5SQVMvMzU5LzE1MjQAAAArADEAMAAgAG4AZQB3ACAAcAB1AGwAcwBhAHIAcwAgAGkAbgAgAEEAcgBlAGMAaQBiAG8AIABkAHIAaQBmAHQALQBzAGMAYQBuACAAcwB1AHIAdgBlAHkAAAAIcmVzZWFyY2gAAAPJAFcAZQAgAHAAcgBlAHMAZQBuAHQAIAB0AGgAZQAgAHIAZQBzAHUAbAB0AHMAIABvAGYAIABhACAANAAzADAALQBNAEgAegAgAHMAdQByAHYAZQB5ACAAZgBvAHIAIABwAHUAbABzAGEAcgBzACAAYwBvAG4AZAB1AGMAdABlAGQAIABkAHUAcgBpAG4AZwAgAHQAaABlACAAdQBwAGcAcgBhAGQAZQAgAHQAbwAgAHQAaABlACAAMwAwADUALQBtACAAQQByAGUAYwBpAGIAbwAgAHIAYQBkAGkAbwAgAHQAZQBsAGUAcwBjAG8AcABlAC4AIABPAHUAcgAgAHMAdQByAHYAZQB5ACAAYwBvAHYAZQByAGUAZAAgAGEAIAB0AG8AdABhAGwAIABvAGYAIAAxADEANAA3AGQAZQBnAF4AMgBeACAAbwBmACAAcwBrAHkAIAB1AHMAaQBuAGcAIABhACAAZAByAGkAZgB0AC0AcwBjAGEAbgAgAHQAZQBjAGgAbgBpAHEAdQBlAC4AIABXAGUAIABkAGUAdABlAGMAdABlAGQAIAAzADMAIABwAHUAbABzAGEAcgBzACwAIAAxADAAIABvAGYAIAB3AGgAaQBjAGgAIAB3AGUAcgBlACAAbgBvAHQAIABrAG4AbwB3AG4AIABwAHIAaQBvAHIAIAB0AG8AIAB0AGgAZQAgAHMAdQByAHYAZQB5ACAAbwBiAHMAZQByAHYAYQB0AGkAbwBuAHMALgAgAFQAaABlACAAaABpAGcAaABsAGkAZwBoAHQAIABvAGYAIAB0AGgAZQAgAG4AZQB3ACAAZABpAHMAYwBvAHYAZQByAGkAZQBzACAAaQBzACAAUABTAFIAIABKADAANAAwADcAKwAxADYAMAA3ACwAIAB3AGgAaQBjAGgAIABoAGEAcwAgAGEAIABzAHAAaQBuACAAcABlAHIAaQBvAGQAIABvAGYAIAAyADUALgA3AG0AcwAsACAAYQAgAGMAaABhAHIAYQBjAHQAZQByAGkAcwB0AGkAYwAgAGEAZwBlACAAbwBmACAAMQAuADUARwB5AHIAIABhAG4AZAAgAGkAcwAgAGkAbgAgAGEAIAAxAC4AOAAtAHkAcgAgAG8AcgBiAGkAdAAgAGEAYgBvAHUAdAAgAGEAIABsAG8AdwAtAG0AYQBzAHMAIAAoAD4AMAAuADIATQApACAAYwBvAG0AcABhAG4AaQBvAG4ALgAgAFQAaABlACAAbABvAG4AZwAgAG8AcgBiAGkAdABhAGwAIABwAGUAcgBpAG8AZAAgAGEAbgBkACAAcwBtAGEAbABsACAAZQBjAGMAZQBuAHQAcgBpAGMAaQB0AHkAIAAoAGUAPQAwAC4AMAAwADAAOQApACAAbQBhAGsAZQAgAHQAaABlACAAYgBpAG4AYQByAHkAIABzAHkAcwB0AGUAbQAgAGEAbgAgAGkAbQBwAG8AcgB0AGEAbgB0ACAAbgBlAHcAIABhAGQAZABpAHQAaQBvAG4AIAB0AG8AIAB0AGgAZQAgAGUAbgBzAGUAbQBiAGwAZQAgAG8AZgAgAGIAaQBuAGEAcgB5ACAAcAB1AGwAcwBhAHIAcwAgAHMAdQBpAHQAYQBiAGwAZQAgAHQAbwAgAHQAZQBzAHQAIABmAG8AcgAgAHYAaQBvAGwAYQB0AGkAbwBuAHMAIABvAGYAIAB0AGgAZQAgAHMAdAByAG8AbgBnACAAZQBxAHUAaQB2AGEAbABlAG4AYwBlACAAcAByAGkAbgBjAGkAcABsAGUALgAgAFcAZQAgAGEAbABzAG8AIAByAGUAcABvAHIAdAAgAG8AbgAgAG8AdQByACAAaQBuAGkAdABpAGEAbABsAHkAIAB1AG4AcwB1AGMAYwBlAHMAcwBmAHUAbAAgAGEAdAB0AGUAbQBwAHQAcwAgAHQAbwAgAGQAZQB0AGUAYwB0ACAAbwBwAHQAaQBjAGEAbABsAHkAIAB0AGgAZQAgAGMAbwBtAHAAYQBuAGkAbwBuACAAdABvACAASgAwADQAMAA3ACsAMQA2ADAANwAsACAAdwBoAGkAYwBoACAAaQBtAHAAbAB5ACAAdABoAGEAdAAgAGkAdABzACAAYQBiAHMAbwBsAHUAdABlACAAdgBpAHMAdQBhAGwAIABtAGEAZwBuAGkAdAB1AGQAZQAgAGkAcwAgAD4AMQAyAC4AMQAuACAASQBmACwAIABhAHMAIABlAHgAcABlAGMAdABlAGQAIABvAG4AIABlAHYAbwBsAHUAdABpAG8AbgBhAHIAeQAgAGcAcgBvAHUAbgBkAHMALAAgAHQAaABlACAAYwBvAG0AcABhAG4AaQBvAG4AIABpAHMAIABhAG4AIABIAGUAIAB3AGgAaQB0AGUAIABkAHcAYQByAGYALAAgAG8AdQByACAAbgBvAG4ALQBkAGUAdABlAGMAdABpAG8AbgAgAGkAbQBwAGwAaQBlAHMAIABhACAAYwBvAG8AbABpAG4AZwAg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ACAAcAB1AGwAcwBhAHIAcwAgAGgAYQB2AGUAIABzAHAAaQBuACAAcABlAHIAaQBvAGQAcwAgAGcAcgBlAGEAdABlAHIAIAB0AGgAYQBuACAAMQAwADAAbQBzACwAIABhAG4AZAAgAG4AbwBuAGUAIABvAGYAIAB0AGgAbwBzAGUAIAB3AGkAdABoACAAdABpAG0AaQBuAGcAIABzAG8AbAB1AHQAaQBvAG4AcwAgAGkAcwAgAGkAbgAgAGIAaQBuAGEAcgBpAGUAcwAuACAAVAB3AG8AIABkAGkAcwBwAGwAYQB5ACAAcABhAHIAdABpAGMAdQBsAGEAcgBsAHkAIABpAG4AdABlAHIAZQBzAHQAaQBuAGcAIABiAGUAaABhAHYAaQBvAHUAcgA7ACAAUABTAFIAIABKADEAMAA1ADQALQA1ADkANAA0ACAAaQBzACAAZgBvAHUAbgBkACAAdABvACAAYgBlACAAYQBuACAAaQBuAHQAZQByAG0AaQB0AHQAZQBuAHQAIABwAHUAbABzAGEAcgAsACAAYQBuAGQAIABQAFMAUgAgAEoAMQA4ADAAOQAtADAAMQAxADkAIABoAGEAcwAgAGcAbABpAHQAYwBoAGUAZAAgAHQAdwBpAGMAZQAgAHMAaQBuAGMAZQAgAGkAdABzACAAZABpAHMAYwBvAHYAZQByAHkALgAgAEkAbgAgAHQAaABlACAAcwBlAGMAbwBuAGQAIABoAGEAbABmACAAbwBmACAAdABoAGUAIABwAGEAcABlAHIAIAB3AGUAIABkAGkAcwBjAHUAcwBzACAAdABoAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABhAG4AZAAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAgAG8AZgAgAGEAbgAgAGEAcgB0AGkAZgBpAGMAaQBhAGwAIABuAGUAdQByAGEAbAAgAG4AZQB0AHcAbwByAGsAIABpAG4AIAB0AGgAZQAgAGQAYQB0AGEALQBwAHIAbwBjAGUAcwBzAGkAbgBnACAAcABpAHAAZQBsAGkAbgBlACAAZgBvAHIAIAB0AGgAZQAgAHMAdQByAHYAZQB5AC4AIABXAGUAIABkAGkAcwBjAHUAcwBzACAAdABoAGUAIAB0AGUAcwB0AHMAIAB0AGgAYQB0ACAAdwBlAHIAZQAgAHUAcwBlAGQAIAB0AG8AIABnAGUAbgBlAHIAYQB0AGUAIABzAGMAbwByAGUAcwAgAGEAbgBkACAAZgBpAG4AZAAgAHQAaABhAHQAIABvAHUAcgAgAG4AZQB1AHIAYQBsACAAbgBlAHQAdwBvAHIAawAgAHcAYQBzACAAYQBiAGwAZQAgAHQAbwAgAHIAZQBqAGUAYwB0ACAAbwB2AGUAcgAgADkAOQBwAGUAcgAgAGMAZQBuAHQAIABvAGYAIAB0AGgAZQAgAGMAYQBuAGQAaQBkAGEAdABlAHMAIABwAHIAbwBkAHUAYwBlAGQAIABpAG4AIAB0AGgAZQAgAGQAYQB0AGEAIABwAHIAbwBjAGUAcwBzAGkAbgBnACwAIABhAG4AZAAgAGEAYgBsAGUAIAB0AG8AIABiAGwAaQBuAGQAbAB5ACAAZABlAHQAZQBjAHQAIAA4ADUAcABlAHIAIABjAGUAbgB0ACAAbwBmACAAcAB1AGwAcwBhAHIAcwAuACAAVwBlACAAcwB1AGcAZwBlAHMAdAAgAHQAaABhAHQAIABpAG0AcAByAG8AdgBlAG0AZQBuAHQAcwAgAHQAbwAgAHQAaABlACAAYQBjAGMAdQByAGEAYwB5ACAAcwBoAG8AdQBsAGQAIABiAGUAIABwAG8AcwBzAGkAYgBsAGUAIABpAGYAIABmAHUAcgB0AGgAZQByACAAYwBhAHIAZQAgAGkAcwAgAHQAYQBrAGUAbgAgAHcAaABlAG4AIAB0AHIAYQBpAG4AaQBuAGcAIABhAG4AIABhAHIAdABpAGYAaQBjAGkAYQBsACAAbgBlAHUAcgBhAGwAIABuAGUAdAB3AG8AcgBrADsAIABmAG8AcgAgAGUAeABhAG0AcABsAGUALAAgAGUAbgBzAHUAcgBpAG4AZwAgAHQAaABhAHQAIABhACAAcgBlAHAAcgBlAHMAZQBuAHQAYQB0AGkAdgBlACAAcwBhAG0AcABsAGUAIABvAGYAIAB0AGgAZQAgAHAAdQBsAHMAYQByACAAcABvAHAAdQBsAGEAdABpAG8AbgAgAGkAcwAgAHUAcwBlAGQAIABkAHUAcgBpAG4AZwAgAHQAaABlACAAdAByAGEAaQBuAGkAbgBnACAAcAByAG8AYwBlAHMAcwAsACAAbwByACAAdABoAGUAIAB1AHMAZQAgAG8AZgAgAGQAaQBmAGYAZQByAGUAbgB0ACAAYQByAHQAaQBmAGkAYwBpAGEAbAAgAG4AZQB1AHIAYQBsACAAbgBlAHQAdwBvAHIAawBzACAAZgBvAHIAIAB0AGgAZQAgAGQAZQB0AGUAYwB0AGkAbwBuACAAbwBmACAAZABpAGYAZgBlAHIAZQBuAHQAIAB0AHkAcABlAHMAIABvAGYAIABwAHUAbABzAGEAcgBzAC4AAAA1aHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovTU5SQVMvNDI3LzEwNTIAAAELAEIAYQB0AGUAcwAgAFMALgBEAC4AOwAgAEIAYQBpAGwAZQBzACAATQAuADsAIABCAGEAcgBzAGQAZQBsAGwAIABCAC4AUgAuADsAIABCAGgAYQB0ACAATgAuAEQALgBSAC4AOwAgAEIAdQByAGcAYQB5ACAATQAuADsAIABCAHUAcgBrAGUALQBTAHAAbwBsAGEAbwByACAAUwAuADsAIABDAGgAYQBtAHAAaQBvAG4AIABEAC4ASgAuADsAIABDAG8AcwB0AGUAcgAgAFAALgA7ACAARAAnAEEAbQBpAGMAbwAgAE4ALgA7ACAASgBhAG0AZQBzAG8AbgAgAEEALgA7ACAASgBvAGgAbgBzAHQAbwBuACAAUwAuADsAIABLAGUAaQB0AGgAIABNAC4ASgAuADsAIABLAHIAYQBtAGUAcgAgAE0ALgA7ACAATABlAHYAaQBuACAATAAuADsAIABMAHkAbgBlACAAQQAuADsAIABNAGkAbABpAGEAIABTAC4AOwAgAE4AZwAgAEMALgA7ACAATgBpAGUAdABuAGUAcgAgAEMALgA7ACAAUABvAHMAcwBlAG4AdABpACAAQQAuADsAIABTAHQAYQBwAHAAZQByAHMAIABCAC4AOwAgAFQAaABvAHIAbgB0AG8AbgAgAEQALgA7ACAAVgBhAG4AIABTAHQAcgBhAHQAZQBuACAAVwAuAAAAB2NhdGFsb2cAAAAHYmliY29kZX/AAAAAAAAFcmFkaW8AAAF0aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQyNy8xMDUyL3RhYmxlMzQ/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQyNy8xMDUyL3RhYmxlYTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQyNy8xMDUyOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQyNy8xMDUyAAAAkGl2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OgAAAHl2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyAAAARXN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OgAAACFpdm86Ly9jZHMudml6aWVyL2ovbW5yYXMvNDM2LzM1NTcAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQSi9NTlJBUy80MzYvMzU1NwAAACwASABUAFIAVQAgAHMAdQByAHYAZQB5ADoAIABsAG8AbgBnAC0AcABlAHIAaQBvAGQAIABwAHUAbABzAGEAcgBzACAAcABvAGwAYQByAGkAbQBlAHQAcgB5AAAACHJlc2VhcmNoAAAEqQBXAGUAIABwAHIAZQBzAGUAbgB0ACAAYQAgAHAAbwBsAGEAcgBpAG0AZQB0AHIAaQBjACAAYQBuAGEAbAB5AHMAaQBzACAAbwBmACAANAA5ACAAbABvAG4AZwAtAHAAZQByAGkAbwBkACAAcAB1AGwAcwBhAHIAcwAgAGQAaQBzAGMAbwB2AGUAcgBlAGQAIABhAHMAIABwAGEAcgB0ACAAbwBmACAAdABoAGUAIABIAGkAZwBoACAAVABpAG0AZQAgAFIAZQBzAG8AbAB1AHQAaQBvAG4AIABVAG4AaQB2AGUAcgBzAGUAIAAoAEgAVABSAFUAKQAgAHMAbwB1AHQAaABlAHIAbgAgAHMAdQByAHYAZQB5AC4AIABUAGgAZQAgAHMAbwB1AHIAYwBlAHMAIABlAHgAaABpAGIAaQB0ACAAdABoAGUAIAB0AHkAcABpAGMAYQBsACAAYwBoAGEAcgBhAGMAdABlAHIAaQBzAHQAaQBjAHMAIABvAGYAIAAnAG8AbABkACcAIABwAHUAbABzAGEAcgBzACwAIAB3AGkAdABoACAAbABvAHcAIABmAHIAYQBjAHQAaQBvAG4AYQBsACAAbABpAG4AZQBhAHIAIABhAG4AZAAgAGMAaQByAGMAdQBsAGEAcgAgAHAAbwBsAGEAcgBpAHoAYQB0AGkAbwBuACAAYQBuAGQAIABuAGEAcgByAG8AdwAsACAAbQB1AGwAdABpAC0AYwBvAG0AcABvAG4AZQBuAHQAIABwAHIAbwBmAGkAbABlAHMALgAgAEEAbAB0AGgAbwB1AGcAaAAgAHQAaABlACAAcABvAHMAaQB0AGkAbwBuACAAYQBuAGcAbABlACAAcwB3AGkAbgBnAHMAIABhAHIAZQAgAGcAZQBuAGUAcgBhAGwAbAB5ACAAYwBvAG0AcABsAGUAeAAsACAAZgBvAHIAIAB0AHcAbwAgAG8AZgAgAHQAaABlACAAYQBuAGEAbAB5AHMAZQBkACAAcAB1AGwAcwBhAHIAcwAgACgASgAxADYAMgAyAC0AMwA3ADUAMQAgAGEAbgBkACAASgAxADcAMQAwAC0AMgA2ADEANgApACAAdwBlACAAbwBiAHQAYQBpAG4AZQBkACAAYQBuACAAaQBuAGQAaQBjAGEAdABpAG8AbgAgAG8AZgAgAHQAaABlACAAZwBlAG8AbQBlAHQAcgB5ACAAdgBpAGEAIAB0AGgAZQAgAHIAbwB0AGEAdABpAG4AZwAgAHYAZQBjAHQAbwByACAAbQBvAGQAZQBsAC4AIABXAGUAIAB3AGUAcgBlACAAYQBiAGwAZQAgAHQAbwAgAGQAZQB0AGUAcgBtAGkAbgBlACAAYQAgAHYAYQBsAHUAZQAgAG8AZgAgAHQAaABlACAAcgBvAHQAYQB0AGkAbwBuACAAbQBlAGEAcwB1AHIAZQAgACgAUgBNACkAIABmAG8AcgAgADMANAAgAG8AZgAgAHQAaABlACAAcwBvAHUAcgBjAGUAcwAgAHcAaABpAGMAaAAsACAAdwBoAGUAbgAgAGMAbwBtAGIAaQBuAGUAZAAgAHcAaQB0AGgAIAB0AGgAZQBpAHIAIABkAGkAcwBwAGUAcgBzAGkAbwBuACAAbQBlAGEAcwB1AHIAZQBzACAAKABEAE0AKQAsACAAeQBpAGUAbABkAHMAIABhAG4AIABpAG4AdABlAGcAcgBhAHQAZQBkACAAbQBhAGcAbgBlAHQAaQBjACAAZgBpAGUAbABkACAAcwB0AHIAZQBuAGcAdABoACAAYQBsAG8AbgBnACAAdABoAGUAIABsAGkAbgBlACAAbwBmACAAcwBpAGcAaAB0AC4AIABXAGkAdABoACAAdABoAGUAIABkAGEAdABhACAAcAByAGUAcwBlAG4AdABlAGQAIABoAGUAcgBlACwAIAB0AGgAZQAgAHQAbwB0AGEAbAAgAG4AdQBtAGIAZQByACAAbwBmACAAdgBhAGwAdQBlAHMAIABvAGYAIABSAE0AIABhAHMAcwBvAGMAaQBhAHQAZQBkACAAdwBpAHQAaAAgAHAAdQBsAHMAYQByAHMAIABkAGkAcwBjAG8AdgBlAHIAZQBkACAAZAB1AHIAaQBuAGcAIAB0AGgAZQAgAEgAVABSAFUAIABzAG8AdQB0AGgAZQByAG4AIABzAHUAcgB2AGUAeQAgAHMAdQBtAHMAIAB0AG8AIAA1ADEALgAgAFQAaABlACAAUgBNAHMAIABhAHIAZQAgAG4AbwB0ACAAYwBvAG4AcwBpAHMAdABlAG4AdAAgAHcAaQB0AGgAIAB0AGgAZQAgAGgAeQBwAG8AdABoAGUAcwBpAHMAIABvAGYAIABhACAAYwBvAHUAbgB0AGUAcgAtAGMAbABvAGMAawB3AGkAcwBlACAAZABpAHIAZQBjAHQAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAG0AYQBnAG4AZQB0AGkAYwAgAGYAaQBlAGwAZAAgAHcAaQB0AGgAaQBuACAAYQBuACAAYQBuAG4AdQBsAHUAcwAgAGkAbgBjAGwAdQBkAGUAZAAgAGIAZQB0AHcAZQBlAG4AIAA0ACAAYQBuAGQAIAA2AGsAcABjACAAZgByAG8AbQAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAQwBlAG4AdAByAGUALgAgAEEAIABwAGEAcgB0AGkAYQBsACAAYQBnAHIAZQBlAG0AZQBuAHQAIAB3AGkAdABoACAAYQAgAGMAbwB1AG4AdABlAHIALQBjAGwAbwBjAGsAdwBpAHMAZQAgAHMAZQBuAHMAZQAgAG8AZgAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAbQBhAGcAbgBlAHQAaQBjACAAZgBpAGUAbABkACAAdwBpAHQAaABpAG4AIAB0AGgAZQAgAHMAcABpAHIAYQBsACAAYQByAG0AcwAgAGkAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAZgBvAHUAbgBkACAAaQBuACAAdABoAGUAIABhAHIAZQBhACAAbwBmACAAdABoAGUAIABDAGEAcgBpAG4AYQAtAFMAYQBnAGkAdAB0AGEAcgBpAHUAcwAgAGEAcgBtAC4AAAA1aHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovTU5SQVMvNDM2LzM1NTcAAADnAFQAaQBiAHUAcgB6AGkAIABDAC4AOwAgAEoAbwBoAG4AcwB0AG8AbgAgAFMALgA7ACAAQgBhAGkAbABlAHMAIABNAC4AOwAgAEIAYQB0AGUAcwAgAFMALgBEAC4AOwAgAEIAaABhAHQAIABOAC4ARAAuAFIALgA7ACAAQgB1AHIAZwBhAHkAIABNAC4AOwAgAEIAdQByAGsAZQAtAFMAcABvAGwAYQBvAHIAIABTAC4AOwAgAEMAaABhAG0AcABpAG8AbgAgAEQALgA7ACAAQwBvAHMAdABlAHIAIABQAC4AOwAgAEQAJwBBAG0AaQBjAG8AIABOAC4AOwAgAEsAZQBpAHQAaAAgAE0ALgBKAC4AOwAgAEsAcgBhAG0AZQByACAATQAuADsAIABMAGUAdgBpAG4AIABMAC4AOwAgAE0AaQBsAGkAYQAgAFMALgA7ACAATgBnACAAQwAuADsAIABQAG8AcwBzAGUAbgB0AGkAIABBAC4AOwAgAFMAdABhAHAAcABlAHIAcwAgAEIALgBXAC4AOwAgAFQAaABvAHIAbgB0AG8AbgAgAEQALgA7ACAAdgBhAG4AIABTAHQAcgBhAHQAZQBuACAAVwAuAAAAB2NhdGFsb2cAAAAHYmliY29kZX/AAAAAAAAFcmFkaW8AAALzaHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQzNi8zNTU3L3RhYmxlMj86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovTU5SQVMvNDM2LzM1NTc6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9NTlJBUy80MzYvMzU1Nzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovTU5SQVMvNDM2LzM1NTcvdGFibGUyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80MzYvMzU1Ny90YWJsZTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQzNi8zNTU3Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNDM2LzM1NTc6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQzNi8zNTU3L3RhYmxlMT8AAAEvaXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoAAABAXZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwAAAAmXN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZAAAACFpdm86Ly9jZHMudml6aWVyL2ovbW5yYXMvNDU4LzMzNDEAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQSi9NTlJBUy80NTgvMzM0MQAAACwANAAyACAAbQBpAGwAbABpAHMAZQBjAG8AbgBkACAAcAB1AGwAcwBhAHIAcwAgAGgAaQBnAGgALQBwAHIAZQBjAGkAcwBpAG8AbgAgAHQAaQBtAGkAbgBnAAAACHJlc2VhcmNoAAAGYABXAGUAIAByAGUAcABvAHIAdAAgAG8AbgAgAHQAaABlACAAaABpAGcAaAAtAHAAcgBlAGMAaQBzAGkAbwBuACAAdABpAG0AaQBuAGcAIABvAGYAIAA0ADIAIAByAGEAZABpAG8AIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACAAKABNAFMAUABzACkAIABvAGIAcwBlAHIAdgBlAGQAIABiAHkAIAB0AGgAZQAgAEUAdQByAG8AcABlAGEAbgAgAFAAdQBsAHMAYQByACAAVABpAG0AaQBuAGcAIABBAHIAcgBhAHkAIAAoAEUAUABUAEEAKQAuACAAVABoAGkAcwAgAEUAUABUAEEAIABEAGEAdABhACAAUgBlAGwAZQBhAHMAZQAgADEALgAwACAAZQB4AHQAZQBuAGQAcwAgAHUAcAAgAHQAbwAgAG0AaQBkAC0AMgAwADEANAAgAGEAbgBkACAAYgBhAHMAZQBsAGkAbgBlAHMAIAByAGEAbgBnAGUAIABmAHIAbwBtACAANwAtADEAOAB5AHIALgAgAEkAdAAgAGYAbwByAG0AcwAgAHQAaABlACAAYgBhAHMAaQBzACAAZgBvAHIAIAB0AGgAZQAgAHMAdABvAGMAaABhAHMAdABpAGMAIABnAHIAYQB2AGkAdABhAHQAaQBvAG4AYQBsAC0AdwBhAHYAZQAgAGIAYQBjAGsAZwByAG8AdQBuAGQALAAgAGEAbgBpAHMAbwB0AHIAbwBwAGkAYwAgAGIAYQBjAGsAZwByAG8AdQBuAGQALAAgAGEAbgBkACAAYwBvAG4AdABpAG4AdQBvAHUAcwAtAHcAYQB2AGUAIABsAGkAbQBpAHQAcwAgAHIAZQBjAGUAbgB0AGwAeQAgAHAAcgBlAHMAZQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABFAFAAVABBACAAZQBsAHMAZQB3AGgAZQByAGUALgAgAFQAaABlACAAQgBhAHkAZQBzAGkAYQBuACAAdABpAG0AaQBuAGcAIABhAG4AYQBsAHkAcwBpAHMAIABwAGUAcgBmAG8AcgBtAGUAZAAgAHcAaQB0AGgAIABUAEUATQBQAE8ATgBFAFMAVAAgAHkAaQBlAGwAZABzACAAdABoAGUAIABkAGUAdABlAGMAdABpAG8AbgAgAG8AZgAgAHMAZQB2AGUAcgBhAGwAIABuAGUAdwAgAHAAYQByAGEAbQBlAHQAZQByAHMAOgAgAHMAZQB2AGUAbgAgAHAAYQByAGEAbABsAGEAeABlAHMALAAgAG4AaQBuAGUAIABwAHIAbwBwAGUAcgAgAG0AbwB0AGkAbwBuAHMAIABhAG4AZAAsACAAaQBuACAAdABoAGUAIABjAGEAcwBlACAAbwBmACAAcwBpAHgAIABiAGkAbgBhAHIAeQAgAHAAdQBsAHMAYQByAHMALAAgAGEAbgAgAGEAcABwAGEAcgBlAG4AdAAgAGMAaABhAG4AZwBlACAAbwBmACAAdABoAGUAIABzAGUAbQBpAG0AYQBqAG8AcgAgAGEAeABpAHMALgAgAFcAZQAgAGYAaQBuAGQAIAB0AGgAZQAgAE4ARQAyADAAMAAxACAARwBhAGwAYQBjAHQAaQBjACAAZQBsAGUAYwB0AHIAbwBuACAAZABlAG4AcwBpAHQAeQAgAG0AbwBkAGUAbAAgAHQAbwAgAGIAZQAgAGEAIABiAGUAdAB0AGUAcgAgAG0AYQB0AGMAaAAgAHQAbwAgAG8AdQByACAAcABhAHIAYQBsAGwAYQB4ACAAZABpAHMAdABhAG4AYwBlAHMAIAAoAGEAZgB0AGUAcgAgAGMAbwByAHIAZQBjAHQAaQBvAG4AIABmAHIAbwBtACAAdABoAGUAIABMAHUAdAB6AC0ASwBlAGwAawBlAHIAIABiAGkAYQBzACkAIAB0AGgAYQBuACAAdABoAGUAIABNADIAIABhAG4AZAAgAE0AMwAgAG0AbwBkAGUAbABzACAAYgB5ACAAUwBjAGgAbgBpAHQAegBlAGwAZQByAC4AIABIAG8AdwBlAHYAZQByACwAIAB3AGUAIABtAGUAYQBzAHUAcgBlACAAYQBuACAAYQB2AGUAcgBhAGcAZQAgAHUAbgBjAGUAcgB0AGEAaQBuAHQAeQAgAG8AZgAgADgAMAAgAHAAZQByACAAYwBlAG4AdAAgACgAZgByAGEAYwB0AGkAbwBuAGEAbAApACAAZgBvAHIAIABOAEUAMgAwADAAMQAsACAAdABoAHIAZQBlACAAdABpAG0AZQBzACAAbABhAHIAZwBlAHIAIAB0AGgAYQBuACAAdwBoAGEAdAAgAGkAcwAgAHQAeQBwAGkAYwBhAGwAbAB5ACAAYQBzAHMAdQBtAGUAZAAgAGkAbgAgAHQAaABlACAAbABpAHQAZQByAGEAdAB1AHIAZQAuACAAVwBlACAAcgBlAHYAaQBzAGkAdAAgAHQAaABlACAAdAByAGEAbgBzAHYAZQByAHMAZQAgAHYAZQBsAG8AYwBpAHQAeQAgAGQAaQBzAHQAcgBpAGIAdQB0AGkAbwBuACAAZgBvAHIAIABhACAAcwBlAHQAIABvAGYAIAAxADkAIABpAHMAbwBsAGEAdABlAGQAIABhAG4AZAAgADUANwAgAGIAaQBuAGEAcgB5ACAATQBTAFAAcwAgAGEAbgBkACAAZgBpAG4AZAAgAG4AbwAgAHMAdABhAHQAaQBzAHQAaQBjAGEAbAAgAGQAaQBmAGYAZQByAGUAbgBjAGUAIABiAGUAdAB3AGUAZQBuACAAdABoAGUAcwBlACAAdAB3AG8AIABwAG8AcAB1AGwAYQB0AGkAbwBuAHMALgAgAFcAZQAgAGQAZQB0AGUAYwB0ACAAUwBoAGEAcABpAHIAbwAgAGQAZQBsAGEAeQAgAGkAbgAgAHQAaABlACAAdABpAG0AaQBuAGcAIAByAGUAcwBpAGQAdQBhAGwAcwAgAG8AZgAgAFAAUwBSAHMAIABKADEANgAwADAALQAzADAANQAzACAAYQBuAGQAIABKADEAOQAxADgALQAwADYANAAyACwAIABpAG0AcABsAHkAaQBuAGcAIABwAHUAbABzAGEAcgAgAGEAbgBkACAAYwBvAG0AcABhAG4AaQBvAG4AIABtAGEAcwBzAGUAcwAgAG0AcAA9ADEALgAyADIAXgArADAALgA1AF4AXwAtADAALgAzADUAXwBNAF8AewBzAHUAbgB9AF8ALAAgAG0AYwA9ADAALgAyADEAXgArADAALgAwADYAXgBfAC0AMAAuADAANABfAE0AXwB7AHMAdQBuAH0AXwAgAGEAbgBkACAAbQBwAD0AMQAuADIANQBeACsAMAAuADYAXgBfAC0AMAAuADQAXwBNAF8AewBzAHUAbgB9AH0ALAAgAG0AYwA9ADAALgAyADMAXgArADAALgAwADcAXgBfAC0AMAAuADAANQBfAE0AXwB7AHMAdQBuAH0AXwAsACAAcgBlAHMAcABlAGMAdABpAHYAZQBsAHkALgAgAEYAaQBuAGEAbABsAHkALAAgAHcAZQAgAHUAcwBlACAAdABoAGUAIABtAGUAYQBzAHUAcgBlAG0AZQBuAHQAIABvAGYAIAB0AGgAZQAgAG8AcgBiAGkAdABhAGwAIABwAGUAcgBpAG8AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB0AG8AIABzAGUAdAAgAGEAIABzAHQAcgBpAG4AZwBlAG4AdAAgAGMAbwBuAHMAdAByAGEAaQBuAHQAIABvAG4AIAB0AGgAZQAgAGQAaQBzAHQAYQBuAGMAZQAgAHQAbwAgAFAAUwBSAHMAIABKADEAMAAxADIAKwA1ADMAMAA3ACAAYQBuAGQAIABKADEAOQAwADkALQAzADcANAA0ACwAIABhAG4AZAAgAHMAZQB0ACAAbABpAG0AaQB0AHMAIABvAG4AIAB0AGgAZQAgAGwAbwBuAGcAaQB0AHUAZABlACAAbwBmACAAYQBzAGMAZQBuAGQAaQBuAGcAIABuAG8AZABlACAAdABoAHIAbwB1AGcAaAAgAHQAaABlACAAcwBlAGEAcgBjAGgAIABvAGYAIAB0AGgAZQAgAGEAbgBuAHUAYQBsAC0AbwByAGIAaQB0AGEAbAAgAHAAYQByAGEAbABsAGEAeAAgAGYAbwByACAAUABTAFIAcwAgAEoAMQA2ADAAMAAtADMAMAA1ADMAIABhAG4AZAAgAEoAMQA5ADAAOQAtADMANwA0ADQALgAAADVodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9NTlJBUy80NTgvMzM0MQAAAiMARABlAHMAdgBpAGcAbgBlAHMAIABHAC4AOwAgAEMAYQBiAGEAbABsAGUAcgBvACAAUgAuAE4ALgA7ACAATABlAG4AdABhAHQAaQAgAEwALgA7ACAAVgBlAHIAYgBpAGUAcwB0ACAASgAuAFAALgBXAC4AOwAgAEMAaABhAG0AcABpAG8AbgAgAEQALgBKAC4AOwAgAFMAdABhAHAAcABlAHIAcwAgAEIALgBXAC4AOwAgAEoAYQBuAHMAcwBlAG4AIABHAC4ASAAuADsAIABMAGEAegBhAHIAdQBzACAAUAAuADsAIABPAHMAbABvAHcAcwBrAGkAIABTAC4AOwAgAEIAYQBiAGEAawAgAFMALgA7ACAAQgBhAHMAcwBhACAAQwAuAEcALgA7ACAAQgByAGUAbQAgAFAALgA7ACAAQgB1AHIAZwBhAHkAIABNAC4AOwAgAEMAbwBnAG4AYQByAGQAIABJAC4AOwAgAEcAYQBpAHIAIABKAC4AUgAuADsAIABHAHIAYQBpAGsAbwB1ACAARQAuADsAIABHAHUAaQBsAGwAZQBtAG8AdAAgAEwALgA7ACAASABlAHMAcwBlAGwAcwAgAEoALgBXAC4AVAAuADsAIABKAGUAcwBzAG4AZQByACAAQQAuADsAIABKAG8AcgBkAGEAbgAgAEMALgA7ACAASwBhAHIAdQBwAHAAdQBzAGEAbQB5ACAAUgAuADsAIABLAHIAYQBtAGUAcgAgAE0ALgA7ACAATABhAHMAcwB1AHMAIABBAC4AOwAgAEwAYQB6AGEAcgBpAGQAaQBzACAASwAuADsAIABMAGUAZQAgAEsALgBKAC4AOwAgAEwAaQB1ACAASwAuADsAIABMAHkAbgBlACAAQQAuAEcALgA7ACAATQBjAGsAZQBlACAASgAuADsAIABNAGkAbgBnAGEAcgBlAGwAbABpACAAQwAuAE0ALgBGAC4AOwAgAFAAZQByAHIAbwBkAGkAbgAgAEQALgA7ACAAUABlAHQAaQB0AGUAYQB1ACAAQQAuADsAIABQAG8AcwBzAGUAbgB0AGkAIABBAC4AOwAgAFAAdQByAHYAZQByACAATQAuAEIALgA7ACAAUgBvAHMAYQBkAG8AIABQAC4AQQAuADsAIABTAGEAbgBpAGQAYQBzACAAUwAuADsAIABTAGUAcwBhAG4AYQAgAEEALgA7ACAAUwBoAGEAaQBmAHUAbABsAGEAaAAgAEcALgA7ACAAUwBtAGkAdABzACAAUgAuADsAIABUAGEAeQBsAG8AcgAgAFMALgBSAC4AOwAgAFQAaABlAHUAcgBlAGEAdQAgAEcALgA7ACAAVABpAGIAdQByAHoAaQAgAEMALgA7ACAAVgBhAG4AIABIAGEAYQBzAHQAZQByAGUAbgAgAFIALgA7ACAAVgBlAGMAYwBoAGkAbwAgAEEALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGV/wAAAAAAABXJhZGlvAAAIOmh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ1OC8zMzQxL3RhYjItMTI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNDU4LzMzNDE6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ1OC8zMzQxL3RhYjItMTI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNDU4LzMzNDE6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ1OC8zMzQxL3RhYjItMTI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MQAAAxY6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6AAAC7HZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXIAAAG/Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6AAAAIGl2bzovL2Nkcy52aXppZXIvai9tbnJhcy80NTkvMTQwAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAAD0ovTU5SQVMvNDU5LzE0MAAAACYATQA4ADEALAAgAEwATQBDACAAYQBuAGQAIAAzAEMAIAAyADcAMwAvAEMAbwBtAGEAIAAxADcALQA2ADAAawBlAFYAIABvAGIAcwAuAAAACHJlc2VhcmNoAAAGFgBXAGUAIABwAHIAZQBzAGUAbgB0ACAAcgBlAHMAdQBsAHQAcwAgAG8AZgAgAGEAIABkAGUAZQBwACAAcwB1AHIAdgBlAHkAIABvAGYAIAB0AGgAcgBlAGUAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAZgBpAGUAbABkAHMALAAgAE0AOAAxACAAKABlAHgAcABvAHMAdQByAGUAIABvAGYAIAA5AC4ANwBNAHMAKQAsACAATABhAHIAZwBlACAATQBhAGcAZQBsAGwAYQBuAGkAYwAgAEMAbABvAHUAZAAgACgANgAuADgAIABNAHMAKQAgAGEAbgBkACAAMwBDACAAMgA3ADMALwBDAG8AbQBhACAAKAA5AC4AMwBNAHMAKQAsACAAaQBuACAAdABoAGUAIABoAGEAcgBkACAAWAAtAHIAYQB5ACAAKAAxADcALQA2ADAAawBlAFYAKQAgAGUAbgBlAHIAZwB5ACAAYgBhAG4AZAAgAHcAaQB0AGgAIAB0AGgAZQAgAEkAQgBJAFMAIAB0AGUAbABlAHMAYwBvAHAAZQAgAG8AbgBiAG8AYQByAGQAIAB0AGgAZQAgAEkATgBUAEUARwBSAEEATAAgAG8AYgBzAGUAcgB2AGEAdABvAHIAeQAsACAAYgBhAHMAZQBkACAAbwBuACAAMQAyACAAeQBlAGEAcgBzACAAbwBmACAAbwBiAHMAZQByAHYAYQB0AGkAbwBuAHMAIAAoADIAMAAwADMALQAyADAAMQA1ACkALgAgAFQAaABlACAAYwBvAG0AYgBpAG4AZQBkACAAcwB1AHIAdgBlAHkAIAByAGUAYQBjAGgAZQBzACAAYQAgADQAewBzAGkAZwBtAGEAfQAgAHAAZQBhAGsAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABvAGYAIAAwAC4AMQA4AG0AQwByAGEAYgAgACgAMgAuADYAeAAxADAAXgAtADEAMgBeAGUAcgBnAC8AcwAvAGMAbQBeADIAXgApACAAYQBuAGQAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABiAGUAdAB0AGUAcgAgAHQAaABhAG4AIAAwAC4AMgA1ACAAYQBuAGQAIAAwAC4AOAA3AG0AQwByAGEAYgAgAG8AdgBlAHIAIAAxADAAIABwAGUAcgAgAGMAZQBuAHQAIABhAG4AZAAgADkAMAAgAHAAZQByACAAYwBlAG4AdAAgAG8AZgAgAGkAdABzACAAZgB1AGwAbAAgAGEAcgBlAGEAIABvAGYAIAA0ADkAMAAwACAAZABlAGcAXgAyAF4ALAAgAHIAZQBzAHAAZQBjAHQAaQB2AGUAbAB5AC4AIABXAGUAIABoAGEAdgBlACAAZABlAHQAZQBjAHQAZQBkACAAaQBuACAAdABvAHQAYQBsACAAMQA0ADcAIABzAG8AdQByAGMAZQBzACAAYQB0ACAAUwAvAE4APgA0AHsAcwBpAGcAbQBhAH0ALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAMwA3ACAAcwBvAHUAcgBjAGUAcwAgAG8AYgBzAGUAcgB2AGUAZAAgAGkAbgAgAGgAYQByAGQAIABYAC0AcgBhAHkAcwAgAGYAbwByACAAdABoAGUAIABmAGkAcgBzAHQAIAB0AGkAbQBlAC4AIABUAGgAZQAgAHMAdQByAHYAZQB5ACAAaQBzACAAZABvAG0AaQBuAGEAdABlAGQAIABiAHkAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAcwBvAHUAcgBjAGUAcwAsACAAbQBvAHMAdABsAHkAIABhAGMAdABpAHYAZQAgAGcAYQBsAGEAYwB0AGkAYwAgAG4AdQBjAGwAZQBpACAAKABBAEcATgApAC4AIABUAGgAZQAgAHMAYQBtAHAAbABlACAAbwBmACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgAHMAbwB1AHIAYwBlAHMAIABjAG8AbgB0AGEAaQBuAHMAIAA5ADgAIABBAEcATgAgACgAaQBuAGMAbAB1AGQAaQBuAGcAIAA2ADQAIABTAGUAeQBmAGUAcgB0ACAAZwBhAGwAYQB4AGkAZQBzACwAIABzAGUAdgBlAG4AIABsAG8AdwAtAGkAbwBuAGkAegBhAHQAaQBvAG4AIABuAHUAYwBsAGUAYQByACAAZQBtAGkAcwBzAGkAbwBuAC0AbABpAG4AZQAgAHIAZQBnAGkAbwBuACAAZwBhAGwAYQB4AGkAZQBzACwAIAB0AGgAcgBlAGUAIABYAC0AcgBhAHkAIABiAHIAaQBnAGgAdAAgAG8AcAB0AGkAYwBhAGwAbAB5ACAAbgBvAHIAbQBhAGwAIABnAGEAbABhAHgAaQBlAHMALAAgADEANgAgAGIAbABhAHoAYQByAHMAIABhAG4AZAAgAGUAaQBnAGgAdAAgAEEARwBOACAAbwBmACAAdQBuAGMAbABlAGEAcgAgAG8AcAB0AGkAYwBhAGwAIABjAGwAYQBzAHMAKQAsACAAdAB3AG8AIABnAGEAbABhAHgAeQAgAGMAbAB1AHMAdABlAHIAcwAgACgAQwBvAG0AYQAgAGEAbgBkACAAQQBiAGUAbABsACAAMwAyADYANgApACwAIAAxADcAIABvAGIAagBlAGMAdABzACAAbABvAGMAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAATABhAHIAZwBlACAAYQBuAGQAIABTAG0AYQBsAGwAIABNAGEAZwBlAGwAbABhAG4AaQBjACAAQwBsAG8AdQBkAHMAIAAoADEAMwAgAGgAaQBnAGgALQAgAGEAbgBkACAAdAB3AG8AIABsAG8AdwAtAG0AYQBzAHMAIABYAC0AcgBhAHkAIABiAGkAbgBhAHIAaQBlAHMAIABhAG4AZAAgAHQAdwBvACAAWAAtAHIAYQB5ACAAcAB1AGwAcwBhAHIAcwApACwAIAB0AGgAcgBlAGUAIABHAGEAbABhAGMAdABpAGMAIABjAGEAdABhAGMAbAB5AHMAbQBpAGMAIAB2AGEAcgBpAGEAYgBsAGUAcwAsACAAbwBuAGUAIAB1AGwAdAByAGEAbAB1AG0AaQBuAG8AdQBzACAAWAAtAHIAYQB5ACAAcwBvAHUAcgBjAGUAIAAoAE0AOAAyACAAWAAtADEAKQAgAGEAbgBkACAAbwBuAGUAIABiAGwAZQBuAGQAZQBkACAAcwBvAHUAcgBjAGUAIAAoAFMAVwBJAEYAVAAgAEoAMQAxADAANQAuADcAKwA1ADgANQA0ACkALgAgAFQAaABlACAAbgBhAHQAdQByAGUAIABvAGYAIAAyADUAIABzAG8AdQByAGMAZQBzACAAcgBlAG0AYQBpAG4AcwAgAHUAbgBrAG4AbwB3AG4ALAAgAHMAbwAgAHQAaABhAHQAIAB0AGgAZQAgAHMAdQByAHYAZQB5ACcAcwAgAGkAZABlAG4AdABpAGYAaQBjAGEAdABpAG8AbgAgAGkAcwAgAGMAdQByAHIAZQBuAHQAbAB5ACAAYwBvAG0AcABsAGUAdABlACAAYQB0ACAAOAAzACAAcABlAHIAIABjAGUAbgB0AC4AIABXAGUAIABoAGEAdgBlACAAYwBvAG4AcwB0AHIAdQBjAHQAZQBkACAAQQBHAE4AIABuAHUAbQBiAGUAcgAtAGYAbAB1AHgAIAByAGUAbABhAHQAaQBvAG4AcwAgACgAbABvAGcAIABOAC0AbABvAGcAIABTACkAIABhAG4AZAAgAGMAYQBsAGMAdQBsAGEAdABlAGQAIABBAEcATgAgAG4AdQBtAGIAZQByACAAZABlAG4AcwBpAHQAaQBlAHMAIABpAG4AIAB0AGgAZQAgAGwAbwBjAGEAbAAgAFUAbgBpAHYAZQByAHMAZQAgAGYAbwByACAAdABoAGUAIABlAG4AdABpAHIAZQAgAHMAdQByAHYAZQB5ACAAYQBuAGQAIABmAG8AcgAgAGUAYQBjAGgAIABvAGYAIAB0AGgAZQAgAHQAaAByAGUAZQAgAGUAeAB0AHIAYQBnAGEAbABhAGMAdABpAGMAIABmAGkAZQBsAGQAcwAuAAAANGh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL01OUkFTLzQ1OS8xNDAAAABcAE0AZQByAGUAbQBpAG4AcwBrAGkAeQAgAEkALgBBAC4AOwAgAEsAcgBpAHYAbwBuAG8AcwAgAFIALgBBAC4AOwAgAEwAdQB0AG8AdgBpAG4AbwB2ACAAQQAuAEEALgA7ACAAUwBhAHoAbwBuAG8AdgAgAFMALgBZAC4AOwAgAFIAZQB2AG4AaQB2AHQAcwBlAHYAIABNAC4ARwAuADsAIABTAHUAbgB5AGEAZQB2ACAAUgAuAEEALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGV/wAAAAAAABXgtcmF5AAABHGh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9NTlJBUy80NTkvMTQwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OS8xNDA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovTU5SQVMvNDU5LzE0MC90YWJsZTE/AAAAZGl2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAABednM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADNzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAhaXZvOi8vY2RzLnZpemllci9qL21ucmFzLzQ4NC8zNjkxAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAAEEovTU5SQVMvNDg0LzM2OTEAAAAiAFUAVABNAE8AUwBUACAAcAB1AGwAcwBhAHIAIAB0AGkAbQBpAG4AZwAgAHAAcgBvAGcAcgBhAG0AbQBlAC4AIABJAC4AAAAIcmVzZWFyY2gAAAZHAFcAZQAgAHAAcgBlAHMAZQBuAHQAIABhAG4AIABvAHYAZQByAHYAaQBlAHcAIABhAG4AZAAgAHQAaABlACAAZgBpAHIAcwB0ACAAcgBlAHMAdQBsAHQAcwAgAGYAcgBvAG0AIABhACAAbABhAHIAZwBlAC0AcwBjAGEAbABlACAAcAB1AGwAcwBhAHIAIAB0AGkAbQBpAG4AZwAgAHAAcgBvAGcAcgBhAG0AbQBlACAAdABoAGEAdAAgAGkAcwAgAHAAYQByAHQAIABvAGYAIAB0AGgAZQAgAFUAVABNAE8AUwBUACAAcAByAG8AagBlAGMAdAAgAGEAdAAgAHQAaABlACAAcgBlAGYAdQByAGIAaQBzAGgAZQBkACAATQBvAGwAbwBuAGcAbABvACAATwBiAHMAZQByAHYAYQB0AG8AcgB5ACAAUwB5AG4AdABoAGUAcwBpAHMAIABSAGEAZABpAG8AIABUAGUAbABlAHMAYwBvAHAAZQAgACgATQBPAFMAVAApACAAbgBlAGEAcgAgAEMAYQBuAGIAZQByAHIAYQAsACAAQQB1AHMAdAByAGEAbABpAGEALgAgAFcAZQAgAGMAdQByAHIAZQBuAHQAbAB5ACAAbwBiAHMAZQByAHYAZQAgAG0AbwByAGUAIAB0AGgAYQBuACAANAAwADAAIABtAGEAaQBuAGwAeQAgAGIAcgBpAGcAaAB0ACAAcwBvAHUAdABoAGUAcgBuACAAcgBhAGQAaQBvACAAcAB1AGwAcwBhAHIAcwAgAHcAaQB0AGgAIAB1AHAAIAB0AG8AIABkAGEAaQBsAHkAIABjAGEAZABlAG4AYwBlAHMALgAgAEYAbwByACAAMgAwADUAIAAoADgAIABpAG4AIABiAGkAbgBhAHIAaQBlAHMALAAgADQAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACkALAAgAHcAZQAgAHAAdQBiAGwAaQBzAGgAIAB1AHAAZABhAHQAZQBkACAAdABpAG0AaQBuAGcAIABtAG8AZABlAGwAcwAsACAAdABvAGcAZQB0AGgAZQByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGYAbAB1AHgAIABkAGUAbgBzAGkAdABpAGUAcwAsACAAZgBsAHUAeAAgAGQAZQBuAHMAaQB0AHkAIAB2AGEAcgBpAGEAYgBpAGwAaQB0AHkALAAgAGEAbgBkACAAcAB1AGwAcwBlACAAdwBpAGQAdABoAHMAIABhAHQAIAA4ADQAMwAgAE0ASAB6ACwAIABkAGUAcgBpAHYAZQBkACAAZgByAG8AbQAgAG8AYgBzAGUAcgB2AGEAdABpAG8AbgBzACAAcwBwAGEAbgBuAGkAbgBnACAAYgBlAHQAdwBlAGUAbgAgADEALgA0ACAAYQBuAGQAIAAzACAAeQByAC4AIABJAG4AIABjAG8AbQBwAGEAcgBpAHMAbwBuACAAdwBpAHQAaAAgAHQAaABlACAAQQBUAE4ARgAgAHAAdQBsAHMAYQByACAAYwBhAHQAYQBsAG8AZwB1AGUALAAgAHcAZQAgAGkAbQBwAHIAbwB2AGUAIAB0AGgAZQAgAHAAcgBlAGMAaQBzAGkAbwBuACAAbwBmACAAdABoAGUAIAByAG8AdABhAHQAaQBvAG4AYQBsACAAYQBuAGQAIABhAHMAdAByAG8AbQBlAHQAcgBpAGMAIABwAGEAcgBhAG0AZQB0AGUAcgBzACAAZgBvAHIAIAAxADIAMwAgAHAAdQBsAHMAYQByAHMALAAgAGYAbwByACAANAA3ACAAYgB5ACAAYQB0ACAAbABlAGEAcwB0ACAAYQBuACAAbwByAGQAZQByACAAbwBmACAAbQBhAGcAbgBpAHQAdQBkAGUALgAgAFQAaABlACAAdABpAG0AZQAgAHMAcABhAG4AcwAgAGIAZQB0AHcAZQBlAG4AIABvAHUAcgAgAG0AZQBhAHMAdQByAGUAbQBlAG4AdABzACAAYQBuAGQAIAB0AGgAbwBzAGUAIABpAG4AIAB0AGgAZQAgAGwAaQB0AGUAcgBhAHQAdQByAGUAIABhAHIAZQAgAHUAcAAgAHQAbwAgADQAOAAgAHkAcgAsACAAdwBoAGkAYwBoACAAYQBsAGwAbwB3ACAAdQBzACAAdABvACAAaQBuAHYAZQBzAHQAaQBnAGEAdABlACAAdABoAGUAaQByACAAbABvAG4AZwAtAHQAZQByAG0AIABzAHAAaQBuAC0AZABvAHcAbgAgAGgAaQBzAHQAbwByAHkAIABhAG4AZAAgAHQAbwAgAGUAcwB0AGkAbQBhAHQAZQAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAgAGYAbwByACAANgAwACAAcAB1AGwAcwBhAHIAcwAsACAAbwBmACAAdwBoAGkAYwBoACAAMgA0ACAAYQByAGUAIABuAGUAdwBsAHkAIABkAGUAdABlAHIAbQBpAG4AZQBkACAAYQBuAGQAIABtAG8AcwB0ACAAYQByAGUAIABtAGEAagBvAHIAIABpAG0AcAByAG8AdgBlAG0AZQBuAHQAcwAuACAAVABoAGUAIAByAGUAcwB1AGwAdABzACAAYQByAGUAIABjAG8AbgBzAGkAcwB0AGUAbgB0ACAAdwBpAHQAaAAgAGkAbgB0AGUAcgBmAGUAcgBvAG0AZQB0AHIAaQBjACAAbQBlAGEAcwB1AHIAZQBtAGUAbgB0AHMAIABmAHIAbwBtACAAdABoAGUAIABsAGkAdABlAHIAYQB0AHUAcgBlAC4AIABBACAAbQBvAGQAZQBsACAAdwBpAHQAaAAgAHQAdwBvACAARwBhAHUAcwBzAGkAYQBuACAAYwBvAG0AcABvAG4AZQBuAHQAcwAgAGMAZQBuAHQAcgBlAGQAIABhAHQAIAAxADMAOQAgAGEAbgBkACAANAA2ADMAawBtAC8AcwAgAGYAaQB0AHMAIAB0AGgAZQAgAHQAcgBhAG4AcwB2AGUAcgBzAGUAIAB2AGUAbABvAGMAaQB0AHkAIABkAGkAcwB0AHIAaQBiAHUAdABpAG8AbgAgAGIAZQBzAHQALgAgAFQAaABlACAAcAB1AGwAcwBlACAAZAB1AHQAeQAgAGMAeQBjAGwAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGkAbwBuAHMAIABhAHQAIAA1ADAAIABhAG4AZAAgADEAMAAgAHAAZQByACAAYwBlAG4AdAAgAG0AYQB4AGkAbQB1AG0AIABhAHIAZQAgAGIAZQBzAHQAIABkAGUAcwBjAHIAaQBiAGUAZAAgAGIAeQAgAGwAbwBnAG4AbwByAG0AYQBsACAAZABpAHMAdAByAGkAYgB1AHQAaQBvAG4AcwAgAHcAaQB0AGgAIABtAGUAZABpAGEAbgBzACAAbwBmACAAMgAuADMAIABhAG4AZAAgADQALgA0ACAAcABlAHIAIABjAGUAbgB0ACwAIAByAGUAcwBwAGUAYwB0AGkAdgBlAGwAeQAuACAAVwBlACAAZABpAHMAYwB1AHMAcwAgAHQAdwBvACAAcAB1AGwAcwBhAHIAcwAgAHQAaABhAHQAIABlAHgAaABpAGIAaQB0ACAAcwBwAGkAbgAtAGQAbwB3AG4AIAByAGEAdABlACAAYwBoAGEAbgBnAGUAcwAgAGEAbgBkACAAZAByAGkAZgB0AGkAbgBnACAAcwB1AGIAcAB1AGwAcwBlAHMALgAgAEYAaQBuAGEAbABsAHkALAAgAHcAZQAgAGQAZQBzAGMAcgBpAGIAZQAgAHQAaABlACAAYQB1AHQAbwBuAG8AbQBvAHUAcwAgAG8AYgBzAGUAcgB2AGkAbgBnACAAcwB5AHMAdABlAG0AIABhAG4AZAAgAHQAaABlACAAZAB5AG4AYQBtAGkAYwAgAHMAYwBoAGUAZAB1AGwAZQByACAAdABoAGEAdAAgAGgAYQBzACAAaQBuAGMAcgBlAGEAcwBlAGQAIAB0AGgAZQAgAG8AYgBzAGUAcgB2AGkAbgBnACAAZQBmAGYAaQBjAGkAZQBuAGMAeQAgAGIAeQAgAGEAIABmAGEAYwB0AG8AcgAgAG8AZgAgADIALQAzACAAaQBuACAAYwBvAG0AcABhAHIAaQBzAG8AbgAgAHcAaQB0AGgAIABzAHQAYQB0AGkAYwAgAHMAYwBoAGUAZAB1AGwAaQBuAGcALgAAADVodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9NTlJBUy80ODQvMzY5MQAAAPUASgBhAG4AawBvAHcAcwBrAGkAIABGAC4AOwAgAEIAYQBpAGwAZQBzACAATQAuADsAIABWAGEAbgAgAFMAdAByAGEAdABlAG4AIABXAC4AOwAgAEsAZQBhAG4AZQAgAEUALgBGAC4AOwAgAEYAbAB5AG4AbgAgAEMALgA7ACAAQgBhAHIAcgAgAEUALgBEAC4AOwAgAEIAYQB0AGUAbQBhAG4AIABUAC4AOwAgAEIAaABhAG4AZABhAHIAaQAgAFMALgA7ACAAQwBhAGwAZQBiACAATQAuADsAIABDAGEAbQBwAGIAZQBsAGwALQBXAGkAbABzAG8AbgAgAEQALgA7ACAARgBhAHIAYQBoACAAVwAuADsAIABHAHIAZQBlAG4AIABBAC4ASgAuADsAIABIAHUAbgBzAHQAZQBhAGQAIABSAC4AVwAuADsAIABKAGEAbQBlAHMAbwBuACAAQQAuADsAIABPAHMAbABvAHcAcwBrAGkAIABTAC4AOwAgAFAAYQByAHQAaABhAHMAYQByAGEAdABoAHkAIABBAC4AOwAgAFIAbwBzAGEAZABvACAAUAAuAEEALgA7ACAAVgBlAG4AawBhAHQAcgBhAG0AYQBuACAASwByAGkAcwBoAG4AYQBuACAAVgAuAAAAB2NhdGFsb2cAAAAHYmliY29kZX/AAAAAAAAFcmFkaW8AAAF0aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ4NC8zNjkxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ4NC8zNjkxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ4NC8zNjkxL3RhYmxlYjI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ4NC8zNjkxL3RhYmxlYjE/AAAAkGl2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaAAAAHl2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwAAAARXN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZAAAACFpdm86Ly9jZHMudml6aWVyL2ovbW5yYXMvNTAxLzExMTYAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQSi9NTlJBUy81MDEvMTExNgAAACMARwBBAEkAQQAgAHAAdQBsAHMAYQByAHMAIABhAG4AZAAgAHcAaABlAHIAZQAgAHQAbwAgAGYAaQBuAGQAIAB0AGgAZQBtAAAACHJlc2VhcmNoAAAGYwBXAGgAaQBsAGUAIAB0AGgAZQAgAG0AYQBqAG8AcgBpAHQAeQAgAG8AZgAgAG0AYQBzAHMAaQB2AGUAIABzAHQAYQByAHMAIABoAGEAdgBlACAAYQAgAHMAdABlAGwAbABhAHIAIABjAG8AbQBwAGEAbgBpAG8AbgAsACAAbQBvAHMAdAAgAHAAdQBsAHMAYQByAHMAIABhAHAAcABlAGEAcgAgAHQAbwAgAGIAZQAgAGkAcwBvAGwAYQB0AGUAZAAuACAAVABhAGsAZQBuACAAYQB0ACAAZgBhAGMAZQAgAHYAYQBsAHUAZQAsACAAdABoAGkAcwAgAHMAdQBnAGcAZQBzAHQAcwAgAHQAaABhAHQAIABtAG8AcwB0ACAAbQBhAHMAcwBpAHYAZQAgAGIAaQBuAGEAcgBpAGUAcwAgAGIAcgBlAGEAawAgAGEAcABhAHIAdAAgAGQAdQBlACAAdABvACAAcwB0AHIAbwBuAGcAIABuAGEAdABhAGwAIABrAGkAYwBrAHMAIAByAGUAYwBlAGkAdgBlAGQAIABpAG4AIABzAHUAcABlAHIAbgBvAHYAYQAgAGUAeABwAGwAbwBzAGkAbwBuAHMALgAgAEgAbwB3AGUAdgBlAHIALAAgAHQAaABlACAAbwBiAHMAZQByAHYAZQBkACAAYgBpAG4AYQByAHkAIABmAHIAYQBjAHQAaQBvAG4AIABjAGEAbgAgAHMAdABpAGwAbAAgAGIAZQAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIABzAHQAcgBvAG4AZwAgAHMAZQBsAGUAYwB0AGkAbwBuACAAZQBmAGYAZQBjAHQAcwAsACAAYQBzACAAbQBvAG4AaQB0AG8AcgBpAG4AZwAgAG8AZgAgAG4AZQB3AGwAeQAgAGQAaQBzAGMAbwB2AGUAcgBlAGQAIABwAHUAbABzAGEAcgBzACAAaQBzACAAcgBhAHIAZQBsAHkAIABjAGEAcgByAGkAZQBkACAAbwB1AHQAIABmAG8AcgAgAGwAbwBuAGcAIABlAG4AbwB1AGcAaAAgAHQAbwAgAGMAbwBuAGMAbAB1AHMAaQB2AGUAbAB5ACAAcgB1AGwAZQAgAG8AdQB0ACAAbQB1AGwAdABpAHAAbABpAGMAaQB0AHkALgAgAEgAZQByAGUALAAgAHcAZQAgAHUAcwBlACAAdABoAGUAIABzAGUAYwBvAG4AZAAgAEcAYQBpAGEAIABkAGEAdABhACAAcgBlAGwAZQBhAHMAZQAgAHQAbwAgAHMAZQBhAHIAYwBoACAAZgBvAHIAIABjAG8AbQBwAGEAbgBpAG8AbgBzACAAdABvACAAMQA1ADMANAAgAHIAbwB0AGEAdABpAG8AbgAtAHAAbwB3AGUAcgBlAGQAIABwAHUAbABzAGEAcgBzACAAdwBpAHQAaAAgAHAAbwBzAGkAdABpAG8AbgBzACAAawBuAG8AdwBuACAAdABvACAAYgBlAHQAdABlAHIAIAB0AGgAYQBuACAAMAAuADUAYQByAGMAcwBlAGMALgAgAFcAZQAgAGYAaQBuAGQAIAAyADIAIABtAGEAdABjAGgAZQBzACAAdABvACAAawBuAG8AdwBuACAAcAB1AGwAcwBhAHIAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIAAxACAAbgBvAHQAIAByAGUAcABvAHIAdABlAGQAIABlAGwAcwBlAHcAaABlAHIAZQAsACAAYQBuAGQAIAA4ACAAbgBlAHcAIABwAG8AcwBzAGkAYgBsAGUAIABjAG8AbQBwAGEAbgBpAG8AbgBzACAAdABvACAAeQBvAHUAbgBnACAAcAB1AGwAcwBhAHIAcwAuACAAVwBlACAAZQB4AGEAbQBpAG4AZQAgAHQAaABlACAAcABoAG8AdABvAG0AZQB0AHIAaQBjACAAYQBuAGQAIABrAGkAbgBlAG0AYQB0AGkAYwAgAHAAcgBvAHAAZQByAHQAaQBlAHMAIABvAGYAIAB0AGgAZQBzAGUAIABzAHkAcwB0AGUAbQBzACAAYQBuAGQAIABwAHIAbwB2AGkAZABlACAAZQBtAHAAaQByAGkAYwBhAGwAIAByAGUAbABhAHQAaQBvAG4AcwAgAGYAbwByACAAaQBkAGUAbgB0AGkAZgB5AGkAbgBnACAARwBhAGkAYQAgAHMAbwB1AHIAYwBlAHMAIAB3AGkAdABoACAAcABvAHQAZQBuAHQAaQBhAGwAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgAgAGMAbwBtAHAAYQBuAGkAbwBuAHMALgAgAE8AdQByACAAcgBlAHMAdQBsAHQAcwAgAGMAbwBuAGYAaQByAG0AIAB0AGgAYQB0ACAAdABoAGUAIABvAGIAcwBlAHIAdgBlAGQAIABtAHUAbAB0AGkAcABsAGkAYwBpAHQAeQAgAGYAcgBhAGMAdABpAG8AbgAgAGkAcwAgAHMAbQBhAGwAbAAuACAASABvAHcAZQB2AGUAcgAsACAAdwBlACAAcwBoAG8AdwAgAHQAaABhAHQAIAB0AGgAZQAgAG4AdQBtAGIAZQByACAAbwBmACAAYgBpAG4AYQByAGkAZQBzACAAYgBlAGwAbwB3ACAAdABoAGUAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABvAGYAIABHAGEAaQBhACAAYQBuAGQAIAByAGEAZABpAG8AIAB0AGkAbQBpAG4AZwAgAGkAbgAgAG8AdQByACAAcwBhAG0AcABsAGUAIABjAG8AdQBsAGQAIABzAHQAaQBsAGwAIABiAGUAIABzAGkAZwBuAGkAZgBpAGMAYQBuAHQAbAB5ACAAaABpAGcAaABlAHIALgAgAFcAZQAgAGMAbwBuAHMAdAByAGEAaQBuACAAdABoAGUAIABiAGkAbgBhAHIAeQAgAGYAcgBhAGMAdABpAG8AbgAgAG8AZgAgAHkAbwB1AG4AZwAgAHAAdQBsAHMAYQByAHMAIAB0AG8AIABiAGUAIABmAF4AdAByAHUAZQBeAF8AeQBvAHUAbgBnAF8APAA1AC4AMwAoADgALgAzACkAIABwAGUAcgAgAGMAZQBuAHQAIAB1AG4AZABlAHIAIAByAGUAYQBsAGkAcwB0AGkAYwAgACgAYwBvAG4AcwBlAHIAdgBhAHQAaQB2AGUAKQAgAGEAcwBzAHUAbQBwAHQAaQBvAG4AcwAgAGYAbwByACAAdABoAGUAIABiAGkAbgBhAHIAeQAgAHAAcgBvAHAAZQByAHQAaQBlAHMAIABhAG4AZAAgAGMAdQByAHIAZQBuAHQAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIAB0AGgAcgBlAHMAaABvAGwAZABzAC4AIABGAG8AcgAgAG0AYQBzAHMAaQB2AGUAIABzAHQAYQByAHMAIAAoAD4AMQAwAE0AXwB7AHMAdQBuAH0AXwApACAAaQBuACAAcABhAHIAdABpAGMAdQBsAGEAcgAsACAAdwBlACAAZgBpAG4AZAAgAGYAXgB0AHIAdQBlAF4AXwBPAEIAXwA8ADMALgA3ACAAcABlAHIAIABjAGUAbgB0ACwAIAB3AGgAaQBjAGgAIABzAGUAdABzACAAYQAgAGYAaQByAG0AIABpAG4AZABlAHAAZQBuAGQAZQBuAHQAIAB1AHAAcABlAHIAIABsAGkAbQBpAHQAIABvAG4AIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAG4AZQB1AHQAcgBvAG4AIABzAHQAYQByACAAbQBlAHIAZwBlAHIAIAByAGEAdABlACwAIAA8AD0ANwAuADIAeAAxADAAXgAtADQAXgAvAHkAcgAuACAATwBuAGcAbwBpAG4AZwAgAGEAbgBkACAAZgB1AHQAdQByAGUAIABwAHIAbwBqAGUAYwB0AHMALAAgAHMAdQBjAGgAIABhAHMAIAB0AGgAZQAgAEMASABJAE0ARQAvAHAAdQBsAHMAYQByACAAcAByAG8AZwByAGEAbQAsACAATQBlAGUAcgBUAGkAbQBlACwAIABIAEkAUgBBAFgALAAgAGEAbgBkACAAdQBsAHQAaQBtAGEAdABlAGwAeQAgAHQAaABlACAAUwBLAEEALAAgAHcAaQBsAGwAIABzAGkAZwBuAGkAZgBpAGMAYQBuAHQAbAB5ACAAaQBtAHAAcgBvAHYAZQAgAHQAaABlAHMAZQAgAGMAbwBuAHMAdAByAGEAaQBuAHQAcwAgAGkAbgAgAHQAaABlACAAZgB1AHQAdQByAGUALgAAADVodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9NTlJBUy81MDEvMTExNgAAAA0AQQBuAHQAbwBuAGkAYQBkAGkAcwAgAEoALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGV/wAAAAAAABXJhZGlvAAACT2h0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzUwMS8xMTE2Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNTAxLzExMTY6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzUwMS8xMTE2L2NhdGFsb2c/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzUwMS8xMTE2L2NhdGFsb2c/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy81MDEvMTExNjo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy81MDEvMTExNgAAANc6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFw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cmNlPVZJSS8xNTY6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9WSUkvMTU2L3RhYmxlMT86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPVZJSS8xNTY6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9VklJLzE1Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xNTYvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE1Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xNTYvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE1Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1WSUkvMTU2Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvVklJLzE1Ni90YWJsZTE/AAABvTo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAAGldnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAAPk6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQAAAAYaXZvOi8vY2RzLnZpemllci92aWkvMTg5AAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAAB1ZJSS8xODkAAAASAEMAYQB0AGEAbABvAGcAIABvAGYAIABQAHUAbABzAGEAcgBzAAAACHJlc2VhcmNoAAABxQBUAGgAZQAgAGMAYQB0AGEAbABvAGcAdQBlACAAaQBzACAAYQAgAGMAbwBtAHAAaQBsAGEAdABpAG8AbgAgAG8AZgAgAHQAaABlACAAcAByAGkAbgBjAGkAcABhAGwAIABvAGIAcwBlAHIAdgBlAGQAIABwAGEAcgBhAG0AZQB0AGUAcgBzACAAbwBmACAANwAwADYAIABwAHUAbABzAGEAcgBzACAAKAB1AHAAZABhAHQAZQBkACAAZgByAG8AbQAgADUANQA4ACAAcAB1AGwAcwBhAHIAcwAgAGkAbgAgAHQAaABlACAAcAByAGUAdgBpAG8AdQBzACAAdgBlAHIAcwBpAG8AbgApACwAIABpAG4AYwBsAHUAZABpAG4AZwAgAHAAbwBzAGkAdABpAG8AbgBzACwAIAB0AGkAbQBpAG4AZwAgAHAAYQByAGEAbQBlAHQAZQByAHMALAAgAHAAdQBsAHMAZQAgAHcAaQBkAHQAaABzACwAIABmAGwAdQB4ACAAZABlAG4AcwBpAHQAaQBlAHMALAAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAsACAAZABpAHMAdABhAG4AYwBlAHMALAAgAGEAbgBkACAAZABpAHMAcABlAHIAcwBpAG8AbgAsACAAcgBvAHQAYQB0AGkAbwBuACwAIABhAG4AZAAgAHMAYwBhAHQAdABlAHIAaQBuAGcAIABtAGUAYQBzAHUAcgBlAHMALgAgAEkAdAAgAGEAbABzAG8AIABsAGkAcwB0AHMAIAB0AGgAZQAgAG8AcgBiAGkAdABhAGwAIABlAGwAZQBtAGUAbgB0AHMAIABvAGYAIABiAGkAbgBhAHIAeQAgAHAAdQBsAHMAYQByAHMALAAgAGEAbgBkACAAcwBvAG0AZQAgAGMAbwBtAG0AbwBuAGwAeQAgAHUAcwBlAGQAIABwAGEAcgBhAG0AZQB0AGUAcgBzACAAZABlAHIAaQB2AGUAZAAgAGYAcgBvAG0AIAB0AGgAZQAgAGIAYQBzAGkAYwAgAG0AZQBhAHMAdQByAGUAbQBlAG4AdABzAC4AIABVAG4AYwBlAHIAdABhAGkAbgB0AGkAZQBzACAAYQByAGUAIABxAHUAbwB0AGUAZAAgAGYAbwByACAAbQBvAHMAdAAgAHEAdQBhAG4AdABpAHQAaQBlAHMALgAAACxodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvVklJLzE4OQAAACcAVABhAHkAbABvAHIAIABKAC4ASAAuADsAIABNAGEAbgBjAGgAZQBzAHQAZQByACAAUgAuAE4ALgA7ACAATAB5AG4AZQAgAEEALgBHAC4AAAAHY2F0YWxvZwAAAAdiaWJjb2Rlf8AAAAAAAAVyYWRpbwAABD1odHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xODkvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE4OTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1WSUkvMTg5Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvVklJLzE4OS90YWJsZTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1WSUkvMTg5Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPVZJSS8xODk6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9WSUkvMTg5L3RhYmxlMT86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPVZJSS8xODk6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9VklJLzE4OTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xODkvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE4OTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1WSUkvMTg5Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcAAAAb1pdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4AAABpXZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHAAAAD5c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkAAAAHWl2bzovL25hc2EuaGVhc2FyYy9hdG5mcHVsc2FyAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAABEFUTkYAAAATAEEAVABOAEYAIABQAHUAbABzAGEAcgAgAEMAYQB0AGEAbABvAGcAAAAIcmVzZWFyY2gAAAnTAFQAaABlACAAQQB1AHMAdAByAGEAbABpAGEAIABUAGUAbABlAHMAYwBvAHAAZQAgAE4AYQB0AGkAbwBuAGEAbAAgAEYAYQBjAGkAbABpAHQAeQAgACgAQQBUAE4ARgApACAAUAB1AGwAcwBhAHIAIABDAGEAdABhAGwAbwBnACAAaQBzACAAYQAgAGMAYQB0AGEAbABvAGcAIABvAGYAIABrAG4AbwB3AG4AIABwAHUAbABzAGEAcgBzACAAYwBvAG0AcABpAGwAZQBkACAAYgB5ACAAUgAuAE4ALgAgAE0AYQBuAGMAaABlAHMAdABlAHIAIABlAHQAIABhAGwALgAgAGEAbgBkACAAaQBzACAAZABlAHMAYwBlAG4AZABlAGQAIABmAHIAbwBtACAAcAB1AGwAcwBhAHIAIABkAGEAdABhAGIAYQBzAGUAIAB1AHMAZQBkACAAZgBvAHIAIAB0AGgAZQAgAHAAYQBwAGUAcgAgACYAcQB1AG8AdAA7AEMAYQB0AGEAbABvAGcAIABvAGYAIAA1ADUAOAAgAFAAdQBsAHMAYQByAHMAJgBxAHUAbwB0ADsAIABiAHkAIABKAC4ASAAuACAAVABhAHkAbABvAHIALAAgAFIALgBOAC4AIABNAGEAbgBjAGgAZQBzAHQAZQByACAAYQBuAGQAIABBAC4ARwAuACAATAB5AG4AZQAgADEAOQA5ADMALAAgAEEAcABKAFMALAAgADgAOAAsACAANQAyADkALQA1ADYAOAAuACAAVABoAGUAIABjAHUAcgByAGUAbgB0ACAAYwBhAHQAYQBsAG8AZwAgAGgAYQBzACAAYgBlAGUAbgAgAHMAdQBwAHAAbABlAG0AZQBuAHQAZQBkACAAYgB5ACAAaQBuAGMAbAB1AHMAaQBvAG4AIABvAGYAIABwAHUAYgBsAGkAcwBoAGUAZAAgAGQAYQB0AGEAIABmAHIAbwBtACAAbQBvAHIAZQAgAHIAZQBjAGUAbgB0ACAAcgBhAGQAaQBvACAAcwB1AHIAdgBlAHkAcwAsACAAaQBuACAAcABhAHIAdABpAGMAdQBsAGEAcgAsACAAdABoAGUAIABQAGEAcgBrAGUAcwAgAE0AdQBsAHQAaQBiAGUAYQBtACAAKABQAE0AKQAgAFAAdQBsAHMAYQByACAAUwB1AHIAdgBlAHkAIAAoAE0AYQBuAGMAaABlAHMAdABlAHIAIABlAHQAIABhAGwALgAgADIAMAAwADEALAAgAE0ATgBSAEEAUwAsACAAMwAyADgALAAgADEANwAtADMANQApACAAWwBhAHYAYQBpAGwAYQBiAGwAZQAgAGEAdAAgAHQAaABlACAASABFAEEAUwBBAFIAQwAgAGEAcwAgAHQAaABlACAAUABNAFAAVQBMAFMAQQBSACAAdABhAGIAbABlAF0AIABhAG4AZAAgAHQAaABlACAAUwB3AGkAbgBiAHUAcgBuAGUAIABJAG4AdABlAHIAbQBlAGQAaQBhAHQAZQAgAEwAYQB0AGkAdAB1AGQAZQAgAFAAdQBsAHMAYQByACAAUwB1AHIAdgBlAHkAIAAoAEUAZAB3AGEAcgBkAHMAIABlAHQAIABhAGwALgAgADIAMAAwADEALAAgAE0ATgBSAEEAUwAsACAAMwAyADYALAAgADMANQA4AC0AMwA3ADQAKQAsACAAYgBvAHQAaAAgAG0AYQBkAGUAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEEAVABOAEYAIABQAGEAcgBrAGUAcwAgADYANAAtAG0AIAByAGEAZABpAG8AIAB0AGUAbABlAHMAYwBvAHAAZQAuACAAQgBpAG4AYQByAHkAIABwAGEAcgBhAG0AZQB0AGUAcgBzACAAZgBvAHIAIABrAG4AbwB3AG4AIABiAGkAbgBhAHIAeQAgAHAAdQBsAHMAYQByAHMAIABhAHIAZQAgAGEAbABzAG8AIABpAG4AYwBsAHUAZABlAGQAIABhAHMAIAB3AGUAbABsACAAYQBzACAAYQBsAGwAIABhAHYAYQBpAGwAYQBiAGwAZQAgAGEAcwB0AHIAbwBtAGUAdAByAGkAYwAgAGEAbgBkACAAcwBwAGkAbgAgAHAAYQByAGEAbQBlAHQAZQByACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAAZgBvAHIAIABhAGwAbAAgAHAAdQBsAHMAYQByAHMALgAgAFQAaABlACAAYwBhAHQAYQBsAG8AZwAgAGkAbgBjAGwAdQBkAGUAcwAgAGEAbABsACAAcAB1AGIAbABpAHMAaABlAGQAIAByAG8AdABhAHQAaQBvAG4ALQBwAG8AdwBlAHIAZQBkACAAcAB1AGwAcwBhAHIAcwAuACAAVAB3AG8AIABzAGUAcABhAHIAYQB0AGUAIABzAG0AYQBsAGwAIABzAHUAYgBzAGUAdABzACAAbwBmACAAcAB1AGwAcwBhAHIAcwAgAGQAZQB0AGUAYwB0AGUAZAAgAG8AbgBsAHkAIABhAHQAIABoAGkAZwBoACAAZQBuAGUAcgBnAGkAZQBzACAAYQByAGUAIABhAGwAcwBvACAAaQBuAGMAbAB1AGQAZQBkACAAaQBuACAAdABoAGUAIABjAHUAcgByAGUAbgB0ACAAdABhAGIAbABlADoAIAB0AGgAZQAgAGYAaQByAHMAdAAgAGcAcgBvAHUAcAAgAGMAbwBtAHAAcgBpAHMAZQBzACAAWAAtAHIAYQB5ACAAYQBuAGQAIABnAGEAbQBtAGEALQByAGEAeQAgAHAAdQBsAHMAYQByAHMAIAB3AGgAaQBjAGgAIABhAHIAZQAgAGEAcABwAGEAcgBlAG4AdABsAHkAIABwAG8AdwBlAHIAZQBkACAAYgB5ACAAcwBwAGkAbgAtAGQAbwB3AG4AIABlAG4AZQByAGcAeQAsACAAYgB1AHQAIAB3AGgAaQBjAGgAIABoAGEAdgBlACAAbgBvAHQAIABiAGUAZQBuACAAZABlAHQAZQBjAHQAZQBkACAAYQB0ACAAcgBhAGQAaQBvACAAdwBhAHYAZQBsAGUAbgBnAHQAaABzACwAIAB3AGgAaQBsAGUAIAB0AGgAZQAgAHMAZQBjAG8AbgBkACAAZwByAG8AdQBwACAAYwBvAG4AdABhAGkAbgBzACAAYQBuAG8AbQBhAGwAbwB1AHMAIABYAC0AcgBhAHkAIABwAHUAbABzAGEAcgBzACAAKABBAFgAUABzACkAIABhAG4AZAAgAHMAbwBmAHQALQBnAGEAbQBtAGEALQByAGEAeQAgAHIAZQBwAGUAYQB0AGUAcgBzACAAKABTAEcAUgBzACkAIABmAG8AcgAgAHcAaABpAGMAaAAgAGMAbwBoAGUAcgBlAG4AdAAgAHAAdQBsAHMAYQB0AGkAbwBuAHMAIABoAGEAdgBlACAAYgBlAGUAbgAgAGQAZQB0AGUAYwB0AGUAZAAuACAAQQBjAGMAcgBlAHQAaQBvAG4ALQBwAG8AdwBlAHIAZQBkACAAcAB1AGwAcwBhAHIAcwAgAHMAdQBjAGgAIABhAHMAIABIAGUAcgAgAFgALQAxACAAYQBuAGQAIAB0AGgAZQAgAHIAZQBjAGUAbgB0AGwAeQAgAGQAaQBzAGMAbwB2AGUAcgBlAGQAIABYAC0AcgBhAHkAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACAAcwB1AGMAaAAgAGEAcwAgAFMAQQBYACAASgAxADgAMAA4AC4ANAAtADMANgA1ADgAIABhAHIAZQAgAG4AbwB0ACAAaQBuAGMAbAB1AGQAZQBkACAAaQBuACAAdABoAGkAcwAgAHQAYQBiAGwAZQAsACAAaABvAHcAZQB2AGUAcgAuACAATQBhAG4AeQAgAHAAZQBvAHAAbABlACAAaABhAHYAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAAYwBvAG0AcABpAGwAYQB0AGkAbwBuACAAbwBmACAAdABoAGUAIABkAGEAdABhACAAYwBvAG4AdABhAGkAbgBlAGQAIABpAG4AIAB0AGgAaQBzACAAYwBhAHQAYQBsAG8AZwAgAGEAbgBkACAAdABoAGUAIABkAGEAdABhAGIAYQBzAGUAIAB0AGgAYQB0ACAAaQB0ACAAdwBhAHMAIABkAGUAcgBpAHYAZQBkACAAZgByAG8AbQAuACAAVABoAGUAIABhAHUAdABoAG8AcgBzACAAcABhAHIAdABpAGMAdQBsAGEAcgBsAHkAIAB0AGgAYQBuAGsAIABBAG4AZAByAGUAdwAgAEwAeQBuAGUAIABvAGYAIAB0AGgAZQAgAFUAbgBpAHYAZQByAHMAaQB0AHkAIABvAGYAIABNAGEAbgBjAGgAZQBzAHQAZQByACwAIABKAG8AZAByAGUAbABsACAAQgBhAG4AawAgAE8AYgBzAGUAcgB2AGEAdABvAHIAeQAsACAARABhAHYAaQBkACAATgBpAGMAZQAgAG8AZgAgAFAAcgBpAG4AYwBlAHQAbwBuACAAVQBuAGkAdgBlAHIAcwBpAHQAeQAsACAAYQBuAGQAIABSAHUAcwBzAGUAbABsACAARQBkAHcAYQByAGQAcwAsACAAdABoAGUAbgAgAGEAdAAgAFMAdwBpAG4AYgB1AHIAbgBlACAAVQBuAGkAdgBlAHIAcwBpAHQAeQAgAG8AZgAgAFQAZQBjAGgAbgBvAGwAbwBnAHkALgAgAFQAaABlACAAYQBsAHMAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAFcAYQByAHcAaQBjAGsAIABVAG4AaQB2AGUAcgBzAGkAdAB5ACAAcwB0AHUAZABlAG4AdABzACAAQQBkAGEAbQAgAEcAbwBvAGQAZQAgAGEAbgBkACAAUwB0AGUAdgBlAG4AIABUAGgAbwBtAGEAcwAgAHcAaABvACAAYwBvAG0AcABpAGwAZQBkACAAYQBuAGQAIABjAGgAZQBjAGsAZQBkACAAYQAgAHIAZQBjAGUAbgB0ACAAdgBlAHIAcwBpAG8AbgAgAG8AZgAgAHQAaABlACAAZABhAHQAYQBiAGEAcwBlAC4AIABUAGgAZQAgAG8AcgBpAGcAaQBuAGEAbAAgACgAcwB1AG0AbQBlAHIAIAAyADAAMAAzACkAIABkAGEAdABhAGIAYQBzAGUAIABhAHQAIAB0AGgAZQAgAEEAVABOAEYAIAB3AGUAYgBzAGkAdABlACAAdwBhAHMAIABjAG8AbQBwAGkAbABlAGQAIAB3AGkAdABoACAAdABoAGUAIABpAG4AdgBhAGwAdQBhAGIAbABlACAAYQBzAHMAaQBzAHQAYQBuAGMAZQAgAG8AZgAgAE0AYQByAHkAYQBtACAASABvAGIAYgBzACwAIAB3AGgAaQBsAGUAIAB0AGgAZQAgAEEAVABOAEYAIAB3AGUAYgAgAGkAbgB0AGUAcgBmAGEAYwBlACAAdwBhAHMAIABkAGUAcwBpAGcAbgBlAGQAIABhAG4AZAAgAGMAbwBuAHMAdAByAHUAYwB0AGUAZAAgAGIAeQAgAEEAbABiAGUAcgB0ACAAVABlAG8AaAAsACAAYQAgAFMAdQBtAG0AZQByACAAVgBhAGMAYQB0AGkAbwBuACAAUwBjAGgAbwBsAGEAcgAgAGEAdAAgAHQAaABlACAAQQBUAE4ARgAgAGkAbgAgADIAMAAwADIALwAyADAAMAAzAC4AIABUAGgAZQAgAGEAdQB0AGgAbwByAHMAIAB3AG8AdQBsAGQAIABhAHAAcAByAGUAYwBpAGEAdABlACAAaQBmACAAYQBuAHkAbwBuAGUAIABtAGEAawBpAG4AZwAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAGMAYQB0AGEAbABvAGcAIABpAG4AIABhACAAcAB1AGIAbABpAGMAYQB0AGkAbwBuACAAYQBjAGsAbgBvAHcAbABlAGQAZwBlAHMAIAB0AGgAZQAgAHMAbwB1AHIAYwBlACAAbwBmACAAdABoAGUAaQByACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAAYgB5ACAAcQB1AG8AdABpAG4AZwAgAHQAaABlACAAQQBUAE4ARgAgAFAAdQBsAHMAYQByACAAQwBhAHQAYQBsAG8AZwAgAHcAZQBiAHMAaQB0AGUAIABhAGQAZAByAGUAcwBzACAAbwBmACAAJgBsAHQAOwBhACAAaAByAGUAZgA9ACIAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAdABuAGYALgBjAHMAaQByAG8ALgBhAHUALwByAGUAcwBlAGEAcgBjAGgALwBwAHUAbABzAGEAcgAvAHAAcwByAGMAYQB0AC8AIgAmAGcAdAA7AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAHQAbgBmAC4AYwBzAGkAcgBvAC4AYQB1AC8AcgBlAHMAZQBhAHIAYwBoAC8AcAB1AGwAcwBhAHIALwBwAHMAcgBjAGEAdAAvACYAbAB0ADsALwBhACYAZwB0ADsAAAA6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YvVzNCcm93c2UvYWxsL2F0bmZwdWxzYXIuaHRtbAAAABIATQBhAG4AYwBoAGUAcwB0AGUAcgAsACAAVABhAHkAbABvAHIAAAAHY2F0YWxvZwAAAAB/wAAAAAAABXJhZGlvAAABfWh0dHBzOi8vaGVhc2FyYy5nc2ZjLm5hc2EuZ292L2NnaS1iaW4vVzNCcm93c2UvZ2V0dm90YWJsZS5wbD9uYW1lPWF0bmZwdWxzYXI6OjpweSBWTyBzZXA6OjpodHRwczovL2hlYXNhcmMuZ3NmYy5uYXNhLmdvdi94YW1pbi92by9jb25lP3Nob3dvZmZzZXRzJnRhYmxlPWF0bmZwdWxzYXImOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YveGFtaW4vdm8vdGFwOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YvY2dpLWJpbi9XM0Jyb3dzZS93M3F1ZXJ5LnBsP3RhYmxlaGVhZD1uYW1lPWhlYXNhcmNfYXRuZnB1bHNhciZBY3Rpb249TW9yZStPcHRpb25zJkFjdGlvbj1QYXJhbWV0ZXIrU2VhcmNoJkNvbmVBZGQ9MQAAAGQ6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6AAAAXnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXIAAAAzOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6AAAAHWl2bzovL25hc2EuaGVhc2FyYy9mZXJtaWwycHNyAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAACkZFUk1JTDJQU1IAAAAzAEYAZQByAG0AaQAgAEwAQQBUACAAUwBlAGMAbwBuAGQAIABDAGEAdABhAGwAbwBnACAAbwBmACAARwBhAG0AbQBhAC0AUgBhAHkAIABQAHUAbABzAGEAcgBzACAAKAAyAFAAQwApAAAACHJlc2VhcmNoAAAC0QBUAGgAaQBzACAAYwBhAHQAYQBsAG8AZwAgAHMAdQBtAG0AYQByAGkAegBlAHMAIAAwAC4AMQAgAEcAZQBWACAAZwBhAG0AbQBhAC0AcgBhAHkAIABwAHUAbABzAGEAcgAgAGQAZQB0AGUAYwB0AGkAbwBuAHMAIAB1AHMAaQBuAGcAIABkAGEAdABhACAAYQBjAHEAdQBpAHIAZQBkACAAYgB5ACAAdABoAGUAIABMAGEAcgBnAGUAIABBAHIAZQBhACAAVABlAGwAZQBzAGMAbwBwAGUAIAAoAEwAQQBUACkAIABvAG4AIAB0AGgAZQAgAEYAZQByAG0AaQAgAHMAYQB0AGUAbABsAGkAdABlAC4AIABUAGgAZQBzAGUAIABwAHUAbABzAGEAcgBzACAAYQByAGUAIABuAGUAdQB0AHIAbwBuACAAcwB0AGEAcgBzACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgAHUAcwBpAG4AZwAgAEwAQQBUACAAZABhAHQAYQAgAHQAaAByAG8AdQBnAGgAIABwAGUAcgBpAG8AZABpAGMAaQB0AHkAIABzAGUAYQByAGMAaABlAHMAIABpAG4AIABnAGEAbQBtAGEALQByAGEAeQAgAGEAbgBkACAAcgBhAGQAaQBvACAAZABhAHQAYQAgAGEAcgBvAHUAbgBkACAATABBAFQAIAB1AG4AYQBzAHMAbwBjAGkAYQB0AGUAZAAgAHMAbwB1AHIAYwBlACAAcABvAHMAaQB0AGkAbwBuAHMALgAgAFQAaABlACAAYwBhAHQAYQBsAG8AZwB1AGUAZAAgAHAAdQBsAHMAYQByAHMAIABhAHIAZQAgAGQAaQB2AGkAZABlAGQAIABpAG4AdABvACAAdABoAHIAZQBlACAAZwByAG8AdQBwAHMAOgAgAG0AaQBsAGwAaQBzAGUAYwBvAG4AZAAgAHAAdQBsAHMAYQByAHMALAAgAHkAbwB1AG4AZwAgAHIAYQBkAGkAbwAtAGwAbwB1AGQAIABwAHUAbABzAGEAcgBzACwAIABhAG4AZAAgAHkAbwB1AG4AZwAgAHIAYQBkAGkAbwAtAHEAdQBpAGUAdAAgAHAAdQBsAHMAYQByAHMALgAgAFQAaABpAHMAIABjAGEAdABhAGwAbwBnACAAcwB1AG0AbQBhAHIAaQB6AGUAcwAgAHIAZQBzAHUAbAB0AHMAIABvAGYAIAB0AGgAZQAgAGEAbgBhAGwAeQBzAGkAcwAgAG8AZgAgAHAAdQBsAHMAZQAgAHAAcgBvAGYAaQBsAGUAcwAgAGEAbgBkACAAZQBuAGUAcgBnAHkAIABzAHAAZQBjAHQAcgBhACwAIABhAG4AZAAgAGEAbgBhAGwAeQBzAGkAcwAgAG8AZgAgAHQA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aAAgAHcAaQBsAGwAIABiAGUAIAB5AG8AdQBuAGcAIABhAG4AZAAvAG8AcgAgAHMAaABvAHIAdAAtAHAAZQByAGkAbwBkAC4AIABUAGgAaQBzACAAcwB1AHIAdgBlAHkAIABpAHMAIABhACAAZgBhAGMAdABvAHIAIABvAGYAIAA3ACAAdABpAG0AZQBzACAAbQBvAHIAZQAgAHMAZQBuAHMAaQB0AGkAdgBlACAAdABvACAAeQBvAHUAbgBnACAAYQBuAGQAIABkAGkAcwB0AGEAbgB0ACAAcAB1AGwAcwBhAHIAcwAgAHQAaABhAG4AIAB0AGgAYQB0ACAAbwBmACAASgBvAGgAbgBzAHQAbwBuACAAZQB0ACAAYQBsAC4AIAAoADEAOQA5ADIALAAgAE0ATgBSAEEAUwAsACAAMgA1ADUALAAgADQAMAAxACkAIAB3AGgAaQBjAGgAIABkAGUAdABlAGMAdABlAGQAIAAxADAAMAAgAHAAdQBsAHMAYQByAHMALgAgAFQAaABlACAAcAByAGUAcwBlAG4AdAAgAHMAbwB1AHIAYwBlACAAbABpAHMAdAAgAGMAbwBuAHQAYQBpAG4AcwAgAHAAdQBsAHMAYQByAHMAIAB0AGgAYQB0ACAAaABhAHYAZQAgAGIAZQBlAG4AIABuAGUAdwBsAHkAIABkAGkAcwBjAG8AdgBlAHIAZQBkACAAaQBuACAAdABoAGUAIABjAG8AdQByAHMAZQAgAG8AZgAgAHQAaABpAHMAIABzAHUAcgB2AGUAeQAuACAAVABoAGUAIABQAE0AIABTAHUAcgB2AGUAeQAgAGkAcwAgAHMAcABlAGMAaQBmAGkAYwBhAGwAbAB5ACAAdABhAHIAZwBlAHQAZQBkACAAZgBvAHIAIAAoAGkAKQAgAG8AYgBzAGMAdQByAGUAZAAgAHIAZQBnAGkAbwBuAHMAIABvAGYAIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAHAAbABhAG4AZQAsACAAKABpAGkAKQAgAHkAbwB1AG4AZwAgAHAAdQBsAHMAYQByAHMALABhAG4AZAAgACgAaQBpAGkAKQAgAGIAaQBuAGEAcgB5ACAAcAB1AGwAcwBhAHIAcwAgAHcAaQB0AGgAIABtAGEAcwBzAGkAdgBlACAAYwBvAG0AcABhAG4AaQBvAG4AcwAuACAAQQBzACAAbwBmACAAQQB1AGcAdQBzAHQAIAAxADkAOQA5ACwAIABhAG4AYQBsAHkAcwBpAHMAIABvAGYAIABhAGIAbwB1AHQAIAA1ADAAJQAgAG8AZgAgAHQAaABlACAAdABvAHQAYQBsACAAZQB4AHAAZQBjAHQAZQBkACAAZABhAHQAYQAgAHQAbwAgAGIAZQAgAGMAbwBsAGwAZQBjAHQAZQBkACAAaABhAHMAIAByAGUAcwB1AGwAdABlAGQAIABpAG4AIAB0AGgAZQAgAGMAbwBuAGYAaQByAG0AZQBkACAAZABlAHQAZQBjAHQAaQBvAG4AIABvAGYAIABvAHYAZQByACAANAAwADAAIABuAGUAdwAgAHAAdQBsAHMAYQByAHMAIAAoAGEAbgAgAGkAbgBjAHIAZQBhAHMAZQAgAG8AZgAgAG0AbwByAGUAIAB0AGgAYQBuACAANQAwACUAIABvAGYAIAB0AGgAZQAgAGsAbgBvAHcAbgAgAHAAbwBwAHUAbABhAHQAaQBvAG4AKQAuACAASABlAHIAZQAgAGEAcgBlACAAcwBvAG0AZQAgAG8AZgAgAHQAaABlACAAZgBlAGEAdAB1AHIAZQBzACAAbwBmACAAdABoAGUAIABQAE0AIABTAHUAcgB2AGUAeQA6ACAAJgBsAHQAOwBwAHIAZQAmAGcAdAA7ACAAUwB1AHIAdgBlAHkAIABBAHIAZQBhADoAIAAtADIANgAwACAAJgBsAHQAOwAgAGwAIAAmAGwAdAA7ACAANQAwACAAZABlAGcAIAAsACAALQA1ACAAJgBsAHQAOwAgAGIAIAAmAGwAdAA7ACAANQAgAGQAZQBnACAAQwBlAG4AdABlAHIAIABGAHIAZQBxAHUAZQBuAGMAeQA6ACAAMQAzADcANAAgAE0ASAB6ACAAQgBhAG4AZAB3AGkAZAB0AGgAOgAgADIAOAA4ACAATQBIAHoAIAAoADkANgAgAGMAaABhAG4AbgBlAGwAcwAgAHgAIAAzACAATQBIAHoAIABwAGUAcgAgAGMAaABhAG4AbgBlAGwAIAB4ACAAMgAgAHAAbwBsAGEAcgBpAHoAYQB0AGkAbwBuAHMAKQAgAFMAYQBtAHAAbABpAG4AZwAgAFIAYQB0AGUAOgAgADAALgAyADUAIABtAHMAIAB4ACAAMQAgAGIAaQB0ACAAcABlAHIAIABjAGgAYQBuAG4AZQBsACAASQBuAHQAZQBnAHIAYQB0AGkAbwBuACAAVABpAG0AZQA6ACAAMwA1ACAAbQBpAG4AIABwAGUAcgAgAHAAbwBpAG4AdABpAG4AZwAgACgAMQAzACAAYgBlAGEAbQBzACAAcABlAHIAIABwAG8AaQBuAHQAaQBuAGcAKQAgAEQAYQB0AGEAIABTAHQAbwByAGEAZwBlADoAIABEAEwAVAAgAHQAYQBwAGUAIAAoAGEAYgBvAHUAdAAgADMANQAgAEcAQgAgAHAAZQByACAAdABhAHAAZQApACAAUwBlAG4AcwBpAHQAaQB2AGkAdAB5ADoAIABhAGIAbwB1AHQAIAA3ACAAdABpAG0AZQBzACAAYgBlAHQAdABlAHIAIAB0AGgAYQBuACAAcAByAGUAdgBpAG8AdQBzACAANAAwADAAIABNAEgAegAgAHMAdQByAHYAZQB5AHMAIAAmAGwAdAA7AC8AcAByAGUAJgBnAHQAOwAAADhodHRwczovL2hlYXNhcmMuZ3NmYy5uYXNhLmdvdi9XM0Jyb3dzZS9hbGwvcG1wdWxzYXIuaHRtbAAAAC8ATQBhAG4AYwBoAGUAcwB0AGUAcgAgAGUAdAAgAGEAbAAuADsAIABNAG8AcgByAGkAcwAgAGUAdAAgAGEAbAAuADsAIABLAHIAYQBtAGUAcgAgAGUAdAAgAGEAbAAuAAAAB2NhdGFsb2cAAAAAf8AAAAAAAAVyYWRpbwAAAXdodHRwczovL2hlYXNhcmMuZ3NmYy5uYXNhLmdvdi9jZ2ktYmluL1czQnJvd3NlL3czcXVlcnkucGw/dGFibGVoZWFkPW5hbWU9aGVhc2FyY19wbXB1bHNhciZBY3Rpb249TW9yZStPcHRpb25zJkFjdGlvbj1QYXJhbWV0ZXIrU2VhcmNoJkNvbmVBZGQ9MTo6OnB5IFZPIHNlcDo6Omh0dHBzOi8vaGVhc2FyYy5nc2ZjLm5hc2EuZ292L3hhbWluL3ZvL2NvbmU/c2hvd29mZnNldHMmdGFibGU9cG1wdWxzYXImOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YveGFtaW4vdm8vdGFwOjo6cHkgVk8gc2VwOjo6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
\ No newline at end of file diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index d5137dbab..7d29aaf65 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -35,6 +35,14 @@ def callback(request, context): yield matcher +@pytest.fixture() +def regtap_pulsar_distance_response(mocker): + with mocker.register_uri( + 'POST', REGISTRY_BASEURL+'/sync', + content=get_pkg_data_contents('data/regtap.xml')) as matcher: + yield matcher + + @pytest.fixture() def keywords_fixture(mocker): def keywordstest_callback(request, context): @@ -223,6 +231,11 @@ def test_VOSI(self): assert intf.is_vosi +# The following tests have their assertions in the fixtures. +# It would certainly not hurt to refactor this so they are +# in the tests (we could also just rely on the rtcons tests +# that exercise about the same thing). + @pytest.mark.usefixtures('keywords_fixture', 'capabilities') def test_keywords(): regsearch(keywords=['vizier', 'pulsar']) @@ -271,19 +284,54 @@ def test_spectral(): "1 = ivo_interval_overlaps(spectral_start, spectral_end, 1e-17, 2e-17)") -@pytest.mark.usefixtures('multi_interface_fixture', 'capabilities') -class TestResultsExtras: - def test_to_table(self): - t = regtap.search( - ivoid="ivo://org.gavo.dc/flashheros/q/ssa").to_table() - assert (set(t.columns.keys()) - == {'index', 'title', 'description', 'interfaces'}) - assert t["index"][0] == 0 - assert t["title"][0] == 'Flash/Heros SSAP' - assert (t["description"][0][:40] - == 'Spectra from the Flash and Heros Echelle') - assert (t["interfaces"][0] - == 'datalink#links-1.0, soda#sync-1.0, ssa, tap#aux, web') +def test_to_table(multi_interface_fixture, capabilities): + t = regtap.search( + ivoid="ivo://org.gavo.dc/flashheros/q/ssa").to_table() + assert (set(t.columns.keys()) + == {'index', 'short_name', 'title', 'description', 'interfaces'}) + assert t["index"][0] == 0 + assert t["title"][0] == 'Flash/Heros SSAP' + assert (t["description"][0][:40] + == 'Spectra from the Flash and Heros Echelle') + assert (t["interfaces"][0] + == 'datalink#links-1.0, soda#sync-1.0, ssa, tap#aux, web') + + +@pytest.fixture() +def rt_pulsar_distance(regtap_pulsar_distance_response, capabilities): + return regsearch(keywords="pulsar", ucd=["pos.distance"]) + + +class TestResultIndexing: + def test_get_with_index(self, rt_pulsar_distance): + # this is expecte to break when the fixture is updated + assert (rt_pulsar_distance[0].res_title + == 'Pulsar Timing for Fermi Gamma-ray Space Telescope') + + def test_get_with_short_name(self, rt_pulsar_distance): + assert (rt_pulsar_distance["ATNF"].res_title + == 'ATNF Pulsar Catalog') + + def test_get_with_ivoid(self, rt_pulsar_distance): + assert (rt_pulsar_distance["ivo://nasa.heasarc/atnfpulsar" + ].res_title == 'ATNF Pulsar Catalog') + + def test_out_of_range(self, rt_pulsar_distance): + with pytest.raises(IndexError) as excinfo: + rt_pulsar_distance[40320] + assert (str(excinfo.value) + == "index 40320 is out of bounds for axis 0 with size 23") + + def test_bad_key(self, rt_pulsar_distance): + with pytest.raises(KeyError) as excinfo: + rt_pulsar_distance["hunkatunka"] + assert (str(excinfo.value) == "'hunkatunka'") + + def test_not_indexable(self, rt_pulsar_distance): + with pytest.raises(IndexError) as excinfo: + rt_pulsar_distance[None] + assert (str(excinfo.value) + == "No resource matching None") @pytest.mark.usefixtures('multi_interface_fixture', 'capabilities', From 9fffbbeb6846e185af55b0ac29c7bbe5fd2e9337 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Tue, 11 Jan 2022 15:15:03 +0100 Subject: [PATCH 28/49] Spatial constraints now accept SkyCoords (within reason) --- pyvo/registry/rtcons.py | 94 +++++++----------------------- pyvo/registry/tests/test_rtcons.py | 12 ++++ 2 files changed, 33 insertions(+), 73 deletions(-) diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 3a660f942..7e0941d02 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -14,6 +14,7 @@ from astropy import units from astropy import constants +from astropy.coordinates import SkyCoord import numpy from ..dal import tap @@ -488,79 +489,15 @@ class Spatial(Constraint): To find resources claiming to cover a MOC, pass an ASCII MOC:: >>> registry.Spatial("0/1-3 3/") - """ - _keyword = "spatial" - _condition = "1 = CONTAINS({geom}, coverage)" - _extra_tables = ["rr.stc_spatial"] - - takes_sequence = True - - def __init__(self, geom_spec, order=6): - """ - - Parameters - ---------- - geom_spec : object - For now, this is DALI-style: a 2-sequence is interpreted - as a DALI point, a 3-sequence as a DALI circle, a 2n sequence - as a DALI polygon. Additionally, strings are interpreted - as ASCII MOCs. Other types (proper geometries or pymoc - objects) might be supported in the future. - order : int, optional - Non-MOC geometries are converted to MOCs before comparing - them to the resource coverage. By default, this contrains - uses order 6, which corresponds to about a degree of resolution - and is what RegTAP recommends as a sane default for the - order actually used for the coverages in the database. - """ - def tomoc(s): - return _AsIs("MOC({}, {})".format(order, s)) - - if isinstance(geom_spec, str): - geom = _AsIs("MOC({})".format( - make_sql_literal(geom_spec))) - - elif len(geom_spec)==2: - geom = tomoc(format_function_call("POINT", geom_spec)) - - elif len(geom_spec)==3: - geom = tomoc(format_function_call("CIRCLE", geom_spec)) - - elif len(geom_spec)%2==0: - geom = tomoc(format_function_call("POLYGON", geom_spec)) - else: - raise ValueError("This constraint needs DALI-style geometries.") + When you already have an astropy SkyCoord:: - self._fillers = {"geom": geom} - - -class Spatial(Constraint): - """ - A RegTAP constraint selecting resources covering a geometry in - space. - - This is a RegTAP 1.2 extension not yet available on all Registries - (in 2022). Also note that not all data providers give spatial coverage - for their resources. - - To find resources having data for RA/Dec 347.38/8.6772:: + >>> from astropy.coordinates import SkyCoord + >>> registry.Spatial(SkyCoord("23d +3d")) - >>> registry.Spatial((347.38, 8.6772)) - - To find resources claiming to have data for a spherical circle 2 degrees - around that point:: - - >>> registry.Spatial(347.38, 8.6772, 2)) + SkyCoords also work as circle centers:: - To find resources claiming to have data for a polygon described by - the vertices (23, -40), (26, -39), (25, -43) in ICRS RA/Dec:: - - >>> registry.Spatial([23, -40, 26, -39, 25, -43]) - - To find resources claiming to cover a MOC, pass an ASCII MOC:: - - >>> registry.Spatial("0/1-3 3/") + >>> registry.Spatial((SkyCoord("23d +3d"), 3)) """ _keyword = "spatial" _condition = "1 = CONTAINS({geom}, coverage)" @@ -577,8 +514,10 @@ def __init__(self, geom_spec, order=6): For now, this is DALI-style: a 2-sequence is interpreted as a DALI point, a 3-sequence as a DALI circle, a 2n sequence as a DALI polygon. Additionally, strings are interpreted - as ASCII MOCs. Other types (proper geometries or pymoc - objects) might be supported in the future. + as ASCII MOCs, SkyCoords as points, and a pair of a + SkyCoord and a float as a circle. Other types (proper + geometries or pymoc objects) might be supported in the + future. order : int, optional Non-MOC geometries are converted to MOCs before comparing them to the resource coverage. By default, this contrains @@ -588,13 +527,22 @@ def __init__(self, geom_spec, order=6): """ def tomoc(s): return _AsIs("MOC({}, {})".format(order, s)) - + if isinstance(geom_spec, str): geom = _AsIs("MOC({})".format( make_sql_literal(geom_spec))) + elif isinstance(geom_spec, SkyCoord): + geom = tomoc(format_function_call("POINT", + (geom_spec.ra.value, geom_spec.dec.value))) + elif len(geom_spec)==2: - geom = tomoc(format_function_call("POINT", geom_spec)) + if isinstance(geom_spec[0], SkyCoord): + geom = tomoc(format_function_call("CIRCLE", + [geom_spec[0].ra.value, geom_spec[0].dec.value, + geom_spec[1]])) + else: + geom = tomoc(format_function_call("POINT", geom_spec)) elif len(geom_spec)==3: geom = tomoc(format_function_call("CIRCLE", geom_spec)) diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index 0befd33e0..553b43e81 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -8,6 +8,7 @@ from astropy import time from astropy import units +from astropy.coordinates import SkyCoord import numpy import pytest @@ -207,6 +208,17 @@ def test_moc(self): assert (cons.get_search_condition() == "1 = CONTAINS(MOC('0/1-3 3/'), coverage)") + def test_SkyCoord(self): + cons = registry.Spatial(SkyCoord(3*units.deg, -30*units.deg)) + assert (cons.get_search_condition() == + "1 = CONTAINS(MOC(6, POINT(3.0, -30.0)), coverage)") + assert(cons._extra_tables==["rr.stc_spatial"]) + + def test_SkyCoord_Circle(self): + cons = registry.Spatial((SkyCoord(3*units.deg, -30*units.deg), 3)) + assert (cons.get_search_condition() == + "1 = CONTAINS(MOC(6, CIRCLE(3.0, -30.0, 3)), coverage)") + assert(cons._extra_tables==["rr.stc_spatial"]) class TestSpectralConstraint: # These tests might need some float literal fuzziness. I'm just From d68a27e64302af1abca57f65eeee11dee4540597 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Wed, 12 Jan 2022 15:57:09 +0100 Subject: [PATCH 29/49] Backward compatibility: unadorned arguments to regseach are fulltext constraints. --- pyvo/registry/rtcons.py | 3 +++ pyvo/registry/tests/test_rtcons.py | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 7e0941d02..f90d05442 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -739,6 +739,9 @@ def build_regtap_query(constraints): serialized, extra_tables = [], set() for constraint in constraints: + if isinstance(constraint, str): + constraint = Freetext(constraint) + serialized.append("("+constraint.get_search_condition()+")") extra_tables |= set(constraint._extra_tables) diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index 553b43e81..b8b56c2ae 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -309,7 +309,6 @@ def test_from_keywords(self): ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'euv'))\n" " AND (role_name LIKE '%Hubble%' AND base_role='creator')") - def test_mixed(self): assert self.where_clause_for( rtcons.Waveband("EUV"), @@ -317,7 +316,6 @@ def test_mixed(self): ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'euv'))\n" " AND (role_name LIKE '%Hubble%' AND base_role='creator')") - def test_bad_keyword(self): with pytest.raises(TypeError) as excinfo: rtcons.build_regtap_query( @@ -331,6 +329,19 @@ def test_bad_keyword(self): " author, datamodel, ivoid, keywords, servicetype," " spatial, spectral, temporal, ucd, waveband.") + def test_with_legacy_keyword(self): + assert self.where_clause_for( + "plain", "string" + ) == ( + '(ivoid IN (SELECT ivoid FROM rr.resource WHERE ' + "1=ivo_hasword(res_description, 'plain') UNION SELECT ivoid FROM rr.resource " + "WHERE 1=ivo_hasword(res_title, 'plain') UNION SELECT ivoid FROM " + "rr.res_subject WHERE res_subject ILIKE '%plain%'))\n" + ' AND (ivoid IN (SELECT ivoid FROM rr.resource WHERE ' + "1=ivo_hasword(res_description, 'string') UNION SELECT ivoid FROM rr.resource " + "WHERE 1=ivo_hasword(res_title, 'string') UNION SELECT ivoid FROM " + "rr.res_subject WHERE res_subject ILIKE '%string%'))") + class TestSelectClause: def test_expected_columns(self): From 04dd0762ce19af384f15631eb8629882d9823578 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Thu, 13 Jan 2022 09:30:50 +0100 Subject: [PATCH 30/49] Adding Changelog entry for add-discoverdata --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 6e7a5b22f..b3cfe20b3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,9 @@ for services like ESO's and MAST's TAP, which do not use canonical prefixes while astropy.utils.xml ignores namespaces. [#323] +- Overhaul of the registry.regsearch as discussed in + https://blog.g-vo.org/towards-data-discovery-in-pyvo.html. This + should be backwards-compatible. [#278, #238, #176] 1.3.1 (unreleased) ================== From b617f2829b5d5ef0cd2381a4f1fc6e6bebc25c05 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Thu, 13 Jan 2022 11:01:03 +0100 Subject: [PATCH 31/49] Not testing against float96 since that's not available in the CI --- pyvo/registry/tests/test_rtcons.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index b8b56c2ae..c6f412df6 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -44,7 +44,7 @@ class _WithFillers(rtcons.Constraint): "bytes": b"keep this ascii for now", "anInt": 210, "aFloat": 5e7, - "numpyStuff": numpy.float96(23.7), + "numpyStuff": numpy.float64(23.7), "timestamp": datetime.datetime(2021, 6, 30, 9, 1),} return _WithFillers()._get_sql_literals() @@ -64,7 +64,7 @@ def test_float(self, literals): assert literals["aFloat"] == "50000000.0" def test_numpy(self, literals): - assert literals["numpyStuff"][:14] == "23.69999999999" + assert float(literals["numpyStuff"])-23.7<1e-10 def test_timestamp(self, literals): assert literals["timestamp"] == "'2021-06-30T09:01:00'" From 799abe040c70e3d468666b4c1636063063f2a180 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Thu, 13 Jan 2022 13:09:54 +0100 Subject: [PATCH 32/49] flake8 cosmetics --- pyvo/registry/regtap.py | 45 ++++++++++--------- pyvo/registry/rtcons.py | 70 +++++++++++++++--------------- pyvo/registry/tests/test_regtap.py | 47 ++++++++++---------- pyvo/registry/tests/test_rtcons.py | 7 ++- 4 files changed, 85 insertions(+), 84 deletions(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 97fd6c7e3..42b3c43aa 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -26,7 +26,7 @@ from ..utils.formatting import para_format_desc -__all__ = ["search", "get_RegTAP_query", +__all__ = ["search", "get_RegTAP_query", "RegistryResource", "RegistryResults", "ivoid2service"] REGISTRY_BASEURL = os.environ.get("IVOA_REGISTRY", "http://reg.g-vo.org/tap" @@ -44,7 +44,7 @@ def shorten_stdid(s): """removes leading ivo://ivoa.net/std/ from s if present. - We're using this to make the display and naming of standard ivoids + We're using this to make the display and naming of standard ivoids less ugly in several places. Nones remain Nones. @@ -77,7 +77,7 @@ def get_RegTAP_service(): return tap.TAPService(REGISTRY_BASEURL) -def get_RegTAP_query(*constraints:rtcons.Constraint, +def get_RegTAP_query(*constraints:rtcons.Constraint, includeaux=False, **kwargs): """returns SQL for a RegTAP query for constraints and keywords. @@ -129,7 +129,7 @@ def search(*constraints:rtcons.Constraint, includeaux=False, **kwargs): """ service = get_RegTAP_service() query = RegistryQuery( - service.baseurl, + service.baseurl, get_RegTAP_query(*constraints, includeaux=includeaux, **kwargs), maxrec=service.hardlimit) return query.execute() @@ -245,8 +245,8 @@ class Interface: """ a service interface. - These consist of an access URL, a standard id for the capability - (typically the ivoid of an IVOA standard, or None for free services), + These consist of an access URL, a standard id for the capability + (typically the ivoid of an IVOA standard, or None for free services), an interface type (something like vs:paramhttp or vr:webbrowser) and an indication if the interface is the "standard" interface of the capability. @@ -279,7 +279,7 @@ def to_service(self): if self.standard_id is None or not self.is_standard: raise ValueError("This is not a standard interface. PyVO" " cannot speak to it.") - + service_class = self.service_for_standardid.get( self.standard_id.split("#")[0]) if service_class is None: @@ -291,8 +291,8 @@ def to_service(self): def supports(self, standard_id): """returns true if we believe the interface should be able to talk standard_id. - - At this point, we naively check if the interfaces's standard_id + + At this point, we naively check if the interfaces's standard_id has standard_id as a prefix. At this point, we cut off standard_id fragments for this purpose. This works for all current DAL standards but would, for instance, not work for VOSI. Hence, @@ -344,13 +344,13 @@ class RegistryResource(dalq.Record): "source_format", "region_of_regard", "waveband", - (f"\n ivo_string_agg(COALESCE(access_url, ''), '{TOKEN_SEP}')", + (f"\n ivo_string_agg(COALESCE(access_url, ''), '{TOKEN_SEP}')", "access_urls"), - (f"\n ivo_string_agg(COALESCE(standard_id, ''), '{TOKEN_SEP}')", + (f"\n ivo_string_agg(COALESCE(standard_id, ''), '{TOKEN_SEP}')", "standard_ids"), - (f"\n ivo_string_agg(COALESCE(intf_type, ''), '{TOKEN_SEP}')", + (f"\n ivo_string_agg(COALESCE(intf_type, ''), '{TOKEN_SEP}')", "intf_types"), - (f"\n ivo_string_agg(COALESCE(intf_role, ''), '{TOKEN_SEP}')", + (f"\n ivo_string_agg(COALESCE(intf_role, ''), '{TOKEN_SEP}')", "intf_roles"),] def __init__(self, results, index, session=None): @@ -365,7 +365,6 @@ def __init__(self, results, index, session=None): self._mapping["intf_roles" ] = self._mapping["intf_roles"].split(TOKEN_SEP) - self.interfaces = [Interface(*props) for props in zip( self["access_urls"], @@ -498,7 +497,7 @@ def access_modes(self): This will ignore VOSI (infrastructure) services. """ - return set(shorten_stdid(intf.standard_id) or "web" + return set(shorten_stdid(intf.standard_id) or "web" for intf in self.interfaces if (intf.standard_id or intf.type=="vr:webbrowser") and not intf.is_vosi) @@ -534,7 +533,7 @@ def get_interface(self, service_type, service_type)) candidates = [intf for intf in self.interfaces - if ((not std_only) or intf.is_standard) + if ((not std_only) or intf.is_standard) and not intf.is_vosi and ((not service_type) or intf.supports(service_type))] @@ -545,11 +544,11 @@ def get_interface(self, raise ValueError("Multiple matching interfaces found." " Perhaps pass in service_type or use a Servicetype" " constrain in the registry.search? Or use lax=True?") - + return candidates[0] - def get_service(self, - service_type:str=None, + def get_service(self, + service_type:str=None, lax:bool=True): """ return an appropriate DALService subclass for this resource that @@ -705,11 +704,11 @@ def get_contact(self): res = get_RegTAP_service().run_sync(""" SELECT role_name, email, telephone FROM rr.res_role - WHERE + WHERE base_role='contact' AND ivoid={}""".format( rtcons.make_sql_literal(self.ivoid))) - + contacts = [] for row in res: contact = row["role_name"] @@ -780,7 +779,7 @@ def get_tables(self, table_limit=20): raise dalq.DALQueryError(f"Resource {self.ivoid} reports" f" {len(tables)} tables. Pass a higher table_limit" " to see them all.") - + res = {} for table_row in tables: columns = svc.run_sync( @@ -817,7 +816,7 @@ def ivoid2service(ivoid, servicetype=None): f" {servicetype} capability.") else: raise dalq.DALQueryError(f"No resource {ivoid}") - + # We're grouping by ivoid in search, so if there's a result # there is only one. resource = resources[0] diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index f90d05442..e5411d895 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -126,7 +126,7 @@ class Constraint: string with {}-type replacement fields (assume all parameters are strings), and define ``fillers`` to be a dictionary with values for the _condition template. Don't worry about SQL-serialising the values, Constraint takes - care of that. If you need your Constraint to be "lazy" + care of that. If you need your Constraint to be "lazy" (cf. Servicetype), it's ok to overrride get_search_condition without an upcall to Constraint. @@ -161,7 +161,7 @@ def get_search_condition(self): .format(self.__class__.__name__)) return self._condition.format(**self._get_sql_literals()) - + def _get_sql_literals(self): """ returns self._fillers as a dictionary of properly SQL-escaped @@ -174,7 +174,7 @@ def _get_sql_literals(self): class Freetext(Constraint): """ - A contraint using plain text to match against title, description, + A contraint using plain text to match against title, description, subjects, and person names. """ _keyword = "keywords" @@ -186,11 +186,11 @@ def __init__(self, *words:str): ---------- *words: tuple of str It is recommended to pass multiple words in multiple strings - arguments. You can pass in phrases (i.e., multiple words - separated by space), but behaviour might then vary quite + arguments. You can pass in phrases (i.e., multiple words + separated by space), but behaviour might then vary quite significantly between different registries. """ - # cross-table ORs kill the query planner. We therefore + # cross-table ORs kill the query planner. We therefore # write the constraint as an IN condition on a UNION # of subqueries; it may look as if this has to be # really slow, but in fact it's almost always a lot @@ -203,7 +203,7 @@ def __init__(self, *words:str): "SELECT ivoid FROM rr.res_subject WHERE" " res_subject ILIKE {{{parpatname}}}"] self._fillers, subqueries = {}, [] - + for index, word in enumerate(words): parname = "fulltext{}".format(index) parpatname = "fulltextpar{}".format(index) @@ -218,7 +218,7 @@ def __init__(self, *words:str): class Author(Constraint): """ - A constraint for creators (“authors”) of a resource; you can use SQL + A constraint for creators (“authors”) of a resource; you can use SQL patterns here. The match is case-sensitive. @@ -233,7 +233,7 @@ def __init__(self, name:str): name: str Note that regrettably there are no guarantees as to how authors are written in the VO. This means that you will generally have - to write things like ``%Hubble%`` (% being “zero or more + to write things like ``%Hubble%`` (% being “zero or more characters” in SQL) here. """ self._condition = "role_name LIKE {auth} AND base_role='creator'" @@ -431,7 +431,7 @@ def __init__(self, ivoid): ivoid : string The IVOA identifier of the resource to match. As RegTAP - requires lowercasing ivoids on ingestion, the constraint + requires lowercasing ivoids on ingestion, the constraint lowercases the ivoid passed in, too. """ self._condition = "ivoid = {ivoid}" @@ -441,7 +441,7 @@ def __init__(self, ivoid): class UCD(Constraint): """ A constraint selecting resources having tables with columns having - UCDs matching a SQL pattern (% as wildcard). + UCDs matching a SQL pattern (% as wildcard). """ _keyword = "ucd" @@ -461,7 +461,7 @@ def __init__(self, *patterns): f"ucd LIKE {{ucd{i}}}" for i in range(len(patterns))) self._fillers = dict((f"ucd{index}", pattern) for index, pattern in enumerate(patterns)) - + class Spatial(Constraint): """ @@ -473,9 +473,9 @@ class Spatial(Constraint): for their resources. To find resources having data for RA/Dec 347.38/8.6772:: - + >>> registry.Spatial((347.38, 8.6772)) - + To find resources claiming to have data for a spherical circle 2 degrees around that point:: @@ -485,16 +485,16 @@ class Spatial(Constraint): the vertices (23, -40), (26, -39), (25, -43) in ICRS RA/Dec:: >>> registry.Spatial([23, -40, 26, -39, 25, -43]) - + To find resources claiming to cover a MOC, pass an ASCII MOC:: >>> registry.Spatial("0/1-3 3/") When you already have an astropy SkyCoord:: - + >>> from astropy.coordinates import SkyCoord >>> registry.Spatial(SkyCoord("23d +3d")) - + SkyCoords also work as circle centers:: >>> registry.Spatial((SkyCoord("23d +3d"), 3)) @@ -512,11 +512,11 @@ def __init__(self, geom_spec, order=6): ---------- geom_spec : object For now, this is DALI-style: a 2-sequence is interpreted - as a DALI point, a 3-sequence as a DALI circle, a 2n sequence + as a DALI point, a 3-sequence as a DALI circle, a 2n sequence as a DALI polygon. Additionally, strings are interpreted as ASCII MOCs, SkyCoords as points, and a pair of a - SkyCoord and a float as a circle. Other types (proper - geometries or pymoc objects) might be supported in the + SkyCoord and a float as a circle. Other types (proper + geometries or pymoc objects) might be supported in the future. order : int, optional Non-MOC geometries are converted to MOCs before comparing @@ -527,19 +527,19 @@ def __init__(self, geom_spec, order=6): """ def tomoc(s): return _AsIs("MOC({}, {})".format(order, s)) - + if isinstance(geom_spec, str): geom = _AsIs("MOC({})".format( make_sql_literal(geom_spec))) elif isinstance(geom_spec, SkyCoord): - geom = tomoc(format_function_call("POINT", + geom = tomoc(format_function_call("POINT", (geom_spec.ra.value, geom_spec.dec.value))) elif len(geom_spec)==2: if isinstance(geom_spec[0], SkyCoord): geom = tomoc(format_function_call("CIRCLE", - [geom_spec[0].ra.value, geom_spec[0].dec.value, + [geom_spec[0].ra.value, geom_spec[0].dec.value, geom_spec[1]])) else: geom = tomoc(format_function_call("POINT", geom_spec)) @@ -552,7 +552,7 @@ def tomoc(s): else: raise ValueError("This constraint needs DALI-style geometries.") - + self._fillers = {"geom": geom} @@ -588,7 +588,7 @@ class Spectral(Constraint): """ _keyword = "spectral" _extra_tables = ["rr.stc_spectral"] - + takes_sequence = True def __init__(self, spec): @@ -621,7 +621,7 @@ def _to_joule(self, quant): """ if isinstance(quant, (float, int)): return quant - + try: # is it an energy? return quant.to(units.Joule).value @@ -639,7 +639,7 @@ def _to_joule(self, quant): return (constants.h*quant.to(units.Hz)).value except units.UnitConversionError: pass # fall through to give up - + raise ValueError(f"Cannot make a spectral quantity out of {quant}") @@ -671,7 +671,7 @@ class Temporal(Constraint): """ _keyword = "temporal" _extra_tables = ["rr.stc_temporal"] - + takes_sequence = True def __init__(self, times): @@ -681,7 +681,7 @@ def __init__(self, times): ---------- spec : astropy.Time or a 2-tuple of astropy.Time-s A point in time or time interval to cover. Plain numbers - are interpreted as MJD. All resources *overlapping* the + are interpreted as MJD. All resources *overlapping* the interval are returned. """ if isinstance(times, tuple): @@ -705,7 +705,7 @@ def _to_mjd(self, quant): """ if isinstance(quant, (float, int)): return quant - + val = quant.to_value('mjd') if not isinstance(val, numpy.number): raise ValueError("RegTAP time constraints must be made from" @@ -744,7 +744,7 @@ def build_regtap_query(constraints): serialized.append("("+constraint.get_search_condition()+")") extra_tables |= set(constraint._extra_tables) - + joined_tables = ["rr.resource", "rr.capability", "rr.interface" ]+list(extra_tables) @@ -757,7 +757,7 @@ def build_regtap_query(constraints): plain_columns.append(col_desc) else: select_clause.append("{} AS {}".format(*col_desc)) - + fragments = ["SELECT", ", ".join(select_clause), "FROM", @@ -784,7 +784,7 @@ def keywords_to_constraints(keywords): Raises ------ - DALQueryError + DALQueryError if an unknown keyword is encountered. """ constraints = [] @@ -795,7 +795,7 @@ def keywords_to_constraints(keywords): ", ".join(sorted(_KEYWORD_TO_CONSTRAINT)))) constraint_class = _KEYWORD_TO_CONSTRAINT[keyword] - if (isinstance(value, (tuple, list)) + if (isinstance(value, (tuple, list)) and not constraint_class.takes_sequence): constraints.append(constraint_class(*value)) else: @@ -811,7 +811,7 @@ def _make_constraint_map(): keyword_to_constraint = {} for att_name, obj in globals().items(): if (isinstance(obj, type) - and issubclass(obj, Constraint) + and issubclass(obj, Constraint) and obj._keyword): keyword_to_constraint[obj._keyword] = obj return keyword_to_constraint diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index 7d29aaf65..df04dd6fb 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -157,7 +157,7 @@ def auxtest_callback(request, context): with mocker.register_uri( 'POST', REGISTRY_BASEURL+'/sync', - content=auxtest_callback, + content=auxtest_callback, ) as matcher: yield matcher @@ -167,7 +167,7 @@ def multi_interface_fixture(mocker): # to update this, run # import requests # from pyvo.registry import regtap -# +# # with open("data/multi-interface.xml", "wb") as f: # f.write(requests.get(regtap.REGISTRY_BASEURL+"/sync", { # "LANG": "ADQL", @@ -197,7 +197,7 @@ def test_basic(self): assert not intf.is_vosi def test_unknown_standard(self): - intf = regtap.Interface("http://example.org", "ivo://gavo/std/a", + intf = regtap.Interface("http://example.org", "ivo://gavo/std/a", "vs:paramhttp", "std") assert intf.is_standard with pytest.raises(ValueError) as excinfo: @@ -208,13 +208,13 @@ def test_unknown_standard(self): " id ivo://gavo/std/a.") def test_known_standard(self): - intf = regtap.Interface("http://example.org", + intf = regtap.Interface("http://example.org", "ivo://ivoa.net/std/tap#aux", "vs:paramhttp", "std") assert isinstance(intf.to_service(), tap.TAPService) assert not intf.is_vosi def test_secondary_interface(self): - intf = regtap.Interface("http://example.org", + intf = regtap.Interface("http://example.org", "ivo://ivoa.net/std/tap#aux", "vs:webbrowser", "web") @@ -225,7 +225,7 @@ def test_secondary_interface(self): "This is not a standard interface. PyVO cannot speak to it.") def test_VOSI(self): - intf = regtap.Interface("http://example.org", + intf = regtap.Interface("http://example.org", "ivo://ivoa.net/std/vosi#capabilities", "vs:ParamHTTP", "std") assert intf.is_vosi @@ -272,6 +272,7 @@ def test_bad_servicetype_aux(): with pytest.raises(dalq.DALQueryError): regsearch(servicetype='bad_servicetype', includeaux=True) + def test_spatial(): assert (rtcons.keywords_to_constraints({ "spatial": (23, -40)})[0].get_search_condition() @@ -280,7 +281,7 @@ def test_spatial(): def test_spectral(): assert (rtcons.keywords_to_constraints({ - "spectral": (1e-17, 2e-17)})[0].get_search_condition() == + "spectral": (1e-17, 2e-17)})[0].get_search_condition() == "1 = ivo_interval_overlaps(spectral_start, spectral_end, 1e-17, 2e-17)") @@ -307,7 +308,7 @@ def test_get_with_index(self, rt_pulsar_distance): # this is expecte to break when the fixture is updated assert (rt_pulsar_distance[0].res_title == 'Pulsar Timing for Fermi Gamma-ray Space Telescope') - + def test_get_with_short_name(self, rt_pulsar_distance): assert (rt_pulsar_distance["ATNF"].res_title == 'ATNF Pulsar Catalog') @@ -319,7 +320,7 @@ def test_get_with_ivoid(self, rt_pulsar_distance): def test_out_of_range(self, rt_pulsar_distance): with pytest.raises(IndexError) as excinfo: rt_pulsar_distance[40320] - assert (str(excinfo.value) + assert (str(excinfo.value) == "index 40320 is out of bounds for axis 0 with size 23") def test_bad_key(self, rt_pulsar_distance): @@ -330,7 +331,7 @@ def test_bad_key(self, rt_pulsar_distance): def test_not_indexable(self, rt_pulsar_distance): with pytest.raises(IndexError) as excinfo: rt_pulsar_distance[None] - assert (str(excinfo.value) + assert (str(excinfo.value) == "No resource matching None") @@ -338,7 +339,7 @@ def test_not_indexable(self, rt_pulsar_distance): 'flash_service') class TestInterfaceSelection: """ - tests for the selection and generation of services within + tests for the selection and generation of services within RegistryResource. """ def test_exactly_one_result(self): @@ -355,24 +356,24 @@ def test_get_web_interface(self, flash_service): svc = flash_service.get_service("web") assert isinstance(svc, regtap._BrowserService) - assert (svc.access_url + assert (svc.access_url == "http://dc.zah.uni-heidelberg.de/flashheros/q/web/form") - + def test_get_aux_interface(self, flash_service): svc = flash_service.get_service("tap#aux") - assert (svc._baseurl + assert (svc._baseurl == "http://dc.zah.uni-heidelberg.de/tap") - + def test_get_aux_as_main(self, flash_service): - assert (flash_service.get_service("tap")._baseurl + assert (flash_service.get_service("tap")._baseurl == "http://dc.zah.uni-heidelberg.de/tap") def test_get__main_from_aux(self, flash_service): - assert (flash_service.get_service("tap")._baseurl + assert (flash_service.get_service("tap")._baseurl == "http://dc.zah.uni-heidelberg.de/tap") def test_get_by_alias(self, flash_service): - assert (flash_service.get_service("spectrum")._baseurl + assert (flash_service.get_service("spectrum")._baseurl == "http://dc.zah.uni-heidelberg.de/fhssa?") def test_get_unsupported_standard(self, flash_service): @@ -382,7 +383,7 @@ def test_get_unsupported_standard(self, flash_service): assert str(excinfo.value) == ( "PyVO has no support for interfaces with standard id" " ivo://ivoa.net/std/soda#sync-1.0.") - + def test_get_nonexisting_standard(self, flash_service): with pytest.raises(ValueError) as excinfo: flash_service.get_service("http://nonsense#fancy") @@ -412,9 +413,11 @@ def __init__(self, d): self.fieldnames = list(d.keys()) vals = [regtap.TOKEN_SEP.join(v) if isinstance(v, list) else v for v in d.values()] + class _: class array: data = [vals] + self.resultstable = _ @@ -487,8 +490,8 @@ def test_capless(self): rsc = _makeRegistryRecord({}) with pytest.raises(ValueError) as excinfo: - rsc.service._baseurl - + rsc.service._baseurl + assert str(excinfo.value) == ( "No matching interface.") @@ -565,7 +568,7 @@ def getflashcol(name): assert getflashcol("ssa_specend").unit == "m" - assert (getflashcol("ssa_specend").utype + assert (getflashcol("ssa_specend").utype == "ssa:char.spectralaxis.coverage.bounds.stop") assert (getflashcol("ssa_fluxcalib").description diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index c6f412df6..1beefbfb9 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -49,7 +49,6 @@ class _WithFillers(rtcons.Constraint): return _WithFillers()._get_sql_literals() - def test_strings(self, literals): assert literals["aString"] == "'some harmless stuff'" assert literals["nastyString"] == "'that''s not nasty'" @@ -95,7 +94,7 @@ class TestServicetypeConstraint: def test_standardmap(self): assert (rtcons.Servicetype("scs").get_search_condition() == "standard_id IN ('ivo://ivoa.net/std/conesearch')") - + def test_fulluri(self): assert (rtcons.Servicetype("http://extstandards/invention" ).get_search_condition() @@ -146,7 +145,7 @@ def test_junk_rejected(self): rtcons.Datamodel("junk") assert str(excinfo.value) == ( "Unknown data model id junk. Known are: epntap, obscore, regtap.") - + def test_obscore(self): cons = rtcons.Datamodel("ObsCore") assert (cons.get_search_condition() @@ -220,6 +219,7 @@ def test_SkyCoord_Circle(self): "1 = CONTAINS(MOC(6, CIRCLE(3.0, -30.0, 3)), coverage)") assert(cons._extra_tables==["rr.stc_spatial"]) + class TestSpectralConstraint: # These tests might need some float literal fuzziness. I'm just # too lazy at this point to see if pytest has something on board @@ -385,4 +385,3 @@ def test_group_by_columns(self): "source_format, " "region_of_regard, " "waveband") - From 859049067499919f8aca8c9a0f5756cf27e1df27 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Mon, 17 Jan 2022 11:36:48 +0100 Subject: [PATCH 33/49] Fixes for Birgitta's first review comments. That is: * Changelog mentions PR rather than bugs * __all__ declaration for the rtcons module. --- pyvo/registry/rtcons.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index e5411d895..547926c6b 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -23,6 +23,11 @@ from .import regtap +__all__ = ["Freetext", "Author", "Servicetype", "Waveband", + "Datamodel", "Ivoid", "UCD", "Spatial", "Spectral", "Temporal", + "build_regtap_query"] + + # a mapping of service type shorthands to the ivoids of the # corresponding standards. This is mostly to keep legacy APIs. # In the future, preferably rely on shorten_stdid and expand_stdid From ea4787e3d6cfdad975cb6eb0af731d29010e02e7 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Mon, 17 Jan 2022 14:02:15 +0100 Subject: [PATCH 34/49] Fixing RegistryResource.describe for multi-capability resources. The previous code assumed that typically, records only have one capability, which is no longer true as soon as people do not constrain by servicetype (actually, it hasn't been true before either). So, describe() now gives the various access methods and no longer tries to indicate a specific capability. I have re-shuffled the order of the outputs a bit in consequence. And I wonder if this should show contact information by default. The main counterargument at this point: That requires a network request. --- CHANGES.rst | 2 +- pyvo/registry/regtap.py | 33 +++++++++----------- pyvo/registry/tests/test_regtap.py | 48 +++++++++++++++++++++++++----- 3 files changed, 56 insertions(+), 27 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index b3cfe20b3..b5aa4fa1e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -7,7 +7,7 @@ - Overhaul of the registry.regsearch as discussed in https://blog.g-vo.org/towards-data-discovery-in-pyvo.html. This - should be backwards-compatible. [#278, #238, #176] + should be backwards-compatible. [#289] 1.3.1 (unreleased) ================== diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 42b3c43aa..0a3a43bfe 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -484,7 +484,14 @@ def standard_id(self): """ the IVOA standard identifier """ - return self.get("standard_id", decode=True) + standard_ids = list(set(self["standard_ids"])) + if len(standard_ids)==1: + return standard_ids[0] + else: + raise dalq.DALQueryError( + "This resource supports several standards ({})." + " Use get_service or restrict your query using Servicetype." + .format(", ".join(sorted(self.access_modes())))) def access_modes(self): """ @@ -653,26 +660,16 @@ def describe(self, verbose=False, width=78, file=None): If provided, write information to this output stream. Otherwise, it is written to standard out. """ - restype = "Custom Service" - stdid = self.get("standard_id", decode=True).lower() - if stdid: - if stdid.startswith("ivo://ivoa.net/std/conesearch"): - restype = "Catalog Cone-search Service" - elif stdid.startswith("ivo://ivoa.net/std/sia"): - restype = "Image Data Service" - elif stdid.startswith("ivo://ivoa.net/std/ssa"): - restype = "Spectrum Data Service" - elif stdid.startswith("ivo://ivoa.net/std/slap"): - restype = "Spectral Line Database Service" - elif stdid.startswith("ivo://ivoa.net/std/tap"): - restype = "Table Access Protocol Service" - - print(restype, file=file) print(para_format_desc(self.res_title), file=file) print("Short Name: " + self.short_name, file=file) print("IVOA Identifier: " + self.ivoid, file=file) - if self.access_url: + print("Access modes: " + ", ".join(sorted(self.access_modes())), + file=file) + + try: print("Base URL: " + self.access_url, file=file) + except dalq.DALQueryError: + print("Multi-capabilty service -- use get_service()") if self.res_description: print(file=file) @@ -690,8 +687,6 @@ def describe(self, verbose=False, width=78, file=None): file=file) if verbose: - if self.standard_id: - print("StandardID: " + self.standard_id, file=file) if self.reference_url: print("More info: " + self.reference_url, file=file) diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index df04dd6fb..8ab361ea7 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -4,6 +4,7 @@ Tests for pyvo.registry.regtap """ +import io import re from functools import partial from urllib.parse import parse_qsl @@ -352,6 +353,15 @@ def test_access_modes(self, flash_service): 'datalink#links-1.0', 'soda#sync-1.0', 'ssa', 'tap#aux', 'web'} + def test_standard_id_multi(self, flash_service): + with pytest.raises(dalq.DALQueryError) as excinfo: + _ = flash_service.standard_id + + assert str(excinfo.value) == ("This resource supports several" + " standards (datalink#links-1.0, soda#sync-1.0, ssa," + " tap#aux, web). Use get_service or restrict your query" + " using Servicetype.") + def test_get_web_interface(self, flash_service): svc = flash_service.get_service("web") assert isinstance(svc, @@ -496,19 +506,43 @@ def test_capless(self): "No matching interface.") +@pytest.mark.remote_data +def test_get_contact(): + rsc = _makeRegistryRecord( + {"ivoid": "ivo://org.gavo.dc/flashheros/q/ssa"}) + assert (rsc.get_contact() + == "GAVO Data Center Team (++49 6221 54 1837)" + " ") + + +@pytest.mark.usefixtures('multi_interface_fixture', 'capabilities', + 'flash_service') class TestExtraResourceMethods: """ tests for methods of RegistryResource containing some non-trivial logic (except service selection, which is in TestInterfaceSelection, and get_tables, which is in TestGetTables). """ - @pytest.mark.remote_data - def test_get_contact(self): - rsc = _makeRegistryRecord( - {"ivoid": "ivo://org.gavo.dc/flashheros/q/ssa"}) - assert (rsc.get_contact() - == "GAVO Data Center Team (++49 6221 54 1837)" - " ") + + def test_unique_standard_id(self): + rsc = _makeRegistryRecord({ + "access_urls": ["http://a"], + "standard_ids": ["ivo://ivoa.net/std/tap"], + "intf_types": ["vs:paramhttp"], + "intf_roles": ["std"] + }) + assert rsc.standard_id == "ivo://ivoa.net/std/tap" + + def test_describe_multi(self, flash_service): + out = io.StringIO() + flash_service.describe(verbose=True, file=out) + output = out.getvalue() + + assert "Flash/Heros SSAP" in output + assert ("Access modes: datalink#links-1.0, soda#sync-1.0," + " ssa, tap#aux, web" in output) + + assert "More info: http://dc.zah" in output # TODO: While I suppose the contact test should keep requiring network, From b9bd35e60e6cc4f4d97643a0aaf81200dcad5ba7 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Tue, 18 Jan 2022 11:29:08 +0100 Subject: [PATCH 35/49] The Servicetype constraint now accepts local parts of the ivoid, too. This corresponds to the legacy behaviour. --- pyvo/registry/rtcons.py | 3 +++ pyvo/registry/tests/test_rtcons.py | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 547926c6b..8ca0991f2 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -38,8 +38,11 @@ ("sia", "sia"), ("spectrum", "ssa"), ("ssap", "ssa"), + ("ssa", "ssa"), ("scs", "conesearch"), + ("conesearch", "conesearch"), ("line", "slap"), + ("slap", "slap"), ("table", "tap"), ("tap", "tap"), ]) diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index 1beefbfb9..8d3bbf572 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -121,6 +121,10 @@ def test_junk_rejected(self): " a full standard URI nor one of the bespoke identifiers" " image, sia, spectrum, ssap, scs, line, table, tap") + def test_legacy_term(self): + assert (rtcons.Servicetype("conesearch").get_search_condition() + == "standard_id IN ('ivo://ivoa.net/std/conesearch')") + @pytest.mark.usefixtures('messenger_vocabulary') class TestWavebandConstraint: From 10e4ccbe08a1a9959971d8693ad84e4503e3db77 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Mon, 24 Jan 2022 10:45:39 +0100 Subject: [PATCH 36/49] Adding (back?) source_value to RegistryResource. This addresses review comment https://github.com/astropy/pyvo/pull/289#pullrequestreview-860214883 --- pyvo/registry/regtap.py | 9 +++++++++ pyvo/registry/tests/data/README | 17 ++--------------- pyvo/registry/tests/data/regtap.xml | 24 ++++++++++++------------ pyvo/registry/tests/test_regtap.py | 28 ++++++++++++++++++++++++++++ pyvo/registry/tests/test_rtcons.py | 5 ++++- 5 files changed, 55 insertions(+), 28 deletions(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 0a3a43bfe..696360ded 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -342,6 +342,7 @@ class RegistryResource(dalq.Record): "creator_seq", "content_type", "source_format", + "source_value", "region_of_regard", "waveband", (f"\n ivo_string_agg(COALESCE(access_url, ''), '{TOKEN_SEP}')", @@ -448,6 +449,14 @@ def source_format(self): """ return self.get("source_format", decode=True) + @property + def source_value(self): + """ + The bibliographic source for this resource (typically a bibcode + or a DOI). + """ + return self.get("source_value", decode=True) + @property def region_of_regard(self): """ diff --git a/pyvo/registry/tests/data/README b/pyvo/registry/tests/data/README index 8c6c01dde..4a8559a09 100644 --- a/pyvo/registry/tests/data/README +++ b/pyvo/registry/tests/data/README @@ -1,15 +1,2 @@ -regtap.xml is used as a generic regtap query response in many of -test_regtap's fixtures; most tests don't actually inspect its contents. - -To update it (necessary after changes to regtap.get_RegTAP_query), run -this to update it: - -import requests -from pyvo.registry import regtap - -with open("regtap.xml", "wb") as f: - f.write(requests.get(regtap.REGISTRY_BASEURL+"/sync", { - "LANG": "ADQL", - "QUERY": regtap.get_RegTAP_query( - keywords="pulsar", ucd=["pos.distance"])}).content) - +Instructions for how to update these data items should be found in +the fixtures in test_regtap.py diff --git a/pyvo/registry/tests/data/regtap.xml b/pyvo/registry/tests/data/regtap.xml index e20e51060..f7cf522c9 100644 --- a/pyvo/registry/tests/data/regtap.xml +++ b/pyvo/registry/tests/data/regtap.xml @@ -1,6 +1,6 @@ - Tables containing the information in the IVOA Registry. To query +ivoid, res_type, short_name, res_title, content_level, res_description, reference_url, creator_seq, content_type, source_format, source_value, region_of_regard, waveband"> Tables containing the information in the IVOA Registry. To query these tables, use `our TAP service`_. For more information and example queries, see the `RegTAP specification`_. .. _our TAP service: /__system__/tap/run/info .. _RegTAP -specification: http://www.ivoa.net/documents/RegTAP/ The resources (like services, data collections, organizations) -present in this registry. Tables containing the information in the IVOA Registry. To query +specification: http://www.ivoa.net/documents/RegTAP/ Pieces of behaviour of a resource. Tables containing the information in the IVOA Registry. To query these tables, use `our TAP service`_. For more information and example queries, see the `RegTAP specification`_. .. _our TAP service: /__system__/tap/run/info .. _RegTAP -specification: http://www.ivoa.net/documents/RegTAP/ Information on access modes of a capability. Tables containing the information in the IVOA Registry. To query +specification: http://www.ivoa.net/documents/RegTAP/ Metadata on columns of a resource's tables. Tables containing the information in the IVOA Registry. To query these tables, use `our TAP service`_. For more information and example queries, see the `RegTAP specification`_. .. _our TAP service: /__system__/tap/run/info .. _RegTAP -specification: http://www.ivoa.net/documents/RegTAP/ Metadata on columns of a resource's tables. Tables containing the information in the IVOA Registry. To query +specification: http://www.ivoa.net/documents/RegTAP/ The resources (like services, data collections, organizations) +present in this registry. Tables containing the information in the IVOA Registry. To query these tables, use `our TAP service`_. For more information and example queries, see the `RegTAP specification`_. .. _our TAP service: /__system__/tap/run/info .. _RegTAP -specification: http://www.ivoa.net/documents/RegTAP/ Pieces of behaviour of a resource. Tables containing the information in the IVOA Registry. To query +specification: http://www.ivoa.net/documents/RegTAP/ Information on access modes of a capability. Tables containing the information in the IVOA Registry. To query these tables, use `our TAP service`_. For more information and example queries, see the `RegTAP @@ -51,10 +51,10 @@ specification`_. .. _our TAP service: /__system__/tap/run/info .. _RegTAP specification: http://www.ivoa.net/documents/RegTAP/ Topics, object types, or other descriptive keywords about the -resource.Query successfulFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.resourceFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.interfaceFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.table_columnFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.capabilityFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.res_subject +resource.Query successfulFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.capabilityFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.table_columnFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.resourceFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.interfaceFor advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rr.res_subject
The terms are taken from the vocabulary -http://ivoa.net/rdf/voresource/content_level. +http://ivoa.net/rdf/voresource/content_level. The terms are taken from the vocabulary -http://ivoa.net/rdf/voresource/content_type. +http://ivoa.net/rdf/voresource/content_type. The allowed values for waveband include: -Radio, Millimeter, Infrared, Optical, UV, EUV, X-ray, Gamma-ray.Unambiguous reference to the resource conforming to the IVOA standard for identifiers.Resource type (something like vg:authority, vs:catalogservice, etc).A short name or abbreviation given to something, for presentation in space-constrained fields (up to 16 characters).The full name given to the resource.A hash-separated list of content levels specifying the intended audience.An account of the nature of the resource.URL pointing to a human-readable document describing this resource.The creator(s) of the resource in the order given by the resource record author, separated by semicolons.A hash-separated list of natures or genres of the content of the resource.The format of source_value. This, in particular, can be ``bibcode''.A single numeric value representing the angle, given in decimal degrees, by which a positional query against this resource should be ``blurred'' in order to get an appropriate match.A hash-separated list of regions of the electro-magnetic spectrum that the resource's spectral coverage overlaps with.AAAAHml2bzovL2Nkcy52aXppZXIvai9hK2EvNDkyLzkyMwAAABF2czpjYXRhbG9nc2VydmljZQAAAA1KL0ErQS80OTIvOTIzAAAAMQBQAHUAbABzAGEAcgAgAFQAaQBtAGkAbgBnACAAZgBvAHIAIABGAGUAcgBtAGkAIABHAGEAbQBtAGEALQByAGEAeQAgAFMAcABhAGMAZQAgAFQAZQBsAGUAcwBjAG8AcABlAAAACHJlc2VhcmNoAAADhABXAGUAIABkAGUAcwBjAHIAaQBiAGUAIABhACAAYwBvAG0AcAByAGUAaABlAG4AcwBpAHYAZQAgAHAAdQBsAHMAYQByACAAbQBvAG4AaQB0AG8AcgBpAG4AZwAgAGMAYQBtAHAAYQBpAGcAbgAgAGYAbwByACAAdABoAGUAIABMAGEAcgBnAGUAIABBAHIAZQBhACAAVABlAGwAZQBzAGMAbwBwAGUAIAAoAEwAQQBUACkAIABvAG4AIAB0AGgAZQAgAEYAZQByAG0AaQAgAEcAYQBtAG0AYQAtAHIAYQB5ACAAUwBwAGEAYwBlACAAVABlAGwAZQBzAGMAbwBwAGUAIAAoAGYAbwByAG0AZQByAGwAeQAgAEcATABBAFMAVAApAC4AIABUAGgAZQAgAGQAZQB0AGUAYwB0AGkAbwBuACAAYQBuAGQAIABzAHQAdQBkAHkAIABvAGYAIABwAHUAbABzAGEAcgBzACAAaQBuACAAZwBhAG0AbQBhACAAcgBhAHkAcwAgAGcAaQB2AGUAIABpAG4AcwBpAGcAaAB0AHMAIABpAG4AdABvACAAdABoAGUAIABwAG8AcAB1AGwAYQB0AGkAbwBuAHMAIABvAGYAIABuAGUAdQB0AHIAbwBuACAAcwB0AGEAcgBzACAAYQBuAGQAIABzAHUAcABlAHIAbgBvAHYAYQAgAHIAYQB0AGUAcwAgAGkAbgAgAHQAaABlACAARwBhAGwAYQB4AHkALAAgAGkAbgB0AG8AIABwAGEAcgB0AGkAYwBsAGUAIABhAGMAYwBlAGwAZQByAGEAdABpAG8AbgAgAG0AZQBjAGgAYQBuAGkAcwBtAHMAIABpAG4AIABuAGUAdQB0AHIAbwBuACAAcwB0AGEAcgAgAG0AYQBnAG4AZQB0AG8AcwBwAGgAZQByAGUAcwAsACAAYQBuAGQAIABpAG4AdABvACAAdABoAGUAIAAiAGUAbgBnAGkAbgBlAHMAIgAgAGQAcgBpAHYAaQBuAGcAIABwAHUAbABzAGEAcgAgAHcAaQBuAGQAIABuAGUAYgB1AGwAYQBlAC4AIABMAEEAVAAnAHMAIAB1AG4AcAByAGUAYwBlAGQAZQBuAHQAZQBkACAAcwBlAG4AcwBpAHQAaQB2AGkAdAB5ACAAYgBlAHQAdwBlAGUAbgAgADIAMABNAGUAVgAgAGEAbgBkACAAMwAwADAARwBlAFYAIAB0AG8AZwBlAHQAaABlAHIAIAB3AGkAdABoACAAaQB0AHMAIAAyAC4ANABzAHIAIABmAGkAZQBsAGQALQBvAGYALQB2AGkAZQB3ACAAbQBhAGsAZQBzACAAZABlAHQAZQBjAHQAaQBvAG4AIABvAGYAIABtAGEAbgB5ACAAZwBhAG0AbQBhAC0AcgBhAHkAIABwAHUAbABzAGEAcgBzACAAbABpAGsAZQBsAHkALAAgAGoAdQBzAHQAaQBmAHkAaQBuAGcAIAB0AGgAZQAgAG0AbwBuAGkAdABvAHIAaQBuAGcAIABvAGYAIABvAHYAZQByACAAdAB3AG8AIABoAHUAbgBkAHIAZQBkACAAcAB1AGwAcwBhAHIAcwAgAHcAaQB0AGgAIABsAGEAcgBnAGUAIABzAHAAaQBuAC0AZABvAHcAbgAgAHAAbwB3AGUAcgBzAC4AIABUAG8AIABzAGUAYQByAGMAaAAgAGYAbwByACAAZwBhAG0AbQBhAC0AcgBhAHkAIABwAHUAbABzAGEAdABpAG8AbgBzACAAZgByAG8AbQAgAG0AbwBzAHQAIABvAGYAIAB0AGgAZQBzAGUAIABwAHUAbABzAGEAcgBzACAAcgBlAHEAdQBpAHIAZQBzACAAYQAgAHMAZQB0ACAAbwBmACAAcABoAGEAcwBlAC0AYwBvAG4AbgBlAGMAdABlAGQAIAB0AGkAbQBpAG4AZwAgAHMAbwBsAHUAdABpAG8AbgBzACAAcwBwAGEAbgBuAGkAbgBnACAAYQAgAHkAZQBhAHIAIABvAHIAIABtAG8AcgBlACAAdABvACAAcAByAG8AcABlAHIAbAB5ACAAYQBsAGkAZwBuACAAdABoAGUAIABzAHAAYQByAHMAZQAgAHAAaABvAHQAbwBuACAAYQByAHIAaQB2AGEAbAAgAHQAaQBtAGUAcwAuACAAVwBlACAAZABlAHMAYwByAGkAYgBlACAAdABoAGUAIABjAGgAbwBpAGMAZQAgAG8AZgAgAHAAdQBsAHMAYQByAHMAIABhAG4AZAAgAHQAaABlACAAaQBuAHMAdAByAHUAbQBlAG4AdABzACAAaQBuAHYAbwBsAHYAZQBkACAAaQBuACAAdABoAGUAIABjAGEAbQBwAGEAaQBnAG4ALgAAADJodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9BK0EvNDkyLzkyMwAAAXkAUwBtAGkAdABoACAARAAuAEEALgA7ACAARwB1AGkAbABsAGUAbQBvAHQAIABMAC4AOwAgAEMAYQBtAGkAbABvACAARgAuADsAIABDAG8AZwBuAGEAcgBkACAASQAuADsAIABEAHUAbQBvAHIAYQAgAEQALgA7ACAARQBzAHAAaQBuAG8AegBhACAAQwAuADsAIABGAHIAZQBpAHIAZQAgAFAALgBDAC4AQwAuADsAIABHAG8AdAB0AGgAZQBsAGYAIABFAC4AVgAuADsAIABIAGEAcgBkAGkAbgBnACAAQQAuAEsALgA7ACAASABvAGIAYgBzACAARwAuAEIALgA7ACAASgBvAGgAbgBzAHQAbwBuACAAUwAuADsAIABLAGEAcwBwAGkAIABWAC4ATQAuADsAIABLAHIAYQBtAGUAcgAgAE0ALgA7ACAATABpAHYAaQBuAGcAcwB0AG8AbgBlACAATQAuAEEALgA7ACAATAB5AG4AZQAgAEEALgBHAC4AOwAgAE0AYQBuAGMAaABlAHMAdABlAHIAIABSAC4ATgAuADsAIABNAGEAcgBzAGgAYQBsAGwAIABGAC4ARQAuADsAIABNAGMATABhAHUAZwBoAGwAaQBuACAATQAuAEEALgA7ACAATgBvAHUAdABzAG8AcwAgAEEALgA7ACAAUgBhAG4AcwBvAG0AIABTAC4ATQAuADsAIABSAG8AYgBlAHIAdABzACAATQAuAFMALgBFAC4AOwAgAFIAbwBtAGEAbgBpACAAUgAuAFcALgA7ACAAUwB0AGEAcABwAGUAcgBzACAAQgAuAFcALgA7ACAAVABoAGUAdQByAGUAYQB1ACAARwAuADsAIABUAGgAbwBtAHAAcwBvAG4AIABEAC4ASgAuADsAIABUAGgAbwByAHMAZQB0AHQAIABTAC4ARQAuADsAIABXAGEAbgBnACAATgAuADsAIABXAGUAbAB0AGUAdgByAGUAZABlACAAUAAuAAAAB2NhdGFsb2cAAAAHYmliY29kZX/AAAAAAAAPZ2FtbWEtcmF5I3JhZGlvAAABFmh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNDkyLzkyMy90YWJsZTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL0ErQS80OTIvOTIzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovQStBLzQ5Mi85MjM6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwAAAAZGl2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXgAAABednM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADNzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAdaXZvOi8vY2RzLnZpemllci9qL2ErYS82MTIvYTEAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAMSi9BK0EvNjEyL0ExAAAAHgBIAC4ARQAuAFMALgBTAC4AIABHAGEAbABhAGMAdABpAGMAIABQAGwAYQBuAGUAIABTAHUAcgB2AGUAeQAAAAhyZXNlYXJjaAAACCoAVwBlACAAcAByAGUAcwBlAG4AdAAgAHQAaABlACAAcgBlAHMAdQBsAHQAcwAgAG8AZgAgAHQAaABlACAAbQBvAHMAdAAgAGMAbwBtAHAAcgBlAGgAZQBuAHMAaQB2AGUAIABzAHUAcgB2AGUAeQAgAG8AZgAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlACAAaQBuACAAdgBlAHIAeQAgAGgAaQBnAGgALQBlAG4AZQByAGcAeQAgACgAVgBIAEUAKQAgAGcAYQBtAG0AYQAtAHIAYQB5AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQAgAHAAdQBiAGwAaQBjACAAcgBlAGwAZQBhAHMAZQAgAG8AZgAgAEcAYQBsAGEAYwB0AGkAYwAgAHMAawB5ACAAbQBhAHAAcwAsACAAYQAgAGMAYQB0AGEAbABvAGcAIABvAGYAIABWAEgARQAgAHMAbwB1AHIAYwBlAHMALAAgAGEAbgBkACAAdABoAGUAIABkAGkAcwBjAG8AdgBlAHIAeQAgAG8AZgAgADEANgAgAG4AZQB3ACAAcwBvAHUAcgBjAGUAcwAgAG8AZgAgAFYASABFACAAZwBhAG0AbQBhAC0AcgBhAHkAcwAuACAAVABoAGUAIABIAGkAZwBoACAARQBuAGUAcgBnAHkAIABTAHAAZQBjAHQAcgBvAHMAYwBvAHAAaQBjACAAUwB5AHMAdABlAG0AIAAoAEgALgBFAC4AUwAuAFMALgApACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlACAAcwB1AHIAdgBlAHkAIAAoAEgARwBQAFMAKQAgAHcAYQBzACAAYQAgAGQAZQBjAGEAZABlAC0AbABvAG4AZwAgAG8AYgBzAGUAcgB2AGEAdABpAG8AbgAgAHAAcgBvAGcAcgBhAG0AIABjAGEAcgByAGkAZQBkACAAbwB1AHQAIABiAHkAIAB0AGgAZQAgAEgALgBFAC4AUwAuAFMALgAgAEkAIABhAHIAcgBhAHkAIABvAGYAIABDAGgAZQByAGUAbgBrAG8AdgAgAHQAZQBsAGUAcwBjAG8AcABlAHMAIABpAG4AIABOAGEAbQBpAGIAaQBhACAAZgByAG8AbQAgADIAMAAwADQAIAB0AG8AIAAyADAAMQAzAC4AIABUAGgAZQAgAG8AYgBzAGUAcgB2AGEAdABpAG8AbgBzACAAYQBtAG8AdQBuAHQAIAB0AG8AIABuAGUAYQByAGwAeQAgADIANwAwADAAIABoACAAbwBmACAAcQB1AGEAbABpAHQAeQAtAHMAZQBsAGUAYwB0AGUAZAAgAGQAYQB0AGEALAAgAGMAbwB2AGUAcgBpAG4AZwAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlACAAYQB0ACAAbABvAG4AZwBpAHQAdQBkAGUAcwAgAGYAcgBvAG0AIABsAD0AMgA1ADAAewBkAGUAZwB9ACAAdABvACAANgA1AHsAZABlAGcAfQAgAGEAbgBkACAAbABhAHQAaQB0AHUAZABlAHMAIAB8AGIAfAA8AD0AMwAuACAASQBuACAAYQBkAGQAaQB0AGkAbwBuACAAdABvACAAdABoAGUAIAB1AG4AcAByAGUAYwBlAGQAZQBuAHQAZQBkACAAcwBwAGEAdABpAGEAbAAgAGMAbwB2AGUAcgBhAGcAZQAsACAAdABoAGUAIABIAEcAUABTACAAYQBsAHMAbwAgAGYAZQBhAHQAdQByAGUAcwAgAGEAIAByAGUAbABhAHQAaQB2AGUAbAB5ACAAaABpAGcAaAAgAGEAbgBnAHUAbABhAHIAIAByAGUAcwBvAGwAdQB0AGkAbwBuACAAKAAwAC4AMAA4AHsAZABlAGcAfQB+ADUALQBhAHIAYwBtAGkAbgAgAG0AZQBhAG4AIABwAG8AaQBuAHQAIABzAHAAcgBlAGEAZAAgAGYAdQBuAGMAdABpAG8AbgAgADYAOAAlACAAYwBvAG4AdABhAGkAbgBtAGUAbgB0ACAAcgBhAGQAaQB1AHMAKQAsACAAcwBlAG4AcwBpAHQAaQB2AGkAdAB5ACAAKAAxAC4ANQAlACAAQwByAGEAYgAgAGYAbAB1AHgAIABmAG8AcgAgAHAAbwBpAG4AdAAtAGwAaQBrAGUAIABzAG8AdQByAGMAZQBzACkALAAgAGEAbgBkACAAZQBuAGUAcgBnAHkAIAByAGEAbgBnAGUAIAAoADAALgAyAC0AMQAwADAAVABlAFYAKQAuACAAVwBlACAAYwBvAG4AcwB0AHIAdQBjAHQAZQBkACAAYQAgAGMAYQB0AGEAbABvAGcAIABvAGYAIABWAEgARQAgAGcAYQBtAG0AYQAtAHIAYQB5ACAAcwBvAHUAcgBjAGUAcwAgAGYAcgBvAG0AIAB0AGgAZQAgAEgARwBQAFMAIABkAGEAdABhACAAcwBlAHQAIAB3AGkAdABoACAAYQAgAHMAeQBzAHQAZQBtAGEAdABpAGMAIABwAHIAbwBjAGUAZAB1AHIAZQAgAGYAbwByACAAYgBvAHQAaAAgAHMAbwB1AHIAYwBlACAAZABlAHQAZQBjAHQAaQBvAG4AIABhAG4AZAAgAGMAaABhAHIAYQBjAHQAZQByAGkAegBhAHQAaQBvAG4AIABvAGYAIABtAG8AcgBwAGgAbwBsAG8AZwB5ACAAYQBuAGQAIABzAHAAZQBjAHQAcgB1AG0ALgAgAFcAZQAgAHAAcgBlAHMAZQBuAHQAIAB0AGgAaQBzACAAbABpAGsAZQBsAGkAaABvAG8AZAAtACAAYgBhAHMAZQBkACAAbQBlAHQAaABvAGQAIABpAG4AIABkAGUAdABhAGkAbAAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIAB0AGgAZQAgAGkAbgB0AHIAbwBkAHUAYwB0AGkAbwBuACAAbwBmACAAYQAgAG0AbwBkAGUAbAAgAGMAbwBtAHAAbwBuAGUAbgB0ACAAdABvACAAYQBjAGMAbwB1AG4AdAAgAGYAbwByACAAdQBuAHIAZQBzAG8AbAB2AGUAZAAsACAAbABhAHIAZwBlAC0AcwBjAGEAbABlACAAZQBtAGkAcwBzAGkAbwBuACAAYQBsAG8AbgBnACAAdABoAGUAIABHAGEAbABhAGMAdABpAGMAIABwAGwAYQBuAGUALgAgAEkAbgAgAHQAbwB0AGEAbAAsACAAdABoAGUAIAByAGUAcwB1AGwAdABpAG4AZwAgAEgARwBQAFMAIABjAGEAdABhAGwAbwBnACAAYwBvAG4AdABhAGkAbgBzACAANwA4ACAAVgBIAEUAIABzAG8AdQByAGMAZQBzACwAIABvAGYAIAB3AGgAaQBjAGgAIAAxADQAIABhAHIAZQAgAG4AbwB0ACAAcgBlAGEAbgBhAGwAeQB6AGUAZAAgAGgAZQByAGUALAAgAGYAbwByACAAZQB4AGEAbQBwAGwAZQAsACAAZAB1AGUAIAB0AG8AIAB0AGgAZQBpAHIAIABjAG8AbQBwAGwAZQB4ACAAbQBvAHIAcABoAG8AbABvAGcAeQAsACAAbgBhAG0AZQBsAHkAIABzAGgAZQBsAGwALQBsAGkAawBlACAAcwBvAHUAcgBjAGUAcwAgAGEAbgBkACAAdABoAGUAIABHAGEAbABhAGMAdABpAGMAIABjAGUAbgB0AGUAcgAgAHIAZQBnAGkAbwBuAC4AIABXAGgAZQByAGUAIABwAG8AcwBzAGkAYgBsAGUALAAgAHcAZQAgAHAAcgBvAHYAaQBkAGUAIABhACAAZgBpAHIAbQAgAGkAZABlAG4AdABpAGYAaQBjAGEAdABpAG8AbgAgAG8AZgAgAHQAaABlACAAVgBIAEUAIABzAG8AdQByAGMAZQAgAG8AcgAgAHAAbABhAHUAcwBpAGIAbABlACAAYQBzAHMAbwBjAGkAYQB0AGkAbwBuAHMAIAB3AGkAdABoACAAcwBvAHUAcgBjAGUAcwAgAGkAbgAgAG8AdABoAGUAcgAgAGEAcwB0AHIAbwBuAG8AbQBpAGMAYQBsACAAYwBhAHQAYQBsAG8AZwBzAC4AIABXAGUAIABhAGwAcwBvACAAcwB0AHUAZABpAGUAZAAgAHQAaABlACAAYwBoAGEAcgBhAGMAdABlAHIAaQBzAHQAaQBjAHMAIABvAGYAIAB0AGgAZQAgAFYASABFACAAcwBvAHUAcgBjAGUAcwAgAHcAaQB0AGgAIABzAG8AdQByAGMAZQAgAHAAYQByAGEAbQBlAHQAZQByACAAZABpAHMAdAByAGkAYgB1AHQAaQBvAG4AcwAuACAAMQA2ACAAbgBlAHcAIABzAG8AdQByAGMAZQBzACAAdwBlAHIAZQAgAHAAcgBlAHYAaQBvAHUAcwBsAHkAIAB1AG4AawBuAG8AdwBuACAAbwByACAAdQBuAHAAdQBiAGwAaQBzAGgAZQBkACwAIABhAG4AZAAgAHcAZQAgAGkAbgBkAGkAdgBpAGQAdQBhAGwAbAB5ACAAZABpAHMAYwB1AHMAcwAgAHQAaABlAGkAcgAgAGkAZABlAG4AdABpAGYAaQBjAGEAdABpAG8AbgBzACAAbwByACAAcABvAHMAcwBpAGIAbABlACAAYQBzAHMAbwBjAGkAYQB0AGkAbwBuAHMALgAgAFcAZQAgAGYAaQByAG0AbAB5ACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgADMAMQAgAHMAbwB1AHIAYwBlAHMAIABhAHMAIABwAHUAbABzAGEAcgAgAHcAaQBuAGQAIABuAGUAYgB1AGwAYQBlACAAKABQAFcATgBlACkALAAgAHMAdQBwAGUAcgBuAG8AdgBhACAAcgBlAG0AbgBhAG4AdABzACAAKABTAE4AUgBzACkALAAgAGMAbwBtAHAAbwBzAGkAdABlACAAUwBOAFIAcwAsACAAbwByACAAZwBhAG0AbQBhAC0AcgBhAHkAIABiAGkAbgBhAHIAaQBlAHMALgAgAEEAbQBvAG4AZwAgAHQAaABlACAANAA3ACAAcwBvAHUAcgBjAGUAcwAgAG4AbwB0ACAAeQBlAHQAIABpAGQAZQBuAHQAaQBmAGkAZQBkACwAIABtAG8AcwB0ACAAbwBmACAAdABoAGUAbQAgACgAMwA2ACkAIABoAGEAdgBlACAAcABvAHMAcwBpAGIAbABlACAAYQBzAHMAbwBjAGkAYQB0AGkAbwBuAHMAIAB3AGkAdABoACAAYwBhAHQAYQBsAG8AZwBlAGQAIABvAGIAagBlAGMAdABzACwAIABuAG8AdABhAGIAbAB5ACAAUABXAE4AZQAgAGEAbgBkACAAZQBuAGUAcgBnAGUAdABpAGMAIABwAHUAbABzAGEAcgBzACAAdABoAGEAdAAgAGMAbwB1AGwAZAAgAHAAbwB3AGUAcgAgAFYASABFACAAUABXAE4AZQAuAAAAMWh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL0ErQS82MTIvQTEAAAysAEgALgBFAC4AUwAuAFMALgAgAEMAbwBsAGwAYQBiAG8AcgBhAHQAaQBvAG4AOwAgAEEAYgBkAGEAbABsAGEAIABIAC4AOwAgAEEAYgByAGEAbQBvAHcAcwBrAGkAIABBAC4AOwAgAEEAaABhAHIAbwBuAGkAYQBuACAARgAuADsAIABBAGkAdAAgAEIAZQBuAGsAaABhAGwAaQAgAEYALgA7ACAAQQBuAGcAdQBlAG4AZQByACAARQAuAE8ALgA7ACAAQQByAGEAawBhAHcAYQAgAE0ALgA7ACAAQQByAHIAaQBlAHQAYQAgAE0ALgA7ACAAQQB1AGIAZQByAHQAIABQAC4AOwAgAEIAYQBjAGsAZQBzACAATQAuADsAIABCAGEAbAB6AGUAcgAgAEEALgA7ACAAQgBhAHIAbgBhAHIAZAAgAE0ALgA7ACAAQgBlAGMAaABlAHIAaQBuAGkAIABZAC4AOwAgAEIAZQBjAGsAZQByACAAVABqAHUAcwAgAEoALgA7ACAAQgBlAHIAZwBlACAARAAuADsAIABCAGUAcgBuAGgAYQByAGQAIABTAC4AOwAgAEIAZQByAG4AbABvAGUAaAByACAASwAuADsAIABCAGwAYQBjAGsAdwBlAGwAbAAgAFIALgA7ACAAQgBvAGUAdAB0AGMAaABlAHIAIABNAC4AOwAgAEIAbwBpAHMAcwBvAG4AIABDAC4AOwAgAEIAbwBsAG0AbwBuAHQAIABKAC4AOwAgAEIAbwBuAG4AZQBmAG8AeQAgAFMALgA7ACAAQgBvAHIAZABhAHMAIABQAC4AOwAgAEIAcgBlAGcAZQBvAG4AIABKAC4AOwAgAEIAcgB1AG4AIABGAC4AOwAgAEIAcgB1AG4AIABQAC4AOwAgAEIAcgB5AGEAbgAgAE0ALgA7ACAAQgB1AGUAYwBoAGUAbABlACAATQAuADsAIABCAHUAbABpAGsAIABUAC4AOwAgAEMAYQBwAGEAcwBzAG8AIABNAC4AOwAgAEMAYQByAHIAaQBnAGEAbgAgAFMALgA7ACAAQwBhAHIAbwBmAGYAIABTAC4AOwAgAEMAYQByAG8AcwBpACAAQQAuADsAIABDAGEAcwBhAG4AbwB2AGEAIABTAC4AOwAgAEMAZQByAHIAdQB0AGkAIABNAC4AOwAgAEMAaABhAGsAcgBhAGIAbwByAHQAeQAgAE4ALgA7ACAAQwBoAGEAdgBlAHMAIABSAC4AQwAuAEcALgA7ACAAQwBoAGUAbgAgAEEALgA7ACAAQwBoAGUAdgBhAGwAaQBlAHIAIABKAC4AOwAgAEMAbwBsAGEAZgByAGEAbgBjAGUAcwBjAG8AIABTAC4AOwAgAEMAbwBuAGQAbwBuACAAQgAuADsAIABDAG8AbgByAGEAZAAgAEoALgA7ACAARABhAHYAaQBkAHMAIABJAC4ARAAuADsAIABEAGUAYwBvAGMAawAgAEoALgA7ACAARABlAGkAbAAgAEMALgA7ACAARABlAHYAaQBuACAASgAuADsAIABkAGUAVwBpAGwAdAAgAFAALgA7ACAARABpAHIAcwBvAG4AIABMAC4AOwAgAEQAagBhAG4AbgBhAHQAaQAtAEEAdABhAGkAIABBAC4AOwAgAEQAbwBtAGEAaQBuAGsAbwAgAFcALgA7ACAARABvAG4AYQB0AGgAIABBAC4AOwAgAEQAcgB1AHIAeQAgAEwALgBPACcAQwAuADsAIABEAHUAdABzAG8AbgAgAEsALgA7ACAARAB5AGsAcwAgAEoALgA7ACAARQBkAHcAYQByAGQAcwAgAFQALgA7ACAARQBnAGIAZQByAHQAcwAgAEsALgA7ACAARQBnAGUAcgAgAFAALgA7ACAARQBtAGUAcgB5ACAARwAuADsAIABFAHIAbgBlAG4AdwBlAGkAbgAgAEoALgAtAFAALgA7ACAARQBzAGMAaABiAGEAYwBoACAAUwAuADsAIABGAGEAcgBuAGkAZQByACAAQwAuADsAIABGAGUAZwBhAG4AIABTAC4AOwAgAEYAZQByAG4AYQBuAGQAZQBzACAATQAuAFYALgA7ACAARgBpAGEAcwBzAG8AbgAgAEEALgA7ACAARgBvAG4AdABhAGkAbgBlACAARwAuADsAIABGAG8AZQByAHMAdABlAHIAIABBAC4AOwAgAEYAdQBuAGsAIABTAC4AOwAgAEYAdQBlAHMAcwBsAGkAbgBnACAATQAuADsAIABHAGEAYgBpAGMAaQAgAFMALgA7ACAARwBhAGwAbABhAG4AdAAgAFkALgBBAC4AOwAgAEcAYQByAHIAaQBnAG8AdQB4ACAAVAAuADsAIABHAGEAcwB0ACAASAAuADsAIABHAGEAdABlACAARgAuADsAIABHAGkAYQB2AGkAdAB0AG8AIABHAC4AOwAgAEcAaQBlAGIAZQBsAHMAIABCAC4AOwAgAEcAbABhAHcAaQBvAG4AIABEAC4AOwAgAEcAbABpAGMAZQBuAHMAdABlAGkAbgAgAEoALgBGAC4AOwAgAEcAbwB0AHQAcwBjAGgAYQBsAGwAIABEAC4AOwAgAEcAcgBvAG4AZABpAG4AIABNAC4ALQBIAC4AOwAgAEgAYQBoAG4AIABKAC4AOwAgAEgAYQB1AHAAdAAgAE0ALgA7ACAASABhAHcAawBlAHMAIABKAC4AOwAgAEgAZQBpAG4AegBlAGwAbQBhAG4AbgAgAEcALgA7ACAASABlAG4AcgBpACAARwAuADsAIABIAGUAcgBtAGEAbgBuACAARwAuADsAIABIAGkAbgB0AG8AbgAgAEoALgBBAC4AOwAgAEgAbwBmAG0AYQBuAG4AIABXAC4AOwAgAEgAbwBpAHMAYwBoAGUAbgAgAEMALgA7ACAASABvAGwAYwBoACAAVAAuAEwALgA7ACAASABvAGwAbABlAHIAIABNAC4AOwAgAEgAbwByAG4AcwAgAEQALgA7ACAASQB2AGEAcwBjAGUAbgBrAG8AIABBAC4AOwAgAEkAdwBhAHMAYQBrAGkAIABIAC4AOwAgAEoAYQBjAGgAbwBsAGsAbwB3AHMAawBhACAAQQAuADsAIABKAGEAbQByAG8AegB5ACAATQAuADsAIABKAGEAbgBrAG8AdwBzAGsAeQAgAEQALgA7ACAASgBhAG4AawBvAHcAcwBrAHkAIABGAC4AOwAgAEoAaQBuAGcAbwAgAE0ALgA7ACAASgBvAHUAdgBpAG4AIABMAC4AOwAgAEoAdQBuAGcALQBSAGkAYwBoAGEAcgBkAHQAIABJAC4AOwAgAEsAYQBzAHQAZQBuAGQAaQBlAGMAawAgAE0ALgBBAC4AOwAgAEsAYQB0AGEAcgB6AHkATgBzAGsAaQAgAEsALgA7ACAASwBhAHQAcwB1AHIAYQBnAGEAdwBhACAATQAuADsAIABLAGEAdAB6ACAAVQAuADsAIABLAGUAcgBzAHoAYgBlAHIAZwAgAEQALgA7ACAASwBoAGEAbgBnAHUAbAB5AGEAbgAgAEQALgA7ACAASwBoAGUAbABpAGYAaQAgAEIALgA7ACAASwBpAG4AZwAgAEoALgA7ACAASwBsAGUAcABzAGUAcgAgAFMALgA7ACAASwBsAG8AYwBoAGsAbwB2ACAARAAuADsAIABLAGwAdQB6AG4AaQBhAGsAIABXAC4AOwAgAEsAbwBtAGkAbgAgAE4AdQAuADsAIABLAG8AcwBhAGMAawAgAEsALgA7ACAASwByAGEAawBhAHUAIABTAC4AOwAgAEsAcgBhAHUAcwAgAE0ALgA7ACAASwByAHUAZQBnAGUAcgAgAFAALgBQAC4AOwAgAEwAYQBmAGYAbwBuACAASAAuADsAIABMAGEAbQBhAG4AbgBhACAARwAuADsAIABMAGEAdQAgAEoALgA7ACAATABlAGUAcwAgAEoALgAtAFAALgA7ACAATABlAGYAYQB1AGMAaABlAHUAcgAgAEoALgA7ACAATABlAG0AaQBlAHIAZQAgAEEALgA7ACAATABlAG0AbwBpAG4AZQAtAEcAbwB1AG0AYQByAGQAIABNAC4AOwAgAEwAZQBuAGEAaQBuACAASgAuAC0AUAAuADsAIABMAGUAcwBlAHIAIABFAC4AOwAgAEwAbwBoAHMAZQAgAFQALgA7ACAATABvAHIAZQBuAHQAegAgAE0ALgA7ACAATABpAHUAIABSAC4AOwAgAEwAbwBwAGUAegAtAEMAbwB0AG8AIABSAC4AOwAgAEwAeQBwAG8AdgBhACAASQAuADsAIABNAGEAcgBhAG4AZABvAG4AIABWAC4AOwAgAE0AYQBsAHkAcwBoAGUAdgAgAEQALgA7ACAATQBhAHIAYwBvAHcAaQB0AGgAIABBAC4AOwAgAE0AYQByAGkAYQB1AGQAIABDAC4AOwAgAE0AYQByAHgAIABSAC4AOwAgAE0AYQB1AHIAaQBuACAARwAuADsAIABNAGEAeAB0AGUAZAAgAE4ALgA7ACAATQBhAHkAZQByACAATQAuADsAIABNAGUAaQBuAHQAagBlAHMAIABQAC4ASgAuADsAIABNAGUAeQBlAHIAIABNAC4AOwAgAE0AaQB0AGMAaABlAGwAbAAgAEEALgBNAC4AVwAuADsAIABNAG8AZABlAHIAcwBrAGkAIABSAC4AOwAgAE0AbwBoAGEAbQBlAGQAIABNAC4AOwAgAE0AbwBoAHIAbQBhAG4AbgAgAEwALgA7ACAATQBvAHIAYQAgAEsALgA7ACAATQBvAHUAbABpAG4AIABFAC4AOwAgAE0AdQByAGEAYwBoACAAVAAuADsAIABOAGEAawBhAHMAaABpAG0AYQAgAFMALgA7ACAAZABlACAATgBhAHUAcgBvAGkAcwAgAE0ALgA7ACAATgBkAGkAeQBhAHYAYQBsAGEAIABIAC4AOwAgAE4AaQBlAGQAZQByAHcAYQBuAGcAZQByACAARgAuADsAIABOAGkAZQBtAGkAZQBjACAASgAuADsAIABPAGEAawBlAHMAIABMAC4AOwAgAE8AJwBCAHIAaQBlAG4AIABQAC4AOwAgAE8AZABhAGsAYQAgAEgALgA7ACAATwBoAG0AIABTAC4AOwAgAE8AcwB0AHIAbwB3AHMAawBpACAATQAuADsAIABPAHkAYQAgAEkALgA7ACAAUABhAGQAbwB2AGEAbgBpACAATQAuADsAIABQAGEAbgB0AGUAcgAgAE0ALgA7ACAAUABhAHIAcwBvAG4AcwAgAFIALgBEAC4AOwAgAFAAYQB6ACAAQQByAHIAaQBiAGEAcwAgAE0ALgA7ACAAUABlAGsAZQB1AHIAIABOAC4AVwAuADsAIABQAGUAbABsAGUAdABpAGUAcgAgAEcALgA7ACAAUABlAHIAZQBuAG4AZQBzACAAQwAuADsAIABQAGUAdAByAHUAYwBjAGkAIABQAC4ALQBPAC4AOwAgAFAAZQB5AGEAdQBkACAAQgAuADsAIABQAGkAZQBsACAAUQAuADsAIABQAGkAdABhACAAUwAuADsAIABQAG8AaQByAGUAYQB1ACAAVgAuADsAIABQAG8AbwBuACAASAAuADsAIABQAHIAbwBrAGgAbwByAG8AdgAgAEQALgA7ACAAUAByAG8AawBvAHAAaAAgAEgALgA7ACAAUAB1AGUAaABsAGgAbwBmAGUAcgAgAEcALgA7ACAAUAB1AG4AYwBoACAATQAuADsAIABRAHUAaQByAHIAZQBuAGIAYQBjAGgAIABBAC4AOwAgAFIAYQBhAGIAIABTAC4AOwAgAFIAYQB1AHQAaAAgAFIALgA7ACAAUgBlAGkAbQBlAHIAIABBAC4AOwAgAFIAZQBpAG0AZQByACAATwAuADsAIABSAGUAbgBhAHUAZAAgAE0ALgA7ACAAZABlACAAbABvAHMAIABSAGUAeQBlAHMAIABSAC4AOwAgAFIAaQBlAGcAZQByACAARgAuADsAIABSAGkAbgBjAGgAaQB1AHMAbwAgAEwALgA7ACAAUgBvAG0AbwBsAGkAIABDAC4AOwAgAFIAbwB3AGUAbABsACAARwAuADsAIABSAHUAZABhAGsAIABCAC4AOwAgAFIAdQBsAHQAZQBuACAAQwAuAEIALgA7ACAAUwBhAGYAaQAtAEgAYQByAGIAIABTAC4AOwAgAFMAYQBoAGEAawBpAGEAbgAgAFYALgA7ACAAUwBhAGkAdABvACAAUwAuADsAIABTAGEAbgBjAGgAZQB6ACAARAAuAEEALgA7ACAAUwBhAG4AdABhAG4AZwBlAGwAbwAgAEEALgA7ACAAUwBhAHMAYQBrAGkAIABNAC4AOwAgAFMAYwBoAGEAbgBkAHIAaQAgAE0ALgA7ACAAUwBjAGgAbABpAGMAawBlAGkAcwBlAHIAIABSAC4AOwAgAFMAYwBoAHUAZQBzAHMAbABlAHIAIABGAC4AOwAgAFMAYwBoAHUAbAB6ACAAQQAuADsAIABTAGMAaAB3AGEAbgBrAGUAIABVAC4AOwAgAFMAYwBoAHcAZQBtAG0AZQByACAAUwAuADsAIABTAGUAZwBsAGEAcgAtAEEAcgByAG8AeQBvACAATQAuADsAIABTAGUAdAB0AGkAbQBvACAATQAuADsAIABTAGUAeQBmAGYAZQByAHQAIABBAC4AUwAuADsAIABTAGgAYQBmAGkAIABOAC4AOwAgAFMAaABpAGwAbwBuACAASQAuADsAIABTAGgAaQBuAGkAbgBnAGEAeQBhAG0AdwBlACAASwAuADsAIABTAGkAbQBvAG4AaQAgAFIALgA7ACAAUwBvAGwAIABIAC4AOwAgAFMAcABhAG4AaQBlAHIAIABGAC4AOwAgAFMAcABpAHIALQBKAGEAYwBvAGIAIABNAC4AOwAgAFMAdABhAHcAYQByAHoAIABMAC4AOwAgAFMAdABlAGUAbgBrAGEAbQBwACAAUgAuADsAIABTAHQAZQBnAG0AYQBuAG4AIABDAC4AOwAgAFMAdABlAHAAcABhACAAQwAuADsAIABTAHUAcwBoAGMAaAAgAEkALgA7ACAAVABhAGsAYQBoAGEAcwBoAGkAIABUAC4AOwAgAFQAYQB2AGUAcgBuAGUAdAAgAEoALgAtAFAALgA7ACAAVABhAHYAZQByAG4AaQBlAHIAIABUAC4AOwAgAFQAYQB5AGwAbwByACAAQQAuAE0ALgA7ACAAVABlAHIAcgBpAGUAcgAgAFIALgA7ACAAVABpAGIAYQBsAGQAbwAgAEwALgA7ACAAVABpAHoAaQBhAG4AaQAgAEQALgA7ACAAVABsAHUAYwB6AHkAawBvAG4AdAAgAE0ALgA7ACAAVAByAGkAYwBoAGEAcgBkACAAQwAuADsAIABUAHMAaQByAG8AdQAgAE0ALgA7ACAAVABzAHUAagBpACAATgAuADsAIABUAHUAZgBmAHMAIABSAC4AOwAgAFUAYwBoAGkAeQBhAG0AYQAgAFkALgA7ACAAdgBhAG4AIABkAGUAcgAgAFcAYQBsAHQAIABEAC4ASgAuADsAIAB2AGEAbgAgAEUAbABkAGkAawAgAEMALgA7ACAAdgBhAG4AIABSAGUAbgBzAGIAdQByAGcAIABDAC4AOwAgAHYAYQBuACAAUwBvAGUAbABlAG4AIABCAC4AOwAgAFYAYQBzAGkAbABlAGkAYQBkAGkAcwAgAEcALgA7ACAAVgBlAGgAIABKAC4AOwAgAFYAZQBuAHQAZQByACAAQwAuADsAIABWAGkAYQBuAGEAIABBAC4AOwAgAFYAaQBuAGMAZQBuAHQAIABQAC4AOwAgAFYAaQBuAGsAIABKAC4AOwAgAFYAbwBpAHMAaQBuACAARgAuADsAIABWAG8AZQBsAGsAIABIAC4ASgAuADsAIABWAHUAaQBsAGwAYQB1AG0AZQAgAFQALgA7ACAAVwBhAGQAaQBhAHMAaQBuAGcAaAAgAFoALgA7ACAAVwBhAGcAbgBlAHIAIABTAC4ASgAuADsAIABXAGEAZwBuAGUAcgAgAFAALgA7ACAAVwBhAGcAbgBlAHIAIABSAC4ATQAuADsAIABXAGgAaQB0AGUAIABSAC4AOwAgAFcAaQBlAHIAegBjAGgAbwBsAHMAawBhACAAQQAuADsAIABXAGkAbABsAG0AYQBuAG4AIABQAC4AOwAgAFcAbwBlAHIAbgBsAGUAaQBuACAAQQAuADsAIABXAG8AdQB0AGUAcgBzACAARAAuADsAIABZAGEAbgBnACAAUgAuADsAIABaAGEAYgBvAHIAbwB2ACAARAAuADsAIABaAGEAYwBoAGEAcgBpAGEAcwAgAE0ALgA7ACAAWgBhAG4AaQBuACAAUgAuADsAIABaAGQAegBpAGEAcgBzAGsAaQAgAEEALgBBAC4AOwAgAFoAZQBjAGgAIABBAC4AOwAgAFoAZQBmAGkAIABGAC4AOwAgAFoAaQBlAGcAbABlAHIAIABBAC4AOwAgAFoAbwByAG4AIABKAC4AOwAgAFoAeQB3AHUAYwBrAGEAIABOAC4AAAAHY2F0YWxvZwAAAAdiaWJjb2Rlf8AAAAAAAAlnYW1tYS1yYXkAAASraHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL3NucmNhdD86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYxMi9BMS9sc2NvbXA/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTIvQTEvY29tcG9uPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0ErQS82MTIvQTE6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYxMi9BMS9saXN0Pzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL3NvdXJjZXM/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTIvQTEvc25yY2F0Pzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL2xzY29tcD86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYxMi9BMS9jb21wb24/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0ErQS82MTIvQTE6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQStBLzYxMi9BMTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL2xpc3Q/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTIvQTEvc291cmNlcz86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQStBLzYxMi9BMQAAAjdpdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6OjoAAAGjdnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXIAAAEFc3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6AAAAH2l2bzovL2Nkcy52aXppZXIvai9hK2EvNjE4L2ExODYAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAOSi9BK0EvNjE4L0ExODYAAAAdAEQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAbwBmACAAMQAwACAAcAB1AGwAcwBhAHIAcwAAAAhyZXNlYXJjaAAABwUAUAB1AGwAcwBhAHIAcwAgAHMAYwBpAG4AdABpAGwAbABhAHQAZQAuACAARAB5AG4AYQBtAGkAYwAgAHMAcABlAGMAdAByAGEAIABzAGgAbwB3ACAAYgByAGkAZwBoAHQAbgBlAHMAcwAgAHYAYQByAGkAYQB0AGkAbwBuACAAbwBmACAAcAB1AGwAcwBhAHIAcwAgAGkAbgAgAHQAaABlACAAdABpAG0AZQAgAGEAbgBkACAAZgByAGUAcQB1AGUAbgBjAHkAIABkAG8AbQBhAGkAbgAuACAAUwBlAGMAbwBuAGQAYQByAHkAIABzAHAAZQBjAHQAcgBhACAAZABlAG0AbwBuAHMAdAByAGEAdABlACAAdABoAGUAIABkAGkAcwB0AHIAaQBiAHUAdABpAG8AbgAgAG8AZgAgAGYAbAB1AGMAdAB1AGEAdABpAG8AbgAgAHAAbwB3AGUAcgAgAGkAbgAgAHQAaABlACAAZAB5AG4AYQBtAGkAYwAgAHMAcABlAGMAdAByAGEALgAgAEQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAcwB0AHIAbwBuAGcAbAB5ACAAZABlAHAAZQBuAGQAIABvAG4AIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AYQBsACAAZgByAGUAcQB1AGUAbgBjAGkAZQBzACwAIABiAHUAdAAgAHcAZQByAGUAIABvAGYAdABlAG4AIABvAGIAcwBlAHIAdgBlAGQAIABhAHQAIABmAHIAZQBxAHUAZQBuAGMAaQBlAHMAIABsAG8AdwBlAHIAIAB0AGgAYQBuACAAMQAuADUARwBIAHoALgAgAFMAYwBpAG4AdABpAGwAbABhAHQAaQBvAG4AIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAGEAdAAgAGgAaQBnAGgAZQByACAAZgByAGUAcQB1AGUAbgBjAGkAZQBzACAAaABlAGwAcAAgAHQAbwAgAGMAbwBuAHMAdAByAGEAaQBuACAAdABoAGUAIAB0AHUAcgBiAHUAbABlAG4AYwBlACAAZgBlAGEAdAB1AHIAZQAgAG8AZgAgAHQAaABlACAAaQBuAHQAZQByAHMAdABlAGwAbABhAHIAIABtAGUAZABpAHUAbQAgAG8AdgBlAHIAIABhACAAdwBpAGQAZQAgAGYAcgBlAHEAdQBlAG4AYwB5ACAAcgBhAG4AZwBlACAAYQBuAGQAIABjAGEAbgAgAGQAZQB0AGUAYwB0ACAAdABoAGUAIABzAGMAaQBuAHQAaQBsAGwAYQB0AGkAbwBuAHMAIABvAGYAIABtAG8AcgBlACAAZABpAHMAdABhAG4AdAAgAHAAdQBsAHMAYQByAHMALgAgAFQAZQBuACAAcAB1AGwAcwBhAHIAcwAgAHcAZQByAGUAIABvAGIAcwBlAHIAdgBlAGQAIABhAHQAIAAyADIANQAwAE0ASAB6ACAAKABTAC0AYgBhAG4AZAApACAAdwBpAHQAaAAgAHQAaABlACAASgBpAGEAbQB1AHMAaQAgADYANgBtACAAdABlAGwAZQBzAGMAbwBwAGUAIAB0AG8AIABzAHQAdQBkAHkAIAB0AGgAZQBpAHIAIABzAGMAaQBuAHQAaQBsAGwAYQB0AGkAbwBuAHMALgAgAFQAaABlAGkAcgAgAGQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAdwBlAHIAZQAgAGYAaQByAHMAdAAgAG8AYgB0AGEAaQBuAGUAZAAsACAAZgByAG8AbQAgAHcAaABpAGMAaAAgAHQAaABlACAAZABlAGMAbwByAHIAZQBsAGEAdABpAG8AbgAgAGIAYQBuAGQAdwBpAGQAdABoAHMAIABhAG4AZAAgAHQAaQBtAGUAIABzAGMAYQBsAGUAcwAgAG8AZgAgAGQAaQBmAGYAcgBhAGMAdABpAHYAZQAgAHMAYwBpAG4AdABpAGwAbABhAHQAaQBvAG4AIAB3AGUAcgBlACAAdABoAGUAbgAgAGQAZQByAGkAdgBlAGQAIABiAHkAIABhAHUAdABvAGMAbwByAHIAZQBsAGEAdABpAG8AbgAuACAAUwBlAGMAbwBuAGQAYQByAHkAIABzAHAAZQBjAHQAcgBhACAAdwBlAHIAZQAgAGMAYQBsAGMAdQBsAGEAdABlAGQAIABiAHkAIABmAG8AcgBtAGkAbgBnACAAdABoAGUAIABGAG8AdQByAGkAZQByACAAcABvAHcAZQByACAAcwBwAGUAYwB0AHIAYQAgAG8AZgAgAHQAaABlACAAZAB5AG4AYQBtAGkAYwAgAHMAcABlAGMAdAByAGEALgAgAE0AbwBzAHQAIABvAGYAIAB0AGgAZQAgAG4AZQB3AGwAeQAgAG8AYgB0AGEAaQBuAGUAZAAgAGQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAYQByAGUAIABhAHQAIAB0AGgAZQAgAGgAaQBnAGgAZQBzAHQAIABmAHIAZQBxAHUAZQBuAGMAeQAgAG8AcgAgAGgAYQB2AGUAIAB0AGgAZQAgAGwAbwBuAGcAZQBzAHQAIAB0AGkAbQBlACAAcwBwAGEAbgAgAG8AZgAgAGEAbgB5ACAAcAB1AGIAbABpAHMAaABlAGQAIABkAGEAdABhACAAZgBvAHIAIAB0AGgAZQBzAGUAIABwAHUAbABzAGEAcgBzAC4AIABGAG8AcgAgAFAAUwBSAHMAIABCADAANQA0ADAAKwAyADMALAAgAEIAMgAzADIANAArADYAMAAgAGEAbgBkACAAQgAyADMANQAxACsANgAxACwAIAB0AGgAZQBzAGUAIAB3AGUAcgBlACAAdABoAGUAIABmAGkAcgBzAHQAIABkAHkAbgBhAG0AaQBjACAAcwBwAGUAYwB0AHIAYQAgAGUAdgBlAHIAIAByAGUAcABvAHIAdABlAGQALgAgAFQAaABlACAAZgByAGUAcQB1AGUAbgBjAHkALQBkAGUAcABlAG4AZABlAG4AYwBlACAAbwBmACAAcwBjAGkAbgB0AGkAbABsAGEAdABpAG8AbgAgAHAAYQByAGEAbQBlAHQAZQByAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAHQAaABhAHQAIAB0AGgAZQAgAGkAbgB0AGUAcgB2AGUAbgBpAG4AZwAgAG0AZQBkAGkAdQBtACAAYwBhAG4AIAByAGEAcgBlAGwAeQAgAGIAZQAgAGkAZABlAGEAbABsAHkAIAB0AHUAcgBiAHUAbABlAG4AdAAgAHcAaQB0AGgAIABhACAASwBvAGwAbQBvAGcAbwByAG8AdgAgAHMAcABlAGMAdAByAHUAbQAuACAAVABoAGUAIAB0AGgAaQBuACAAcwBjAHIAZQBlAG4AIABtAG8AZABlAGwAIAB3AG8AcgBrAGUAZAAgAHcAZQBsAGwAIABhAHQAIABTAC0AYgBhAG4AZAAgAGYAbwByACAAdABoAGUAIABzAGMAaQBuAHQAaQBsAGwAYQB0AGkAbwBuACAAbwBmACAAUABTAFIAIABCADEAOQAzADMAKwAxADYALgAgAFAAYQByAGEAYgBvAGwAaQBjACAAYQByAGMAcwAgAHcAZQByAGUAIABkAGUAdABlAGMAdABlAGQAIABpAG4AIAB0AGgAZQAgAHMAZQBjAG8AbgBkAGEAcgB5ACAAcwBwAGUAYwB0AHIAYQAgAG8AZgAgAHQAaAByAGUAZQAgAHAAdQBsAHMAYQByAHMALAAgAFAAUwBSAHMAIABCADAAMwA1ADUAKwA1ADQALAAgAEIAMAA1ADQAMAArADIAMwAgAGEAbgBkACAAQgAyADEANQA0ACsANAAwACwAIABhAGwAbAAgAG8AZgAgAHcAaABpAGMAaAAgAHcAZQByAGUAIABhAHMAeQBtAG0AZQB0AHIAaQBjAGEAbABsAHkAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQALgAgAFQAaABlACAAaQBuAHYAZQByAHQAZQBkACAAYQByAGMAbABlAHQAcwAgAG8AZgAgAFAAUwBSACAAQgAwADMANQA1ACsANQA0ACAAdwBlAHIAZQAgAHMAZQBlAG4AIAB0AG8AIABlAHYAbwBsAHYAZQAgAGEAbABvAG4AZwAgAHQAaABlACAAbQBhAGkAbgAgAHAAYQByAGEAYgBvAGwAYQAgAHcAaQB0AGgAaQBuACAAYQAgAGMAbwBuAHQAaQBuAHUAbwB1AHMAIABvAGIAcwBlAHIAdgBpAG4AZwAgAHMAZQBzAHMAaQBvAG4AIABvAGYAIAAxADIAIABoAG8AdQByAHMALAAgAGYAcgBvAG0AIAB3AGgAaQBjAGgAIAB0AGgAZQAgAGEAbgBnAHUAbABhAHIAIAB2AGUAbABvAGMAaQB0AHkAIABvAGYAIAB0AGgAZQAgAHAAdQBsAHMAYQByACAAdwBhAHMAIABlAHMAdABpAG0AYQB0AGUAZAAgAHQAaABhAHQAIAB3AGEAcwAgAGMAbwBuAHMAaQBzAHQAZQBuAHQAIAB3AGkAdABoACAAdABoAGUAIABtAGUAYQBzAHUAcgBlAG0AZQBuAHQAIABiAHkAIAB2AGUAcgB5ACAAbABvAG4AZwAgAGIAYQBzAGUAbABpAG4AZQAgAGkAbgB0AGUAcgBmAGUAcgBvAG0AZQB0AHIAeQAgACgAVgBMAEIASQApAC4AAAAzaHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovQStBLzYxOC9BMTg2AAAAVABXAGEAbgBnACAAUAAuAEYALgA7ACAASABhAG4AIABKAC4ATAAuADsAIABIAGEAbgAgAEwALgA7ACAAWgBoAGEAbgBnACAASgAuAEgALgA7ACAATABpACAASgAuAFEALgA7ACAAVwBhAG4AZwAgAEMALgA7ACAASABhAG4AIABKAC4AOwAgAFcAYQBuAGcAIABUAC4AOwAgAEcAYQBvACAAWAAuAFkALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGV/wAAAAAAABXJhZGlvAAABGWh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9BK0EvNjE4L0ExODY6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9BK0EvNjE4L0ExODY6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTgvQTE4Ni90YWJsZTE/AAAAZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAABednI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADM6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQAAAAfaXZvOi8vY2RzLnZpemllci9qL2ErYS82MTkvYTEyNAAAABF2czpjYXRhbG9nc2VydmljZQAAAA5KL0ErQS82MTkvQTEyNAAAACYAVABIAE8AUgAgAHMAdQByAHYAZQB5ACAAaQBuACAAbgBvAHIAdABoAGUAcgBuACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlAAAACHJlc2VhcmNoAAAJAQBSAGEAZABpAG8AIABjAG8AbgB0AGkAbgB1AHUAbQAgAHMAdQByAHYAZQB5AHMAIABvAGYAIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAHAAbABhAG4AZQAgAGMAYQBuACAAZgBpAG4AZAAgAGEAbgBkACAAYwBoAGEAcgBhAGMAdABlAHIAaQB6AGUAIABIAEkASQAgAHIAZQBnAGkAbwBuAHMALAAgAHMAdQBwAGUAcgBuAG8AdgBhACAAcgBlAG0AbgBhAG4AdABzACAAKABTAE4AUgBzACkALAAgAHAAbABhAG4AZQB0AGEAcgB5ACAAbgBlAGIAdQBsAGEAZQAgACgAUABOAGUAKQAsACAAYQBuAGQAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAcwBvAHUAcgBjAGUAcwAuACAAQQAgAG4AdQBtAGIAZQByACAAbwBmACAAcwB1AHIAdgBlAHkAcwAgAGEAdAAgAGgAaQBnAGgAIABhAG4AZwB1AGwAYQByACAAcgBlAHMAbwBsAHUAdABpAG8AbgAgACgAPAB+ADIANQAiACkAIABhAHQAIABkAGkAZgBmAGUAcgBlAG4AdAAgAHcAYQB2AGUAbABlAG4AZwB0AGgAcwAgAGUAeABpAHMAdAAgAHQAbwAgAHMAdAB1AGQAeQAgAHQAaABlACAAaQBuAHQAZQByAHMAdABlAGwAbABhAHIAIABtAGUAZABpAHUAbQAgACgASQBTAE0AKQAsACAAYgB1AHQAIABuAG8AIABjAG8AbQBwAGEAcgBhAGIAbABlACAAaABpAGcAaAAtAHIAZQBzAG8AbAB1AHQAaQBvAG4AIABhAG4AZAAgAGgAaQBnAGgALQBzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABzAHUAcgB2AGUAeQAgAGUAeABpAHMAdABzACAAYQB0ACAAbABvAG4AZwAgAHIAYQBkAGkAbwAgAHcAYQB2AGUAbABlAG4AZwB0AGgAcwAgAGEAcgBvAHUAbgBkACAAMgAxAGMAbQAuACAATwB1AHIAIABnAG8AYQBsACAAaQBzACAAdABvACAAaQBuAHYAZQBzAHQAaQBnAGEAdABlACAAdABoAGUAIAAyADEAYwBtACAAcgBhAGQAaQBvACAAYwBvAG4AdABpAG4AdQB1AG0AIABlAG0AaQBzAHMAaQBvAG4AIABpAG4AIAB0AGgAZQAgAG4AbwByAHQAaABlAHIAbgAgAEcAYQBsAGEAYwB0AGkAYwAgAHAAbABhAG4AZQAgAGEAdAAgADwAMgA1ACIAIAByAGUAcwBvAGwAdQB0AGkAbwBuAC4AIABXAGUAIABvAGIAcwBlAHIAdgBlAGQAIABhACAAbABhAHIAZwBlACAAZgByAGEAYwB0AGkAbwBuACAAbwBmACAAdABoAGUAIABHAGEAbABhAGMAdABpAGMAIABwAGwAYQBuAGUAIABpAG4AIAB0AGgAZQAgAGYAaQByAHMAdAAgAHEAdQBhAGQAcgBhAG4AdAAgAG8AZgAgAHQAaABlACAATQBpAGwAawB5ACAAVwBhAHkAIAAoAGwAPQAxADQALgAwAHsAZABlAGcAfQAtADYANwAuADQAewBkAGUAZwB9ACAAYQBuAGQAIAB8AGIAfAA8AD0AMQAuADIANQB7AGQAZQBnAH0AKQAgAHcAaQB0AGgAIAB0AGgAZQAgAEsAYQByAGwAIABHAC4AIABKAGEAbgBzAGsAeQAgAFYAZQByAHkAIABMAGEAcgBnAGUAIABBAHIAcgBhAHkAIAAoAFYATABBACkAIABpAG4AIAB0AGgAZQAgAEMALQBjAG8AbgBmAGkAZwB1AHIAYQB0AGkAbwBuACAAYwBvAHYAZQByAGkAbgBnACAAcwBpAHgAIABjAG8AbgB0AGkAbgB1AHUAbQAgAHMAcABlAGMAdAByAGEAbAAgAHcAaQBuAGQAbwB3AHMALgAgAFQAaABlAHMAZQAgAGQAYQB0AGEAIABwAHIAbwB2AGkAZABlACAAYQAgAGQAZQB0AGEAaQBsAGUAZAAgAHYAaQBlAHcAIABvAG4AIAB0AGgAZQAgAGMAbwBtAHAAYQBjAHQAIABhAHMAIAB3AGUAbABsACAAYQBzACAAZQB4AHQAZQBuAGQAZQBkACAAcgBhAGQAaQBvACAAZQBtAGkAcwBzAGkAbwBuACAAbwBmACAAbwB1AHIAIABHAGEAbABhAHgAeQAgAGEAbgBkACAAdABoAG8AdQBzAGEAbgBkAHMAIABvAGYAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAYgBhAGMAawBnAHIAbwB1AG4AZAAgAHMAbwB1AHIAYwBlAHMALgAgAFcAZQAgAHUAcwBlAGQAIAB0AGgAZQAgAEIATABPAEIAQwBBAFQAIABzAG8AZgB0AHcAYQByAGUAIABhAG4AZAAgAGUAeAB0AHIAYQBjAHQAZQBkACAAMQAwADkAMQA2ACAAcwBvAHUAcgBjAGUAcwAuACAAQQBmAHQAZQByACAAcgBlAG0AbwB2AGkAbgBnACAAcwBwAHUAcgBpAG8AdQBzACAAcwBvAHUAcgBjAGUAIABkAGUAdABlAGMAdABpAG8AbgBzACAAYwBhAHUAcwBlAGQAIABiAHkAIAB0AGgAZQAgAHMAaQBkAGUAbABvAGIAZQBzACAAbwBmACAAdABoAGUAIABzAHkAbgB0AGgAZQBzAGkAcwBlAGQAIABiAGUAYQBtACwAIAB3AGUAIABjAGwAYQBzAHMAaQBmAGkAZQBkACAAMQAwADMAOAA3ACAAcwBvAHUAcgBjAGUAcwAgAGEAcwAgAHIAZQBsAGkAYQBiAGwAZQAgAGQAZQB0AGUAYwB0AGkAbwBuAHMALgBXAGUAIABzAG0AbwBvAHQAaABlAGQAIAB0AGgAZQAgAGkAbQBhAGcAZQBzACAAdABvACAAYQAgAGMAbwBtAG0AbwBuACAAcgBlAHMAbwBsAHUAdABpAG8AbgAgAG8AZgAgADIANQAiACAAYQBuAGQAIABlAHgAdAByAGEAYwB0AGUAZAAgAHQAaABlACAAcABlAGEAawAgAGYAbAB1AHgAIABkAGUAbgBzAGkAdAB5ACAAbwBmACAAZQBhAGMAaAAgAHMAbwB1AHIAYwBlACAAaQBuACAAZQBhAGMAaAAgAHMAcABlAGMAdAByAGEAbAAgAHcAaQBuAGQAbwB3ACAAKABTAFAAVwApACAAdABvACAAZABlAHQAZQByAG0AaQBuAGUAIAB0AGgAZQAgAHMAcABlAGMAdAByAGEAbAAgAGkAbgBkAGkAYwBlAHMAIAB7AGEAbABwAGgAYQB9ACAAKABhAHMAcwB1AG0AaQBuAGcAIABJACgAbgB1ACkAewBwAHIAbwBwAC4AdABvAH0AbgB1AF4AYQBsAHAAaABhAF4AKQAuACAAQgB5ACAAYwByAG8AcwBzAC0AbQBhAHQAYwBoAGkAbgBnACAAdwBpAHQAaAAgAGMAYQB0AGEAbABvAGcAcwAgAG8AZgAgAEgASQBJACAAcgBlAGcAaQBvAG4AcwAsACAAUwBOAFIAcwAsACAAUABOAGUALAAgAGEAbgBkACAAcAB1AGwAcwBhAHIAcwAsACAAdwBlACAAZgBvAHUAbgBkACAAcgBhAGQAaQBvACAAYwBvAHUAbgB0AGUAcgBwAGEAcgB0AHMAIABmAG8AcgAgADgANAAwACAASABJAEkAIAByAGUAZwBpAG8AbgBzACwAIAA1ADIAIABTAE4AUgBzACwAIAAxADYANAAgAFAATgBlACwAIABhAG4AZAAgADMAOAAgAHAAdQBsAHMAYQByAHMALgAgAFcAZQAgAGYAbwB1AG4AZAAgADcAOQAgAGMAbwBuAHQAaQBuAHUAdQBtACAAcwBvAHUAcgBjAGUAcwAgAHQAaABhAHQAIABhAHIAZQAgAGEAcwBzAG8AYwBpAGEAdABlAGQAIAB3AGkAdABoACAAWAAtAHIAYQB5ACAAcwBvAHUAcgBjAGUAcwAuACAAVwBlACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgADYAOQA5ACAAdQBsAHQAcgBhAHMAdABlAGUAcAAgAHMAcABlAGMAdAByAGEAbAAgAHMAbwB1AHIAYwBlAHMAIAAoAGEAbABwAGgAYQA8AC0AMQAuADMAKQAgAHQAaABhAHQAIABjAG8AdQBsAGQAIABiAGUAIABoAGkAZwBoAC0AcgBlAGQAcwBoAGkAZgB0ACAAZwBhAGwAYQB4AGkAZQBzAC4AIABBAHIAbwB1AG4AZAAgADkAMAAwADAAIABvAGYAIAB0AGgAZQAgAHMAbwB1AHIAYwBlAHMAIAB3AGUAIABlAHgAdAByAGEAYwB0AGUAZAAgAGEAcgBlACAAbgBvAHQAIABjAGwAYQBzAHMAaQBmAGkAZQBkACAAcwBwAGUAYwBpAGYAaQBjAGEAbABsAHkALAAgAGIAdQB0ACAAYgBhAHMAZQBkACAAbwBuACAAdABoAGUAaQByACAAcwBwAGEAdABpAGEAbAAgAGEAbgBkACAAcwBwAGUAYwB0AHIAYQBsACAAZABpAHMAdAByAGkAYgB1AHQAaQBvAG4ALAAgAGEAIABsAGEAcgBnAGUAIABmAHIAYQBjAHQAaQBvAG4AIABvAGYAIAB0AGgAZQBtACAAaQBzACAAbABpAGsAZQBsAHkAIAB0AG8AIABiAGUAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAYgBhAGMAawBnAHIAbwB1AG4AZAAgAHMAbwB1AHIAYwBlAHMALgAgAE0AbwByAGUAIAB0AGgAYQBuACAANwA3ADUAMAAgAHMAbwB1AHIAYwBlAHMAIABkAG8AIABuAG8AdAAgAGgAYQB2AGUAIABjAG8AdQBuAHQAZQByAHAAYQByAHQAcwAgAGkAbgAgAHQAaABlACAAUwBJAE0AQgBBAEQAIABkAGEAdABhAGIAYQBzAGUALAAgAGEAbgBkACAAbQBvAHIAZQAgAHQAaABhAG4AIAAzADcANgAwACAAcwBvAHUAcgBjAGUAcwAgAGQAbwAgAG4AbwB0ACAAaABhAHYAZQAgAGMAbwB1AG4AdABlAHIAcABhAHIAdABzACAAaQBuACAAdABoAGUAIABOAEUARAAgAGQAYQB0AGEAYgBhAHMAZQAuACAAUwB0AHUAZAB5AGkAbgBnACAAdABoAGUAIABsAG8AbgBnACAAdwBhAHYAZQBsAGUAbgBnAHQAaABzACAAYwBtACAAYwBvAG4AdABpAG4AdQB1AG0AIABlAG0AaQBzAHMAaQBvAG4AIABhAG4AZAAgAHQAaABlACAAYQBzAHMAbwBjAGkAYQB0AGUAZAAgAHMAcABlAGMAdAByAGEAbAAgAGkAbgBkAGkAYwBlAHMAIABhAGwAbABvAHcAcwAgAHUAcwAgAHQAbwAgAGMAaABhAHIAYQBjAHQAZQByAGkAegBlACAAYQAgAGwAYQByAGcAZQAgAGYAcgBhAGMAdABpAG8AbgAgAG8AZgAgAEcAYQBsAGEAYwB0AGkAYwAgAGEAbgBkACAAZQB4AHQAcgBhAGcAYQBsAGEAYwB0AGkAYwAgAHIAYQBkAGkAbwAgAHMAbwB1AHIAYwBlAHMAIABpAG4AIAB0AGgAZQAgAGEAcgBlAGEAIABvAGYAIAB0AGgAZQAgAG4AbwByAHQAaABlAHIAbgAgAGkAbgBuAGUAcgAgAE0AaQBsAGsAeQAgAFcAYQB5AC4AIABUAGgAaQBzACAAZABhAHQAYQBiAGEAcwBlACAAdwBpAGwAbAAgAGIAZQAgAGUAeAB0AHIAZQBtAGUAbAB5ACAAdQBzAGUAZgB1AGwAIABmAG8AcgAgAGYAdQB0AHUAcgBlACAAcwB0AHUAZABpAGUAcwAgAG8AZgAgAGEAIABkAGkAdgBlAHIAcwBlACAAcwBlAHQAIABvAGYAIABhAHMAdAByAG8AcABoAHkAcwBpAGMAYQBsACAAbwBiAGoAZQBjAHQAcwAuAAAAM2h0dHA6Ly9j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AHMAbQBzACAAZABvAG0AaQBuAGEAdABpAG4AZwAgAHQAaABlACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIAB3AGkAdABoAGkAbgAgAHQAaABlACAAbgBlAGIAdQBsAGEALAAgAGEAYwBjAG8AdQBuAHQAaQBuAGcAIABmAG8AcgAgAGkAdABzACAAYQBuAG8AbQBhAGwAbwB1AHMAbAB5ACAAbABhAHIAZwBlACAAcwBpAHoAZQAgAGEAbgBkACAAcwBwAGUAYwB0AHIAYQBsACAAYwBoAGEAcgBhAGMAdABlAHIAaQBzAHQAaQBjAHMALgAgAFQAaABlACAAbgBlAGIAdQBsAGEAIABpAHMAIABzAHQAdQBkAGkAZQBkACAAdQBzAGkAbgBnACAAYQAgAGQAZQBlAHAAIABlAHgAcABvAHMAdQByAGUAIABmAHIAbwBtACAAbwB2AGUAcgAgADEAMgAgAHkAZQBhAHIAcwAgAG8AZgAgAEgALgBFAC4AUwAuAFMALgAgAEkAIABvAHAAZQByAGEAdABpAG8AbgAsACAAdABvAGcAZQB0AGgAZQByACAAdwBpAHQAaAAgAGQAYQB0AGEAIABmAHIAbwBtACAASAAuAEUALgBTAC4AUwAuACAASQBJACAAaQBtAHAAcgBvAHYAaQBuAGcAIAB0AGgAZQAgAGwAbwB3ACAAZQBuAGUAcgBnAHkAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkALgAgAEUAbgBoAGEAbgBjAGUAZAAgAGUAbgBlAHIAZwB5AC0AIABkAGUAcABlAG4AZABlAG4AdAAgAG0AbwByAHAAaABvAGwAbwBnAGkAYwBhAGwAIABhAG4AZAAgAHMAcABhAHQAaQBhAGwAbAB5AC0AcgBlAHMAbwBsAHYAZQBkACAAcwBwAGUAYwB0AHIAYQBsACAAYQBuAGEAbAB5AHMAZQBzACAAcAByAG8AYgBlACAAdABoAGUAIABWAGUAcgB5ACAASABpAGcAaAAgAEUAbgBlAHIAZwB5ACAAKABWAEgARQAsACAARQA+ADAALgAxAFQAZQBWACkAIABnAGEAbQBtAGEALQByAGEAeQAgAHAAcgBvAHAAZQByAHQAaQBlAHMAIABvAGYAIAB0AGgAZQAgAG4AZQBiAHUAbABhAC4AIABUAGgAZQAgAG4AZQBiAHUAbABhACAAZQBtAGkAcwBzAGkAbwBuACAAaQBzACAAcgBlAHYAZQBhAGwAZQBkACAAdABvACAAZQB4AHQAZQBuAGQAIABvAHUAdAAgAHQAbwAgADEALgA1ACAAZABlAGcAcgBlAGUAcwAgAGYAcgBvAG0AIAB0AGgAZQAgAHAAdQBsAHMAYQByACwAIAB+ADEALgA1ACAAdABpAG0AZQBzACAAZgB1AHIAdABoAGUAcgAgAHQAaABhAG4AIABwAHIAZQB2AGkAbwB1AHMAbAB5ACAAcwBlAGUAbgAsACAAbQBhAGsAaQBuAGcAIABIAEUAUwBTACAASgAxADgAMgA1AC0AMQAzADcALAAgAHcAaQB0AGgAIABhAG4AIABpAG4AdAByAGkAbgBzAGkAYwAgAGQAaQBhAG0AZQB0AGUAcgAgAG8AZgAgAH4AMQAwADAAcABjACwAIABwAG8AdABlAG4AdABpAGEAbABsAHkAIAB0AGgAZQAgAGwAYQByAGcAZQBzAHQAIABnAGEAbQBtAGEALQByAGEAeQAgAFAAVwBOACAAYwB1AHIAcgBlAG4AdABsAHkAIABrAG4AbwB3AG4ALgAgAEMAaABhAHIAYQBjAHQAZQByAGkAcwBhAHQAaQBvAG4AIABvAGYAIAB0AGgAZQAgAG4AZQBiAHUAbABhACcAcwAgAHMAdAByAG8AbgBnAGwAeQAgAGUAbgBlAHIAZwB5AC0AZABlAHAAZQBuAGQAZQBuAHQAIABtAG8AcgBwAGgAbwBsAG8AZwB5ACAAZQBuAGEAYgBsAGUAcwAgAHQAaABlACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIABtAGUAYwBoAGEAbgBpAHMAbQBzACAAdABvACAAYgBlACAAYwBvAG4AcwB0AHIAYQBpAG4AZQBkAC4AIABBACAAZABlAHAAZQBuAGQAZQBuAGMAZQAgAG8AZgAgAHQAaABlACAAbgBlAGIAdQBsAGEAIABlAHgAdABlAG4AdAAgAHcAaQB0AGgAIABlAG4AZQByAGcAeQAgAG8AZgAgAFIAewBwAHIAbwBwAC4AdABvAH0AIABFAF4AYQBsAHAAaABhAF4AIAB3AGkAdABoACAAYQBsAHAAaABhAD0ALQAwAC4AMgA5ACsALwAtADAALgAwADQAKABzAHQAYQB0ACkAKwAvAC0AMAAuADAANQAoAHMAeQBzACkAIABkAGkAcwBmAGEAdgBvAHUAcgBzACAAYQAgAHAAdQByAGUAIABkAGkAZgBmAHUAcwBpAG8AbgAgAHMAYwBlAG4AYQByAGkAbwAgAGYAbwByACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIAB3AGkAdABoAGkAbgAgAHQAaABlACAAbgBlAGIAdQBsAGEALgAgAFQAaABlACAAdABvAHQAYQBsACAAZwBhAG0AbQBhAC0AcgBhAHkAIABmAGwAdQB4ACAAbwBmACAAdABoAGUAIABuAGUAYgB1AGwAYQAgAGEAYgBvAHYAZQAgADEAfgBUAGUAVgAgAGkAcwAgAGYAbwB1AG4AZAAgAHQAbwAgAGIAZQAgACgAMQAuADEAMgArAC8ALQAwAC4AMAAzACgAcwB0AGEAdAApACsALwAtADAALgAyADUAKABzAHkAcwApACkAeAAxADAAXgAtADEAMQBeAGMAbQBeAC0AMgBeAHMAXgAtADEAXgAsACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAHQAbwAgAH4ANgA0ACUAIABvAGYAIAB0AGgAZQAgAGYAbAB1AHgAIABvAGYAIAB0AGgAZQAgAEMAcgBhAGIAIABOAGUAYgB1AGwAYQAuACAASABFAFMAUwAgAEoAMQA4ADIANQAtADEAMwA3ACAAaQBzACAAYQAgAFAAVwBOACAAdwBpAHQAaAAgAGMAbABlAGEAcgAgAGUAbgBlAHIAZwB5AC0AZABlAHAAZQBuAGQAZQBuAHQAIABtAG8AcgBwAGgAbwBsAG8AZwB5ACAAYQB0ACAAVgBIAEUAIABnAGEAbQBtAGEALQByAGEAeQAgAGUAbgBlAHIAZwBpAGUAcwAuACAAVABoAGkAcwAgAHMAbwB1AHIAYwBlACAAaQBzACAAdQBzAGUAZAAgAGEAcwAgAGEAIABsAGEAYgBvAHIAYQB0AG8AcgB5ACAAdABvACAAaQBuAHYAZQBzAHQAaQBnAGEAdABlACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIAB3AGkAdABoAGkAbgAgAG0AaQBkAGQAbABlAC0AYQBnAGUAZAAgAFAAVwBOAGUALgAgAEQAZQBlAHAAIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAG8AZgAgAHQAaABpAHMAIABoAGkAZwBoAGwAeQAgAHMAcABhAHQAaQBhAGwAbAB5AC0AZQB4AHQAZQBuAGQAZQBkACAAUABXAE4AIABlAG4AYQBiAGwAZQAgAGEAIABzAHAAZQBjAHQAcgBhAGwAIABtAGEAcAAgAG8AZgAgAHQAaABlACAAcgBlAGcAaQBvAG4AIAB0AG8AIABiAGUAIABwAHIAbwBkAHUAYwBlAGQALAAgAHAAcgBvAHYAaQBkAGkAbgBnACAAaQBuAHMAaQBnAGgAdABzACAAaQBuAHQAbwAgAHQAaABlACAAcwBwAGUAYwB0AHIAYQBsACAAdgBhAHIAaQBhAHQAaQBvAG4AIAB3AGkAdABoAGkAbgAgAHQAaABlACAAbgBlAGIAdQBsAGEALgAAADNodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9BK0EvNjIxL0ExMTYAAAs2AEgALgBFAC4AUwAuAFMALgAgAEMAbwBsAGwAYQBiAG8AcgBhAHQAaQBvAG4AOwAgAEEAYgBkAGEAbABsAGEAIABIAC4AOwAgAEEAaABhAHIAbwBuAGkAYQBuACAARgAuADsAIABBAGkAdAAgAEIAZQBuAGsAaABhAGwAaQAgAEYALgA7ACAAQQBuAGcAdQBlAG4AZQByACAARQAuAE8ALgA7ACAAQQByAGEAawBhAHcAYQAgAE0ALgA7ACAAQQByAGMAYQByAG8AIABDAC4AOwAgAEEAcgBtAGEAbgBkACAAQwAuADsAIABBAHIAcgBpAGUAdABhACAATQAuADsAIABCAGEAYwBrAGUAcwAgAE0ALgA7ACAAQgBhAHIAbgBhAHIAZAAgAE0ALgA7ACAAQgBlAGMAaABlAHIAaQBuAGkAIABZAC4AOwAgAEIAZQBjAGsAZQByACAAVABqAHUAcwAgAEoALgA7ACAAQgBlAHIAZwBlACAARAAuADsAIABCAGUAcgBuAGwAbwBlAGgAcgAgAEsALgA7ACAAQgBsAGEAYwBrAHcAZQBsAGwAIABSAC4AOwAgAEIAbwBlAHQAdABjAGgAZQByACAATQAuADsAIABCAG8AaQBzAHMAbwBuACAAQwAuADsAIABCAG8AbABtAG8AbgB0ACAASgAuADsAIABCAG8AbgBuAGUAZgBvAHkAIABTAC4AOwAgAEIAbwByAGQAYQBzACAAUAAuADsAIABCAHIAZQBnAGUAbwBuACAASgAuADsAIABCAHIAdQBuACAARgAuADsAIABCAHIAdQBuACAAUAAuADsAIABCAHIAeQBhAG4AIABNAC4AOwAgAEIAdQBlAGMAaABlAGwAZQAgAE0ALgA7ACAAQgB1AGwAaQBrACAAVAAuADsAIABCAHkAbAB1AG4AZAAgAFQALgA7ACAAQwBhAHAAYQBzAHMAbwAgAE0ALgA7ACAAQwBhAHIAbwBmAGYAIABTAC4AOwAgAEMAYQByAG8AcwBpACAAQQAuADsAIABDAGEAcwBhAG4AbwB2AGEAIABTAC4AOwAgAEMAZQByAHIAdQB0AGkAIABNAC4AOwAgAEMAaABhAGsAcgBhAGIAbwByAHQAeQAgAE4ALgA7ACAAQwBoAGEAbgBkACAAVAAuADsAIABDAGgAYQBuAGQAcgBhACAAUwAuADsAIABDAGgAYQB2AGUAcwAgAFIALgBDAC4ARwAuADsAIABDAGgAZQBuACAAQQAuADsAIABDAG8AbABhAGYAcgBhAG4AYwBlAHMAYwBvACAAUwAuADsAIABDAG8AbgBkAG8AbgAgAEIALgA7ACAARABhAHYAaQBkAHMAIABJAC4ARAAuADsAIABEAGUAaQBsACAAQwAuADsAIABEAGUAdgBpAG4AIABKAC4AOwAgAGQAZQBXAGkAbAB0ACAAUAAuADsAIABEAGkAcgBzAG8AbgAgAEwALgA7ACAARABqAGEAbgBuAGEAdABpAC0AQQB0AGEAaQAgAEEALgA7ACAARABtAHkAdAByAGkAaQBlAHYAIABBAC4AOwAgAEQAbwBuAGEAdABoACAAQQAuADsAIABEAG8AcgBvAHMAaABlAG4AawBvACAAVgAuADsAIABEAHIAdQByAHkAIABMAC4ATwAnAEMALgA7ACAARAB5AGsAcwAgAEoALgA7ACAARQBnAGIAZQByAHQAcwAgAEsALgA7ACAARQBtAGUAcgB5ACAARwAuADsAIABFAHIAbgBlAG4AdwBlAGkAbgAgAEoALgAtAFAALgA7ACAARQBzAGMAaABiAGEAYwBoACAAUwAuADsAIABGAGUAZwBhAG4AIABTAC4AOwAgAEYAaQBhAHMAcwBvAG4AIABBAC4AOwAgAEYAbwBuAHQAYQBpAG4AZQAgAEcALgA7ACAARgB1AG4AawAgAFMALgA7ACAARgB1AGUAcwBzAGwAaQBuAGcAIABNAC4AOwAgAEcAYQBiAGkAYwBpACAAUwAuADsAIABHAGEAbABsAGEAbgB0ACAAWQAuAEEALgA7ACAARwBhAHQAZQAgAEYALgA7ACAARwBpAGEAdgBpAHQAdABvACAARwAuADsAIABHAGwAYQB3AGkAbwBuACAARAAuADsAIABHAGwAaQBjAGUAbgBzAHQAZQBpAG4AIABKAC4ARgAuADsAIABHAG8AdAB0AHMAYwBoAGEAbABsACAARAAuADsAIABHAHIAbwBuAGQAaQBuACAATQAuAC0ASAAuADsAIABIAGEAaABuACAASgAuADsAIABIAGEAdQBwAHQAIABNAC4AOwAgAEgAZQBpAG4AegBlAGwAbQBhAG4AbgAgAEcALgA7ACAASABlAG4AcgBpACAARwAuADsAIABIAGUAcgBtAGEAbgBuACAARwAuADsAIABIAGkAbgB0AG8AbgAgAEoALgBBAC4AOwAgAEgAbwBmAG0AYQBuAG4AIABXAC4AOwAgAEgAbwBpAHMAYwBoAGUAbgAgAEMALgA7ACAASABvAGwAYwBoACAAVAAuAEwALgA7ACAASABvAGwAbABlAHIAIABNAC4AOwAgAEgAbwByAG4AcwAgAEQALgA7ACAASAB1AGIAZQByACAARAAuADsAIABJAHcAYQBzAGEAawBpACAASAAuADsAIABKAGEAYwBoAG8AbABrAG8AdwBzAGsAYQAgAEEALgA7ACAASgBhAG0AcgBvAHoAeQAgAE0ALgA7ACAASgBhAG4AawBvAHcAcwBrAHkAIABEAC4AOwAgAEoAYQBuAGsAbwB3AHMAawB5ACAARgAuADsAIABKAG8AdQB2AGkAbgAgAEwALgA7ACAASgB1AG4AZwAtAFIAaQBjAGgAYQByAGQAdAAgAEkALgA7ACAASwBhAHMAdABlAG4AZABpAGUAYwBrACAATQAuAEEALgA7ACAASwBhAHQAYQByAHoAeQBuAHMAawBpACAASwAuADsAIABLAGEAdABzAHUAcgBhAGcAYQB3AGEAIABNAC4AOwAgAEsAYQB0AHoAIABVAC4AOwAgAEsAZQByAHMAegBiAGUAcgBnACAARAAuADsAIABLAGgAYQBuAGcAdQBsAHkAYQBuACAARAAuADsAIABLAGgAZQBsAGkAZgBpACAAQgAuADsAIABLAGkAbgBnACAASgAuADsAIABLAGwAZQBwAHMAZQByACAAUwAuADsAIABLAGwAdQB6AG4AaQBhAGsAIABXAC4AOwAgAEsAbwBtAGkAbgAgAE4AdQAuADsAIABLAG8AcwBhAGMAawAgAEsALgA7ACAASwByAGEAdQBzACAATQAuADsAIABMAGEAbQBhAG4AbgBhACAARwAuADsAIABMAGEAdQAgAEoALgA7ACAATABlAGYAYQB1AGMAaABlAHUAcgAgAEoALgA7ACAATABlAG0AaQBlAHIAZQAgAEEALgA7ACAATABlAG0AbwBpAG4AZQAtAEcAbwB1AG0AYQByAGQAIABNAC4AOwAgAEwAZQBuAGEAaQBuACAASgAuAC0AUAAuADsAIABMAGUAcwBlAHIAIABFAC4AOwAgAEwAbwBoAHMAZQAgAFQALgA7ACAATABvAHAAZQB6AC0AQwBvAHQAbwAgAFIALgA7ACAATAB5AHAAbwB2AGEAIABJAC4AOwAgAE0AYQBsAHkAcwBoAGUAdgAgAEQALgA7ACAATQBhAHIAYQBuAGQAbwBuACAAVgAuADsAIABNAGEAcgBjAG8AdwBpAHQAaAAgAEEALgA7ACAATQBhAHIAaQBhAHUAZAAgAEMALgA7ACAATQBhAHIAdABpAC0ARABlAHYAZQBzAGEAIABHAC4AOwAgAE0AYQByAHgAIABSAC4AOwAgAE0AYQB1AHIAaQBuACAARwAuADsAIABNAGUAaQBuAHQAagBlAHMAIABQAC4ASgAuADsAIABNAGkAdABjAGgAZQBsAGwAIABBAC4ATQAuAFcALgA7ACAATQBvAGQAZQByAHMAawBpACAAUgAuADsAIABNAG8AaABhAG0AZQBkACAATQAuADsAIABNAG8AaAByAG0AYQBuAG4AIABMAC4AOwAgAE0AbwBvAHIAZQAgAEMALgA7ACAATQBvAHUAbABpAG4AIABFAC4AOwAgAE0AdQByAGEAYwBoACAAVAAuADsAIABOAGEAawBhAHMAaABpAG0AYQAgAFMALgA7ACAAZABlACAATgBhAHUAcgBvAGkAcwAgAE0ALgA7ACAATgBkAGkAeQBhAHYAYQBsAGEAIABIAC4AOwAgAE4AaQBlAGQAZQByAHcAYQBuAGcAZQByACAARgAuADsAIABOAGkAZQBtAGkAZQBjACAASgAuADsAIABPAGEAawBlAHMAIABMAC4AOwAgAE8AJwBCAHIAaQBlAG4AIABQAC4AOwAgAE8AZABhAGsAYQAgAEgALgA7ACAATwBoAG0AIABTAC4AOwAgAE8AcwB0AHIAbwB3AHMAawBpACAATQAuADsAIABPAHkAYQAgAEkALgA7ACAAUABhAG4AdABlAHIAIABNAC4AOwAgAFAAYQByAHMAbwBuAHMAIABSAC4ARAAuADsAIABQAGUAcgBlAG4AbgBlAHMAIABDAC4AOwAgAFAAZQB0AHIAdQBjAGMAaQAgAFAALgAtAE8ALgA7ACAAUABlAHkAYQB1AGQAIABCAC4AOwAgAFAAaQBlAGwAIABRAC4AOwAgAFAAaQB0AGEAIABTAC4AOwAgAFAAbwBpAHIAZQBhAHUAIABWAC4AOwAgAFAAcgBpAHkAYQBuAGEAIABOAG8AZQBsACAAQQAuADsAIABQAHIAbwBrAGgAbwByAG8AdgAgAEQALgBBAC4AOwAgAFAAcgBvAGsAbwBwAGgAIABIAC4AOwAgAFAAdQBlAGgAbABoAG8AZgBlAHIAIABHAC4AOwAgAFAAdQBuAGMAaAAgAE0ALgA7ACAAUQB1AGkAcgByAGUAbgBiAGEAYwBoACAAQQAuADsAIABSAGEAYQBiACAAUwAuADsAIABSAGEAdQB0AGgAIABSAC4AOwAgAFIAZQBpAG0AZQByACAAQQAuADsAIABSAGUAaQBtAGUAcgAgAE8ALgA7ACAAUgBlAG4AYQB1AGQAIABNAC4AOwAgAFIAaQBlAGcAZQByACAARgAuADsAIABSAGkAbgBjAGgAaQB1AHMAbwAgAEwALgA7ACAAUgBvAG0AbwBsAGkAIABDAC4AOwAgAFIAbwB3AGUAbABsACAARwAuADsAIABSAHUAZABhAGsAIABCAC4AOwAgAFIAdQBpAHoALQBWAGUAbABhAHMAYwBvACAARQAuADsAIABTAGEAaABhAGsAaQBhAG4AIABWAC4AOwAgAFMAYQBpAHQAbwAgAFMALgA7ACAAUwBhAG4AYwBoAGUAegAgAEQALgBBAC4AOwAgAFMAYQBuAHQAYQBuAGcAZQBsAG8AIABBAC4AOwAgAFMAYQBzAGEAawBpACAATQAuADsAIABTAGMAaABsAGkAYwBrAGUAaQBzAGUAcgAgAFIALgA7ACAAUwBjAGgAdQBlAHMAcwBsAGUAcgAgAEYALgA7ACAAUwBjAGgAdQBsAHoAIABBAC4AOwAgAFMAYwBoAHUAdAB0AGUAIABIAC4AOwAgAFMAYwBoAHcAYQBuAGsAZQAgAFUALgA7ACAAUwBjAGgAdwBlAG0AbQBlAHIAIABTAC4AOwAgAFMAZQBnAGwAYQByAC0AQQByAHIAbwB5AG8AIABNAC4AOwAgAFMAZQBuAG4AaQBhAHAAcABhAG4AIABNAC4AOwAgAFMAZQB5AGYAZgBlAHIAdAAgAEEALgBTAC4AOwAgAFMAaABhAGYAaQAgAE4ALgA7ACAAUwBoAGkAbABvAG4AIABJAC4AOwAgAFMAaABpAG4AaQBuAGcAYQB5AGEAbQB3AGUAIABLAC4AOwAgAFMAaQBtAG8AbgBpACAAUgAuADsAIABTAGkAbgBoAGEAIABBAC4AOwAgAFMAbwBsACAASAAuADsAIABTAHAAZQBjAG8AdgBpAHUAcwAgAEEALgA7ACAAUwBwAGkAcgAtAEoAYQBjAG8AYgAgAE0ALgA7ACAAUwB0AGEAdwBhAHIAegAgAEwALgA7ACAAUwB0AGUAZQBuAGsAYQBtAHAAIABSAC4AOwAgAFMAdABlAGcAbQBhAG4AbgAgAEMALgA7ACAAUwB0AGUAcABwAGEAIABDAC4AOwAgAFQAYQBrAGEAaABhAHMAaABpACAAVAAuADsAIABUAGEAdgBlAHIAbgBlAHQAIABKAC4ALQBQAC4AOwAgAFQAYQB2AGUAcgBuAGkAZQByACAAVAAuADsAIABUAGEAeQBsAG8AcgAgAEEALgBNAC4AOwAgAFQAZQByAHIAaQBlAHIAIABSAC4AOwAgAFQAaQBiAGEAbABkAG8AIABMAC4AOwAgAFQAaQB6AGkAYQBuAGkAIABEAC4AOwAgAFQAbAB1AGMAegB5AGsAbwBuAHQAIABNAC4AOwAgAFQAcgBpAGMAaABhAHIAZAAgAEMALgA7ACAAVABzAGkAcgBvAHUAIABNAC4AOwAgAFQAcwB1AGoAaQAgAE4ALgA7ACAAVAB1AGYAZgBzACAAUgAuADsAIABVAGMAaABpAHkAYQBtAGEAIABZAC4AOwAgAHYAYQBuACAAZABlAHIAIABXAGEAbAB0ACAARAAuAEoALgA7ACAAdgBhAG4AIABFAGwAZABpAGsAIABDAC4AOwAgAHYAYQBuACAAUgBlAG4AcwBiAHUAcgBnACAAQwAuADsAIAB2AGEAbgAgAFMAbwBlAGwAZQBuACAAQgAuADsAIABWAGEAcwBpAGwAZQBpAGEAZABpAHMAIABHAC4AOwAgAFYAZQBoACAASgAuADsAIABWAGUAbgB0AGUAcgAgAEMALgA7ACAAVgBpAG4AYwBlAG4AdAAgAFAALgA7ACAAVgBpAG4AawAgAEoALgA7ACAAVgBvAGkAcwBpAG4AIABGAC4AOwAgAFYAbwBlAGwAawAgAEgALgBKAC4AOwAgAFYAdQBpAGwAbABhAHUAbQBlACAAVAAuADsAIABXAGEAZABpAGEAcwBpAG4AZwBoACAAWgAuADsAIABXAGEAZwBuAGUAcgAgAFMALgBKAC4AOwAgAFcAYQBnAG4AZQByACAAUgAuAE0ALgA7ACAAVwBoAGkAdABlACAAUgAuADsAIABXAGkAZQByAHoAYwBoAG8AbABzAGsAYQAgAEEALgA7ACAAWQBhAG4AZwAgAFIALgA7ACAAWQBvAG4AZQBkAGEAIABIAC4AOwAgAFoAYQBiAG8AcgBvAHYAIABEAC4AOwAgAFoAYQBjAGgAYQByAGkAYQBzACAATQAuADsAIABaAGEAbgBpAG4AIABSAC4AOwAgAFoAZAB6AGkAYQByAHMAawBpACAAQQAuAEEALgA7ACAAWgBlAGMAaAAgAEEALgA7ACAAWgBlAGYAaQAgAEYALgA7ACAAWgBpAGUAZwBsAGUAcgAgAEEALgA7ACAAWgBvAHIAbgAgAEoALgA7ACAAWgB5AHcAdQBjAGsAYQAgAE4ALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGV/wAAAAAAAD3JhZGlvI2dhbW1hLXJheQAAAWlodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYyMS9BMTE2L2JveGZpdHM/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0ErQS82MjEvQTExNjo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9BK0EvNjIxL0ExMTY6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYyMS9BMTE2L2xpc3Q/AAAAkGl2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaAAAAHl2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwAAAARXN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZAAAAB9pdm86Ly9jZHMudml6aWVyL2ovYSthLzYyNi9hMTA0AAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAADkovQStBLzYyNi9BMTA0AAAAGQBMAE8AVABBAEEAUwAgAHAAdQBsAHMAYQByACAAZABpAHMAYwBvAHYAZQByAGkAZQBzAAAACHJlc2VhcmNoAAAG1wBXAGUAIABwAHIAZQBzAGUAbgB0ACAAYQBuACAAbwB2AGUAcgB2AGkAZQB3ACAAbwBmACAAdABoAGUAIABMAE8ARgBBAFIAIABUAGkAZQBkAC0AQQByAHIAYQB5ACAAQQBsAGwALQBTAGsAeQAgAFMAdQByAHYAZQB5ACAAKABMAE8AVABBAEEAUwApACAAZgBvAHIAIAByAGEAZABpAG8AIABwAHUAbABzAGEAcgBzACAAYQBuAGQAIABmAGEAcwB0ACAAdAByAGEAbgBzAGkAZQBuAHQAcwAuACAAVABoAGUAIABzAHUAcgB2AGUAeQAgAHUAcwBlAHMAIAB0AGgAZQAgAGgAaQBnAGgALQBiAGEAbgBkACAAYQBuAHQAZQBuAG4AYQBzACAAbwBmACAAdABoAGUAIABMAE8ARgBBAFIAIABTAHUAcABlAHIAdABlAHIAcAAsACAAdABoAGUAIABkAGUAbgBzAGUAIABpAG4AbgBlAHIAIABwAGEAcgB0ACAAbwBmACAAdABoAGUAIABMAE8ARgBBAFIAIABjAG8AcgBlACwAIAB0AG8AIABzAHUAcgB2AGUAeQAgAHQAaABlACAAbgBvAHIAdABoAGUAcgBuACAAcwBrAHkAIAAoAHsAZABlAGwAdABhAH0APgAwAHsAZABlAGcAfQApACAAYQB0ACAAYQAgAGMAZQBuAHQAcgBhAGwAIABvAGIAcwBlAHIAdgBpAG4AZwAgAGYAcgBlAHEAdQBlAG4AYwB5ACAAbwBmACAAMQAzADUATQBIAHoALgAgAEEAIAB0AG8AdABhAGwAIABvAGYAIAAyADEAOQAgAHQAaQBlAGQALQBhAHIAcgBhAHkAIABiAGUAYQBtAHMAIAAoAGMAbwBoAGUAcgBlAG4AdAAgAHMAdQBtAG0AYQB0AGkAbwBuACAAbwBmACAAcwB0AGEAdABpAG8AbgAgAHMAaQBnAG4AYQBsAHMALAAgAGMAbwB2AGUAcgBpAG4AZwAgADEAMgAgAHMAcQB1AGEAcgBlACAAZABlAGcAcgBlAGUAcwApACwAIABhAHMAIAB3AGUAbABsACAAYQBzACAAdABoAHIAZQBlACAAaQBuAGMAbwBoAGUAcgBlAG4AdAAgAGIAZQBhAG0AcwAgACgAYwBvAHYAZQByAGkAbgBnACAANgA3ACAAcwBxAHUAYQByAGUAIABkAGUAZwByAGUAZQBzACkAIABhAHIAZQAgAGYAbwByAG0AZQBkACAAaQBuACAAZQBhAGMAaAAgAHMAdQByAHYAZQB5ACAAcABvAGkAbgB0AGkAbgBnAC4AIABGAG8AcgAgAGUAYQBjAGgAIABvAGYAIAB0AGgAZQAgADIAMgAyACAAYgBlAGEAbQBzACwAIAB0AG8AdABhAGwAIABpAG4AdABlAG4AcwBpAHQAeQAgAGkAcwAgAHIAZQBjAG8AcgBkAGUAZAAgAGEAdAAgADQAOQAxAC4ANQAyACAAewBtAHUAfQBzACAAdABpAG0AZQAgAHIAZQBzAG8AbAB1AHQAaQBvAG4ALgAgAEUAYQBjAGgAIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AIABpAG4AdABlAGcAcgBhAHQAZQBzACAAZgBvAHIAIAAxAGgAcgAgAGEAbgBkACAAYwBvAHYAZQByAHMAIAAyADUAOQAyACAAYwBoAGEAbgBuAGUAbABzACAAZgByAG8AbQAgADEAMQA5ACAAdABvACAAMQA1ADEATQBIAHoALgAgAFQAaABpAHMAIABpAG4AcwB0AHIAdQBtAGUAbgB0AGEAbAAgAHMAZQB0AHUAcAAgAGEAbABsAG8AdwBzACAATABPAFQAQQBBAFMAIAB0AG8AIAByAGUAYQBjAGgAIABhACAAZABlAHQAZQBjAHQAaQBvAG4AIAB0AGgAcgBlAHMAaABvAGwAZAAgAG8AZgAgADEALQA1AG0ASgB5ACAAZgBvAHIAIABwAGUAcgBpAG8AZABpAGMAIABlAG0AaQBzAHMAaQBvAG4ALgAgAFQAaAB1AHMAIABmAGEAcgAsACAAdABoAGUAIABMAE8AVABBAEEAUwAgAHMAdQByAHYAZQB5ACAAaABhAHMAIAByAGUAcwB1AGwAdABlAGQAIABpAG4AIAB0AGgAZQAgAGQAaQBzAGMAbwB2AGUAcgB5ACAAbwBmACAANwAzACAAcgBhAGQAaQBvACAAcAB1AGwAcwBhAHIAcwAuACAAQQBtAG8AbgBnACAAdABoAGUAcwBlACAAYQByAGUAIAB0AHcAbwAgAG0AaQBsAGQAbAB5ACAAcgBlAGMAeQBjAGwAZQBkACAAYgBpAG4AYQByAHkAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACAAKABQAD0AMQAzACAAYQBuAGQAIAAzADMAbQBzACkALAAgAGEAcwAgAHcAZQBsAGwAIABhAHMAIAB0AGgAZQAgAHMAbABvAHcAZQBzAHQALQBzAHAAaQBuAG4AaQBuAGcAIAByAGEAZABpAG8AIABwAHUAbABzAGEAcgAgAGMAdQByAHIAZQBuAHQAbAB5ACAAawBuAG8AdwBuACAAKABQAD0AMgAzAC4ANQBzACkALgAgAFQAaABlACAAcwB1AHIAdgBlAHkAIABoAGEAcwAgAHQAaAB1AHMAIABmAGEAcgAgAGQAZQB0AGUAYwB0AGUAZAAgADMAMQAxACAAawBuAG8AdwBuACAAcAB1AGwAcwBhAHIAcwAsACAAdwBpAHQAaAAgAHMAcABpAG4AIABwAGUAcgBpAG8AZABzACAAcgBhAG4AZwBpAG4AZwAgAGYAcgBvAG0AIAA0AG0AcwAgAHQAbwAgADUALgAwAHMAIABhAG4AZAAgAGQAaQBzAHAAZQByAHMAaQBvAG4AIABtAGUAYQBzAHUAcgBlAHMAIABmAHIAbwBtACAAMwAuADAAIAB0AG8AIAAyADEANwBwAGMALwBjAG0AXgAzAF4ALgAgAEsAbgBvAHcAbgAgAHAAdQBsAHMAYQByAHMAIABhAHIAZQAgAGQAZQB0AGUAYwB0AGUAZAAgAGEAdAAgAGYAbAB1AHgAIABkAGUAbgBzAGkAdABpAGUAcwAgAGMAbwBuAHMAaQBzAHQAZQBuAHQAIAB3AGkAdABoACAAbABpAHQAZQByAGEAdAB1AHIAZQAgAHYAYQBsAHUAZQBzAC4AIABXAGUAIABmAGkAbgBkACAAdABoAGEAdAAgAHQAaABlACAATABPAFQAQQBBAFMAIABwAHUAbABzAGEAcgAgAGQAaQBzAGMAbwB2AGUAcgBpAGUAcwAgAGgAYQB2AGUALAAgAG8AbgAgAGEAdgBlAHIAYQBnAGUALAAgAGwAbwBuAGcAZQByACAAcwBwAGkAbgAgAHAAZQByAGkAbwBkAHMAIAB0AGgAYQBuACAAdABoAGUAIABrAG4AbwB3AG4AIABwAHUAbABzAGEAcgAgAHAAbwBwAHUAbABhAHQAaQBvAG4ALgAgAFQAaABpAHMAIABtAGEAeQAgAHIAZQBmAGwAZQBjAHQAIABkAGkAZgBmAGUAcgBlAG4AdAAgAHMAZQBsAGUAYwB0AGkAbwBuACAAYgBpAGEAcwBlAHMAIABiAGUAdAB3AGUAZQBuACAATABPAFQAQQBBAFMAIABhAG4AZAAgAHAAcgBlAHYAaQBvAHUAcwAgAHMAdQByAHYAZQB5AHMALAAgAHQAaABvAHUAZwBoACAAaQB0ACAAaQBzACAAYQBsAHMAbwAgAHAAbwBzAHMAaQBiAGwAZQAgAHQAaABhAHQAIABzAGwAbwB3AGUAcgAtAHMAcABpAG4AbgBpAG4AZwAgAHAAdQBsAHMAYQByAHMAIABwAHIAZQBmAGUAcgBlAG4AdABpAGEAbABsAHkAIABoAGEAdgBlACAAcwB0AGUAZQBwAGUAcgAgAHIAYQBkAGkAbwAgAHMAcABlAGMAdAByAGEALgAgAEwATwBUAEEAQQBTACAAaQBzACAAdABoAGUAIABkAGUAZQBwAGUAcwB0ACAAYQBsAGwALQBzAGsAeQAgAHAAdQBsAHMAYQByACAAcwB1AHIAdgBlAHkAIAB1AHMAaQBuAGcAIABhACAAZABpAGcAaQB0AGEAbAAgAGEAcABlAHIAdAB1AHIAZQAgAGEAcgByAGEAeQA7ACAAdwBlACAAZABpAHMAYwB1AHMAcwAgAHMAbwBtAGUAIABvAGYAIAB0AGgAZQAgAGwAZQBzAHMAbwBuAHMAIABsAGUAYQByAG4AZQBkACAAdABoAGEAdAAgAGMAYQBuACAAaQBuAGYAbwByAG0AIAB0AGgAZQAgAGEAcABwAHIAbwBhAGMAaAAgAGYAbwByACAAcwBpAG0AaQBsAGEAcgAgAHMAdQByAHYAZQB5AHMAIAB1AHMAaQBuAGcAIABmAHUAdAB1AHIAZQAgAHIAYQBkAGkAbwAgAHQAZQBsAGUAcwBjAG8AcABlAHMAIABzAHUAYwBoACAAYQBzACAAdABoAGUAIABTAHEAdQBhAHIAZQAgAEsAaQBsAG8AbQBlAHQAcgBlACAAQQByAHIAYQB5AC4AAAAzaHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovQStBLzYyNi9BMTA0AAABMgBTAGEAbgBpAGQAYQBzACAAUwAuADsAIABDAG8AbwBwAGUAcgAgAFMALgA7ACAAQgBhAHMAcwBhACAAQwAuAEcALgA7ACAASABlAHMAcwBlAGwAcwAgAEoALgBXAC4AVAAuADsAIABLAG8AbgBkAHIAYQB0AGkAZQB2ACAAVgAuAEkALgA7ACAATQBpAGMAaABpAGwAbABpACAARAAuADsAIABT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AHMAdABlAG0AIABhAG4AZAAgAHQAaABlACAAVwBpAGQAZQBiAGEAbgBkACAAQQByAGUAYwBpAGIAbwAgAFAAdQBsAHMAYQByACAAUAByAG8AYwBlAHMAcwBvAHIAIABzAHAAZQBjAHQAcgBhAGwAIABwAHIAbwBjAGUAcwBzAG8AcgBzAC4AIABXAGgAaQBsAGUAIAB0AGgAZQBzAGUAIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAHcAZQByAGUAIABnAGUAYQByAGUAZAAgAG0AYQBpAG4AbAB5ACAAYQB0ACAAdABlAHMAdABpAG4AZwAgAGEAbgBkACAAZABlAGIAdQBnAGcAaQBuAGcAIABzAHUAcgB2AGUAeQAgAHMAdAByAGEAdABlAGcAeQAsACAAaABhAHIAZAB3AGEAcgBlACwAIABhAG4AZAAgAHMAbwBmAHQAdwBhAHIAZQAsACAAYQBwAHAAcgBvAHgAaQBtAGEAdABlAGwAeQAgADQAOABoAHIAIABvAGYAIAB0AGUAbABlAHMAYwBvAHAAZQAgAHQAaQBtAGUAIAB5AGkAZQBsAGQAZQBkACAAcwBjAGkAZQBuAGMAZQAtAHEAdQBhAGwAaQB0AHkAIABkAGEAdABhAC4AIABUAG8AIAB0AGUAcwB0ACAAbwB1AHIAIABhAGIAaQBsAGkAdAB5ACAAdABvACAAZABpAHMAYwByAGkAbQBpAG4AYQB0AGUAIABjAG8AcwBtAGkAYwAgAHMAaQBnAG4AYQBsAHMAIABmAHIAbwBtACAAcgBhAGQAaQBvAC0AZgByAGUAcQB1AGUAbgBjAHkAIABpAG4AdABlAHIAZgBlAHIAZQBuAGMAZQAgAGEAbgBkACAAbgBvAGkAcwBlACwAIAAxADYANQAgAGMAYQBuAGQAaQBkAGEAdABlAHMAIAByAGEAbgBnAGkAbgBnACAAaQBuACAAcgBlAGwAaQBhAGIAaQBsAGkAdAB5ACAAbABpAGsAZQBsAGkAaABvAG8AZAAgAHcAZQByAGUAIAByAGUAbwBiAHMAZQByAHYAZQBkACAAdwBpAHQAaAAgAHQAaABlACAAcwBpAG4AZwBsAGUALQBiAGUAYQBtACAATAAtAGIAYQBuAGQAIAB3AGkAZABlACAAcwB5AHMAdABlAG0AIABhAHQAIABBAHIAZQBjAGkAYgBvACAAaQBuACAAMgAwADAANQAgAEoAYQBuAHUAYQByAHkALQBGAGUAYgByAHUAYQByAHkALgAgAE8AZgAgAHQAaABvAHMAZQAsACAANAAxACUAIAB3AGUAcgBlACAAYwBvAG4AZgBpAHIAbQBlAGQAIABhAHMAIAByAGUAYQBsAC4AIABXAGUAIABwAHIAZQBzAGUAbgB0ACAAdABoAGUAIAByAGUAcwB1AGwAdABzACAAbwBmACAAYgBvAHQAaAAgAHQAaABlACAAQQBMAEYAQQAgAGEAbgBkACAAdABoAGUAIABzAGkAbgBnAGwAZQAtAGIAZQBhAG0AIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAGYAbwByACAAdABoAGUAIABzAGEAbQBwAGwAZQAgAG8AZgAgADEANgA2ACAAYwBvAG4AZgBpAHIAbQBlAGQAIABIAEkAIABzAG8AdQByAGMAZQBzACwAIABhAHMAIAB3AGUAbABsACAAYQBzACAAbwB1AHIAIABhAHMAcwBlAHMAcwBtAGUAbgB0ACAAbwBmACAAdABoAGUAaQByACAAbwBwAHQAaQBjAGEAbAAgAGMAbwB1AG4AdABlAHIAcABhAHIAdABzAC4AAAAyaHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovQUovMTMwLzI2MTMAAAEWAEcAaQBvAHYAYQBuAGUAbABsAGkAIABSAC4AOwAgAEgAYQB5AG4AZQBzACAATQAuAFAALgA7ACAASwBlAG4AdAAgAEIALgBSAC4AOwAgAFAAZQByAGkAbABsAGEAdAAgAFAALgA7ACAAQwBhAHQAaQBuAGUAbABsAGEAIABCAC4AOwAgAEgAbwBmAGYAbQBhAG4AIABHAC4ATAAuADsAIABNAG8AbQBqAGkAYQBuACAARQAuADsAIABSAG8AcwBlAG4AYgBlAHIAZwAgAEoALgBMAC4AOwAgAFMAYQBpAG4AdABvAG4AZwBlACAAQQAuADsAIABTAHAAZQBrAGsAZQBuAHMAIABLAC4AOwAgAFMAdABpAGUAcgB3AGEAbAB0ACAAUwAuADsAIABCAHIAbwBzAGMAaAAgAE4ALgA7ACAATQBhAHMAdABlAHIAcwAgAEsALgBMAC4AOwAgAFMAcAByAGkAbgBnAG8AYgAgAEMALgBNAC4AOwAgAEsAYQByAGEAYwBoAGUAbgB0AHMAZQB2ACAASQAuAEQALgA7ACAASwBhAHIAYQBjAGgAZQBuAHQAcwBlAHYAYQAgAFYALgBFAC4AOwAgAEsAbwBvAHAAbQBhAG4AbgAgAFIALgBBAC4AOwAgAE0AdQBsAGwAZQByACAARQAuADsAIAB2AGEAbgAgAEQAcgBpAGUAbAAgAFcALgA7ACAAdgBhAG4AIABaAGUAZQAgAEwALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGV/wAAAAAAABXJhZGlvAAAC12h0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9BSi8xMzAvMjYxMzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0FKLzEzMC8yNjEzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BSi8xMzAvMjYxMy9kYXRhPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BSi8xMzAvMjYxMy90YWJsZTM/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL0FKLzEzMC8yNjEzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovQUovMTMwLzI2MTM6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FKLzEzMC8yNjEzL2RhdGE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FKLzEzMC8yNjEzL3RhYmxlMz8AAAEvOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoAAABAXZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwAAAAmTo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZAAAAB5pdm86Ly9jZHMudml6aWVyL2ovYXBqLzY0Mi84NjgAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAANSi9BcEovNjQyLzg2OAAAACEAUgBvAHQAYQB0AGkAbwBuACAAbQBlAGEAcwB1AHIAZQBzACAAZgBvAHIAIAAyADIAMwAgAHAAdQBsAHMAYQByAHMAAAAIcmVzZWFyY2gAAAEdAFQAaABlACAAbABhAHIAZwBlAC0AcwBjAGEAbABlACAAbQBhAGcAbgBlAHQAaQBjACAAZgBpAGUAbABkACAAbwBmACAAbwB1AHIAIABHAGEAbABhAHgAeQAgAGMAYQBuACAAYgBlACAAcAByAG8AYgBlAGQAIABpAG4AIAB0AGgAcgBlAGUAIABkAGkAbQBlAG4AcwBpAG8AbgBzACAAdQBzAGkAbgBnACAARgBhAHIAYQBkAGEAeQAgAHIAbwB0AGEAdABpAG8AbgAgAG8AZgAgAHAAdQBsAHMAYQByACAAcwBpAGcAbgBhAGwAcwAuACAAVwBlACAAcgBlAHAAbwByAHQAIABvAG4AIAB0AGgAZQAgAGQAZQB0AGUAcgBtAGkAbgBhAHQAaQBvAG4AIABvAGYAIAAyADIAMwAgAHIAbwB0AGEAdABpAG8AbgAgAG0AZQBhAHMAdQByAGUAcwAgAGYAcgBvAG0AIABwAG8AbABhAHIAaQB6AGEAdABpAG8AbgAgAG8AYgBzAGUAcgB2AGEAdABpAG8AbgBzACAAbwBmACAAcgBlAGwAYQB0AGkAdgBlAGwAeQAgAGQAaQBzAHQAYQBuAHQAIABzAG8AdQB0AGgAZQByAG4AIABwAHUAbABzAGEAcgBzACAAbQBhAGQAZQAgAHUAcwBpAG4AZwAgAHQAaABlACAAUABhAHIAawBlAHMAIAByAGEAZABpAG8AIAB0AGUAbABlAHMAYwBvAHAAZQAuAAAAMmh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL0FwSi82NDIvODY4AAAAPwBIAGEAbgAgAEoALgBMAC4AOwAgAE0AYQBuAGMAaABlAHMAdABlAHIAIABSAC4ATgAuADsAIABMAHkAbgBlACAAQQAuAEcALgA7ACAAUQBpAGEAbwAgAEcALgBKAC4AOwAgAFYAYQBuACAAUwB0AHIAYQB0AGUAbgAgAFcALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGV/wAAAAAAABXJhZGlvAAABFmh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0FwSi82NDIvODY4Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BcEovNjQyLzg2OC90YWJsZTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL0FwSi82NDIvODY4AAAAZDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6OjoAAABednM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3NlcgAAADM6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjoAAAAdaXZvOi8vY2RzLnZpemllci9qL2Fwai83NjkvNjYAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAMSi9BcEovNzY5LzY2AAAAJwBUAGgAZQAgAEUATABNACAAcwB1AHIAdgBlAHkALgAgAFYALgAgAFcAaABpAHQAZQAgAGQAdwBhAHIAZgAgAGIAaQBuAGEAcgBpAGUAcwAAAAhyZXNlYXJjaAAAA4wAVwBlACAAcAByAGUAcwBlAG4AdAAgAHQAaABlACAAZABpAHMAYwBvAHYAZQByAHkAIABvAGYAIAAxADcAIABsAG8AdwAtAG0AYQBzAHMAIAB3AGgAaQB0AGUAIABkAHcAYQByAGYAcwAgACgAVwBEAHMAKQAgAGkAbgAgAHMAaABvAHIAdAAtAHAAZQByAGkAbwBkACAAKABQADwAPQAxACAAZABhAHkAKQAgAGIAaQBuAGEAcgBpAGUAcwAuACAATwB1AHIAIABzAGEAbQBwAGwAZQAgAGkAbgBjAGwAdQBkAGUAcwAgAGYAbwB1AHIAIABvAGIAagBlAGMAdABzACAAdwBpAHQAaAAgAHIAZQBtAGEAcgBrAGEAYgBsAGUAIABsAG8AZwBnAD0AfgA1ACAAcwB1AHIAZgBhAGMAZQAgAGcAcgBhAHYAaQB0AGkAZQBzACAAYQBuAGQAIABvAHIAYgBpAHQAYQBsACAAcwBvAGwAdQB0AGkAbwBuAHMAIAB0AGgAYQB0ACAAcgBlAHEAdQBpAHIAZQAgAHQAaABlAG0AIAB0AG8AIABiAGUAIABkAG8AdQBiAGwAZQAgAGQAZQBnAGUAbgBlAHIAYQB0AGUAIABiAGkAbgBhAHIAaQBlAHMALgAgAEEAbABsACAAbwBmACAAdABoAGUAIABsAG8AdwBlAHMAdAAgAHMAdQByAGYAYQBjAGUAIABnAHIAYQB2AGkAdAB5ACAAVwBEAHMAIABoAGEAdgBlACAAbQBlAHQAYQBsACAAbABpAG4AZQBzACAAaQBuACAAdABoAGUAaQByACAAcwBwAGUAYwB0AHIAYQAgAGkAbQBwAGwAeQBpAG4AZwAgAGwAbwBuAGcAIABnAHIAYQB2AGkAdABhAHQAaQBvAG4AYQBsACAAcwBlAHQAdABsAGkAbgBnACAAdABpAG0AZQBzACAAbwByACAAbwBuAGcAbwBpAG4AZwAgAGEAYwBjAHIAZQB0AGkAbwBuAC4AIABOAG8AdABhAGIAbAB5ACwAIABzAGkAeAAgAG8AZgAgAHQAaABlACAAVwBEAHMAIABpAG4AIABvAHUAcgAgAHMAYQBtAHAAbABlACAAaABhAHYAZQAgAGIAaQBuAGEAcgB5ACAAbQBlAHIAZwBlAHIAIAB0AGkAbQBlAHMAIAA8ADEAMABHAHkAcgAuACAARgBvAHUAcgAgAGgAYQB2AGUAIAA+AH4AMAAuADkATQBfAHsAcwB1AG4AfQBfACAAYwBvAG0AcABhAG4AaQBvAG4AcwAuACAASQBmACAAdABoAGUAIABjAG8AbQBwAGEAbgBpAG8AbgBzACAAYQByAGUAIABtAGEAcwBzAGkAdgBlACAAVwBEAHMALAAgAHQAaABlAHMAZQAgAGYAbwB1AHIAIABiAGkAbgBhAHIAaQBlAHMAIAB3AGkAbABsACAAZQB2AG8AbAB2AGUAIABpAG4AdABvACAAcwB0AGEAYgBsAGUAIABtAGEAcwBzACAAdAByAGEAbgBzAGYAZQByACAAQQBNACAAQwBWAG4AIABzAHkAcwB0AGUAbQBzACAAYQBuAGQAIABwAG8AcwBzAGkAYgBsAHkAIABlAHgAcABsAG8AZABlACAAYQBzACAAdQBuAGQAZQByAGwAdQBtAGkAbgBvAHUAcwAgAHMAdQBwAGUAcgBuAG8AdgBhAGUALgAgAEkAZgAgAHQAaABlACAAYwBvAG0AcABhAG4AaQBvAG4AcwAgAGEAcgBlACAAbgBlAHUAdAByAG8AbgAgAHMAdABhAHIAcwAsACAAdABoAGUAbgAgAHQAaABlAHMAZQAgAG0AYQB5ACAAYgBlACAAbQBpAGwAbABpAHMAZQBjAG8AbgBkACAAcAB1AGwAcwBhAHIAIABiAGkAbgBhAHIAaQBlAHMALgAgAFQAaABlAHMAZQAgAGQAaQBzAGMAbwB2AGUAcgBpAGUAcwAgAGkAbgBjAHIAZQBhAHMAZQAgAHQAaABlACAAbgB1AG0AYgBlAHIAIABvAGYAIABkAGUAdABhAGMAaABlAGQALAAgAGQAbwB1AGIAbABlACAAZABlAGcAZQBuAGUAcgBhAHQAZQAgAGIAaQBuAGEAcgBpAGUAcwAgAGkAbgAgAHQAaABlACAARQB4AHQAcgBlAG0AZQBsAHkAIABsAG8AdwAgAG0AYQBzAHMAIAAoAEUATABNACkAIABTAHUAcgB2AGUAeQAgAHQAbwAgADUANAA7ACAAMwAxACAAbwBmACAAdABoAGUAcwBlACAAYgBpAG4AYQByAGkAZQBzACAAdwBpAGwAbAAgAG0AZQByAGcAZQAgAHcAaQB0AGgAaQBuACAAYQAgAEgAdQBiAGIAbABlACAAdABpAG0AZQAuAAAAMWh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL0FwSi83NjkvNjYAAABCAEIAcgBvAHcAbgAgAFcALgBSAC4AOwAgAEsAaQBsAGkAYwAgAE0ALgA7ACAAQQBsAGwAZQBuAGQAZQAgAFAAcgBpAGUAdABvACAAQwAuADsAIABHAGkAYQBuAG4AaQBuAGEAcwAgAEEALgA7ACAASwBlAG4AeQBvAG4AIABTAC4ASgAuAAAAB2NhdGFsb2cAAAAHYmliY29kZX/AAAAAAAAHb3B0aWNhbAAAARJodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQXBKLzc2OS82Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9BcEovNzY5LzY2Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FwSi83NjkvNjYvd2RiaW4/AAAAZDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAABednI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADM6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAeaXZvOi8vY2RzLnZpemllci9qL2Fwai84NjEvMTEzAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAADUovQXBKLzg2MS8xMTMAAAAsAFYATABCAEEAIABhAHMAdAByAG8AbQBlAHQAcgB5ACAAYwBvAG0AYgBpAG4AZQBkACAAdwBpAHQAaAAgAEcAYQBpAGEAIABEAFIAMQAgAGUAcABvAGMAaAAAAAhyZXNlYXJjaAAABXUAVABoAGUAIABjAGEAbgBvAG4AaQBjAGEAbAAgAG0AZQB0AGgAbwBkAHMAIABmAG8AcgAgAGcAcgBhAHYAaQB0AGEAdABpAG8AbgBhAGwAIAB3AGEAdgBlACAAZABlAHQAZQBjAHQAaQBvAG4AIABhAHIAZQAgAGcAcgBvAHUAbgBkAC0AIABhAG4AZAAgAHMAcABhAGMAZQAtACAAYgBhAHMAZQBkACAAbABhAHMAZQByACAAaQBuAHQAZQByAGYAZQByAG8AbQBlAHQAcgB5ACwAIABwAHUAbABzAGEAcgAgAHQAaQBtAGkAbgBnACwAIABhAG4AZAAgAHAAbwBsAGEAcgBpAHoAYQB0AGkAbwBuACAAbwBmACAAdABoAGUAIABjAG8AcwBtAGkAYwAgAG0AaQBjAHIAbwB3AGEAdgBlACAAYgBhAGMAawBnAHIAbwB1AG4AZAAuACAAQgB1AHQAIABhAHMAIABoAGEAcwAgAGIAZQBlAG4AIABzAHUAZwBnAGUAcwB0AGUAZAAgAGIAeQAgAG4AdQBtAGUAcgBvAHUAcwAgAGkAbgB2AGUAcwB0AGkAZwBhAHQAbwByAHMALAAgAGEAcwB0AHIAbwBtAGUAdAByAHkAIABvAGYAZgBlAHIAcwAgAGEAbgAgAGEAZABkAGkAdABpAG8AbgBhAGwAIABwAGEAdABoACAAdABvACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAIABkAGUAdABlAGMAdABpAG8AbgAuACAARwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAcwAgAGQAZQBmAGwAZQBjAHQAIABsAGkAZwBoAHQAIAByAGEAeQBzACAAbwBmACAAZQB4AHQAcgBhAGcAYQBsAGEAYwB0AGkAYwAgAG8AYgBqAGUAYwB0AHMALAAgAGMAcgBlAGEAdABpAG4AZwAgAGEAcABwAGEAcgBlAG4AdAAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAgAGkAbgAgAGEAIABxAHUAYQBkAHIAdQBwAG8AbABhAHIAIAAoAGEAbgBkACAAaABpAGcAaABlAHIALQBvAHIAZABlAHIAIABtAG8AZABlAHMAKQAgAHAAYQB0AHQAZQByAG4ALgAgAEEAcwB0AHIAbwBtAGUAdAByAHkAIABvAGYAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAcgBhAGQAaQBvACAAcwBvAHUAcgBjAGUAcwAgAGkAcwAgAHMAZQBuAHMAaQB0AGkAdgBlACAAdABvACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAcwAgAHcAaQB0AGgAIABmAHIAZQBxAHUAZQBuAGMAaQBlAHMAIABiAGUAdAB3AGUAZQBuACAAcgBvAHUAZwBoAGwAeQAgADEAMABeAC0AMQA4AF4AIABhAG4AZAAgADEAMABeAC0AOABeAEgAegAgACgASABfADAAXwAgAGEAbgBkACAAMQAvADMAeQByAF4ALQAxAF4AKQAsACAAbwB2AGUAcgBsAGEAcABwAGkAbgBnACAAYQBuAGQAIABiAHIAaQBkAGcAaQBuAGcAIAB0AGgAZQAgAHAAdQBsAHMAYQByACAAdABpAG0AaQBuAGcAIABhAG4AZAAgAEMATQBCACAAcABvAGwAYQByAGkAegBhAHQAaQBvAG4AIAByAGUAZwBpAG0AZQBzAC4AIABXAGUAIABwAHIAZQBzAGUAbgB0ACAAYQAgAG0AZQB0AGgAbwBkAG8AbABvAGcAeQAgAGYAbwByACAAYQBzAHQAcgBvAG0AZQB0AHIAaQBjACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAIABkAGUAdABlAGMAdABpAG8AbgAgAGkAbgAgAHQAaABlACAAcAByAGUAcwBlAG4AYwBlACAAbwBmACAAbABhAHIAZwBlACAAaQBuAHQAcgBpAG4AcwBpAGMAIAB1AG4AYwBvAHIAcgBlAGwAYQB0AGUAZAAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAgACgAaQAuAGUALgAsACAAcgBhAGQAaQBvACAAagBlAHQAcwApAC4AIABXAGUAIABvAGIAdABhAGkAbgAgADkANQAlACAAYwBvAG4AZgBpAGQAZQBuAGMAZQAgAGwAaQBtAGkAdABzACAAbwBuACAAdABoAGUAIABzAHQAbwBjAGgAYQBzAHQAaQBjACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAIABiAGEAYwBrAGcAcgBvAHUAbgBkACAAdQBzAGkAbgBnACAANwAxADEAIAByAGEAZABpAG8AIABzAG8AdQByAGMAZQBzACwAIAB7AE8AbQBlAGcAYQB9AF8ARwBXAF8APAAwAC4AMAAwADYANAAsACAAYQBuAGQAIAB1AHMAaQBuAGcAIAA1ADAAOAAgAHIAYQBkAGkAbwAgAHMAbwB1AHIAYwBlAHMAIABjAG8AbQBiAGkAbgBlAGQAIAB3AGkAdABoACAAdABoAGUAIABmAGkAcgBzAHQAIABHAGEAaQBhACAAZABhAHQAYQAgAHIAZQBsAGUAYQBzAGUAOgAgAHsATwBtAGUAZwBhAH0AXwBHAFcAXwA8ADAALgAwADEAMQAuACAAVABoAGUAcwBlACAAbABpAG0AaQB0AHMAIABwAHIAbwBiAGUAIABnAHIAYQB2AGkAdABhAHQAaQBvAG4AYQBsACAAdwBhAHYAZQAgAGYAcgBlAHEAdQBlAG4AYwBpAGUAcwAgADYAeAAxADAAXgAtADEAOABeAEgAegA8AH4AZgA8AH4AMQB4ADEAMABeAC0AOQBeAEgAegAuACAAVQBzAGkAbgBnACAAYQAgAFcASQBTAEUALQBHAGEAaQBhACAAYwBhAHQAYQBsAG8AZwAgAG8AZgAgADUANgA3ADcAMgAxACAAQQBHAE4ALAAgAHcAZQAgAHAAcgBlAGQAaQBjAHQAIABhACAAbABpAG0AaQB0ACAAZQB4AHAAZQBjAHQAZQBkACAAZgByAG8AbQAgAEcAYQBpAGEAIABhAGwAbwBuAGUAIABvAGYAIAB7AE8AbQBlAGcAYQB9AF8ARwBXAF8APAAwAC4AMAAwADAANgAsACAAdwBoAGkAYwBoACAAaQBzACAAcwBpAGcAbgBpAGYAaQBjAGEAbgB0AGwAeQAgAGgAaQBnAGgAZQByACAAdABoAGEAbgAgAHcAYQBzACAAbwByAGkAZwBpAG4AYQBsAGwAeQAgAGYAbwByAGUAYwBhAHMAdAAuACAASQBuAGMAaQBkAGUAbgB0AGEAbABsAHkALAAgAHcAZQAgAGQAZQB0AGUAYwB0ACAAYQBuAGQAIAByAGUAcABvAHIAdAAgAG8AbgAgADIAMgAgAG4AZQB3ACAAZQB4AGEAbQBwAGwAZQBzACAAbwBmACAAbwBwAHQAaQBjAGEAbAAgAHMAdQBwAGUAcgBsAHUAbQBpAG4AYQBsACAAbQBvAHQAaQBvAG4AIAB3AGkAdABoACAAcgBlAGQAcwBoAGkAZgB0AHMAIAAwAC4AMQAzAC0AMwAuADgAOQAuAAAAMmh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL0FwSi84NjEvMTEzAAAAJgBEAGEAcgBsAGkAbgBnACAASgAuADsAIABUAHIAdQBlAGIAZQBuAGIAYQBjAGgAIABBAC4ARQAuADsAIABQAGEAaQBuAGUAIABKAC4AAAAHY2F0YWxvZwAAAAdiaWJjb2Rlf8AAAAAAAA1vcHRpY2FsI3JhZGlvAAABFmh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0FwSi84NjEvMTEzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FwSi84NjEvMTEzL3RhYmxlNz86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQXBKLzg2MS8xMTM6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwAAAAZDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXgAAABednM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADM6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAhaXZvOi8vY2RzLnZpemllci9qL21ucmFzLzM1OS8xNTI0AAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAAEEovTU5SQVMvMzU5LzE1MjQAAAArADEAMAAgAG4AZQB3ACAAcAB1AGwAcwBhAHIAcwAgAGkAbgAgAEEAcgBlAGMAaQBiAG8AIABkAHIAaQBmAHQALQBzAGMAYQBuACAAcwB1AHIAdgBlAHkAAAAIcmVzZWFyY2gAAAPJAFcAZQAgAHAAcgBlAHMAZQBuAHQAIAB0AGgAZQAgAHIAZQBzAHUAbAB0AHMAIABvAGYAIABhACAANAAzADAALQBNAEgAegAgAHMAdQByAHYAZQB5ACAAZgBvAHIAIABwAHUAbABzAGEAcgBzACAAYwBvAG4AZAB1AGMAdABlAGQAIABkAHUAcgBpAG4AZwAgAHQAaABlACAAdQBwAGcAcgBhAGQAZQAgAHQAbwAgAHQAaABlACAAMwAwADUALQBtACAAQQByAGUAYwBpAGIAbwAgAHIAYQBkAGkAbwAgAHQAZQBsAGUAcwBjAG8AcABlAC4AIABPAHUAcgAgAHMAdQByAHYAZQB5ACAAYwBvAHYAZQByAGUAZAAgAGEAIAB0AG8AdABhAGwAIABvAGYAIAAxADEANAA3AGQAZQBnAF4AMgBeACAAbwBmACAAcwBrAHkAIAB1AHMAaQBuAGcAIABhACAAZAByAGkAZgB0AC0AcwBjAGEAbgAgAHQAZQBjAGgAbgBpAHEAdQBlAC4AIABXAGUAIABkAGUAdABlAGMAdABlAGQAIAAzADMAIABwAHUAbABzAGEAcgBzACwAIAAxADAAIABvAGYAIAB3AGgAaQBjAGgAIAB3AGUAcgBlACAAbgBvAHQAIABrAG4AbwB3AG4AIABwAHIAaQBvAHIAIAB0AG8AIAB0AGgAZQAgAHMAdQByAHYAZQB5ACAAbwBiAHMAZQByAHYAYQB0AGkAbwBuAHMALgAgAFQAaABlACAAaABpAGcAaABsAGkAZwBoAHQAIABvAGYAIAB0AGgAZQAgAG4AZQB3ACAAZABpAHMAYwBvAHYAZQByAGkAZQBzACAAaQBzACAAUABTAFIAIABKADAANAAwADcAKwAxADYAMAA3ACwAIAB3AGgAaQBjAGgAIABoAGEAcwAgAGEAIABzAHAAaQBuACAAcABlAHIAaQBvAGQAIABvAGYAIAAyADUALgA3AG0AcwAsACAAYQAgAGMAaABhAHIAYQBjAHQAZQByAGkAcwB0AGkAYwAgAGEAZwBlACAAbwBmACAAMQAuADUARwB5AHIAIABhAG4AZAAgAGkAcwAgAGkAbgAgAGEAIAAxAC4AOAAtAHkAcgAgAG8AcgBiAGkAdAAgAGEAYgBvAHUAdAAgAGEAIABsAG8AdwAtAG0AYQBzAHMAIAAoAD4AMAAuADIATQApACAAYwBvAG0AcABhAG4AaQBvAG4ALgAgAFQAaABlACAAbABvAG4AZwAgAG8AcgBiAGkAdABhAGwAIABwAGUAcgBpAG8AZAAgAGEAbgBkACAAcwBtAGEAbABsACAAZQBjAGMAZQBuAHQAcgBpAGMAaQB0AHkAIAAoAGUAPQAwAC4AMAAwADAAOQApACAAbQBhAGsAZQAgAHQAaABlACAAYgBpAG4AYQByAHkAIABzAHkAcwB0AGUAbQAgAGEAbgAgAGkAbQBwAG8AcgB0AGEAbgB0ACAAbgBlAHcAIABhAGQAZABpAHQAaQBvAG4AIAB0AG8AIAB0AGgAZQAgAGUAbgBzAGUAbQBiAGwAZQAgAG8AZgAgAGIAaQBuAGEAcgB5ACAAcAB1AGwAcwBhAHIAcwAgAHMAdQBpAHQAYQBiAGwAZQAgAHQAbwAgAHQAZQBzAHQAIABmAG8AcgAgAHYAaQBvAGwAYQB0AGkAbwBuAHMAIABvAGYAIAB0AGgAZQAgAHMAdAByAG8AbgBnACAAZQBxAHUAaQB2AGEAbABlAG4AYwBlACAAcAByAGkAbgBjAGkAcABsAGUALgAgAFcAZQAgAGEAbABzAG8AIAByAGUAcABvAHIAdAAgAG8AbgAgAG8AdQByACAAaQBuAGkAdABpAGEAbABsAHkAIAB1AG4AcwB1AGMAYwBlAHMAcwBmAHUAbAAgAGEAdAB0AGUAbQBwAHQAcwAgAHQAbwAgAGQAZQB0AGUAYwB0ACAAbwBwAHQAaQBjAGEAbABsAHkAIAB0AGgAZQAgAGMAbwBtAHAAYQBuAGkAbwBuACAAdABvACAASgAwADQAMAA3ACsAMQA2ADAANwAsACAAdwBoAGkAYwBoACAAaQBtAHAAbAB5ACAAdABoAGEAdAAgAGkAdABzACAAYQBiAHMAbwBsAHUAdABlACAAdgBpAHMAdQBhAGwAIABtAGEAZwBuAGkAdAB1AGQAZQAgAGkAcwAgAD4AMQAyAC4AMQAuACAASQBmACwAIABhAHMAIABlAHgAcABlAGMAdABlAGQAIABvAG4AIABlAHYAbwBsAHUAdABpAG8AbgBhAHIAeQAgAGcAcgBvAHUAbgBkAHMALAAgAHQAaABlACAAYwBvAG0AcABhAG4AaQBvAG4AIABpAHMAIABhAG4AIABIAGUAIAB3AGgAaQB0AGUAIABkAHcAYQByAGYALAAgAG8AdQByACAAbgBvAG4ALQBkAGUAdABlAGMAdABpAG8AbgAgAGkAbQBwAGwAaQBlAHMAIABhACAAYwBvAG8AbABpAG4AZwAg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ACAAcAB1AGwAcwBhAHIAcwAgAGgAYQB2AGUAIABzAHAAaQBuACAAcABlAHIAaQBvAGQAcwAgAGcAcgBlAGEAdABlAHIAIAB0AGgAYQBuACAAMQAwADAAbQBzACwAIABhAG4AZAAgAG4AbwBuAGUAIABvAGYAIAB0AGgAbwBzAGUAIAB3AGkAdABoACAAdABpAG0AaQBuAGcAIABzAG8AbAB1AHQAaQBvAG4AcwAgAGkAcwAgAGkAbgAgAGIAaQBuAGEAcgBpAGUAcwAuACAAVAB3AG8AIABkAGkAcwBwAGwAYQB5ACAAcABhAHIAdABpAGMAdQBsAGEAcgBsAHkAIABpAG4AdABlAHIAZQBzAHQAaQBuAGcAIABiAGUAaABhAHYAaQBvAHUAcgA7ACAAUABTAFIAIABKADEAMAA1ADQALQA1ADkANAA0ACAAaQBzACAAZgBvAHUAbgBkACAAdABvACAAYgBlACAAYQBuACAAaQBuAHQAZQByAG0AaQB0AHQAZQBuAHQAIABwAHUAbABzAGEAcgAsACAAYQBuAGQAIABQAFMAUgAgAEoAMQA4ADAAOQAtADAAMQAxADkAIABoAGEAcwAgAGcAbABpAHQAYwBoAGUAZAAgAHQAdwBpAGMAZQAgAHMAaQBuAGMAZQAgAGkAdABzACAAZABpAHMAYwBvAHYAZQByAHkALgAgAEkAbgAgAHQAaABlACAAcwBlAGMAbwBuAGQAIABoAGEAbABmACAAbwBmACAAdABoAGUAIABwAGEAcABlAHIAIAB3AGUAIABkAGkAcwBjAHUAcwBzACAAdABoAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABhAG4AZAAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAgAG8AZgAgAGEAbgAgAGEAcgB0AGkAZgBpAGMAaQBhAGwAIABuAGUAdQByAGEAbAAgAG4AZQB0AHcAbwByAGsAIABpAG4AIAB0AGgAZQAgAGQAYQB0AGEALQBwAHIAbwBjAGUAcwBzAGkAbgBnACAAcABpAHAAZQBsAGkAbgBlACAAZgBvAHIAIAB0AGgAZQAgAHMAdQByAHYAZQB5AC4AIABXAGUAIABkAGkAcwBjAHUAcwBzACAAdABoAGUAIAB0AGUAcwB0AHMAIAB0AGgAYQB0ACAAdwBlAHIAZQAgAHUAcwBlAGQAIAB0AG8AIABnAGUAbgBlAHIAYQB0AGUAIABzAGMAbwByAGUAcwAgAGEAbgBkACAAZgBpAG4AZAAgAHQAaABhAHQAIABvAHUAcgAgAG4AZQB1AHIAYQBsACAAbgBlAHQAdwBvAHIAawAgAHcAYQBzACAAYQBiAGwAZQAgAHQAbwAgAHIAZQBqAGUAYwB0ACAAbwB2AGUAcgAgADkAOQBwAGUAcgAgAGMAZQBuAHQAIABvAGYAIAB0AGgAZQAgAGMAYQBuAGQAaQBkAGEAdABlAHMAIABwAHIAbwBkAHUAYwBlAGQAIABpAG4AIAB0AGgAZQAgAGQAYQB0AGEAIABwAHIAbwBjAGUAcwBzAGkAbgBnACwAIABhAG4AZAAgAGEAYgBsAGUAIAB0AG8AIABiAGwAaQBuAGQAbAB5ACAAZABlAHQAZQBjAHQAIAA4ADUAcABlAHIAIABjAGUAbgB0ACAAbwBmACAAcAB1AGwAcwBhAHIAcwAuACAAVwBlACAAcwB1AGcAZwBlAHMAdAAgAHQAaABhAHQAIABpAG0AcAByAG8AdgBlAG0AZQBuAHQAcwAgAHQAbwAgAHQAaABlACAAYQBjAGMAdQByAGEAYwB5ACAAcwBoAG8AdQBsAGQAIABiAGUAIABwAG8AcwBzAGkAYgBsAGUAIABpAGYAIABmAHUAcgB0AGgAZQByACAAYwBhAHIAZQAgAGkAcwAgAHQAYQBrAGUAbgAgAHcAaABlAG4AIAB0AHIAYQBpAG4AaQBuAGcAIABhAG4AIABhAHIAdABpAGYAaQBjAGkAYQBsACAAbgBlAHUAcgBhAGwAIABuAGUAdAB3AG8AcgBrADsAIABmAG8AcgAgAGUAeABhAG0AcABsAGUALAAgAGUAbgBzAHUAcgBpAG4AZwAgAHQAaABhAHQAIABhACAAcgBlAHAAcgBlAHMAZQBuAHQAYQB0AGkAdgBlACAAcwBhAG0AcABsAGUAIABvAGYAIAB0AGgAZQAgAHAAdQBsAHMAYQByACAAcABvAHAAdQBsAGEAdABpAG8AbgAgAGkAcwAgAHUAcwBlAGQAIABkAHUAcgBpAG4AZwAgAHQAaABlACAAdAByAGEAaQBuAGkAbgBnACAAcAByAG8AYwBlAHMAcwAsACAAbwByACAAdABoAGUAIAB1AHMAZQAgAG8AZgAgAGQAaQBmAGYAZQByAGUAbgB0ACAAYQByAHQAaQBmAGkAYwBpAGEAbAAgAG4AZQB1AHIAYQBsACAAbgBlAHQAdwBvAHIAawBzACAAZgBvAHIAIAB0AGgAZQAgAGQAZQB0AGUAYwB0AGkAbwBuACAAbwBmACAAZABpAGYAZgBlAHIAZQBuAHQAIAB0AHkAcABlAHMAIABvAGYAIABwAHUAbABzAGEAcgBzAC4AAAA1aHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovTU5SQVMvNDI3LzEwNTIAAAELAEIAYQB0AGUAcwAgAFMALgBEAC4AOwAgAEIAYQBpAGwAZQBzACAATQAuADsAIABCAGEAcgBzAGQAZQBsAGwAIABCAC4AUgAuADsAIABCAGgAYQB0ACAATgAuAEQALgBSAC4AOwAgAEIAdQByAGcAYQB5ACAATQAuADsAIABCAHUAcgBrAGUALQBTAHAAbwBsAGEAbwByACAAUwAuADsAIABDAGgAYQBtAHAAaQBvAG4AIABEAC4ASgAuADsAIABDAG8AcwB0AGUAcgAgAFAALgA7ACAARAAnAEEAbQBpAGMAbwAgAE4ALgA7ACAASgBhAG0AZQBzAG8AbgAgAEEALgA7ACAASgBvAGgAbgBzAHQAbwBuACAAUwAuADsAIABLAGUAaQB0AGgAIABNAC4ASgAuADsAIABLAHIAYQBtAGUAcgAgAE0ALgA7ACAATABlAHYAaQBuACAATAAuADsAIABMAHkAbgBlACAAQQAuADsAIABNAGkAbABpAGEAIABTAC4AOwAgAE4AZwAgAEMALgA7ACAATgBpAGUAdABuAGUAcgAgAEMALgA7ACAAUABvAHMAcwBlAG4AdABpACAAQQAuADsAIABTAHQAYQBwAHAAZQByAHMAIABCAC4AOwAgAFQAaABvAHIAbgB0AG8AbgAgAEQALgA7ACAAVgBhAG4AIABTAHQAcgBhAHQAZQBuACAAVwAuAAAAB2NhdGFsb2cAAAAHYmliY29kZX/AAAAAAAAFcmFkaW8AAAF0aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQyNy8xMDUyL3RhYmxlMzQ/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQyNy8xMDUyL3RhYmxlYTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQyNy8xMDUyOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQyNy8xMDUyAAAAkGl2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OgAAAHl2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyAAAARXN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OgAAACFpdm86Ly9jZHMudml6aWVyL2ovbW5yYXMvNDM2LzM1NTcAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQSi9NTlJBUy80MzYvMzU1NwAAACwASABUAFIAVQAgAHMAdQByAHYAZQB5ADoAIABsAG8AbgBnAC0AcABlAHIAaQBvAGQAIABwAHUAbABzAGEAcgBzACAAcABvAGwAYQByAGkAbQBlAHQAcgB5AAAACHJlc2VhcmNoAAAEqQBXAGUAIABwAHIAZQBzAGUAbgB0ACAAYQAgAHAAbwBsAGEAcgBpAG0AZQB0AHIAaQBjACAAYQBuAGEAbAB5AHMAaQBzACAAbwBmACAANAA5ACAAbABvAG4AZwAtAHAAZQByAGkAbwBkACAAcAB1AGwAcwBhAHIAcwAgAGQAaQBzAGMAbwB2AGUAcgBlAGQAIABhAHMAIABwAGEAcgB0ACAAbwBmACAAdABoAGUAIABIAGkAZwBoACAAVABpAG0AZQAgAFIAZQBzAG8AbAB1AHQAaQBvAG4AIABVAG4AaQB2AGUAcgBzAGUAIAAoAEgAVABSAFUAKQAgAHMAbwB1AHQAaABlAHIAbgAgAHMAdQByAHYAZQB5AC4AIABUAGgAZQAgAHMAbwB1AHIAYwBlAHMAIABlAHgAaABpAGIAaQB0ACAAdABoAGUAIAB0AHkAcABpAGMAYQBsACAAYwBoAGEAcgBhAGMAdABlAHIAaQBzAHQAaQBjAHMAIABvAGYAIAAnAG8AbABkACcAIABwAHUAbABzAGEAcgBzACwAIAB3AGkAdABoACAAbABvAHcAIABmAHIAYQBjAHQAaQBvAG4AYQBsACAAbABpAG4AZQBhAHIAIABhAG4AZAAgAGMAaQByAGMAdQBsAGEAcgAgAHAAbwBsAGEAcgBpAHoAYQB0AGkAbwBuACAAYQBuAGQAIABuAGEAcgByAG8AdwAsACAAbQB1AGwAdABpAC0AYwBvAG0AcABvAG4AZQBuAHQAIABwAHIAbwBmAGkAbABlAHMALgAgAEEAbAB0AGgAbwB1AGcAaAAgAHQAaABlACAAcABvAHMAaQB0AGkAbwBuACAAYQBuAGcAbABlACAAcwB3AGkAbgBnAHMAIABhAHIAZQAgAGcAZQBuAGUAcgBhAGwAbAB5ACAAYwBvAG0AcABsAGUAeAAsACAAZgBvAHIAIAB0AHcAbwAgAG8AZgAgAHQAaABlACAAYQBuAGEAbAB5AHMAZQBkACAAcAB1AGwAcwBhAHIAcwAgACgASgAxADYAMgAyAC0AMwA3ADUAMQAgAGEAbgBkACAASgAxADcAMQAwAC0AMgA2ADEANgApACAAdwBlACAAbwBiAHQAYQBpAG4AZQBkACAAYQBuACAAaQBuAGQAaQBjAGEAdABpAG8AbgAgAG8AZgAgAHQAaABlACAAZwBlAG8AbQBlAHQAcgB5ACAAdgBpAGEAIAB0AGgAZQAgAHIAbwB0AGEAdABpAG4AZwAgAHYAZQBjAHQAbwByACAAbQBvAGQAZQBsAC4AIABXAGUAIAB3AGUAcgBlACAAYQBiAGwAZQAgAHQAbwAgAGQAZQB0AGUAcgBtAGkAbgBlACAAYQAgAHYAYQBsAHUAZQAgAG8AZgAgAHQAaABlACAAcgBvAHQAYQB0AGkAbwBuACAAbQBlAGEAcwB1AHIAZQAgACgAUgBNACkAIABmAG8AcgAgADMANAAgAG8AZgAgAHQAaABlACAAcwBvAHUAcgBjAGUAcwAgAHcAaABpAGMAaAAsACAAdwBoAGUAbgAgAGMAbwBtAGIAaQBuAGUAZAAgAHcAaQB0AGgAIAB0AGgAZQBpAHIAIABkAGkAcwBwAGUAcgBzAGkAbwBuACAAbQBlAGEAcwB1AHIAZQBzACAAKABEAE0AKQAsACAAeQBpAGUAbABkAHMAIABhAG4AIABpAG4AdABlAGcAcgBhAHQAZQBkACAAbQBhAGcAbgBlAHQAaQBjACAAZgBpAGUAbABkACAAcwB0AHIAZQBuAGcAdABoACAAYQBsAG8AbgBnACAAdABoAGUAIABsAGkAbgBlACAAbwBmACAAcwBpAGcAaAB0AC4AIABXAGkAdABoACAAdABoAGUAIABkAGEAdABhACAAcAByAGUAcwBlAG4AdABlAGQAIABoAGUAcgBlACwAIAB0AGgAZQAgAHQAbwB0AGEAbAAgAG4AdQBtAGIAZQByACAAbwBmACAAdgBhAGwAdQBlAHMAIABvAGYAIABSAE0AIABhAHMAcwBvAGMAaQBhAHQAZQBkACAAdwBpAHQAaAAgAHAAdQBsAHMAYQByAHMAIABkAGkAcwBjAG8AdgBlAHIAZQBkACAAZAB1AHIAaQBuAGcAIAB0AGgAZQAgAEgAVABSAFUAIABzAG8AdQB0AGgAZQByAG4AIABzAHUAcgB2AGUAeQAgAHMAdQBtAHMAIAB0AG8AIAA1ADEALgAgAFQAaABlACAAUgBNAHMAIABhAHIAZQAgAG4AbwB0ACAAYwBvAG4AcwBpAHMAdABlAG4AdAAgAHcAaQB0AGgAIAB0AGgAZQAgAGgAeQBwAG8AdABoAGUAcwBpAHMAIABvAGYAIABhACAAYwBvAHUAbgB0AGUAcgAtAGMAbABvAGMAawB3AGkAcwBlACAAZABpAHIAZQBjAHQAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAG0AYQBnAG4AZQB0AGkAYwAgAGYAaQBlAGwAZAAgAHcAaQB0AGgAaQBuACAAYQBuACAAYQBuAG4AdQBsAHUAcwAgAGkAbgBjAGwAdQBkAGUAZAAgAGIAZQB0AHcAZQBlAG4AIAA0ACAAYQBuAGQAIAA2AGsAcABjACAAZgByAG8AbQAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAQwBlAG4AdAByAGUALgAgAEEAIABwAGEAcgB0AGkAYQBsACAAYQBnAHIAZQBlAG0AZQBuAHQAIAB3AGkAdABoACAAYQAgAGMAbwB1AG4AdABlAHIALQBjAGwAbwBjAGsAdwBpAHMAZQAgAHMAZQBuAHMAZQAgAG8AZgAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAbQBhAGcAbgBlAHQAaQBjACAAZgBpAGUAbABkACAAdwBpAHQAaABpAG4AIAB0AGgAZQAgAHMAcABpAHIAYQBsACAAYQByAG0AcwAgAGkAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAZgBvAHUAbgBkACAAaQBuACAAdABoAGUAIABhAHIAZQBhACAAbwBmACAAdABoAGUAIABDAGEAcgBpAG4AYQAtAFMAYQBnAGkAdAB0AGEAcgBpAHUAcwAgAGEAcgBtAC4AAAA1aHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovTU5SQVMvNDM2LzM1NTcAAADnAFQAaQBiAHUAcgB6AGkAIABDAC4AOwAgAEoAbwBoAG4AcwB0AG8AbgAgAFMALgA7ACAAQgBhAGkAbABlAHMAIABNAC4AOwAgAEIAYQB0AGUAcwAgAFMALgBEAC4AOwAgAEIAaABhAHQAIABOAC4ARAAuAFIALgA7ACAAQgB1AHIAZwBhAHkAIABNAC4AOwAgAEIAdQByAGsAZQAtAFMAcABvAGwAYQBvAHIAIABTAC4AOwAgAEMAaABhAG0AcABpAG8AbgAgAEQALgA7ACAAQwBvAHMAdABlAHIAIABQAC4AOwAgAEQAJwBBAG0AaQBjAG8AIABOAC4AOwAgAEsAZQBpAHQAaAAgAE0ALgBKAC4AOwAgAEsAcgBhAG0AZQByACAATQAuADsAIABMAGUAdgBpAG4AIABMAC4AOwAgAE0AaQBsAGkAYQAgAFMALgA7ACAATgBnACAAQwAuADsAIABQAG8AcwBzAGUAbgB0AGkAIABBAC4AOwAgAFMAdABhAHAAcABlAHIAcwAgAEIALgBXAC4AOwAgAFQAaABvAHIAbgB0AG8AbgAgAEQALgA7ACAAdgBhAG4AIABTAHQAcgBhAHQAZQBuACAAVwAuAAAAB2NhdGFsb2cAAAAHYmliY29kZX/AAAAAAAAFcmFkaW8AAALzaHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQzNi8zNTU3L3RhYmxlMj86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovTU5SQVMvNDM2LzM1NTc6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9NTlJBUy80MzYvMzU1Nzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovTU5SQVMvNDM2LzM1NTcvdGFibGUyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80MzYvMzU1Ny90YWJsZTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQzNi8zNTU3Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNDM2LzM1NTc6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQzNi8zNTU3L3RhYmxlMT8AAAEvaXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoAAABAXZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwAAAAmXN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZAAAACFpdm86Ly9jZHMudml6aWVyL2ovbW5yYXMvNDU4LzMzNDEAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQSi9NTlJBUy80NTgvMzM0MQAAACwANAAyACAAbQBpAGwAbABpAHMAZQBjAG8AbgBkACAAcAB1AGwAcwBhAHIAcwAgAGgAaQBnAGgALQBwAHIAZQBjAGkAcwBpAG8AbgAgAHQAaQBtAGkAbgBnAAAACHJlc2VhcmNoAAAGYABXAGUAIAByAGUAcABvAHIAdAAgAG8AbgAgAHQAaABlACAAaABpAGcAaAAtAHAAcgBlAGMAaQBzAGkAbwBuACAAdABpAG0AaQBuAGcAIABvAGYAIAA0ADIAIAByAGEAZABpAG8AIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACAAKABNAFMAUABzACkAIABvAGIAcwBlAHIAdgBlAGQAIABiAHkAIAB0AGgAZQAgAEUAdQByAG8AcABlAGEAbgAgAFAAdQBsAHMAYQByACAAVABpAG0AaQBuAGcAIABBAHIAcgBhAHkAIAAoAEUAUABUAEEAKQAuACAAVABoAGkAcwAgAEUAUABUAEEAIABEAGEAdABhACAAUgBlAGwAZQBhAHMAZQAgADEALgAwACAAZQB4AHQAZQBuAGQAcwAgAHUAcAAgAHQAbwAgAG0AaQBkAC0AMgAwADEANAAgAGEAbgBkACAAYgBhAHMAZQBsAGkAbgBlAHMAIAByAGEAbgBnAGUAIABmAHIAbwBtACAANwAtADEAOAB5AHIALgAgAEkAdAAgAGYAbwByAG0AcwAgAHQAaABlACAAYgBhAHMAaQBzACAAZgBvAHIAIAB0AGgAZQAgAHMAdABvAGMAaABhAHMAdABpAGMAIABnAHIAYQB2AGkAdABhAHQAaQBvAG4AYQBsAC0AdwBhAHYAZQAgAGIAYQBjAGsAZwByAG8AdQBuAGQALAAgAGEAbgBpAHMAbwB0AHIAbwBwAGkAYwAgAGIAYQBjAGsAZwByAG8AdQBuAGQALAAgAGEAbgBkACAAYwBvAG4AdABpAG4AdQBvAHUAcwAtAHcAYQB2AGUAIABsAGkAbQBpAHQAcwAgAHIAZQBjAGUAbgB0AGwAeQAgAHAAcgBlAHMAZQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABFAFAAVABBACAAZQBsAHMAZQB3AGgAZQByAGUALgAgAFQAaABlACAAQgBhAHkAZQBzAGkAYQBuACAAdABpAG0AaQBuAGcAIABhAG4AYQBsAHkAcwBpAHMAIABwAGUAcgBmAG8AcgBtAGUAZAAgAHcAaQB0AGgAIABUAEUATQBQAE8ATgBFAFMAVAAgAHkAaQBlAGwAZABzACAAdABoAGUAIABkAGUAdABlAGMAdABpAG8AbgAgAG8AZgAgAHMAZQB2AGUAcgBhAGwAIABuAGUAdwAgAHAAYQByAGEAbQBlAHQAZQByAHMAOgAgAHMAZQB2AGUAbgAgAHAAYQByAGEAbABsAGEAeABlAHMALAAgAG4AaQBuAGUAIABwAHIAbwBwAGUAcgAgAG0AbwB0AGkAbwBuAHMAIABhAG4AZAAsACAAaQBuACAAdABoAGUAIABjAGEAcwBlACAAbwBmACAAcwBpAHgAIABiAGkAbgBhAHIAeQAgAHAAdQBsAHMAYQByAHMALAAgAGEAbgAgAGEAcABwAGEAcgBlAG4AdAAgAGMAaABhAG4AZwBlACAAbwBmACAAdABoAGUAIABzAGUAbQBpAG0AYQBqAG8AcgAgAGEAeABpAHMALgAgAFcAZQAgAGYAaQBuAGQAIAB0AGgAZQAgAE4ARQAyADAAMAAxACAARwBhAGwAYQBjAHQAaQBjACAAZQBsAGUAYwB0AHIAbwBuACAAZABlAG4AcwBpAHQAeQAgAG0AbwBkAGUAbAAgAHQAbwAgAGIAZQAgAGEAIABiAGUAdAB0AGUAcgAgAG0AYQB0AGMAaAAgAHQAbwAgAG8AdQByACAAcABhAHIAYQBsAGwAYQB4ACAAZABpAHMAdABhAG4AYwBlAHMAIAAoAGEAZgB0AGUAcgAgAGMAbwByAHIAZQBjAHQAaQBvAG4AIABmAHIAbwBtACAAdABoAGUAIABMAHUAdAB6AC0ASwBlAGwAawBlAHIAIABiAGkAYQBzACkAIAB0AGgAYQBuACAAdABoAGUAIABNADIAIABhAG4AZAAgAE0AMwAgAG0AbwBkAGUAbABzACAAYgB5ACAAUwBjAGgAbgBpAHQAegBlAGwAZQByAC4AIABIAG8AdwBlAHYAZQByACwAIAB3AGUAIABtAGUAYQBzAHUAcgBlACAAYQBuACAAYQB2AGUAcgBhAGcAZQAgAHUAbgBjAGUAcgB0AGEAaQBuAHQAeQAgAG8AZgAgADgAMAAgAHAAZQByACAAYwBlAG4AdAAgACgAZgByAGEAYwB0AGkAbwBuAGEAbAApACAAZgBvAHIAIABOAEUAMgAwADAAMQAsACAAdABoAHIAZQBlACAAdABpAG0AZQBzACAAbABhAHIAZwBlAHIAIAB0AGgAYQBuACAAdwBoAGEAdAAgAGkAcwAgAHQAeQBwAGkAYwBhAGwAbAB5ACAAYQBzAHMAdQBtAGUAZAAgAGkAbgAgAHQAaABlACAAbABpAHQAZQByAGEAdAB1AHIAZQAuACAAVwBlACAAcgBlAHYAaQBzAGkAdAAgAHQAaABlACAAdAByAGEAbgBzAHYAZQByAHMAZQAgAHYAZQBsAG8AYwBpAHQAeQAgAGQAaQBzAHQAcgBpAGIAdQB0AGkAbwBuACAAZgBvAHIAIABhACAAcwBlAHQAIABvAGYAIAAxADkAIABpAHMAbwBsAGEAdABlAGQAIABhAG4AZAAgADUANwAgAGIAaQBuAGEAcgB5ACAATQBTAFAAcwAgAGEAbgBkACAAZgBpAG4AZAAgAG4AbwAgAHMAdABhAHQAaQBzAHQAaQBjAGEAbAAgAGQAaQBmAGYAZQByAGUAbgBjAGUAIABiAGUAdAB3AGUAZQBuACAAdABoAGUAcwBlACAAdAB3AG8AIABwAG8AcAB1AGwAYQB0AGkAbwBuAHMALgAgAFcAZQAgAGQAZQB0AGUAYwB0ACAAUwBoAGEAcABpAHIAbwAgAGQAZQBsAGEAeQAgAGkAbgAgAHQAaABlACAAdABpAG0AaQBuAGcAIAByAGUAcwBpAGQAdQBhAGwAcwAgAG8AZgAgAFAAUwBSAHMAIABKADEANgAwADAALQAzADAANQAzACAAYQBuAGQAIABKADEAOQAxADgALQAwADYANAAyACwAIABpAG0AcABsAHkAaQBuAGcAIABwAHUAbABzAGEAcgAgAGEAbgBkACAAYwBvAG0AcABhAG4AaQBvAG4AIABtAGEAcwBzAGUAcwAgAG0AcAA9ADEALgAyADIAXgArADAALgA1AF4AXwAtADAALgAzADUAXwBNAF8AewBzAHUAbgB9AF8ALAAgAG0AYwA9ADAALgAyADEAXgArADAALgAwADYAXgBfAC0AMAAuADAANABfAE0AXwB7AHMAdQBuAH0AXwAgAGEAbgBkACAAbQBwAD0AMQAuADIANQBeACsAMAAuADYAXgBfAC0AMAAuADQAXwBNAF8AewBzAHUAbgB9AH0ALAAgAG0AYwA9ADAALgAyADMAXgArADAALgAwADcAXgBfAC0AMAAuADAANQBfAE0AXwB7AHMAdQBuAH0AXwAsACAAcgBlAHMAcABlAGMAdABpAHYAZQBsAHkALgAgAEYAaQBuAGEAbABsAHkALAAgAHcAZQAgAHUAcwBlACAAdABoAGUAIABtAGUAYQBzAHUAcgBlAG0AZQBuAHQAIABvAGYAIAB0AGgAZQAgAG8AcgBiAGkAdABhAGwAIABwAGUAcgBpAG8AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB0AG8AIABzAGUAdAAgAGEAIABzAHQAcgBpAG4AZwBlAG4AdAAgAGMAbwBuAHMAdAByAGEAaQBuAHQAIABvAG4AIAB0AGgAZQAgAGQAaQBzAHQAYQBuAGMAZQAgAHQAbwAgAFAAUwBSAHMAIABKADEAMAAxADIAKwA1ADMAMAA3ACAAYQBuAGQAIABKADEAOQAwADkALQAzADcANAA0ACwAIABhAG4AZAAgAHMAZQB0ACAAbABpAG0AaQB0AHMAIABvAG4AIAB0AGgAZQAgAGwAbwBuAGcAaQB0AHUAZABlACAAbwBmACAAYQBzAGMAZQBuAGQAaQBuAGcAIABuAG8AZABlACAAdABoAHIAbwB1AGcAaAAgAHQAaABlACAAcwBlAGEAcgBjAGgAIABvAGYAIAB0AGgAZQAgAGEAbgBuAHUAYQBsAC0AbwByAGIAaQB0AGEAbAAgAHAAYQByAGEAbABsAGEAeAAgAGYAbwByACAAUABTAFIAcwAgAEoAMQA2ADAAMAAtADMAMAA1ADMAIABhAG4AZAAgAEoAMQA5ADAAOQAtADMANwA0ADQALgAAADVodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9NTlJBUy80NTgvMzM0MQAAAiMARABlAHMAdgBpAGcAbgBlAHMAIABHAC4AOwAgAEMAYQBiAGEAbABsAGUAcgBvACAAUgAuAE4ALgA7ACAATABlAG4AdABhAHQAaQAgAEwALgA7ACAAVgBlAHIAYgBpAGUAcwB0ACAASgAuAFAALgBXAC4AOwAgAEMAaABhAG0AcABpAG8AbgAgAEQALgBKAC4AOwAgAFMAdABhAHAAcABlAHIAcwAgAEIALgBXAC4AOwAgAEoAYQBuAHMAcwBlAG4AIABHAC4ASAAuADsAIABMAGEAegBhAHIAdQBzACAAUAAuADsAIABPAHMAbABvAHcAcwBrAGkAIABTAC4AOwAgAEIAYQBiAGEAawAgAFMALgA7ACAAQgBhAHMAcwBhACAAQwAuAEcALgA7ACAAQgByAGUAbQAgAFAALgA7ACAAQgB1AHIAZwBhAHkAIABNAC4AOwAgAEMAbwBnAG4AYQByAGQAIABJAC4AOwAgAEcAYQBpAHIAIABKAC4AUgAuADsAIABHAHIAYQBpAGsAbwB1ACAARQAuADsAIABHAHUAaQBsAGwAZQBtAG8AdAAgAEwALgA7ACAASABlAHMAcwBlAGwAcwAgAEoALgBXAC4AVAAuADsAIABKAGUAcwBzAG4AZQByACAAQQAuADsAIABKAG8AcgBkAGEAbgAgAEMALgA7ACAASwBhAHIAdQBwAHAAdQBzAGEAbQB5ACAAUgAuADsAIABLAHIAYQBtAGUAcgAgAE0ALgA7ACAATABhAHMAcwB1AHMAIABBAC4AOwAgAEwAYQB6AGEAcgBpAGQAaQBzACAASwAuADsAIABMAGUAZQAgAEsALgBKAC4AOwAgAEwAaQB1ACAASwAuADsAIABMAHkAbgBlACAAQQAuAEcALgA7ACAATQBjAGsAZQBlACAASgAuADsAIABNAGkAbgBnAGEAcgBlAGwAbABpACAAQwAuAE0ALgBGAC4AOwAgAFAAZQByAHIAbwBkAGkAbgAgAEQALgA7ACAAUABlAHQAaQB0AGUAYQB1ACAAQQAuADsAIABQAG8AcwBzAGUAbgB0AGkAIABBAC4AOwAgAFAAdQByAHYAZQByACAATQAuAEIALgA7ACAAUgBvAHMAYQBkAG8AIABQAC4AQQAuADsAIABTAGEAbgBpAGQAYQBzACAAUwAuADsAIABTAGUAcwBhAG4AYQAgAEEALgA7ACAAUwBoAGEAaQBmAHUAbABsAGEAaAAgAEcALgA7ACAAUwBtAGkAdABzACAAUgAuADsAIABUAGEAeQBsAG8AcgAgAFMALgBSAC4AOwAgAFQAaABlAHUAcgBlAGEAdQAgAEcALgA7ACAAVABpAGIAdQByAHoAaQAgAEMALgA7ACAAVgBhAG4AIABIAGEAYQBzAHQAZQByAGUAbgAgAFIALgA7ACAAVgBlAGMAYwBoAGkAbwAgAEEALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGV/wAAAAAAABXJhZGlvAAAIOmh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ1OC8zMzQxL3RhYjItMTI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNDU4LzMzNDE6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ1OC8zMzQxL3RhYjItMTI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNDU4LzMzNDE6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ1OC8zMzQxL3RhYjItMTI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MQAAAxY6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6AAAC7HZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXIAAAG/Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6AAAAIGl2bzovL2Nkcy52aXppZXIvai9tbnJhcy80NTkvMTQwAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAAD0ovTU5SQVMvNDU5LzE0MAAAACYATQA4ADEALAAgAEwATQBDACAAYQBuAGQAIAAzAEMAIAAyADcAMwAvAEMAbwBtAGEAIAAxADcALQA2ADAAawBlAFYAIABvAGIAcwAuAAAACHJlc2VhcmNoAAAGFgBXAGUAIABwAHIAZQBzAGUAbgB0ACAAcgBlAHMAdQBsAHQAcwAgAG8AZgAgAGEAIABkAGUAZQBwACAAcwB1AHIAdgBlAHkAIABvAGYAIAB0AGgAcgBlAGUAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAZgBpAGUAbABkAHMALAAgAE0AOAAxACAAKABlAHgAcABvAHMAdQByAGUAIABvAGYAIAA5AC4ANwBNAHMAKQAsACAATABhAHIAZwBlACAATQBhAGcAZQBsAGwAYQBuAGkAYwAgAEMAbABvAHUAZAAgACgANgAuADgAIABNAHMAKQAgAGEAbgBkACAAMwBDACAAMgA3ADMALwBDAG8AbQBhACAAKAA5AC4AMwBNAHMAKQAsACAAaQBuACAAdABoAGUAIABoAGEAcgBkACAAWAAtAHIAYQB5ACAAKAAxADcALQA2ADAAawBlAFYAKQAgAGUAbgBlAHIAZwB5ACAAYgBhAG4AZAAgAHcAaQB0AGgAIAB0AGgAZQAgAEkAQgBJAFMAIAB0AGUAbABlAHMAYwBvAHAAZQAgAG8AbgBiAG8AYQByAGQAIAB0AGgAZQAgAEkATgBUAEUARwBSAEEATAAgAG8AYgBzAGUAcgB2AGEAdABvAHIAeQAsACAAYgBhAHMAZQBkACAAbwBuACAAMQAyACAAeQBlAGEAcgBzACAAbwBmACAAbwBiAHMAZQByAHYAYQB0AGkAbwBuAHMAIAAoADIAMAAwADMALQAyADAAMQA1ACkALgAgAFQAaABlACAAYwBvAG0AYgBpAG4AZQBkACAAcwB1AHIAdgBlAHkAIAByAGUAYQBjAGgAZQBzACAAYQAgADQAewBzAGkAZwBtAGEAfQAgAHAAZQBhAGsAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABvAGYAIAAwAC4AMQA4AG0AQwByAGEAYgAgACgAMgAuADYAeAAxADAAXgAtADEAMgBeAGUAcgBnAC8AcwAvAGMAbQBeADIAXgApACAAYQBuAGQAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABiAGUAdAB0AGUAcgAgAHQAaABhAG4AIAAwAC4AMgA1ACAAYQBuAGQAIAAwAC4AOAA3AG0AQwByAGEAYgAgAG8AdgBlAHIAIAAxADAAIABwAGUAcgAgAGMAZQBuAHQAIABhAG4AZAAgADkAMAAgAHAAZQByACAAYwBlAG4AdAAgAG8AZgAgAGkAdABzACAAZgB1AGwAbAAgAGEAcgBlAGEAIABvAGYAIAA0ADkAMAAwACAAZABlAGcAXgAyAF4ALAAgAHIAZQBzAHAAZQBjAHQAaQB2AGUAbAB5AC4AIABXAGUAIABoAGEAdgBlACAAZABlAHQAZQBjAHQAZQBkACAAaQBuACAAdABvAHQAYQBsACAAMQA0ADcAIABzAG8AdQByAGMAZQBzACAAYQB0ACAAUwAvAE4APgA0AHsAcwBpAGcAbQBhAH0ALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAMwA3ACAAcwBvAHUAcgBjAGUAcwAgAG8AYgBzAGUAcgB2AGUAZAAgAGkAbgAgAGgAYQByAGQAIABYAC0AcgBhAHkAcwAgAGYAbwByACAAdABoAGUAIABmAGkAcgBzAHQAIAB0AGkAbQBlAC4AIABUAGgAZQAgAHMAdQByAHYAZQB5ACAAaQBzACAAZABvAG0AaQBuAGEAdABlAGQAIABiAHkAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAcwBvAHUAcgBjAGUAcwAsACAAbQBvAHMAdABsAHkAIABhAGMAdABpAHYAZQAgAGcAYQBsAGEAYwB0AGkAYwAgAG4AdQBjAGwAZQBpACAAKABBAEcATgApAC4AIABUAGgAZQAgAHMAYQBtAHAAbABlACAAbwBmACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgAHMAbwB1AHIAYwBlAHMAIABjAG8AbgB0AGEAaQBuAHMAIAA5ADgAIABBAEcATgAgACgAaQBuAGMAbAB1AGQAaQBuAGcAIAA2ADQAIABTAGUAeQBmAGUAcgB0ACAAZwBhAGwAYQB4AGkAZQBzACwAIABzAGUAdgBlAG4AIABsAG8AdwAtAGkAbwBuAGkAegBhAHQAaQBvAG4AIABuAHUAYwBsAGUAYQByACAAZQBtAGkAcwBzAGkAbwBuAC0AbABpAG4AZQAgAHIAZQBnAGkAbwBuACAAZwBhAGwAYQB4AGkAZQBzACwAIAB0AGgAcgBlAGUAIABYAC0AcgBhAHkAIABiAHIAaQBnAGgAdAAgAG8AcAB0AGkAYwBhAGwAbAB5ACAAbgBvAHIAbQBhAGwAIABnAGEAbABhAHgAaQBlAHMALAAgADEANgAgAGIAbABhAHoAYQByAHMAIABhAG4AZAAgAGUAaQBnAGgAdAAgAEEARwBOACAAbwBmACAAdQBuAGMAbABlAGEAcgAgAG8AcAB0AGkAYwBhAGwAIABjAGwAYQBzAHMAKQAsACAAdAB3AG8AIABnAGEAbABhAHgAeQAgAGMAbAB1AHMAdABlAHIAcwAgACgAQwBvAG0AYQAgAGEAbgBkACAAQQBiAGUAbABsACAAMwAyADYANgApACwAIAAxADcAIABvAGIAagBlAGMAdABzACAAbABvAGMAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAATABhAHIAZwBlACAAYQBuAGQAIABTAG0AYQBsAGwAIABNAGEAZwBlAGwAbABhAG4AaQBjACAAQwBsAG8AdQBkAHMAIAAoADEAMwAgAGgAaQBnAGgALQAgAGEAbgBkACAAdAB3AG8AIABsAG8AdwAtAG0AYQBzAHMAIABYAC0AcgBhAHkAIABiAGkAbgBhAHIAaQBlAHMAIABhAG4AZAAgAHQAdwBvACAAWAAtAHIAYQB5ACAAcAB1AGwAcwBhAHIAcwApACwAIAB0AGgAcgBlAGUAIABHAGEAbABhAGMAdABpAGMAIABjAGEAdABhAGMAbAB5AHMAbQBpAGMAIAB2AGEAcgBpAGEAYgBsAGUAcwAsACAAbwBuAGUAIAB1AGwAdAByAGEAbAB1AG0AaQBuAG8AdQBzACAAWAAtAHIAYQB5ACAAcwBvAHUAcgBjAGUAIAAoAE0AOAAyACAAWAAtADEAKQAgAGEAbgBkACAAbwBuAGUAIABiAGwAZQBuAGQAZQBkACAAcwBvAHUAcgBjAGUAIAAoAFMAVwBJAEYAVAAgAEoAMQAxADAANQAuADcAKwA1ADgANQA0ACkALgAgAFQAaABlACAAbgBhAHQAdQByAGUAIABvAGYAIAAyADUAIABzAG8AdQByAGMAZQBzACAAcgBlAG0AYQBpAG4AcwAgAHUAbgBrAG4AbwB3AG4ALAAgAHMAbwAgAHQAaABhAHQAIAB0AGgAZQAgAHMAdQByAHYAZQB5ACcAcwAgAGkAZABlAG4AdABpAGYAaQBjAGEAdABpAG8AbgAgAGkAcwAgAGMAdQByAHIAZQBuAHQAbAB5ACAAYwBvAG0AcABsAGUAdABlACAAYQB0ACAAOAAzACAAcABlAHIAIABjAGUAbgB0AC4AIABXAGUAIABoAGEAdgBlACAAYwBvAG4AcwB0AHIAdQBjAHQAZQBkACAAQQBHAE4AIABuAHUAbQBiAGUAcgAtAGYAbAB1AHgAIAByAGUAbABhAHQAaQBvAG4AcwAgACgAbABvAGcAIABOAC0AbABvAGcAIABTACkAIABhAG4AZAAgAGMAYQBsAGMAdQBsAGEAdABlAGQAIABBAEcATgAgAG4AdQBtAGIAZQByACAAZABlAG4AcwBpAHQAaQBlAHMAIABpAG4AIAB0AGgAZQAgAGwAbwBjAGEAbAAgAFUAbgBpAHYAZQByAHMAZQAgAGYAbwByACAAdABoAGUAIABlAG4AdABpAHIAZQAgAHMAdQByAHYAZQB5ACAAYQBuAGQAIABmAG8AcgAgAGUAYQBjAGgAIABvAGYAIAB0AGgAZQAgAHQAaAByAGUAZQAgAGUAeAB0AHIAYQBnAGEAbABhAGMAdABpAGMAIABmAGkAZQBsAGQAcwAuAAAANGh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL01OUkFTLzQ1OS8xNDAAAABcAE0AZQByAGUAbQBpAG4AcwBrAGkAeQAgAEkALgBBAC4AOwAgAEsAcgBpAHYAbwBuAG8AcwAgAFIALgBBAC4AOwAgAEwAdQB0AG8AdgBpAG4AbwB2ACAAQQAuAEEALgA7ACAAUwBhAHoAbwBuAG8AdgAgAFMALgBZAC4AOwAgAFIAZQB2AG4AaQB2AHQAcwBlAHYAIABNAC4ARwAuADsAIABTAHUAbgB5AGEAZQB2ACAAUgAuAEEALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGV/wAAAAAAABXgtcmF5AAABHGh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9NTlJBUy80NTkvMTQwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OS8xNDA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovTU5SQVMvNDU5LzE0MC90YWJsZTE/AAAAZGl2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAABednM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADNzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAhaXZvOi8vY2RzLnZpemllci9qL21ucmFzLzQ4NC8zNjkxAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAAEEovTU5SQVMvNDg0LzM2OTEAAAAiAFUAVABNAE8AUwBUACAAcAB1AGwAcwBhAHIAIAB0AGkAbQBpAG4AZwAgAHAAcgBvAGcAcgBhAG0AbQBlAC4AIABJAC4AAAAIcmVzZWFyY2gAAAZHAFcAZQAgAHAAcgBlAHMAZQBuAHQAIABhAG4AIABvAHYAZQByAHYAaQBlAHcAIABhAG4AZAAgAHQAaABlACAAZgBpAHIAcwB0ACAAcgBlAHMAdQBsAHQAcwAgAGYAcgBvAG0AIABhACAAbABhAHIAZwBlAC0AcwBjAGEAbABlACAAcAB1AGwAcwBhAHIAIAB0AGkAbQBpAG4AZwAgAHAAcgBvAGcAcgBhAG0AbQBlACAAdABoAGEAdAAgAGkAcwAgAHAAYQByAHQAIABvAGYAIAB0AGgAZQAgAFUAVABNAE8AUwBUACAAcAByAG8AagBlAGMAdAAgAGEAdAAgAHQAaABlACAAcgBlAGYAdQByAGIAaQBzAGgAZQBkACAATQBvAGwAbwBuAGcAbABvACAATwBiAHMAZQByAHYAYQB0AG8AcgB5ACAAUwB5AG4AdABoAGUAcwBpAHMAIABSAGEAZABpAG8AIABUAGUAbABlAHMAYwBvAHAAZQAgACgATQBPAFMAVAApACAAbgBlAGEAcgAgAEMAYQBuAGIAZQByAHIAYQAsACAAQQB1AHMAdAByAGEAbABpAGEALgAgAFcAZQAgAGMAdQByAHIAZQBuAHQAbAB5ACAAbwBiAHMAZQByAHYAZQAgAG0AbwByAGUAIAB0AGgAYQBuACAANAAwADAAIABtAGEAaQBuAGwAeQAgAGIAcgBpAGcAaAB0ACAAcwBvAHUAdABoAGUAcgBuACAAcgBhAGQAaQBvACAAcAB1AGwAcwBhAHIAcwAgAHcAaQB0AGgAIAB1AHAAIAB0AG8AIABkAGEAaQBsAHkAIABjAGEAZABlAG4AYwBlAHMALgAgAEYAbwByACAAMgAwADUAIAAoADgAIABpAG4AIABiAGkAbgBhAHIAaQBlAHMALAAgADQAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACkALAAgAHcAZQAgAHAAdQBiAGwAaQBzAGgAIAB1AHAAZABhAHQAZQBkACAAdABpAG0AaQBuAGcAIABtAG8AZABlAGwAcwAsACAAdABvAGcAZQB0AGgAZQByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGYAbAB1AHgAIABkAGUAbgBzAGkAdABpAGUAcwAsACAAZgBsAHUAeAAgAGQAZQBuAHMAaQB0AHkAIAB2AGEAcgBpAGEAYgBpAGwAaQB0AHkALAAgAGEAbgBkACAAcAB1AGwAcwBlACAAdwBpAGQAdABoAHMAIABhAHQAIAA4ADQAMwAgAE0ASAB6ACwAIABkAGUAcgBpAHYAZQBkACAAZgByAG8AbQAgAG8AYgBzAGUAcgB2AGEAdABpAG8AbgBzACAAcwBwAGEAbgBuAGkAbgBnACAAYgBlAHQAdwBlAGUAbgAgADEALgA0ACAAYQBuAGQAIAAzACAAeQByAC4AIABJAG4AIABjAG8AbQBwAGEAcgBpAHMAbwBuACAAdwBpAHQAaAAgAHQAaABlACAAQQBUAE4ARgAgAHAAdQBsAHMAYQByACAAYwBhAHQAYQBsAG8AZwB1AGUALAAgAHcAZQAgAGkAbQBwAHIAbwB2AGUAIAB0AGgAZQAgAHAAcgBlAGMAaQBzAGkAbwBuACAAbwBmACAAdABoAGUAIAByAG8AdABhAHQAaQBvAG4AYQBsACAAYQBuAGQAIABhAHMAdAByAG8AbQBlAHQAcgBpAGMAIABwAGEAcgBhAG0AZQB0AGUAcgBzACAAZgBvAHIAIAAxADIAMwAgAHAAdQBsAHMAYQByAHMALAAgAGYAbwByACAANAA3ACAAYgB5ACAAYQB0ACAAbABlAGEAcwB0ACAAYQBuACAAbwByAGQAZQByACAAbwBmACAAbQBhAGcAbgBpAHQAdQBkAGUALgAgAFQAaABlACAAdABpAG0AZQAgAHMAcABhAG4AcwAgAGIAZQB0AHcAZQBlAG4AIABvAHUAcgAgAG0AZQBhAHMAdQByAGUAbQBlAG4AdABzACAAYQBuAGQAIAB0AGgAbwBzAGUAIABpAG4AIAB0AGgAZQAgAGwAaQB0AGUAcgBhAHQAdQByAGUAIABhAHIAZQAgAHUAcAAgAHQAbwAgADQAOAAgAHkAcgAsACAAdwBoAGkAYwBoACAAYQBsAGwAbwB3ACAAdQBzACAAdABvACAAaQBuAHYAZQBzAHQAaQBnAGEAdABlACAAdABoAGUAaQByACAAbABvAG4AZwAtAHQAZQByAG0AIABzAHAAaQBuAC0AZABvAHcAbgAgAGgAaQBzAHQAbwByAHkAIABhAG4AZAAgAHQAbwAgAGUAcwB0AGkAbQBhAHQAZQAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAgAGYAbwByACAANgAwACAAcAB1AGwAcwBhAHIAcwAsACAAbwBmACAAdwBoAGkAYwBoACAAMgA0ACAAYQByAGUAIABuAGUAdwBsAHkAIABkAGUAdABlAHIAbQBpAG4AZQBkACAAYQBuAGQAIABtAG8AcwB0ACAAYQByAGUAIABtAGEAagBvAHIAIABpAG0AcAByAG8AdgBlAG0AZQBuAHQAcwAuACAAVABoAGUAIAByAGUAcwB1AGwAdABzACAAYQByAGUAIABjAG8AbgBzAGkAcwB0AGUAbgB0ACAAdwBpAHQAaAAgAGkAbgB0AGUAcgBmAGUAcgBvAG0AZQB0AHIAaQBjACAAbQBlAGEAcwB1AHIAZQBtAGUAbgB0AHMAIABmAHIAbwBtACAAdABoAGUAIABsAGkAdABlAHIAYQB0AHUAcgBlAC4AIABBACAAbQBvAGQAZQBsACAAdwBpAHQAaAAgAHQAdwBvACAARwBhAHUAcwBzAGkAYQBuACAAYwBvAG0AcABvAG4AZQBuAHQAcwAgAGMAZQBuAHQAcgBlAGQAIABhAHQAIAAxADMAOQAgAGEAbgBkACAANAA2ADMAawBtAC8AcwAgAGYAaQB0AHMAIAB0AGgAZQAgAHQAcgBhAG4AcwB2AGUAcgBzAGUAIAB2AGUAbABvAGMAaQB0AHkAIABkAGkAcwB0AHIAaQBiAHUAdABpAG8AbgAgAGIAZQBzAHQALgAgAFQAaABlACAAcAB1AGwAcwBlACAAZAB1AHQAeQAgAGMAeQBjAGwAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGkAbwBuAHMAIABhAHQAIAA1ADAAIABhAG4AZAAgADEAMAAgAHAAZQByACAAYwBlAG4AdAAgAG0AYQB4AGkAbQB1AG0AIABhAHIAZQAgAGIAZQBzAHQAIABkAGUAcwBjAHIAaQBiAGUAZAAgAGIAeQAgAGwAbwBnAG4AbwByAG0AYQBsACAAZABpAHMAdAByAGkAYgB1AHQAaQBvAG4AcwAgAHcAaQB0AGgAIABtAGUAZABpAGEAbgBzACAAbwBmACAAMgAuADMAIABhAG4AZAAgADQALgA0ACAAcABlAHIAIABjAGUAbgB0ACwAIAByAGUAcwBwAGUAYwB0AGkAdgBlAGwAeQAuACAAVwBlACAAZABpAHMAYwB1AHMAcwAgAHQAdwBvACAAcAB1AGwAcwBhAHIAcwAgAHQAaABhAHQAIABlAHgAaABpAGIAaQB0ACAAcwBwAGkAbgAtAGQAbwB3AG4AIAByAGEAdABlACAAYwBoAGEAbgBnAGUAcwAgAGEAbgBkACAAZAByAGkAZgB0AGkAbgBnACAAcwB1AGIAcAB1AGwAcwBlAHMALgAgAEYAaQBuAGEAbABsAHkALAAgAHcAZQAgAGQAZQBzAGMAcgBpAGIAZQAgAHQAaABlACAAYQB1AHQAbwBuAG8AbQBvAHUAcwAgAG8AYgBzAGUAcgB2AGkAbgBnACAAcwB5AHMAdABlAG0AIABhAG4AZAAgAHQAaABlACAAZAB5AG4AYQBtAGkAYwAgAHMAYwBoAGUAZAB1AGwAZQByACAAdABoAGEAdAAgAGgAYQBzACAAaQBuAGMAcgBlAGEAcwBlAGQAIAB0AGgAZQAgAG8AYgBzAGUAcgB2AGkAbgBnACAAZQBmAGYAaQBjAGkAZQBuAGMAeQAgAGIAeQAgAGEAIABmAGEAYwB0AG8AcgAgAG8AZgAgADIALQAzACAAaQBuACAAYwBvAG0AcABhAHIAaQBzAG8AbgAgAHcAaQB0AGgAIABzAHQAYQB0AGkAYwAgAHMAYwBoAGUAZAB1AGwAaQBuAGcALgAAADVodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9NTlJBUy80ODQvMzY5MQAAAPUASgBhAG4AawBvAHcAcwBrAGkAIABGAC4AOwAgAEIAYQBpAGwAZQBzACAATQAuADsAIABWAGEAbgAg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eABwAGwAbwBzAGkAbwBuAHMALgAgAEgAbwB3AGUAdgBlAHIALAAgAHQAaABlACAAbwBiAHMAZQByAHYAZQBkACAAYgBpAG4AYQByAHkAIABmAHIAYQBjAHQAaQBvAG4AIABjAGEAbgAgAHMAdABpAGwAbAAgAGIAZQAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIABzAHQAcgBvAG4AZwAgAHMAZQBsAGUAYwB0AGkAbwBuACAAZQBmAGYAZQBjAHQAcwAsACAAYQBzACAAbQBvAG4AaQB0AG8AcgBpAG4AZwAgAG8AZgAgAG4AZQB3AGwAeQAgAGQAaQBzAGMAbwB2AGUAcgBlAGQAIABwAHUAbABzAGEAcgBzACAAaQBzACAAcgBhAHIAZQBsAHkAIABjAGEAcgByAGkAZQBkACAAbwB1AHQAIABmAG8AcgAgAGwAbwBuAGcAIABlAG4AbwB1AGcAaAAgAHQAbwAgAGMAbwBuAGMAbAB1AHMAaQB2AGUAbAB5ACAAcgB1AGwAZQAgAG8AdQB0ACAAbQB1AGwAdABpAHAAbABpAGMAaQB0AHkALgAgAEgAZQByAGUALAAgAHcAZQAgAHUAcwBlACAAdABoAGUAIABzAGUAYwBvAG4AZAAgAEcAYQBpAGEAIABkAGEAdABhACAAcgBlAGwAZQBhAHMAZQAgAHQAbwAgAHMAZQBhAHIAYwBoACAAZgBvAHIAIABjAG8AbQBwAGEAbgBpAG8AbgBzACAAdABvACAAMQA1ADMANAAgAHIAbwB0AGEAdABpAG8AbgAtAHAAbwB3AGUAcgBlAGQAIABwAHUAbABzAGEAcgBzACAAdwBpAHQAaAAgAHAAbwBzAGkAdABpAG8AbgBzACAAawBuAG8AdwBuACAAdABvACAAYgBlAHQAdABlAHIAIAB0AGgAYQBuACAAMAAuADUAYQByAGMAcwBlAGMALgAgAFcAZQAgAGYAaQBuAGQAIAAyADIAIABtAGEAdABjAGgAZQBzACAAdABvACAAawBuAG8AdwBuACAAcAB1AGwAcwBhAHIAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIAAxACAAbgBvAHQAIAByAGUAcABvAHIAdABlAGQAIABlAGwAcwBlAHcAaABlAHIAZQAsACAAYQBuAGQAIAA4ACAAbgBlAHcAIABwAG8AcwBzAGkAYgBsAGUAIABjAG8AbQBwAGEAbgBpAG8AbgBzACAAdABvACAAeQBvAHUAbgBnACAAcAB1AGwAcwBhAHIAcwAuACAAVwBlACAAZQB4AGEAbQBpAG4AZQAgAHQAaABlACAAcABoAG8AdABvAG0AZQB0AHIAaQBjACAAYQBuAGQAIABrAGkAbgBlAG0AYQB0AGkAYwAgAHAAcgBvAHAAZQByAHQAaQBlAHMAIABvAGYAIAB0AGgAZQBzAGUAIABzAHkAcwB0AGUAbQBzACAAYQBuAGQAIABwAHIAbwB2AGkAZABlACAAZQBtAHAAaQByAGkAYwBhAGwAIAByAGUAbABhAHQAaQBvAG4AcwAgAGYAbwByACAAaQBkAGUAbgB0AGkAZgB5AGkAbgBnACAARwBhAGkAYQAgAHMAbwB1AHIAYwBlAHMAIAB3AGkAdABoACAAcABvAHQAZQBuAHQAaQBhAGwAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgAgAGMAbwBtAHAAYQBuAGkAbwBuAHMALgAgAE8AdQByACAAcgBlAHMAdQBsAHQAcwAgAGMAbwBuAGYAaQByAG0AIAB0AGgAYQB0ACAAdABoAGUAIABvAGIAcwBlAHIAdgBlAGQAIABtAHUAbAB0AGkAcABsAGkAYwBpAHQAeQAgAGYAcgBhAGMAdABpAG8AbgAgAGkAcwAgAHMAbQBhAGwAbAAuACAASABvAHcAZQB2AGUAcgAsACAAdwBlACAAcwBoAG8AdwAgAHQAaABhAHQAIAB0AGgAZQAgAG4AdQBtAGIAZQByACAAbwBmACAAYgBpAG4AYQByAGkAZQBzACAAYgBlAGwAbwB3ACAAdABoAGUAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABvAGYAIABHAGEAaQBhACAAYQBuAGQAIAByAGEAZABpAG8AIAB0AGkAbQBpAG4AZwAgAGkAbgAgAG8AdQByACAAcwBhAG0AcABsAGUAIABjAG8AdQBsAGQAIABzAHQAaQBsAGwAIABiAGUAIABzAGkAZwBuAGkAZgBpAGMAYQBuAHQAbAB5ACAAaABpAGcAaABlAHIALgAgAFcAZQAgAGMAbwBuAHMAdAByAGEAaQBuACAAdABoAGUAIABiAGkAbgBhAHIAeQAgAGYAcgBhAGMAdABpAG8AbgAgAG8AZgAgAHkAbwB1AG4AZwAgAHAAdQBsAHMAYQByAHMAIAB0AG8AIABiAGUAIABmAF4AdAByAHUAZQBeAF8AeQBvAHUAbgBnAF8APAA1AC4AMwAoADgALgAzACkAIABwAGUAcgAgAGMAZQBuAHQAIAB1AG4AZABlAHIAIAByAGUAYQBsAGkAcwB0AGkAYwAgACgAYwBvAG4AcwBlAHIAdgBhAHQAaQB2AGUAKQAgAGEAcwBzAHUAbQBwAHQAaQBvAG4AcwAgAGYAbwByACAAdABoAGUAIABiAGkAbgBhAHIAeQAgAHAAcgBvAHAAZQByAHQAaQBlAHMAIABhAG4AZAAgAGMAdQByAHIAZQBuAHQAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIAB0AGgAcgBlAHMAaABvAGwAZABzAC4AIABGAG8AcgAgAG0AYQBzAHMAaQB2AGUAIABzAHQAYQByAHMAIAAoAD4AMQAwAE0AXwB7AHMAdQBuAH0AXwApACAAaQBuACAAcABhAHIAdABpAGMAdQBsAGEAcgAsACAAdwBlACAAZgBpAG4AZAAgAGYAXgB0AHIAdQBlAF4AXwBPAEIAXwA8ADMALgA3ACAAcABlAHIAIABjAGUAbgB0ACwAIAB3AGgAaQBjAGgAIABzAGUAdABzACAAYQAgAGYAaQByAG0AIABpAG4AZABlAHAAZQBuAGQAZQBuAHQAIAB1AHAAcABlAHIAIABsAGkAbQBpAHQAIABvAG4AIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAG4AZQB1AHQAcgBvAG4AIABzAHQAYQByACAAbQBlAHIAZwBlAHIAIAByAGEAdABlACwAIAA8AD0ANwAuADIAeAAxADAAXgAtADQAXgAvAHkAcgAuACAATwBuAGcAbwBpAG4AZwAgAGEAbgBkACAAZgB1AHQAdQByAGUAIABwAHIAbwBqAGUAYwB0AHMALAAgAHMAdQBjAGgAIABhAHMAIAB0AGgAZQAgAEMASABJAE0ARQAvAHAAdQBsAHMAYQByACAAcAByAG8AZwByAGEAbQAsACAATQBlAGUAcgBUAGkAbQBlACwAIABIAEkAUgBBAFgALAAgAGEAbgBkACAAdQBsAHQAaQBtAGEAdABlAGwAeQAgAHQAaABlACAAUwBLAEEALAAgAHcAaQBsAGwAIABzAGkAZwBuAGkAZgBpAGMAYQBuAHQAbAB5ACAAaQBtAHAAcgBvAHYAZQAgAHQAaABlAHMAZQAgAGMAbwBuAHMAdAByAGEAaQBuAHQAcwAgAGkAbgAgAHQAaABlACAAZgB1AHQAdQByAGUALgAAADVodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9NTlJBUy81MDEvMTExNgAAAA0AQQBuAHQAbwBuAGkAYQBkAGkAcwAgAEoALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGV/wAAAAAAABXJhZGlvAAACT2h0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzUwMS8xMTE2Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNTAxLzExMTY6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzUwMS8xMTE2L2NhdGFsb2c/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzUwMS8xMTE2L2NhdGFsb2c/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy81MDEvMTExNjo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy81MDEvMTExNgAAANc6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFw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cmNlPVZJSS8xNTY6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9WSUkvMTU2L3RhYmxlMT86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPVZJSS8xNTY6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9VklJLzE1Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xNTYvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE1Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xNTYvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE1Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1WSUkvMTU2Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvVklJLzE1Ni90YWJsZTE/AAABvTo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAAGldnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAAPk6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBz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aWVSLTI/LXNvdXJjZT1WSUkvMTg5Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPVZJSS8xODk6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9WSUkvMTg5L3RhYmxlMT86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPVZJSS8xODk6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9VklJLzE4OTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xODkvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE4OTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1WSUkvMTg5Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcAAAAb1pdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4AAABpXZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHAAAAD5c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkAAAAHWl2bzovL25hc2EuaGVhc2FyYy9hdG5mcHVsc2FyAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAABEFUTkYAAAATAEEAVABOAEYAIABQAHUAbABzAGEAcgAgAEMAYQB0AGEAbABvAGcAAAAIcmVzZWFyY2gAAAnTAFQAaABlACAAQQB1AHMAdAByAGEAbABpAGEAIABUAGUAbABlAHMAYwBvAHAAZQAgAE4AYQB0AGkAbwBuAGEAbAAgAEYAYQBjAGkAbABpAHQAeQAgACgAQQBUAE4ARgApACAAUAB1AGwAcwBhAHIAIABDAGEAdABhAGwAbwBnACAAaQBzACAAYQAgAGMAYQB0AGEAbABvAGcAIABvAGYAIABrAG4AbwB3AG4AIABwAHUAbABzAGEAcgBzACAAYwBvAG0AcABpAGwAZQBkACAAYgB5ACAAUgAuAE4ALgAgAE0AYQBuAGMAaABlAHMAdABlAHIAIABlAHQAIABhAGwALgAgAGEAbgBkACAAaQBzACAAZABlAHMAYwBlAG4AZABlAGQAIABmAHIAbwBtACAAcAB1AGwAcwBhAHIAIABkAGEAdABhAGIAYQBzAGUAIAB1AHMAZQBkACAAZgBvAHIAIAB0AGgAZQAgAHAAYQBwAGUAcgAgACYAcQB1AG8AdAA7AEMAYQB0AGEAbABvAGcAIABvAGYAIAA1ADUAOAAgAFAAdQBsAHMAYQByAHMAJgBxAHUAbwB0ADsAIABiAHkAIABKAC4ASAAuACAAVABhAHkAbABvAHIALAAgAFIALgBOAC4AIABNAGEAbgBjAGgAZQBzAHQAZQByACAAYQBuAGQAIABBAC4ARwAuACAATAB5AG4AZQAgADEAOQA5ADMALAAgAEEAcABKAFMALAAgADgAOAAsACAANQAyADkALQA1ADYAOAAuACAAVABoAGUAIABjAHUAcgByAGUAbgB0ACAAYwBhAHQAYQBsAG8AZwAgAGgAYQBzACAAYgBlAGUAbgAgAHMAdQBwAHAAbABlAG0AZQBuAHQAZQBkACAAYgB5ACAAaQBuAGMAbAB1AHMAaQBvAG4AIABvAGYAIABwAHUAYgBsAGkAcwBoAGUAZAAgAGQAYQB0AGEAIABmAHIAbwBtACAAbQBvAHIAZQAgAHIAZQBjAGUAbgB0ACAAcgBhAGQAaQBvACAAcwB1AHIAdgBlAHkAcwAsACAAaQBuACAAcABhAHIAdABpAGMAdQBsAGEAcgAsACAAdABoAGUAIABQAGEAcgBrAGUAcwAgAE0AdQBsAHQAaQBiAGUAYQBtACAAKABQAE0AKQAgAFAAdQBsAHMAYQByACAAUwB1AHIAdgBlAHkAIAAoAE0AYQBuAGMAaABlAHMAdABlAHIAIABlAHQAIABhAGwALgAgADIAMAAwADEALAAgAE0ATgBSAEEAUwAsACAAMwAyADgALAAgADEANwAtADMANQApACAAWwBhAHYAYQBpAGwAYQBiAGwAZQAgAGEAdAAgAHQAaABlACAASABFAEEAUwBBAFIAQwAgAGEAcwAgAHQAaABlACAAUABNAFAAVQBMAFMAQQBSACAAdABhAGIAbABlAF0AIABhAG4AZAAgAHQAaABlACAAUwB3AGkAbgBiAHUAcgBuAGUAIABJAG4AdABlAHIAbQBlAGQAaQBhAHQAZQAgAEwAYQB0AGkAdAB1AGQAZQAgAFAAdQBsAHMAYQByACAAUwB1AHIAdgBlAHkAIAAoAEUAZAB3AGEAcgBkAHMAIABlAHQAIABhAGwALgAgADIAMAAwADEALAAgAE0ATgBSAEEAUwAsACAAMwAyADYALAAgADMANQA4AC0AMwA3ADQAKQAsACAAYgBvAHQAaAAgAG0AYQBkAGUAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEEAVABOAEYAIABQAGEAcgBrAGUAcwAgADYANAAtAG0AIAByAGEAZABpAG8AIAB0AGUAbABlAHMAYwBvAHAAZQAuACAAQgBpAG4AYQByAHkAIABwAGEAcgBhAG0AZQB0AGUAcgBzACAAZgBvAHIAIABrAG4AbwB3AG4AIABiAGkAbgBhAHIAeQAgAHAAdQBsAHMAYQByAHMAIABhAHIAZQAgAGEAbABzAG8AIABpAG4AYwBsAHUAZABlAGQAIABhAHMAIAB3AGUAbABsACAAYQBzACAAYQBsAGwAIABhAHYAYQBpAGwAYQBiAGwAZQAgAGEAcwB0AHIAbwBtAGUAdAByAGkAYwAgAGEAbgBkACAAcwBwAGkAbgAgAHAAYQByAGEAbQBlAHQAZQByACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAAZgBvAHIAIABhAGwAbAAgAHAAdQBsAHMAYQByAHMALgAgAFQAaABlACAAYwBhAHQAYQBsAG8AZwAgAGkAbgBjAGwAdQBkAGUAcwAgAGEAbABsACAAcAB1AGIAbABpAHMAaABlAGQAIAByAG8AdABhAHQAaQBvAG4ALQBwAG8AdwBlAHIAZQBkACAAcAB1AGwAcwBhAHIAcwAuACAAVAB3AG8AIABzAGUAcABhAHIAYQB0AGUAIABzAG0AYQBsAGwAIABzAHUAYgBzAGUAdABzACAAbwBmACAAcAB1AGwAcwBhAHIAcwAgAGQAZQB0AGUAYwB0AGUAZAAgAG8AbgBsAHkAIABhAHQAIABoAGkAZwBoACAAZQBuAGUAcgBnAGkAZQBzACAAYQByAGUAIABhAGwAcwBvACAAaQBuAGMAbAB1AGQAZQBkACAAaQBuACAAdABoAGUAIABjAHUAcgByAGUAbgB0ACAAdABhAGIAbABlADoAIAB0AGgAZQAgAGYAaQByAHMAdAAgAGcAcgBvAHUAcAAgAGMAbwBtAHAAcgBpAHMAZQBzACAAWAAtAHIAYQB5ACAAYQBuAGQAIABnAGEAbQBtAGEALQByAGEAeQAgAHAAdQBsAHMAYQByAHMAIAB3AGgAaQBjAGgAIABhAHIAZQAgAGEAcABwAGEAcgBlAG4AdABsAHkAIABwAG8AdwBlAHIAZQBkACAAYgB5ACAAcwBwAGkAbgAtAGQAbwB3AG4AIABlAG4AZQByAGcAeQAsACAAYgB1AHQAIAB3AGgAaQBjAGgAIABoAGEAdgBlACAAbgBvAHQAIABiAGUAZQBuACAAZABlAHQAZQBjAHQAZQBkACAAYQB0ACAAcgBhAGQAaQBvACAAdwBhAHYAZQBsAGUAbgBnAHQAaABzACwAIAB3AGgAaQBsAGUAIAB0AGgAZQAgAHMAZQBjAG8AbgBkACAAZwByAG8AdQBwACAAYwBvAG4AdABhAGkAbgBzACAAYQBuAG8AbQBhAGwAbwB1AHMAIABYAC0AcgBhAHkAIABwAHUAbABzAGEAcgBzACAAKABBAFgAUABzACkAIABhAG4AZAAgAHMAbwBmAHQALQBnAGEAbQBtAGEALQByAGEAeQAgAHIAZQBwAGUAYQB0AGUAcgBzACAAKABTAEcAUgBzACkAIABmAG8AcgAgAHcAaABpAGMAaAAgAGMAbwBoAGUAcgBlAG4AdAAgAHAAdQBsAHMAYQB0AGkAbwBuAHMAIABoAGEAdgBlACAAYgBlAGUAbgAgAGQAZQB0AGUAYwB0AGUAZAAuACAAQQBjAGMAcgBlAHQAaQBvAG4ALQBwAG8AdwBlAHIAZQBkACAAcAB1AGwAcwBhAHIAcwAgAHMAdQBjAGgAIABhAHMAIABIAGUAcgAgAFgALQAxACAAYQBuAGQAIAB0AGgAZQAgAHIAZQBjAGUAbgB0AGwAeQAgAGQAaQBzAGMAbwB2AGUAcgBlAGQAIABYAC0AcgBhAHkAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACAAcwB1AGMAaAAgAGEAcwAgAFMAQQBYACAASgAxADgAMAA4AC4ANAAtADMANgA1ADgAIABhAHIAZQAgAG4AbwB0ACAAaQBuAGMAbAB1AGQAZQBkACAAaQBuACAAdABoAGkAcwAgAHQAYQBiAGwAZQAsACAAaABvAHcAZQB2AGUAcgAuACAATQBhAG4AeQAgAHAAZQBvAHAAbABlACAAaABhAHYAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAAYwBvAG0AcABpAGwAYQB0AGkAbwBuACAAbwBmACAAdABoAGUAIABkAGEAdABhACAAYwBvAG4AdABhAGkAbgBlAGQAIABpAG4AIAB0AGgAaQBzACAAYwBhAHQAYQBsAG8AZwAgAGEAbgBkACAAdABoAGUAIABkAGEAdABhAGIAYQBzAGUAIAB0AGgAYQB0ACAAaQB0ACAAdwBhAHMAIABkAGUAcgBpAHYAZQBkACAAZgByAG8AbQAuACAAVABoAGUAIABhAHUAdABoAG8AcgBzACAAcABhAHIAdABpAGMAdQBsAGEAcgBsAHkAIAB0AGgAYQBuAGsAIABBAG4AZAByAGUAdwAgAEwAeQBuAGUAIABvAGYAIAB0AGgAZQAgAFUAbgBpAHYAZQByAHMAaQB0AHkAIABvAGYAIABNAGEAbgBjAGgAZQBzAHQAZQByACwAIABKAG8AZAByAGUAbABsACAAQgBhAG4AawAgAE8AYgBzAGUAcgB2AGEAdABvAHIAeQAsACAARABhAHYAaQBkACAATgBpAGMAZQAgAG8AZgAgAFAAcgBpAG4AYwBlAHQAbwBuACAAVQBuAGkAdgBlAHIAcwBpAHQAeQAsACAAYQBuAGQAIABSAHUAcwBzAGUAbABsACAARQBkAHcAYQByAGQAcwAsACAAdABoAGUAbgAgAGEAdAAgAFMAdwBpAG4AYgB1AHIAbgBlACAAVQBuAGkAdgBlAHIAcwBpAHQAeQAgAG8AZgAgAFQAZQBjAGgAbgBvAGwAbwBnAHkALgAgAFQAaABlACAAYQBsAHMAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAFcAYQByAHcAaQBjAGsAIABVAG4AaQB2AGUAcgBzAGkAdAB5ACAAcwB0AHUAZABlAG4AdABzACAAQQBkAGEAbQAgAEcAbwBvAGQAZQAgAGEAbgBkACAAUwB0AGUAdgBlAG4AIABUAGgAbwBtAGEAcwAgAHcAaABvACAAYwBvAG0AcABpAGwAZQBkACAAYQBuAGQAIABjAGgAZQBjAGsAZQBkACAAYQAgAHIAZQBjAGUAbgB0ACAAdgBlAHIAcwBpAG8AbgAgAG8AZgAgAHQAaABlACAAZABhAHQAYQBiAGEAcwBlAC4AIABUAGgAZQAgAG8AcgBpAGcAaQBuAGEAbAAgACgAcwB1AG0AbQBlAHIAIAAyADAAMAAzACkAIABkAGEAdABhAGIAYQBzAGUAIABhAHQAIAB0AGgAZQAgAEEAVABOAEYAIAB3AGUAYgBzAGkAdABlACAAdwBhAHMAIABjAG8AbQBwAGkAbABlAGQAIAB3AGkAdABoACAAdABoAGUAIABpAG4AdgBhAGwAdQBhAGIAbABlACAAYQBzAHMAaQBzAHQAYQBuAGMAZQAgAG8AZgAgAE0AYQByAHkAYQBtACAASABvAGIAYgBzACwAIAB3AGgAaQBsAGUAIAB0AGgAZQAgAEEAVABOAEYAIAB3AGUAYgAgAGkAbgB0AGUAcgBmAGEAYwBlACAAdwBhAHMAIABkAGUAcwBpAGcAbgBlAGQAIABhAG4AZAAgAGMAbwBuAHMAdAByAHUAYwB0AGUAZAAgAGIAeQAgAEEAbABiAGUAcgB0ACAAVABlAG8AaAAsACAAYQAgAFMAdQBtAG0AZQByACAAVgBhAGMAYQB0AGkAbwBuACAAUwBjAGgAbwBsAGEAcgAgAGEAdAAgAHQAaABlACAAQQBUAE4ARgAgAGkAbgAgADIAMAAwADIALwAyADAAMAAzAC4AIABUAGgAZQAgAGEAdQB0AGgAbwByAHMAIAB3AG8AdQBsAGQAIABhAHAAcAByAGUAYwBpAGEAdABlACAAaQBmACAAYQBuAHkAbwBuAGUAIABtAGEAawBpAG4AZwAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAGMAYQB0AGEAbABvAGcAIABpAG4AIABhACAAcAB1AGIAbABpAGMAYQB0AGkAbwBuACAAYQBjAGsAbgBvAHcAbABlAGQAZwBlAHMAIAB0AGgAZQAgAHMAbwB1AHIAYwBlACAAbwBmACAAdABoAGUAaQByACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAAYgB5ACAAcQB1AG8AdABpAG4AZwAgAHQAaABlACAAQQBUAE4ARgAgAFAAdQBsAHMAYQByACAAQwBhAHQAYQBsAG8AZwAgAHcAZQBiAHMAaQB0AGUAIABhAGQAZAByAGUAcwBzACAAbwBmACAAJgBsAHQAOwBhACAAaAByAGUAZgA9ACIAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAdABuAGYALgBjAHMAaQByAG8ALgBhAHUALwByAGUAcwBlAGEAcgBjAGgALwBwAHUAbABzAGEAcgAvAHAAcwByAGMAYQB0AC8AIgAmAGcAdAA7AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAHQAbgBmAC4AYwBzAGkAcgBvAC4AYQB1AC8AcgBlAHMAZQBhAHIAYwBoAC8AcAB1AGwAcwBhAHIALwBwAHMAcgBjAGEAdAAvACYAbAB0ADsALwBhACYAZwB0ADsAAAA6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YvVzNCcm93c2UvYWxsL2F0bmZwdWxzYXIuaHRtbAAAABIATQBhAG4AYwBoAGUAcwB0AGUAcgAsACAAVABhAHkAbABvAHIAAAAHY2F0YWxvZwAAAAB/wAAAAAAABXJhZGlvAAABfWh0dHBzOi8vaGVhc2FyYy5nc2ZjLm5hc2EuZ292L2NnaS1iaW4vVzNCcm93c2UvZ2V0dm90YWJsZS5wbD9uYW1lPWF0bmZwdWxzYXI6OjpweSBWTyBzZXA6OjpodHRwczovL2hlYXNhcmMuZ3NmYy5uYXNhLmdvdi94YW1pbi92by9jb25lP3Nob3dvZmZzZXRzJnRhYmxlPWF0bmZwdWxzYXImOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YveGFtaW4vdm8vdGFwOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YvY2dpLWJpbi9XM0Jyb3dzZS93M3F1ZXJ5LnBsP3RhYmxlaGVhZD1uYW1lPWhlYXNhcmNfYXRuZnB1bHNhciZBY3Rpb249TW9yZStPcHRpb25zJkFjdGlvbj1QYXJhbWV0ZXIrU2VhcmNoJkNvbmVBZGQ9MQAAAGQ6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6AAAAXnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXIAAAAzOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6AAAAHWl2bzovL25hc2EuaGVhc2FyYy9mZXJtaWwycHNyAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAACkZFUk1JTDJQU1IAAAAzAEYAZQByAG0AaQAgAEwAQQBUACAAUwBlAGMAbwBuAGQAIABDAGEAdABhAGwAbwBnACAAbwBmACAARwBhAG0AbQBhAC0AUgBhAHkAIABQAHUAbABzAGEAcgBzACAAKAAyAFAAQwApAAAACHJlc2VhcmNoAAAC0QBUAGgAaQBzACAAYwBhAHQAYQBsAG8AZwAgAHMAdQBtAG0AYQByAGkAegBlAHMAIAAwAC4AMQAgAEcAZQBWACAAZwBhAG0AbQBhAC0AcgBhAHkAIABwAHUAbABzAGEAcgAgAGQAZQB0AGUAYwB0AGkAbwBuAHMAIAB1AHMAaQBuAGcAIABkAGEAdABhACAAYQBjAHEAdQBpAHIAZQBkACAAYgB5ACAAdABoAGUAIABMAGEAcgBnAGUAIABBAHIAZQBhACAAVABlAGwAZQBzAGMAbwBwAGUAIAAoAEwAQQBUACkAIABvAG4AIAB0AGgAZQAgAEYAZQByAG0AaQAgAHMAYQB0AGUAbABsAGkAdABlAC4AIABUAGgAZQBzAGUAIABwAHUAbABzAGEAcgBzACAAYQByAGUAIABuAGUAdQB0AHIAbwBuACAAcwB0AGEAcgBzACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgAHUAcwBpAG4AZwAgAEwAQQBUACAAZABhAHQAYQAgAHQAaAByAG8AdQBnAGgAIABwAGUAcgBpAG8AZABpAGMAaQB0AHkAIABzAGUAYQByAGMAaABlAHMAIABpAG4AIABnAGEAbQBtAGEALQByAGEAeQAgAGEAbgBkACAAcgBhAGQAaQBvACAAZABhAHQAYQAgAGEAcgBvAHUAbgBkACAATABBAFQAIAB1AG4AYQBzAHMAbwBjAGkAYQB0AGUAZAAgAHMAbwB1AHIAYwBlACAAcABvAHMAaQB0AGkAbwBuAHMALgAgAFQAaABlACAAYwBhAHQAYQBsAG8AZwB1AGUAZAAgAHAAdQBsAHMAYQByAHMAIABhAHIAZQAgAGQAaQB2AGkAZABlAGQAIABpAG4AdABvACAAdABoAHIAZQBlACAAZwByAG8AdQBwAHMAOgAgAG0AaQBsAGwAaQBzAGUAYwBvAG4AZAAgAHAAdQBsAHMAYQByAHMALAAgAHkAbwB1AG4AZwAgAHIAYQBkAGkAbwAtAGwAbwB1AGQAIABwAHUAbABzAGEAcgBzACwAIABhAG4AZAAgAHkAbwB1AG4AZwAgAHIAYQBkAGkAbwAtAHEAdQBpAGUAdAAgAHAAdQBsAHMAYQByAHMALgAgAFQAaABpAHMAIABjAGEAdABhAGwAbwBnACAAcwB1AG0AbQBhAHIAaQB6AGUAcwAgAHIAZQBzAHUAbAB0AHMAIABvAGYAIAB0AGgAZQAgAGEAbgBhAGwAeQBzAGkAcwAgAG8AZgAgAHAAdQBsAHMAZQAgAHAAcgBvAGYAaQBsAGUAcwAgAGEAbgBkACAAZQBuAGUAcgBnAHkAIABzAHAAZQBjAHQAcgBhACwAIABhAG4AZAAgAGEAbgBhAGwAeQBzAGkAcwAgAG8AZgAgAHQAaABlACAAbwBmAGYALQBwAGUAYQBrACAAcABoAGEAcwBlACAAaQBuAHQAZQByAHYAYQBsAHMALAAgAGEAbgBkACAAYwBvAG0AcABhAHIAZQBzACAAdABoAGUAIABnAGEAbQBtAGEALQByAGEAeQAgAHAAcgBvAHAAZQByAHQAaQBlAHMAIAB3AGkAdABoACAAdABoAG8AcwBlACAAaQBuACAAdABoAGUAIAByAGEAZABpAG8ALAAgAG8AcAB0AGkAYwBhAGwALAAgAGEAbgBkACAAWAAtAHIAYQB5ACAAYgBhAG4AZABzAC4AIABGAGwAdQB4ACAAbABpAG0AaQB0AHMAIABmAG8AcgAgAHAAdQBsAHMAYQByAHMAIAB3AGkAdABoACAAbgBvACAAbwBiAHMAZQByAHYAZQBkACAAZwBhAG0AbQBhAC0AcgBhAHkAIABlAG0AaQBzAHMAaQBvAG4AIABhAHIAZQAgAHAAcgBvAHYAaQBkAGUAZAAuAAAAOmh0dHBzOi8vaGVhc2FyYy5nc2ZjLm5hc2EuZ292L1czQnJvd3NlL2FsbC9mZXJtaWwycHNyLmh0bWwAAAALAEEAYgBkAG8AIABlAHQAIABhAGwALgAAAAdjYXRhbG9nAAAAAH/AAAAAAAAJZ2FtbWEtcmF5AAABfWh0dHBzOi8vaGVhc2FyYy5nc2ZjLm5hc2EuZ292L2NnaS1iaW4vVzNCcm93c2UvZ2V0dm90YWJsZS5wbD9uYW1lPWZlcm1pbDJwc3I6OjpweSBWTyBzZXA6OjpodHRwczovL2hlYXNhcmMuZ3NmYy5uYXNhLmdvdi94YW1pbi92by9jb25lP3Nob3dvZmZzZXRzJnRhYmxlPWZlcm1pbDJwc3ImOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YveGFtaW4vdm8vdGFwOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YvY2dpLWJpbi9XM0Jyb3dzZS93M3F1ZXJ5LnBsP3RhYmxlaGVhZD1uYW1lPWhlYXNhcmNfZmVybWlsMnBzciZBY3Rpb249TW9yZStPcHRpb25zJkFjdGlvbj1QYXJhbWV0ZXIrU2VhcmNoJkNvbmVBZGQ9MQAAAGQ6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6AAAAXnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXIAAAAzOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6AAAAG2l2bzovL25hc2EuaGVhc2FyYy9wbXB1bHNhcgAAABF2czpjYXRhbG9nc2VydmljZQAAAAZQYXJrZXMAAAAqAFAAYQByAGsAZQBzACAATQB1AGwAdABpAGIAZQBhAG0AIABTAHUAcgB2AGUAeQAgAE4AZQB3ACAAUAB1AGwAcwBhAHIAIABDAGEAdABhAGwAbwBnAAAACHJlc2VhcmNoAAAFRgBUAGgAZQAgAFAAYQByAGsAZQBzACAATQB1AGwAdABpAGIAZQBhAG0AIAAoAFAATQApACAAUAB1AGwAcwBhAHIAIABTAHUAcgB2AGUAeQAgAHUAcwBlAHMAIAB0AGgAZQAgADIAMAAgAGMAbQAgAG0AdQBsAHQAaQBiAGUAYQBtACAAcgBlAGMAZQBpAHYAZQByACAAcwB5AHMAdABlAG0AIABhAG4AZAAgAG0AdQBsAHQAaQBiAGUAYQBtACAAZgBpAGwAdABlAHIAIABiAGEAbgBrAHMALAAgAGQAaQBnAGkAdABpAHoAZQByACAAYQBuAGQAIABkAGEAdABhAC0AYQBjAHEAdQBpAHMAaQB0AGkAbwBuACAAcwB5AHMAdABlAG0AIAB0AG8AIABzAHUAcgB2AGUAeQAgAGEAIAByAGUAZwBpAG8AbgAgAHcAaQB0AGgAaQBuACAAfABiAHwAIAAmAGwAdAA7ACAANQAgAGQAZQBnAHIAZQBlAHMAIABpAG4AIAB0AGgAZQAgAGkAbgBuAGUAcgAgAEcAYQBsAGEAYwB0AGkAYwAgAHAAbABhAG4AZQAgAGYAbwByACAAcAB1AGwAcwBhAHIAcwAsACAAbQBhAG4AeQAgAG8AZgAgAHcAaABpAGMAaAAgAHcAaQBsAGwAIABiAGUAIAB5AG8AdQBuAGcAIABhAG4AZAAvAG8AcgAgAHMAaABvAHIAdAAtAHAAZQByAGkAbwBkAC4AIABUAGgAaQBzACAAcwB1AHIAdgBlAHkAIABpAHMAIABhACAAZgBhAGMAdABvAHIAIABvAGYAIAA3ACAAdABpAG0AZQBzACAAbQBvAHIAZQAgAHMAZQBuAHMAaQB0AGkAdgBlACAAdABvACAAeQBvAHUAbgBnACAAYQBuAGQAIABkAGkAcwB0AGEAbgB0ACAAcAB1AGwAcwBhAHIAcwAgAHQAaABhAG4AIAB0AGgAYQB0ACAAbwBmACAASgBvAGgAbgBzAHQAbwBuACAAZQB0ACAAYQBsAC4AIAAoADEAOQA5ADIALAAgAE0ATgBSAEEAUwAsACAAMgA1ADUALAAgADQAMAAxACkAIAB3AGgAaQBjAGgAIABkAGUAdABlAGMAdABlAGQAIAAxADAAMAAgAHAAdQBsAHMAYQByAHMALgAgAFQAaABlACAAcAByAGUAcwBlAG4AdAAgAHMAbwB1AHIAYwBlACAAbABpAHMAdAAgAGMAbwBuAHQAYQBpAG4AcwAgAHAAdQBsAHMAYQByAHMAIAB0AGgAYQB0ACAAaABhAHYAZQAgAGIAZQBlAG4AIABuAGUAdwBsAHkAIABkAGkAcwBjAG8AdgBlAHIAZQBkACAAaQBuACAAdABoAGUAIABjAG8AdQByAHMAZQAgAG8AZgAgAHQAaABpAHMAIABzAHUAcgB2AGUAeQAuACAAVABoAGUAIABQAE0AIABTAHUAcgB2AGUAeQAgAGkAcwAgAHMAcABlAGMAaQBmAGkAYwBhAGwAbAB5ACAAdABhAHIAZwBlAHQAZQBkACAAZgBvAHIAIAAoAGkAKQAgAG8AYgBzAGMAdQByAGUAZAAgAHIAZQBnAGkAbwBuAHMAIABvAGYAIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAHAAbABhAG4AZQAsACAAKABpAGkAKQAgAHkAbwB1AG4AZwAgAHAAdQBsAHMAYQByAHMALABhAG4AZAAgACgAaQBpAGkAKQAgAGIAaQBuAGEAcgB5ACAAcAB1AGwAcwBhAHIAcwAgAHcAaQB0AGgAIABtAGEAcwBzAGkAdgBlACAAYwBvAG0AcABhAG4AaQBvAG4AcwAuACAAQQBzACAAbwBmACAAQQB1AGcAdQBzAHQAIAAxADkAOQA5ACwAIABhAG4AYQBsAHkAcwBpAHMAIABvAGYAIABhAGIAbwB1AHQAIAA1ADAAJQAgAG8AZgAgAHQAaABlACAAdABvAHQAYQBsACAAZQB4AHAAZQBjAHQAZQBkACAAZABhAHQAYQAgAHQAbwAgAGIAZQAgAGMAbwBsAGwAZQBjAHQAZQBkACAAaABhAHMAIAByAGUAcwB1AGwAdABlAGQAIABpAG4AIAB0AGgAZQAgAGMAbwBuAGYAaQByAG0AZQBkACAAZABlAHQAZQBjAHQAaQBvAG4AIABvAGYAIABvAHYAZQByACAANAAwADAAIABuAGUAdwAgAHAAdQBsAHMAYQByAHMAIAAoAGEAbgAgAGkAbgBjAHIAZQBhAHMAZQAgAG8AZgAgAG0AbwByAGUAIAB0AGgAYQBuACAANQAwACUAIABvAGYAIAB0AGgAZQAgAGsAbgBvAHcAbgAgAHAAbwBwAHUAbABhAHQAaQBvAG4AKQAuACAASABlAHIAZQAgAGEAcgBlACAAcwBvAG0AZQAgAG8AZgAgAHQAaABlACAAZgBlAGEAdAB1AHIAZQBzACAAbwBmACAAdABoAGUAIABQAE0AIABTAHUAcgB2AGUAeQA6ACAAJgBsAHQAOwBwAHIAZQAmAGcAdAA7ACAAUwB1AHIAdgBlAHkAIABBAHIAZQBhADoAIAAtADIANgAwACAAJgBsAHQAOwAgAGwAIAAmAGwAdAA7ACAANQAwACAAZABlAGcAIAAsACAALQA1ACAAJgBsAHQAOwAgAGIAIAAmAGwAdAA7ACAANQAgAGQAZQBnACAAQwBlAG4AdABlAHIAIABGAHIAZQBxAHUAZQBuAGMAeQA6ACAAMQAzADcANAAgAE0ASAB6ACAAQgBhAG4AZAB3AGkAZAB0AGgAOgAgADIAOAA4ACAATQBIAHoAIAAoADkANgAgAGMAaABhAG4AbgBlAGwAcwAgAHgAIAAzACAATQBIAHoAIABwAGUAcgAgAGMAaABhAG4AbgBlAGwAIAB4ACAAMgAgAHAAbwBsAGEAcgBpAHoAYQB0AGkAbwBuAHMAKQAgAFMAYQBtAHAAbABpAG4AZwAgAFIAYQB0AGUAOgAgADAALgAyADUAIABtAHMAIAB4ACAAMQAgAGIAaQB0ACAAcABlAHIAIABjAGgAYQBuAG4AZQBsACAASQBuAHQAZQBnAHIAYQB0AGkAbwBuACAAVABpAG0AZQA6ACAAMwA1ACAAbQBpAG4AIABwAGUAcgAgAHAAbwBpAG4AdABpAG4AZwAgACgAMQAzACAAYgBlAGEAbQBzACAAcABlAHIAIABwAG8AaQBuAHQAaQBuAGcAKQAgAEQAYQB0AGEAIABTAHQAbwByAGEAZwBlADoAIABEAEwAVAAgAHQAYQBwAGUAIAAoAGEAYgBvAHUAdAAgADMANQAgAEcAQgAgAHAAZQByACAAdABhAHAAZQApACAAUwBlAG4AcwBpAHQAaQB2AGkAdAB5ADoAIABhAGIAbwB1AHQAIAA3ACAAdABpAG0AZQBzACAAYgBlAHQAdABlAHIAIAB0AGgAYQBuACAAcAByAGUAdgBpAG8AdQBzACAANAAwADAAIABNAEgAegAgAHMAdQByAHYAZQB5AHMAIAAmAGwAdAA7AC8AcAByAGUAJgBnAHQAOwAAADhodHRwczovL2hlYXNhcmMuZ3NmYy5uYXNhLmdvdi9XM0Jyb3dzZS9hbGwvcG1wdWxzYXIuaHRtbAAAAC8ATQBhAG4AYwBoAGUAcwB0AGUAcgAgAGUAdAAgAGEAbAAuADsAIABNAG8AcgByAGkAcwAgAGUAdAAgAGEAbAAuADsAIABLAHIAYQBtAGUAcgAgAGUAdAAgAGEAbAAuAAAAB2NhdGFsb2cAAAAAf8AAAAAAAAVyYWRpbwAAAXdodHRwczovL2hlYXNhcmMuZ3NmYy5uYXNhLmdvdi9jZ2ktYmluL1czQnJvd3NlL3czcXVlcnkucGw/dGFibGVoZWFkPW5hbWU9aGVhc2FyY19wbXB1bHNhciZBY3Rpb249TW9yZStPcHRpb25zJkFjdGlvbj1QYXJhbWV0ZXIrU2VhcmNoJkNvbmVBZGQ9MTo6OnB5IFZPIHNlcDo6Omh0dHBzOi8vaGVhc2FyYy5nc2ZjLm5hc2EuZ292L3hhbWluL3ZvL2NvbmU/c2hvd29mZnNldHMmdGFibGU9cG1wdWxzYXImOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YveGFtaW4vdm8vdGFwOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YvY2dpLWJpbi9XM0Jyb3dzZS9nZXR2b3RhYmxlLnBsP25hbWU9cG1wdWxzYXIAAABkOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6OgAAAF52cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwAAAAMzo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OgAAABlpdm86Ly9uYXNhLmhlYXNhcmMvcHVsc2FyAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAABlRheWxvcgAAAA4AUAB1AGwAcwBhAHIAIABDAGEAdABhAGwAbwBnAAAACHJlc2VhcmNoAAABMwBUAGgAaQBzACAAZABhAHQAYQBiAGEAcwBlACAAaQBzACAAYgBhAHMAZQBkACAAbwBuACAAdABoAGUAIAAxADkAOQA1ACAATQBhAHkAIAAzACAAZQBsAGUAYwB0AHIAbwBuAGkAYwAgAHYAZQByAHMAaQBvAG4AIABvAGYAIAB0AGgAZQAgAFQAYQB5AGwAbwByACAAZQB0ACAAYQBsAC4AIABQAHUAbABzAGEAcgAgAEMAYQB0AGEAbABvAGcAIABhAG4AZAAgAGMAbwBuAHQAYQBpAG4AcwAgAGQAYQB0AGEAIABvAG4AIAA3ADAANgAgAHAAdQBsAHMAYQByAHMALAAgAGkALgBlAC4ALAAgAGkAdAAgAGMAbwBuAHQAYQBpAG4AcwAgADIANQAlACAAbQBvAHIAZQAgAGUAbgB0AHIAaQBlAHMAIAB0AGgAYQBuACAAdABoAGUAIAB2AGUAcgBzAGkAbwBuACAAcAB1AGIAbABpAHMAaABlAGQAIABiAHkAIABUAGEAeQBsAG8AcgAgAGUAdAAgAGEAbAAuACAAaQBuACAAMQA5ADkAMwAgAEEAcABKAFMALgAgAFQAaABlACAASABFAEEAUwBBAFIAQwAgAG8AYgB0AGEAaQBuAGUAZAAgAHQAaABpAHMAIABlAGwAZQBjAHQAcgBvAG4AaQBjACAAdgBlAHIAcwBpAG8AbgAgAGYAcgBvAG0AIAB0AGgAZQAgAFAAcgBpAG4AYwBlAHQAbwBuACAAVQBuAGkAdgBlAHIAcwBpAHQAeQAgAEYAVABQACAAcwBpAHQAZQAuAAAANmh0dHBzOi8vaGVhc2FyYy5nc2ZjLm5hc2EuZ292L1czQnJvd3NlL2FsbC9wdWxzYXIuaHRtbAAAAA0AVABhAHkAbABvAHIAIABlAHQAIABhAGwALgAAAAdjYXRhbG9nAAAAAH/AAAAAAAAFcmFkaW8AAAFxaHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YveGFtaW4vdm8vdGFwOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YveGFtaW4vdm8vY29uZT9zaG93b2Zmc2V0cyZ0YWJsZT1wdWxzYXImOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YvY2dpLWJpbi9XM0Jyb3dzZS93M3F1ZXJ5LnBsP3RhYmxlaGVhZD1uYW1lPWhlYXNhcmNfcHVsc2FyJkFjdGlvbj1Nb3JlK09wdGlvbnMmQWN0aW9uPVBhcmFtZXRlcitTZWFyY2gmQ29uZUFkZD0xOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YvY2dpLWJpbi9XM0Jyb3dzZS9nZXR2b3RhYmxlLnBsP25hbWU9cHVsc2FyAAAAZGl2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjoAAABednM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADNzdGQ6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo=
\ No newline at end of file +Radio, Millimeter, Infrared, Optical, UV, EUV, X-ray, Gamma-ray.Unambiguous reference to the resource conforming to the IVOA standard for identifiers.Resource type (something like vg:authority, vs:catalogservice, etc).A short name or abbreviation given to something, for presentation in space-constrained fields (up to 16 characters).The full name given to the resource.A hash-separated list of content levels specifying the intended audience.An account of the nature of the resource.URL pointing to a human-readable document describing this resource.The creator(s) of the resource in the order given by the resource record author, separated by semicolons.A hash-separated list of natures or genres of the content of the resource.The format of source_value. This, in particular, can be ``bibcode''.A bibliographic reference from which the present resource is derived or extracted.A single numeric value representing the angle, given in decimal degrees, by which a positional query against this resource should be ``blurred'' in order to get an appropriate match.A hash-separated list of regions of the electro-magnetic spectrum that the resource's spectral coverage overlaps with.AAAAHml2bzovL2Nkcy52aXppZXIvai9hK2EvNDkyLzkyMwAAABF2czpjYXRhbG9nc2VydmljZQAAAA1KL0ErQS80OTIvOTIzAAAAMQBQAHUAbABzAGEAcgAgAFQAaQBtAGkAbgBnACAAZgBvAHIAIABGAGUAcgBtAGkAIABHAGEAbQBtAGEALQByAGEAeQAgAFMAcABhAGMAZQAgAFQAZQBsAGUAcwBjAG8AcABlAAAACHJlc2VhcmNoAAADhABXAGUAIABkAGUAcwBjAHIAaQBiAGUAIABhACAAYwBvAG0AcAByAGUAaABlAG4AcwBpAHYAZQAgAHAAdQBsAHMAYQByACAAbQBvAG4AaQB0AG8AcgBpAG4AZwAgAGMAYQBtAHAAYQBpAGcAbgAgAGYAbwByACAAdABoAGUAIABMAGEAcgBnAGUAIABBAHIAZQBhACAAVABlAGwAZQBzAGMAbwBwAGUAIAAoAEwAQQBUACkAIABvAG4AIAB0AGgAZQAgAEYAZQByAG0AaQAgAEcAYQBtAG0AYQAtAHIAYQB5ACAAUwBwAGEAYwBlACAAVABlAGwAZQBzAGMAbwBwAGUAIAAoAGYAbwByAG0AZQByAGwAeQAgAEcATABBAFMAVAApAC4AIABUAGgAZQAgAGQAZQB0AGUAYwB0AGkAbwBuACAAYQBuAGQAIABzAHQAdQBkAHkAIABvAGYAIABwAHUAbABzAGEAcgBzACAAaQBuACAAZwBhAG0AbQBhACAAcgBhAHkAcwAgAGcAaQB2AGUAIABpAG4AcwBpAGcAaAB0AHMAIABpAG4AdABvACAAdABoAGUAIABwAG8AcAB1AGwAYQB0AGkAbwBuAHMAIABvAGYAIABuAGUAdQB0AHIAbwBuACAAcwB0AGEAcgBzACAAYQBuAGQAIABzAHUAcABlAHIAbgBvAHYAYQAgAHIAYQB0AGUAcwAgAGkAbgAgAHQAaABlACAARwBhAGwAYQB4AHkALAAgAGkAbgB0AG8AIABwAGEAcgB0AGkAYwBsAGUAIABhAGMAYwBlAGwAZQByAGEAdABpAG8AbgAgAG0AZQBjAGgAYQBuAGkAcwBtAHMAIABpAG4AIABuAGUAdQB0AHIAbwBuACAAcwB0AGEAcgAgAG0AYQBnAG4AZQB0AG8AcwBwAGgAZQByAGUAcwAsACAAYQBuAGQAIABpAG4AdABvACAAdABoAGUAIAAiAGUAbgBnAGkAbgBlAHMAIgAgAGQAcgBpAHYAaQBuAGcAIABwAHUAbABzAGEAcgAgAHcAaQBuAGQAIABuAGUAYgB1AGwAYQBlAC4AIABMAEEAVAAnAHMAIAB1AG4AcAByAGUAYwBlAGQAZQBuAHQAZQBkACAAcwBlAG4AcwBpAHQAaQB2AGkAdAB5ACAAYgBlAHQAdwBlAGUAbgAgADIAMABNAGUAVgAgAGEAbgBkACAAMwAwADAARwBlAFYAIAB0AG8AZwBlAHQAaABlAHIAIAB3AGkAdABoACAAaQB0AHMAIAAyAC4ANABzAHIAIABmAGkAZQBsAGQALQBvAGYALQB2AGkAZQB3ACAAbQBhAGsAZQBzACAAZABlAHQAZQBjAHQAaQBvAG4AIABvAGYAIABtAGEAbgB5ACAAZwBhAG0AbQBhAC0AcgBhAHkAIABwAHUAbABzAGEAcgBzACAAbABpAGsAZQBsAHkALAAgAGoAdQBzAHQAaQBmAHkAaQBuAGcAIAB0AGgAZQAgAG0AbwBuAGkAdABvAHIAaQBuAGcAIABvAGYAIABvAHYAZQByACAAdAB3AG8AIABoAHUAbgBkAHIAZQBkACAAcAB1AGwAcwBhAHIAcwAgAHcAaQB0AGgAIABsAGEAcgBnAGUAIABzAHAAaQBuAC0AZABvAHcAbgAgAHAAbwB3AGUAcgBzAC4AIABUAG8AIABzAGUAYQByAGMAaAAgAGYAbwByACAAZwBhAG0AbQBhAC0AcgBhAHkAIABwAHUAbABzAGEAdABpAG8AbgBzACAAZgByAG8AbQAgAG0AbwBzAHQAIABvAGYAIAB0AGgAZQBzAGUAIABwAHUAbABzAGEAcgBzACAAcgBlAHEAdQBpAHIAZQBzACAAYQAgAHMAZQB0ACAAbwBmACAAcABoAGEAcwBlAC0AYwBvAG4AbgBlAGMAdABlAGQAIAB0AGkAbQBpAG4AZwAgAHMAbwBsAHUAdABpAG8AbgBzACAAcwBwAGEAbgBuAGkAbgBnACAAYQAgAHkAZQBhAHIAIABvAHIAIABtAG8AcgBlACAAdABvACAAcAByAG8AcABlAHIAbAB5ACAAYQBsAGkAZwBuACAAdABoAGUAIABzAHAAYQByAHMAZQAgAHAAaABvAHQAbwBuACAAYQByAHIAaQB2AGEAbAAgAHQAaQBtAGUAcwAuACAAVwBlACAAZABlAHMAYwByAGkAYgBlACAAdABoAGUAIABjAGgAbwBpAGMAZQAgAG8AZgAgAHAAdQBsAHMAYQByAHMAIABhAG4AZAAgAHQAaABlACAAaQBuAHMAdAByAHUAbQBlAG4AdABzACAAaQBuAHYAbwBsAHYAZQBkACAAaQBuACAAdABoAGUAIABjAGEAbQBwAGEAaQBnAG4ALgAAADJodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9BK0EvNDkyLzkyMwAAAXkAUwBtAGkAdABoACAARAAuAEEALgA7ACAARwB1AGkAbABsAGUAbQBvAHQAIABMAC4AOwAgAEMAYQBtAGkAbABvACAARgAuADsAIABDAG8AZwBuAGEAcgBkACAASQAuADsAIABEAHUAbQBvAHIAYQAgAEQALgA7ACAARQBzAHAAaQBuAG8AegBhACAAQwAuADsAIABGAHIAZQBpAHIAZQAgAFAALgBDAC4AQwAuADsAIABHAG8AdAB0AGgAZQBsAGYAIABFAC4AVgAuADsAIABIAGEAcgBkAGkAbgBnACAAQQAuAEsALgA7ACAASABvAGIAYgBzACAARwAuAEIALgA7ACAASgBvAGgAbgBzAHQAbwBuACAAUwAuADsAIABLAGEAcwBwAGkAIABWAC4ATQAuADsAIABLAHIAYQBtAGUAcgAgAE0ALgA7ACAATABpAHYAaQBuAGcAcwB0AG8AbgBlACAATQAuAEEALgA7ACAATAB5AG4AZQAgAEEALgBHAC4AOwAgAE0AYQBuAGMAaABlAHMAdABlAHIAIABSAC4ATgAuADsAIABNAGEAcgBzAGgAYQBsAGwAIABGAC4ARQAuADsAIABNAGMATABhAHUAZwBoAGwAaQBuACAATQAuAEEALgA7ACAATgBvAHUAdABzAG8AcwAgAEEALgA7ACAAUgBhAG4AcwBvAG0AIABTAC4ATQAuADsAIABSAG8AYgBlAHIAdABzACAATQAuAFMALgBFAC4AOwAgAFIAbwBtAGEAbgBpACAAUgAuAFcALgA7ACAAUwB0AGEAcABwAGUAcgBzACAAQgAuAFcALgA7ACAAVABoAGUAdQByAGUAYQB1ACAARwAuADsAIABUAGgAbwBtAHAAcwBvAG4AIABEAC4ASgAuADsAIABUAGgAbwByAHMAZQB0AHQAIABTAC4ARQAuADsAIABXAGEAbgBnACAATgAuADsAIABXAGUAbAB0AGUAdgByAGUAZABlACAAUAAuAAAAB2NhdGFsb2cAAAAHYmliY29kZQAAABMAMgAwADAAOABBACYAQQAuAC4ALgA0ADkAMgAuAC4AOQAyADMAU3/AAAAAAAAPZ2FtbWEtcmF5I3JhZGlvAAABFmh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNDkyLzkyMy90YWJsZTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL0ErQS80OTIvOTIzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovQStBLzQ5Mi85MjM6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwAAAAZGl2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXgAAABednM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADNzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAdaXZvOi8vY2RzLnZpemllci9qL2ErYS82MTIvYTEAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAMSi9BK0EvNjEyL0ExAAAAHgBIAC4ARQAuAFMALgBTAC4AIABHAGEAbABhAGMAdABpAGMAIABQAGwAYQBuAGUAIABTAHUAcgB2AGUAeQAAAAhyZXNlYXJjaAAACCoAVwBlACAAcAByAGUAcwBlAG4AdAAgAHQAaABlACAAcgBlAHMAdQBsAHQAcwAgAG8AZgAgAHQAaABlACAAbQBvAHMAdAAgAGMAbwBtAHAAcgBlAGgAZQBuAHMAaQB2AGUAIABzAHUAcgB2AGUAeQAgAG8AZgAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlACAAaQBuACAAdgBlAHIAeQAgAGgAaQBnAGgALQBlAG4AZQByAGcAeQAgACgAVgBIAEUAKQAgAGcAYQBtAG0AYQAtAHIAYQB5AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQAgAHAAdQBiAGwAaQBjACAAcgBlAGwAZQBhAHMAZQAgAG8AZgAgAEcAYQBsAGEAYwB0AGkAYwAgAHMAawB5ACAAbQBhAHAAcwAsACAAYQAgAGMAYQB0AGEAbABvAGcAIABvAGYAIABWAEgARQAgAHMAbwB1AHIAYwBlAHMALAAgAGEAbgBkACAAdABoAGUAIABkAGkAcwBjAG8AdgBlAHIAeQAgAG8AZgAgADEANgAgAG4AZQB3ACAAcwBvAHUAcgBjAGUAcwAgAG8AZgAgAFYASABFACAAZwBhAG0AbQBhAC0AcgBhAHkAcwAuACAAVABoAGUAIABIAGkAZwBoACAARQBuAGUAcgBnAHkAIABTAHAAZQBjAHQAcgBvAHMAYwBvAHAAaQBjACAAUwB5AHMAdABlAG0AIAAoAEgALgBFAC4AUwAuAFMALgApACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlACAAcwB1AHIAdgBlAHkAIAAoAEgARwBQAFMAKQAgAHcAYQBzACAAYQAgAGQAZQBjAGEAZABlAC0AbABvAG4AZwAgAG8AYgBzAGUAcgB2AGEAdABpAG8AbgAgAHAAcgBvAGcAcgBhAG0AIABjAGEAcgByAGkAZQBkACAAbwB1AHQAIABiAHkAIAB0AGgAZQAgAEgALgBFAC4AUwAuAFMALgAgAEkAIABhAHIAcgBhAHkAIABvAGYAIABDAGgAZQByAGUAbgBrAG8AdgAgAHQAZQBsAGUAcwBjAG8AcABlAHMAIABpAG4AIABOAGEAbQBpAGIAaQBhACAAZgByAG8AbQAgADIAMAAwADQAIAB0AG8AIAAyADAAMQAzAC4AIABUAGgAZQAgAG8AYgBzAGUAcgB2AGEAdABpAG8AbgBzACAAYQBtAG8AdQBuAHQAIAB0AG8AIABuAGUAYQByAGwAeQAgADIANwAwADAAIABoACAAbwBmACAAcQB1AGEAbABpAHQAeQAtAHMAZQBsAGUAYwB0AGUAZAAgAGQAYQB0AGEALAAgAGMAbwB2AGUAcgBpAG4AZwAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlACAAYQB0ACAAbABvAG4AZwBpAHQAdQBkAGUAcwAgAGYAcgBvAG0AIABsAD0AMgA1ADAAewBkAGUAZwB9ACAAdABvACAANgA1AHsAZABlAGcAfQAgAGEAbgBkACAAbABhAHQAaQB0AHUAZABlAHMAIAB8AGIAfAA8AD0AMwAuACAASQBuACAAYQBkAGQAaQB0AGkAbwBuACAAdABvACAAdABoAGUAIAB1AG4AcAByAGUAYwBlAGQAZQBuAHQAZQBkACAAcwBwAGEAdABpAGEAbAAgAGMAbwB2AGUAcgBhAGcAZQAsACAAdABoAGUAIABIAEcAUABTACAAYQBsAHMAbwAgAGYAZQBhAHQAdQByAGUAcwAgAGEAIAByAGUAbABhAHQAaQB2AGUAbAB5ACAAaABpAGcAaAAgAGEAbgBnAHUAbABhAHIAIAByAGUAcwBvAGwAdQB0AGkAbwBuACAAKAAwAC4AMAA4AHsAZABlAGcAfQB+ADUALQBhAHIAYwBtAGkAbgAgAG0AZQBhAG4AIABwAG8AaQBuAHQAIABzAHAAcgBlAGEAZAAgAGYAdQBuAGMAdABpAG8AbgAgADYAOAAlACAAYwBvAG4AdABhAGkAbgBtAGUAbgB0ACAAcgBhAGQAaQB1AHMAKQAsACAAcwBlAG4AcwBpAHQAaQB2AGkAdAB5ACAAKAAxAC4ANQAlACAAQwByAGEAYgAgAGYAbAB1AHgAIABmAG8AcgAgAHAAbwBpAG4AdAAtAGwAaQBrAGUAIABzAG8AdQByAGMAZQBzACkALAAgAGEAbgBkACAAZQBuAGUAcgBnAHkAIAByAGEAbgBnAGUAIAAoADAALgAyAC0AMQAwADAAVABlAFYAKQAuACAAVwBlACAAYwBvAG4AcwB0AHIAdQBjAHQAZQBkACAAYQAgAGMAYQB0AGEAbABvAGcAIABvAGYAIABWAEgARQAgAGcAYQBtAG0AYQAtAHIAYQB5ACAAcwBvAHUAcgBjAGUAcwAgAGYAcgBvAG0AIAB0AGgAZQAgAEgARwBQAFMAIABkAGEAdABhACAAcwBlAHQAIAB3AGkAdABoACAAYQAgAHMAeQBzAHQAZQBtAGEAdABpAGMAIABwAHIAbwBjAGUAZAB1AHIAZQAgAGYAbwByACAAYgBvAHQAaAAgAHMAbwB1AHIAYwBlACAAZABlAHQAZQBjAHQAaQBvAG4AIABhAG4AZAAgAGMAaABhAHIAYQBjAHQAZQByAGkAegBhAHQAaQBvAG4AIABvAGYAIABtAG8AcgBwAGgAbwBsAG8AZwB5ACAAYQBuAGQAIABzAHAAZQBjAHQAcgB1AG0ALgAgAFcAZQAgAHAAcgBlAHMAZQBuAHQAIAB0AGgAaQBzACAAbABpAGsAZQBsAGkAaABvAG8AZAAtACAAYgBhAHMAZQBkACAAbQBlAHQAaABvAGQAIABpAG4AIABkAGUAdABhAGkAbAAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIAB0AGgAZQAgAGkAbgB0AHIAbwBkAHUAYwB0AGkAbwBuACAAbwBmACAAYQAgAG0AbwBkAGUAbAAgAGMAbwBtAHAAbwBuAGUAbgB0ACAAdABvACAAYQBjAGMAbwB1AG4AdAAgAGYAbwByACAAdQBuAHIAZQBzAG8AbAB2AGUAZAAsACAAbABhAHIAZwBlAC0AcwBjAGEAbABlACAAZQBtAGkAcwBzAGkAbwBuACAAYQBsAG8AbgBnACAAdABoAGUAIABHAGEAbABhAGMAdABpAGMAIABwAGwAYQBuAGUALgAgAEkAbgAgAHQAbwB0AGEAbAAsACAAdABoAGUAIAByAGUAcwB1AGwAdABpAG4AZwAgAEgARwBQAFMAIABjAGEAdABhAGwAbwBnACAAYwBvAG4AdABhAGkAbgBzACAANwA4ACAAVgBIAEUAIABzAG8AdQByAGMAZQBzACwAIABvAGYAIAB3AGgAaQBjAGgAIAAxADQAIABhAHIAZQAgAG4AbwB0ACAAcgBlAGEAbgBhAGwAeQB6AGUAZAAgAGgAZQByAGUALAAgAGYAbwByACAAZQB4AGEAbQBwAGwAZQAsACAAZAB1AGUAIAB0AG8AIAB0AGgAZQBpAHIAIABjAG8AbQBwAGwAZQB4ACAAbQBvAHIAcABoAG8AbABvAGcAeQAsACAAbgBhAG0AZQBsAHkAIABzAGgAZQBsAGwALQBsAGkAawBlACAAcwBvAHUAcgBjAGUAcwAgAGEAbgBkACAAdABoAGUAIABHAGEAbABhAGMAdABpAGMAIABjAGUAbgB0AGUAcgAgAHIAZQBnAGkAbwBuAC4AIABXAGgAZQByAGUAIABwAG8AcwBzAGkAYgBsAGUALAAgAHcAZQAgAHAAcgBvAHYAaQBkAGUAIABhACAAZgBpAHIAbQAgAGkAZABlAG4AdABpAGYAaQBjAGEAdABpAG8AbgAgAG8AZgAgAHQAaABlACAAVgBIAEUAIABzAG8AdQByAGMAZQAgAG8AcgAgAHAAbABhAHUAcwBpAGIAbABlACAAYQBzAHMAbwBjAGkAYQB0AGkAbwBuAHMAIAB3AGkAdABoACAAcwBvAHUAcgBjAGUAcwAgAGkAbgAgAG8AdABoAGUAcgAgAGEAcwB0AHIAbwBuAG8AbQBpAGMAYQBsACAAYwBhAHQAYQBsAG8AZwBzAC4AIABXAGUAIABhAGwAcwBvACAAcwB0AHUAZABpAGUAZAAgAHQAaABlACAAYwBoAGEAcgBhAGMAdABlAHIAaQBzAHQAaQBjAHMAIABvAGYAIAB0AGgAZQAgAFYASABFACAAcwBvAHUAcgBjAGUAcwAgAHcAaQB0AGgAIABzAG8AdQByAGMAZQAgAHAAYQByAGEAbQBlAHQAZQByACAAZABpAHMAdAByAGkAYgB1AHQAaQBvAG4AcwAuACAAMQA2ACAAbgBlAHcAIABzAG8AdQByAGMAZQBzACAAdwBlAHIAZQAgAHAAcgBlAHYAaQBvAHUAcwBsAHkAIAB1AG4AawBuAG8AdwBuACAAbwByACAAdQBuAHAAdQBiAGwAaQBzAGgAZQBkACwAIABhAG4AZAAgAHcAZQAgAGkAbgBkAGkAdgBpAGQAdQBhAGwAbAB5ACAAZABpAHMAYwB1AHMAcwAgAHQAaABlAGkAcgAgAGkAZABlAG4AdABpAGYAaQBjAGEAdABpAG8AbgBzACAAbwByACAAcABvAHMAcwBpAGIAbABlACAAYQBzAHMAbwBjAGkAYQB0AGkAbwBuAHMALgAgAFcAZQAgAGYAaQByAG0AbAB5ACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgADMAMQAgAHMAbwB1AHIAYwBlAHMAIABhAHMAIABwAHUAbABzAGEAcgAgAHcAaQBuAGQAIABuAGUAYgB1AGwAYQBlACAAKABQAFcATgBlACkALAAgAHMAdQBwAGUAcgBuAG8AdgBhACAAcgBlAG0AbgBhAG4AdABzACAAKABTAE4AUgBzACkALAAgAGMAbwBtAHAAbwBzAGkAdABlACAAUwBOAFIAcwAsACAAbwByACAAZwBhAG0AbQBhAC0AcgBhAHkAIABiAGkAbgBhAHIAaQBlAHMALgAgAEEAbQBvAG4AZwAgAHQAaABlACAANAA3ACAAcwBvAHUAcgBjAGUAcwAgAG4AbwB0ACAAeQBlAHQAIABpAGQAZQBuAHQAaQBmAGkAZQBkACwAIABtAG8AcwB0ACAAbwBmACAAdABoAGUAbQAgACgAMwA2ACkAIABoAGEAdgBlACAAcABvAHMAcwBpAGIAbABlACAAYQBzAHMAbwBjAGkAYQB0AGkAbwBuAHMAIAB3AGkAdABoACAAYwBhAHQAYQBsAG8AZwBlAGQAIABvAGIAagBlAGMAdABzACwAIABuAG8AdABhAGIAbAB5ACAAUABXAE4AZQAgAGEAbgBkACAAZQBuAGUAcgBnAGUAdABpAGMAIABwAHUAbABzAGEAcgBzACAAdABoAGEAdAAgAGMAbwB1AGwAZAAgAHAAbwB3AGUAcgAgAFYASABFACAAUABXAE4AZQAuAAAAMWh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL0ErQS82MTIvQTEAAAysAEgALgBFAC4AUwAuAFMALgAgAEMAbwBsAGwAYQBiAG8AcgBhAHQAaQBvAG4AOwAgAEEAYgBkAGEAbABsAGEAIABIAC4AOwAgAEEAYgByAGEAbQBvAHcAcwBrAGkAIABBAC4AOwAgAEEAaABhAHIAbwBuAGkAYQBuACAARgAuADsAIABBAGkAdAAgAEIAZQBuAGsAaABhAGwAaQAgAEYALgA7ACAAQQBuAGcAdQBlAG4AZQByACAARQAuAE8ALgA7ACAAQQByAGEAawBhAHcAYQAgAE0ALgA7ACAAQQByAHIAaQBlAHQAYQAgAE0ALgA7ACAAQQB1AGIAZQByAHQAIABQAC4AOwAgAEIAYQBjAGsAZQBzACAATQAuADsAIABCAGEAbAB6AGUAcgAgAEEALgA7ACAAQgBhAHIAbgBhAHIAZAAgAE0ALgA7ACAAQgBlAGMAaABlAHIAaQBuAGkAIABZAC4AOwAgAEIAZQBjAGsAZQByACAAVABqAHUAcwAgAEoALgA7ACAAQgBlAHIAZwBlACAARAAuADsAIABCAGUAcgBuAGgAYQByAGQAIABTAC4AOwAgAEIAZQByAG4AbABvAGUAaAByACAASwAuADsAIABCAGwAYQBjAGsAdwBlAGwAbAAgAFIALgA7ACAAQgBvAGUAdAB0AGMAaABlAHIAIABNAC4AOwAgAEIAbwBpAHMAcwBvAG4AIABDAC4AOwAgAEIAbwBsAG0AbwBuAHQAIABKAC4AOwAgAEIAbwBuAG4AZQBmAG8AeQAgAFMALgA7ACAAQgBvAHIAZABhAHMAIABQAC4AOwAgAEIAcgBlAGcAZQBvAG4AIABKAC4AOwAgAEIAcgB1AG4AIABGAC4AOwAgAEIAcgB1AG4AIABQAC4AOwAgAEIAcgB5AGEAbgAgAE0ALgA7ACAAQgB1AGUAYwBoAGUAbABlACAATQAuADsAIABCAHUAbABpAGsAIABUAC4AOwAgAEMAYQBwAGEAcwBzAG8AIABNAC4AOwAgAEMAYQByAHIAaQBnAGEAbgAgAFMALgA7ACAAQwBhAHIAbwBmAGYAIABTAC4AOwAgAEMAYQByAG8AcwBpACAAQQAuADsAIABDAGEAcwBhAG4AbwB2AGEAIABTAC4AOwAgAEMAZQByAHIAdQB0AGkAIABNAC4AOwAgAEMAaABhAGsAcgBhAGIAbwByAHQAeQAgAE4ALgA7ACAAQwBoAGEAdgBlAHMAIABSAC4AQwAuAEcALgA7ACAAQwBoAGUAbgAgAEEALgA7ACAAQwBoAGUAdgBhAGwAaQBlAHIAIABKAC4AOwAgAEMAbwBsAGEAZgByAGEAbgBjAGUAcwBjAG8AIABTAC4AOwAgAEMAbwBuAGQAbwBuACAAQgAuADsAIABDAG8AbgByAGEAZAAgAEoALgA7ACAARABhAHYAaQBkAHMAIABJAC4ARAAuADsAIABEAGUAYwBvAGMAawAgAEoALgA7ACAARABlAGkAbAAgAEMALgA7ACAARABlAHYAaQBuACAASgAuADsAIABkAGUAVwBpAGwAdAAgAFAALgA7ACAARABpAHIAcwBvAG4AIABMAC4AOwAgAEQAagBhAG4AbgBhAHQAaQAtAEEAdABhAGkAIABBAC4AOwAgAEQAbwBtAGEAaQBuAGsAbwAgAFcALgA7ACAARABvAG4AYQB0AGgAIABBAC4AOwAgAEQAcgB1AHIAeQAgAEwALgBPACcAQwAuADsAIABEAHUAdABzAG8AbgAgAEsALgA7ACAARAB5AGsAcwAgAEoALgA7ACAARQBkAHcAYQByAGQAcwAgAFQALgA7ACAARQBnAGIAZQByAHQAcwAgAEsALgA7ACAARQBnAGUAcgAgAFAALgA7ACAARQBtAGUAcgB5ACAARwAuADsAIABFAHIAbgBlAG4AdwBlAGkAbgAgAEoALgAtAFAALgA7ACAARQBzAGMAaABiAGEAYwBoACAAUwAuADsAIABGAGEAcgBuAGkAZQByACAAQwAuADsAIABGAGUAZwBhAG4AIABTAC4AOwAgAEYAZQByAG4AYQBuAGQAZQBzACAATQAuAFYALgA7ACAARgBpAGEAcwBzAG8AbgAgAEEALgA7ACAARgBvAG4AdABhAGkAbgBlACAARwAuADsAIABGAG8AZQByAHMAdABlAHIAIABBAC4AOwAgAEYAdQBuAGsAIABTAC4AOwAgAEYAdQBlAHMAcwBsAGkAbgBnACAATQAuADsAIABHAGEAYgBpAGMAaQAgAFMALgA7ACAARwBhAGwAbABhAG4AdAAgAFkALgBBAC4AOwAgAEcAYQByAHIAaQBnAG8AdQB4ACAAVAAuADsAIABHAGEAcwB0ACAASAAuADsAIABHAGEAdABlACAARgAuADsAIABHAGkAYQB2AGkAdAB0AG8AIABHAC4AOwAgAEcAaQBlAGIAZQBsAHMAIABCAC4AOwAgAEcAbABhAHcAaQBvAG4AIABEAC4AOwAgAEcAbABpAGMAZQBuAHMAdABlAGkAbgAgAEoALgBGAC4AOwAgAEcAbwB0AHQAcwBjAGgAYQBsAGwAIABEAC4AOwAgAEcAcgBvAG4AZABpAG4AIABNAC4ALQBIAC4AOwAgAEgAYQBoAG4AIABKAC4AOwAgAEgAYQB1AHAAdAAgAE0ALgA7ACAASABhAHcAawBlAHMAIABKAC4AOwAgAEgAZQBpAG4AegBlAGwAbQBhAG4AbgAgAEcALgA7ACAASABlAG4AcgBpACAARwAuADsAIABIAGUAcgBtAGEAbgBuACAARwAuADsAIABIAGkAbgB0AG8AbgAgAEoALgBBAC4AOwAgAEgAbwBmAG0AYQBuAG4AIABXAC4AOwAgAEgAbwBpAHMAYwBoAGUAbgAgAEMALgA7ACAASABvAGwAYwBoACAAVAAuAEwALgA7ACAASABvAGwAbABlAHIAIABNAC4AOwAgAEgAbwByAG4AcwAgAEQALgA7ACAASQB2AGEAcwBjAGUAbgBrAG8AIABBAC4AOwAgAEkAdwBhAHMAYQBrAGkAIABIAC4AOwAgAEoAYQBjAGgAbwBsAGsAbwB3AHMAawBhACAAQQAuADsAIABKAGEAbQByAG8AegB5ACAATQAuADsAIABKAGEAbgBrAG8AdwBzAGsAeQAgAEQALgA7ACAASgBhAG4AawBvAHcAcwBrAHkAIABGAC4AOwAgAEoAaQBuAGcAbwAgAE0ALgA7ACAASgBvAHUAdgBpAG4AIABMAC4AOwAgAEoAdQBuAGcALQBSAGkAYwBoAGEAcgBkAHQAIABJAC4AOwAgAEsAYQBzAHQAZQBuAGQAaQBlAGMAawAgAE0ALgBBAC4AOwAgAEsAYQB0AGEAcgB6AHkATgBzAGsAaQAgAEsALgA7ACAASwBhAHQAcwB1AHIAYQBnAGEAdwBhACAATQAuADsAIABLAGEAdAB6ACAAVQAuADsAIABLAGUAcgBzAHoAYgBlAHIAZwAgAEQALgA7ACAASwBoAGEAbgBnAHUAbAB5AGEAbgAgAEQALgA7ACAASwBoAGUAbABpAGYAaQAgAEIALgA7ACAASwBpAG4AZwAgAEoALgA7ACAASwBsAGUAcABzAGUAcgAgAFMALgA7ACAASwBsAG8AYwBoAGsAbwB2ACAARAAuADsAIABLAGwAdQB6AG4AaQBhAGsAIABXAC4AOwAgAEsAbwBtAGkAbgAgAE4AdQAuADsAIABLAG8AcwBhAGMAawAgAEsALgA7ACAASwByAGEAawBhAHUAIABTAC4AOwAgAEsAcgBhAHUAcwAgAE0ALgA7ACAASwByAHUAZQBnAGUAcgAgAFAALgBQAC4AOwAgAEwAYQBmAGYAbwBuACAASAAuADsAIABMAGEAbQBhAG4AbgBhACAARwAuADsAIABMAGEAdQAgAEoALgA7ACAATABlAGUAcwAgAEoALgAtAFAALgA7ACAATABlAGYAYQB1AGMAaABlAHUAcgAgAEoALgA7ACAATABlAG0AaQBlAHIAZQAgAEEALgA7ACAATABlAG0AbwBpAG4AZQAtAEcAbwB1AG0AYQByAGQAIABNAC4AOwAgAEwAZQBuAGEAaQBuACAASgAuAC0AUAAuADsAIABMAGUAcwBlAHIAIABFAC4AOwAgAEwAbwBoAHMAZQAgAFQALgA7ACAATABvAHIAZQBuAHQAegAgAE0ALgA7ACAATABpAHUAIABSAC4AOwAgAEwAbwBwAGUAegAtAEMAbwB0AG8AIABSAC4AOwAgAEwAeQBwAG8AdgBhACAASQAuADsAIABNAGEAcgBhAG4AZABvAG4AIABWAC4AOwAgAE0AYQBsAHkAcwBoAGUAdgAgAEQALgA7ACAATQBhAHIAYwBvAHcAaQB0AGgAIABBAC4AOwAgAE0AYQByAGkAYQB1AGQAIABDAC4AOwAgAE0AYQByAHgAIABSAC4AOwAgAE0AYQB1AHIAaQBuACAARwAuADsAIABNAGEAeAB0AGUAZAAgAE4ALgA7ACAATQBhAHkAZQByACAATQAuADsAIABNAGUAaQBuAHQAagBlAHMAIABQAC4ASgAuADsAIABNAGUAeQBlAHIAIABNAC4AOwAgAE0AaQB0AGMAaABlAGwAbAAgAEEALgBNAC4AVwAuADsAIABNAG8AZABlAHIAcwBrAGkAIABSAC4AOwAgAE0AbwBoAGEAbQBlAGQAIABNAC4AOwAgAE0AbwBoAHIAbQBhAG4AbgAgAEwALgA7ACAATQBvAHIAYQAgAEsALgA7ACAATQBvAHUAbABpAG4AIABFAC4AOwAgAE0AdQByAGEAYwBoACAAVAAuADsAIABOAGEAawBhAHMAaABpAG0AYQAgAFMALgA7ACAAZABlACAATgBhAHUAcgBvAGkAcwAgAE0ALgA7ACAATgBkAGkAeQBhAHYAYQBsAGEAIABIAC4AOwAgAE4AaQBlAGQAZQByAHcAYQBuAGcAZQByACAARgAuADsAIABOAGkAZQBtAGkAZQBjACAASgAuADsAIABPAGEAawBlAHMAIABMAC4AOwAgAE8AJwBCAHIAaQBlAG4AIABQAC4AOwAgAE8AZABhAGsAYQAgAEgALgA7ACAATwBoAG0AIABTAC4AOwAgAE8AcwB0AHIAbwB3AHMAawBpACAATQAuADsAIABPAHkAYQAgAEkALgA7ACAAUABhAGQAbwB2AGEAbgBpACAATQAuADsAIABQAGEAbgB0AGUAcgAgAE0ALgA7ACAAUABhAHIAcwBvAG4AcwAgAFIALgBEAC4AOwAgAFAAYQB6ACAAQQByAHIAaQBiAGEAcwAgAE0ALgA7ACAAUABlAGsAZQB1AHIAIABOAC4AVwAuADsAIABQAGUAbABsAGUAdABpAGUAcgAgAEcALgA7ACAAUABlAHIAZQBuAG4AZQBzACAAQwAuADsAIABQAGUAdAByAHUAYwBjAGkAIABQAC4ALQBPAC4AOwAgAFAAZQB5AGEAdQBkACAAQgAuADsAIABQAGkAZQBsACAAUQAuADsAIABQAGkAdABhACAAUwAuADsAIABQAG8AaQByAGUAYQB1ACAAVgAuADsAIABQAG8AbwBuACAASAAuADsAIABQAHIAbwBrAGgAbwByAG8AdgAgAEQALgA7ACAAUAByAG8AawBvAHAAaAAgAEgALgA7ACAAUAB1AGUAaABsAGgAbwBmAGUAcgAgAEcALgA7ACAAUAB1AG4AYwBoACAATQAuADsAIABRAHUAaQByAHIAZQBuAGIAYQBjAGgAIABBAC4AOwAgAFIAYQBhAGIAIABTAC4AOwAgAFIAYQB1AHQAaAAgAFIALgA7ACAAUgBlAGkAbQBlAHIAIABBAC4AOwAgAFIAZQBpAG0AZQByACAATwAuADsAIABSAGUAbgBhAHUAZAAgAE0ALgA7ACAAZABlACAAbABvAHMAIABSAGUAeQBlAHMAIABSAC4AOwAgAFIAaQBlAGcAZQByACAARgAuADsAIABSAGkAbgBjAGgAaQB1AHMAbwAgAEwALgA7ACAAUgBvAG0AbwBsAGkAIABDAC4AOwAgAFIAbwB3AGUAbABsACAARwAuADsAIABSAHUAZABhAGsAIABCAC4AOwAgAFIAdQBsAHQAZQBuACAAQwAuAEIALgA7ACAAUwBhAGYAaQAtAEgAYQByAGIAIABTAC4AOwAgAFMAYQBoAGEAawBpAGEAbgAgAFYALgA7ACAAUwBhAGkAdABvACAAUwAuADsAIABTAGEAbgBjAGgAZQB6ACAARAAuAEEALgA7ACAAUwBhAG4AdABhAG4AZwBlAGwAbwAgAEEALgA7ACAAUwBhAHMAYQBrAGkAIABNAC4AOwAgAFMAYwBoAGEAbgBkAHIAaQAgAE0ALgA7ACAAUwBjAGgAbABpAGMAawBlAGkAcwBlAHIAIABSAC4AOwAgAFMAYwBoAHUAZQBzAHMAbABlAHIAIABGAC4AOwAgAFMAYwBoAHUAbAB6ACAAQQAuADsAIABTAGMAaAB3AGEAbgBrAGUAIABVAC4AOwAgAFMAYwBoAHcAZQBtAG0AZQByACAAUwAuADsAIABTAGUAZwBsAGEAcgAtAEEAcgByAG8AeQBvACAATQAuADsAIABTAGUAdAB0AGkAbQBvACAATQAuADsAIABTAGUAeQBmAGYAZQByAHQAIABBAC4AUwAuADsAIABTAGgAYQBmAGkAIABOAC4AOwAgAFMAaABpAGwAbwBuACAASQAuADsAIABTAGgAaQBuAGkAbgBnAGEAeQBhAG0AdwBlACAASwAuADsAIABTAGkAbQBvAG4AaQAgAFIALgA7ACAAUwBvAGwAIABIAC4AOwAgAFMAcABhAG4AaQBlAHIAIABGAC4AOwAgAFMAcABpAHIALQBKAGEAYwBvAGIAIABNAC4AOwAgAFMAdABhAHcAYQByAHoAIABMAC4AOwAgAFMAdABlAGUAbgBrAGEAbQBwACAAUgAuADsAIABTAHQAZQBnAG0AYQBuAG4AIABDAC4AOwAgAFMAdABlAHAAcABhACAAQwAuADsAIABTAHUAcwBoAGMAaAAgAEkALgA7ACAAVABhAGsAYQBoAGEAcwBoAGkAIABUAC4AOwAgAFQAYQB2AGUAcgBuAGUAdAAgAEoALgAtAFAALgA7ACAAVABhAHYAZQByAG4AaQBlAHIAIABUAC4AOwAgAFQAYQB5AGwAbwByACAAQQAuAE0ALgA7ACAAVABlAHIAcgBpAGUAcgAgAFIALgA7ACAAVABpAGIAYQBsAGQAbwAgAEwALgA7ACAAVABpAHoAaQBhAG4AaQAgAEQALgA7ACAAVABsAHUAYwB6AHkAawBvAG4AdAAgAE0ALgA7ACAAVAByAGkAYwBoAGEAcgBkACAAQwAuADsAIABUAHMAaQByAG8AdQAgAE0ALgA7ACAAVABzAHUAagBpACAATgAuADsAIABUAHUAZgBmAHMAIABSAC4AOwAgAFUAYwBoAGkAeQBhAG0AYQAgAFkALgA7ACAAdgBhAG4AIABkAGUAcgAgAFcAYQBsAHQAIABEAC4ASgAuADsAIAB2AGEAbgAgAEUAbABkAGkAawAgAEMALgA7ACAAdgBhAG4AIABSAGUAbgBzAGIAdQByAGcAIABDAC4AOwAgAHYAYQBuACAAUwBvAGUAbABlAG4AIABCAC4AOwAgAFYAYQBzAGkAbABlAGkAYQBkAGkAcwAgAEcALgA7ACAAVgBlAGgAIABKAC4AOwAgAFYAZQBuAHQAZQByACAAQwAuADsAIABWAGkAYQBuAGEAIABBAC4AOwAgAFYAaQBuAGMAZQBuAHQAIABQAC4AOwAgAFYAaQBuAGsAIABKAC4AOwAgAFYAbwBpAHMAaQBuACAARgAuADsAIABWAG8AZQBsAGsAIABIAC4ASgAuADsAIABWAHUAaQBsAGwAYQB1AG0AZQAgAFQALgA7ACAAVwBhAGQAaQBhAHMAaQBuAGcAaAAgAFoALgA7ACAAVwBhAGcAbgBlAHIAIABTAC4ASgAuADsAIABXAGEAZwBuAGUAcgAgAFAALgA7ACAAVwBhAGcAbgBlAHIAIABSAC4ATQAuADsAIABXAGgAaQB0AGUAIABSAC4AOwAgAFcAaQBlAHIAegBjAGgAbwBsAHMAawBhACAAQQAuADsAIABXAGkAbABsAG0AYQBuAG4AIABQAC4AOwAgAFcAbwBlAHIAbgBsAGUAaQBuACAAQQAuADsAIABXAG8AdQB0AGUAcgBzACAARAAuADsAIABZAGEAbgBnACAAUgAuADsAIABaAGEAYgBvAHIAbwB2ACAARAAuADsAIABaAGEAYwBoAGEAcgBpAGEAcwAgAE0ALgA7ACAAWgBhAG4AaQBuACAAUgAuADsAIABaAGQAegBpAGEAcgBzAGsAaQAgAEEALgBBAC4AOwAgAFoAZQBjAGgAIABBAC4AOwAgAFoAZQBmAGkAIABGAC4AOwAgAFoAaQBlAGcAbABlAHIAIABBAC4AOwAgAFoAbwByAG4AIABKAC4AOwAgAFoAeQB3AHUAYwBrAGEAIABOAC4AAAAHY2F0YWxvZwAAAAdiaWJjb2RlAAAAEwAyADAAMQA4AEEAJgBBAC4ALgAuADYAMQAyAEEALgAuAC4AMQBIf8AAAAAAAAlnYW1tYS1yYXkAAASraHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL3NucmNhdD86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYxMi9BMS9sc2NvbXA/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTIvQTEvY29tcG9uPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0ErQS82MTIvQTE6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYxMi9BMS9saXN0Pzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL3NvdXJjZXM/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTIvQTEvc25yY2F0Pzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL2xzY29tcD86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYxMi9BMS9jb21wb24/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0ErQS82MTIvQTE6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQStBLzYxMi9BMTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjEyL0ExL2xpc3Q/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTIvQTEvc291cmNlcz86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQStBLzYxMi9BMQAAAjdpdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6OjoAAAGjdnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXIAAAEFc3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6AAAAH2l2bzovL2Nkcy52aXppZXIvai9hK2EvNjE4L2ExODYAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAOSi9BK0EvNjE4L0ExODYAAAAdAEQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAbwBmACAAMQAwACAAcAB1AGwAcwBhAHIAcwAAAAhyZXNlYXJjaAAABwUAUAB1AGwAcwBhAHIAcwAgAHMAYwBpAG4AdABpAGwAbABhAHQAZQAuACAARAB5AG4AYQBtAGkAYwAgAHMAcABlAGMAdAByAGEAIABzAGgAbwB3ACAAYgByAGkAZwBoAHQAbgBlAHMAcwAgAHYAYQByAGkAYQB0AGkAbwBuACAAbwBmACAAcAB1AGwAcwBhAHIAcwAgAGkAbgAgAHQAaABlACAAdABpAG0AZQAgAGEAbgBkACAAZgByAGUAcQB1AGUAbgBjAHkAIABkAG8AbQBhAGkAbgAuACAAUwBlAGMAbwBuAGQAYQByAHkAIABzAHAAZQBjAHQAcgBhACAAZABlAG0AbwBuAHMAdAByAGEAdABlACAAdABoAGUAIABkAGkAcwB0AHIAaQBiAHUAdABpAG8AbgAgAG8AZgAgAGYAbAB1AGMAdAB1AGEAdABpAG8AbgAgAHAAbwB3AGUAcgAgAGkAbgAgAHQAaABlACAAZAB5AG4AYQBtAGkAYwAgAHMAcABlAGMAdAByAGEALgAgAEQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAcwB0AHIAbwBuAGcAbAB5ACAAZABlAHAAZQBuAGQAIABvAG4AIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AYQBsACAAZgByAGUAcQB1AGUAbgBjAGkAZQBzACwAIABiAHUAdAAgAHcAZQByAGUAIABvAGYAdABlAG4AIABvAGIAcwBlAHIAdgBlAGQAIABhAHQAIABmAHIAZQBxAHUAZQBuAGMAaQBlAHMAIABsAG8AdwBlAHIAIAB0AGgAYQBuACAAMQAuADUARwBIAHoALgAgAFMAYwBpAG4AdABpAGwAbABhAHQAaQBvAG4AIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAGEAdAAgAGgAaQBnAGgAZQByACAAZgByAGUAcQB1AGUAbgBjAGkAZQBzACAAaABlAGwAcAAgAHQAbwAgAGMAbwBuAHMAdAByAGEAaQBuACAAdABoAGUAIAB0AHUAcgBiAHUAbABlAG4AYwBlACAAZgBlAGEAdAB1AHIAZQAgAG8AZgAgAHQAaABlACAAaQBuAHQAZQByAHMAdABlAGwAbABhAHIAIABtAGUAZABpAHUAbQAgAG8AdgBlAHIAIABhACAAdwBpAGQAZQAgAGYAcgBlAHEAdQBlAG4AYwB5ACAAcgBhAG4AZwBlACAAYQBuAGQAIABjAGEAbgAgAGQAZQB0AGUAYwB0ACAAdABoAGUAIABzAGMAaQBuAHQAaQBsAGwAYQB0AGkAbwBuAHMAIABvAGYAIABtAG8AcgBlACAAZABpAHMAdABhAG4AdAAgAHAAdQBsAHMAYQByAHMALgAgAFQAZQBuACAAcAB1AGwAcwBhAHIAcwAgAHcAZQByAGUAIABvAGIAcwBlAHIAdgBlAGQAIABhAHQAIAAyADIANQAwAE0ASAB6ACAAKABTAC0AYgBhAG4AZAApACAAdwBpAHQAaAAgAHQAaABlACAASgBpAGEAbQB1AHMAaQAgADYANgBtACAAdABlAGwAZQBzAGMAbwBwAGUAIAB0AG8AIABzAHQAdQBkAHkAIAB0AGgAZQBpAHIAIABzAGMAaQBuAHQAaQBsAGwAYQB0AGkAbwBuAHMALgAgAFQAaABlAGkAcgAgAGQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAdwBlAHIAZQAgAGYAaQByAHMAdAAgAG8AYgB0AGEAaQBuAGUAZAAsACAAZgByAG8AbQAgAHcAaABpAGMAaAAgAHQAaABlACAAZABlAGMAbwByAHIAZQBsAGEAdABpAG8AbgAgAGIAYQBuAGQAdwBpAGQAdABoAHMAIABhAG4AZAAgAHQAaQBtAGUAIABzAGMAYQBsAGUAcwAgAG8AZgAgAGQAaQBmAGYAcgBhAGMAdABpAHYAZQAgAHMAYwBpAG4AdABpAGwAbABhAHQAaQBvAG4AIAB3AGUAcgBlACAAdABoAGUAbgAgAGQAZQByAGkAdgBlAGQAIABiAHkAIABhAHUAdABvAGMAbwByAHIAZQBsAGEAdABpAG8AbgAuACAAUwBlAGMAbwBuAGQAYQByAHkAIABzAHAAZQBjAHQAcgBhACAAdwBlAHIAZQAgAGMAYQBsAGMAdQBsAGEAdABlAGQAIABiAHkAIABmAG8AcgBtAGkAbgBnACAAdABoAGUAIABGAG8AdQByAGkAZQByACAAcABvAHcAZQByACAAcwBwAGUAYwB0AHIAYQAgAG8AZgAgAHQAaABlACAAZAB5AG4AYQBtAGkAYwAgAHMAcABlAGMAdAByAGEALgAgAE0AbwBzAHQAIABvAGYAIAB0AGgAZQAgAG4AZQB3AGwAeQAgAG8AYgB0AGEAaQBuAGUAZAAgAGQAeQBuAGEAbQBpAGMAIABzAHAAZQBjAHQAcgBhACAAYQByAGUAIABhAHQAIAB0AGgAZQAgAGgAaQBnAGgAZQBzAHQAIABmAHIAZQBxAHUAZQBuAGMAeQAgAG8AcgAgAGgAYQB2AGUAIAB0AGgAZQAgAGwAbwBuAGcAZQBzAHQAIAB0AGkAbQBlACAAcwBwAGEAbgAgAG8AZgAgAGEAbgB5ACAAcAB1AGIAbABpAHMAaABlAGQAIABkAGEAdABhACAAZgBvAHIAIAB0AGgAZQBzAGUAIABwAHUAbABzAGEAcgBzAC4AIABGAG8AcgAgAFAAUwBSAHMAIABCADAANQA0ADAAKwAyADMALAAgAEIAMgAzADIANAArADYAMAAgAGEAbgBkACAAQgAyADMANQAxACsANgAxACwAIAB0AGgAZQBzAGUAIAB3AGUAcgBlACAAdABoAGUAIABmAGkAcgBzAHQAIABkAHkAbgBhAG0AaQBjACAAcwBwAGUAYwB0AHIAYQAgAGUAdgBlAHIAIAByAGUAcABvAHIAdABlAGQALgAgAFQAaABlACAAZgByAGUAcQB1AGUAbgBjAHkALQBkAGUAcABlAG4AZABlAG4AYwBlACAAbwBmACAAcwBjAGkAbgB0AGkAbABsAGEAdABpAG8AbgAgAHAAYQByAGEAbQBlAHQAZQByAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAHQAaABhAHQAIAB0AGgAZQAgAGkAbgB0AGUAcgB2AGUAbgBpAG4AZwAgAG0AZQBkAGkAdQBtACAAYwBhAG4AIAByAGEAcgBlAGwAeQAgAGIAZQAgAGkAZABlAGEAbABsAHkAIAB0AHUAcgBiAHUAbABlAG4AdAAgAHcAaQB0AGgAIABhACAASwBvAGwAbQBvAGcAbwByAG8AdgAgAHMAcABlAGMAdAByAHUAbQAuACAAVABoAGUAIAB0AGgAaQBuACAAcwBjAHIAZQBlAG4AIABtAG8AZABlAGwAIAB3AG8AcgBrAGUAZAAgAHcAZQBsAGwAIABhAHQAIABTAC0AYgBhAG4AZAAgAGYAbwByACAAdABoAGUAIABzAGMAaQBuAHQAaQBsAGwAYQB0AGkAbwBuACAAbwBmACAAUABTAFIAIABCADEAOQAzADMAKwAxADYALgAgAFAAYQByAGEAYgBvAGwAaQBjACAAYQByAGMAcwAgAHcAZQByAGUAIABkAGUAdABlAGMAdABlAGQAIABpAG4AIAB0AGgAZQAgAHMAZQBjAG8AbgBkAGEAcgB5ACAAcwBwAGUAYwB0AHIAYQAgAG8AZgAgAHQAaAByAGUAZQAgAHAAdQBsAHMAYQByAHMALAAgAFAAUwBSAHMAIABCADAAMwA1ADUAKwA1ADQALAAgAEIAMAA1ADQAMAArADIAMwAgAGEAbgBkACAAQgAyADEANQA0ACsANAAwACwAIABhAGwAbAAgAG8AZgAgAHcAaABpAGMAaAAgAHcAZQByAGUAIABhAHMAeQBtAG0AZQB0AHIAaQBjAGEAbABsAHkAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQALgAgAFQAaABlACAAaQBuAHYAZQByAHQAZQBkACAAYQByAGMAbABlAHQAcwAgAG8AZgAgAFAAUwBSACAAQgAwADMANQA1ACsANQA0ACAAdwBlAHIAZQAgAHMAZQBlAG4AIAB0AG8AIABlAHYAbwBsAHYAZQAgAGEAbABvAG4AZwAgAHQAaABlACAAbQBhAGkAbgAgAHAAYQByAGEAYgBvAGwAYQAgAHcAaQB0AGgAaQBuACAAYQAgAGMAbwBuAHQAaQBuAHUAbwB1AHMAIABvAGIAcwBlAHIAdgBpAG4AZwAgAHMAZQBzAHMAaQBvAG4AIABvAGYAIAAxADIAIABoAG8AdQByAHMALAAgAGYAcgBvAG0AIAB3AGgAaQBjAGgAIAB0AGgAZQAgAGEAbgBnAHUAbABhAHIAIAB2AGUAbABvAGMAaQB0AHkAIABvAGYAIAB0AGgAZQAgAHAAdQBsAHMAYQByACAAdwBhAHMAIABlAHMAdABpAG0AYQB0AGUAZAAgAHQAaABhAHQAIAB3AGEAcwAgAGMAbwBuAHMAaQBzAHQAZQBuAHQAIAB3AGkAdABoACAAdABoAGUAIABtAGUAYQBzAHUAcgBlAG0AZQBuAHQAIABiAHkAIAB2AGUAcgB5ACAAbABvAG4AZwAgAGIAYQBzAGUAbABpAG4AZQAgAGkAbgB0AGUAcgBmAGUAcgBvAG0AZQB0AHIAeQAgACgAVgBMAEIASQApAC4AAAAzaHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovQStBLzYxOC9BMTg2AAAAVABXAGEAbgBnACAAUAAuAEYALgA7ACAASABhAG4AIABKAC4ATAAuADsAIABIAGEAbgAgAEwALgA7ACAAWgBoAGEAbgBnACAASgAuAEgALgA7ACAATABpACAASgAuAFEALgA7ACAAVwBhAG4AZwAgAEMALgA7ACAASABhAG4AIABKAC4AOwAgAFcAYQBuAGcAIABUAC4AOwAgAEcAYQBvACAAWAAuAFkALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAxADgAQQAmAEEALgAuAC4ANgAxADgAQQAuADEAOAA2AFd/wAAAAAAABXJhZGlvAAABGWh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9BK0EvNjE4L0ExODY6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9BK0EvNjE4L0ExODY6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MTgvQTE4Ni90YWJsZTE/AAAAZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAABednI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADM6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQAAAAfaXZvOi8vY2RzLnZpemllci9qL2ErYS82MTkvYTEyNAAAABF2czpjYXRhbG9nc2VydmljZQAAAA5KL0ErQS82MTkvQTEyNAAAACYAVABIAE8AUgAgAHMAdQByAHYAZQB5ACAAaQBuACAAbgBvAHIAdABoAGUAcgBuACAARwBhAGwAYQBjAHQAaQBjACAAcABsAGEAbgBlAAAACHJlc2VhcmNoAAAJAQBSAGEAZABpAG8AIABjAG8AbgB0AGkAbgB1AHUAbQAgAHMAdQByAHYAZQB5AHMAIABvAGYAIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAHAAbABhAG4AZQAgAGMAYQBuACAAZgBpAG4AZAAgAGEAbgBkACAAYwBoAGEAcgBhAGMAdABlAHIAaQB6AGUAIABIAEkASQAgAHIAZQBnAGkAbwBuAHMALAAgAHMAdQBwAGUAcgBuAG8AdgBhACAAcgBlAG0AbgBhAG4AdABzACAAKABTAE4AUgBzACkALAAgAHAAbABhAG4AZQB0AGEAcgB5ACAAbgBlAGIAdQBsAGEAZQAgACgAUABOAGUAKQAsACAAYQBuAGQAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAcwBvAHUAcgBjAGUAcwAuACAAQQAgAG4AdQBtAGIAZQByACAAbwBmACAAcwB1AHIAdgBlAHkAcwAgAGEAdAAgAGgAaQBnAGgAIABhAG4AZwB1AGwAYQByACAAcgBlAHMAbwBsAHUAdABpAG8AbgAgACgAPAB+ADIANQAiACkAIABhAHQAIABkAGkAZgBmAGUAcgBlAG4AdAAgAHcAYQB2AGUAbABlAG4AZwB0AGgAcwAgAGUAeABpAHMAdAAgAHQAbwAgAHMAdAB1AGQAeQAgAHQAaABlACAAaQBuAHQAZQByAHMAdABlAGwAbABhAHIAIABtAGUAZABpAHUAbQAgACgASQBTAE0AKQAsACAAYgB1AHQAIABuAG8AIABjAG8AbQBwAGEAcgBhAGIAbABlACAAaABpAGcAaAAtAHIAZQBzAG8AbAB1AHQAaQBvAG4AIABhAG4AZAAgAGgAaQBnAGgALQBzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABzAHUAcgB2AGUAeQAgAGUAeABpAHMAdABzACAAYQB0ACAAbABvAG4AZwAgAHIAYQBkAGkAbwAgAHcAYQB2AGUAbABlAG4AZwB0AGgAcwAgAGEAcgBvAHUAbgBkACAAMgAxAGMAbQAuACAATwB1AHIAIABnAG8AYQBsACAAaQBzACAAdABvACAAaQBuAHYAZQBzAHQAaQBnAGEAdABlACAAdABoAGUAIAAyADEAYwBtACAAcgBhAGQAaQBvACAAYwBvAG4AdABpAG4AdQB1AG0AIABlAG0AaQBzAHMAaQBvAG4AIABpAG4AIAB0AGgAZQAgAG4AbwByAHQAaABlAHIAbgAgAEcAYQBsAGEAYwB0AGkAYwAgAHAAbABhAG4AZQAgAGEAdAAgADwAMgA1ACIAIAByAGUAcwBvAGwAdQB0AGkAbwBuAC4AIABXAGUAIABvAGIAcwBlAHIAdgBlAGQAIABhACAAbABhAHIAZwBlACAAZgByAGEAYwB0AGkAbwBuACAAbwBmACAAdABoAGUAIABHAGEAbABhAGMAdABpAGMAIABwAGwAYQBuAGUAIABpAG4AIAB0AGgAZQAgAGYAaQByAHMAdAAgAHEAdQBhAGQAcgBhAG4AdAAgAG8AZgAgAHQAaABlACAATQBpAGwAawB5ACAAVwBhAHkAIAAoAGwAPQAxADQALgAwAHsAZABlAGcAfQAtADYANwAuADQAewBkAGUAZwB9ACAAYQBuAGQAIAB8AGIAfAA8AD0AMQAuADIANQB7AGQAZQBnAH0AKQAgAHcAaQB0AGgAIAB0AGgAZQAgAEsAYQByAGwAIABHAC4AIABKAGEAbgBzAGsAeQAgAFYAZQByAHkAIABMAGEAcgBnAGUAIABBAHIAcgBhAHkAIAAoAFYATABBACkAIABpAG4AIAB0AGgAZQAgAEMALQBjAG8AbgBmAGkAZwB1AHIAYQB0AGkAbwBuACAAYwBvAHYAZQByAGkAbgBnACAAcwBpAHgAIABjAG8AbgB0AGkAbgB1AHUAbQAgAHMAcABlAGMAdAByAGEAbAAgAHcAaQBuAGQAbwB3AHMALgAgAFQAaABlAHMAZQAgAGQAYQB0AGEAIABwAHIAbwB2AGkAZABlACAAYQAgAGQAZQB0AGEAaQBsAGUAZAAgAHYAaQBlAHcAIABvAG4AIAB0AGgAZQAgAGMAbwBtAHAAYQBjAHQAIABhAHMAIAB3AGUAbABsACAAYQBzACAAZQB4AHQAZQBuAGQAZQBkACAAcgBhAGQAaQBvACAAZQBtAGkAcwBzAGkAbwBuACAAbwBmACAAbwB1AHIAIABHAGEAbABhAHgAeQAgAGEAbgBkACAAdABoAG8AdQBzAGEAbgBkAHMAIABvAGYAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAYgBhAGMAawBnAHIAbwB1AG4AZAAgAHMAbwB1AHIAYwBlAHMALgAgAFcAZQAgAHUAcwBlAGQAIAB0AGgAZQAgAEIATABPAEIAQwBBAFQAIABzAG8AZgB0AHcAYQByAGUAIABhAG4AZAAgAGUAeAB0AHIAYQBjAHQAZQBkACAAMQAwADkAMQA2ACAAcwBvAHUAcgBjAGUAcwAuACAAQQBmAHQAZQByACAAcgBlAG0AbwB2AGkAbgBnACAAcwBwAHUAcgBpAG8AdQBzACAAcwBvAHUAcgBjAGUAIABkAGUAdABlAGMAdABpAG8AbgBzACAAYwBhAHUAcwBlAGQAIABiAHkAIAB0AGgAZQAgAHMAaQBkAGUAbABvAGIAZQBzACAAbwBmACAAdABoAGUAIABzAHkAbgB0AGgAZQBzAGkAcwBlAGQAIABiAGUAYQBtACwAIAB3AGUAIABjAGwAYQBzAHMAaQBmAGkAZQBkACAAMQAwADMAOAA3ACAAcwBvAHUAcgBjAGUAcwAgAGEAcwAgAHIAZQBsAGkAYQBiAGwAZQAgAGQAZQB0AGUAYwB0AGkAbwBuAHMALgBXAGUAIABzAG0AbwBvAHQAaABlAGQAIAB0AGgAZQAgAGkAbQBhAGcAZQBzACAAdABvACAAYQAgAGMAbwBtAG0AbwBuACAAcgBlAHMAbwBsAHUAdABpAG8AbgAgAG8AZgAgADIANQAiACAAYQBuAGQAIABlAHgAdAByAGEAYwB0AGUAZAAgAHQAaABlACAAcABlAGEAawAgAGYAbAB1AHgAIABkAGUAbgBzAGkAdAB5ACAAbwBmACAAZQBhAGMAaAAgAHMAbwB1AHIAYwBlACAAaQBuACAAZQBhAGMAaAAgAHMAcABlAGMAdAByAGEAbAAgAHcAaQBuAGQAbwB3ACAAKABTAFAAVwApACAAdABvACAAZABlAHQAZQByAG0AaQBuAGUAIAB0AGgAZQAgAHMAcABlAGMAdAByAGEAbAAgAGkAbgBkAGkAYwBlAHMAIAB7AGEAbABwAGgAYQB9ACAAKABhAHMAcwB1AG0AaQBuAGcAIABJACgAbgB1ACkAewBwAHIAbwBwAC4AdABvAH0AbgB1AF4AYQBsAHAAaABhAF4AKQAuACAAQgB5ACAAYwByAG8AcwBzAC0AbQBhAHQAYwBoAGkAbgBnACAAdwBpAHQAaAAgAGMAYQB0AGEAbABvAGcAcwAgAG8AZgAgAEgASQBJACAAcgBlAGcAaQBvAG4AcwAsACAAUwBOAFIAcwAsACAAUABOAGUALAAgAGEAbgBkACAAcAB1AGwAcwBhAHIAcwAsACAAdwBlACAAZgBvAHUAbgBkACAAcgBhAGQAaQBvACAAYwBvAHUAbgB0AGUAcgBwAGEAcgB0AHMAIABmAG8AcgAgADgANAAwACAASABJAEkAIAByAGUAZwBpAG8AbgBzACwAIAA1ADIAIABTAE4AUgBzACwAIAAxADYANAAgAFAATgBlACwAIABhAG4AZAAgADMAOAAgAHAAdQBsAHMAYQByAHMALgAgAFcAZQAgAGYAbwB1AG4AZAAgADcAOQAgAGMAbwBuAHQAaQBuAHUAdQBtACAAcwBvAHUAcgBjAGUAcwAgAHQAaABhAHQAIABhAHIAZQAgAGEAcwBzAG8AYwBpAGEAdABlAGQAIAB3AGkAdABoACAAWAAtAHIAYQB5ACAAcwBvAHUAcgBjAGUAcwAuACAAVwBlACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgADYAOQA5ACAAdQBsAHQAcgBhAHMAdABlAGUAcAAgAHMAcABlAGMAdAByAGEAbAAgAHMAbwB1AHIAYwBlAHMAIAAoAGEAbABwAGgAYQA8AC0AMQAuADMAKQAgAHQAaABhAHQAIABjAG8AdQBsAGQAIABiAGUAIABoAGkAZwBoAC0AcgBlAGQAcwBoAGkAZgB0ACAAZwBhAGwAYQB4AGkAZQBzAC4AIABBAHIAbwB1AG4AZAAgADkAMAAwADAAIABvAGYAIAB0AGgAZQAgAHMAbwB1AHIAYwBlAHMAIAB3AGUAIABlAHgAdAByAGEAYwB0AGUAZAAgAGEAcgBlACAAbgBvAHQAIABjAGwAYQBzAHMAaQBmAGkAZQBkACAAcwBwAGUAYwBpAGYAaQBjAGEAbABsAHkALAAgAGIAdQB0ACAAYgBhAHMAZQBkACAAbwBuACAAdABoAGUAaQByACAAcwBwAGEAdABpAGEAbAAgAGEAbgBkACAAcwBwAGUAYwB0AHIAYQBsACAAZABpAHMAdAByAGkAYgB1AHQAaQBvAG4ALAAgAGEAIABsAGEAcgBnAGUAIABmAHIAYQBjAHQAaQBvAG4AIABvAGYAIAB0AGgAZQBtACAAaQBzACAAbABpAGsAZQBsAHkAIAB0AG8AIABiAGUAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAYgBhAGMAawBnAHIAbwB1AG4AZAAgAHMAbwB1AHIAYwBlAHMALgAgAE0AbwByAGUAIAB0AGgAYQBuACAANwA3ADUAMAAgAHMAbwB1AHIAYwBlAHMAIABkAG8AIABuAG8AdAAgAGgAYQB2AGUAIABjAG8AdQBuAHQAZQByAHAAYQByAHQAcwAgAGkAbgAgAHQAaABlACAAUwBJAE0AQgBBAEQAIABkAGEAdABhAGIAYQBzAGUALAAgAGEAbgBkACAAbQBvAHIAZQAgAHQAaABhAG4AIAAzADcANgAwACAAcwBvAHUAcgBjAGUAcwAgAGQAbwAgAG4AbwB0ACAAaABhAHYAZQAgAGMAbwB1AG4AdABlAHIAcABhAHIAdABzACAAaQBuACAAdABoAGUAIABOAEUARAAgAGQAYQB0AGEAYgBhAHMAZQAuACAAUwB0AHUAZAB5AGkAbgBnACAAdABoAGUAIABsAG8AbgBnACAAdwBhAHYAZQBsAGUAbgBnAHQAaABzACAAYwBtACAAYwBvAG4AdABpAG4AdQB1AG0AIABlAG0AaQBzAHMAaQBvAG4AIABhAG4AZAAgAHQAaABlACAAYQBzAHMAbwBjAGkAYQB0AGUAZAAgAHMAcABlAGMAdAByAGEAbAAgAGkAbgBkAGkAYwBlAHMAIABhAGwAbABvAHcAcwAgAHUAcwAgAHQAbwAgAGMAaABhAHIAYQBjAHQAZQByAGkAegBlACAAYQAgAGwAYQByAGcAZQAgAGYAcgBhAGMAdABpAG8AbgAgAG8AZgAgAEcAYQBsAGEAYwB0AGkAYwAgAGEAbgBkACAAZQB4AHQAcgBhAGcAYQBsAGEAYwB0AGkAYwAgAHIAYQBkAGkAbwAgAHMAbwB1AHIAYwBlAHMAIABpAG4AIAB0AGgAZQAgAGEAcgBlAGEAIABvAGYAIAB0AGgAZQAgAG4AbwByAHQAaABlAHIAbgAgAGkAbgBuAGUAcgAgAE0AaQBsAGsAeQAgAFcAYQB5AC4AIABUAGgAaQBzACAAZABhAHQAYQBiAGEAcwBlACAAdwBpAGwAbAAgAGIAZQAgAGUAeAB0AHIAZQBtAGUAbAB5ACAAdQBzAGUAZgB1AGwAIABmAG8AcgAg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AGkAZQB3ACAAbwBmACAAdABoAGUAIABwAHUAbABzAGEAcgAgAHcAaQBuAGQAIABuAGUAYgB1AGwAYQAgACgAUABXAE4AKQAgAEgARQBTAFMAIABKADEAOAAyADUALQAtADEAMwA3AC4AIABXAGUAIABhAGkAbQAgAHQAbwAgAGMAbwBuAHMAdAByAGEAaQBuACAAdABoAGUAIABtAGUAYwBoAGEAbgBpAHMAbQBzACAAZABvAG0AaQBuAGEAdABpAG4AZwAgAHQAaABlACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIAB3AGkAdABoAGkAbgAgAHQAaABlACAAbgBlAGIAdQBsAGEALAAgAGEAYwBjAG8AdQBuAHQAaQBuAGcAIABmAG8AcgAgAGkAdABzACAAYQBuAG8AbQBhAGwAbwB1AHMAbAB5ACAAbABhAHIAZwBlACAAcwBpAHoAZQAgAGEAbgBkACAAcwBwAGUAYwB0AHIAYQBsACAAYwBoAGEAcgBhAGMAdABlAHIAaQBzAHQAaQBjAHMALgAgAFQAaABlACAAbgBlAGIAdQBsAGEAIABpAHMAIABzAHQAdQBkAGkAZQBkACAAdQBzAGkAbgBnACAAYQAgAGQAZQBlAHAAIABlAHgAcABvAHMAdQByAGUAIABmAHIAbwBtACAAbwB2AGUAcgAgADEAMgAgAHkAZQBhAHIAcwAgAG8AZgAgAEgALgBFAC4AUwAuAFMALgAgAEkAIABvAHAAZQByAGEAdABpAG8AbgAsACAAdABvAGcAZQB0AGgAZQByACAAdwBpAHQAaAAgAGQAYQB0AGEAIABmAHIAbwBtACAASAAuAEUALgBTAC4AUwAuACAASQBJACAAaQBtAHAAcgBvAHYAaQBuAGcAIAB0AGgAZQAgAGwAbwB3ACAAZQBuAGUAcgBnAHkAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkALgAgAEUAbgBoAGEAbgBjAGUAZAAgAGUAbgBlAHIAZwB5AC0AIABkAGUAcABlAG4AZABlAG4AdAAgAG0AbwByAHAAaABvAGwAbwBnAGkAYwBhAGwAIABhAG4AZAAgAHMAcABhAHQAaQBhAGwAbAB5AC0AcgBlAHMAbwBsAHYAZQBkACAAcwBwAGUAYwB0AHIAYQBsACAAYQBuAGEAbAB5AHMAZQBzACAAcAByAG8AYgBlACAAdABoAGUAIABWAGUAcgB5ACAASABpAGcAaAAgAEUAbgBlAHIAZwB5ACAAKABWAEgARQAsACAARQA+ADAALgAxAFQAZQBWACkAIABnAGEAbQBtAGEALQByAGEAeQAgAHAAcgBvAHAAZQByAHQAaQBlAHMAIABvAGYAIAB0AGgAZQAgAG4AZQBiAHUAbABhAC4AIABUAGgAZQAgAG4AZQBiAHUAbABhACAAZQBtAGkAcwBzAGkAbwBuACAAaQBzACAAcgBlAHYAZQBhAGwAZQBkACAAdABvACAAZQB4AHQAZQBuAGQAIABvAHUAdAAgAHQAbwAgADEALgA1ACAAZABlAGcAcgBlAGUAcwAgAGYAcgBvAG0AIAB0AGgAZQAgAHAAdQBsAHMAYQByACwAIAB+ADEALgA1ACAAdABpAG0AZQBzACAAZgB1AHIAdABoAGUAcgAgAHQAaABhAG4AIABwAHIAZQB2AGkAbwB1AHMAbAB5ACAAcwBlAGUAbgAsACAAbQBhAGsAaQBuAGcAIABIAEUAUwBTACAASgAxADgAMgA1AC0AMQAzADcALAAgAHcAaQB0AGgAIABhAG4AIABpAG4AdAByAGkAbgBzAGkAYwAgAGQAaQBhAG0AZQB0AGUAcgAgAG8AZgAgAH4AMQAwADAAcABjACwAIABwAG8AdABlAG4AdABpAGEAbABsAHkAIAB0AGgAZQAgAGwAYQByAGcAZQBzAHQAIABnAGEAbQBtAGEALQByAGEAeQAgAFAAVwBOACAAYwB1AHIAcgBlAG4AdABsAHkAIABrAG4AbwB3AG4ALgAgAEMAaABhAHIAYQBjAHQAZQByAGkAcwBhAHQAaQBvAG4AIABvAGYAIAB0AGgAZQAgAG4AZQBiAHUAbABhACcAcwAgAHMAdAByAG8AbgBnAGwAeQAgAGUAbgBlAHIAZwB5AC0AZABlAHAAZQBuAGQAZQBuAHQAIABtAG8AcgBwAGgAbwBsAG8AZwB5ACAAZQBuAGEAYgBsAGUAcwAgAHQAaABlACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIABtAGUAYwBoAGEAbgBpAHMAbQBzACAAdABvACAAYgBlACAAYwBvAG4AcwB0AHIAYQBpAG4AZQBkAC4AIABBACAAZABlAHAAZQBuAGQAZQBuAGMAZQAgAG8AZgAgAHQAaABlACAAbgBlAGIAdQBsAGEAIABlAHgAdABlAG4AdAAgAHcAaQB0AGgAIABlAG4AZQByAGcAeQAgAG8AZgAgAFIAewBwAHIAbwBwAC4AdABvAH0AIABFAF4AYQBsAHAAaABhAF4AIAB3AGkAdABoACAAYQBsAHAAaABhAD0ALQAwAC4AMgA5ACsALwAtADAALgAwADQAKABzAHQAYQB0ACkAKwAvAC0AMAAuADAANQAoAHMAeQBzACkAIABkAGkAcwBmAGEAdgBvAHUAcgBzACAAYQAgAHAAdQByAGUAIABkAGkAZgBmAHUAcwBpAG8AbgAgAHMAYwBlAG4AYQByAGkAbwAgAGYAbwByACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIAB3AGkAdABoAGkAbgAgAHQAaABlACAAbgBlAGIAdQBsAGEALgAgAFQAaABlACAAdABvAHQAYQBsACAAZwBhAG0AbQBhAC0AcgBhAHkAIABmAGwAdQB4ACAAbwBmACAAdABoAGUAIABuAGUAYgB1AGwAYQAgAGEAYgBvAHYAZQAgADEAfgBUAGUAVgAgAGkAcwAgAGYAbwB1AG4AZAAgAHQAbwAgAGIAZQAgACgAMQAuADEAMgArAC8ALQAwAC4AMAAzACgAcwB0AGEAdAApACsALwAtADAALgAyADUAKABzAHkAcwApACkAeAAxADAAXgAtADEAMQBeAGMAbQBeAC0AMgBeAHMAXgAtADEAXgAsACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAHQAbwAgAH4ANgA0ACUAIABvAGYAIAB0AGgAZQAgAGYAbAB1AHgAIABvAGYAIAB0AGgAZQAgAEMAcgBhAGIAIABOAGUAYgB1AGwAYQAuACAASABFAFMAUwAgAEoAMQA4ADIANQAtADEAMwA3ACAAaQBzACAAYQAgAFAAVwBOACAAdwBpAHQAaAAgAGMAbABlAGEAcgAgAGUAbgBlAHIAZwB5AC0AZABlAHAAZQBuAGQAZQBuAHQAIABtAG8AcgBwAGgAbwBsAG8AZwB5ACAAYQB0ACAAVgBIAEUAIABnAGEAbQBtAGEALQByAGEAeQAgAGUAbgBlAHIAZwBpAGUAcwAuACAAVABoAGkAcwAgAHMAbwB1AHIAYwBlACAAaQBzACAAdQBzAGUAZAAgAGEAcwAgAGEAIABsAGEAYgBvAHIAYQB0AG8AcgB5ACAAdABvACAAaQBuAHYAZQBzAHQAaQBnAGEAdABlACAAcABhAHIAdABpAGMAbABlACAAdAByAGEAbgBzAHAAbwByAHQAIAB3AGkAdABoAGkAbgAgAG0AaQBkAGQAbABlAC0AYQBnAGUAZAAgAFAAVwBOAGUALgAgAEQAZQBlAHAAIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAG8AZgAgAHQAaABpAHMAIABoAGkAZwBoAGwAeQAgAHMAcABhAHQAaQBhAGwAbAB5AC0AZQB4AHQAZQBuAGQAZQBkACAAUABXAE4AIABlAG4AYQBiAGwAZQAgAGEAIABzAHAAZQBjAHQAcgBhAGwAIABtAGEAcAAgAG8AZgAgAHQAaABlACAAcgBlAGcAaQBvAG4AIAB0AG8AIABiAGUAIABwAHIAbwBkAHUAYwBlAGQALAAgAHAAcgBvAHYAaQBkAGkAbgBnACAAaQBuAHMAaQBnAGgAdABzACAAaQBuAHQAbwAgAHQAaABlACAAcwBwAGUAYwB0AHIAYQBsACAAdgBhAHIAaQBhAHQAaQBvAG4AIAB3AGkAdABoAGkAbgAgAHQAaABlACAAbgBlAGIAdQBsAGEALgAAADNodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9BK0EvNjIxL0ExMTYAAAs2AEgALgBFAC4AUwAuAFMALgAgAEMAbwBsAGwAYQBiAG8AcgBhAHQAaQBvAG4AOwAgAEEAYgBkAGEAbABsAGEAIABIAC4AOwAgAEEAaABhAHIAbwBuAGkAYQBuACAARgAuADsAIABBAGkAdAAgAEIAZQBuAGsAaABhAGwAaQAgAEYALgA7ACAAQQBuAGcAdQBlAG4AZQByACAARQAuAE8ALgA7ACAAQQByAGEAawBhAHcAYQAgAE0ALgA7ACAAQQByAGMAYQByAG8AIABDAC4AOwAgAEEAcgBtAGEAbgBkACAAQwAuADsAIABBAHIAcgBpAGUAdABhACAATQAuADsAIABCAGEAYwBrAGUAcwAgAE0ALgA7ACAAQgBhAHIAbgBhAHIAZAAgAE0ALgA7ACAAQgBlAGMAaABlAHIAaQBuAGkAIABZAC4AOwAgAEIAZQBjAGsAZQByACAAVABqAHUAcwAgAEoALgA7ACAAQgBlAHIAZwBlACAARAAuADsAIABCAGUAcgBuAGwAbwBlAGgAcgAgAEsALgA7ACAAQgBsAGEAYwBrAHcAZQBsAGwAIABSAC4AOwAgAEIAbwBlAHQAdABjAGgAZQByACAATQAuADsAIABCAG8AaQBzAHMAbwBuACAAQwAuADsAIABCAG8AbABtAG8AbgB0ACAASgAuADsAIABCAG8AbgBuAGUAZgBvAHkAIABTAC4AOwAgAEIAbwByAGQAYQBzACAAUAAuADsAIABCAHIAZQBnAGUAbwBuACAASgAuADsAIABCAHIAdQBuACAARgAuADsAIABCAHIAdQBuACAAUAAuADsAIABCAHIAeQBhAG4AIABNAC4AOwAgAEIAdQBlAGMAaABlAGwAZQAgAE0ALgA7ACAAQgB1AGwAaQBrACAAVAAuADsAIABCAHkAbAB1AG4AZAAgAFQALgA7ACAAQwBhAHAAYQBzAHMAbwAgAE0ALgA7ACAAQwBhAHIAbwBmAGYAIABTAC4AOwAgAEMAYQByAG8AcwBpACAAQQAuADsAIABDAGEAcwBhAG4AbwB2AGEAIABTAC4AOwAgAEMAZQByAHIAdQB0AGkAIABNAC4AOwAgAEMAaABhAGsAcgBhAGIAbwByAHQAeQAgAE4ALgA7ACAAQwBoAGEAbgBkACAAVAAuADsAIABDAGgAYQBuAGQAcgBhACAAUwAuADsAIABDAGgAYQB2AGUAcwAgAFIALgBDAC4ARwAuADsAIABDAGgAZQBuACAAQQAuADsAIABDAG8AbABhAGYAcgBhAG4AYwBlAHMAYwBvACAAUwAuADsAIABDAG8AbgBkAG8AbgAgAEIALgA7ACAARABhAHYAaQBkAHMAIABJAC4ARAAuADsAIABEAGUAaQBsACAAQwAuADsAIABEAGUAdgBpAG4AIABKAC4AOwAgAGQAZQBXAGkAbAB0ACAAUAAuADsAIABEAGkAcgBzAG8AbgAgAEwALgA7ACAARABqAGEAbgBuAGEAdABpAC0AQQB0AGEAaQAgAEEALgA7ACAARABtAHkAdAByAGkAaQBlAHYAIABBAC4AOwAgAEQAbwBuAGEAdABoACAAQQAuADsAIABEAG8AcgBvAHMAaABlAG4AawBvACAAVgAuADsAIABEAHIAdQByAHkAIABMAC4ATwAnAEMALgA7ACAARAB5AGsAcwAgAEoALgA7ACAARQBnAGIAZQByAHQAcwAgAEsALgA7ACAARQBtAGUAcgB5ACAARwAuADsAIABFAHIAbgBlAG4AdwBlAGkAbgAgAEoALgAtAFAALgA7ACAARQBzAGMAaABiAGEAYwBoACAAUwAuADsAIABGAGUAZwBhAG4AIABTAC4AOwAgAEYAaQBhAHMAcwBvAG4AIABBAC4AOwAgAEYAbwBuAHQAYQBpAG4AZQAgAEcALgA7ACAARgB1AG4AawAgAFMALgA7ACAARgB1AGUAcwBzAGwAaQBuAGcAIABNAC4AOwAgAEcAYQBiAGkAYwBpACAAUwAuADsAIABHAGEAbABsAGEAbgB0ACAAWQAuAEEALgA7ACAARwBhAHQAZQAgAEYALgA7ACAARwBpAGEAdgBpAHQAdABvACAARwAuADsAIABHAGwAYQB3AGkAbwBuACAARAAuADsAIABHAGwAaQBjAGUAbgBzAHQAZQBpAG4AIABKAC4ARgAuADsAIABHAG8AdAB0AHMAYwBoAGEAbABsACAARAAuADsAIABHAHIAbwBuAGQAaQBuACAATQAuAC0ASAAuADsAIABIAGEAaABuACAASgAuADsAIABIAGEAdQBwAHQAIABNAC4AOwAgAEgAZQBpAG4AegBlAGwAbQBhAG4AbgAgAEcALgA7ACAASABlAG4AcgBpACAARwAuADsAIABIAGUAcgBtAGEAbgBuACAARwAuADsAIABIAGkAbgB0AG8AbgAgAEoALgBBAC4AOwAgAEgAbwBmAG0AYQBuAG4AIABXAC4AOwAgAEgAbwBpAHMAYwBoAGUAbgAgAEMALgA7ACAASABvAGwAYwBoACAAVAAuAEwALgA7ACAASABvAGwAbABlAHIAIABNAC4AOwAgAEgAbwByAG4AcwAgAEQALgA7ACAASAB1AGIAZQByACAARAAuADsAIABJAHcAYQBzAGEAawBpACAASAAuADsAIABKAGEAYwBoAG8AbABrAG8AdwBzAGsAYQAgAEEALgA7ACAASgBhAG0AcgBvAHoAeQAgAE0ALgA7ACAASgBhAG4AawBvAHcAcwBrAHkAIABEAC4AOwAgAEoAYQBuAGsAbwB3AHMAawB5ACAARgAuADsAIABKAG8AdQB2AGkAbgAgAEwALgA7ACAASgB1AG4AZwAtAFIAaQBjAGgAYQByAGQAdAAgAEkALgA7ACAASwBhAHMAdABlAG4AZABpAGUAYwBrACAATQAuAEEALgA7ACAASwBhAHQAYQByAHoAeQBuAHMAawBpACAASwAuADsAIABLAGEAdABzAHUAcgBhAGcAYQB3AGEAIABNAC4AOwAgAEsAYQB0AHoAIABVAC4AOwAgAEsAZQByAHMAegBiAGUAcgBnACAARAAuADsAIABLAGgAYQBuAGcAdQBsAHkAYQBuACAARAAuADsAIABLAGgAZQBsAGkAZgBpACAAQgAuADsAIABLAGkAbgBnACAASgAuADsAIABLAGwAZQBwAHMAZQByACAAUwAuADsAIABLAGwAdQB6AG4AaQBhAGsAIABXAC4AOwAgAEsAbwBtAGkAbgAgAE4AdQAuADsAIABLAG8AcwBhAGMAawAgAEsALgA7ACAASwByAGEAdQBzACAATQAuADsAIABMAGEAbQBhAG4AbgBhACAARwAuADsAIABMAGEAdQAgAEoALgA7ACAATABlAGYAYQB1AGMAaABlAHUAcgAgAEoALgA7ACAATABlAG0AaQBlAHIAZQAgAEEALgA7ACAATABlAG0AbwBpAG4AZQAtAEcAbwB1AG0AYQByAGQAIABNAC4AOwAgAEwAZQBuAGEAaQBuACAASgAuAC0AUAAuADsAIABMAGUAcwBlAHIAIABFAC4AOwAgAEwAbwBoAHMAZQAgAFQALgA7ACAATABvAHAAZQB6AC0AQwBvAHQAbwAgAFIALgA7ACAATAB5AHAAbwB2AGEAIABJAC4AOwAgAE0AYQBsAHkAcwBoAGUAdgAgAEQALgA7ACAATQBhAHIAYQBuAGQAbwBuACAAVgAuADsAIABNAGEAcgBjAG8AdwBpAHQAaAAgAEEALgA7ACAATQBhAHIAaQBhAHUAZAAgAEMALgA7ACAATQBhAHIAdABpAC0ARABlAHYAZQBzAGEAIABHAC4AOwAgAE0AYQByAHgAIABSAC4AOwAgAE0AYQB1AHIAaQBuACAARwAuADsAIABNAGUAaQBuAHQAagBlAHMAIABQAC4ASgAuADsAIABNAGkAdABjAGgAZQBsAGwAIABBAC4ATQAuAFcALgA7ACAATQBvAGQAZQByAHMAawBpACAAUgAuADsAIABNAG8AaABhAG0AZQBkACAATQAuADsAIABNAG8AaAByAG0AYQBuAG4AIABMAC4AOwAgAE0AbwBvAHIAZQAgAEMALgA7ACAATQBvAHUAbABpAG4AIABFAC4AOwAgAE0AdQByAGEAYwBoACAAVAAuADsAIABOAGEAawBhAHMAaABpAG0AYQAgAFMALgA7ACAAZABlACAATgBhAHUAcgBvAGkAcwAgAE0ALgA7ACAATgBkAGkAeQBhAHYAYQBsAGEAIABIAC4AOwAgAE4AaQBlAGQAZQByAHcAYQBuAGcAZQByACAARgAuADsAIABOAGkAZQBtAGkAZQBjACAASgAuADsAIABPAGEAawBlAHMAIABMAC4AOwAgAE8AJwBCAHIAaQBlAG4AIABQAC4AOwAgAE8AZABhAGsAYQAgAEgALgA7ACAATwBoAG0AIABTAC4AOwAgAE8AcwB0AHIAbwB3AHMAawBpACAATQAuADsAIABPAHkAYQAgAEkALgA7ACAAUABhAG4AdABlAHIAIABNAC4AOwAgAFAAYQByAHMAbwBuAHMAIABSAC4ARAAuADsAIABQAGUAcgBlAG4AbgBlAHMAIABDAC4AOwAgAFAAZQB0AHIAdQBjAGMAaQAgAFAALgAtAE8ALgA7ACAAUABlAHkAYQB1AGQAIABCAC4AOwAgAFAAaQBlAGwAIABRAC4AOwAgAFAAaQB0AGEAIABTAC4AOwAgAFAAbwBpAHIAZQBhAHUAIABWAC4AOwAgAFAAcgBpAHkAYQBuAGEAIABOAG8AZQBsACAAQQAuADsAIABQAHIAbwBrAGgAbwByAG8AdgAgAEQALgBBAC4AOwAgAFAAcgBvAGsAbwBwAGgAIABIAC4AOwAgAFAAdQBlAGgAbABoAG8AZgBlAHIAIABHAC4AOwAgAFAAdQBuAGMAaAAgAE0ALgA7ACAAUQB1AGkAcgByAGUAbgBiAGEAYwBoACAAQQAuADsAIABSAGEAYQBiACAAUwAuADsAIABSAGEAdQB0AGgAIABSAC4AOwAgAFIAZQBpAG0AZQByACAAQQAuADsAIABSAGUAaQBtAGUAcgAgAE8ALgA7ACAAUgBlAG4AYQB1AGQAIABNAC4AOwAgAFIAaQBlAGcAZQByACAARgAuADsAIABSAGkAbgBjAGgAaQB1AHMAbwAgAEwALgA7ACAAUgBvAG0AbwBsAGkAIABDAC4AOwAgAFIAbwB3AGUAbABsACAARwAuADsAIABSAHUAZABhAGsAIABCAC4AOwAgAFIAdQBpAHoALQBWAGUAbABhAHMAYwBvACAARQAuADsAIABTAGEAaABhAGsAaQBhAG4AIABWAC4AOwAgAFMAYQBpAHQAbwAgAFMALgA7ACAAUwBhAG4AYwBoAGUAegAgAEQALgBBAC4AOwAgAFMAYQBuAHQAYQBuAGcAZQBsAG8AIABBAC4AOwAgAFMAYQBzAGEAawBpACAATQAuADsAIABTAGMAaABsAGkAYwBrAGUAaQBzAGUAcgAgAFIALgA7ACAAUwBjAGgAdQBlAHMAcwBsAGUAcgAgAEYALgA7ACAAUwBjAGgAdQBsAHoAIABBAC4AOwAgAFMAYwBoAHUAdAB0AGUAIABIAC4AOwAgAFMAYwBoAHcAYQBuAGsAZQAgAFUALgA7ACAAUwBjAGgAdwBlAG0AbQBlAHIAIABTAC4AOwAgAFMAZQBnAGwAYQByAC0AQQByAHIAbwB5AG8AIABNAC4AOwAgAFMAZQBuAG4AaQBhAHAAcABhAG4AIABNAC4AOwAgAFMAZQB5AGYAZgBlAHIAdAAgAEEALgBTAC4AOwAgAFMAaABhAGYAaQAgAE4ALgA7ACAAUwBoAGkAbABvAG4AIABJAC4AOwAgAFMAaABpAG4AaQBuAGcAYQB5AGEAbQB3AGUAIABLAC4AOwAgAFMAaQBtAG8AbgBpACAAUgAuADsAIABTAGkAbgBoAGEAIABBAC4AOwAgAFMAbwBsACAASAAuADsAIABTAHAAZQBjAG8AdgBpAHUAcwAgAEEALgA7ACAAUwBwAGkAcgAtAEoAYQBjAG8AYgAgAE0ALgA7ACAAUwB0AGEAdwBhAHIAegAgAEwALgA7ACAAUwB0AGUAZQBuAGsAYQBtAHAAIABSAC4AOwAgAFMAdABlAGcAbQBhAG4AbgAgAEMALgA7ACAAUwB0AGUAcABwAGEAIABDAC4AOwAgAFQAYQBrAGEAaABhAHMAaABpACAAVAAuADsAIABUAGEAdgBlAHIAbgBlAHQAIABKAC4ALQBQAC4AOwAgAFQAYQB2AGUAcgBuAGkAZQByACAAVAAuADsAIABUAGEAeQBsAG8AcgAgAEEALgBNAC4AOwAgAFQAZQByAHIAaQBlAHIAIABSAC4AOwAgAFQAaQBiAGEAbABkAG8AIABMAC4AOwAgAFQAaQB6AGkAYQBuAGkAIABEAC4AOwAgAFQAbAB1AGMAegB5AGsAbwBuAHQAIABNAC4AOwAgAFQAcgBpAGMAaABhAHIAZAAgAEMALgA7ACAAVABzAGkAcgBvAHUAIABNAC4AOwAgAFQAcwB1AGoAaQAgAE4ALgA7ACAAVAB1AGYAZgBzACAAUgAuADsAIABVAGMAaABpAHkAYQBtAGEAIABZAC4AOwAgAHYAYQBuACAAZABlAHIAIABXAGEAbAB0ACAARAAuAEoALgA7ACAAdgBhAG4AIABFAGwAZABpAGsAIABDAC4AOwAgAHYAYQBuACAAUgBlAG4AcwBiAHUAcgBnACAAQwAuADsAIAB2AGEAbgAgAFMAbwBlAGwAZQBuACAAQgAuADsAIABWAGEAcwBpAGwAZQBpAGEAZABpAHMAIABHAC4AOwAgAFYAZQBoACAASgAuADsAIABWAGUAbgB0AGUAcgAgAEMALgA7ACAAVgBpAG4AYwBlAG4AdAAgAFAALgA7ACAAVgBpAG4AawAgAEoALgA7ACAAVgBvAGkAcwBpAG4AIABGAC4AOwAgAFYAbwBlAGwAawAgAEgALgBKAC4AOwAgAFYAdQBpAGwAbABhAHUAbQBlACAAVAAuADsAIABXAGEAZABpAGEAcwBpAG4AZwBoACAAWgAuADsAIABXAGEAZwBuAGUAcgAgAFMALgBKAC4AOwAgAFcAYQBnAG4AZQByACAAUgAuAE0ALgA7ACAAVwBoAGkAdABlACAAUgAuADsAIABXAGkAZQByAHoAYwBoAG8AbABzAGsAYQAgAEEALgA7ACAAWQBhAG4AZwAgAFIALgA7ACAAWQBvAG4AZQBkAGEAIABIAC4AOwAgAFoAYQBiAG8AcgBvAHYAIABEAC4AOwAgAFoAYQBjAGgAYQByAGkAYQBzACAATQAuADsAIABaAGEAbgBpAG4AIABSAC4AOwAgAFoAZAB6AGkAYQByAHMAawBpACAAQQAuAEEALgA7ACAAWgBlAGMAaAAgAEEALgA7ACAAWgBlAGYAaQAgAEYALgA7ACAAWgBpAGUAZwBsAGUAcgAgAEEALgA7ACAAWgBvAHIAbgAgAEoALgA7ACAAWgB5AHcAdQBjAGsAYQAgAE4ALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAxADkAQQAmAEEALgAuAC4ANgAyADEAQQAuADEAMQA2AEh/wAAAAAAAD3JhZGlvI2dhbW1hLXJheQAAAWlodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYyMS9BMTE2L2JveGZpdHM/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0ErQS82MjEvQTExNjo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9BK0EvNjIxL0ExMTY6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovQStBLzYyMS9BMTE2L2xpc3Q/AAAAkGl2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaAAAAHl2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwAAAARXN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZAAAAB9pdm86Ly9jZHMudml6aWVyL2ovYSthLzYyNi9hMTA0AAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAADkovQStBLzYyNi9BMTA0AAAAGQBMAE8AVABBAEEAUwAgAHAAdQBsAHMAYQByACAAZABpAHMAYwBvAHYAZQByAGkAZQBzAAAACHJlc2VhcmNoAAAG1wBXAGUAIABwAHIAZQBzAGUAbgB0ACAAYQBuACAAbwB2AGUAcgB2AGkAZQB3ACAAbwBmACAAdABoAGUAIABMAE8ARgBBAFIAIABUAGkAZQBkAC0AQQByAHIAYQB5ACAAQQBsAGwALQBTAGsAeQAgAFMAdQByAHYAZQB5ACAAKABMAE8AVABBAEEAUwApACAAZgBvAHIAIAByAGEAZABpAG8AIABwAHUAbABzAGEAcgBzACAAYQBuAGQAIABmAGEAcwB0ACAAdAByAGEAbgBzAGkAZQBuAHQAcwAuACAAVABoAGUAIABzAHUAcgB2AGUAeQAgAHUAcwBlAHMAIAB0AGgAZQAgAGgAaQBnAGgALQBiAGEAbgBkACAAYQBuAHQAZQBuAG4AYQBzACAAbwBmACAAdABoAGUAIABMAE8ARgBBAFIAIABTAHUAcABlAHIAdABlAHIAcAAsACAAdABoAGUAIABkAGUAbgBzAGUAIABpAG4AbgBlAHIAIABwAGEAcgB0ACAAbwBmACAAdABoAGUAIABMAE8ARgBBAFIAIABjAG8AcgBlACwAIAB0AG8AIABzAHUAcgB2AGUAeQAgAHQAaABlACAAbgBvAHIAdABoAGUAcgBuACAAcwBrAHkAIAAoAHsAZABlAGwAdABhAH0APgAwAHsAZABlAGcAfQApACAAYQB0ACAAYQAgAGMAZQBuAHQAcgBhAGwAIABvAGIAcwBlAHIAdgBpAG4AZwAgAGYAcgBlAHEAdQBlAG4AYwB5ACAAbwBmACAAMQAzADUATQBIAHoALgAgAEEAIAB0AG8AdABhAGwAIABvAGYAIAAyADEAOQAgAHQAaQBlAGQALQBhAHIAcgBhAHkAIABiAGUAYQBtAHMAIAAoAGMAbwBoAGUAcgBlAG4AdAAgAHMAdQBtAG0AYQB0AGkAbwBuACAAbwBmACAAcwB0AGEAdABpAG8AbgAgAHMAaQBnAG4AYQBsAHMALAAgAGMAbwB2AGUAcgBpAG4AZwAgADEAMgAgAHMAcQB1AGEAcgBlACAAZABlAGcAcgBlAGUAcwApACwAIABhAHMAIAB3AGUAbABsACAAYQBzACAAdABoAHIAZQBlACAAaQBuAGMAbwBoAGUAcgBlAG4AdAAgAGIAZQBhAG0AcwAgACgAYwBvAHYAZQByAGkAbgBnACAANgA3ACAAcwBxAHUAYQByAGUAIABkAGUAZwByAGUAZQBzACkAIABhAHIAZQAgAGYAbwByAG0AZQBkACAAaQBuACAAZQBhAGMAaAAgAHMAdQByAHYAZQB5ACAAcABvAGkAbgB0AGkAbgBnAC4AIABGAG8AcgAgAGUAYQBjAGgAIABvAGYAIAB0AGgAZQAgADIAMgAyACAAYgBlAGEAbQBzACwAIAB0AG8AdABhAGwAIABpAG4AdABlAG4AcwBpAHQAeQAgAGkAcwAgAHIAZQBjAG8AcgBkAGUAZAAgAGEAdAAgADQAOQAxAC4ANQAyACAAewBtAHUAfQBzACAAdABpAG0AZQAgAHIAZQBzAG8AbAB1AHQAaQBvAG4ALgAgAEUAYQBjAGgAIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AIABpAG4AdABlAGcAcgBhAHQAZQBzACAAZgBvAHIAIAAxAGgAcgAgAGEAbgBkACAAYwBvAHYAZQByAHMAIAAyADUAOQAyACAAYwBoAGEAbgBuAGUAbABzACAAZgByAG8AbQAgADEAMQA5ACAAdABvACAAMQA1ADEATQBIAHoALgAgAFQAaABpAHMAIABpAG4AcwB0AHIAdQBtAGUAbgB0AGEAbAAgAHMAZQB0AHUAcAAgAGEAbABsAG8AdwBzACAATABPAFQAQQBBAFMAIAB0AG8AIAByAGUAYQBjAGgAIABhACAAZABlAHQAZQBjAHQAaQBvAG4AIAB0AGgAcgBlAHMAaABvAGwAZAAgAG8AZgAgADEALQA1AG0ASgB5ACAAZgBvAHIAIABwAGUAcgBpAG8AZABpAGMAIABlAG0AaQBzAHMAaQBvAG4ALgAgAFQAaAB1AHMAIABmAGEAcgAsACAAdABoAGUAIABMAE8AVABBAEEAUwAgAHMAdQByAHYAZQB5ACAAaABhAHMAIAByAGUAcwB1AGwAdABlAGQAIABpAG4AIAB0AGgAZQAgAGQAaQBzAGMAbwB2AGUAcgB5ACAAbwBmACAANwAzACAAcgBhAGQAaQBvACAAcAB1AGwAcwBhAHIAcwAuACAAQQBtAG8AbgBnACAAdABoAGUAcwBlACAAYQByAGUAIAB0AHcAbwAgAG0AaQBsAGQAbAB5ACAAcgBlAGMAeQBjAGwAZQBkACAAYgBpAG4AYQByAHkAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACAAKABQAD0AMQAzACAAYQBuAGQAIAAzADMAbQBzACkALAAgAGEAcwAgAHcAZQBsAGwAIABhAHMAIAB0AGgAZQAgAHMAbABvAHcAZQBzAHQALQBzAHAAaQBuAG4AaQBuAGcAIAByAGEAZABpAG8AIABwAHUAbABzAGEAcgAgAGMAdQByAHIAZQBuAHQAbAB5ACAAawBuAG8AdwBuACAAKABQAD0AMgAzAC4ANQBzACkALgAgAFQAaABlACAAcwB1AHIAdgBlAHkAIABoAGEAcwAgAHQAaAB1AHMAIABmAGEAcgAgAGQAZQB0AGUAYwB0AGUAZAAgADMAMQAxACAAawBuAG8AdwBuACAAcAB1AGwAcwBhAHIAcwAsACAAdwBpAHQAaAAgAHMAcABpAG4AIABwAGUAcgBpAG8AZABzACAAcgBhAG4AZwBpAG4AZwAgAGYAcgBvAG0AIAA0AG0AcwAgAHQAbwAgADUALgAwAHMAIABhAG4AZAAgAGQAaQBzAHAAZQByAHMAaQBvAG4AIABtAGUAYQBzAHUAcgBlAHMAIABmAHIAbwBtACAAMwAuADAAIAB0AG8AIAAyADEANwBwAGMALwBjAG0AXgAzAF4ALgAgAEsAbgBvAHcAbgAgAHAAdQBsAHMAYQByAHMAIABhAHIAZQAgAGQAZQB0AGUAYwB0AGUAZAAgAGEAdAAgAGYAbAB1AHgAIABkAGUAbgBzAGkAdABpAGUAcwAgAGMAbwBuAHMAaQBzAHQAZQBuAHQAIAB3AGkAdABoACAAbABpAHQAZQByAGEAdAB1AHIAZQAgAHYAYQBsAHUAZQBzAC4AIABXAGUAIABmAGkAbgBkACAAdABoAGEAdAAgAHQAaABlACAATABPAFQAQQBBAFMAIABwAHUAbABzAGEAcgAgAGQAaQBzAGMAbwB2AGUAcgBpAGUAcwAgAGgAYQB2AGUALAAgAG8AbgAgAGEAdgBlAHIAYQBnAGUALAAgAGwAbwBuAGcAZQByACAAcwBwAGkAbgAgAHAAZQByAGkAbwBkAHMAIAB0AGgAYQBuACAAdABoAGUAIABrAG4AbwB3AG4AIABwAHUAbABzAGEAcgAgAHAAbwBwAHUAbABhAHQAaQBvAG4ALgAgAFQAaABpAHMAIABtAGEAeQAgAHIAZQBmAGwAZQBjAHQAIABkAGkAZgBmAGUAcgBlAG4AdAAgAHMAZQBsAGUAYwB0AGkAbwBuACAAYgBpAGEAcwBlAHMAIABiAGUAdAB3AGUAZQBuACAATABPAFQAQQBBAFMAIABhAG4AZAAgAHAAcgBlAHYAaQBvAHUAcwAgAHMAdQByAHYAZQB5AHMALAAgAHQAaABvAHUAZwBoACAAaQB0ACAAaQBzACAAYQBsAHMAbwAgAHAAbwBzAHMAaQBiAGwAZQAgAHQAaABhAHQAIABzAGwAbwB3AGUAcgAtAHMAcABpAG4AbgBpAG4AZwAgAHAAdQBsAHMAYQByAHMAIABwAHIAZQBmAGUAcgBlAG4AdABpAGEAbABsAHkAIABoAGEAdgBlACAAcwB0AGUAZQBwAGUAcgAgAHIAYQBkAGkAbwAgAHMAcABlAGMAdAByAGEALgAgAEwATwBUAEEAQQBTACAAaQBzACAAdABoAGUAIABkAGUAZQBwAGUAcwB0ACAAYQBsAGwALQBzAGsAeQAgAHAAdQBsAHMAYQByACAAcwB1AHIAdgBlAHkAIAB1AHMAaQBuAGcAIABhACAAZABpAGcAaQB0AGEAbAAgAGEAcABlAHIAdAB1AHIAZQAgAGEAcgByAGEAeQA7ACAAdwBlACAAZABpAHMAYwB1AHMAcwAgAHMAbwBtAGUAIABvAGYAIAB0AGgAZQAgAGwAZQBzAHMAbwBuAHMAIABsAGUAYQByAG4AZQBkACAAdABoAGEAdAAgAGMAYQBuACAAaQBuAGYAbwByAG0AIAB0AGgAZQAgAGEAcABwAHIAbwBhAGMAaAAgAGYAbwByACAAcwBpAG0AaQBsAGEAcgAgAHMAdQByAHYAZQB5AHMAIAB1AHMAaQBuAGcAIABmAHUAdAB1AHIAZQAgAHIAYQBkAGkAbwAgAHQAZQBsAGUAcwBjAG8AcABlAHMAIABzAHUAYwBoACAAYQBzACAAdABoAGUAIABTAHEAdQBhAHIAZQAgAEsAaQBsAG8AbQBlAHQAcgBlACAAQQByAHIAYQB5AC4AAAAzaHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovQStBLzYyNi9BMTA0AAABMgBTAGEAbgBpAGQAYQBzACAAUwAuADsAIABDAG8AbwBwAGUAcgAgAFMALgA7ACAAQgBhAHMAcwBhACAAQwAuAEcALgA7ACAASABlAHMAcwBlAGwAcwAgAEoALgBXAC4AVAAuADsAIABLAG8AbgBkAHIAYQB0AGkAZQB2ACAAVgAuAEkALgA7ACAATQBpAGMAaABpAGwAbABpACAARAAuADsAIABTAHQAYQBwAHAAZQByAHMAIABCAC4AVwAuADsAIABUAGEAbgAgAEMALgBNAC4AOwAgAFYAYQBuACAATABlAGUAdQB3AGUAbgAgAEoALgA7ACAAQwBlAHIAcgBpAGcAbwBuAGUAIABMAC4AOwAgAEYAYQBsAGwAbwB3AHMAIABSAC4AQQAuADsAIABJAGEAYwBvAGIAZQBsAGwAaQAgAE0ALgA7ACAATwByAHIAdQAgAEUALgA7ACAAUABpAHoAegBvACAAUgAuAEYALgA7ACAAUwBoAHUAbABlAHYAcwBrAGkAIABBAC4AOwAgAFQAbwByAGkAYgBpAG8AIABNAC4AQwAuADsAIABUAGUAcgAgAFYAZQBlAG4AIABTAC4AOwAgAFoAdQBjAGMAYQAgAFAALgA7ACAAQgBvAG4AZABvAG4AbgBlAGEAdQAgAEwALgA7ACAARwByAGkAZQBzAHMAbQBlAGkAZQByACAASgAuAC0ATQAuADsAIABLAGEAcgBhAHMAdABlAHIAZwBpAG8AdQAgAEEALgA7ACAASwByAGEAbQBlAHIAIABNAC4AOwAgAFMAbwBiAGUAeQAgAEMALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAxADkAQQAmAEEALgAuAC4ANgAyADYAQQAuADEAMAA0AFN/wAAAAAAABXJhZGlvAAABa2h0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BK0EvNjI2L0ExMDQvdGFibGUyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9BK0EvNjI2L0ExMDQ6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQStBLzYyNi9BMTA0Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0ErQS82MjYvQTEwNC90YWJsZWExPwAAAJBpdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAAB5dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAAEVzdGQ6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAeaXZvOi8vY2RzLnZpemllci9qL2FqLzEzMC8yNjEzAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAADUovQUovMTMwLzI2MTMAAAAnAFQAaABlACAAQQByAGUAYwBpAGIAbwAgAEwAZQBnAGEAYwB5ACAARgBhAHMAdAAgAEEATABGAEEAIABzAHUAcgB2AGUAeQAuACAASQBJAAAACHJlc2VhcmNoAAADjwBJAG4AIABwAHIAZQBwAGEAcgBhAHQAaQBvAG4AIABmAG8AcgAgAHQAaABlACAAZgB1AGwAbAAgAEEAcgBlAGMAaQBiAG8AIABMAGUAZwBhAGMAeQAgAEYAYQBzAHQAIABBAEwARgBBACAAKABBAEwARgBBAEwARgBBACkAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAASABJACAAcwB1AHIAdgBlAHkALAAgAHAAcgBlAGMAdQByAHMAbwByACAAbwBiAHMAZQByAHYAYQB0AGkAbwBuAHMAIAB3AGUAcgBlACAAYwBhAHIAcgBpAGUAZAAgAG8AdQB0ACAAaQBuACAAMgAwADAANAAgAEEAdQBnAHUAcwB0AC0AUwBlAHAAdABlAG0AYgBlAHIAIAB3AGkAdABoACAAdABoAGUAIABzAGUAdgBlAG4ALQBiAGUAYQBtACAAQQByAGUAYwBpAGIAbwAgAEwALQBiAGEAbgBkACAARgBlAGUAZAAgAEEAcgByAGEAeQAgACgAQQBMAEYAQQApACAAcgBlAGMAZQBpAHYAZQByACAAcwB5AHMAdABlAG0AIABhAG4AZAAgAHQAaABlACAAVwBpAGQAZQBiAGEAbgBkACAAQQByAGUAYwBpAGIAbwAgAFAAdQBsAHMAYQByACAAUAByAG8AYwBlAHMAcwBvAHIAIABzAHAAZQBjAHQAcgBhAGwAIABwAHIAbwBjAGUAcwBzAG8AcgBzAC4AIABXAGgAaQBsAGUAIAB0AGgAZQBzAGUAIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAHcAZQByAGUAIABnAGUAYQByAGUAZAAgAG0AYQBpAG4AbAB5ACAAYQB0ACAAdABlAHMAdABpAG4AZwAgAGEAbgBkACAAZABlAGIAdQBnAGcAaQBuAGcAIABzAHUAcgB2AGUAeQAgAHMAdAByAGEAdABlAGcAeQAsACAAaABhAHIAZAB3AGEAcgBlACwAIABhAG4AZAAgAHMAbwBmAHQAdwBhAHIAZQAsACAAYQBwAHAAcgBvAHgAaQBtAGEAdABlAGwAeQAgADQAOABoAHIAIABvAGYAIAB0AGUAbABlAHMAYwBvAHAAZQAgAHQAaQBtAGUAIAB5AGkAZQBsAGQAZQBkACAAcwBjAGkAZQBuAGMAZQAtAHEAdQBhAGwAaQB0AHkAIABkAGEAdABhAC4AIABUAG8AIAB0AGUAcwB0ACAAbwB1AHIAIABhAGIAaQBsAGkAdAB5ACAAdABvACAAZABpAHMAYwByAGkAbQBpAG4AYQB0AGUAIABjAG8AcwBtAGkAYwAgAHMAaQBnAG4AYQBsAHMAIABmAHIAbwBtACAAcgBhAGQAaQBvAC0AZgByAGUAcQB1AGUAbgBjAHkAIABpAG4AdABlAHIAZgBlAHIAZQBuAGMAZQAgAGEAbgBkACAAbgBvAGkAcwBlACwAIAAxADYANQAgAGMAYQBuAGQAaQBkAGEAdABlAHMAIAByAGEAbgBnAGkAbgBnACAAaQBuACAAcgBlAGwAaQBhAGIAaQBsAGkAdAB5ACAAbABpAGsAZQBsAGkAaABvAG8AZAAgAHcAZQByAGUAIAByAGUAbwBiAHMAZQByAHYAZQBkACAAdwBpAHQAaAAgAHQAaABlACAAcwBpAG4AZwBsAGUALQBiAGUAYQBtACAATAAtAGIAYQBuAGQAIAB3AGkAZABlACAAcwB5AHMAdABlAG0AIABhAHQAIABBAHIAZQBjAGkAYgBvACAAaQBuACAAMgAwADAANQAgAEoAYQBuAHUAYQByAHkALQBGAGUAYgByAHUAYQByAHkALgAgAE8AZgAgAHQAaABvAHMAZQAsACAANAAxACUAIAB3AGUAcgBlACAAYwBvAG4AZgBpAHIAbQBlAGQAIABhAHMAIAByAGUAYQBsAC4AIABXAGUAIABwAHIAZQBzAGUAbgB0ACAAdABoAGUAIAByAGUAcwB1AGwAdABzACAAbwBmACAAYgBvAHQAaAAgAHQAaABlACAAQQBMAEYAQQAgAGEAbgBkACAAdABoAGUAIABzAGkAbgBnAGwAZQAtAGIAZQBhAG0AIABvAGIAcwBlAHIAdgBhAHQAaQBvAG4AcwAgAGYAbwByACAAdABoAGUAIABzAGEAbQBwAGwAZQAgAG8AZgAgADEANgA2ACAAYwBvAG4AZgBpAHIAbQBlAGQAIABIAEkAIABzAG8AdQByAGMAZQBzACwAIABhAHMAIAB3AGUAbABsACAAYQBzACAAbwB1AHIAIABhAHMAcwBlAHMAcwBtAGUAbgB0ACAAbwBmACAAdABoAGUAaQByACAAbwBwAHQAaQBjAGEAbAAgAGMAbwB1AG4AdABlAHIAcABhAHIAdABzAC4AAAAyaHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovQUovMTMwLzI2MTMAAAEWAEcAaQBvAHYAYQBuAGUAbABsAGkAIABSAC4AOwAgAEgAYQB5AG4AZQBzACAATQAuAFAALgA7ACAASwBlAG4AdAAgAEIALgBSAC4AOwAgAFAAZQByAGkAbABsAGEAdAAgAFAALgA7ACAAQwBhAHQAaQBuAGUAbABsAGEAIABCAC4AOwAgAEgAbwBmAGYAbQBhAG4AIABHAC4ATAAuADsAIABNAG8AbQBqAGkAYQBuACAARQAuADsAIABSAG8AcwBlAG4AYgBlAHIAZwAgAEoALgBMAC4AOwAgAFMAYQBpAG4AdABvAG4AZwBlACAAQQAuADsAIABTAHAAZQBrAGsAZQBuAHMAIABLAC4AOwAgAFMAdABpAGUAcgB3AGEAbAB0ACAAUwAuADsAIABCAHIAbwBzAGMAaAAgAE4ALgA7ACAATQBhAHMAdABlAHIAcwAgAEsALgBMAC4AOwAgAFMAcAByAGkAbgBnAG8AYgAgAEMALgBNAC4AOwAgAEsAYQByAGEAYwBoAGUAbgB0AHMAZQB2ACAASQAuAEQALgA7ACAASwBhAHIAYQBjAGgAZQBuAHQAcwBlAHYAYQAgAFYALgBFAC4AOwAgAEsAbwBvAHAAbQBhAG4AbgAgAFIALgBBAC4AOwAgAE0AdQBsAGwAZQByACAARQAuADsAIAB2AGEAbgAgAEQAcgBpAGUAbAAgAFcALgA7ACAAdgBhAG4AIABaAGUAZQAgAEwALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAwADUAQQBKAC4ALgAuAC4AMQAzADAALgAyADYAMQAzAEd/wAAAAAAABXJhZGlvAAAC12h0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9BSi8xMzAvMjYxMzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0FKLzEzMC8yNjEzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BSi8xMzAvMjYxMy9kYXRhPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9BSi8xMzAvMjYxMy90YWJsZTM/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL0FKLzEzMC8yNjEzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovQUovMTMwLzI2MTM6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FKLzEzMC8yNjEzL2RhdGE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FKLzEzMC8yNjEzL3RhYmxlMz8AAAEvOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoAAABAXZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1o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TABNACAAcwB1AHIAdgBlAHkALgAgAFYALgAgAFcAaABpAHQAZQAgAGQAdwBhAHIAZgAgAGIAaQBuAGEAcgBpAGUAcwAAAAhyZXNlYXJjaAAAA4wAVwBlACAAcAByAGUAcwBlAG4AdAAgAHQAaABlACAAZABpAHMAYwBvAHYAZQByAHkAIABvAGYAIAAxADcAIABsAG8AdwAtAG0AYQBzAHMAIAB3AGgAaQB0AGUAIABkAHcAYQByAGYAcwAgACgAVwBEAHMAKQAgAGkAbgAgAHMAaABvAHIAdAAtAHAAZQByAGkAbwBkACAAKABQADwAPQAxACAAZABhAHkAKQAgAGIAaQBuAGEAcgBpAGUAcwAuACAATwB1AHIAIABzAGEAbQBwAGwAZQAgAGkAbgBjAGwAdQBkAGUAcwAgAGYAbwB1AHIAIABvAGIAagBlAGMAdABzACAAdwBpAHQAaAAgAHIAZQBtAGEAcgBrAGEAYgBsAGUAIABsAG8AZwBnAD0AfgA1ACAAcwB1AHIAZgBhAGMAZQAgAGcAcgBhAHYAaQB0AGkAZQBzACAAYQBuAGQAIABvAHIAYgBpAHQAYQBsACAAcwBvAGwAdQB0AGkAbwBuAHMAIAB0AGgAYQB0ACAAcgBlAHEAdQBpAHIAZQAgAHQAaABlAG0AIAB0AG8AIABiAGUAIABkAG8AdQBiAGwAZQAgAGQAZQBnAGUAbgBlAHIAYQB0AGUAIABiAGkAbgBhAHIAaQBlAHMALgAgAEEAbABsACAAbwBmACAAdABoAGUAIABsAG8AdwBlAHMAdAAgAHMAdQByAGYAYQBjAGUAIABnAHIAYQB2AGkAdAB5ACAAVwBEAHMAIABoAGEAdgBlACAAbQBlAHQAYQBsACAAbABpAG4AZQBzACAAaQBuACAAdABoAGUAaQByACAAcwBwAGUAYwB0AHIAYQAgAGkAbQBwAGwAeQBpAG4AZwAgAGwAbwBuAGcAIABnAHIAYQB2AGkAdABhAHQAaQBvAG4AYQBsACAAcwBlAHQAdABsAGkAbgBnACAAdABpAG0AZQBzACAAbwByACAAbwBuAGcAbwBpAG4AZwAgAGEAYwBjAHIAZQB0AGkAbwBuAC4AIABOAG8AdABhAGIAbAB5ACwAIABzAGkAeAAgAG8AZgAgAHQAaABlACAAVwBEAHMAIABpAG4AIABvAHUAcgAgAHMAYQBtAHAAbABlACAAaABhAHYAZQAgAGIAaQBuAGEAcgB5ACAAbQBlAHIAZwBlAHIAIAB0AGkAbQBlAHMAIAA8ADEAMABHAHkAcgAuACAARgBvAHUAcgAgAGgAYQB2AGUAIAA+AH4AMAAuADkATQBfAHsAcwB1AG4AfQBfACAAYwBvAG0AcABhAG4AaQBvAG4AcwAuACAASQBmACAAdABoAGUAIABjAG8AbQBwAGEAbgBpAG8AbgBzACAAYQByAGUAIABtAGEAcwBzAGkAdgBlACAAVwBEAHMALAAgAHQAaABlAHMAZQAgAGYAbwB1AHIAIABiAGkAbgBhAHIAaQBlAHMAIAB3AGkAbABsACAAZQB2AG8AbAB2AGUAIABpAG4AdABvACAAcwB0AGEAYgBsAGUAIABtAGEAcwBzACAAdAByAGEAbgBzAGYAZQByACAAQQBNACAAQwBWAG4AIABzAHkAcwB0AGUAbQBzACAAYQBuAGQAIABwAG8AcwBzAGkAYgBsAHkAIABlAHgAcABsAG8AZABlACAAYQBzACAAdQBuAGQAZQByAGwAdQBtAGkAbgBvAHUAcwAgAHMAdQBwAGUAcgBuAG8AdgBhAGUALgAgAEkAZgAgAHQAaABlACAAYwBvAG0AcABhAG4AaQBvAG4AcwAgAGEAcgBlACAAbgBlAHUAdAByAG8AbgAgAHMAdABhAHIAcwAsACAAdABoAGUAbgAgAHQAaABlAHMAZQAgAG0AYQB5ACAAYgBlACAAbQBpAGwAbABpAHMAZQBjAG8AbgBkACAAcAB1AGwAcwBhAHIAIABiAGkAbgBhAHIAaQBlAHMALgAgAFQAaABlAHMAZQAgAGQAaQBzAGMAbwB2AGUAcgBpAGUAcwAgAGkAbgBjAHIAZQBhAHMAZQAgAHQAaABlACAAbgB1AG0AYgBlAHIAIABvAGYAIABkAGUAdABhAGMAaABlAGQALAAgAGQAbwB1AGIAbABlACAAZABlAGcAZQBuAGUAcgBhAHQAZQAgAGIAaQBuAGEAcgBpAGUAcwAgAGkAbgAgAHQAaABlACAARQB4AHQAcgBlAG0AZQBsAHkAIABsAG8AdwAgAG0AYQBzAHMAIAAoAEUATABNACkAIABTAHUAcgB2AGUAeQAgAHQAbwAgADUANAA7ACAAMwAxACAAbwBmACAAdABoAGUAcwBlACAAYgBpAG4AYQByAGkAZQBzACAAdwBpAGwAbAAgAG0AZQByAGcAZQAgAHcAaQB0AGgAaQBuACAAYQAgAEgAdQBiAGIAbABlACAAdABpAG0AZQAuAAAAMWh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL0FwSi83NjkvNjYAAABCAEIAcgBvAHcAbgAgAFcALgBSAC4AOwAgAEsAaQBsAGkAYwAgAE0ALgA7ACAAQQBsAGwAZQBuAGQAZQAgAFAAcgBpAGUAdABvACAAQwAuADsAIABHAGkAYQBuAG4AaQBuAGEAcwAgAEEALgA7ACAASwBlAG4AeQBvAG4AIABTAC4ASgAuAAAAB2NhdGFsb2cAAAAHYmliY29kZQAAABMAMgAwADEAMwBBAHAASgAuAC4ALgA3ADYAOQAuAC4ALgA2ADYAQn/AAAAAAAAHb3B0aWNhbAAAARJodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQXBKLzc2OS82Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9BcEovNzY5LzY2Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FwSi83NjkvNjYvd2RiaW4/AAAAZDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAABednI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADM6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAeaXZvOi8vY2RzLnZpemllci9qL2Fwai84NjEvMTEzAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAADUovQXBKLzg2MS8xMTMAAAAsAFYATABCAEEAIABhAHMAdAByAG8AbQBlAHQAcgB5ACAAYwBvAG0AYgBpAG4AZQBkACAAdwBpAHQAaAAgAEcAYQBpAGEAIABEAFIAMQAgAGUAcABvAGMAaAAAAAhyZXNlYXJjaAAABXUAVABoAGUAIABjAGEAbgBvAG4AaQBjAGEAbAAgAG0AZQB0AGgAbwBkAHMAIABmAG8AcgAgAGcAcgBhAHYAaQB0AGEAdABpAG8AbgBhAGwAIAB3AGEAdgBlACAAZABlAHQAZQBjAHQAaQBvAG4AIABhAHIAZQAgAGcAcgBvAHUAbgBkAC0AIABhAG4AZAAgAHMAcABhAGMAZQAtACAAYgBhAHMAZQBkACAAbABhAHMAZQByACAAaQBuAHQAZQByAGYAZQByAG8AbQBlAHQAcgB5ACwAIABwAHUAbABzAGEAcgAgAHQAaQBtAGkAbgBnACwAIABhAG4AZAAgAHAAbwBsAGEAcgBpAHoAYQB0AGkAbwBuACAAbwBmACAAdABoAGUAIABjAG8AcwBtAGkAYwAgAG0AaQBjAHIAbwB3AGEAdgBlACAAYgBhAGMAawBnAHIAbwB1AG4AZAAuACAAQgB1AHQAIABhAHMAIABoAGEAcwAgAGIAZQBlAG4AIABzAHUAZwBnAGUAcwB0AGUAZAAgAGIAeQAgAG4AdQBtAGUAcgBvAHUAcwAgAGkAbgB2AGUAcwB0AGkAZwBhAHQAbwByAHMALAAgAGEAcwB0AHIAbwBtAGUAdAByAHkAIABvAGYAZgBlAHIAcwAgAGEAbgAgAGEAZABkAGkAdABpAG8AbgBhAGwAIABwAGEAdABoACAAdABvACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAIABkAGUAdABlAGMAdABpAG8AbgAuACAARwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAcwAgAGQAZQBmAGwAZQBjAHQAIABsAGkAZwBoAHQAIAByAGEAeQBzACAAbwBmACAAZQB4AHQAcgBhAGcAYQBsAGEAYwB0AGkAYwAgAG8AYgBqAGUAYwB0AHMALAAgAGMAcgBlAGEAdABpAG4AZwAgAGEAcABwAGEAcgBlAG4AdAAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAgAGkAbgAgAGEAIABxAHUAYQBkAHIAdQBwAG8AbABhAHIAIAAoAGEAbgBkACAAaABpAGcAaABlAHIALQBvAHIAZABlAHIAIABtAG8AZABlAHMAKQAgAHAAYQB0AHQAZQByAG4ALgAgAEEAcwB0AHIAbwBtAGUAdAByAHkAIABvAGYAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAcgBhAGQAaQBvACAAcwBvAHUAcgBjAGUAcwAgAGkAcwAgAHMAZQBuAHMAaQB0AGkAdgBlACAAdABvACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAcwAgAHcAaQB0AGgAIABmAHIAZQBxAHUAZQBuAGMAaQBlAHMAIABiAGUAdAB3AGUAZQBuACAAcgBvAHUAZwBoAGwAeQAgADEAMABeAC0AMQA4AF4AIABhAG4AZAAgADEAMABeAC0AOABeAEgAegAgACgASABfADAAXwAgAGEAbgBkACAAMQAvADMAeQByAF4ALQAxAF4AKQAsACAAbwB2AGUAcgBsAGEAcABwAGkAbgBnACAAYQBuAGQAIABiAHIAaQBkAGcAaQBuAGcAIAB0AGgAZQAgAHAAdQBsAHMAYQByACAAdABpAG0AaQBuAGcAIABhAG4AZAAgAEMATQBCACAAcABvAGwAYQByAGkAegBhAHQAaQBvAG4AIAByAGUAZwBpAG0AZQBzAC4AIABXAGUAIABwAHIAZQBzAGUAbgB0ACAAYQAgAG0AZQB0AGgAbwBkAG8AbABvAGcAeQAgAGYAbwByACAAYQBzAHQAcgBvAG0AZQB0AHIAaQBjACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAIABkAGUAdABlAGMAdABpAG8AbgAgAGkAbgAgAHQAaABlACAAcAByAGUAcwBlAG4AYwBlACAAbwBmACAAbABhAHIAZwBlACAAaQBuAHQAcgBpAG4AcwBpAGMAIAB1AG4AYwBvAHIAcgBlAGwAYQB0AGUAZAAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAgACgAaQAuAGUALgAsACAAcgBhAGQAaQBvACAAagBlAHQAcwApAC4AIABXAGUAIABvAGIAdABhAGkAbgAgADkANQAlACAAYwBvAG4AZgBpAGQAZQBuAGMAZQAgAGwAaQBtAGkAdABzACAAbwBuACAAdABoAGUAIABzAHQAbwBjAGgAYQBzAHQAaQBjACAAZwByAGEAdgBpAHQAYQB0AGkAbwBuAGEAbAAgAHcAYQB2AGUAIABiAGEAYwBrAGcAcgBvAHUAbgBkACAAdQBzAGkAbgBnACAANwAxADEAIAByAGEAZABpAG8AIABzAG8AdQByAGMAZQBzACwAIAB7AE8AbQBlAGcAYQB9AF8ARwBXAF8APAAwAC4AMAAwADYANAAsACAAYQBuAGQAIAB1AHMAaQBuAGcAIAA1ADAAOAAgAHIAYQBkAGkAbwAgAHMAbwB1AHIAYwBlAHMAIABjAG8AbQBiAGkAbgBlAGQAIAB3AGkAdABoACAAdABoAGUAIABmAGkAcgBzAHQAIABHAGEAaQBhACAAZABhAHQAYQAgAHIAZQBsAGUAYQBzAGUAOgAgAHsATwBtAGUAZwBhAH0AXwBHAFcAXwA8ADAALgAwADEAMQAuACAAVABoAGUAcwBlACAAbABpAG0AaQB0AHMAIABwAHIAbwBiAGUAIABnAHIAYQB2AGkAdABhAHQAaQBvAG4AYQBsACAAdwBhAHYAZQAgAGYAcgBlAHEAdQBlAG4AYwBpAGUAcwAgADYAeAAxADAAXgAtADEAOABeAEgAegA8AH4AZgA8AH4AMQB4ADEAMABeAC0AOQBeAEgAegAuACAAVQBzAGkAbgBnACAAYQAgAFcASQBTAEUALQBHAGEAaQBhACAAYwBhAHQAYQBsAG8AZwAgAG8AZgAgADUANgA3ADcAMgAxACAAQQBHAE4ALAAgAHcAZQAgAHAAcgBlAGQAaQBjAHQAIABhACAAbABpAG0AaQB0ACAAZQB4AHAAZQBjAHQAZQBkACAAZgByAG8AbQAgAEcAYQBpAGEAIABhAGwAbwBuAGUAIABvAGYAIAB7AE8AbQBlAGcAYQB9AF8ARwBXAF8APAAwAC4AMAAwADAANgAsACAAdwBoAGkAYwBoACAAaQBzACAAcwBpAGcAbgBpAGYAaQBjAGEAbgB0AGwAeQAgAGgAaQBnAGgAZQByACAAdABoAGEAbgAgAHcAYQBzACAAbwByAGkAZwBpAG4AYQBsAGwAeQAgAGYAbwByAGUAYwBhAHMAdAAuACAASQBuAGMAaQBkAGUAbgB0AGEAbABsAHkALAAgAHcAZQAgAGQAZQB0AGUAYwB0ACAAYQBuAGQAIAByAGUAcABvAHIAdAAgAG8AbgAgADIAMgAgAG4AZQB3ACAAZQB4AGEAbQBwAGwAZQBzACAAbwBmACAAbwBwAHQAaQBjAGEAbAAgAHMAdQBwAGUAcgBsAHUAbQBpAG4AYQBsACAAbQBvAHQAaQBvAG4AIAB3AGkAdABoACAAcgBlAGQAcwBoAGkAZgB0AHMAIAAwAC4AMQAzAC0AMwAuADgAOQAuAAAAMmh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL0FwSi84NjEvMTEzAAAAJgBEAGEAcgBsAGkAbgBnACAASgAuADsAIABUAHIAdQBlAGIAZQBuAGIAYQBjAGgAIABBAC4ARQAuADsAIABQAGEAaQBuAGUAIABKAC4AAAAHY2F0YWxvZwAAAAdiaWJjb2RlAAAAEwAyADAAMQA4AEEAcABKAC4ALgAuADgANgAxAC4ALgAxADEAMwBEf8AAAAAAAA1vcHRpY2FsI3JhZGlvAAABFmh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL0FwSi84NjEvMTEzOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL0FwSi84NjEvMTEzL3RhYmxlNz86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovQXBKLzg2MS8xMTM6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwAAAAZDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXgAAABednM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADM6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAhaXZvOi8vY2RzLnZpemllci9qL21ucmFzLzM1OS8xNTI0AAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAAEEovTU5SQVMvMzU5LzE1MjQAAAArADEAMAAgAG4AZQB3ACAAcAB1AGwAcwBhAHIAcwAgAGkAbgAgAEEAcgBlAGMAaQBiAG8AIABkAHIAaQBmAHQALQBzAGMAYQBuACAAcwB1AHIAdgBlAHkAAAAIcmVzZWFyY2gAAAPJAFcAZQAgAHAAcgBlAHMAZQBuAHQAIAB0AGgAZQAgAHIAZQBzAHUAbAB0AHMAIABvAGYAIABhACAANAAzADAALQBNAEgAegAgAHMAdQByAHYAZQB5ACAAZgBvAHIAIABwAHUAbABzAGEAcgBzACAAYwBvAG4AZAB1AGMAdABlAGQAIABkAHUAcgBpAG4AZwAgAHQAaABlACAAdQBwAGcAcgBhAGQAZQAgAHQAbwAgAHQAaABlACAAMwAwADUALQBtACAAQQByAGUAYwBpAGIAbwAgAHIAYQBkAGkAbwAgAHQAZQBsAGUAcwBjAG8AcABlAC4AIABPAHUAcgAgAHMAdQByAHYAZQB5ACAAYwBvAHYAZQByAGUAZAAgAGEAIAB0AG8AdABhAGwAIABvAGYAIAAxADEANAA3AGQAZQBnAF4AMgBeACAAbwBmACAAcwBrAHkAIAB1AHMAaQBuAGcAIABhACAAZAByAGkAZgB0AC0AcwBjAGEAbgAgAHQAZQBjAGgAbgBpAHEAdQBlAC4AIABXAGUAIABkAGUAdABlAGMAdABlAGQAIAAzADMAIABwAHUAbABzAGEAcgBzACwAIAAxADAAIABvAGYAIAB3AGgAaQBjAGgAIAB3AGUAcgBlACAAbgBvAHQAIABrAG4AbwB3AG4AIABwAHIAaQBvAHIAIAB0AG8AIAB0AGgAZQAgAHMAdQByAHYAZQB5ACAAbwBiAHMAZQByAHYAYQB0AGkAbwBuAHMALgAgAFQAaABlACAAaABpAGcAaABsAGkAZwBoAHQAIABvAGYAIAB0AGgAZQAgAG4AZQB3ACAAZABpAHMAYwBvAHYAZQByAGkAZQBzACAAaQBzACAAUABTAFIAIABKADAANAAwADcAKwAxADYAMAA3ACwAIAB3AGgAaQBjAGgAIABoAGEAcwAgAGEAIABzAHAAaQBuACAAcABlAHIAaQBvAGQAIABvAGYAIAAyADUALgA3AG0AcwAsACAAYQAgAGMAaABhAHIAYQBjAHQAZQByAGkAcwB0AGkAYwAgAGEAZwBlACAAbwBmACAAMQAuADUARwB5AHIAIABhAG4AZAAgAGkAcwAgAGkAbgAgAGEAIAAxAC4AOAAtAHkAcgAgAG8AcgBiAGkAdAAgAGEAYgBvAHUAdAAgAGEAIABsAG8AdwAtAG0AYQBzAHMAIAAoAD4AMAAuADIATQApACAAYwBvAG0AcABhAG4AaQBvAG4ALgAgAFQAaABlACAAbABvAG4AZwAgAG8AcgBiAGkAdABhAGwAIABwAGUAcgBpAG8AZAAgAGEAbgBkACAAcwBtAGEAbABsACAAZQBjAGMAZQBuAHQAcgBpAGMAaQB0AHkAIAAoAGUAPQAwAC4AMAAwADAAOQApACAAbQBhAGsAZQAgAHQAaABlACAAYgBpAG4AYQByAHkAIABzAHkAcwB0AGUAbQAgAGEAbgAgAGkAbQBwAG8AcgB0AGEAbgB0ACAAbgBlAHcAIABhAGQAZABpAHQAaQBvAG4AIAB0AG8AIAB0AGgAZQAgAGUAbgBzAGUAbQBiAGwAZQAgAG8AZgAgAGIAaQBuAGEAcgB5ACAAcAB1AGwAcwBhAHIAcwAgAHMAdQBpAHQAYQBiAGwAZQAgAHQAbwAgAHQAZQBzAHQAIABmAG8AcgAgAHYAaQBvAGwAYQB0AGkAbwBuAHMAIABvAGYAIAB0AGgAZQAgAHMAdAByAG8AbgBnACAAZQBxAHUAaQB2AGEAbABlAG4AYwBlACAAcAByAGkAbgBjAGkAcABsAGUALgAgAFcAZQAgAGEAbABzAG8AIAByAGUAcABvAHIAdAAgAG8AbgAgAG8AdQByACAAaQBuAGkAdABpAGEAbABsAHkAIAB1AG4AcwB1AGMAYwBlAHMAcwBmAHUAbAAgAGEAdAB0AGUAbQBwAHQAcwAgAHQAbwAgAGQAZQB0AGUAYwB0ACAAbwBwAHQAaQBjAGEAbABsAHkAIAB0AGgAZQAgAGMAbwBtAHAAYQBuAGkAbwBuACAAdABvACAASgAwADQAMAA3ACsAMQA2ADAANwAsACAAdwBoAGkAYwBoACAAaQBtAHAAbAB5ACAAdABoAGEAdAAgAGkAdABzACAAYQBiAHMAbwBsAHUAdABlACAAdgBpAHMAdQBhAGwAIABtAGEAZwBuAGkAdAB1AGQAZQAgAGkAcwAgAD4AMQAyAC4AMQAuACAASQBmACwAIABhAHMAIABlAHgAcABlAGMAdABlAGQAIABvAG4AIABlAHYAbwBsAHUAdABpAG8AbgBhAHIAeQAgAGcAcgBvAHUAbgBkAHMALAAgAHQAaABlACAAYwBvAG0AcABhAG4AaQBvAG4AIABpAHMAIABhAG4AIABIAGUAIAB3AGgAaQB0AGUAIABkAHcAYQByAGYALAAgAG8AdQByACAAbgBvAG4ALQBkAGUAdABlAGMAdABpAG8AbgAgAGkAbQBwAGwAaQBlAHMAIABhACAAYwBvAG8AbABpAG4AZwAgAGEAZwBlACAAbwBmACAAbABlAGEAcwB0ACAAMQBHAHkAcgAuAAAANWh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL01OUkFTLzM1OS8xNTI0AAAAmQBMAG8AcgBpAG0AZQByACAARAAuAFIALgA7ACAAWABpAGwAbwB1AHIAaQBzACAASwAuAE0ALgA7ACAARgByAHUAYwBoAHQAZQByACAAQQAuAFMALgA7ACAAUwB0AGEAaQByAHMAIABJAC4ASAAuADsAIABDAGEAbQBpAGwAbwAgAEYALgA7ACAAVgBhAHoAcQB1AGUAegAgAEEALgBNAC4AOwAgAEUAZABlAHIAIABKAC4AQQAuADsAIABNAGMATABhAHUAZwBoAGwAaQBuACAATQAuAEEALgA7ACAAUgBvAGIAZQByAHQAcwAgAE0ALgBTAC4ARQAuADsAIABIAGUAcwBzAGUAbABzACAASgAuAFcALgBUAC4AOwAgAHIAYQBuAHMAbwBtACAAUwAuAE0ALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAwADUATQBOAFIAQQBTAC4AMwA1ADkALgAxADUAMgA0AEx/wAAAAAAABXJhZGlvAAABxWh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy8zNTkvMTUyNC90YWJsZTM/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzM1OS8xNTI0L3RhYmxlNT86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovTU5SQVMvMzU5LzE1MjQvdGFibGUyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9NTlJBUy8zNTkvMTUyNDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy8zNTkvMTUyNAAAALxpdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OgAAAJR2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyAAAAV3N0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OgAAACFpdm86Ly9jZHMudml6aWVyL2ovbW5yYXMvNDI3LzEwNTIAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQSi9NTlJBUy80MjcvMTA1MgAAACEASABUAFIAVQAgAHMAdQByAHYAZQB5AC4AIABUAGkAbQBpAG4AZwAgAG8AZgAgADUANAAgAHAAdQBsAHMAYQByAHMAAAAIcmVzZWFyY2gAAAR1AFcAZQAgAHAAcgBlAHMAZQBuAHQAIAA3ADUAIABwAHUAbABzAGEAcgBzACAAZABpAHMAYwBvAHYAZQByAGUAZAAgAGkAbgAgAHQAaABlACAAbQBpAGQALQBsAGEAdABpAHQAdQBkAGUAIABwAG8AcgB0AGkAbwBuACAAbwBmACAAdABoAGUAIABIAGkAZwBoACAAVABpAG0AZQAgAFIAZQBzAG8AbAB1AHQAaQBvAG4AIABVAG4AaQB2AGUAcgBzAGUAIABzAHUAcgB2AGUAeQAsACAANQA0ACAAbwBmACAAdwBoAGkAYwBoACAAaABhAHYAZQAgAGYAdQBsAGwAIAB0AGkAbQBpAG4AZwAgAHMAbwBsAHUAdABpAG8AbgBzAC4AIABBAGwAbAAgAHQAaABlACAAcAB1AGwAcwBhAHIAcwAgAGgAYQB2AGUAIABzAHAAaQBuACAAcABlAHIAaQBvAGQAcwAgAGcAcgBlAGEAdABlAHIAIAB0AGgAYQBuACAAMQAwADAAbQBzACwAIABhAG4AZAAgAG4AbwBuAGUAIABvAGYAIAB0AGgAbwBzAGUAIAB3AGkAdABoACAAdABpAG0AaQBuAGcAIABzAG8AbAB1AHQAaQBvAG4AcwAgAGkAcwAgAGkAbgAgAGIAaQBuAGEAcgBpAGUAcwAuACAAVAB3AG8AIABkAGkAcwBwAGwAYQB5ACAAcABhAHIAdABpAGMAdQBsAGEAcgBsAHkAIABpAG4AdABlAHIAZQBzAHQAaQBuAGcAIABiAGUAaABhAHYAaQBvAHUAcgA7ACAAUABTAFIAIABKADEAMAA1ADQALQA1ADkANAA0ACAAaQBzACAAZgBvAHUAbgBkACAAdABvACAAYgBlACAAYQBuACAAaQBuAHQAZQByAG0AaQB0AHQAZQBuAHQAIABwAHUAbABzAGEAcgAsACAAYQBuAGQAIABQAFMAUgAgAEoAMQA4ADAAOQAtADAAMQAxADkAIABoAGEAcwAgAGcAbABpAHQAYwBoAGUAZAAgAHQAdwBpAGMAZQAgAHMAaQBuAGMAZQAgAGkAdABzACAAZABpAHMAYwBvAHYAZQByAHkALgAgAEkAbgAgAHQAaABlACAAcwBlAGMAbwBuAGQAIABoAGEAbABmACAAbwBmACAAdABoAGUAIABwAGEAcABlAHIAIAB3AGUAIABkAGkAcwBjAHUAcwBzACAAdABoAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABhAG4AZAAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAgAG8AZgAgAGEAbgAgAGEAcgB0AGkAZgBpAGMAaQBhAGwAIABuAGUAdQByAGEAbAAgAG4AZQB0AHcAbwByAGsAIABpAG4AIAB0AGgAZQAgAGQAYQB0AGEALQBwAHIAbwBjAGUAcwBzAGkAbgBnACAAcABpAHAAZQBsAGkAbgBlACAAZgBvAHIAIAB0AGgAZQAgAHMAdQByAHYAZQB5AC4AIABXAGUAIABkAGkAcwBjAHUAcwBzACAAdABoAGUAIAB0AGUAcwB0AHMAIAB0AGgAYQB0ACAAdwBlAHIAZQAgAHUAcwBlAGQAIAB0AG8AIABnAGUAbgBlAHIAYQB0AGUAIABzAGMAbwByAGUAcwAgAGEAbgBkACAAZgBpAG4AZAAgAHQAaABhAHQAIABvAHUAcgAgAG4AZQB1AHIAYQBsACAAbgBlAHQAdwBvAHIAawAgAHcAYQBzACAAYQBiAGwAZQAgAHQAbwAgAHIAZQBqAGUAYwB0ACAAbwB2AGUAcgAgADkAOQBwAGUAcgAgAGMAZQBuAHQAIABvAGYAIAB0AGgAZQAgAGMAYQBuAGQAaQBkAGEAdABlAHMAIABwAHIAbwBkAHUAYwBlAGQAIABpAG4AIAB0AGgAZQAgAGQAYQB0AGEAIABwAHIAbwBjAGUAcwBzAGkAbgBnACwAIABhAG4AZAAgAGEAYgBsAGUAIAB0AG8AIABiAGwAaQBuAGQAbAB5ACAAZABlAHQAZQBjAHQAIAA4ADUAcABlAHIAIABjAGUAbgB0ACAAbwBmACAAcAB1AGwAcwBhAHIAcwAuACAAVwBlACAAcwB1AGcAZwBlAHMAdAAgAHQAaABhAHQAIABpAG0AcAByAG8AdgBlAG0AZQBuAHQAcwAgAHQAbwAgAHQAaABlACAAYQBjAGMAdQByAGEAYwB5ACAAcwBoAG8AdQBsAGQAIABiAGUAIABwAG8AcwBzAGkAYgBsAGUAIABpAGYAIABmAHUAcgB0AGgAZQByACAAYwBhAHIAZQAgAGkAcwAgAHQAYQBrAGUAbgAgAHcAaABlAG4AIAB0AHIAYQBpAG4AaQBuAGcAIABhAG4AIABhAHIAdABpAGYAaQBjAGkAYQBsACAAbgBlAHUAcgBhAGwAIABuAGUAdAB3AG8AcgBrADsAIABmAG8AcgAgAGUAeABhAG0AcABsAGUALAAgAGUAbgBzAHUAcgBpAG4AZwAgAHQAaABhAHQAIABhACAAcgBlAHAAcgBlAHMAZQBuAHQAYQB0AGkAdgBlACAAcwBhAG0AcABsAGUAIABvAGYAIAB0AGgAZQAgAHAAdQBsAHMAYQByACAAcABvAHAAdQBsAGEAdABpAG8AbgAgAGkAcwAgAHUAcwBlAGQAIABkAHUAcgBpAG4AZwAgAHQAaABlACAAdAByAGEAaQBuAGkAbgBnACAAcAByAG8AYwBlAHMAcwAsACAAbwByACAAdABoAGUAIAB1AHMAZQAgAG8AZgAgAGQAaQBmAGYAZQByAGUAbgB0ACAAYQByAHQAaQBmAGkAYwBpAGEAbAAgAG4AZQB1AHIAYQBsACAAbgBlAHQAdwBvAHIAawBzACAAZgBvAHIAIAB0AGgAZQAgAGQAZQB0AGUAYwB0AGkAbwBuACAAbwBmACAAZABpAGYAZgBlAHIAZQBuAHQAIAB0AHkAcABlAHMAIABvAGYAIABwAHUAbABzAGEAcgBzAC4AAAA1aHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovTU5SQVMvNDI3LzEwNTIAAAELAEIAYQB0AGUAcwAgAFMALgBEAC4AOwAgAEIAYQBpAGwAZQBzACAATQAuADsAIABCAGEAcgBzAGQAZQBsAGwAIABCAC4AUgAuADsAIABCAGgAYQB0ACAATgAuAEQALgBSAC4AOwAgAEIAdQByAGcAYQB5ACAATQAuADsAIABCAHUAcgBrAGUALQBTAHAAbwBsAGEAbwByACAAUwAuADsAIABDAGgAYQBtAHAAaQBvAG4AIABEAC4ASgAuADsAIABDAG8AcwB0AGUA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AGMAdQBsAGEAcgAgAHAAbwBsAGEAcgBpAHoAYQB0AGkAbwBuACAAYQBuAGQAIABuAGEAcgByAG8AdwAsACAAbQB1AGwAdABpAC0AYwBvAG0AcABvAG4AZQBuAHQAIABwAHIAbwBmAGkAbABlAHMALgAgAEEAbAB0AGgAbwB1AGcAaAAgAHQAaABlACAAcABvAHMAaQB0AGkAbwBuACAAYQBuAGcAbABlACAAcwB3AGkAbgBnAHMAIABhAHIAZQAgAGcAZQBuAGUAcgBhAGwAbAB5ACAAYwBvAG0AcABsAGUAeAAsACAAZgBvAHIAIAB0AHcAbwAgAG8AZgAgAHQAaABlACAAYQBuAGEAbAB5AHMAZQBkACAAcAB1AGwAcwBhAHIAcwAgACgASgAxADYAMgAyAC0AMwA3ADUAMQAgAGEAbgBkACAASgAxADcAMQAwAC0AMgA2ADEANgApACAAdwBlACAAbwBiAHQAYQBpAG4AZQBkACAAYQBuACAAaQBuAGQAaQBjAGEAdABpAG8AbgAgAG8AZgAgAHQAaABlACAAZwBlAG8AbQBlAHQAcgB5ACAAdgBpAGEAIAB0AGgAZQAgAHIAbwB0AGEAdABpAG4AZwAgAHYAZQBjAHQAbwByACAAbQBvAGQAZQBsAC4AIABXAGUAIAB3AGUAcgBlACAAYQBiAGwAZQAgAHQAbwAgAGQAZQB0AGUAcgBtAGkAbgBlACAAYQAgAHYAYQBsAHUAZQAgAG8AZgAgAHQAaABlACAAcgBvAHQAYQB0AGkAbwBuACAAbQBlAGEAcwB1AHIAZQAgACgAUgBNACkAIABmAG8AcgAgADMANAAgAG8AZgAgAHQAaABlACAAcwBvAHUAcgBjAGUAcwAgAHcAaABpAGMAaAAsACAAdwBoAGUAbgAgAGMAbwBtAGIAaQBuAGUAZAAgAHcAaQB0AGgAIAB0AGgAZQBpAHIAIABkAGkAcwBwAGUAcgBzAGkAbwBuACAAbQBlAGEAcwB1AHIAZQBzACAAKABEAE0AKQAsACAAeQBpAGUAbABkAHMAIABhAG4AIABpAG4AdABlAGcAcgBhAHQAZQBkACAAbQBhAGcAbgBlAHQAaQBjACAAZgBpAGUAbABkACAAcwB0AHIAZQBuAGcAdABoACAAYQBsAG8AbgBnACAAdABoAGUAIABsAGkAbgBlACAAbwBmACAAcwBpAGcAaAB0AC4AIABXAGkAdABoACAAdABoAGUAIABkAGEAdABhACAAcAByAGUAcwBlAG4AdABlAGQAIABoAGUAcgBlACwAIAB0AGgAZQAgAHQAbwB0AGEAbAAgAG4AdQBtAGIAZQByACAAbwBmACAAdgBhAGwAdQBlAHMAIABvAGYAIABSAE0AIABhAHMAcwBvAGMAaQBhAHQAZQBkACAAdwBpAHQAaAAgAHAAdQBsAHMAYQByAHMAIABkAGkAcwBjAG8AdgBlAHIAZQBkACAAZAB1AHIAaQBuAGcAIAB0AGgAZQAgAEgAVABSAFUAIABzAG8AdQB0AGgAZQByAG4AIABzAHUAcgB2AGUAeQAgAHMAdQBtAHMAIAB0AG8AIAA1ADEALgAgAFQAaABlACAAUgBNAHMAIABhAHIAZQAgAG4AbwB0ACAAYwBvAG4AcwBpAHMAdABlAG4AdAAgAHcAaQB0AGgAIAB0AGgAZQAgAGgAeQBwAG8AdABoAGUAcwBpAHMAIABvAGYAIABhACAAYwBvAHUAbgB0AGUAcgAtAGMAbABvAGMAawB3AGkAcwBlACAAZABpAHIAZQBjAHQAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAG0AYQBnAG4AZQB0AGkAYwAgAGYAaQBlAGwAZAAgAHcAaQB0AGgAaQBuACAAYQBuACAAYQBuAG4AdQBsAHUAcwAgAGkAbgBjAGwAdQBkAGUAZAAgAGIAZQB0AHcAZQBlAG4AIAA0ACAAYQBuAGQAIAA2AGsAcABjACAAZgByAG8AbQAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAQwBlAG4AdAByAGUALgAgAEEAIABwAGEAcgB0AGkAYQBsACAAYQBnAHIAZQBlAG0AZQBuAHQAIAB3AGkAdABoACAAYQAgAGMAbwB1AG4AdABlAHIALQBjAGwAbwBjAGsAdwBpAHMAZQAgAHMAZQBuAHMAZQAgAG8AZgAgAHQAaABlACAARwBhAGwAYQBjAHQAaQBjACAAbQBhAGcAbgBlAHQAaQBjACAAZgBpAGUAbABkACAAdwBpAHQAaABpAG4AIAB0AGgAZQAgAHMAcABpAHIAYQBsACAAYQByAG0AcwAgAGkAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAZgBvAHUAbgBkACAAaQBuACAAdABoAGUAIABhAHIAZQBhACAAbwBmACAAdABoAGUAIABDAGEAcgBpAG4AYQAtAFMAYQBnAGkAdAB0AGEAcgBpAHUAcwAgAGEAcgBtAC4AAAA1aHR0cDovL2Nkc2FyYy51bmlzdHJhLmZyL2NnaS1iaW4vY2F0L0ovTU5SQVMvNDM2LzM1NTcAAADnAFQAaQBiAHUAcgB6AGkAIABDAC4AOwAgAEoAbwBoAG4AcwB0AG8AbgAgAFMALgA7ACAAQgBhAGkAbABlAHMAIABNAC4AOwAgAEIAYQB0AGUAcwAgAFMALgBEAC4AOwAgAEIAaABhAHQAIABOAC4ARAAuAFIALgA7ACAAQgB1AHIAZwBhAHkAIABNAC4AOwAgAEIAdQByAGsAZQAtAFMAcABvAGwAYQBvAHIAIABTAC4AOwAgAEMAaABhAG0AcABpAG8AbgAgAEQALgA7ACAAQwBvAHMAdABlAHIAIABQAC4AOwAgAEQAJwBBAG0AaQBjAG8AIABOAC4AOwAgAEsAZQBpAHQAaAAgAE0ALgBKAC4AOwAgAEsAcgBhAG0AZQByACAATQAuADsAIABMAGUAdgBpAG4AIABMAC4AOwAgAE0AaQBsAGkAYQAgAFMALgA7ACAATgBnACAAQwAuADsAIABQAG8AcwBzAGUAbgB0AGkAIABBAC4AOwAgAFMAdABhAHAAcABlAHIAcwAgAEIALgBXAC4AOwAgAFQAaABvAHIAbgB0AG8AbgAgAEQALgA7ACAAdgBhAG4AIABTAHQAcgBhAHQAZQBuACAAVwAuAAAAB2NhdGFsb2cAAAAHYmliY29kZQAAABMAMgAwADEAMwBNAE4AUgBBAFMALgA0ADMANgAuADMANQA1ADcAVH/AAAAAAAAFcmFkaW8AAALzaHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQzNi8zNTU3L3RhYmxlMj86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPUovTU5SQVMvNDM2LzM1NTc6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9NTlJBUy80MzYvMzU1Nzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovTU5SQVMvNDM2LzM1NTcvdGFibGUyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80MzYvMzU1Ny90YWJsZTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQzNi8zNTU3Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNDM2LzM1NTc6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQzNi8zNTU3L3RhYmxlMT8AAAEvaXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoAAABAXZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwAAAAmXN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZAAAACFpdm86Ly9jZHMudml6aWVyL2ovbW5yYXMvNDU4LzMzNDEAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQSi9NTlJBUy80NTgvMzM0MQAAACwANAAyACAAbQBpAGwAbABpAHMAZQBjAG8AbgBkACAAcAB1AGwAcwBhAHIAcwAgAGgAaQBnAGgALQBwAHIAZQBjAGkAcwBpAG8AbgAgAHQAaQBtAGkAbgBnAAAACHJlc2VhcmNoAAAGYABXAGUAIAByAGUAcABvAHIAdAAgAG8AbgAgAHQAaABlACAAaABpAGcAaAAtAHAAcgBlAGMAaQBzAGkAbwBuACAAdABpAG0AaQBuAGcAIABvAGYAIAA0ADIAIAByAGEAZABpAG8AIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACAAKABNAFMAUABzACkAIABvAGIAcwBlAHIAdgBlAGQAIABiAHkAIAB0AGgAZQAgAEUAdQByAG8AcABlAGEAbgAgAFAAdQBsAHMAYQByACAAVABpAG0AaQBuAGcAIABBAHIAcgBhAHkAIAAoAEUAUABUAEEAKQAuACAAVABoAGkAcwAgAEUAUABUAEEAIABEAGEAdABhACAAUgBlAGwAZQBhAHMAZQAgADEALgAwACAAZQB4AHQAZQBuAGQAcwAgAHUAcAAgAHQAbwAgAG0AaQBkAC0AMgAwADEANAAgAGEAbgBkACAAYgBhAHMAZQBsAGkAbgBlAHMAIAByAGEAbgBnAGUAIABmAHIAbwBtACAANwAtADEAOAB5AHIALgAgAEkAdAAgAGYAbwByAG0AcwAgAHQAaABlACAAYgBhAHMAaQBzACAAZgBvAHIAIAB0AGgAZQAgAHMAdABvAGMAaABhAHMAdABpAGMAIABnAHIAYQB2AGkAdABhAHQAaQBvAG4AYQBsAC0AdwBhAHYAZQAgAGIAYQBjAGsAZwByAG8AdQBuAGQALAAgAGEAbgBpAHMAbwB0AHIAbwBwAGkAYwAgAGIAYQBjAGsAZwByAG8AdQBuAGQALAAgAGEAbgBkACAAYwBvAG4AdABpAG4AdQBvAHUAcwAtAHcAYQB2AGUAIABsAGkAbQBpAHQAcwAgAHIAZQBjAGUAbgB0AGwAeQAgAHAAcgBlAHMAZQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABFAFAAVABBACAAZQBsAHMAZQB3AGgAZQByAGUALgAgAFQAaABlACAAQgBhAHkAZQBzAGkAYQBuACAAdABpAG0AaQBuAGcAIABhAG4AYQBsAHkAcwBpAHMAIABwAGUAcgBmAG8AcgBtAGUAZAAgAHcAaQB0AGgAIABUAEUATQBQAE8ATgBFAFMAVAAgAHkAaQBlAGwAZABzACAAdABoAGUAIABkAGUAdABlAGMAdABpAG8AbgAgAG8AZgAgAHMAZQB2AGUAcgBhAGwAIABuAGUAdwAgAHAAYQByAGEAbQBlAHQAZQByAHMAOgAgAHMAZQB2AGUAbgAgAHAAYQByAGEAbABsAGEAeABlAHMALAAgAG4AaQBuAGUAIABwAHIAbwBwAGUAcgAgAG0AbwB0AGkAbwBuAHMAIABhAG4AZAAsACAAaQBuACAAdABoAGUAIABjAGEAcwBlACAAbwBmACAAcwBpAHgAIABiAGkAbgBhAHIAeQAgAHAAdQBsAHMAYQByAHMALAAgAGEAbgAgAGEAcABwAGEAcgBlAG4AdAAgAGMAaABhAG4AZwBlACAAbwBmACAAdABoAGUAIABzAGUAbQBpAG0AYQBqAG8AcgAgAGEAeABpAHMALgAgAFcAZQAgAGYAaQBuAGQAIAB0AGgAZQAgAE4ARQAyADAAMAAxACAARwBhAGwAYQBjAHQAaQBjACAAZQBsAGUAYwB0AHIAbwBuACAAZABlAG4AcwBpAHQAeQAgAG0AbwBkAGUAbAAgAHQAbwAgAGIAZQAgAGEAIABiAGUAdAB0AGUAcgAgAG0AYQB0AGMAaAAgAHQAbwAgAG8AdQByACAAcABhAHIAYQBsAGwAYQB4ACAAZABpAHMAdABhAG4AYwBlAHMAIAAoAGEAZgB0AGUAcgAgAGMAbwByAHIAZQBjAHQAaQBvAG4AIABmAHIAbwBtACAAdABoAGUAIABMAHUAdAB6AC0ASwBlAGwAawBlAHIAIABiAGkAYQBzACkAIAB0AGgAYQBuACAAdABoAGUAIABNADIAIABhAG4AZAAgAE0AMwAgAG0AbwBkAGUAbABzACAAYgB5ACAAUwBjAGgAbgBpAHQAegBlAGwAZQByAC4AIABIAG8AdwBlAHYAZQByACwAIAB3AGUAIABtAGUAYQBzAHUAcgBlACAAYQBuACAAYQB2AGUAcgBhAGcAZQAgAHUAbgBjAGUAcgB0AGEAaQBuAHQAeQAgAG8AZgAgADgAMAAgAHAAZQByACAAYwBlAG4AdAAgACgAZgByAGEAYwB0AGkAbwBuAGEAbAApACAAZgBvAHIAIABOAEUAMgAwADAAMQAsACAAdABoAHIAZQBlACAAdABpAG0AZQBzACAAbABhAHIAZwBlAHIAIAB0AGgAYQBuACAAdwBoAGEAdAAgAGkAcwAgAHQAeQBwAGkAYwBhAGwAbAB5ACAAYQBzAHMAdQBtAGUAZAAgAGkAbgAgAHQAaABlACAAbABpAHQAZQByAGEAdAB1AHIAZQAuACAAVwBlACAAcgBlAHYAaQBzAGkAdAAgAHQAaABlACAAdAByAGEAbgBzAHYAZQByAHMAZQAgAHYAZQBsAG8AYwBpAHQAeQAgAGQAaQBzAHQAcgBpAGIAdQB0AGkAbwBuACAAZgBvAHIAIABhACAAcwBlAHQAIABvAGYAIAAxADkAIABpAHMAbwBsAGEAdABlAGQAIABhAG4AZAAgADUANwAgAGIAaQBuAGEAcgB5ACAATQBTAFAAcwAgAGEAbgBkACAAZgBpAG4AZAAgAG4AbwAgAHMAdABhAHQAaQBzAHQAaQBjAGEAbAAgAGQAaQBmAGYAZQByAGUAbgBjAGUAIABiAGUAdAB3AGUAZQBuACAAdABoAGUAcwBlACAAdAB3AG8AIABwAG8AcAB1AGwAYQB0AGkAbwBuAHMALgAgAFcAZQAgAGQAZQB0AGUAYwB0ACAAUwBoAGEAcABpAHIAbwAgAGQAZQBsAGEAeQAgAGkAbgAgAHQAaABlACAAdABpAG0AaQBuAGcAIAByAGUAcwBpAGQAdQBhAGwAcwAgAG8AZgAgAFAAUwBSAHMAIABKADEANgAwADAALQAzADAANQAzACAAYQBuAGQAIABKADEAOQAxADgALQAwADYANAAyACwAIABpAG0AcABsAHkAaQBuAGcAIABwAHUAbABzAGEAcgAgAGEAbgBkACAAYwBvAG0AcABhAG4AaQBvAG4AIABtAGEAcwBzAGUAcwAgAG0AcAA9ADEALgAyADIAXgArADAALgA1AF4AXwAtADAALgAzADUAXwBNAF8AewBzAHUAbgB9AF8ALAAgAG0AYwA9ADAALgAyADEAXgArADAALgAwADYAXgBfAC0AMAAuADAANABfAE0AXwB7AHMAdQBuAH0AXwAgAGEAbgBkACAAbQBwAD0AMQAuADIANQBeACsAMAAuADYAXgBfAC0AMAAuADQAXwBNAF8AewBzAHUAbgB9AH0ALAAgAG0AYwA9ADAALgAyADMAXgArADAALgAwADcAXgBfAC0AMAAuADAANQBfAE0AXwB7AHMAdQBuAH0AXwAsACAAcgBlAHMAcABlAGMAdABpAHYAZQBsAHkALgAgAEYAaQBuAGEAbABsAHkALAAgAHcAZQAgAHUAcwBlACAAdABoAGUAIABtAGUAYQBzAHUAcgBlAG0AZQBuAHQAIABvAGYAIAB0AGgAZQAgAG8AcgBiAGkAdABhAGwAIABwAGUAcgBpAG8AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB0AG8AIABzAGUAdAAgAGEAIABzAHQAcgBpAG4AZwBlAG4AdAAgAGMAbwBuAHMAdAByAGEAaQBuAHQAIABvAG4AIAB0AGgAZQAgAGQAaQBzAHQAYQBuAGMAZQAgAHQAbwAgAFAAUwBSAHMAIABKADEAMAAxADIAKwA1ADMAMAA3ACAAYQBuAGQAIABKADEAOQAwADkALQAzADcANAA0ACwAIABhAG4AZAAgAHMAZQB0ACAAbABpAG0AaQB0AHMAIABvAG4AIAB0AGgAZQAgAGwAbwBuAGcAaQB0AHUAZABlACAAbwBmACAAYQBzAGMAZQBuAGQAaQBuAGcAIABuAG8AZABlACAAdABoAHIAbwB1AGcAaAAgAHQAaABlACAAcwBlAGEAcgBjAGgAIABvAGYAIAB0AGgAZQAgAGEAbgBuAHUAYQBsAC0AbwByAGIAaQB0AGEAbAAgAHAAYQByAGEAbABsAGEAeAAgAGYAbwByACAAUABTAFIAcwAgAEoAMQA2ADAAMAAtADMAMAA1ADMAIABhAG4AZAAgAEoAMQA5ADAAOQAtADMANwA0ADQALgAAADVodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9NTlJBUy80NTgvMzM0MQAAAiMARABlAHMAdgBpAGcAbgBlAHMAIABHAC4AOwAgAEMAYQBiAGEAbABsAGUAcgBvACAAUgAuAE4ALgA7ACAATABlAG4AdABhAHQAaQAgAEwALgA7ACAAVgBlAHIAYgBpAGUAcwB0ACAASgAuAFAALgBXAC4AOwAgAEMAaABhAG0AcABpAG8AbgAgAEQALgBKAC4AOwAgAFMAdABhAHAAcABlAHIAcwAgAEIALgBXAC4AOwAgAEoAYQBuAHMAcwBlAG4AIABHAC4ASAAuADsAIABMAGEAegBhAHIAdQBzACAAUAAuADsAIABPAHMAbABvAHcAcwBrAGkAIABTAC4AOwAgAEIAYQBiAGEAawAgAFMALgA7ACAAQgBhAHMAcwBhACAAQwAuAEcALgA7ACAAQgByAGUAbQAgAFAALgA7ACAAQgB1AHIAZwBhAHkAIABNAC4AOwAgAEMAbwBnAG4AYQByAGQAIABJAC4AOwAgAEcAYQBpAHIAIABKAC4AUgAuADsAIABHAHIAYQBpAGsAbwB1ACAARQAuADsAIABHAHUAaQBsAGwAZQBtAG8AdAAgAEwALgA7ACAASABlAHMAcwBlAGwAcwAgAEoALgBXAC4AVAAuADsAIABKAGUAcwBzAG4AZQByACAAQQAuADsAIABKAG8AcgBkAGEAbgAgAEMALgA7ACAASwBhAHIAdQBwAHAAdQBzAGEAbQB5ACAAUgAuADsAIABLAHIAYQBtAGUAcgAgAE0ALgA7ACAATABhAHMAcwB1AHMAIABBAC4AOwAgAEwAYQB6AGEAcgBpAGQAaQBzACAASwAuADsAIABMAGUAZQAgAEsALgBKAC4AOwAgAEwAaQB1ACAASwAuADsAIABMAHkAbgBlACAAQQAuAEcALgA7ACAATQBjAGsAZQBlACAASgAuADsAIABNAGkAbgBnAGEAcgBlAGwAbABpACAAQwAuAE0ALgBGAC4AOwAgAFAAZQByAHIAbwBkAGkAbgAgAEQALgA7ACAAUABlAHQAaQB0AGUAYQB1ACAAQQAuADsAIABQAG8AcwBzAGUAbgB0AGkAIABBAC4AOwAgAFAAdQByAHYAZQByACAATQAuAEIALgA7ACAAUgBvAHMAYQBkAG8AIABQAC4AQQAuADsAIABTAGEAbgBpAGQAYQBzACAAUwAuADsAIABTAGUAcwBhAG4AYQAgAEEALgA7ACAAUwBoAGEAaQBmAHUAbABsAGEAaAAgAEcALgA7ACAAUwBtAGkAdABzACAAUgAuADsAIABUAGEAeQBsAG8AcgAgAFMALgBSAC4AOwAgAFQAaABlAHUAcgBlAGEAdQAgAEcALgA7ACAAVABpAGIAdQByAHoAaQAgAEMALgA7ACAAVgBhAG4AIABIAGEAYQBzAHQAZQByAGUAbgAgAFIALgA7ACAAVgBlAGMAYwBoAGkAbwAgAEEALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAxADYATQBOAFIAQQBTAC4ANAA1ADgALgAzADMANAAxAER/wAAAAAAABXJhZGlvAAAIOmh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ1OC8zMzQxL3RhYjItMTI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNDU4LzMzNDE6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ1OC8zMzQxL3RhYjItMTI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNDU4LzMzNDE6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ1OC8zMzQxL3RhYjItMTI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ1OC8zMzQxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvSi9NTlJBUy80NTgvMzM0MS90YWIyLTEyPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy80NTgvMzM0MQAAAxY6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6AAAC7HZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXIAAAG/Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6AAAAIGl2bzovL2Nkcy52aXppZXIvai9tbnJhcy80NTkvMTQwAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAAD0ovTU5SQVMvNDU5LzE0MAAAACYATQA4ADEALAAgAEwATQBDACAAYQBuAGQAIAAzAEMAIAAyADcAMwAvAEMAbwBtAGEAIAAxADcALQA2ADAAawBlAFYAIABvAGIAcwAuAAAACHJlc2VhcmNoAAAGFgBXAGUAIABwAHIAZQBzAGUAbgB0ACAAcgBlAHMAdQBsAHQAcwAgAG8AZgAgAGEAIABkAGUAZQBwACAAcwB1AHIAdgBlAHkAIABvAGYAIAB0AGgAcgBlAGUAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAZgBpAGUAbABkAHMALAAgAE0AOAAxACAAKABlAHgAcABvAHMAdQByAGUAIABvAGYAIAA5AC4ANwBNAHMAKQAsACAATABhAHIAZwBlACAATQBhAGcAZQBsAGwAYQBuAGkAYwAgAEMAbABvAHUAZAAgACgANgAuADgAIABNAHMAKQAgAGEAbgBkACAAMwBDACAAMgA3ADMALwBDAG8AbQBhACAAKAA5AC4AMwBNAHMAKQAsACAAaQBuACAAdABoAGUAIABoAGEAcgBkACAAWAAtAHIAYQB5ACAAKAAxADcALQA2ADAAawBlAFYAKQAgAGUAbgBlAHIAZwB5ACAAYgBhAG4AZAAgAHcAaQB0AGgAIAB0AGgAZQAgAEkAQgBJAFMAIAB0AGUAbABlAHMAYwBvAHAAZQAgAG8AbgBiAG8AYQByAGQAIAB0AGgAZQAgAEkATgBUAEUARwBSAEEATAAgAG8AYgBzAGUAcgB2AGEAdABvAHIAeQAsACAAYgBhAHMAZQBkACAAbwBuACAAMQAyACAAeQBlAGEAcgBzACAAbwBmACAAbwBiAHMAZQByAHYAYQB0AGkAbwBuAHMAIAAoADIAMAAwADMALQAyADAAMQA1ACkALgAgAFQAaABlACAAYwBvAG0AYgBpAG4AZQBkACAAcwB1AHIAdgBlAHkAIAByAGUAYQBjAGgAZQBzACAAYQAgADQAewBzAGkAZwBtAGEAfQAgAHAAZQBhAGsAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABvAGYAIAAwAC4AMQA4AG0AQwByAGEAYgAgACgAMgAuADYAeAAxADAAXgAtADEAMgBeAGUAcgBnAC8AcwAvAGMAbQBeADIAXgApACAAYQBuAGQAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABiAGUAdAB0AGUAcgAgAHQAaABhAG4AIAAwAC4AMgA1ACAAYQBuAGQAIAAwAC4AOAA3AG0AQwByAGEAYgAgAG8AdgBlAHIAIAAxADAAIABwAGUAcgAgAGMAZQBuAHQAIABhAG4AZAAgADkAMAAgAHAAZQByACAAYwBlAG4AdAAgAG8AZgAgAGkAdABzACAAZgB1AGwAbAAgAGEAcgBlAGEAIABvAGYAIAA0ADkAMAAwACAAZABlAGcAXgAyAF4ALAAgAHIAZQBzAHAAZQBjAHQAaQB2AGUAbAB5AC4AIABXAGUAIABoAGEAdgBlACAAZABlAHQAZQBjAHQAZQBkACAAaQBuACAAdABvAHQAYQBsACAAMQA0ADcAIABzAG8AdQByAGMAZQBzACAAYQB0ACAAUwAvAE4APgA0AHsAcwBpAGcAbQBhAH0ALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAMwA3ACAAcwBvAHUAcgBjAGUAcwAgAG8AYgBzAGUAcgB2AGUAZAAgAGkAbgAgAGgAYQByAGQAIABYAC0AcgBhAHkAcwAgAGYAbwByACAAdABoAGUAIABmAGkAcgBzAHQAIAB0AGkAbQBlAC4AIABUAGgAZQAgAHMAdQByAHYAZQB5ACAAaQBzACAAZABvAG0AaQBuAGEAdABlAGQAIABiAHkAIABlAHgAdAByAGEAZwBhAGwAYQBjAHQAaQBjACAAcwBvAHUAcgBjAGUAcwAsACAAbQBvAHMAdABsAHkAIABhAGMAdABpAHYAZQAgAGcAYQBsAGEAYwB0AGkAYwAgAG4AdQBjAGwAZQBpACAAKABBAEcATgApAC4AIABUAGgAZQAgAHMAYQBtAHAAbABlACAAbwBmACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgAHMAbwB1AHIAYwBlAHMAIABjAG8AbgB0AGEAaQBuAHMAIAA5ADgAIABBAEcATgAgACgAaQBuAGMAbAB1AGQAaQBuAGcAIAA2ADQAIABTAGUAeQBmAGUAcgB0ACAAZwBhAGwAYQB4AGkAZQBzACwAIABzAGUAdgBlAG4AIABsAG8AdwAtAGkAbwBuAGkAegBhAHQAaQBvAG4AIABuAHUAYwBsAGUAYQByACAAZQBtAGkAcwBzAGkAbwBuAC0AbABpAG4AZQAgAHIAZQBnAGkAbwBuACAAZwBhAGwAYQB4AGkAZQBzACwAIAB0AGgAcgBlAGUAIABYAC0AcgBhAHkAIABiAHIAaQBnAGgAdAAgAG8AcAB0AGkAYwBhAGwAbAB5ACAAbgBvAHIAbQBhAGwAIABnAGEAbABhAHgAaQBlAHMALAAgADEANgAgAGIAbABhAHoAYQByAHMAIABhAG4AZAAgAGUAaQBnAGgAdAAgAEEARwBOACAAbwBmACAAdQBuAGMAbABlAGEAcgAgAG8AcAB0AGkAYwBhAGwAIABjAGwAYQBzAHMAKQAsACAAdAB3AG8AIABnAGEAbABhAHgAeQAgAGMAbAB1AHMAdABlAHIAcwAgACgAQwBvAG0AYQAgAGEAbgBkACAAQQBiAGUAbABsACAAMwAyADYANgApACwAIAAxADcAIABvAGIAagBlAGMAdABzACAAbABvAGMAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAATABhAHIAZwBlACAAYQBuAGQAIABTAG0AYQBsAGwAIABNAGEAZwBlAGwAbABhAG4AaQBjACAAQwBsAG8AdQBkAHMAIAAoADEAMwAgAGgAaQBnAGgALQAgAGEAbgBkACAAdAB3AG8AIABsAG8AdwAtAG0AYQBzAHMAIABYAC0AcgBhAHkAIABiAGkAbgBhAHIAaQBlAHMAIABhAG4AZAAgAHQAdwBvACAAWAAtAHIAYQB5ACAAcAB1AGwAcwBhAHIAcwApACwAIAB0AGgAcgBlAGUAIABHAGEAbABhAGMAdABpAGMAIABjAGEAdABhAGMAbAB5AHMAbQBpAGMAIAB2AGEAcgBpAGEAYgBsAGUAcwAsACAAbwBuAGUAIAB1AGwAdAByAGEAbAB1AG0AaQBuAG8AdQBzACAAWAAtAHIAYQB5ACAAcwBvAHUAcgBjAGUAIAAoAE0AOAAyACAAWAAtADEAKQAgAGEAbgBkACAAbwBuAGUAIABiAGwAZQBuAGQAZQBkACAAcwBvAHUAcgBjAGUAIAAoAFMAVwBJAEYAVAAgAEoAMQAxADAANQAuADcAKwA1ADgANQA0ACkALgAgAFQAaABlACAAbgBhAHQAdQByAGUAIABvAGYAIAAyADUAIABzAG8AdQByAGMAZQBzACAAcgBlAG0AYQBpAG4AcwAgAHUAbgBrAG4AbwB3AG4ALAAgAHMAbwAgAHQAaABhAHQAIAB0AGgAZQAgAHMAdQByAHYAZQB5ACcAcwAgAGkAZABlAG4AdABpAGYAaQBjAGEAdABpAG8AbgAgAGkAcwAgAGMAdQByAHIAZQBuAHQAbAB5ACAAYwBvAG0AcABsAGUAdABlACAAYQB0ACAAOAAzACAAcABlAHIAIABjAGUAbgB0AC4AIABXAGUAIABoAGEAdgBlACAAYwBvAG4AcwB0AHIAdQBjAHQAZQBkACAAQQBHAE4AIABuAHUAbQBiAGUAcgAtAGYAbAB1AHgAIAByAGUAbABhAHQAaQBvAG4AcwAgACgAbABvAGcAIABOAC0AbABvAGcAIABTACkAIABhAG4AZAAgAGMAYQBsAGMAdQBsAGEAdABlAGQAIABBAEcATgAgAG4AdQBtAGIAZQByACAAZABlAG4AcwBpAHQAaQBlAHMAIABpAG4AIAB0AGgAZQAgAGwAbwBjAGEAbAAgAFUAbgBpAHYAZQByAHMAZQAgAGYAbwByACAAdABoAGUAIABlAG4AdABpAHIAZQAgAHMAdQByAHYAZQB5ACAAYQBuAGQAIABmAG8AcgAgAGUAYQBjAGgAIABvAGYAIAB0AGgAZQAgAHQAaAByAGUAZQAgAGUAeAB0AHIAYQBnAGEAbABhAGMAdABpAGMAIABmAGkAZQBsAGQAcwAuAAAANGh0dHA6Ly9jZHNhcmMudW5pc3RyYS5mci9jZ2ktYmluL2NhdC9KL01OUkFTLzQ1OS8xNDAAAABcAE0AZQByAGUAbQBpAG4AcwBrAGkAeQAgAEkALgBBAC4AOwAgAEsAcgBpAHYAbwBuAG8AcwAgAFIALgBBAC4AOwAgAEwAdQB0AG8AdgBpAG4AbwB2ACAAQQAuAEEALgA7ACAAUwBhAHoAbwBuAG8AdgAgAFMALgBZAC4AOwAgAFIAZQB2AG4AaQB2AHQAcwBlAHYAIABNAC4ARwAuADsAIABTAHUAbgB5AGEAZQB2ACAAUgAuAEEALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAxADYATQBOAFIAQQBTAC4ANAA1ADkALgAuADEANAAwAE1/wAAAAAAABXgtcmF5AAABHGh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9Si9NTlJBUy80NTkvMTQwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ1OS8xNDA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL0ovTU5SQVMvNDU5LzE0MC90YWJsZTE/AAAAZGl2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAABednM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAADNzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQAAAAhaXZvOi8vY2RzLnZpemllci9qL21ucmFzLzQ4NC8zNjkxAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAAEEovTU5SQVMvNDg0LzM2OTEAAAAiAFUAVABNAE8AUwBUACAAcAB1AGwAcwBhAHIAIAB0AGkAbQBpAG4AZwAgAHAAcgBvAGcAcgBhAG0AbQBlAC4AIABJAC4AAAAIcmVzZWFyY2gAAAZHAFcAZQAgAHAAcgBlAHMAZQBuAHQAIABhAG4AIABvAHYAZQByAHYAaQBlAHcAIABhAG4AZAAgAHQAaABlACAAZgBpAHIAcwB0ACAAcgBlAHMAdQBsAHQAcwAgAGYAcgBvAG0AIABhACAAbABhAHIAZwBlAC0AcwBjAGEAbABlACAAcAB1AGwAcwBhAHIAIAB0AGkAbQBpAG4AZwAgAHAAcgBvAGcAcgBhAG0AbQBlACAAdABoAGEAdAAgAGkAcwAgAHAAYQByAHQAIABvAGYAIAB0AGgAZQAgAFUAVABNAE8AUwBUACAAcAByAG8AagBlAGMAdAAgAGEAdAAgAHQAaABlACAAcgBlAGYAdQByAGIAaQBzAGgAZQBkACAATQBvAGwAbwBuAGcAbABvACAATwBiAHMAZQByAHYAYQB0AG8AcgB5ACAAUwB5AG4AdABoAGUAcwBpAHMAIABSAGEAZABpAG8AIABUAGUAbABlAHMAYwBvAHAAZQAgACgATQBPAFMAVAApACAAbgBlAGEAcgAgAEMAYQBuAGIAZQByAHIAYQAsACAAQQB1AHMAdAByAGEAbABpAGEALgAgAFcAZQAgAGMAdQByAHIAZQBuAHQAbAB5ACAAbwBiAHMAZQByAHYAZQAgAG0AbwByAGUAIAB0AGgAYQBuACAANAAwADAAIABtAGEAaQBuAGwAeQAgAGIAcgBpAGcAaAB0ACAAcwBvAHUAdABoAGUAcgBuACAAcgBhAGQAaQBvACAAcAB1AGwAcwBhAHIAcwAgAHcAaQB0AGgAIAB1AHAAIAB0AG8AIABkAGEAaQBsAHkAIABjAGEAZABlAG4AYwBlAHMALgAgAEYAbwByACAAMgAwADUAIAAoADgAIABpAG4AIABiAGkAbgBhAHIAaQBlAHMALAAgADQAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACkALAAgAHcAZQAgAHAAdQBiAGwAaQBzAGgAIAB1AHAAZABhAHQAZQBkACAAdABpAG0AaQBuAGcAIABtAG8AZABlAGwAcwAsACAAdABvAGcAZQB0AGgAZQByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGYAbAB1AHgAIABkAGUAbgBzAGkAdABpAGUAcwAsACAAZgBsAHUAeAAgAGQAZQBuAHMAaQB0AHkAIAB2AGEAcgBpAGEAYgBpAGwAaQB0AHkALAAgAGEAbgBkACAAcAB1AGwAcwBlACAAdwBpAGQAdABoAHMAIABhAHQAIAA4ADQAMwAgAE0ASAB6ACwAIABkAGUAcgBpAHYAZQBkACAAZgByAG8AbQAgAG8AYgBzAGUAcgB2AGEAdABpAG8AbgBzACAAcwBwAGEAbgBuAGkAbgBnACAAYgBlAHQAdwBlAGUAbgAgADEALgA0ACAAYQBuAGQAIAAzACAAeQByAC4AIABJAG4AIABjAG8AbQBwAGEAcgBpAHMAbwBuACAAdwBpAHQAaAAgAHQAaABlACAAQQBUAE4ARgAgAHAAdQBsAHMAYQByACAAYwBhAHQAYQBsAG8AZwB1AGUALAAgAHcAZQAgAGkAbQBwAHIAbwB2AGUAIAB0AGgAZQAgAHAAcgBlAGMAaQBzAGkAbwBuACAAbwBmACAAdABoAGUAIAByAG8AdABhAHQAaQBvAG4AYQBsACAAYQBuAGQAIABhAHMAdAByAG8AbQBlAHQAcgBpAGMAIABwAGEAcgBhAG0AZQB0AGUAcgBzACAAZgBvAHIAIAAxADIAMwAgAHAAdQBsAHMAYQByAHMALAAgAGYAbwByACAANAA3ACAAYgB5ACAAYQB0ACAAbABlAGEAcwB0ACAAYQBuACAAbwByAGQAZQByACAAbwBmACAAbQBhAGcAbgBpAHQAdQBkAGUALgAgAFQAaABlACAAdABpAG0AZQAgAHMAcABhAG4AcwAgAGIAZQB0AHcAZQBlAG4AIABvAHUAcgAgAG0AZQBhAHMAdQByAGUAbQBlAG4AdABzACAAYQBuAGQAIAB0AGgAbwBzAGUAIABpAG4AIAB0AGgAZQAgAGwAaQB0AGUAcgBhAHQAdQByAGUAIABhAHIAZQAgAHUAcAAgAHQAbwAgADQAOAAgAHkAcgAsACAAdwBoAGkAYwBoACAAYQBsAGwAbwB3ACAAdQBzACAAdABvACAAaQBuAHYAZQBzAHQAaQBnAGEAdABlACAAdABoAGUAaQByACAAbABvAG4AZwAtAHQAZQByAG0AIABzAHAAaQBuAC0AZABvAHcAbgAgAGgAaQBzAHQAbwByAHkAIABhAG4AZAAgAHQAbwAgAGUAcwB0AGkAbQBhAHQAZQAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAgAGYAbwByACAANgAwACAAcAB1AGwAcwBhAHIAcwAsACAAbwBmACAAdwBoAGkAYwBoACAAMgA0ACAAYQByAGUAIABuAGUAdwBsAHkAIABkAGUAdABlAHIAbQBpAG4AZQBkACAAYQBuAGQAIABtAG8AcwB0ACAAYQByAGUAIABtAGEAagBvAHIAIABpAG0AcAByAG8AdgBlAG0AZQBuAHQAcwAuACAAVABoAGUAIAByAGUAcwB1AGwAdABzACAAYQByAGUAIABjAG8AbgBzAGkAcwB0AGUAbgB0ACAAdwBpAHQAaAAgAGkAbgB0AGUAcgBmAGUAcgBvAG0AZQB0AHIAaQBjACAAbQBlAGEAcwB1AHIAZQBtAGUAbgB0AHMAIABmAHIAbwBtACAAdABoAGUAIABsAGkAdABlAHIAYQB0AHUAcgBlAC4AIABBACAAbQBvAGQAZQBsACAAdwBpAHQAaAAgAHQAdwBvACAARwBhAHUAcwBzAGkAYQBuACAAYwBvAG0AcABvAG4AZQBuAHQAcwAgAGMAZQBuAHQAcgBlAGQAIABhAHQAIAAxADMAOQAgAGEAbgBkACAANAA2ADMAawBtAC8AcwAgAGYAaQB0AHMAIAB0AGgAZQAgAHQAcgBhAG4AcwB2AGUAcgBzAGUAIAB2AGUAbABvAGMAaQB0AHkAIABkAGkAcwB0AHIAaQBiAHUAdABpAG8AbgAgAGIAZQBzAHQALgAgAFQAaABlACAAcAB1AGwAcwBlACAAZAB1AHQAeQAgAGMAeQBjAGwAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGkAbwBuAHMAIABhAHQAIAA1ADAAIABhAG4AZAAgADEAMAAgAHAAZQByACAAYwBlAG4AdAAgAG0AYQB4AGkAbQB1AG0AIABhAHIAZQAgAGIAZQBzAHQAIABkAGUAcwBjAHIAaQBiAGUAZAAgAGIAeQAgAGwAbwBnAG4AbwByAG0AYQBsACAAZABpAHMAdAByAGkAYgB1AHQAaQBvAG4AcwAgAHcAaQB0AGgAIABtAGUAZABpAGEAbgBzACAAbwBmACAAMgAuADMAIABhAG4AZAAgADQALgA0ACAAcABlAHIAIABjAGUAbgB0ACwAIAByAGUAcwBwAGUAYwB0AGkAdgBlAGwAeQAuACAAVwBlACAAZABpAHMAYwB1AHMAcwAgAHQAdwBvACAAcAB1AGwAcwBhAHIAcwAgAHQAaABhAHQAIABlAHgAaABpAGIAaQB0ACAAcwBwAGkAbgAtAGQAbwB3AG4AIAByAGEAdABlACAAYwBoAGEAbgBnAGUAcwAgAGEAbgBkACAAZAByAGkAZgB0AGkAbgBnACAAcwB1AGIAcAB1AGwAcwBlAHMALgAgAEYAaQBuAGEAbABsAHkALAAgAHcAZQAgAGQAZQBzAGMAcgBpAGIAZQAgAHQAaABlACAAYQB1AHQAbwBuAG8AbQBvAHUAcwAgAG8AYgBzAGUAcgB2AGkAbgBnACAAcwB5AHMAdABlAG0AIABhAG4AZAAgAHQAaABlACAAZAB5AG4AYQBtAGkAYwAgAHMAYwBoAGUAZAB1AGwAZQByACAAdABoAGEAdAAgAGgAYQBzACAAaQBuAGMAcgBlAGEAcwBlAGQAIAB0AGgAZQAgAG8AYgBzAGUAcgB2AGkAbgBnACAAZQBmAGYAaQBjAGkAZQBuAGMAeQAgAGIAeQAgAGEAIABmAGEAYwB0AG8AcgAgAG8AZgAgADIALQAzACAAaQBuACAAYwBvAG0AcABhAHIAaQBzAG8AbgAgAHcAaQB0AGgAIABzAHQAYQB0AGkAYwAgAHMAYwBoAGUAZAB1AGwAaQBuAGcALgAAADVodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9NTlJBUy80ODQvMzY5MQAAAPUASgBhAG4AawBvAHcAcwBrAGkAIABGAC4AOwAgAEIAYQBpAGwAZQBzACAATQAuADsAIABWAGEAbgAgAFMAdAByAGEAdABlAG4AIABXAC4AOwAgAEsAZQBhAG4AZQAgAEUALgBGAC4AOwAgAEYAbAB5AG4AbgAgAEMALgA7ACAAQgBhAHIAcgAgAEUALgBEAC4AOwAgAEIAYQB0AGUAbQBhAG4AIABUAC4AOwAgAEIAaABhAG4AZABhAHIAaQAgAFMALgA7ACAAQwBhAGwAZQBiACAATQAuADsAIABDAGEAbQBwAGIAZQBsAGwALQBXAGkAbABzAG8AbgAgAEQALgA7ACAARgBhAHIAYQBoACAAVwAuADsAIABHAHIAZQBlAG4AIABBAC4ASgAuADsAIABIAHUAbgBzAHQAZQBhAGQAIABSAC4AVwAuADsAIABKAGEAbQBlAHMAbwBuACAAQQAuADsAIABPAHMAbABvAHcAcwBrAGkAIABTAC4AOwAgAFAAYQByAHQAaABhAHMAYQByAGEAdABoAHkAIABBAC4AOwAgAFIAbwBzAGEAZABvACAAUAAuAEEALgA7ACAAVgBlAG4AawBhAHQAcgBhAG0AYQBuACAASwByAGkAcwBoAG4AYQBuACAAVgAuAAAAB2NhdGFsb2cAAAAHYmliY29kZQAAABMAMgAwADEAOQBNAE4AUgBBAFMALgA0ADgANAAuADMANgA5ADEASn/AAAAAAAAFcmFkaW8AAAF0aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzQ4NC8zNjkxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1KL01OUkFTLzQ4NC8zNjkxOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ4NC8zNjkxL3RhYmxlYjI/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzQ4NC8zNjkxL3RhYmxlYjE/AAAAkGl2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaAAAAHl2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwAAAARXN0ZDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OnN0ZDo6OnB5IFZPIHNlcDo6OnN0ZAAAACFpdm86Ly9jZHMudml6aWVyL2ovbW5yYXMvNTAxLzExMTYAAAARdnM6Y2F0YWxvZ3NlcnZpY2UAAAAQSi9NTlJBUy81MDEvMTExNgAAACMARwBBAEkAQQAgAHAAdQBsAHMAYQByAHMAIABhAG4AZAAgAHcAaABlAHIAZQAgAHQAbwAgAGYAaQBuAGQAIAB0AGgAZQBtAAAACHJlc2VhcmNoAAAGYwBXAGgAaQBsAGUAIAB0AGgAZQAgAG0AYQBqAG8AcgBpAHQAeQAgAG8AZgAgAG0AYQBzAHMAaQB2AGUAIABzAHQAYQByAHMAIABoAGEAdgBlACAAYQAgAHMAdABlAGwAbABhAHIAIABjAG8AbQBwAGEAbgBpAG8AbgAsACAAbQBvAHMAdAAgAHAAdQBsAHMAYQByAHMAIABhAHAAcABlAGEAcgAgAHQAbwAgAGIAZQAgAGkAcwBvAGwAYQB0AGUAZAAuACAAVABhAGsAZQBuACAAYQB0ACAAZgBhAGMAZQAgAHYAYQBsAHUAZQAsACAAdABoAGkAcwAgAHMAdQBnAGcAZQBzAHQAcwAgAHQAaABhAHQAIABtAG8AcwB0ACAAbQBhAHMAcwBpAHYAZQAgAGIAaQBuAGEAcgBpAGUAcwAgAGIAcgBlAGEAawAgAGEAcABhAHIAdAAgAGQAdQBlACAAdABvACAAcwB0AHIAbwBuAGcAIABuAGEAdABhAGwAIABrAGkAYwBrAHMAIAByAGUAYwBlAGkAdgBlAGQAIABpAG4AIABzAHUAcABlAHIAbgBvAHYAYQAgAGUAeABwAGwAbwBzAGkAbwBuAHMALgAgAEgAbwB3AGUAdgBlAHIALAAgAHQAaABlACAAbwBiAHMAZQByAHYAZQBkACAAYgBpAG4AYQByAHkAIABmAHIAYQBjAHQAaQBvAG4AIABjAGEAbgAgAHMAdABpAGwAbAAgAGIAZQAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIABzAHQAcgBvAG4AZwAgAHMAZQBsAGUAYwB0AGkAbwBuACAAZQBmAGYAZQBjAHQAcwAsACAAYQBzACAAbQBvAG4AaQB0AG8AcgBpAG4AZwAgAG8AZgAgAG4AZQB3AGwAeQAgAGQAaQBzAGMAbwB2AGUAcgBlAGQAIABwAHUAbABzAGEAcgBzACAAaQBzACAAcgBhAHIAZQBsAHkAIABjAGEAcgByAGkAZQBkACAAbwB1AHQAIABmAG8AcgAgAGwAbwBuAGcAIABlAG4AbwB1AGcAaAAgAHQAbwAgAGMAbwBuAGMAbAB1AHMAaQB2AGUAbAB5ACAAcgB1AGwAZQAgAG8AdQB0ACAAbQB1AGwAdABpAHAAbABpAGMAaQB0AHkALgAgAEgAZQByAGUALAAgAHcAZQAgAHUAcwBlACAAdABoAGUAIABzAGUAYwBvAG4AZAAgAEcAYQBpAGEAIABkAGEAdABhACAAcgBlAGwAZQBhAHMAZQAgAHQAbwAgAHMAZQBhAHIAYwBoACAAZgBvAHIAIABjAG8AbQBwAGEAbgBpAG8AbgBzACAAdABvACAAMQA1ADMANAAgAHIAbwB0AGEAdABpAG8AbgAtAHAAbwB3AGUAcgBlAGQAIABwAHUAbABzAGEAcgBzACAAdwBpAHQAaAAgAHAAbwBzAGkAdABpAG8AbgBzACAAawBuAG8AdwBuACAAdABvACAAYgBlAHQAdABlAHIAIAB0AGgAYQBuACAAMAAuADUAYQByAGMAcwBlAGMALgAgAFcAZQAgAGYAaQBuAGQAIAAyADIAIABtAGEAdABjAGgAZQBzACAAdABvACAAawBuAG8AdwBuACAAcAB1AGwAcwBhAHIAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIAAxACAAbgBvAHQAIAByAGUAcABvAHIAdABlAGQAIABlAGwAcwBlAHcAaABlAHIAZQAsACAAYQBuAGQAIAA4ACAAbgBlAHcAIABwAG8AcwBzAGkAYgBsAGUAIABjAG8AbQBwAGEAbgBpAG8AbgBzACAAdABvACAAeQBvAHUAbgBnACAAcAB1AGwAcwBhAHIAcwAuACAAVwBlACAAZQB4AGEAbQBpAG4AZQAgAHQAaABlACAAcABoAG8AdABvAG0AZQB0AHIAaQBjACAAYQBuAGQAIABrAGkAbgBlAG0AYQB0AGkAYwAgAHAAcgBvAHAAZQByAHQAaQBlAHMAIABvAGYAIAB0AGgAZQBzAGUAIABzAHkAcwB0AGUAbQBzACAAYQBuAGQAIABwAHIAbwB2AGkAZABlACAAZQBtAHAAaQByAGkAYwBhAGwAIAByAGUAbABhAHQAaQBvAG4AcwAgAGYAbwByACAAaQBkAGUAbgB0AGkAZgB5AGkAbgBnACAARwBhAGkAYQAgAHMAbwB1AHIAYwBlAHMAIAB3AGkAdABoACAAcABvAHQAZQBuAHQAaQBhAGwAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgAgAGMAbwBtAHAAYQBuAGkAbwBuAHMALgAgAE8AdQByACAAcgBlAHMAdQBsAHQAcwAgAGMAbwBuAGYAaQByAG0AIAB0AGgAYQB0ACAAdABoAGUAIABvAGIAcwBlAHIAdgBlAGQAIABtAHUAbAB0AGkAcABsAGkAYwBpAHQAeQAgAGYAcgBhAGMAdABpAG8AbgAgAGkAcwAgAHMAbQBhAGwAbAAuACAASABvAHcAZQB2AGUAcgAsACAAdwBlACAAcwBoAG8AdwAgAHQAaABhAHQAIAB0AGgAZQAgAG4AdQBtAGIAZQByACAAbwBmACAAYgBpAG4AYQByAGkAZQBzACAAYgBlAGwAbwB3ACAAdABoAGUAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIABvAGYAIABHAGEAaQBhACAAYQBuAGQAIAByAGEAZABpAG8AIAB0AGkAbQBpAG4AZwAgAGkAbgAgAG8AdQByACAAcwBhAG0AcABsAGUAIABjAG8AdQBsAGQAIABzAHQAaQBsAGwAIABiAGUAIABzAGkAZwBuAGkAZgBpAGMAYQBuAHQAbAB5ACAAaABpAGcAaABlAHIALgAgAFcAZQAgAGMAbwBuAHMAdAByAGEAaQBuACAAdABoAGUAIABiAGkAbgBhAHIAeQAgAGYAcgBhAGMAdABpAG8AbgAgAG8AZgAgAHkAbwB1AG4AZwAgAHAAdQBsAHMAYQByAHMAIAB0AG8AIABiAGUAIABmAF4AdAByAHUAZQBeAF8AeQBvAHUAbgBnAF8APAA1AC4AMwAoADgALgAzACkAIABwAGUAcgAgAGMAZQBuAHQAIAB1AG4AZABlAHIAIAByAGUAYQBsAGkAcwB0AGkAYwAgACgAYwBvAG4AcwBlAHIAdgBhAHQAaQB2AGUAKQAgAGEAcwBzAHUAbQBwAHQAaQBvAG4AcwAgAGYAbwByACAAdABoAGUAIABiAGkAbgBhAHIAeQAgAHAAcgBvAHAAZQByAHQAaQBlAHMAIABhAG4AZAAgAGMAdQByAHIAZQBuAHQAIABzAGUAbgBzAGkAdABpAHYAaQB0AHkAIAB0AGgAcgBlAHMAaABvAGwAZABzAC4AIABGAG8AcgAgAG0AYQBzAHMAaQB2AGUAIABzAHQAYQByAHMAIAAoAD4AMQAwAE0AXwB7AHMAdQBuAH0AXwApACAAaQBuACAAcABhAHIAdABpAGMAdQBsAGEAcgAsACAAdwBlACAAZgBpAG4AZAAgAGYAXgB0AHIAdQBlAF4AXwBPAEIAXwA8ADMALgA3ACAAcABlAHIAIABjAGUAbgB0ACwAIAB3AGgAaQBjAGgAIABzAGUAdABzACAAYQAgAGYAaQByAG0AIABpAG4AZABlAHAAZQBuAGQAZQBuAHQAIAB1AHAAcABlAHIAIABsAGkAbQBpAHQAIABvAG4AIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAG4AZQB1AHQAcgBvAG4AIABzAHQAYQByACAAbQBlAHIAZwBlAHIAIAByAGEAdABlACwAIAA8AD0ANwAuADIAeAAxADAAXgAtADQAXgAvAHkAcgAuACAATwBuAGcAbwBpAG4AZwAgAGEAbgBkACAAZgB1AHQAdQByAGUAIABwAHIAbwBqAGUAYwB0AHMALAAgAHMAdQBjAGgAIABhAHMAIAB0AGgAZQAgAEMASABJAE0ARQAvAHAAdQBsAHMAYQByACAAcAByAG8AZwByAGEAbQAsACAATQBlAGUAcgBUAGkAbQBlACwAIABIAEkAUgBBAFgALAAgAGEAbgBkACAAdQBsAHQAaQBtAGEAdABlAGwAeQAgAHQAaABlACAAUwBLAEEALAAgAHcAaQBsAGwAIABzAGkAZwBuAGkAZgBpAGMAYQBuAHQAbAB5ACAAaQBtAHAAcgBvAHYAZQAgAHQAaABlAHMAZQAgAGMAbwBuAHMAdAByAGEAaQBuAHQAcwAgAGkAbgAgAHQAaABlACAAZgB1AHQAdQByAGUALgAAADVodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvSi9NTlJBUy81MDEvMTExNgAAAA0AQQBuAHQAbwBuAGkAYQBkAGkAcwAgAEoALgAAAAdjYXRhbG9nAAAAB2JpYmNvZGUAAAATADIAMAAyADEATQBOAFIAQQBTAC4ANQAwADEALgAxADEAMQA2AEF/wAAAAAAABXJhZGlvAAACT2h0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1KL01OUkFTLzUwMS8xMTE2Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPUovTU5SQVMvNTAxLzExMTY6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzUwMS8xMTE2L2NhdGFsb2c/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9KL01OUkFTLzUwMS8xMTE2L2NhdGFsb2c/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy81MDEvMTExNjo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9Si9NTlJBUy81MDEvMTExNgAAANc6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6OgAAAMt2czpwYXJhbWh0dHA6OjpweSBW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OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPVZJSS8xNTY6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9VklJLzE1Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xNTYvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE1Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xNTYvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE1Njo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1WSUkvMTU2Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvVklJLzE1Ni90YWJsZTE/AAABvTo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2gAAAGldnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cAAAAPk6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6OjpzdGQ6OjpweSBWTyBzZXA6OjpzdGQAAAAYaXZvOi8vY2RzLnZpemllci92aWkvMTg5AAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAAB1ZJSS8xODkAAAASAEMAYQB0AGEAbABvAGcAIABvAGYAIABQAHUAbABzAGEAcgBzAAAACHJlc2VhcmNoAAABxQBUAGgAZQAgAGMAYQB0AGEAbABvAGcAdQBlACAAaQBzACAAYQAgAGMAbwBtAHAAaQBsAGEAdABpAG8AbgAgAG8AZgAgAHQAaABlACAAcAByAGkAbgBjAGkAcABhAGwAIABvAGIAcwBlAHIAdgBlAGQAIABwAGEAcgBhAG0AZQB0AGUAcgBzACAAbwBmACAANwAwADYAIABwAHUAbABzAGEAcgBzACAAKAB1AHAAZABhAHQAZQBkACAAZgByAG8AbQAgADUANQA4ACAAcAB1AGwAcwBhAHIAcwAgAGkAbgAgAHQAaABlACAAcAByAGUAdgBpAG8AdQBzACAAdgBlAHIAcwBpAG8AbgApACwAIABpAG4AYwBsAHUAZABpAG4AZwAgAHAAbwBzAGkAdABpAG8AbgBzACwAIAB0AGkAbQBpAG4AZwAgAHAAYQByAGEAbQBlAHQAZQByAHMALAAgAHAAdQBsAHMAZQAgAHcAaQBkAHQAaABzACwAIABmAGwAdQB4ACAAZABlAG4AcwBpAHQAaQBlAHMALAAgAHAAcgBvAHAAZQByACAAbQBvAHQAaQBvAG4AcwAsACAAZABpAHMAdABhAG4AYwBlAHMALAAgAGEAbgBkACAAZABpAHMAcABlAHIAcwBpAG8AbgAsACAAcgBvAHQAYQB0AGkAbwBuACwAIABhAG4AZAAgAHMAYwBhAHQAdABlAHIAaQBuAGcAIABtAGUAYQBzAHUAcgBlAHMALgAgAEkAdAAgAGEAbABzAG8AIABsAGkAcwB0AHMAIAB0AGgAZQAgAG8AcgBiAGkAdABhAGwAIABlAGwAZQBtAGUAbgB0AHMAIABvAGYAIABiAGkAbgBhAHIAeQAgAHAAdQBsAHMAYQByAHMALAAgAGEAbgBkACAAcwBvAG0AZQAgAGMAbwBtAG0AbwBuAGwAeQAgAHUAcwBlAGQAIABwAGEAcgBhAG0AZQB0AGUAcgBzACAAZABlAHIAaQB2AGUAZAAgAGYAcgBvAG0AIAB0AGgAZQAgAGIAYQBzAGkAYwAgAG0AZQBhAHMAdQByAGUAbQBlAG4AdABzAC4AIABVAG4AYwBlAHIAdABhAGkAbgB0AGkAZQBzACAAYQByAGUAIABxAHUAbwB0AGUAZAAgAGYAbwByACAAbQBvAHMAdAAgAHEAdQBhAG4AdABpAHQAaQBlAHMALgAAACxodHRwOi8vY2RzYXJjLnVuaXN0cmEuZnIvY2dpLWJpbi9jYXQvVklJLzE4OQAAACcAVABhAHkAbABvAHIAIABKAC4ASAAuADsAIABNAGEAbgBjAGgAZQBzAHQAZQByACAAUgAuAE4ALgA7ACAATAB5AG4AZQAgAEEALgBHAC4AAAAHY2F0YWxvZwAAAAdiaWJjb2RlAAAAEwAxADkAOQAzAEEAcABKAFMALgAuAC4AOAA4AC4ALgA1ADIAOQBUf8AAAAAAAAVyYWRpbwAABD1odHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xODkvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE4OTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1WSUkvMTg5Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcDo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL2NvbmVzZWFyY2gvVklJLzE4OS90YWJsZTE/Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vVml6aWVSLTI/LXNvdXJjZT1WSUkvMTg5Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vdm90YWJsZT8tc291cmNlPVZJSS8xODk6OjpweSBWTyBzZXA6OjpodHRwOi8vdGFwdml6aWVyLnUtc3RyYXNiZy5mci9UQVBWaXppZVIvdGFwOjo6cHkgVk8gc2VwOjo6aHR0cDovL3Zpemllci51bmlzdHJhLmZyL3Zpei1iaW4vY29uZXNlYXJjaC9WSUkvMTg5L3RhYmxlMT86OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9WaXppZVItMj8tc291cmNlPVZJSS8xODk6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi92b3RhYmxlPy1zb3VyY2U9VklJLzE4OTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly90YXB2aXppZXIudS1zdHJhc2JnLmZyL1RBUFZpemllUi90YXA6OjpweSBWTyBzZXA6OjpodHRwOi8vdml6aWVyLnVuaXN0cmEuZnIvdml6LWJpbi9jb25lc2VhcmNoL1ZJSS8xODkvdGFibGUxPzo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL1ZpemllUi0yPy1zb3VyY2U9VklJLzE4OTo6OnB5IFZPIHNlcDo6Omh0dHA6Ly92aXppZXIudW5pc3RyYS5mci92aXotYmluL3ZvdGFibGU/LXNvdXJjZT1WSUkvMTg5Ojo6cHkgVk8gc2VwOjo6aHR0cDovL3RhcHZpemllci51LXN0cmFzYmcuZnIvVEFQVml6aWVSL3RhcAAAAb1pdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL2NvbmVzZWFyY2g6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojo6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvdGFwI2F1eDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC9jb25lc2VhcmNoOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6aXZvOi8vaXZvYS5uZXQvc3RkL3RhcCNhdXg6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Ojo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4AAABpXZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2cjp3ZWJicm93c2VyOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnM6cGFyYW1odHRwOjo6cHkgVk8gc2VwOjo6dnI6d2ViYnJvd3Nlcjo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXI6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHA6OjpweSBWTyBzZXA6Ojp2czpwYXJhbWh0dHAAAAD5c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6Ojo6cHkgVk8gc2VwOjo6c3RkAAAAHWl2bzovL25hc2EuaGVhc2FyYy9hdG5mcHVsc2FyAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAABEFUTkYAAAATAEEAVABOAEYAIABQAHUAbABzAGEAcgAgAEMAYQB0AGEAbABvAGcAAAAIcmVzZWFyY2gAAAnTAFQAaABlACAAQQB1AHMAdAByAGEAbABpAGEAIABUAGUAbABlAHMAYwBvAHAAZQAgAE4AYQB0AGkAbwBuAGEAbAAgAEYAYQBjAGkAbABpAHQAeQAgACgAQQBUAE4ARgApACAAUAB1AGwAcwBhAHIAIABDAGEAdABhAGwAbwBnACAAaQBzACAAYQAgAGMAYQB0AGEAbABvAGcAIABvAGYAIABrAG4AbwB3AG4AIABwAHUAbABzAGEAcgBzACAAYwBvAG0AcABpAGwAZQBkACAAYgB5ACAAUgAuAE4ALgAgAE0AYQBuAGMAaABlAHMAdABlAHIAIABlAHQAIABhAGwALgAgAGEAbgBkACAAaQBzACAAZABlAHMAYwBlAG4AZABlAGQAIABmAHIAbwBtACAAcAB1AGwAcwBhAHIAIABkAGEAdABhAGIAYQBzAGUAIAB1AHMAZQBkACAAZgBvAHIAIAB0AGgAZQAgAHAAYQBwAGUAcgAgACYAcQB1AG8AdAA7AEMAYQB0AGEAbABvAGcAIABvAGYAIAA1ADUAOAAgAFAAdQBsAHMAYQByAHMAJgBxAHUAbwB0ADsAIABiAHkAIABKAC4ASAAuACAAVABhAHkAbABvAHIALAAgAFIALgBOAC4AIABNAGEAbgBjAGgAZQBzAHQAZQByACAAYQBuAGQAIABBAC4ARwAuACAATAB5AG4AZQAgADEAOQA5ADMALAAgAEEAcABKAFMALAAgADgAOAAsACAANQAyADkALQA1ADYAOAAuACAAVABoAGUAIABjAHUAcgByAGUAbgB0ACAAYwBhAHQAYQBsAG8AZwAgAGgAYQBzACAAYgBlAGUAbgAgAHMAdQBwAHAAbABlAG0AZQBuAHQAZQBkACAAYgB5ACAAaQBuAGMAbAB1AHMAaQBvAG4AIABvAGYAIABwAHUAYgBsAGkAcwBoAGUAZAAgAGQAYQB0AGEAIABmAHIAbwBtACAAbQBvAHIAZQAgAHIAZQBjAGUAbgB0ACAAcgBhAGQAaQBvACAAcwB1AHIAdgBlAHkAcwAsACAAaQBuACAAcABhAHIAdABpAGMAdQBsAGEAcgAsACAAdABoAGUAIABQAGEAcgBrAGUAcwAgAE0AdQBsAHQAaQBiAGUAYQBtACAAKABQAE0AKQAgAFAAdQBsAHMAYQByACAAUwB1AHIAdgBlAHkAIAAoAE0AYQBuAGMAaABlAHMAdABlAHIAIABlAHQAIABhAGwALgAgADIAMAAwADEALAAgAE0ATgBSAEEAUwAsACAAMwAyADgALAAgADEANwAtADMANQApACAAWwBhAHYAYQBpAGwAYQBiAGwAZQAgAGEAdAAgAHQAaABlACAASABFAEEAUwBBAFIAQwAgAGEAcwAgAHQAaABlACAAUABNAFAAVQBMAFMAQQBSACAAdABhAGIAbABlAF0AIABhAG4AZAAgAHQAaABlACAAUwB3AGkAbgBiAHUAcgBuAGUAIABJAG4AdABlAHIAbQBlAGQAaQBhAHQAZQAgAEwAYQB0AGkAdAB1AGQAZQAgAFAAdQBsAHMAYQByACAAUwB1AHIAdgBlAHkAIAAoAEUAZAB3AGEAcgBkAHMAIABlAHQAIABhAGwALgAgADIAMAAwADEALAAgAE0ATgBSAEEAUwAsACAAMwAyADYALAAgADMANQA4AC0AMwA3ADQAKQAsACAAYgBvAHQAaAAgAG0AYQBkAGUAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEEAVABOAEYAIABQAGEAcgBrAGUAcwAgADYANAAtAG0AIAByAGEAZABpAG8AIAB0AGUAbABlAHMAYwBvAHAAZQAuACAAQgBpAG4AYQByAHkAIABwAGEAcgBhAG0AZQB0AGUAcgBzACAAZgBvAHIAIABrAG4AbwB3AG4AIABiAGkAbgBhAHIAeQAgAHAAdQBsAHMAYQByAHMAIABhAHIAZQAgAGEAbABzAG8AIABpAG4AYwBsAHUAZABlAGQAIABhAHMAIAB3AGUAbABsACAAYQBzACAAYQBsAGwAIABhAHYAYQBpAGwAYQBiAGwAZQAgAGEAcwB0AHIAbwBtAGUAdAByAGkAYwAgAGEAbgBkACAAcwBwAGkAbgAgAHAAYQByAGEAbQBlAHQAZQByACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAAZgBvAHIAIABhAGwAbAAgAHAAdQBsAHMAYQByAHMALgAgAFQAaABlACAAYwBhAHQAYQBsAG8AZwAgAGkAbgBjAGwAdQBkAGUAcwAgAGEAbABsACAAcAB1AGIAbABpAHMAaABlAGQAIAByAG8AdABhAHQAaQBvAG4ALQBwAG8AdwBlAHIAZQBkACAAcAB1AGwAcwBhAHIAcwAuACAAVAB3AG8AIABzAGUAcABhAHIAYQB0AGUAIABzAG0AYQBsAGwAIABzAHUAYgBzAGUAdABzACAAbwBmACAAcAB1AGwAcwBhAHIAcwAgAGQAZQB0AGUAYwB0AGUAZAAgAG8AbgBsAHkAIABhAHQAIABoAGkAZwBoACAAZQBuAGUAcgBnAGkAZQBzACAAYQByAGUAIABhAGwAcwBvACAAaQBuAGMAbAB1AGQAZQBkACAAaQBuACAAdABoAGUAIABjAHUAcgByAGUAbgB0ACAAdABhAGIAbABlADoAIAB0AGgAZQAgAGYAaQByAHMAdAAgAGcAcgBvAHUAcAAgAGMAbwBtAHAAcgBpAHMAZQBzACAAWAAtAHIAYQB5ACAAYQBuAGQAIABnAGEAbQBtAGEALQByAGEAeQAgAHAAdQBsAHMAYQByAHMAIAB3AGgAaQBjAGgAIABhAHIAZQAgAGEAcABwAGEAcgBlAG4AdABsAHkAIABwAG8AdwBlAHIAZQBkACAAYgB5ACAAcwBwAGkAbgAtAGQAbwB3AG4AIABlAG4AZQByAGcAeQAsACAAYgB1AHQAIAB3AGgAaQBjAGgAIABoAGEAdgBlACAAbgBvAHQAIABiAGUAZQBuACAAZABlAHQAZQBjAHQAZQBkACAAYQB0ACAAcgBhAGQAaQBvACAAdwBhAHYAZQBsAGUAbgBnAHQAaABzACwAIAB3AGgAaQBsAGUAIAB0AGgAZQAgAHMAZQBjAG8AbgBkACAAZwByAG8AdQBwACAAYwBvAG4AdABhAGkAbgBzACAAYQBuAG8AbQBhAGwAbwB1AHMAIABYAC0AcgBhAHkAIABwAHUAbABzAGEAcgBzACAAKABBAFgAUABzACkAIABhAG4AZAAgAHMAbwBmAHQALQBnAGEAbQBtAGEALQByAGEAeQAgAHIAZQBwAGUAYQB0AGUAcgBzACAAKABTAEcAUgBzACkAIABmAG8AcgAgAHcAaABpAGMAaAAgAGMAbwBoAGUAcgBlAG4AdAAgAHAAdQBsAHMAYQB0AGkAbwBuAHMAIABoAGEAdgBlACAAYgBlAGUAbgAgAGQAZQB0AGUAYwB0AGUAZAAuACAAQQBjAGMAcgBlAHQAaQBvAG4ALQBwAG8AdwBlAHIAZQBkACAAcAB1AGwAcwBhAHIAcwAgAHMAdQBjAGgAIABhAHMAIABIAGUAcgAgAFgALQAxACAAYQBuAGQAIAB0AGgAZQAgAHIAZQBjAGUAbgB0AGwAeQAgAGQAaQBzAGMAbwB2AGUAcgBlAGQAIABYAC0AcgBhAHkAIABtAGkAbABsAGkAcwBlAGMAbwBuAGQAIABwAHUAbABzAGEAcgBzACAAcwB1AGMAaAAgAGEAcwAgAFMAQQBYACAASgAxADgAMAA4AC4ANAAtADMANgA1ADgAIABhAHIAZQAgAG4AbwB0ACAAaQBuAGMAbAB1AGQAZQBkACAAaQBuACAAdABoAGkAcwAgAHQAYQBiAGwAZQAsACAAaABvAHcAZQB2AGUAcgAuACAATQBhAG4AeQAgAHAAZQBvAHAAbABlACAAaABhAHYAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAAYwBvAG0AcABpAGwAYQB0AGkAbwBuACAAbwBmACAAdABoAGUAIABkAGEAdABhACAAYwBvAG4AdABhAGkAbgBlAGQAIABpAG4AIAB0AGgAaQBzACAAYwBhAHQAYQBsAG8AZwAgAGEAbgBkACAAdABoAGUAIABkAGEAdABhAGIAYQBzAGUAIAB0AGgAYQB0ACAAaQB0ACAAdwBhAHMAIABkAGUAcgBpAHYAZQBkACAAZgByAG8AbQAuACAAVABoAGUAIABhAHUAdABoAG8AcgBzACAAcABhAHIAdABpAGMAdQBsAGEAcgBsAHkAIAB0AGgAYQBuAGsAIABBAG4AZAByAGUAdwAgAEwAeQBuAGUAIABvAGYAIAB0AGgAZQAgAFUAbgBpAHYAZQByAHMAaQB0AHkAIABvAGYAIABNAGEAbgBjAGgAZQBzAHQAZQByACwAIABKAG8AZAByAGUAbABsACAAQgBhAG4AawAgAE8AYgBzAGUAcgB2AGEAdABvAHIAeQAsACAARABhAHYAaQBkACAATgBpAGMAZQAgAG8AZgAgAFAAcgBpAG4AYwBlAHQAbwBuACAAVQBuAGkAdgBlAHIAcwBpAHQAeQAsACAAYQBuAGQAIABSAHUAcwBzAGUAbABsACAARQBkAHcAYQByAGQAcwAsACAAdABoAGUAbgAgAGEAdAAgAFMAdwBpAG4AYgB1AHIAbgBlACAAVQBuAGkAdgBlAHIAcwBpAHQAeQAgAG8AZgAgAFQAZQBjAGgAbgBvAGwAbwBnAHkALgAgAFQAaABlACAAYQBsAHMAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAFcAYQByAHcAaQBjAGsAIABVAG4AaQB2AGUAcgBzAGkAdAB5ACAAcwB0AHUAZABlAG4AdABzACAAQQBkAGEAbQAgAEcAbwBvAGQAZQAgAGEAbgBkACAAUwB0AGUAdgBlAG4AIABUAGgAbwBtAGEAcwAgAHcAaABvACAAYwBvAG0AcABpAGwAZQBkACAAYQBuAGQAIABjAGgAZQBjAGsAZQBkACAAYQAgAHIAZQBjAGUAbgB0ACAAdgBlAHIAcwBpAG8AbgAgAG8AZgAgAHQAaABlACAAZABhAHQAYQBiAGEAcwBlAC4AIABUAGgAZQAgAG8AcgBpAGcAaQBuAGEAbAAgACgAcwB1AG0AbQBlAHIAIAAyADAAMAAzACkAIABkAGEAdABhAGIAYQBzAGUAIABhAHQAIAB0AGgAZQAgAEEAVABOAEYAIAB3AGUAYgBzAGkAdABlACAAdwBhAHMAIABjAG8AbQBwAGkAbABlAGQAIAB3AGkAdABoACAAdABoAGUAIABpAG4AdgBhAGwAdQBhAGIAbABlACAAYQBzAHMAaQBzAHQAYQBuAGMAZQAgAG8AZgAgAE0AYQByAHkAYQBtACAASABvAGIAYgBzACwAIAB3AGgAaQBsAGUAIAB0AGgAZQAgAEEAVABOAEYAIAB3AGUAYgAgAGkAbgB0AGUAcgBmAGEAYwBlACAAdwBhAHMAIABkAGUAcwBpAGcAbgBlAGQAIABhAG4AZAAgAGMAbwBuAHMAdAByAHUAYwB0AGUAZAAgAGIAeQAgAEEAbABiAGUAcgB0ACAAVABlAG8AaAAsACAAYQAgAFMAdQBtAG0AZQByACAAVgBhAGMAYQB0AGkAbwBuACAAUwBjAGgAbwBsAGEAcgAgAGEAdAAgAHQAaABlACAAQQBUAE4ARgAgAGkAbgAgADIAMAAwADIALwAyADAAMAAzAC4AIABUAGgAZQAgAGEAdQB0AGgAbwByAHMAIAB3AG8AdQBsAGQAIABhAHAAcAByAGUAYwBpAGEAdABlACAAaQBmACAAYQBuAHkAbwBuAGUAIABtAGEAawBpAG4AZwAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAGMAYQB0AGEAbABvAGcAIABpAG4AIABhACAAcAB1AGIAbABpAGMAYQB0AGkAbwBuACAAYQBjAGsAbgBvAHcAbABlAGQAZwBlAHMAIAB0AGgAZQAgAHMAbwB1AHIAYwBlACAAbwBmACAAdABoAGUAaQByACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAAYgB5ACAAcQB1AG8AdABpAG4AZwAgAHQAaABlACAAQQBUAE4ARgAgAFAAdQBsAHMAYQByACAAQwBhAHQAYQBsAG8AZwAgAHcAZQBiAHMAaQB0AGUAIABhAGQAZAByAGUAcwBzACAAbwBmACAAJgBsAHQAOwBhACAAaAByAGUAZgA9ACIAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAdABuAGYALgBjAHMAaQByAG8ALgBhAHUALwByAGUAcwBlAGEAcgBjAGgALwBwAHUAbABzAGEAcgAvAHAAcwByAGMAYQB0AC8AIgAmAGcAdAA7AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAHQAbgBmAC4AYwBzAGkAcgBvAC4AYQB1AC8AcgBlAHMAZQBhAHIAYwBoAC8AcAB1AGwAcwBhAHIALwBwAHMAcgBjAGEAdAAvACYAbAB0ADsALwBhACYAZwB0ADsAAAA6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YvVzNCcm93c2UvYWxsL2F0bmZwdWxzYXIuaHRtbAAAABIATQBhAG4AYwBoAGUAcwB0AGUAcgAsACAAVABhAHkAbABvAHIAAAAHY2F0YWxvZwAAAAAAAAATADIAMAAwADUAQQBKAC4ALgAuAC4AMQAyADkALgAxADkAOQAzAE1/wAAAAAAABXJhZGlvAAABfWh0dHBzOi8vaGVhc2FyYy5nc2ZjLm5hc2EuZ292L2NnaS1iaW4vVzNCcm93c2UvZ2V0dm90YWJsZS5wbD9uYW1lPWF0bmZwdWxzYXI6OjpweSBWTyBzZXA6OjpodHRwczovL2hlYXNhcmMuZ3NmYy5uYXNhLmdvdi94YW1pbi92by9jb25lP3Nob3dvZmZzZXRzJnRhYmxlPWF0bmZwdWxzYXImOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YveGFtaW4vdm8vdGFwOjo6cHkgVk8gc2VwOjo6aHR0cHM6Ly9oZWFzYXJjLmdzZmMubmFzYS5nb3YvY2dpLWJpbi9XM0Jyb3dzZS93M3F1ZXJ5LnBsP3RhYmxlaGVhZD1uYW1lPWhlYXNhcmNfYXRuZnB1bHNhciZBY3Rpb249TW9yZStPcHRpb25zJkFjdGlvbj1QYXJhbWV0ZXIrU2VhcmNoJkNvbmVBZGQ9MQAAAGQ6OjpweSBWTyBzZXA6Ojppdm86Ly9pdm9hLm5ldC9zdGQvY29uZXNlYXJjaDo6OnB5IFZPIHNlcDo6Oml2bzovL2l2b2EubmV0L3N0ZC90YXAjYXV4Ojo6cHkgVk8gc2VwOjo6AAAAXnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZzOnBhcmFtaHR0cDo6OnB5IFZPIHNlcDo6OnZyOndlYmJyb3dzZXIAAAAzOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6c3RkOjo6cHkgVk8gc2VwOjo6AAAAHWl2bzovL25hc2EuaGVhc2FyYy9mZXJtaWwycHNyAAAAEXZzOmNhdGFsb2dzZXJ2aWNlAAAACkZFUk1JTDJQU1IAAAAzAEYAZQByAG0AaQAgAEwAQQBUACAAUwBlAGMAbwBuAGQAIABDAGEAdABhAGwAbwBnACAAbwBmACAARwBhAG0AbQBhAC0AUgBhAHkAIABQAHUAbABzAGEAcgBzACAAKAAyAFAAQwApAAAACHJlc2VhcmNoAAAC0QBUAGgAaQBzACAAYwBhAHQAYQBsAG8AZwAgAHMAdQBtAG0AYQByAGkAegBlAHMAIAAwAC4AMQAgAEcAZQBWACAAZwBhAG0AbQBhAC0AcgBhAHkAIABwAHUAbABzAGEAcgAgAGQAZQB0AGUAYwB0AGkAbwBuAHMAIAB1AHMAaQBuAGcAIABkAGEAdABhACAAYQBjAHEAdQBpAHIAZQBkACAAYgB5ACAAdABoAGUAIABMAGEAcgBnAGUAIABBAHIAZQBhACAAVABlAGwAZQBzAGMAbwBwAGUAIAAoAEwAQQBUACkAIABvAG4AIAB0AGgAZQAgAEYAZQByAG0AaQAgAHMAYQB0AGUAbABsAGkAdABlAC4AIABUAGgAZQBzAGUAIABwAHUAbABzAGEAcgBzACAAYQByAGUAIABuAGUAdQB0AHIAbwBuACAAcwB0AGEAcgBzACAAaQBkAGUAbgB0AGkAZgBpAGUAZAAgAHUAcwBpAG4AZwAgAEwAQQBUACAAZABhAHQAYQAgAHQAaAByAG8AdQBnAGgAIABwAGUAcgBpAG8AZABpAGMAaQB0AHkAIABzAGUAYQByAGMAaABlAHMAIABpAG4AIABnAGEAbQBtAGEALQByAGEAeQAgAGEAbgBkACAAcgBhAGQAaQBvACAAZABhAHQAYQAgAGEAcgBvAHUAbgBkACAATABBAFQAIAB1AG4AYQBzAHMAbwBjAGkAYQB0AGUAZAAgAHMAbwB1AHIAYwBlACAAcABvAHMAaQB0AGkAbwBuAHMALgAgAFQAaABlACAAYwBhAHQAYQBsAG8AZwB1AGUAZAAgAHAAdQBsAHMAYQByAHMAIABhAHIAZQAgAGQAaQB2AGkAZABlAGQAIABpAG4AdABvACAAdABoAHIAZQBlACAAZwByAG8AdQBwAHMAOgAgAG0AaQBsAGwAaQBzAGUAYwBvAG4AZAAgAHAAdQBsAHMAYQByAHMALAAgAHkAbwB1AG4AZwAgAHIAYQBkAGkAbwAtAGwAbwB1AGQAIABwAHUAbABzAGEAcgBzACwAIABhAG4AZAAgAHkAbwB1AG4AZwAgAHIAYQBkAGkAbwAtAHEAdQBpAGUAdAAgAHAAdQBsAHMAYQByAHMALgAgAFQAaABpAHMAIABjAGEAdABhAGwAbwBnACAAcwB1AG0AbQBhAHIAaQB6AGUAcwAgAHIAZQBzAHUAbAB0AHMAIABvAGYAIAB0AGgAZQAgAGEAbgBhAGwAeQBzAGkAcwAgAG8AZgAgAHAAdQBsAHMAZQAgAHAAcgBvAGYAaQBsAGUAcwAgAGEAbgBkACAAZQBuAGUAcgBnAHkAIABzAHAAZQBjAHQAcgBhACwAIABhAG4AZAAgAGEAbgBhAGwAeQBzAGkAcwAgAG8AZgAgAHQAaABlACAAbwBmAGYALQBwAGUAYQBrACAAcABoAGEAcwBlACAAaQBuAHQAZQByAHYAYQBsAHMALAAgAGEA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IAB5AG8AdQBuAGcAIABhAG4AZAAvAG8AcgAgAHMAaABvAHIAdAAtAHAAZQByAGkAbwBkAC4AIABUAGgAaQBzACAAcwB1AHIAdgBlAHkAIABpAHMAIABhACAAZgBhAGMAdABvAHIAIABvAGYAIAA3ACAAdABpAG0AZQBzACAAbQBvAHIAZQAgAHMAZQBuAHMAaQB0AGkAdgBlACAAdABvACAAeQBvAHUAbgBnACAAYQBuAGQAIABkAGkAcwB0AGEAbgB0ACAAcAB1AGwAcwBhAHIAcwAgAHQAaABhAG4AIAB0AGgAYQB0ACAAbwBmACAASgBvAGgAbgBzAHQAbwBuACAAZQB0ACAAYQBsAC4AIAAoADEAOQA5ADIALAAgAE0ATgBSAEEAUwAsACAAMgA1ADUALAAgADQAMAAxACkAIAB3AGgAaQBjAGgAIABkAGUAdABlAGMAdABlAGQAIAAxADAAMAAgAHAAdQBsAHMAYQByAHMALgAgAFQAaABlACAAcAByAGUAcwBlAG4AdAAgAHMAbwB1AHIAYwBlACAAbABpAHMAdAAgAGMAbwBuAHQAYQBpAG4AcwAgAHAAdQBsAHMAYQByAHMAIAB0AGgAYQB0ACAAaABhAHYAZQAgAGIAZQBlAG4AIABuAGUAdwBsAHkAIABkAGkAcwBjAG8AdgBlAHIAZQBkACAAaQBuACAAdABoAGUAIABjAG8AdQByAHMAZQAgAG8AZgAgAHQAaABpAHMAIABzAHUAcgB2AGUAeQAuACAAVABoAGUAIABQAE0AIABTAHUAcgB2AGUAeQAgAGkAcwAgAHMAcABlAGMAaQBmAGkAYwBhAGwAbAB5ACAAdABhAHIAZwBlAHQAZQBkACAAZgBvAHIAIAAoAGkAKQAgAG8AYgBzAGMAdQByAGUAZAAgAHIAZQBnAGkAbwBuAHMAIABvAGYAIAB0AGgAZQAgAEcAYQBsAGEAYwB0AGkAYwAgAHAAbABhAG4AZQAsACAAKABpAGkAKQAgAHkAbwB1AG4AZwAgAHAAdQBsAHMAYQByAHMALABhAG4AZAAgACgAaQBpAGkAKQAgAGIAaQBuAGEAcgB5ACAAcAB1AGwAcwBhAHIAcwAgAHcAaQB0AGgAIABtAGEAcwBzAGkAdgBlACAAYwBvAG0AcABhAG4AaQBvAG4AcwAuACAAQQBzACAAbwBmACAAQQB1AGcAdQBzAHQAIAAxADkAOQA5ACwAIABhAG4AYQBsAHkAcwBpAHMAIABvAGYAIABhAGIAbwB1AHQAIAA1ADAAJQAgAG8AZgAgAHQAaABlACAAdABvAHQAYQBsACAAZQB4AHAAZQBjAHQAZQBkACAAZABhAHQAYQAgAHQAbwAgAGIAZQAgAGMAbwBsAGwAZQBjAHQAZQBkACAAaABhAHMAIAByAGUAcwB1AGwAdABlAGQAIABpAG4AIAB0AGgAZQAgAGMAbwBuAGYAaQByAG0AZQBkACAAZABlAHQAZQBjAHQAaQBvAG4AIABvAGYAIABvAHYAZQByACAANAAwADAAIABuAGUAdwAgAHAAdQBsAHMAYQByAHMAIAAoAGEAbgAgAGkAbgBjAHIAZQBhAHMAZQAgAG8AZgAgAG0AbwByAGUAIAB0AGgAYQBuACAANQAwACUAIABvAGYAIAB0AGgAZQAgAGsAbgBvAHcAbgAgAHAAbwBwAHUAbABhAHQAaQBvAG4AKQAuACAASABlAHIAZQAgAGEAcgBlACAAcwBvAG0AZQAgAG8AZgAgAHQAaABlACAAZgBlAGEAdAB1AHIAZQBzACAAbwBmACAAdABoAGUAIABQAE0AIABTAHUAcgB2AGUAeQA6ACAAJgBsAHQAOwBwAHIAZQAmAGcAdAA7ACAAUwB1AHIAdgBlAHkAIABBAHIAZQBhADoAIAAtADIANgAwACAAJgBsAHQAOwAgAGwAIAAmAGwAdAA7ACAANQAwACAAZABlAGcAIAAsACAALQA1ACAAJgBsAHQAOwAgAGIAIAAmAGwAdAA7ACAANQAgAGQAZQBnACAAQwBlAG4AdABlAHIAIABGAHIAZQBxAHUAZQBuAGMAeQA6ACAAMQAzADcANAAgAE0ASAB6ACAAQgBhAG4AZAB3AGkAZAB0AGgAOgAgADIAOAA4ACAATQBIAHoAIAAoADkANgAgAGMAaABhAG4AbgBlAGwAcwAgAHgAIAAzACAATQBIAHoAIABwAGUAcgAgAGMAaABhAG4AbgBlAGwAIAB4ACAAMgAgAHAAbwBsAGEAcgBpAHoAYQB0AGkAbwBuAHMAKQAgAFMAYQBtAHAAbABpAG4AZwAgAFIAYQB0AGUAOgAgADAALgAyADUAIABtAHMAIAB4ACAAMQAgAGIAaQB0ACAA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 \ No newline at end of file diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index 8ab361ea7..55f15ed96 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -36,6 +36,17 @@ def callback(request, context): yield matcher +# to update this, run +# import requests +# from pyvo.registry import regtap +# +# with open("data/regtap.xml", "wb") as f: +# f.write(requests.get(regtap.REGISTRY_BASEURL+"/sync", { +# "LANG": "ADQL", +# "QUERY": regtap.get_RegTAP_query( +# keywords="pulsar", ucd=["pos.distance"])}).content) + + @pytest.fixture() def regtap_pulsar_distance_response(mocker): with mocker.register_uri( @@ -304,6 +315,23 @@ def rt_pulsar_distance(regtap_pulsar_distance_response, capabilities): return regsearch(keywords="pulsar", ucd=["pos.distance"]) +def test_record_fields(rt_pulsar_distance): + rec = rt_pulsar_distance["VII/156"] + assert rec.ivoid=="ivo://cds.vizier/vii/156" + assert rec.res_type=="vs:catalogservice" + assert rec.short_name=="VII/156" + assert rec.res_title=="Catalog of 558 Pulsars" + assert rec.content_levels==['research'] + assert rec.res_description[:20]=="The catalogue is an up-to-date"[:20] + assert rec.reference_url=="http://cdsarc.unistra.fr/cgi-bin/cat/VII/156" + assert rec.creators==['Taylor J.H.', ' Manchester R.N.', ' Lyne A.G.'] + assert rec.content_types==['catalog'] + assert rec.source_format=="bibcode" + assert rec.source_value=="1993ApJS...88..529T" + assert rec.waveband==['radio'] + # access URL, standard_id and friends exercised in TestInterfaceSelection + + class TestResultIndexing: def test_get_with_index(self, rt_pulsar_distance): # this is expecte to break when the fixture is updated diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index 8d3bbf572..eef01be27 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -119,7 +119,8 @@ def test_junk_rejected(self): rtcons.Servicetype("junk") assert str(excinfo.value) == ("Service type junk is neither" " a full standard URI nor one of the bespoke identifiers" - " image, sia, spectrum, ssap, scs, line, table, tap") + " image, sia, spectrum, ssap, ssa, scs, conesearch, line, slap," + " table, tap") def test_legacy_term(self): assert (rtcons.Servicetype("conesearch").get_search_condition() @@ -365,6 +366,7 @@ def test_expected_columns(self): "creator_seq, " "content_type, " "source_format, " + "source_value, " "region_of_regard, " "waveband, " "\n ivo_string_agg(COALESCE(access_url, ''), ':::py VO sep:::') AS access_urls, " @@ -387,5 +389,6 @@ def test_group_by_columns(self): "creator_seq, " "content_type, " "source_format, " + "source_value, " "region_of_regard, " "waveband") From 293be2351529c78cd42530bdc92fa236de85816c Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Mon, 24 Jan 2022 10:56:36 +0100 Subject: [PATCH 37/49] Adding an origin attribute to VOSI tables coming from RegistryResource. This points back to the parent instance. This is an attempt to address https://github.com/astropy/pyvo/pull/289#issuecomment-1018514188 --- pyvo/registry/regtap.py | 6 +++++- pyvo/registry/tests/test_regtap.py | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 696360ded..e8262fe54 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -755,6 +755,9 @@ def _build_vosi_table(self, table_row, columns): res._columns = [ self._build_vosi_column(row) for row in columns] + + res.origin = self + return res def get_tables(self, table_limit=20): @@ -763,7 +766,8 @@ def get_tables(self, table_limit=20): This returns a dict with table names as keys and vosi.Table objects as values (pretty much what tables returns for a TAP - service). + service). The table instances will have an ``origin`` attribute + pointing back to the registry record. Note that not only TAP services can (and do) define table structures. The meaning of non-TAP tables is not always diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index 55f15ed96..680fa7fa0 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -611,6 +611,9 @@ def test_get_tables_table_instance(self, flash_tables): assert (flash_tables["flashheros.data"].title == "Flash/Heros SSA table") + assert (flash_tables["flashheros.data"].origin.ivoid + == "ivo://org.gavo.dc/flashheros/q/ssa") + @pytest.mark.remote_data def test_get_tables_column_meta(self, flash_tables): def getflashcol(name): From fb750ccdc5c9b940d389f97ad6ba8ab6059d9e02 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Wed, 26 Jan 2022 09:38:32 +0100 Subject: [PATCH 38/49] Minor editorial changes, mainly to documentation. Also, adding a __repr__ method to regtap.Interface that returns a constructor call literal. This is in response to https://github.com/astropy/pyvo/pull/289#pullrequestreview-863047339 --- docs/registry/index.rst | 3 ++- pyvo/registry/regtap.py | 4 ++++ pyvo/registry/rtcons.py | 8 ++++++-- pyvo/registry/tests/test_regtap.py | 10 ++++++++++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/docs/registry/index.rst b/docs/registry/index.rst index 784febf0e..0ffd7f09f 100644 --- a/docs/registry/index.rst +++ b/docs/registry/index.rst @@ -44,7 +44,8 @@ keyword arguments. The following constraints are available: freetext words, mached in the title, description or subject of the resource. * :py:class:`pyvo.registry.Servicetype` (``servicetype``): constrain to - one of tap, ssa, sia, conesearch. This is the constraint you want + one of tap, ssa, sia, conesearch (or full ivoids for other service + types). This is the constraint you want to use for service discovery. * :py:class:`pyvo.registry.UCD` (``ucd``): constrain by one or more UCD patterns; resources match when they serve columns having a matching diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index e8262fe54..df72644e8 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -272,6 +272,10 @@ def __init__(self, access_url, standard_id, intf_type, intf_role): self.role = intf_role or None self.is_standard = self.role=="std" + def __repr__(self): + return (f"Interface({self.access_url!r}, {self.standard_id!r}," + f" {self.type!r}, {self.role!r})") + def to_service(self): if self.type=="vr:webbrowser": return _BrowserService(self.access_url) diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 8ca0991f2..9cae64074 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -494,16 +494,19 @@ class Spatial(Constraint): >>> registry.Spatial([23, -40, 26, -39, 25, -43]) - To find resources claiming to cover a MOC, pass an ASCII MOC:: + To find resources claiming to cover a MOC_, pass an ASCII MOC:: >>> registry.Spatial("0/1-3 3/") + .. _MOC: https://www.ivoa.net/documents/MOC/ + When you already have an astropy SkyCoord:: >>> from astropy.coordinates import SkyCoord >>> registry.Spatial(SkyCoord("23d +3d")) - SkyCoords also work as circle centers:: + SkyCoords also work as circle centers (plain floats for the radius + are interpreted in degrees):: >>> registry.Spatial((SkyCoord("23d +3d"), 3)) """ @@ -609,6 +612,7 @@ def __init__(self, spec): a frequency, or an energy, or a pair of such quantities, in which case the argument is interpreted as an interval. All resources *overlapping* the interval are returned. + Plain floats are interpreted as messenger energy in Joule. """ if isinstance(spec, tuple): self._fillers = { diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index 680fa7fa0..743d81e80 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -208,6 +208,16 @@ def test_basic(self): assert intf.is_standard == False assert not intf.is_vosi + def test_repr(self): + intf = regtap.Interface("http://example.org", "ivo://gavo/std/a", + "vs:paramhttp", "std") + assert (repr(intf) == "Interface('http://example.org'," + " 'ivo://gavo/std/a', 'vs:paramhttp', 'std')") + intf = regtap.Interface("http://example.org", "ivo://gavo/std/a", + None, None) + assert repr(intf) == ("Interface('http://example.org'," + " 'ivo://gavo/std/a', None, None)") + def test_unknown_standard(self): intf = regtap.Interface("http://example.org", "ivo://gavo/std/a", "vs:paramhttp", "std") From 10452ec638a85a6fb007a3f3927fea1b65e5e324 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Thu, 27 Jan 2022 09:05:02 +0100 Subject: [PATCH 39/49] Renaming previous RegistryResults.to_table to get_summary. This is because overwriting DALResults.to_table proved a bad idea (see https://github.com/astropy/pyvo/pull/289#issuecomment-1022033485) --- pyvo/registry/regtap.py | 2 +- pyvo/registry/tests/test_regtap.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index df72644e8..0fb5754f2 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -178,7 +178,7 @@ def getrecord(self, index): """ return RegistryResource(self, index) - def to_table(self): + def get_summary(self): """ returns a brief overview of the matched results as an astropy table. diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index 743d81e80..bbf770034 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -309,7 +309,7 @@ def test_spectral(): def test_to_table(multi_interface_fixture, capabilities): t = regtap.search( - ivoid="ivo://org.gavo.dc/flashheros/q/ssa").to_table() + ivoid="ivo://org.gavo.dc/flashheros/q/ssa").get_summary() assert (set(t.columns.keys()) == {'index', 'short_name', 'title', 'description', 'interfaces'}) assert t["index"][0] == 0 From 1b5a2e1406cbd358a47c780d4ca8fba6fe785fc5 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Mon, 21 Feb 2022 14:35:45 +0100 Subject: [PATCH 40/49] Fixing a TODO linking from the search docstring to the constraint list. --- pyvo/registry/regtap.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index 0fb5754f2..f864416a9 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -101,11 +101,12 @@ def search(*constraints:rtcons.Constraint, includeaux=False, **kwargs): """ execute a simple query to the RegTAP registry. - Parameters - ---------- The function accepts query constraints either as Constraint objects passed in as positional arguments or as their associated keywords. - For what constraints are available, see TODO. + For what constraints are available, see + `Basic Interface`_. + + .. _Basic Interface: ../registry/index.html#basic-interface The values of keyword arguments may be tuples or lists when the associated Constraint objects take multiple arguments. @@ -113,11 +114,22 @@ def search(*constraints:rtcons.Constraint, includeaux=False, **kwargs): All constraints, whether passed in directly or via keywords, are evaluated as a conjunction (i.e., in an AND clause). + Parameters + ---------- + *constraints : `rtcons.Constraint` instances + The constraints (keywords to match, positions to cover, ...) + that the returned records need to satisfy. + includeaux : bool Flag for whether to include auxiliary capabilities in results. This may result in duplicate capabilities being returned, especially if the servicetype is not specified. + **kwargs : strings, mostly + shorthands for `constraints`; see the documentation of + a specific constraint for what keyword it uses and what literal + it expects. + Returns ------- RegistryResults From b3ba96de066e5a472defde863d4289d8aed3931a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brigitta=20Sip=C5=91cz?= Date: Wed, 1 Jun 2022 12:22:20 -0700 Subject: [PATCH 41/49] Fixing new narrative docs examples with remote-data or skip directives --- docs/registry/index.rst | 104 +++++++++++++++++++++++++++------------- 1 file changed, 72 insertions(+), 32 deletions(-) diff --git a/docs/registry/index.rst b/docs/registry/index.rst index 0ffd7f09f..b62724ebe 100644 --- a/docs/registry/index.rst +++ b/docs/registry/index.rst @@ -79,25 +79,36 @@ though). Also refer to the class documentation for further caveats on these. Hence, to look for for resources with UV data mentioning white dwarfs -you could either run:: +you could either run: - >>> registry.search(keywords="white dwarf", waveband="UV") +.. doctest-remote-data:: + + >>> resources = registry.search(keywords="white dwarf", waveband="UV") or:: - >>> registry.search(registry.Fulltext("white dwarf"), - ... registry.Waveband("UV")) +.. This one fails, fix (change skip to remote-data) or remove it. +.. doctest-skip:: + + >>> resources = registry.search(registry.Fulltext("white dwarf"), + ... registry.Waveband("UV")) or a mixture between the two. Constructing using explicit constraints is generally preferable with more complex queries. Where the constraints accept multiple arguments, you can pass in sequences to -the keyword arguments; for instance:: +the keyword arguments; for instance: + +.. This one fails, fix (change skip to remote-data) or remove it. +.. doctest-skip:: - >>> registry.search(registry.Waveband("Radio", "Submillimeter")) + >>> resources = registry.search(registry.Waveband("Radio", "Submillimeter")) -is equivalent to:: +is equivalent to: - >>> registry.search(waveband=["Radio", "Submillimeter"]) +.. This one fails, fix (change skip to remote-data) or remove it. +.. doctest-skip:: + + >>> resources = registry.search(waveband=["Radio", "Submillimeter"]) There is also :py:meth:`pyvo.registry.get_RegTAP_query`, accepting the same arguments as :py:meth:`pyvo.registry.search`. This function simply @@ -112,24 +123,28 @@ Data Discovery In data discovery, you look for resources matching your constraints and then figure out in a second step how to query them. For instance, to look for resources giving redshifts in connection with supernovae, -you would say:: +you would say: + +.. doctest-remote-data:: >>> resources = registry.search(registry.UCD("src.redshift"), - ... registry.Freetext("supernova")) + ... registry.Freetext("supernova")) After that, ``resources`` is an instance of :py:class:`pyvo.registry.RegistryResults`, which you can iterate over. In interactive data discovery, however, it is usually preferable to use the -``to_table`` method for an overview of the resources available:: +``to_table`` method for an overview of the resources available: - >>> resources.to_table() +.. doctest-remote-data:: + + >>> resources.to_table() # doctest: +IGNORE_OUTPUT - index title ... interfaces - int32 str67 ... str24 - ----- --------------------------------------------------------------- ... ------------------------ - 0 Asiago Supernova Catalogue (Barbon et al., 1999-) ... conesearch, tap#aux, web - 1 Asiago Supernova Catalogue (Version 2008-Mar) ... conesearch, tap#aux, web - 2 Sloan Digital Sky Survey-II Supernova Survey (Sako+, 2018) ... conesearch, tap#aux, web + title ... interfaces + str67 ... str24 + --------------------------------------------------------------- ... ------------------------ + Asiago Supernova Catalogue (Barbon et al., 1999-) ... conesearch, tap#aux, web + Asiago Supernova Catalogue (Version 2008-Mar) ... conesearch, tap#aux, web + Sloan Digital Sky Survey-II Supernova Survey (Sako+, 2018) ... conesearch, tap#aux, web ... @@ -148,9 +163,11 @@ constraint). Use the ``get_service`` method of :py:class:`pyvo.registry.RegistryResource` to obtain a DAL service object for a particular sort of interface. To query the fourth match using simple cone search, you would -thus say:: +thus say: + +.. doctest-remote-data:: - >>> resources[4].get_service("conesearch").search(pos=(120, 73), sr=1) + >>> resources[4].get_service("conesearch").search(pos=(120, 73), sr=1) # doctest: +IGNORE_OUTPUT
_r recno SN r_SN z sI e_sI t1 e_t1 I1 e_I1 t2 e_t2 I2 e_I2 chi2 N Simbad _RA _DE deg d d mag mag d d mag mag deg deg @@ -162,7 +179,10 @@ thus say:: To operate TAP services, you need to know what tables make up a resource; you could construct a TAP service and access its ``tables`` attribute, but you can take a shortcut and call a RegistryResource's -``get_tables`` method for a rather similar result:: +``get_tables`` method for a rather similar result: + +.. This one fails, fix (change skip to remote-data) or remove it. +.. doctest-skip:: >>> tables = resources[4].get_tables() >>> list(tables.keys()) @@ -171,7 +191,9 @@ attribute, but you can take a shortcut and call a RegistryResource's [, , , , , , , , , , , , , , , , , , ] In this case, this is a table with one of VizieR's somewhat funky names. -To run a TAP query based on this metadata, do something like:: +To run a TAP query based on this metadata, do something like: + +.. doctest-remote-data:: >>> resources[4].get_service("tap#aux").run_sync( ... 'SELECT sn, z FROM "J/A+A/437/789/table2" WHERE z>0.04') @@ -188,9 +210,12 @@ A special sort of access mode is ``web``, which represents some facility related to the resource that works in a web browser. You can ask for a “service” for it, too; you will then receive an object that has a ``search`` method, and when you call it, a browser window should open -with the query facility (this uses python's webbrowser module):: +with the query facility (this uses python's webbrowser module): - resources[4].get_service("web").query() +.. This one fails, fix (change skip to remote-data) or remove it. +.. doctest-skip:: + + >>> resources[4].get_service("web").query() Note that for interactive data discovery in the VO Registry, you may also want to have a look at Aladin's discovery tree, TOPCAT's VO menu, @@ -214,10 +239,13 @@ When that is the case, you can use each RegistryResource's ``service`` attribute, which contains a DAL service instance. The opening example could be written like this:: +.. This one fails, fix (change skip to remote-data) or remove it. +.. doctest-skip:: + >>> from astropy.coordinates import SkyCoord >>> my_obj = SkyCoord.from_name("Bellatrix") >>> for res in registry.search(waveband="infrared", servicetype="spectrum"): - ... print(res.service.search(pos=my_obj, size=0.001)) + ... print(res.service.search(pos=my_obj, size=0.001)) ... In reality, you will have to add some error handling to this kind of @@ -232,17 +260,23 @@ TAP services may provide tables in well-defined data models, like EPN-TAP or obscore. These can be queried in similar loops, although in some cases you will have to adapt the queries to the resources found. -In the obscore case, an all-VO query would look like this:: +In the obscore case, an all-VO query would look like this: + +.. This one times out, consider to refactor for a smaller query. + Once done change skip to remote-data +.. doctest-skip:: >>> for svc_rec in registry.search(datamodel="obscore"): ... print(svc_rec.service.run_sync( - ... "SELECT DISTINCT dataproduct_type FROM ivoa.obscore")) + ... "SELECT DISTINCT dataproduct_type FROM ivoa.obscore")) + Again, in production this needs explicit handling of failing services. For an example of how this might look like, see `GAVO's plate tutorial`_ .. _GAVO's plate tutorial: http://docs.g-vo.org/gavo_plates.pdf + Search results ============== @@ -264,10 +298,12 @@ there is no telling what kind of service you will get back. When the registry query did not constrain the service type, you can use the ``access_modes`` method to see what capabilities are available. For -instance:: +instance: + +.. doctest-remote-data:: >>> res = registry.search(ivoid="ivo://org.gavo.dc/flashheros/q/ssa")[0] - >>> res.access_modes() + >>> res.access_modes() # doctest: +IGNORE_OUTPUT {'ssa', 'datalink#links-1.0', 'tap#aux', 'web', 'soda#sync-1.0'} – this service can be accessed through SSA, TAP, a web interface, and @@ -280,7 +316,9 @@ web browser window when its ``query`` method is called. RegistryResource-s also have a ``get_contact`` method. Use this if the service is down or seems to have bugs; you should in general get at -least an e-Mail address:: +least an e-Mail address: + +.. doctest-remote-data:: >>> res.get_contact() 'GAVO Data Center Team (++49 6221 54 1837) ' @@ -290,10 +328,12 @@ through a resource, much like the VOSI tables endpoint (as a matter of fact, the Registry should contain exactly what is there, as VOSI tables in effect just gives a part of the registry record). Not all publishers properly provide table metadata to the Registry, though, but most do these days, -and then you can run:: +and then you can run: + +.. doctest-remote-data:: >>> res.get_tables() - {'ivoa.obscore':
... 0 columns ...
, 'flashheros.data': ... 29 columns ...
} + {'flashheros.data': ... 29 columns ...
, 'ivoa.obscore': ... 0 columns ...
} Reference/API From 0c313f781b90845af6e41481ad21ee308724dde0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brigitta=20Sip=C5=91cz?= Date: Wed, 1 Jun 2022 12:45:08 -0700 Subject: [PATCH 42/49] Fixing docstring examples --- pyvo/registry/rtcons.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/pyvo/registry/rtcons.py b/pyvo/registry/rtcons.py index 9cae64074..987f836cb 100644 --- a/pyvo/registry/rtcons.py +++ b/pyvo/registry/rtcons.py @@ -482,33 +482,34 @@ class Spatial(Constraint): To find resources having data for RA/Dec 347.38/8.6772:: - >>> registry.Spatial((347.38, 8.6772)) + >>> from pyvo import registry + >>> resources = registry.Spatial((347.38, 8.6772)) To find resources claiming to have data for a spherical circle 2 degrees around that point:: - >>> registry.Spatial(347.38, 8.6772, 2)) + >>> resources = registry.Spatial((347.38, 8.6772, 2)) To find resources claiming to have data for a polygon described by the vertices (23, -40), (26, -39), (25, -43) in ICRS RA/Dec:: - >>> registry.Spatial([23, -40, 26, -39, 25, -43]) + >>> resources = registry.Spatial([23, -40, 26, -39, 25, -43]) To find resources claiming to cover a MOC_, pass an ASCII MOC:: - >>> registry.Spatial("0/1-3 3/") + >>> resources = registry.Spatial("0/1-3 3/") .. _MOC: https://www.ivoa.net/documents/MOC/ When you already have an astropy SkyCoord:: >>> from astropy.coordinates import SkyCoord - >>> registry.Spatial(SkyCoord("23d +3d")) + >>> resources = registry.Spatial(SkyCoord("23d +3d")) SkyCoords also work as circle centers (plain floats for the radius are interpreted in degrees):: - >>> registry.Spatial((SkyCoord("23d +3d"), 3)) + >>> resources = registry.Spatial((SkyCoord("23d +3d"), 3)) """ _keyword = "spatial" _condition = "1 = CONTAINS({geom}, coverage)" @@ -587,15 +588,16 @@ class Spectral(Constraint): To find resources covering the messenger particle energy 5 eV:: - >>> registry.Spectral(5*units.eV) + >>> from pyvo import registry + >>> resources = registry.Spectral(5*units.eV) To find resources overlapping the band between 5000 and 6000 Ångström:: - >>> registry.Spectral((5000*units.Angstrom, 6000*units.Angstrom)) + >>> resources = registry.Spectral((5000*units.Angstrom, 6000*units.Angstrom)) To find resources having data in the FM band:: - >>> registry.Spectral((88*units.MHz, 102*units.MHz)) + >>> resources = registry.Spectral((88*units.MHz, 102*units.MHz)) """ _keyword = "spectral" _extra_tables = ["rr.stc_spectral"] @@ -674,12 +676,14 @@ class Temporal(Constraint): To find resources claiming to have data for Jan 10, 2022:: - >>> registry.Temporal(astropy.time.Time('2022-01-10')) + >>> from pyvo import registry + >>> from astropy.time import Time + >>> resources = registry.Temporal(Time('2022-01-10')) To find resources claiming to have data for some time between MJD 54130 and 54200:: - >>> registry.Temporal((54130, 54200)) + >>> resources = registry.Temporal((54130, 54200)) """ _keyword = "temporal" _extra_tables = ["rr.stc_temporal"] From 9f4bfe5475566d10a25c59979af66da6ec801ce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brigitta=20Sip=C5=91cz?= Date: Wed, 1 Jun 2022 12:45:33 -0700 Subject: [PATCH 43/49] Adding remote-data to tests that do internet access --- pyvo/registry/tests/test_regtap.py | 1 + pyvo/registry/tests/test_rtcons.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index bbf770034..e97f39e79 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -274,6 +274,7 @@ def test_servicetype(): regsearch(servicetype='table') +@pytest.mark.remote_data @pytest.mark.usefixtures('waveband_fixture', 'capabilities') def test_waveband(): regsearch(waveband='optical') diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index eef01be27..dd86188b9 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -128,6 +128,7 @@ def test_legacy_term(self): @pytest.mark.usefixtures('messenger_vocabulary') +@pytest.mark.remote_data class TestWavebandConstraint: def test_basic(self): assert (rtcons.Waveband("Infrared", "EUV").get_search_condition() @@ -300,6 +301,7 @@ def where_clause_for(*args, **kwargs): return rtcons.build_regtap_query(cons ).split("\nWHERE\n", 1)[1].split("\nGROUP BY\n")[0] + @pytest.mark.remote_data def test_from_constraints(self): assert self.where_clause_for( rtcons.Waveband("EUV"), @@ -307,6 +309,7 @@ def test_from_constraints(self): ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'euv'))\n" " AND (role_name LIKE '%Hubble%' AND base_role='creator')") + @pytest.mark.remote_data def test_from_keywords(self): assert self.where_clause_for( waveband="EUV", @@ -314,6 +317,7 @@ def test_from_keywords(self): ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'euv'))\n" " AND (role_name LIKE '%Hubble%' AND base_role='creator')") + @pytest.mark.remote_data def test_mixed(self): assert self.where_clause_for( rtcons.Waveband("EUV"), From 2314e278cee836301ddb99055f97f351ff3e1ddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brigitta=20Sip=C5=91cz?= Date: Wed, 1 Jun 2022 12:51:47 -0700 Subject: [PATCH 44/49] Fix directive typo [skip ci] --- docs/registry/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/registry/index.rst b/docs/registry/index.rst index b62724ebe..2b37deea6 100644 --- a/docs/registry/index.rst +++ b/docs/registry/index.rst @@ -85,7 +85,7 @@ you could either run: >>> resources = registry.search(keywords="white dwarf", waveband="UV") -or:: +or: .. This one fails, fix (change skip to remote-data) or remove it. .. doctest-skip:: @@ -237,7 +237,7 @@ queried in the same way. When that is the case, you can use each RegistryResource's ``service`` attribute, which contains a DAL service -instance. The opening example could be written like this:: +instance. The opening example could be written like this: .. This one fails, fix (change skip to remote-data) or remove it. .. doctest-skip:: From ae43aa16c2f560ca403f980c1c88983ff062731d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brigitta=20Sip=C5=91cz?= Date: Wed, 1 Jun 2022 15:03:28 -0700 Subject: [PATCH 45/49] Bumping astropy version to >=4.1 due to https://github.com/astropy/astropy/pull/9505 --- CHANGES.rst | 3 +++ README.rst | 2 +- setup.cfg | 2 +- tox.ini | 4 ++-- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index b5aa4fa1e..5b9953db0 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -9,6 +9,9 @@ https://blog.g-vo.org/towards-data-discovery-in-pyvo.html. This should be backwards-compatible. [#289] +- Versions of astropy <4.1 are no longer supported. [#289] + + 1.3.1 (unreleased) ================== diff --git a/README.rst b/README.rst index cf09e7408..2c2353b4a 100644 --- a/README.rst +++ b/README.rst @@ -50,7 +50,7 @@ PyVO requires Python 3.8 or later. The following packages are required for PyVO: - * `astropy `__ (>=4.0) + * `astropy `__ (>=4.1) * `requests `_ The following packages are optional dependencies and are required for the diff --git a/setup.cfg b/setup.cfg index 986abe191..733e9ee26 100644 --- a/setup.cfg +++ b/setup.cfg @@ -42,7 +42,7 @@ packages = find: zip_safe = False setup_requires = setuptools_scm install_requires = - astropy>=4.0 + astropy>=4.1 requests python_requires = >=3.8 diff --git a/tox.ini b/tox.ini index c48bf92e8..bc71fe1f0 100644 --- a/tox.ini +++ b/tox.ini @@ -36,12 +36,12 @@ commands = # description = run tests - oldestdeps: with astropy 4.0.* + oldestdeps: with astropy 4.1.* devastropy: with astropy latest deps = devastropy: git+https://github.com/astropy/astropy.git#egg=astropy - oldestdeps: astropy==4.0 + oldestdeps: astropy==4.1 # We set a suitably old numpy along with an old astropy, no need to pick up # deprecations and errors due to their unmatching versions oldestdeps: numpy==1.16 From cc2967c3ec15d68bb5f76b1565999cdaee00889b Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Thu, 2 Jun 2022 09:07:53 +0200 Subject: [PATCH 46/49] Making tests using the messenger vocabulary non-remote. The messenger_vocabulary fixture should have made them non-remote, but I've never actually tested that. It now turns out that astropy.data doesn't use requests and hence my nice requests mocker just didn't work. I've now replaced it by code seeding astropy.data's cache. This is a pattern we ought to use whenever code uses IVOA vocabularies. I wonder where we should document this? --- pyvo/registry/regtap.py | 2 +- pyvo/registry/tests/test_regtap.py | 8 ++++++-- pyvo/registry/tests/test_rtcons.py | 18 ++++-------------- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/pyvo/registry/regtap.py b/pyvo/registry/regtap.py index f864416a9..4538f5a82 100644 --- a/pyvo/registry/regtap.py +++ b/pyvo/registry/regtap.py @@ -520,7 +520,7 @@ def standard_id(self): def access_modes(self): """ - returns a list of interface identifiers available on + returns a set of interface identifiers available on this resource. For standard interfaces, get_service will return a service diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index e97f39e79..4e3b524de 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -20,6 +20,8 @@ from astropy.utils.data import get_pkg_data_contents +from .commonfixtures import messenger_vocabulary + get_pkg_data_contents = partial( get_pkg_data_contents, package=__package__, encoding='binary') @@ -274,8 +276,10 @@ def test_servicetype(): regsearch(servicetype='table') -@pytest.mark.remote_data -@pytest.mark.usefixtures('waveband_fixture', 'capabilities') +@pytest.mark.usefixtures( + 'waveband_fixture', + 'capabilities', + 'messenger_vocabulary') def test_waveband(): regsearch(waveband='optical') diff --git a/pyvo/registry/tests/test_rtcons.py b/pyvo/registry/tests/test_rtcons.py index dd86188b9..fea4f33c6 100644 --- a/pyvo/registry/tests/test_rtcons.py +++ b/pyvo/registry/tests/test_rtcons.py @@ -16,16 +16,7 @@ from pyvo.registry import rtcons from pyvo.dal import query as dalq - -@pytest.fixture() -def messenger_vocabulary(mocker): - def callback(request, context): - return get_pkg_data_contents('data/messenger.desise') - - with mocker.register_uri( - 'GET', 'http://www.ivoa.net/rdf/messenger', content=callback - ) as matcher: - yield matcher +from .commonfixtures import messenger_vocabulary class TestAbstractConstraint: @@ -128,7 +119,6 @@ def test_legacy_term(self): @pytest.mark.usefixtures('messenger_vocabulary') -@pytest.mark.remote_data class TestWavebandConstraint: def test_basic(self): assert (rtcons.Waveband("Infrared", "EUV").get_search_condition() @@ -301,7 +291,7 @@ def where_clause_for(*args, **kwargs): return rtcons.build_regtap_query(cons ).split("\nWHERE\n", 1)[1].split("\nGROUP BY\n")[0] - @pytest.mark.remote_data + @pytest.mark.usefixtures('messenger_vocabulary') def test_from_constraints(self): assert self.where_clause_for( rtcons.Waveband("EUV"), @@ -309,7 +299,7 @@ def test_from_constraints(self): ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'euv'))\n" " AND (role_name LIKE '%Hubble%' AND base_role='creator')") - @pytest.mark.remote_data + @pytest.mark.usefixtures('messenger_vocabulary') def test_from_keywords(self): assert self.where_clause_for( waveband="EUV", @@ -317,7 +307,7 @@ def test_from_keywords(self): ) == ("(1 = ivo_hashlist_has(rr.resource.waveband, 'euv'))\n" " AND (role_name LIKE '%Hubble%' AND base_role='creator')") - @pytest.mark.remote_data + @pytest.mark.usefixtures('messenger_vocabulary') def test_mixed(self): assert self.where_clause_for( rtcons.Waveband("EUV"), From 6dc5dd7e3d960c0fcc932b64327743c2cde2209a Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Thu, 2 Jun 2022 10:39:22 +0200 Subject: [PATCH 47/49] Fixing code samples in docs/registry --- docs/registry/index.rst | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/docs/registry/index.rst b/docs/registry/index.rst index 2b37deea6..531018bfb 100644 --- a/docs/registry/index.rst +++ b/docs/registry/index.rst @@ -87,10 +87,9 @@ you could either run: or: -.. This one fails, fix (change skip to remote-data) or remove it. -.. doctest-skip:: +.. doctest-remote-data:: - >>> resources = registry.search(registry.Fulltext("white dwarf"), + >>> resources = registry.search(registry.Freetext("white dwarf"), ... registry.Waveband("UV")) or a mixture between the two. Constructing using explicit @@ -98,17 +97,15 @@ constraints is generally preferable with more complex queries. Where the constraints accept multiple arguments, you can pass in sequences to the keyword arguments; for instance: -.. This one fails, fix (change skip to remote-data) or remove it. -.. doctest-skip:: +.. doctest-remote-data:: - >>> resources = registry.search(registry.Waveband("Radio", "Submillimeter")) + >>> resources = registry.search(registry.Waveband("Radio", "Millimeter")) is equivalent to: -.. This one fails, fix (change skip to remote-data) or remove it. -.. doctest-skip:: +.. doctest-remote-data:: - >>> resources = registry.search(waveband=["Radio", "Submillimeter"]) + >>> resources = registry.search(waveband=["Radio", "Millimeter"]) There is also :py:meth:`pyvo.registry.get_RegTAP_query`, accepting the same arguments as :py:meth:`pyvo.registry.search`. This function simply @@ -181,8 +178,7 @@ resource; you could construct a TAP service and access its ``tables`` attribute, but you can take a shortcut and call a RegistryResource's ``get_tables`` method for a rather similar result: -.. This one fails, fix (change skip to remote-data) or remove it. -.. doctest-skip:: +.. doctest-remote-data:: >>> tables = resources[4].get_tables() >>> list(tables.keys()) @@ -212,10 +208,9 @@ to the resource that works in a web browser. You can ask for a ``search`` method, and when you call it, a browser window should open with the query facility (this uses python's webbrowser module): -.. This one fails, fix (change skip to remote-data) or remove it. -.. doctest-skip:: +.. doctest-remote-data:: - >>> resources[4].get_service("web").query() + >>> resources[4].get_service("web").search() Note that for interactive data discovery in the VO Registry, you may also want to have a look at Aladin's discovery tree, TOPCAT's VO menu, @@ -239,7 +234,7 @@ When that is the case, you can use each RegistryResource's ``service`` attribute, which contains a DAL service instance. The opening example could be written like this: -.. This one fails, fix (change skip to remote-data) or remove it. +.. This one is too expensive to run as part of CI/testing .. doctest-skip:: >>> from astropy.coordinates import SkyCoord @@ -262,8 +257,7 @@ in some cases you will have to adapt the queries to the resources found. In the obscore case, an all-VO query would look like this: -.. This one times out, consider to refactor for a smaller query. - Once done change skip to remote-data +.. Again, that's too expensive for CI/testing .. doctest-skip:: >>> for svc_rec in registry.search(datamodel="obscore"): From 53dee4019f2fc37ad8c998fed503b507108e05f4 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Fri, 3 Jun 2022 09:34:44 +0200 Subject: [PATCH 48/49] Adding forgotten registry.tests.commonfixtures. (sorry; also, I'm busy elsewhere, so I'll address the remaining issues on Monday) --- pyvo/registry/tests/commonfixtures.py | 28 +++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 pyvo/registry/tests/commonfixtures.py diff --git a/pyvo/registry/tests/commonfixtures.py b/pyvo/registry/tests/commonfixtures.py new file mode 100644 index 000000000..8a5ca236b --- /dev/null +++ b/pyvo/registry/tests/commonfixtures.py @@ -0,0 +1,28 @@ +# Licensed under a 3-clause BSD style license - see LICENSE.rst +""" +Common fixtures for pyVO registry tests +""" + +import os + +import pytest + +from astropy.utils.data import ( + get_pkg_data_filename, + import_file_to_cache) +# We need to populate the vocabulary cache with our test data; +# we cannot use requests_mock here because a.u.data uses urllib. +from astropy.utils.data import _get_download_cache_loc, _url_to_dirname + + +@pytest.fixture() +def messenger_vocabulary(mocker): + """the IVOA messenger vocabulary in astropy's cache. + + Should we clean up after ourselves? + """ + import_file_to_cache( + 'http://www.ivoa.net/rdf/messenger', + get_pkg_data_filename( + 'data/messenger.desise', + package=__package__)) From 47026f15a0bc88a7b4ce1423b704cba8b9a685a2 Mon Sep 17 00:00:00 2001 From: Tom Donaldson Date: Fri, 3 Jun 2022 10:50:40 -0400 Subject: [PATCH 49/49] Remove trailing whitespace for codestyle --- pyvo/registry/tests/commonfixtures.py | 2 +- pyvo/registry/tests/test_regtap.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyvo/registry/tests/commonfixtures.py b/pyvo/registry/tests/commonfixtures.py index 8a5ca236b..15dfcef70 100644 --- a/pyvo/registry/tests/commonfixtures.py +++ b/pyvo/registry/tests/commonfixtures.py @@ -22,7 +22,7 @@ def messenger_vocabulary(mocker): Should we clean up after ourselves? """ import_file_to_cache( - 'http://www.ivoa.net/rdf/messenger', + 'http://www.ivoa.net/rdf/messenger', get_pkg_data_filename( 'data/messenger.desise', package=__package__)) diff --git a/pyvo/registry/tests/test_regtap.py b/pyvo/registry/tests/test_regtap.py index 4e3b524de..3204bb623 100644 --- a/pyvo/registry/tests/test_regtap.py +++ b/pyvo/registry/tests/test_regtap.py @@ -277,8 +277,8 @@ def test_servicetype(): @pytest.mark.usefixtures( - 'waveband_fixture', - 'capabilities', + 'waveband_fixture', + 'capabilities', 'messenger_vocabulary') def test_waveband(): regsearch(waveband='optical')