diff --git a/_data/documentation/0_20_0.yaml b/_data/documentation/0_20_0.yaml new file mode 100644 index 0000000..ac78575 --- /dev/null +++ b/_data/documentation/0_20_0.yaml @@ -0,0 +1,108 @@ +docs: + - title: Proxy Quick Start + description: Start here if you're experimenting with the proxy for the first time. + tags: + - proxy + rank: '000' + path: html/proxy-quick-start + - title: Proxy Guide + description: "Using the Proxy, including configuration, security and operation." + tags: + - proxy + - security + rank: '010' + path: html/kroxylicious-proxy + - title: Record Encryption Quick Start + description: Start here for an encryption-at-rest solution for Apache Kafka®. + tags: + - security + - filter + rank: '011' + path: html/record-encryption-quick-start + - title: Kroxylicious Operator for Kubernetes + description: Using the Kroxylicious Operator to deploy and run the Proxy in a + Kubernetes environment. + tags: + - kubernetes + rank: '020' + path: html/kroxylicious-operator + - title: Record Encryption Guide + description: Using the record encryption filter to provide encryption-at-rest + for Apache Kafka®. + tags: + - security + - filter + rank: '020' + path: html/record-encryption-guide + - title: Record Validation Guide + description: "Using the record validation filter to ensure records follow certain\ + \ rules, including schema and signature validity." + tags: + - governance + - filter + rank: '021' + path: html/record-validation-guide + - title: Multi-tenancy Guide + description: Using the multi-tenancy filter to present a single Kafka® cluster + as if it were multiple clusters. + tags: + - filter + rank: '022' + path: html/multi-tenancy-guide + - title: Oauth Bearer Validation guide + description: "Using the Oauth Bearer validation filter to validate JWT tokens\ + \ received \nfrom Kafka® clients during authentication.\n" + tags: + - filter + - security + rank: '023' + path: html/oauth-bearer-validation + - title: SASL Inspection Guide + description: Using the SASL Inspection filter to infer the client's subject from + its successful authentication exchange with a broker. + tags: + - filter + - security + rank: '023' + path: html/sasl-inspection-guide + - title: Authorization Guide + description: Using the Authorization filter to provide Kafka®-equivalent access + controls within the proxy. + tags: + - security + - filter + rank: '024' + path: html/authorization-guide + - title: Entity Isolation Guide + description: Using the entity isolation filter to give authenticated Kafka® clients + a private namespace within a Kafka cluster. + tags: + - filter + rank: '025' + path: html/entity-isolation-guide + - title: Connection Expiration Guide + description: Using the connection expiration filter to avoid connection skew in + Kubernetes environments. + tags: + - kubernetes + - filter + rank: '030' + path: html/connection-expiration-guide + - title: Developer Quick Start + description: Start here if you're developing a filter for the first time. + tags: + - developer + rank: '031' + path: html/developer-quick-start + - title: Kroxylicious Developer Guide + description: Writing plugins for the proxy in the Java programming language. + tags: + - developer + rank: '032' + path: html/developer-guide + - title: Kroxylicious Javadocs + description: The Java API documentation for plugin developers. + tags: + - developer + path: javadoc/index.html + rank: '033' diff --git a/_data/kroxylicious.yml b/_data/kroxylicious.yml index 96337bf..6d9009f 100644 --- a/_data/kroxylicious.yml +++ b/_data/kroxylicious.yml @@ -1,3 +1,3 @@ # The version number of the latest release -latestRelease: 0.19.0 +latestRelease: 0.20.0 diff --git a/_data/release/0_20_0.yaml b/_data/release/0_20_0.yaml new file mode 100644 index 0000000..69d7fda --- /dev/null +++ b/_data/release/0_20_0.yaml @@ -0,0 +1,34 @@ +# +# Copyright Kroxylicious Authors. +# +# Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 +# + +releaseNotesUrl: https://github.com/kroxylicious/kroxylicious/releases/tag/v$(VERSION)/ +assetBaseUrl: https://github.com/kroxylicious/kroxylicious/releases/download/v$(VERSION)/ +assets: + - name: Proxy + description: The proxy application. + downloads: + - format: zip + path: kroxylicious-app-$(VERSION)-bin.zip + - format: tar.gz + path: kroxylicious-app-$(VERSION)-bin.tar.gz + - name: Operator + description: The Kubernetes operator. + downloads: + - format: zip + path: kroxylicious-operator-$(VERSION).zip + - format: tar.gz + path: kroxylicious-operator-$(VERSION).tar.gz +images: + - name: Proxy + url: https://quay.io/repository/kroxylicious/kroxylicious?tab=tags + registry: quay.io/kroxylicious/kroxylicious + tag: $(VERSION) + digest: sha256:6f9189cea822d3a96f00d1696b3ffad9a410be0fa0fce46900141756c7c9ca66 + - name: Operator + url: https://quay.io/repository/kroxylicious/operator?tab=tags + registry: quay.io/kroxylicious/operator + tag: $(VERSION) + digest: sha256:f12189f8b056e317d3c595a2009b016d6439f9906247bf7693edd24bee33dc9f \ No newline at end of file diff --git a/documentation/0.20.0/html/authorization-guide/content.html b/documentation/0.20.0/html/authorization-guide/content.html new file mode 100644 index 0000000..f5ffd86 --- /dev/null +++ b/documentation/0.20.0/html/authorization-guide/content.html @@ -0,0 +1,912 @@ +{% raw %} + + + +
+
+

About this guide

+
+

This guide covers using the Kroxylicious Authorization filter to enforce authorization rules on client requests before they reach the Kafka brokers. Refer to other Kroxylicious guides for information about running the proxy or for advanced topics such as plugin development.

+
+
+
+
+

1. Authorization overview

+
+
+

The Authorization filter provides the ability for the proxy to enforce an authorization policy about Kafka resources. These authorization checks are performed in addition to any authorization checks made by the broker itself. For an action to be allowed, both the authorization filter and broker must decide that the action is allowed.

+
+
+

In general, the Authorization filter makes access decisions in the same manner as Kafka itself. A client cannot distinguish between authorization enforced on the proxy and authorization enforced on the kafka cluster itself.

+
+
+

In order to use the Authorization filter, the proxy must be able to determine the authenticated subject. The authenticated subject is the verified identity of the client, derived from its successful authentication.

+
+
+
    +
  • +

    If your applications use TLS client authentication, configure the transport subject builder within the virtual cluster to build a subject based on the client certificate.

    +
  • +
  • +

    If your applications use SASL authentication, configure the SASL inspection filter to build the authenticated subject from the successful SASL exchange between the client and the broker.

    +
  • +
+
+
+
+
+

2. Authorization Model

+
+
+

In Kafka, clients perform operations on resources.

+
+
+

The following tables list the resource types and the operations that apply to them.

+
+
+

2.1. Resource types and operations

+
+

2.1.1. Topic operations

+
+

This table lists the topic operations enforced by the authorization filter:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperationTypical use case
+

READ

+
+

Required for a consumer to fetch records.

+
+

WRITE

+
+

Required for a producer to send records.

+
+

CREATE

+
+

Required for an admin client to create, delete, or alter topics.

+
+

DELETE

+
+

ALTER

+
+

DESCRIBE

+
+

Required for an admin client to perform describe operations that refer to topic resources.

+
+

DESCRIBE_CONFIGS

+
+

Required for an admin client to perform describe config operations that refer to topic configuration.

+
+

ALTER_CONFIGS

+
+

Required for an admin client to perform alter config operations that relate to topic configuration.

+
+
+
+

2.1.2. Group operations

+
+

This table lists the operations enforced by the authorization filter for the group resource type:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperationsTypical use case
+

READ

+
+

Required for a consumer to join a group.

+
+

DELETE

+
+

Required for an admin client to delete a group or offsets within a group.

+
+

DESCRIBE

+
+

Required for a consumer and admin client to find and describe a group and its offsets.

+
+

DESCRIBE_CONFIGS

+
+

Required for an admin client to perform describe operations that refer to group configuration.

+
+

ALTER_CONFIGS

+
+

Required for an admin client to perform operations that alter group configuration.

+
+
+
+

2.1.3. Transactional ID operations

+
+

This table lists the operations enforced by the authorization filter for the transactional ID resource type:

+
+ + + + + + + + + + + + + + + + + + + + + +
OperationsTypical use case
+

WRITE

+
+

Required for a producer or consumer to participate in a transaction.

+
+

DESCRIBE

+
+

Required for a producer, consumer, or admin client to find and describe transactions.

+
+
+
+
+

2.2. Implied operation permissions

+
+

In the authorization model, some operations imply permission to perform other operations. This table lists the higher-level operations and the implied lower-level operations they include.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Resource typeOperationImplied operation
+

Topic

+
+

READ

+
+

DESCRIBE

+
+

Topic

+
+

WRITE

+
+

DESCRIBE

+
+

Topic

+
+

DELETE

+
+

DESCRIBE

+
+

Topic

+
+

ALTER

+
+

DESCRIBE

+
+

Topic

+
+

ALTER_CONFIGS

+
+

DESCRIBE_CONFIGS

+
+

Group

+
+

READ

+
+

DESCRIBE

+
+

Group

+
+

DELETE

+
+

DESCRIBE

+
+

Group

+
+

ALTER_CONFIGS

+
+

DESCRIBE_CONFIGS

+
+

TransactionalId

+
+

WRITE

+
+

DESCRIBE

+
+
+
+
+
+

3. Authorization rules

+
+
+

The authorization rules define which principals can perform specific operations on specific Kafka resources.

+
+
+

3.1. Outline of a rule file

+
+

The following example shows the overall outline of a rule file. The sections that follow give more details.

+
+
+
+
// Comment
+from io.kroxylicious.filter.authorization import TopicResource as Topic;
+
+deny User with name = "alice" to * Topic with name = "payments-received";
+allow User with name = "alice" to * Topic with name like "payments-*";
+
+otherwise deny;
+
+
+
+
+

3.2. Comments

+
+

Both line and block comments are supported. Line comments are preceded by //. Block comments are bracketed by /* …​ */ markers. Comments are ignored.

+
+
+
+

3.3. Imports

+
+

Resource types must be imported before use. This is achieved using a from / import statement.

+
+
+
+
from <package> import <element> [as <alias>][,... , <elementn> [as <aliasn>]];
+
+
+
+

where:

+
+
+
    +
  • +

    <package> is io.kroxylicious.filter.authorization

    +
  • +
  • +

    <element> is a ResourceType implementation name.

    +
  • +
  • +

    <alias> is an optional alias for the resource type.

    +
  • +
+
+
+

The following resource types are available within the io.kroxylicious.filter.authorization package:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Resource typeImplementation nameDescription
+

Topic

+
+

TopicResource

+
+

Represents Kafka topics.

+
+

Group

+
+

GroupResource

+
+

Represents Kafka consumer groups.

+
+

TransactionalId

+
+

TransactionalIdResource

+
+

Represents Kafka transactional IDs.

+
+
+

For example, TopicResource is the implementation that represents Kafka topics. To declare it use a import statement like this.

+
+
+
+
from io.kroxylicious.filter.authorization import TopicResource;
+
+
+
+

To declare it with an alias, use an import statement like this:

+
+
+
+
from io.kroxylicious.filter.authorization import TopicResource as Topic;
+
+
+
+
+

3.4. Rules

+
+

The basic form of a rule is as follows:

+
+
+
+
<allow|deny> User with <user predicate> to <operation> <resource type> with <resource predicate>;
+
+
+
+

where:

+
+
+
    +
  • +

    <allow|deny> indicates whether to allow or deny the action.

    +
  • +
  • +

    <user predicate> matches the user principal performing the action.

    +
  • +
  • +

    <resource type> identifies the resource type being acted upon. This can either be the name of the resource type name or an alias for it.

    +
  • +
  • +

    <resource predicate> identifies the resource.

    +
  • +
  • +

    <operation> identifies the operation(s) to be performed on the resource.

    +
  • +
+
+
+

Rules must be ordered so that any deny rules precede the allow rules.

+
+
+

When rules are evaluated, they are considered from top to bottom, with the first matching rule taking precedence.

+
+
+
+

3.5. Otherwise deny

+
+

Rules files must end with the statement otherwise deny. This stipulation means that all rules files have deny-by-default semantics.

+
+
+
+
...
+otherwise deny;
+
+
+
+
+

3.6. User predicates

+
+

The following User predicates are supported:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PredicateDescriptionExample
+

=

+
+

Equals

+
+

name = "alice"

+
+

IN

+
+

Set inclusion

+
+

name in {"alice", "bob"}

+
+

LIKE

+
+

Prefix (note that the wildcard * is only permitted at the end of the prefix.)

+
+

name like "bob*"

+
+
+
+

3.7. Resource Predicates

+
+

The following resource predicates are supported:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PredicateDescriptionExample
+

=

+
+

Equality

+
+

name = "mytopic"

+
+

IN

+
+

Set inclusion

+
+

name in {"topic1", "topic2"}

+
+

LIKE

+
+

Prefix (wildcard * is permitted only at the end)

+
+

name like "finance*"

+
+

MATCHING

+
+

Regular expression match

+
+

name matching "a+"

+
+
+
+

3.8. Operations

+
+

Operations in rules can be specified in the following ways:

+
+
+
    +
  • +

    As a single operation, for example READ

    +
  • +
  • +

    As a set of operations, for example {READ, WRITE}

    +
  • +
  • +

    As a wildcard that matches any operation, for example *

    +
  • +
+
+
+ + + + + + + +
The Authorization filter does not support the keyword ALL.
+
+
+
+
+
+

4. Configuring the Authorization filter

+
+
+

This procedure describes how to set up the Authorization filter by configuring it in Kroxylicious.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    Configure an Authorization type filter.

    +
    + +
    +
  2. +
  3. +

    Configure the ACL rules.

    +
    + +
    +
  4. +
+
+
+

4.1. Example proxy configuration file

+
+

If your instance of the Kroxylicious Proxy runs directly on an operating system, provide the Authorization filter configuration in the filterDefinitions list of your proxy configuration.

+
+
+

Here’s a complete example of a filterDefinitions entry configured for authorization:

+
+
+
+ Example filterDefinitions configuration +
+
+
filterDefinitions:
+  - name: my-authorization
+    type: Authorization
+    config:
+      authorizer: AclAuthorizerService
+      authorizerConfig:
+        aclFile: /path/to/to/acl-rules.txt
+
+
+
+
    +
  • +

    authorizer is the name of the authorizer service implementation. Currently, this must be AclAuthorizerService.

    +
  • +
  • +

    aclFile is the reference file containing the ACL rules.

    +
  • +
+
+
+

Refer to the Kroxylicious Proxy guide for more information about configuring the proxy.

+
+
+
+

4.2. Example KafkaProtocolFilter resource

+
+

If your instance of Kroxylicious runs on Kubernetes, you must use a KafkaProtocolFilter resource to contain the filter configuration.

+
+
+

Here’s a complete example of a KafkaProtocolFilter resource configured for authorization:

+
+
+
+
kind: KafkaProtocolFilter
+metadata:
+  name: my-authorization
+spec:
+  type: Authorization
+  configTemplate:
+    authorizer: AclAuthorizerService
+    authorizerConfig:
+      aclFile: ${configmap:acl-rules:acl-rules.txt}
+
+
+
+
    +
  • +

    authorizer is the name of the authorizer service implementation. Currently, this must be AclAuthorizerService.

    +
  • +
  • +

    aclFile is the reference file containing the ACL rules. You can use an interpolation reference to reference rules stored within a Kubernetes ConfigMap or Secret resource.

    +
  • +
+
+
+
+

4.3. Example ACL Rules

+
+

If your instance of the Kroxylicious Proxy runs directly on an operating system, provide a file containing the rules and reference it from the proxy configuration.

+
+
+

Save the file with a name of your choice and reference it in the filter configuration. The following example shows an ACL rules file referenced as acl-rules.txt:

+
+
+
+
from io.kroxylicious.filter.authorization import TopicResource as Topic, GroupResource as Group, TransactionalIdResource as TransactionalId;
+deny User with name = "alice" to * Topic with name = "payments-received";
+allow User with name = "alice" to * Topic with name like "payments-*";
+allow User with name = "bob" to * Topic with name = "payments-received";
+allow User with name = "bob" to READ Group with name = "payment-consumer-group";
+allow User with name = "alice" to * TransactionalId with name like "alice-transaction-*";
+otherwise deny;
+
+
+
+
+

4.4. Example ACL Rules

+
+

If your instance of Kroxylicious runs on Kubernetes, you must use a ConfigMap resource to contain the ACL rules.

+
+
+

Here’s a complete example of a ConfigMap resource configured for authorization:

+
+
+
+ Example ConfigMap resource containing the ACL rules +
+
+
apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: acl-rules
+data:
+  acl-rules.txt: |
+    from io.kroxylicious.filter.authorization import TopicResource as Topic, GroupResource as Group, TransactionalIdResource as TransactionalId;
+    deny User with name = "alice" to * Topic with name = "payments-received";
+    allow User with name = "alice" to * Topic with name like "payments-*";
+    allow User with name = "bob" to * Topic with name = "payments-received";
+    allow User with name = "bob" to READ Group with name = "payment-consumer-group";
+    allow User with name = "alice" to * TransactionalId with name like "alice-transaction-*";
+    otherwise deny;
+
+
+
+
+
+
+

5. Trademark notice

+
+
+
    +
  • +

    Apache Kafka is a registered trademark of The Apache Software Foundation.

    +
  • +
  • +

    Kubernetes is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Prometheus is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Strimzi is a trademark of The Linux Foundation.

    +
  • +
  • +

    Hashicorp Vault is a registered trademark of HashiCorp, Inc.

    +
  • +
  • +

    AWS Key Management Service is a trademark of Amazon.com, Inc. or its affiliates.

    +
  • +
  • +

    Microsoft, Azure, and Microsoft Entra are trademarks of the Microsoft group of companies.

    +
  • +
  • +

    Fortanix and Data Security Manager are trademarks of Fortanix, Inc.

    +
  • +
+
+
+
+
+

6. Glossary

+
+
+

Glossary of terms used in the Authorization guide.

+
+
+
+
Subject
+
+

The identity of the client for the purposes of applying policies within the proxy. Whether this is the same as the broker’s notion of subject depends on how authentication is configured in the proxy.

+
+
Principal
+
+

A component of a subject.

+
+
Resource
+
+

An entity which an authorizer can control access to. Resources are identified by a type and a name. Examples include Kafka topics and consumer groups (where the group ID is treated as the resource name).

+
+
Operations
+
+

The things that can be done to resources of a particular type. For example, a Kafka topic resource has operations which include describe, read and write.

+
+
Action
+
+

A resource and an operation such as read the topic called invoices.

+
+
Authorizer
+
+

A component that makes an authorization decision, usually based on some kind of access policy.

+
+
Decision
+
+

The outcome of the authorization of a particular action. This is either allow or deny.

+
+
+
+
+
+ + +{% endraw %} diff --git a/documentation/0.20.0/html/authorization-guide/index.html b/documentation/0.20.0/html/authorization-guide/index.html new file mode 100644 index 0000000..8a4f8a4 --- /dev/null +++ b/documentation/0.20.0/html/authorization-guide/index.html @@ -0,0 +1,12 @@ +--- +layout: guide +title: Authorization Guide +description: Using the Authorization filter to provide Kafka®-equivalent access controls + within the proxy. +tags: + - security + - filter +rank: '024' +version: 0.20.0 +permalink: /documentation/0.20.0/html/authorization-guide/ +--- diff --git a/documentation/0.20.0/html/authorization-guide/toc.html b/documentation/0.20.0/html/authorization-guide/toc.html new file mode 100644 index 0000000..af7d779 --- /dev/null +++ b/documentation/0.20.0/html/authorization-guide/toc.html @@ -0,0 +1,32 @@ +{% raw %} +
+ +
+{% endraw %} diff --git a/documentation/0.20.0/html/connection-expiration-guide/content.html b/documentation/0.20.0/html/connection-expiration-guide/content.html new file mode 100644 index 0000000..030ac5b --- /dev/null +++ b/documentation/0.20.0/html/connection-expiration-guide/content.html @@ -0,0 +1,163 @@ +{% raw %} + + + +
+
+

About this guide

+
+

This guide covers using the Kroxylicious Connection Expiration Filter. This filter closes client connections after a configurable expiration age, helping to rebalance connections across proxy instances in dynamic environments such as Kubernetes.

+
+
+

Refer to other Kroxylicious guides for information on running the proxy or for advanced topics such as plugin development.

+
+
+

This filter closes client connections after a configurable expiration age. This is useful in environments like Kubernetes where proxy instances scale up and down. Long-lived client connections can become stuck on old proxy instances, causing connection skew. By closing connections after a maximum age, clients will reconnect and be balanced across the available proxy instances.

+
+
+

When jitter is configured, the effective deadline is randomized within [maxAge - jitter, maxAge + jitter] per connection to avoid thundering herd reconnection storms.

+
+
+
+
+

1. Configuring the Connection Expiration filter

+
+
+

This procedure describes how to set up the Connection Expiration filter by configuring it in Kroxylicious.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    Configure a ConnectionExpiration type filter.

    +
    + +
    +
  2. +
+
+
+

1.1. Example proxy configuration file

+
+

If your instance of the Kroxylicious Proxy runs directly on an operating system, provide the filter configuration in the filterDefinitions list of your proxy configuration.

+
+
+

Here’s a complete example of a filterDefinitions entry configured for Connection Expiration:

+
+
+
+
filterDefinitions:
+  - name: my-connection-expiration-filter
+    type: ConnectionExpiration
+    config:
+      maxAge: "1h"
+      jitter: "5m"
+
+
+
+

where:

+
+
+
    +
  • +

    maxAge (required) is the maximum age of a connection before it will be closed. Must be a positive duration (for example, "1h", "30m", "3600s").

    +
  • +
  • +

    jitter (optional) is the jitter to apply to the max age, randomizing the effective deadline within [maxAge - jitter, maxAge + jitter] per connection. Must be non-negative and not greater than maxAge. If omitted, no jitter is applied.

    +
  • +
+
+
+

Refer to the Kroxylicious Proxy guide for more information about configuring the proxy.

+
+
+
+

1.2. Example KafkaProtocolFilter resource

+
+

If your instance of Kroxylicious runs on Kubernetes, you must use a KafkaProtocolFilter resource to contain the filter configuration.

+
+
+

Here’s a complete example of a KafkaProtocolFilter resource configured for Connection Expiration:

+
+
+
+
kind: KafkaProtocolFilter
+metadata:
+  name: my-connection-expiration-filter
+spec:
+  type: ConnectionExpiration
+  configTemplate:
+    maxAge: "1h"
+    jitter: "5m"
+
+
+
+

where:

+
+
+
    +
  • +

    maxAge (required) is the maximum age of a connection before it will be closed. Must be a positive duration (for example, "1h", "30m", "3600s").

    +
  • +
  • +

    jitter (optional) is the jitter to apply to the max age, randomizing the effective deadline within [maxAge - jitter, maxAge + jitter] per connection. Must be non-negative and not greater than maxAge. If omitted, no jitter is applied.

    +
  • +
+
+
+

Refer to the Kroxylicious Operator for Kubernetes guide for more information about configuration on Kubernetes.

+
+
+
+
+
+

2. Trademark notice

+
+
+
    +
  • +

    Apache Kafka is a registered trademark of The Apache Software Foundation.

    +
  • +
  • +

    Kubernetes is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Prometheus is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Strimzi is a trademark of The Linux Foundation.

    +
  • +
  • +

    Hashicorp Vault is a registered trademark of HashiCorp, Inc.

    +
  • +
  • +

    AWS Key Management Service is a trademark of Amazon.com, Inc. or its affiliates.

    +
  • +
  • +

    Microsoft, Azure, and Microsoft Entra are trademarks of the Microsoft group of companies.

    +
  • +
  • +

    Fortanix and Data Security Manager are trademarks of Fortanix, Inc.

    +
  • +
+
+
+
+ + +{% endraw %} diff --git a/documentation/0.20.0/html/connection-expiration-guide/index.html b/documentation/0.20.0/html/connection-expiration-guide/index.html new file mode 100644 index 0000000..307e7fc --- /dev/null +++ b/documentation/0.20.0/html/connection-expiration-guide/index.html @@ -0,0 +1,12 @@ +--- +layout: guide +title: Connection Expiration Guide +description: Using the connection expiration filter to avoid connection skew in Kubernetes + environments. +tags: + - kubernetes + - filter +rank: '030' +version: 0.20.0 +permalink: /documentation/0.20.0/html/connection-expiration-guide/ +--- diff --git a/documentation/0.20.0/html/connection-expiration-guide/toc.html b/documentation/0.20.0/html/connection-expiration-guide/toc.html new file mode 100644 index 0000000..1756143 --- /dev/null +++ b/documentation/0.20.0/html/connection-expiration-guide/toc.html @@ -0,0 +1,12 @@ +{% raw %} +
+ +
+{% endraw %} diff --git a/documentation/0.20.0/html/developer-guide/content.html b/documentation/0.20.0/html/developer-guide/content.html new file mode 100644 index 0000000..f4f116c --- /dev/null +++ b/documentation/0.20.0/html/developer-guide/content.html @@ -0,0 +1,715 @@ +{% raw %} + + + +
+
+

About this guide

+
+

This guide covers developing plugins for Kroxylicious using the Java programming language. Other guides should be consulted if you want to deploy, configure or secure a Kroxylicious Proxy.

+
+
+
+
+

1. Kroxylicious Proxy overview

+
+
+

Kroxylicious is an Apache Kafka protocol-aware ("Layer 7") proxy designed to enhance Kafka-based systems. Through its filter mechanism it allows additional behavior to be introduced into a Kafka-based system without requiring changes to either your applications or the Kafka cluster itself. Built-in filters are provided as part of the solution.

+
+
+

Functioning as an intermediary, the Kroxylicious mediates communication between a Kafka cluster and its clients. It takes on the responsibility of receiving, filtering, and forwarding messages.

+
+
+

A Java API provides a convenient means for implementing custom logic within the proxy.

+
+
+
Additional resources
+ +
+
+

1.1. Compatibility

+
+

There are effectively two APIs a filter developer needs to care about:

+
+
+
    +
  1. +

    The Filter API against which the filter is written. This is a contract between the Filter developer and the Kroxylicious runtime. It includes Filter, FilterFactory, which the developer is responsible for implementing, and FilterContext and FilterFactoryContext, which are provided by the Kroxylicous runtime for the developer to use.

    +
  2. +
  3. +

    The "configuration API" that your filter exposes. This is a contract between the Filter developer and Kroxylicious users.

    +
  4. +
+
+
+

1.1.1. Compatibility of the Filter API

+
+

The Kroxylicious project uses semantic versioning. For the filter API this means that you can compile your filter against the Kroxylicious API at version x.yc.zc and users will be able to use it with Kroxylicious runtimes at version x.yr.zr if the runtime version is not older than the compile time version (that is if yryc and zrzc).

+
+
+
+

1.1.2. Compatibility of your Filter configuration

+
+

The Kroxylicious Proxy isn’t able to provide or enforce any compatibility guarantees about the configuration API that your plugin offers to users. In other words you are free you release your plugin at version a.b.c and later release a version a.d.e which doesn’t accept the same configuration syntax (JSON or YAML) that the original version did.

+
+
+

Doing this makes it more difficult for users to upgrade from older versions on your plugin, because they will have to rewrite and revalidate the configuration which worked with the old version.

+
+
+

For this reason filter developers are strongly encouraged to adopt Semantic versioning as the way to communicate compatibility of the configuration API they offer to users.

+
+
+
+
+
+
+

2. Custom filters

+
+
+

Custom filters can be written in the Java programming language. Kroxylicious supports Java 21. Knowledge of the Kafka protocol is generally required to write a protocol filter.

+
+
+

There is currently one class of Custom Filters users can implement:

+
+
+
+
+ Protocol filters +
+
+

Allow customisation of how protocol messages are handled on their way to, or from, the Cluster.

+
+
+
+
+

The following sections explain in more detail how to write your own filters.

+
+
+

2.1. Custom Filter Project Generation

+
+

You can generate a standalone filter project. This bootstraps a project to allow you to build your own Custom Filters. You can follow the Kroxylicious Developer Quickstart for a hands-on introduction to creating your own custom filters.

+
+
+
+

2.2. API docs

+
+

Custom filters are built by implementing interfaces supplied by the kroxylicious-api module (io.kroxylicious:kroxylicious-api on maven central). You can view the javadoc here.

+
+
+
+

2.3. Dependencies

+
+

How filter classes are loaded is not currently defined by the filter contract. In other words, filters might be loaded using a classloader-per-filter model, or using a single class loader. This doesn’t really make a difference to filter authors except where they want to make use of libraries as dependencies. Because those dependencies might be loaded by the same classloader as the dependencies of other filters there is the possibility of collision. Filter A and Filter B might both want to use Library C, and they might want to use different versions of Library C.

+
+
+

For common things like logging and metric facade APIs it is recommended to use the facade APIs which are also used by the proxy core.

+
+
+
+

2.4. Protocol filters

+
+

A protocol filter is a public top-level, concrete class with a particular public constructor and which implements one or more protocol filter interfaces. You can implement two distinct types of Custom Protocol Filter:

+
+ +
+

Note that these types are mutually exclusive, for example a Filter is not allowed to implement both RequestFilter and MetadataRequestFilter. This is to prevent ambiguity. If we received a MetadataRequest, would it be dispatched to the onMetadataRequest(..) method of MetadataRequestFilter or the onRequest method of RequestFilter, or both? Instead, we disallow these combinations, throwing an exception at runtime if your Filter implements incompatible interfaces.

+
+
+

2.4.1. Specific Message Protocol Filters

+
+

A filter may wish to intercept specific types of Kafka messages. For example, intercept all Produce Requests, or intercept all Fetch Responses. To support this case Kroxylicious provides an interfaces for all request types and response types supported by Kafka (at the version of Kafka Kroxylicious depends on). A filter implementation can implement any combination of these interfaces.

+
+
+

There is no requirement that a Filter handles both the request and response halves of an RPC. A Filter can choose to intercept only the request, or only the response, or both the request and response.

+
+
+
Examples
+
+

To intercept all Fetch Requests your class would implement FetchRequestFilter:

+
+
+
+
public class FetchRequestClientIdFilter implements FetchRequestFilter {
+
+    @Override
+    public CompletionStage<RequestFilterResult> onFetchRequest(short apiVersion,
+                                                               RequestHeaderData header,
+                                                               FetchRequestData request,
+                                                               FilterContext context) {
+        header.setClientId("fetch-client!");
+        return context.forwardRequest(header, request);
+    }
+}
+
+
+
+

To intercept all Fetch Responses your class would implement FetchResponseFilter:

+
+
+
+
public class FetchRequestClientIdFilter implements FetchResponseFilter {
+
+    @Override
+    public CompletionStage<ResponseFilterResult> onFetchResponse(short apiVersion,
+                                                                 ResponseHeaderData header,
+                                                                 FetchResponseData response,
+                                                                 FilterContext context) {
+        mutateResponse(response);
+        return context.forwardResponse(header, response);
+    }
+}
+
+
+
+

To intercept all Fetch Requests and all Fetch Responses your class would implement FetchRequestFilter and FetchResponseFilter:

+
+
+
+
public class FetchRequestClientIdFilter implements FetchRequestFilter, FetchResponseFilter {
+
+    @Override
+    public CompletionStage<RequestFilterResult> onFetchRequest(short apiVersion,
+                                                               RequestHeaderData header,
+                                                               FetchRequestData request,
+                                                               FilterContext context) {
+        header.setClientId("fetch-client!");
+        return context.forwardRequest(header, request);
+    }
+
+    @Override
+    public CompletionStage<ResponseFilterResult> onFetchResponse(short apiVersion,
+                                                                 ResponseHeaderData header,
+                                                                 FetchResponseData response,
+                                                                 FilterContext context) {
+        mutateResponse(response);
+        return context.forwardResponse(header, response);
+    }
+}
+
+
+
+

Specific Message Filter interfaces are mutually exclusive with Request/Response. Kroxylicious will reject invalid combinations of interfaces.

+
+
+
+
+

2.4.2. Request/Response Protocol Filters

+
+

A filter may wish to intercept every message being sent from the Client to the Cluster or from the Cluster to the Client. To do this your custom filter will implement:

+
+
+ +
+
+

Custom filters are free to implement either interface or both interfaces to intercept all messages.

+
+
+

For example:

+
+
+
+
public class FixedClientIdFilter implements RequestFilter {
+
+    @Override
+    public CompletionStage<RequestFilterResult> onRequest(ApiKeys apiKey,
+                                                          RequestHeaderData header,
+                                                          ApiMessage body,
+                                                          FilterContext filterContext) {
+        header.setClientId("example!");
+        return filterContext.forwardRequest(header, body);
+    }
+
+}
+
+
+
+

Request/Response Filter interfaces are mutually exclusive with Specific Message interfaces. Kroxylicious will reject invalid combinations of interfaces.

+
+
+
+

2.4.3. The Filter Result

+
+

As seen above, filter methods (onXyz[Request|Response]) must return a CompletionStage<FilterResult> object. It is the job of FilterResult to convey what message is to forwarded to the next filter in the chain (or broker /client if at the chain’s beginning or end). It is also used to carry instructions such as indicating that the connection must be closed, or a message dropped.

+
+
+

If the filter returns a CompletionStage that is already completed normally, Kroxylicious will immediately perform the action described by the FilterResult.

+
+
+

The filter may return a CompletionStage that is not yet completed. When this happens, Kroxylicious will pause reading from the downstream (the Client writes will eventually block), and it begins to queue up in-flight requests/responses arriving at the filter. This is done so that message order is maintained. Once the CompletionStage completes, the action described by the FilterResult is performed, reading from the downstream resumes and any queued up requests/responses are processed.

+
+
+ + + + + + + +
The pausing of reads from the downstream is a relatively costly operation. To maintain optimal performance filter implementations should minimise the occasions on which an incomplete CompletionStage is returned.
+
+
+

If the CompletionStage completes exceptionally, the connection is closed. This also applies if the CompletionStage does not complete within a timeout (20000 milliseconds).

+
+
+
Creating a Filter Result
+
+

The FilterContext is the factory for the FilterResult objects.

+
+
+

There are two convenience methods[1] that simply allow a filter to forward a result to the next filter. We’ve already seen these in action above.

+
+
+
    +
  • +

    context.forwardRequest(header, request) used by result filter to forward a request.

    +
  • +
  • +

    context.forwardResponse(header, response) used by result filter to forward a request.

    +
  • +
+
+
+

To access richer features, use the filter result builders context.requestFilterResultBuilder() and responseFilterResultBuilder().

+
+
+

Filter result builders allow you to:

+
+
+
    +
  1. +

    forward a request/response: .forward(header, request).

    +
  2. +
  3. +

    signal that a connection is to be closed: .withCloseConnection().

    +
  4. +
  5. +

    signal that a message is to be dropped (i.e. not forwarded): .drop().

    +
  6. +
  7. +

    for requests only, send a short-circuit response: .shortCircuitResponse(header, response)

    +
  8. +
+
+
+

The builder lets you combine legal behaviours together. For instance, to close the connection after forwarding a response to a client, a response filter could use:

+
+
+
+
return context.responseFilterResultBuilder()
+        .forward(header, response)
+        .withCloseConnection()
+        .complete();
+
+
+
+

The builders yield either a completed CompletionStage<FilterResult> which can be returned directly from the filter method, or bare FilterResult. The latter exists to support asynchronous programming styles allowing you to use your own Futures.

+
+
+ + + + + + + +
The drop behaviour can be legally used in very specific circumstances. The Kafka Protocol is, for the most part, strictly request/response with responses expected in the order the request were sent. The client will fail if the contract isn’t upheld. The exception is Produce where acks=0. Filters may drop these requests without introducing a protocol error.
+
+
+
+
+

2.4.4. The protocol filter lifecycle

+
+

Instances of the filter class are created on demand when a protocol message is first sent by a client. Instances are specific to the channel between a single client and a single broker.

+
+
+

It exists while the client remains connected.

+
+
+
+

2.4.5. Handling state

+
+

The simplest way of managing per-client state is to use member fields. The proxy guarantees that all methods of a given filter instance will always be invoked on the same thread (also true of the CompletionStage completion in the case of Sending asynchronous requests to the Cluster). Therefore, there is no need to use synchronization when accessing such fields.

+
+
+

See the io.kroxylicious.proxy.filter package javadoc for more information on thread-safety.

+
+
+
+

2.4.6. Filter Patterns

+
+

Kroxylicious Protocol Filters support several patterns:

+
+ +
+
Intercepting Requests and Responses
+
+

This is a common pattern, we want to inspect or modify a message. For example:

+
+
+
+
public class SampleFetchResponseFilter implements FetchResponseFilter {
+    @Override
+    public CompletionStage<ResponseFilterResult> onFetchResponse(short apiVersion,
+                                                                 ResponseHeaderData header,
+                                                                 FetchResponseData response,
+                                                                 FilterContext context) {
+        mutateResponse(response, context); (1)
+        return context.forwardResponse(header, response); (2)
+    }
+}
+
+
+
+ + + + + + + + + + + +
1We mutate the response object. For example, you could alter the records that have been fetched.
2We forward the response, sending it towards the client, invoking Filters downstream of this one.
+
+
+ + + + + + + +
We can only forward the response and header objects passed into the onFetchResponse. New instances are not supported.
+
+
+
+
Sending Response messages from a Request Filter towards the Client (Short-circuit responses)
+
+

In some cases we may wish to not forward a request from the client to the Cluster. Instead, we want to intercept that request and generate a response message in a Kroxylicious Protocol Filter and send it towards the client. This is called a short-circuit response.

+
+
+
+ Diagram showing a filter sending its own response rather than proxying the request to the broker +
+
Figure 1. Illustration of responding without proxying
+
+
+

For example:

+
+
+
+
public class CreateTopicRejectFilter implements CreateTopicsRequestFilter {
+
+    public CompletionStage<RequestFilterResult> onCreateTopicsRequest(short apiVersion, RequestHeaderData header, CreateTopicsRequestData request,
+                                                                      FilterContext context) {
+        CreateTopicsResponseData response = new CreateTopicsResponseData();
+        CreateTopicsResponseData.CreatableTopicResultCollection topics = new CreateTopicsResponseData.CreatableTopicResultCollection(); (1)
+        request.topics().forEach(creatableTopic -> {
+            CreateTopicsResponseData.CreatableTopicResult result = new CreateTopicsResponseData.CreatableTopicResult();
+            result.setErrorCode(Errors.INVALID_TOPIC_EXCEPTION.code()).setErrorMessage(ERROR_MESSAGE);
+            result.setName(creatableTopic.name());
+            topics.add(result);
+        });
+        response.setTopics(topics);
+        return context.requestFilterResultBuilder().shortCircuitResponse(response).completed(); (2)
+    }
+}
+
+
+
+ + + + + + + + + + + +
1Create a new instance of the corresponding response data and populate it. Note you may need to use the apiVersion to check which fields can be set at this request’s API version.
2We generate a short-circuit response that will send it towards the client, invoking Filters downstream of this one.
+
+
+

This will respond to all Create Topic requests with an error response without forwarding any of those requests to the Cluster.

+
+
+
Closing the connections
+
+

There is a useful variation on the pattern above, where the filter needs, in addition to sending an error response, also to cause the connection to close. This is useful in use-cases where the filter wishes to disallow certain client behaviours.

+
+
+
+
public class DisallowAlterConfigs implements AlterConfigsRequestFilter {
+
+    @Override
+    public CompletionStage<RequestFilterResult> onAlterConfigsRequest(short apiVersion, RequestHeaderData header, AlterConfigsRequestData request,
+                                                                      FilterContext context) {
+        var response = new AlterConfigsResponseData();
+        response.setResponses(request.resources().stream()
+                .map(a -> new AlterConfigsResourceResponse()
+                        .setErrorCode(Errors.INVALID_CONFIG.code())
+                        .setErrorMessage("This service does not allow this operation - closing connection"))
+                .toList());
+        return context.requestFilterResultBuilder()
+                         .shortCircuitResponse(response)
+                         .withCloseConnection() (1)
+                         .completed();
+    }
+}
+
+
+
+ + + + + + + +
1We enable the close connection option on the builder. This will cause Kroxylicious to close the connection after the response is sent to the client.
+
+
+
+
+
Sending asynchronous requests to the Cluster
+
+

Filters can make additional asynchronous requests to the Cluster. This is useful if the Filter needs additional information from the Cluster in order to know how to mutate the filtered request/response.

+
+
+

The Filter can make use of CompletionStage chaining features ([#thenApply() etc.) to organise for actions to be done once the asynchronous request completes. For example, it could chain an action that mutates the filtered request/response using the asynchronous response, and finally, chain an action to forward the request/response to the next filter.

+
+
+

The asynchronous request/response will be intercepted by Filters upstream of this Filter. Filters downstream of this Filter (and the Client) do not see the asynchronous response.

+
+
+

Let’s take a look at an example. We’ll send an asynchronous request towards the Cluster for topic metadata while handling a FetchRequest and use the response to mutate the FetchRequest before passing it to the next filter in the chain.

+
+
+
+
public class FetchFilter implements FetchRequestFilter {
+    public static final short METADATA_VERSION_SUPPORTING_TOPIC_IDS = (short) 12;
+
+    @Override
+    public CompletionStage<RequestFilterResult> onFetchRequest(ApiKeys apiKey,
+                                                               RequestHeaderData header,
+                                                               FetchRequestData request,
+                                                               FilterContext context) {
+        var metadataRequestHeader = new RequestHeaderData().setRequestApiVersion(METADATA_VERSION_SUPPORTING_TOPIC_IDS); (1)
+        var metadataRequest = new MetadataRequestData(); (2)
+        var topic = new MetadataRequestData.MetadataRequestTopic();
+        topic.setTopicId(Uuid.randomUuid());
+        metadataRequest.topics().add(topic);
+        var stage = context.sendRequest(metadataRequestHeader, metadataRequest); (3)
+        return stage.thenApply(metadataResponse -> mutateFetchRequest(metadataResponse, request)) (4)
+                    .thenCompose(mutatedFetchRequest -> context.forwardRequest(header, mutatedFetchRequest)); (5)
+    }
+}
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
1We construct a header object for the asynchronous request. It is important to specify the API version of the request that is to be used. The version chosen must be a version known to the Kafka Client used by Kroxylicious and must be an API version supported by the Target Cluster.
2We construct a new request object. When constructing the request object, care needs to be taken to ensure the request is populated with the structure which matches the API version you have chosen. Refer to the Kafka Protocol Guide for more details.
3We asynchronously send the request towards the Cluster and obtain a CompletionStage which will contain the response.
4We use a computation stage to mutate the filtered fetch request using the response from the request sent at <3>.
5We use another computation stage to forward the mutated request.
+
+
+

As you have read above, we need to know the API version we want our request to be encoded at. Your filter can discover what versions of an API the Kafka Cluster supports. To do this use the ApiVersionsService available from the FilterContext to determine programmatically what versions of an API are support and then write code to make a suitable request object.

+
+
+ + + + + + + +
Kroxylicious provides the guarantee that computation stages chained using the default execution methods are executed on the same thread as the rest of the Filter work, so we can safely mutate Filter members without synchronising. See the io.kroxylicious.proxy.filter package javadoc for more information on thread-safety.
+
+
+
+
Filtering specific API Versions
+
+
+
+

Kafka has a "bidirectional" client compatibility policy. In other words, new clients can talk to old servers, and old clients can talk to new servers. This allows users to upgrade either clients or servers without experiencing any downtime.

+
+
+

Since the Kafka protocol has changed over time, clients and servers need to agree on the schema of the message that they are sending over the wire. This is done through API versioning.

+
+
+

Before each request is sent, the client sends the API key and the API version. These two 16-bit numbers, when taken together, uniquely identify the schema of the message to follow.

+
+
+ +
+
+

You may wish to restrict your Filter to only apply to specific versions of an API. For example, "intercept all FetchRequest messages greater than api version 7". To do this you can override a method named shouldHandleXyz[Request|Response] on your filter like:

+
+
+
+
public class FetchFilter implements FetchRequestFilter {
+
+    @Override
+    public boolean shouldHandleFetchRequest(short apiVersion) {
+        return apiVersion > 7;
+    }
+
+    @Override
+    @Override
+    public CompletionStage<RequestFilterResult> onRequest(ApiKeys apiKey,
+                                                          RequestHeaderData header,
+                                                          ApiMessage body,
+                                                          FilterContext filterContext) {
+        return context.forwardRequest(header, request);
+    }
+}
+
+
+
+
+
+

2.4.7. Filter Construction and Configuration

+
+

For Kroxylicious to instantiate and configure your custom filter we use Java’s ServiceLoader API. Each Custom Filter should provide a corresponding FilterFactory implementation that can create an instance of your custom Filter. The factory can optionally declare a configuration class that Kroxylicious will populate (using Jackson) when loading your custom Filter. The module must package a META-INF/services/io.kroxylicious.proxy.filter.FilterFactory file containing the classnames of each filter factory implementation into the JAR file.

+
+
+

For example in the kroxylicious-filter-archetype we have the SampleFilterConfig class. This is used in the SampleFetchResponseFilter). The configuration is routed to the Filter instance via the SampleFetchResponse.

+
+
+

Then, when we configure a filter in Kroxylicious configuration like:

+
+
+
+
filterDefinitions:
+- name: my-replacer
+  type: SampleFetchResponse
+  config:
+    findValue: a
+    replacementValue: b
+
+
+
+

Kroxylicious will deserialize the config object into a SampleFilterConfig and use it to construct a SampleFetchResponseFilter passing the SampleFilterConfig instance as a constructor argument.

+
+
+
+
+

2.5. Packaging filters

+
+

Filters are packaged as standard .jar files. A typical Custom Filter jar contains:

+
+
+
    +
  1. +

    Filter implementation classes

    +
  2. +
  3. +

    A FilterFactory implementation per Filter and service metadata (see Filter Construction and Configuration)

    +
  4. +
+
+
+
+
+
+

3. Trademark notice

+
+
+
    +
  • +

    Apache Kafka is a registered trademark of The Apache Software Foundation.

    +
  • +
  • +

    Kubernetes is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Prometheus is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Strimzi is a trademark of The Linux Foundation.

    +
  • +
  • +

    Hashicorp Vault is a registered trademark of HashiCorp, Inc.

    +
  • +
  • +

    AWS Key Management Service is a trademark of Amazon.com, Inc. or its affiliates.

    +
  • +
  • +

    Microsoft, Azure, and Microsoft Entra are trademarks of the Microsoft group of companies.

    +
  • +
  • +

    Fortanix and Data Security Manager are trademarks of Fortanix, Inc.

    +
  • +
+
+
+
+
+
+
+ 1. The context.forward*() methods behave exactly as the builder form .forward(header, message).complete() +
+
+ + +{% endraw %} diff --git a/documentation/0.20.0/html/developer-guide/index.html b/documentation/0.20.0/html/developer-guide/index.html new file mode 100644 index 0000000..b025f0a --- /dev/null +++ b/documentation/0.20.0/html/developer-guide/index.html @@ -0,0 +1,10 @@ +--- +layout: guide +title: Kroxylicious Developer Guide +description: Writing plugins for the proxy in the Java programming language. +tags: + - developer +rank: '032' +version: 0.20.0 +permalink: /documentation/0.20.0/html/developer-guide/ +--- diff --git a/documentation/0.20.0/html/developer-guide/toc.html b/documentation/0.20.0/html/developer-guide/toc.html new file mode 100644 index 0000000..a68b1e1 --- /dev/null +++ b/documentation/0.20.0/html/developer-guide/toc.html @@ -0,0 +1,19 @@ +{% raw %} +
+ +
+{% endraw %} diff --git a/documentation/0.20.0/html/developer-quick-start/content.html b/documentation/0.20.0/html/developer-quick-start/content.html new file mode 100644 index 0000000..aebfecc --- /dev/null +++ b/documentation/0.20.0/html/developer-quick-start/content.html @@ -0,0 +1,172 @@ +{% raw %} + + + +
+
+
+

Kroxylicious' composable filter chains and pluggable API mean that you can write your own filters to apply your own rules to the Kafka protocol, using the Java programming language.

+
+
+

In this quick start guide you will build a custom filter and use it to modify messages being sent to/consumed from Kafka, learn about filter configuration and running custom filters, and find a starting point for developing your own custom filters with your own rules and logic.

+
+
+
+
+

1. Getting started

+
+
+

1.1. Prerequisites

+
+

To start developing your own custom filters for Kroxylicious, you will need to install JDK 21.

+
+
+

You’ll also need to install the Apache Maven CLI and one of either Podman or Docker.

+
+
+ + + + + + + +
If you are using Podman, you may encounter issues with the integration tests. There are instructions here to resolve this.
+
+
+
+

1.2. Generate a Sample Filter Project

+
+

The easiest way to learn how to build custom filters is with our kroxylicious-filter-archetype maven archetype, which will generate some basic find-and-replace filters for you to experiment with. Begin by generating a sample project:

+
+
+
+
mvn archetype:generate -DarchetypeGroupId=io.kroxylicious \
+                       -DarchetypeArtifactId=kroxylicious-filter-archetype \
+                       -DarchetypeVersion=0.20.0 \
+                       -DgroupId=org.example \
+                       -DartifactId=sample-filter \
+                       -Dversion=1.0-SNAPSHOT \
+                       -DinteractiveMode=false
+cd sample-filter
+
+
+
+
+
+
+

2. Build the Sample Filter project

+
+
+

Building the sample project is easy!

+
+
+
+
mvn verify
+
+
+
+

Note that the sample project includes automated unit and integration tests. The project’s powerful integration tests run against an in-VM Kafka cluster, enabling you to rapidly iterate on your filter’s business logic.

+
+
+
+
+

3. Run the built Sample Filter module in a Proxy

+
+
+

To build and run your sample filter

+
+
+
+
chmod +x run.sh
+./run.sh --config sample-proxy-config.yaml
+
+
+
+

Send a Kafka message containing foo through the proxy. You should see the content transformed, with the word foo replaced by baz in the message received by the consumer.

+
+
+
+
podman run -it --net host \
+           --entrypoint /opt/kafka/bin/kafka-console-producer.sh \
+           apache/kafka:4.1.0 \
+           --bootstrap-server localhost:9192 \
+           --topic hello
+>foo
+
+podman run -it --net host \
+           --entrypoint /opt/kafka/bin/kafka-console-consumer.sh \
+           apache/kafka:4.1.0 \
+           --bootstrap-server localhost:9192 \
+           --topic hello \
+           --from-beginning
+baz
+
+
+
+
+
+

4. Configure the Filter

+
+
+

Filters can be added and removed by altering the filterDefinitions list in the sample-proxy-config.yaml file. You can also reconfigure the sample filters by changing the configuration values in this file. Note that the proxy must be restarted when you modify the configuration.

+
+
+

The SampleFetchResponseFilter and SampleProduceRequestFilter each have two configuration values that must be specified for them to work:

+
+
+
    +
  • +

    findValue - the string the filter will search for in the produce/fetch data

    +
  • +
  • +

    replacementValue - the string the filter will replace the value above with

    +
  • +
+
+
+

4.1. Default Configuration

+
+

The default configuration for SampleProduceRequestFilter is:

+
+
+
+
filterDefinitions:
+  - name: produce-request-filter
+    type: SampleProduceRequestFilterFactory
+    config:
+      findValue: foo
+      replacementValue: bar
+
+
+
+

This means that it will search for the string foo in the produce data and replace all occurrences with the string bar. For example, if a Kafka Producer sent a produce request with data {"myValue":"foo"}, the filter would transform this into {"myValue":"bar"} and Kroxylicious would send that to the Kafka Broker instead.

+
+
+

The default configuration for SampleFetchResponseFilter is:

+
+
+
+
filterDefinitions:
+  - name: fetch-response-filter
+    type: SampleFetchResponseFilterFactory
+    config:
+      findValue: bar
+      replacementValue: baz
+
+
+
+

This means that it will search for the string bar in the fetch data and replace all occurrences with the string baz. For example, if a Kafka Broker sent a fetch response with data {"myValue":"bar"}, the filter would transform this into {"myValue":"baz"} and Kroxylicious would send that to the Kafka Consumer instead.

+
+
+
+

4.2. Modify

+
+

Now that you know how the sample filters work, you can start modifying them! Replace the SampleFilterTransformer logic with your own code, change which messages they apply to, or whatever else you like!

+
+
+
+
+ + +{% endraw %} diff --git a/documentation/0.20.0/html/developer-quick-start/index.html b/documentation/0.20.0/html/developer-quick-start/index.html new file mode 100644 index 0000000..9f65779 --- /dev/null +++ b/documentation/0.20.0/html/developer-quick-start/index.html @@ -0,0 +1,10 @@ +--- +layout: guide +title: Developer Quick Start +description: Start here if you're developing a filter for the first time. +tags: + - developer +rank: '031' +version: 0.20.0 +permalink: /documentation/0.20.0/html/developer-quick-start/ +--- diff --git a/documentation/0.20.0/html/developer-quick-start/toc.html b/documentation/0.20.0/html/developer-quick-start/toc.html new file mode 100644 index 0000000..241a29c --- /dev/null +++ b/documentation/0.20.0/html/developer-quick-start/toc.html @@ -0,0 +1,18 @@ +{% raw %} +
+ +
+{% endraw %} diff --git a/documentation/0.20.0/html/entity-isolation-guide/content.html b/documentation/0.20.0/html/entity-isolation-guide/content.html new file mode 100644 index 0000000..9777e17 --- /dev/null +++ b/documentation/0.20.0/html/entity-isolation-guide/content.html @@ -0,0 +1,307 @@ +{% raw %} + + + +
+
+

About this guide

+
+

This guide covers using the Kroxylicious Entity Isolation Filter. This filter gives each authenticated user a private space within a Kafka cluster, isolated from other users sharing the same cluster. Isolation can be applied selectively to some entity types and not others. For example, it’s possible to have isolation for consumer groups, but not for topics.

+
+
+
+
+

1. Entity isolation overview

+
+
+

The Kroxylicious Entity Isolation filter gives each authenticated client a private, isolated view of certain Kafka entity types within a shared cluster. When entity isolation is enabled for a resource type, each client connecting through the proxy operates as if it owns that namespace entirely — it cannot see, interfere with, or accidentally collide with the same-named resources belonging to other clients.

+
+
+

The filter achieves this by intercepting Kafka RPCs on the request and response paths:

+
+
+
    +
  • +

    On the request path, resource names are transparently mapped from the client’s isolated view to a cluster-wide name that includes a client-specific prefix or transformation.

    +
  • +
  • +

    On the response path, the cluster-wide name is mapped back to the client’s view. Resources that do not belong to the current client’s namespace are filtered out of list and describe responses.

    +
  • +
+
+
+
+ Diagram showing how the entity isolation rewrites requests and responses. +
+
Figure 1. Entity Isolation filter — request and response path
+
+
+

To use the Entity Isolation filter, the proxy must determine the authenticated subject. The authenticated subject is the verified identity of the client, derived from successful authentication.

+
+
+
    +
  • +

    If your applications use TLS client authentication, configure the transport subject builder within the virtual cluster to build a subject based on the client certificate.

    +
  • +
  • +

    If your applications use SASL authentication, configure the SASL inspection filter to build the authenticated subject from the successful SASL exchange between the client and the broker.

    +
  • +
+
+
+

1.1. Supported entity types

+
+

The current implementation supports isolation for the following Kafka entity types:

+
+
+
+
+ GROUP_ID +
+
+

Consumer group identifiers used in all consumer group RPCs (e.g. JoinGroup, OffsetFetch, DeleteGroups).

+
+
+ TRANSACTIONAL_ID +
+
+

Transactional producer identifiers used in transactional RPCs (e.g. InitProducerId, AddPartitionsToTxn, EndTxn).

+
+
+
+
+ + + + + + + +
Topic name isolation is not yet supported. For more information, see the related issue.
+
+
+
+
+
+

2. How entity isolation works

+
+
+

2.1. Name mapping

+
+

The filter delegates all resource name transformations to a pluggable EntityNameMapper. The mapper is given the authenticated subject of the current connection and the entity type being mapped, and is responsible for:

+
+
+
    +
  • +

    Translating a client-visible name to a cluster-visible name (mapping).

    +
  • +
  • +

    Translating a cluster-visible name back to a client-visible name (unmapping).

    +
  • +
  • +

    Deciding whether a cluster-visible name falls within the current client’s namespace.

    +
  • +
+
+
+

The built-in mapper, PrincipalEntityNameMapper, prefixes resource names with the name of a principal from the authenticated subject. By default, the mapper extracts the io.kroxylicious.proxy.authentication.User principal type from the subject. This can be overridden to any other class that implements the io.kroxylicious.proxy.authentication.Principal interface that has the io.kroxylicious.proxy.authentication.Unique class-level annotation. The mapper requires that the authenticated subject provides exactly one principal of the expected type, otherwise the connection will be closed with an error.

+
+
+

When forming the cluster-visible name, the mapper separates the principal name from the resource name using a separator. The separator defaults to a hyphen (-), but this can also be overridden in configuration. If a client authenticates with a principal that contains the separator, the filter will disconnect the client with an error.

+
+
+

Both the principal name and the separator must contain only ASCII alphanumerics, '.', '_' and '-'. This restriction comes from Kafka itself.

+
+
+

To illustrate the default behavior of the mapper, given a principal name alice and a consumer group called my-consumer-group, the group is stored on the broker as alice-my-consumer-group.

+
+
+ + + + + + + +
+
+

The filter can only guarantee non-collision for clients that connect through the proxy. If clients connect straight to the broker, there is no mechanism to prevent them from creating resources that collide with the cluster-visible names chosen by this filter.

+
+
+
+
+
+

2.2. Request path

+
+

When a Kafka request arrives at the proxy:

+
+
+
    +
  1. +

    The filter identifies fields in the request that reference entity types for which isolation is enabled.

    +
  2. +
  3. +

    Each matching field value is passed to the EntityNameMapper which returns the cluster-visible name.

    +
  4. +
  5. +

    The mutated request is forwarded to the broker.

    +
  6. +
+
+
+
+

2.3. Response path

+
+

When the broker’s response arrives at the proxy:

+
+
+
    +
  1. +

    The filter identifies fields in the response that reference entity types for which isolation is enabled.

    +
  2. +
  3. +

    For each such field, the EntityNameMapper checks whether the value belongs to the current client’s namespace.

    +
    +
      +
    • +

      If it does, the value is unmapped to the client-visible name and passed through.

      +
    • +
    • +

      If it does not, the filter removes the containing record from the response.

      +
    • +
    +
    +
  4. +
  5. +

    The mutated response is returned to the client.

    +
  6. +
+
+
+
+
+
+

3. Configuring the Entity Isolation filter

+
+
+

This procedure describes how to set up the Entity Isolation filter by configuring it in Kroxylicious.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    Configure an EntityIsolation type filter.

    +
    + +
    +
  2. +
+
+
+

3.1. Example proxy configuration file

+
+

If your instance of the Kroxylicious Proxy runs directly on an operating system, provide the Entity Isolation filter configuration in the filterDefinitions list of your proxy configuration.

+
+
+

Here’s a complete example of a filterDefinitions entry configured for entity isolation:

+
+
+
+ Example filterDefinitions configuration +
+
+
filterDefinitions:
+  - name: my-entity-isolation
+    type: EntityIsolation
+    config:
+      entityTypes:
+        - GROUP_ID
+        - TRANSACTIONAL_ID
+      mapper: PrincipalEntityNameMapperService
+      mapperConfig:
+        separator: "-"
+        principalType: <principal implementation>
+
+
+
+
    +
  • +

    entityTypes is an array of entity types to isolate. Allowed values are GROUP_ID and TRANSACTIONAL_ID.

    +
  • +
  • +

    mapper is the name of the naming mapping service implementation. Currently, this must be PrincipalEntityNameMapperService.

    +
  • +
  • +

    separator is the string that the mapper uses to separate the principal from the resource name.

    +
  • +
  • +

    principalType identifies the principal type within the subject that will be used to form the cluster-visible entity names. Use the fully-qualified class name of the principal. Defaults to io.kroxylicious.proxy.authentication.User if not specified.

    +
  • +
+
+
+

Refer to the Kroxylicious Proxy guide for more information about configuring the proxy.

+
+
+
+

3.2. Example KafkaProtocolFilter resource

+
+

If your instance of Kroxylicious runs on Kubernetes, you must use a KafkaProtocolFilter resource to contain the filter configuration.

+
+
+

Here’s a complete example of a KafkaProtocolFilter resource configured for entity isolation:

+
+
+
+
kind: KafkaProtocolFilter
+metadata:
+  name: my-entity-isolation
+spec:
+  type: EntityIsolation
+  configTemplate:
+    entityTypes:
+      - GROUP_ID
+      - TRANSACTIONAL_ID
+    mapper: PrincipalEntityNameMapperService
+    mapperConfig:
+      separator: "-"
+      principalType: <principal implementation>
+
+
+
+
    +
  • +

    entityTypes is an array of entity types to isolate. Allowed values are GROUP_ID and TRANSACTIONAL_ID.

    +
  • +
  • +

    mapper is the name of the naming mapping service implementation. Currently, this must be PrincipalEntityNameMapperService.

    +
  • +
  • +

    separator is the string that the mapper uses to separate the principal from the resource name.

    +
  • +
  • +

    principalType identifies the principal type within the subject that will be used to form the cluster-visible entity names. Use the fully-qualified class name of the principal. Defaults to io.kroxylicious.proxy.authentication.User if not specified.

    +
  • +
+
+
+
+
+ + +{% endraw %} diff --git a/documentation/0.20.0/html/entity-isolation-guide/index.html b/documentation/0.20.0/html/entity-isolation-guide/index.html new file mode 100644 index 0000000..67f01ea --- /dev/null +++ b/documentation/0.20.0/html/entity-isolation-guide/index.html @@ -0,0 +1,11 @@ +--- +layout: guide +title: Entity Isolation Guide +description: Using the entity isolation filter to give authenticated Kafka® clients + a private namespace within a Kafka cluster. +tags: + - filter +rank: '025' +version: 0.20.0 +permalink: /documentation/0.20.0/html/entity-isolation-guide/ +--- diff --git a/documentation/0.20.0/html/entity-isolation-guide/toc.html b/documentation/0.20.0/html/entity-isolation-guide/toc.html new file mode 100644 index 0000000..9e65da9 --- /dev/null +++ b/documentation/0.20.0/html/entity-isolation-guide/toc.html @@ -0,0 +1,21 @@ +{% raw %} +
+ +
+{% endraw %} diff --git a/documentation/0.20.0/html/images/cluster-filter-chain.svg b/documentation/0.20.0/html/images/cluster-filter-chain.svg new file mode 100644 index 0000000..1d01f81 --- /dev/null +++ b/documentation/0.20.0/html/images/cluster-filter-chain.svg @@ -0,0 +1,4 @@ + + +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO19a3PiyJbt9/MrKmq+zFx1MDAwNKdBmcrnuTFcdTAwMTMhgXhcdFx1MDAxMG9cdOZOnFx1MDAxMEhcYoGQQFx1MDAxMlximDj//aZcXNVcdTAwMDZcdTAwMWLsclW5uqtvlLuibevFVuZee6/9yPT//u3Dh4/paet+/MeHj+5xblx1MDAwN75cdTAwMTPb2ce/58dcdTAwMGZunPhRKE7Bh9+TaFx1MDAxZs9cdTAwMWauXFym6Tb5R6l0uaM4jzaf7nJcdTAwMDN344ZpXCKu+2/x+4dcdTAwMGb/+/B/ccZ38ntcdTAwMDf9XnuzqTY0T8tcdTAwMDJ58Fs43ennh1tcdTAwMWYu+l2Y2J2nduhcdTAwMDXu5dRRXHUwMDFjlykqQsZcdFx1MDAwMFxmXHUwMDEwJFx1MDAxMYhcdTAwMWZPn/LThFx1MDAxNCFcdTAwMDWShJhMMab08WzmO+lSXFxcdTAwMDFkVFx1MDAwNFx1MDAxNFx1MDAwMExkXHUwMDE5IEAge7xk6freMlx1MDAxNdcwXkREXHUwMDAyjFFcdTAwMGWwxDB4vOSTRP/4ID1cdTAwMWVJ0jhau+UoiOJcXOx/XHUwMDAzbv7fReiZPV97cbRcdTAwMGadx2vS2Fx1MDAwZZOtXHUwMDFki1G6XFy38INgkJ5cdTAwMWWeLkZajOrHZ59hfn5cdTAwMDP47PhLd4lcdTAwMGb1lqGb5DNxeYNoa8/9NFx1MDAxZisxSo9Hc1x0t1xy52HS/udcIlNsb9xGPmvhPlxiXHUwMDFlXHUwMDBm+6Hj5nPxcVx1MDAwNsMnXHUwMDFmXHUwMDE3Op8/7vcpv8yn/PnIvy7Cu27+ZIZcdTAwMTDGXHUwMDEyZZe3uqhcdTAwMWSD6PnRTlx1MDAxND6oIMAy5Fx1MDAxMiRIvoiVVITupVx1MDAwZk9d2EHiXuYgXHUwMDE3TXuul9e6+UT1Uvd4mZgrza2t9/JcIlx1MDAwNkiaTNmp21xuUSO0dlx1MDAxZlx1MDAxZq/719/vP/bTzfVlPGdcdJf6w4oued55sFx1MDAxYlx1MDAwZuSnn/L759txXHUwMDFjZVfP/fzTZV72W8f+9J6AYiAzhCmXyEWRXHUwMDAzP1xcP5+0IJqvL0PztyuBn+Hz/lve4PPJID1AXHUwMDEzSayIIEBUyMSojJ8hk0lFzpDMZYI5YZTcQpPgXCKXKIKIQ0IxZeBcdTAwMTaZRCpKsoxcdTAwMDBcdTAwMTBcdTAwMWZcdTAwMDNcdTAwMTEj6Fx1MDAxNzJfQmbtPjSfXFz/XHUwMDE5g4AjXHUwMDE5i1mT7oGQS/wlXHUwMDEwyjIjnFx1MDAxMJl+XHUwMDBiXHUwMDA231OdL9qZa6V4f91erO3/XHUwMDFillx1MDAwM//pVEZhOvDPuexcdTAwMTBcdTAwMTUlIMtEmFx1MDAxZsY4R5g8uapqb/wgn1x1MDAwYvzk2Urge/mgfJyL57rxx+uRSX3hXGZcdTAwMWYv2PiOc+285uKhtlx1MDAxZrpx4y1eMIp9z1x1MDAwZu1geP0+XHUwMDFmnr+OvU+jvpt8eqE03rvXQ+bWf1x1MDAwN1xyKEL8XG7gXHUwMDE1uo3nzVx1MDAwZY77RsXfdrVpXHUwMDA19Fx1MDAwN292yFx1MDAwNNJijlcqXHUwMDAxSLDEL7pwelx1MDAxOGW5KJwxXHUwMDEyx7kkyWJab1CPxCVAhphcdTAwMDImY0lcdTAwMDaXXHUwMDA3PKJeloRDZphASMRMIfTLXHUwMDFmv4T66Lv9sTDghElcdTAwMTDzXHUwMDFi15uLXGLojYn43Vx1MDAxOCBcdTAwMTnKXHUwMDE4XCLpXHUwMDFkXHUwMDFk8nd7zlc98tCfxpV/Vlx1MDAxN/SoxuP1qiZcciU9/lx1MDAxOT0ypdvfxr/52OxcdTAwMWPKevd0pudpp/NmgFxupsyKXGZxXGZcdTAwMTnBslx1MDAwNDl8gtCcUHMkfDKAOXFcdTAwMTaz/0XKLKNbiHJSJECiXHUwMDE0MUFcdTAwMDEw4/hcdTAwMTdEX4Do9rshirmwlrKY17tcYsXyS1xiXHUwMDE1M1xmXHUwMDA0u4L4XHUwMDBm5MzNTuiy5XJcdTAwMTU7bo/QzYb5Vi98K0LRUTeGLUhcdTAwMTVcdTAwMTi4IHaq/5zJS+dcdTAwMWSQ3/BcdTAwMGb1VmNcdTAwMTBnLNWrprs+dWW//DNcIv/+6L2Bi1x1MDAwM1xiSJFcdGaTkzrhd+lTtyxYeDG31lRcdTAwMTZ8XHUwMDFiY0HhbkBPWVx1MDAxMWCIhT5cdIZHOeG3mH9Oxn9h/kXMj99OxoX2YEmC8Fx1MDAxZVx1MDAxN1x1MDAxN0P9MrqJgL64l/JvQfdcdTAwMWbBxtV8XHUwMDFh4jex8T+WjH/Bwd4n48/f5n3I+Otk55lZelx1MDAwMnlcdTAwMDHVXCIkiFx1MDAxMklEc5zQy4x9XG6/qbBcdTAwMDeAXHUwMDAzQFx1MDAxMJPoLd5cdTAwMDEjRVx1MDAwMWZcdTAwMTF2XHUwMDEzgWTC7/h4Wbh4xpjMuVxi/ISTv9iUX3h/gne5/lZcdTAwMWZcdTAwMGZf8vGCiXEqwp0rJFxcmVx1MDAwMYbp88OPZiBcdTAwMGbJxUTyy7v9cCfft1d1SzL7/zzvMyPIrHPsNPyvdppcdTAwMTRcXCPmrTZmXHUwMDFi+c9l/+8rXHSla3Glx5//5+93r35cdTAwMTFcdTAwMDT51436X55284KBnaTlaLPxU/Ga3VxcxFx1MDAxYmuf2nGqXG6d8UPvqWp8TqC/JU/wYFx1MDAxZuf7/PV/k4pYRGCEXHUwMDBiXHUwMDE2LoIwdPFcdTAwMWa5XHUwMDFl29tcdTAwMDf8ylxcuFxijFx1MDAxOZApXHUwMDE3gVx1MDAwML3RPjd0vizTrFx1MDAwMf3xiJy4tzeWSkS63e0/3XsySUVcdTAwMDQlgFx1MDAxMVx1MDAxMGY9N0zkklx1MDAxZHhcdTAwMTRcblxiucWAyoRCwWpcdCD8XHUwMDE2XHUwMDEy+VApucVbuvZccuyEyNfnnptGN5hF2ZvI1n0tflx1MDAwM9nCnFx0NiU0QtAqhFxifVx1MDAxZWDRXCIhkmBbMlx1MDAxMEpOpYtcdTAwMTN7tL2wyJmIuFx0wTknQ/KdmsQr+aqfwfqCZ8dcdTAwMWbvcqJcdTAwMWNcdTAwMDJ/rPltvJ1tXHTlxMJh4ptcdTAwMWNnPuQvW1lcZiGBlJJviaSeiHHfXHUwMDEyXobgXHUwMDFi2JZyl2FcdTAwMDFehEAgUETxXCKU5/gqdf5HUKwv8JrnXHUwMDE0S3lvXkVn86y57XRTXHUwMDFhZbvTQM80u1xu31x1MDAwMm7KeJGJXHUwMDEwiOSFQIjhU1olwp6igCThjEiQPakmXmdPMJWES6FcdTAwMTKg4qp7zEpEUkCcx1wiridcdTAwMTDJV6H9u4D731x1MDAxNlx1MDAwZl9/cVqF219R0kCIXCJZXHUwMDE4ZHytsp+BjV9cdTAwMDY2o1DEWMKH/nxBVFx1MDAxY1x1MDAxZE+BP/cj4VvfXHUwMDEyQ31lRSNwXHUwMDE36Sv4TqPtS+B+8lx1MDAxNjfB0l2x31x1MDAwN9SpOsXrxmzPk360aSdcdTAwMTby4Ey9XHUwMDA1tb+xvedJUUlcdTAwMDJFwYIkiVx1MDAwMVx1MDAwMDG5XG6rP8GaXHUwMDE3c1fNJUFcXJgs01tYI1pcdTAwMTSn8nSnzEhuXHUwMDAyblH98iVfXHUwMDA09V1v/P5eXHUwMDFiPTv+J4KbqF9cdTAwMDFumYj4iGB6k1xmeYh0X2xcdTAwMWEgiDNhX78t//lDwC2obfpAlT8m9uGaJok5/DRcXFx1MDAxZjEnjktdKKJ2IOVcdTAwMTRcdTAwMTPLXHUwMDBiwVx1MDAxMFx1MDAxN1wimoeyjF1qz2XsSPhqjlx1MDAwNW7dJ1x1MDAxMdHjnIlcdTAwMWZvYpV5XHUwMDFjbT+L+1xu1lx1MDAxNseBz6pDLzimVNorZ1WKds4t1l6qXHUwMDEyYihoPlx1MDAxNnPGmYhsryp4XHUwMDBmXHUwMDE0WaJFXGIljjFcdTAwMDCCKV9cdTAwMTWcf0ebzFExz1bmkS+GXHUwMDAw3oNcdTAwMWKUSFFEbeJcdTAwMDJcdHFcdTAwMDE3+Ks54CWsXHLuY+1ryoRMhI9cdTAwMDDf865cdTAwMDCSXHUwMDE3XHUwMDExKCaZXHUwMDEzScTO+M+G4CuqjnW6nUZcdTAwMDfUXHUwMDFlddJjxtbRvozSt3FFUGRcdTAwMDDlca7AJudPlVxcRLqIXHUwMDAyXHUwMDE58jzKhYTdKbRcdTAwMTFWpFxiUC5cdTAwMWWRN7HdUfJfTPFNXG4+erszyXNlXHUwMDE0XjexXFxUmdzGhY95NpqH81xmgZ/HmfzOXHUwMDE0x36c7u3gQznYJ+lcdTAwMWJcdTAwMTPuP1x1MDAwN1l8UfL34YsrKLuxXHUwMDAyZiGbJadJz1x1MDAwYmuxpb/dh3FcXFx1MDAxND4mXHUwMDBmXHUwMDBlXHUwMDA0LST8WX9cdTAwMWKSi4hcdTAwMDNcdTAwMTFjPzSwIflcdTAwMGW8c85cdIRpYHl+jsjkXHUwMDBlvlx1MDAwNSdcdTAwMTUmJC+qXHUwMDExXG45ovJcdTAwMDVVv5zYU4xb319Iz/lcYsRXbOS61MZu6uuX5lNcIlx0JeDyO+bYP2moUVx0cM+aTFqd9cy3XHUwMDA2ilplNftcdTAwMWQq3j+qh+a85mc36Y50K+PDU/pb1Vx1MDAxYVqLtz33hof+UJ/uLn4zTZ2GXHUwMDAxSma7Ki+38Gp+eDP0XHUwMDE5XHUwMDE1oZwg34RcdTAwMTLO5Sti+Vx0+cJrXHUwMDEzTlx1MDAwMJMwkiC9k99cdTAwMDVAWFtcdTAwMDYlKmJcdTAwMGZcbii9U0xcdTAwMTectkhcdTAwMDBcdTAwMDZcItyUOMAyf2fH/v9cdTAwMTHwp99ccnwgXCIpSZhhfi+AXHUwMDE0yL+htY/Iz9ukcJ6s/6sg/yfsofmTLcpl6r7Lorw+Ya9V6oXqXHUwMDE1JcHgMZfySt3zRnmeXHUwMDA3XHUwMDAxXHUwMDE45VU6+SEqvrEnwlx1MDAxYVFMhPpcdTAwMTLGkOCud1x1MDAxYeWB9KtcdTAwMWLnJfsx++7qPMtbpqTrXHUwMDE1XG5X5oPjXHUwMDE3e2RcdTAwMDFcdTAwMTXUXHUwMDEwYFxi39F8fKk4n2xDn0ppOjBcdTAwMDHoa8tTt0rWyo/1w4+H37U4/6LW51+/ieBaOM2821xyirOScKSX59284leX559XnF8481x1MDAwN1Wq70/pjem5TVAwWS5iYVxcXGJAgFFBN55aXHUwMDFlRopcdTAwMTjkPEVYKFx1MDAxOd1bPIdcdTAwMWV6ICQkqO+z1Xe/XG7V32CJ5l+R8+bSQynitnSVj/nLeVxuMVx1MDAwN1x1MDAxOEic/4iE2/fVqa9cdTAwMTL+P0+d+lx1MDAwYl79ecLi6lx1MDAxZN4nRfF6b81ruUeJXHUwMDE1Qb5cdTAwMTCHyFhcdTAwMDZAflx1MDAwZW0sSFx1MDAwNYNE4izv079NTuTLXHUwMDAwRFSLZVx1MDAwNDhcdTAwMTFcdTAwMTbgV1x1MDAwYsrD0W9FtvNcdTAwMTXIxkLJhb7Te2ziernG81xcOlx1MDAwNpghXCJ9XHUwMDEzsl+j4D/XUtVcdTAwMWK7Uf135T9++69cdTAwMWZiPX5QWvNG4nfqXHUwMDE17veWcWNcdTAwMTmW54fx5DRsp51xt/ImXHUwMDFhwIWjp4BCYVx1MDAxNiRcdD1vXHUwMDE15qBcYvKONZSnPGRcbu9cdTAwMDQgwlx1MDAxMohcdTAwMDdcYlwiK2NcdHN6r1x1MDAxYffLWPwu1Fx1MDAxN42F93ZjwTiT8jm7V3iTX85biDhcdTAwMTKJ0+BPL7vdQbMqsFH+S6H5mcTvg+bXXHUwMDEzNa/lXHUwMDEzOJeKRH5YdSe0Q3padkSSVFx1MDAxNOdcdTAwMTDlMlx1MDAxNWhn5E5dgtNcIlx1MDAxMpxfYlxisXykL1mxSy9LkctQXCJUXCJcdTAwMDLVgIJf2YWXwLz87uxcdTAwMDLKXHUwMDFiO7iIZu8yfXqzXCLgd5CL6FfM//V2JT88uTAzovJRm6pnrdJz7NNoZY2O//z6zv9viiPet/P/RVxm5F832n953M1cdTAwMWK+W+v/6yWLXHUwMDBmT1r/gbCRefc8JkJ2XHUwMDA2LiD/cGn+z1x1MDAxYvExXHUwMDA3XHUwMDAwS1x1MDAxNNLb1PibWv9fXyl1JZMwOpBAJqJcdJly8XlcdTAwMTTcilx1MDAwNG5k+IPyJ/e19lxyxClvwCpSmVxuc4qFuYVcdTAwMTcoflwiTlJR2FgxxII7ccThnVx1MDAwNFxuLIpH5G1cdTAwMDNSzoxkcLFcXL+Y0zdcdTAwMThb/+3MXHQgXHUwMDA0XHUwMDFmtqG4m0AhL1MnocGUolx1MDAxZrOu8vsyKD+ENX1vXHUwMDA25Vx1MDAwYjzmOZt6d1x1MDAxZfV6Yeo1XHUwMDFlXHUwMDA1XHUwMDAwQ0VcdTAwMDI5IZxhXGY5elrnRUgqXCJcIlx1MDAwMiNGxDf5qvh/IVJykTH2kILJl2LKd9CNi4hcdTAwMTIu50umhYHA0q8mxZewvfpuXCIl50lcdTAwMTVC71x1MDAwMp6+3N7BXHUwMDA1h1x1MDAxMlx1MDAwNOzb1lx1MDAwMHxcdTAwMWKPaqaWeVx1MDAwNvXOsilcIupyNDHOwcr4K/Ko317GwMPpXHUwMDFi9f8jmNSbWYtgUrJwz1xi5PuYiO/oXHUwMDEy5zyyXHUwMDE2LMxP3n4pUUQwXHUwMDAx9Fb73sSk3szuhEiIMVnwT4S5XHUwMDA0Obu7sFNIXGY5XHUwMDEweouZIFx1MDAxZX9cdTAwMTaxuq/Gb1wiVpRcdTAwMTfz/m45zz4/wd6D6YW4SCFETIZIjDq4s8pcblx1MDAxN8XIXGJ/RzngXHUwMDFjgl/5689cbvKNxnf9dmIlaD68n5CCtyntSyONiFWBXHUwMDA0vilW/aGkavozkqovkJrnpGr63qQq2myj8JzKXHUwMDE1vOmxcmNsm9U6eXOqWZbzJbZERDvS07XRSIZFWVx1MDAxNlx1MDAwZUFcdTAwMTKoR+Sqse4q0yxMbFx1MDAxZZnL+UY291pdfsH67bBcdTAwMGW+XHUwMDAy1nm/XCKVyb1cdTAwMTY5XHUwMDA0X+6QyydCRMbk59uGpvrv0//47b8mf6lU8zOJ31x1MDAwN801W02bxlx1MDAxNO6CkWNVy6vTWu9t34JmKuF892VA8rpcdTAwMTCWn1x1MDAxNY6QjIqcUyZcdTAwMWNcdTAwMDKhXHUwMDE4kVsvTSUhmCzoXHUwMDE1I/lcdTAwMGVcdTAwMTW/0Pzp6LeiefN2NFPMXGJAMrtcdTAwMTdcdTAwMGLhV7ZZRixfwkreMVx1MDAxNPqkgmrcYrDrnPvNvnfekW6mdfizyOhcdTAwMGZs87xjKiZcdTAwMDJ41l/KVDyT+H1Mxevz9Fo2RVxmUDHfp1x1MDAxMOVcdOA83nvG6LmwXHUwMDE1wlxi5M0mXFxcdTAwMDQ4d8pSwvdTiVM5L4dcYpNxrywlXHUwMDE1KVx1MDAxNy6KXG4tzTeflOCv5TIvXHUwMDE5izdv1f7ynlT0od7P7/apSPhlrk8lJlx1MDAxOFx1MDAxZZf/wK7XuTPdSf0915anczmuLsfLxVxm/Vx1MDAxNbek+u1lXHUwMDE4PNx/XHUwMDAzgMtcdTAwMDNv3vHdXHUwMDEyKq9cdTAwMTOIXHUwMDBml+RcdTAwMDUoonydvvgnXHQ+QFx1MDAwML9cdTAwMTL+9yqQcPgyYFx1MDAxMIk3yDeIXHUwMDA27Eb//vSG2/va9Fx1MDAwNsL0sDWUUCTEuEBcdTAwMGWlT1x1MDAwYkZcYrBcIoZEzC5Def5Gvo1/8oJcdTAwMTFcdTAwMTFuW4ZcXETL+FfH7e+6841W8IVccrLvXHUwMDE2jEQoI2N+f5H7NXe92YGPXG7b8W3G7odmNn5cYp353szGXHUwMDE3XGLGc5rz7lx1MDAwNOf19UavLuOhpMiQsFuyiHYwQs+DIanIXHUwMDAwQ1x1MDAwMMtcZjJ03Zv1XHUwMDE4XHLxolAwXCLuXHUwMDE1ivZkW5Irflx1MDAwMznL23GFXHUwMDE5lVi+dd9PXHUwMDA17Z+J37x5X+1cdTAwMTf5XHLm+f58171NV3hHr1x1MDAwMJ7kO39cdTAwMTHybZtafFx1MDAxYr9pOnI6kK2WdtDbxqh+6DbAP6O/JL95XHUwMDExXHUwMDA1XHUwMDBmt9/o/1x1MDAxZkFvvqbzRtCyvJlcdTAwMDNgJlx1MDAxMSSU585cdTAwMGWXr/OZl4R4fbOCXHUwMDBm11x1MDAwNVwiSGUqXHRcIiFcdTAwMGJ+xfGlMH1cdTAwMTEh//NcdTAwMTn5X7PKuVwiYELmW1xm/EFcdTAwMTWiu3r7XHUwMDA2JiWEXHUwMDE21lx1MDAxNlAqc4DQ8zyyIFKcSEDMXHUwMDAwJuxOXHUwMDFhXHUwMDE5XGJjLCNcdTAwMDSJXHUwMDE4XHUwMDA0Juzxr76bz+rxjcZ293ZcdTAwMWFFhGGU2N19+CB5sZdcdTAwMTFI+fIyXHR+29/3+qE06ockkL+XRn2BxjynUe+eUk4r8zNjjVxyOpfldLo9j1FrlL1cdTAwMDXXXHUwMDE0iifz3IZSXCLB60Uwn/ZWIFwi/kFcdTAwMTBAmO+Jcm/hXHUwMDEylopcIizKk5SYiFhcdTAwMTPd21XlXHUwMDE3tN9cdTAwMGXt+O3Q5lx1MDAxMst7XHUwMDBl7i5JRODlJYlcdTAwMTBjSbj7n2+PzapcdTAwMWa8tGHST5r1fSbw+4DZXHUwMDBlWqd9XHUwMDFm9eNsXetcdTAwMGVI5p5V9/RcdTAwMTYwc1x0XHUwMDE2XHUwMDE5x1j8g1x1MDAwNIPnXHUwMDBiizAsXG61kGRcIrhcdTAwMTKA/PaPXHUwMDEw/MLy+2I5eTuWXHUwMDA1jsFDdvFedlx1MDAxN79cZmaAXHUwMDA09IhE2S80//lo/tvncOijvd1cdTAwMGVSMZ6P8cXHg+9m6sv7/f3tsy142Hj0XHUwMDEyN79999FLICOoysZcdTAwMWRe771b2oZXS9w+b7L41duaXG79sEf91lx1MDAwM5bEj/94fPT/mdmJK2bQXHUwMDFmq0Y/k/SaXHUwMDE3KeKrM1x1MDAxOC21kSd+0vJfVaWsTMT38s626m5+RLE6g77UUOJcdTAwMDTNSU9RKj5u9rXqyK1Sx8zSUdBcdTAwMTmZ8spoeFx1MDAxYkPOeq63M7pcclx1MDAxMegt1YHZNbe2XHUwMDFmXHUwMDFmyjUys6K5Pe7NyqNcdTAwMWTZjdk6Mruxaka78tqzh05V27DNxFx1MDAxZqx1Ta/KPWUxqYV6ltWr1bXnV5fq9tw5g5I1rIU4KE1cdTAwMGa45HaGaWyMT5tKWDJMpzTFXHUwMDA1zkshLG2sUWVcdTAwMDRX0mBZai708YlcdTAwMDXWXHUwMDAwREFccjRccubbabCOXHUwMDFk4O7Ks62/6SO755jW6LTb276SWK34XGL3u6FcdTAwMTaR3c7f7mZcdTAwMWKySWItK231fayf19TgXHUwMDA2mrvdxpnxw4F0K6g63qWzne3Yq57daGX7XHUwMDFl7+/yQ+Jyc3fkwI+U02pky2inXHUwMDBmzuHhsFi4o7KdxeOmunC5pXWJfFx1MDAxOJfU2HY57VE+Srk2W5jyqU02LWTWlmkrgbOuXHUwMDFi25DXg+No3O3JStu2Q8pL+6lrgXO6b/AxjVWrttnP10pWWa6OtFPyo2VjrrmZh3SmV2i3Kku9bWr3O11sb2KEgsSGNaZcdTAwMDBnYZVlu7Jd9+v9XHUwMDAy6y7aXumsbpetilRZuWll3Jat3nqtIP1cdTAwMWNWZVxcWDiQOFx1MDAwYjjublwiu+PLirQ9OYt0UZhv3Z0wXHLrkr+t15bDKOotUrqXTDHzsaKs6ngvNFVcbvCxzUvedKh2+nFH1+F8mihCL4an7Ih3ziCg9bVcdTAwMGKi+MhcXLC1oacyXFwoXHUwMDFkXHUwMDE2ctdOy/OSUzXwwW80PV0/N93gjJPT1HZcdTAwMGZcdTAwMWK9XHUwMDFhoHTpK1J1sIkmmlpfz0690b5wPu18c9bZSPY581x1MDAxYoG/Mp1g6Fgm6FxmuORmyFit8chcdTAwMWQwd1x1MDAxOFx1MDAxNrpcdTAwMWXvxLPTbmPVdklFOXdXxDWDrc3rXVLoLnvZ3tacaUOBrckqsazZXHUwMDAxdFx1MDAxM7k/57o5Pq+6cWFcXCdcdTAwMGU9dDKtf15cdTAwMTWkQouYNKjMY/203oJcdTAwMTGCRlLp9dXGqeuzQ/s8l1x1MDAwMuM0XHUwMDBmoLNcdTAwMDLbqW3XcLZcdTAwMTlO16elXHUwMDFi78h+1YtG3fmMdDZDV6/tQTA6b8JZupdnJ2lU8brGeWJ25qUw2GmdjJc748lYQ6sw3I9wXHUwMDE3JGdcdTAwMWLN9IS1t2a1vqp30165Xj2yhbUqjWZcdTAwMWLWLFx1MDAwNLiajKud4ZpcdTAwMWaq/nGOxe1RtULEm5pzjGqKVF6FSHExXZ+GsNXWXHUwMDAz01xiXHUwMDFks17w96BuaHCotiuDqV3aXGKz42ndsVVcdTAwMTlqXHUwMDAz1onry8VwiN1EmtUjT++zydRcZlfDLnXHQp/H8sRpXHUwMDEw77g0jDieXHUwMDA1qlx1MDAxOLdcdTAwMTKcbzZyXHLsmrON05otzr297JvHQlPNKrVcdTAwMTjAvdVPpsagQGQpK2U9bap0XHUwMDE0ZVSIUnVpJeeDMz0udvuShYd2aVKd04WIemZTmbTk9tBcZm1FzY5cdHGNRXe5XcNZta4uJlx1MDAxYyMrVNu0elxczWfh+Fx1MDAxOGhtoyOPlzCYjquDUWHQVjiujTYtbzbNzlxy/ch7XHUwMDEyrlx1MDAxY61cdTAwMTSCVcrTsGPb6m5rXHUwMDE4LJzWpm2otFv1I7PSZWhWz8hVXHUwMDEzczhfrNxmU0PtoS23uiOXOlx1MDAwNbbVvJ5cIo2xXHK3+OyWXHUwMDE2ezxcdTAwMTlYtYPasLTCwUFu3Fx1MDAxZpxcdTAwMDaBvPCtkaZcZkOKXHUwMDBijnPG656WhTDK/Fx1MDAwNSx4Tequm6g24mHVlN1kY1x1MDAxYVqvMilNpFx1MDAxOWJY5YvNXtAgXHUwMDBijFx1MDAwZqvGUedpV+t1XHUwMDE3siTRvpfZjfqqpypmJeCFVcHHc2PcMVrTvpzG1kyClWwvgd1xKpW2XHUwMDAztzEsl1x1MDAxYpVcblx1MDAxY2/CiFx1MDAxOKujPFx1MDAwMZGxXHUwMDA2/qBvqEa73pC9rIFcZqpcdTAwMWY9dV6unCfd7lx0z5NxxFx1MDAxYWF5NGXafkEz2apcdTAwMTes+bTdWELqnMFul+pcdTAwMDdn1PA6nlxmXG5Lr7QotFx1MDAxNdV3XHUwMDE34DQt8Z7SMFqrUmo5aOttZbXVn2w6q1x1MDAxYSBuadpYdZeJum7u3G2w5+7BKoU9e6Itp2W0R11jT0e7cUeiXHUwMDFk73hKXHUwMDBlLVx0XHUwMDE0wEqMiVx1MDAwM9VcdTAwMTK2t+NcdTAwMWQ4XHUwMDA1daVcdTAwMTZV00p68seNuFVXpr213J2fw0mt021cdTAwMWQkxzaGXjRcdTAwMWTYm3VcdTAwMDRlQ+56pjGnzdNY1mCGJkmraqySXk/4g90gXHUwMDEz9sBYVVx1MDAxNlYsl/SZPSSJrtSC5sA5W2jTqfTXp/ryIFlaqWVcdTAwMWNSdoxs5lx1MDAxZVeyOUFcdTAwMWJb8cZcdTAwMDaTUnfVXHUwMDA0XHUwMDBiXHUwMDFi7nGWMcNcdTAwMTBcdTAwMWU0mjNncur2S4p67OwpmFx1MDAxYfpi3jb1WjDAi0JJZ1W/tDt311x1MDAxM3tUrVx1MDAwZdOFXU3UhZmWY1prj1RY2yxcdTAwMGKsXHUwMDEyXGYnc1x1MDAwNNpavVGPNFfT556r7dun+mHeOlxiXHUwMDA3U6/DeGLMTL1jWezYPaRcdIdSpWnK9m7PKvr+5GTHUtTJzvFMP8RGt+0sdKNGsr3RXHUwMDE4XHUwMDAyLtODp6ylStTRtHi8nm1KJbAxWyerPulOh0fPT6KykrVcdTAwMDdqs6PiobJcdTAwMWNJ8yWY2Fx1MDAxZdRC06zy2m7U4bNFXGY6vbU/XHUwMDBi20NcXG6jntfupHzMl8OAaN1gxVxuzlwiMVx1MDAxYtXl8FxccOi4Ol4ttzijztKTZnZ3ONen0qTa83cjXHUwMDA1XHUwMDFlXHUwMDA3WiPbINUhnVVQ3TeGNZiF56FcdTAwMDZ7iarO65O11j4ncmszRCXqpVx1MDAxYq1illx1MDAxYrWSnGLXXHUwMDE5UWO1XHUwMDFkr45cdTAwMTlGaWtcdTAwMDfsNFx1MDAxY4OpWdvDQqTISkDXVXdcdTAwMTacLZni+ahNlVo1k8Nk1a9NzcPM2qj7RY1V3FI29dVI0Vx1MDAxYcmsdmzXK6BcdTAwMTTSwny0qrJhpzNpdU6rZYFPTX6Qz/FR6q33y+U6ypzE2zcqjb3VkS1YKJzMtXo41Vx1MDAwNnNcdTAwMGZcdTAwMTdcdTAwMDad3jSArWnDVFt8XHUwMDAyjNI24lx1MDAxNVg77iDez/ZDXHUwMDFmha1cdTAwMWHk+1hrMaFq43qWKX5rsSBcdTAwMDSy0dDaJlnSKc/BzLQq66RcdTAwMDHWamNVqsjZSO01W8ueMVWHVvOUpLXOujZGluFcdTAwMTjJNPK8WWVi9r3toj3pT3qwVvZatHCIXVxyTDYtbsLRaV2Ck3qhdFx1MDAwNk7it4l7qDK7rTdcdTAwMGZqN5ar5t5GI0XRO6meON56WfVDpTxptNvr/trytVlrOz2lulbyzM24XHUwMDEzhl5NXHUwMDBiKVx1MDAxNZBbhYargHaNKMGpkC7kNq9cdTAwMTJnJvnliDNTXHUwMDFmXHUwMDFj50NtqdeSdOVKK8PvKGVcdTAwMDdWasIyXHUwMDFhRkVtL1fVTqWbeWpcdTAwMTWZmlx1MDAxOCl11O46y5lZz4xVqSoxq5FJ5YSc0pnd7CYrdNxP9zUlKpf2dT1A23Ns11x1MDAxN/3NYFiolSdAMTz3VDmiQcGbXGJ2O18u4nmC5fmmXyH12SE+lce9oVWXaGWDRrV+ctY356hcdTAwMTFbY11OI2xcdTAwMWTQLJGT6dbrrKo+XS49ZTtcdTAwMGJ7WUWrpUfHXCKWn+LKyGhU/dmmbiq+app6tTD1atEurbH2qpPg7XRjXHUwMDAweJg3OqWyUvFcdTAwMTRcdTAwMGJcdTAwMDXS3oVrhWld6O1cdTAwMWFOY8xcdTAwMTW4iEdha5tV03a6s1x1MDAwZeuCVHFXu1JTkpTqxlx1MDAwYo1zwtV2OEyXq0l36WLDIf6pUlxy3dYy6dWk2Vx1MDAxZZBddrI7ZiVSXFxl1p1cZnaLTqHtWXu7Yc62ejKMy6e2mDBq+8uarVx1MDAxN/ST1DfR6nhObd7o9Fx1MDAwZaPSoCNIyPjMQWHkXHUwMDA0J0XT/YyQQsiUyqG057hUkpeZZPS99kRvkl53WcPpYVFcbtNcdTAwMGXn6JyhVifToXRcXJROw2UvlVvBwHdR3CFccl5al2tNXTCOwVx1MDAxOTTmTVx1MDAwMZZpe8O1XHUwMDAwaK3qcu3EI6Q0asN210JS/eyo46DeN0uBstXTaZI0MtxcdTAwMWGtd53KodwsXHUwMDE39vJwXHUwMDE5ccefXGJgW1x1MDAwNVWfrKZpu8dcdTAwMTR13dA2TcNcdCfZrq3197uD2qxcbknt46yxQNNq4Fx1MDAwYn/nWMeNkm31QVxiZy6Q90aNdeduQ0FlQT9ala4ps7bKaImtzE1cdTAwMWP3/Z5WdfYnYVBZMHM2zOj1NL3Vm6j9JNrX1WFlOepmxuaUIHNcdTAwMTnZ9dWxZte0fs03rXRu1mqjoJIo9WPFOCV7XHUwMDEwyyeT8bVOK9tRXHUwMDE4sPPSaI/r6rGt41ndr0TlNm5cZrRzR21cdTAwMWbXp95uXG6zqbLzpF1cdTAwMGL1hlNXXHUwMDExXHUwMDExitZcdTAwMTVw322rNbNcdTAwMWOeUzpcdTAwMGJcdTAwMDJ9XHUwMDEwReWDosJwzq2k1muQlmFlfnt+Vlx1MDAxYn6tVV5zTVx1MDAwNGibXHUwMDBlU8twW1x1MDAwN4PJeEKU9rzVXHUwMDE5aVFQtqk6XHUwMDAx/b1iKNuNPC1PZqNB9ZiYwXybXGa0NZn1K9tpXHUwMDBiW4KTnU+MlWpcdTAwMTNcdTAwMGZEPTRcdTAwMWSrK6S0e/tJS2mX6Vx1MDAxMI3NRalSl1xyaPbmnspcdTAwMTV/UGj73nZb0s3pVlXckVx1MDAxOIeDcFIrYUG4tVx1MDAxY6y8zqiqSMAgp+1Yj8lmXHUwMDFi2U18XGbW5SGyyNI/N4ferHmkx35FXvtVXHUwMDAxkP5eq2nZSJa2g77WPnq7dVTH5apdNjtcck9cdTAwMTWa253AJis3dnFnooLQqHSckVnIOtm4Vtguklx1MDAwNVx1MDAxOG5Wx0JjXHUwMDA3276jhT2UKUl1XHUwMDA2Wr31hofzuWJcdTAwMGXGSU2Z152KrTeDYMqD0WRgilecK+yEouWyOViQU1fKKiOlLChJ3Vx1MDAxN2ZuZOmkXHUwMDFjLFblMqxpx3TkJ43DuFCn1tRbn5Tl3lx1MDAxYpTSwnw+tVSpdp6tbV9cdTAwMDVTd1fYTjStlFBntztcdTAwMTYqOm5hap4sO1x1MDAxYqpcdTAwMDPNtoNt1EmDmoeidn9cdTAwMWMrzXHB1utrbFxmXHUwMDBmXmJ36rCza82aqyZii1Xj1K5ULKngznbufKQ348lix4Wtaktzo6wtW2W8KujHdM861W1j2Vx1MDAxZTqjifC5/nJTXHUwMDEy8lx1MDAwN+lZfJXK3U1vk05Lht0x/Lq7Oq5hqK2Pa9rSllx1MDAwM8s9XHUwMDFme9G8WZrM51l1NlXPcTqYaVx1MDAxNK3QaW9Ym265UVKntX5n1bZJL5lEvchW6spcXHBmWlh7vZo7PUikXHUwMDFh5Fx0Sq/vno6mkp2paad8XHUwMDE0WaFcdTAwMTi2xlkyW1VvVj6eXHUwMDFiY1xcLkRkdqqxXHUwMDAy6PWnztabNKi3aNdw4Ois1k5ccq3VVYblXHUwMDEx1Nqto4tYLXNqI32zPVhbqVSiUk9cdTAwMWZMl1x1MDAwZVxys/FocFx1MDAxYZn5fnRsVt8ppcDL3PTc8+pm6Fx1MDAxObNab9tcdTAwMTiNK1v3tI1Ki1x1MDAxMu02xkbYX6+b25Kpalx1MDAwNu2241x1MDAwMPYj51x1MDAxMHTXXHUwMDAzYm9Bv7trT41up1x1MDAxZrFVXHUwMDFm0fa5vWqgRlmR5lx1MDAwM2NMXHUwMDE2QemEq6B8rKpcdTAwMDVZU30wTfZcdTAwMDM6mXdqSy1cZjS/f5xl5W16mO7Kca/aL6/tVr1zoEOcnCdcdTAwMDXBKdu0kmj9RlxcQihKSsNcZk73621bX4OGsFx1MDAwMGqmTJQ56LvzwZrr/na3a/Zb67NV99KR3eiGJ6kwtlvr7dpbsT5LXHUwMDA2tW5cdTAwMTBjsCPMqa3HilrW2MTdeP7cPLSVdFx1MDAxMNY6rk5WqVx1MDAwMVxcdVx1MDAxOZ71fk+nnjw6TdvhvMBcdTAwMDbOeJxcdTAwMWT6NWlcdTAwMWEssqE2NbdcdTAwMWLaXFz745o06JTH02GDdTpcdTAwMDFpl1xc0m6GY18u79aLrO6gU2dwKveqqIz5oXVcIslSL3tRn7hj2q9TfVx1MDAwYiZ7+ywmY6qytLSc2MEhXHJStTeqjtOZXHTicFx0KmavWjuUnMkh6zhzXHUwMDExckdwvFeyRTc+6+c5TN1u2cvmVmr6u56drrRyypdMXHUwMDA3ybzJXHUwMDE3gXXk+504r47LjYmhRd5cZkaHvrJkXHUwMDFhhSY+1qNpY2A1Uk51aTLtNnHHJM5eZ8M10yFcdTAwMDS1dYX1li2jPzqqrjm1mlhcdTAwMWZ7TmvrXHUwMDA34pMrJFlcdTAwMTSOpVx1MDAwNW1cdTAwMTWykSfmx3vIjTX7I6zF66bnef/5n1e5y9h9kpSF+e7l5FI7zzsu+m5cdTAwMWH77uH2qseU5L/+9q//XHUwMDA3pFx1MDAxYlxygSJ9KafkaClientKafkaBrokerAKroxyliciousVirtual ClusterBF(A)->BF(B)->CCZF(Z)->YF(Y)->XXYFilterFilter \ No newline at end of file diff --git a/documentation/0.20.0/html/images/cluster_topology_many_to_one.svg b/documentation/0.20.0/html/images/cluster_topology_many_to_one.svg new file mode 100644 index 0000000..1861859 --- /dev/null +++ b/documentation/0.20.0/html/images/cluster_topology_many_to_one.svg @@ -0,0 +1,4 @@ + + +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nOy8V7PrRpot+N6/oqLuI7s2vOuJ+1x1MDAwMFx1MDAwZlx1MDAxMIQj4WcmOuBcYm9cYoCEuXH/++Q+Uul4taQ6Xd0zIyq0XHUwMDBmXHTHROa3vrXWl1x0/q9/+ctf/rrsY/7Xf/vLX/Mtjdsqm+L1r//6vv2VT3M19GBcdTAwMTf64fM8PKf0w5Hlsozzv0HQxzPe0qH76ay8zbu8X2Zw3P9cdD7/5S//68NfsKfK3s+9XW296yRVLMS1xW5/66OHdnw49cNBf2/MlKdL3Fx1MDAxN23+cddcdTAwMDa2XHUwMDEzXHUwMDA0+UbTXGJcdTAwMDJjXHUwMDA0QpAo8cvOXHUwMDFk7MRw4lxyZShcdTAwMWFFYFx1MDAxY2dQhPll71plS1x0jkBcdTAwMTDkjcIpmIIx5JOTy7wqylx1MDAwNeyn8DdcdTAwMDKmSZJkwOk09fGIn5ryb3+Bf9kyL9PQ5PzQXHUwMDBl03t7/1x1MDAwN5K///extUmcNsU0PPvsl2OWKe7nMZ5A93w87l617W3ZP1xcXHUwMDFkdDHozr9+8Vx1MDAxZP7PjUe/2P69s8CXXHUwMDE2ZZ/P70OA/LJ1XHUwMDE447Ra3rtcdIE/3sV7XHUwMDBiRzX7MFr/98c2TXGXq+/D1T/b9pfNVZ/l74Pw11x1MDAwNO0/+7o++/nr/j7WXHUwMDFmXHUwMDA3XHUwMDEy+3nL//7Y+Dx/vzKN41x1MDAwNFx1MDAwMYPB+mXHx3gj0a+2XHUwMDFhQ/8h9jCKYjBcZmU+jm01XHUwMDBiIOaWXHUwMDBmXHUwMDE3vcftnH9cdTAwMWOC95aJX8bjpzH5Wcgt+fZxXFw+iVi5eWL3XHTB4TCid+vS42pcdTAwMWY8/vrLcf/7X7992Z9OVsoppWdcdTAwMDa+OoJcdTAwMDZcdTAwMTfFcXt4N+zzb/n798fTNKyfXFz353dcdTAwMWaH5Tlm8U/3iVBcdTAwMDSC0Vx1MDAxOIHBXHUwMDE4jP+yv6365ssxa4e0+dg1//JJg7/A5bfv8itcXH7WST9BkibeQCtIXHUwMDEyJ1x1MDAxMYRGSPxzTFx1MDAxMtRcdTAwMWJBoFxigVx1MDAxMzhcdTAwMDJcdTAwMDPMfoVJXHUwMDAyf6NcdTAwMTmGwWlcdTAwMDSFXHUwMDExhPpcdTAwMDS1v8CSgP9cdTAwMDTi94Aof1x1MDAxYomfXHUwMDFk/zPkXHUwMDEwXHUwMDA2XHUwMDA3w0Eg8LcwXHUwMDA3Ru97mEMohoBJhsaxP1x1MDAwMrpcdTAwMWZcdTAwMTm/XHUwMDFmw/E9XGZBXHUwMDA3aPG9if+vnm+rz8dy6Jdbdbw3XHUwMDFlhT/bKsVd1b53PvHZtdi2Kt574a8puE4+/fXTrlgqwHK/XHUwMDFj0FVZ9ikrpeCicdXnk/pb6G2YqqLq49b5tP1/+bL58XNcdTAwMTmu+fzTXHIs0zP/tIty5e+wQN5Q4ldcdTAwMTDNUuOUnlxyYrqaQjVaYiQg19tvZlpcbuBcdTAwMTJFSVx1MDAxYyFcdTAwMTlcdTAwMDInUerj2L/3XHUwMDFliqNvKEVRMMOQMIN9wpR/hzVKIW9cdTAwMDSCoFxmQsBcdTAwMThcdTAwMDOT36JbXHUwMDFjXHUwMDAxhE2iMEwgOEFhXHUwMDE48jE7/Inzz3E+/MOEi1wiOEnDKMHgn1x1MDAwNvfP6Fx1MDAwN5Loe+gnMZIhcVx1MDAwMvt4Z/8w4/7D1PirlOtU0ST8u3SnNm7ymlqGXHUwMDFkWJt+XHUwMDE05ZI4XHUwMDEwLsynePzjlEtR49+8v1WEb7x4zdpcdTAwMGbqiFxm4zdcdTAwMDNcdTAwMTSBXHUwMDE54o1iUIb8VKh+4FxcknzDXHUwMDE4isRxXHUwMDE4/2L3t4UwXGbD2NfopOE3XHUwMDFj4J9CMVx1MDAxMkNcdTAwMDE7M3+C8zvgXHUwMDFj/2FwXHUwMDEyXGZcblx1MDAxMiDQT99Sw1xi9j1sXCJcdTAwMTRcdTAwMDXSM/j/XHUwMDBmMfNcdTAwMWaTw2ejz+myrKcst0mq6+gqsPvfhyFcdTAwMDKFmVx1MDAxZoShb7fmN8hWgFx1MDAwMOZcckFIkNgwXG59XHUwMDA3wudcdTAwMTiikTdcdTAwMTKYSVxmRlFcdTAwMWNQXHUwMDFj/lx1MDAxNYRI4lxyftetQFx1MDAxYVx1MDAwMSXDYPTXXGJcIuA3+NNcdTAwMTfyJ4K+hyDvt8tYICZAxkK/9ojvw4Z+haBfsEJi1LtU+USI/Fx1MDAxOFx1MDAxNfu7w/l7KpZ7XHUwMDFmhek7KvbzSPpENf8zVO1/wFTfVrVf3s6PUbVIPShcdTAwMTXtKZf52l1XpupXRHj9XHUwMDFl0qRcdTAwMDBpfnCiX1SPXHUwMDAwXHUwMDFivuE4wVx1MDAxMFx1MDAxOFx1MDAxMDzAXHUwMDA3f+1U/yTNXHUwMDFmXGJ5TPiHSVx1MDAxMyFQkqYpXG75lqIlv9a5v2RcdTAwMDKafK84wD9Q0f5HpJlNttlytc5cdTAwMWV27WaNc5mYgPkvI81vt+Y3kSaKXHUwMDAw0lx1MDAwNGaNRn9cdTAwMDLC51x1MDAxMKKJN5Kigd/7UNr7tMT6J2t+2PpjIST+dtJEQVx1MDAxMJFcdTAwMThBfFx1MDAwYio4THxcdTAwMGYqOENcdTAwMDPPiMJ/cubv5sz/gKj+mZz56077XHUwMDBiN/xcdTAwMTngSVxufcORd0bDgNf4NFA+iGSKeYOBvSRAPiVh4GC+pkxcdTAwMTR9o3GKoHFcdTAwMWHkW5BcdTAwMTW+gXeQUTCawmlcdTAwMTBcdTAwMTEkQ4GDPiaVP1x1MDAwMf854JXfypnodzlcdTAwMTNGXHUwMDE4XG5cdTAwMDXkSH5cdTAwMWHYPyeC93mz72VcdTAwMDIwgjSJXHUwMDEwzMcx/lGZgEF/V0Hll83jUH3JyVx1MDAxZt/95WPMfPjwy/v/+1+/efT3XHUwMDAz9f31t69j9ONcdTAwMDW/4u42nlx1MDAxN37oumpcdTAwMDF3ar238qukvMTTwoGBrfri8/H7efr0t1x1MDAxNJM/5LH0+d5cdTAwMDN/XHUwMDAzqVx1MDAwZfAtTGJcZo1RJFx1MDAwNfiV+eSwXCJcdTAwMWXfc/lcdTAwMWJcdONcZlx1MDAxMLjg9c7SP6eMT4Mk77P/uFX37VbRklO020LBT/bg4OGRfatV8Fx1MDAxYpDSXGJBkVx1MDAxOPZepmCwj1x04pdGgY6lXHUwMDE5XHUwMDA07MFcYppcdTAwMDJWXHUwMDFiIb+O3PfOYt9zU5nHX6FcdTAwMDM0+dN9XyaxvE2G9bdV45J0PY+GtVDD+thv2irGXHUwMDEy+ltEXHUwMDExXHJsXHUwMDAxsFx1MDAxM1x1MDAwNMHQQFx1MDAxMjHYXHUwMDE3lXKCfMOBXHUwMDFigCkwJjhGfExcclx1MDAxZm1cdTAwMDVcbkaPXHUwMDAxplx1MDAwNKVoXGaFP6m0/pIj0Vx1MDAxZjxcdTAwMTX9P+5cdTAwMWZe/y/Ph4T+Oya/cJzCMVxmXHUwMDA04TdcdTAwMTJcdTAwMWaGfb9sXHUwMDAwXHUwMDA2XHUwMDBmRVx1MDAxOJr4QzPOv5L4gLRiyI/Z9I9IoGnY9rZKq1x1MDAwMcDt21xu6Hcpnja/L7+id5Zh/J7Y+azVXymbbzbzxyibhYuIRk2ezHxcdTAwMWQ6fVx1MDAwZfBcdTAwMDJNuK9BW3Vx8UUlgCFBPmRAUGAoSZLwJ1NPP6FcdTAwMTZ9YyiawFFcdTAwMWNcdTAwMDBcdTAwMThcdTAwMDTN105cdTAwMDZj3t5Po4FcdTAwMTn6zmqS71x1MDAxZfFcdTAwMWZC+JuS5cdLXHUwMDFi/Ivt/4VQJrnfXHUwMDAxZcAqoF9cdOqruviHmP+umVx1MDAwMVDGXHUwMDE5XG6msT/iZj5ryFdgxlx1MDAxOFx1MDAxOCf+XHUwMDEwmFx1MDAwMbstXHUwMDFm2PKvc/zKs8+G8adcdTAwMWX7K8GQWU7lKFxyU1xiaD2IRuyOY/SdJlx1MDAxMFx1MDAxNMOInIpTjMhg4pNhXHUwMDA2uM0/U0a/XGZcdTAwMWJ4+5VgSadh/Lm5v4K1XHUwMDA2ce5cdTAwMWW5l+Yr6Z1FXHUwMDAyfFx1MDAxZHrB76i8UVx1MDAxNPBjwPdh3ypcdTAwMWRgMPWGwVx1MDAwNEBcIoZcdTAwMTNANHxdb0cxXHUwMDAwWFx1MDAwMtw9TJI4TKLk14BcdTAwMDO69lxyp1x1MDAxMORD+e5HU+Y/iDXke1jLhneZ+M9cdTAwMDWb9Fx1MDAwZtfecDBcdTAwMTBcdTAwMTRFYN+CIM58dzJcdTAwMTmhMFx1MDAxYYcp8lx1MDAwZtVcdTAwMTN+ad2PnfT911+7bv94aokp75sljjM8+IqNhddcdTAwMWZw3Vx1MDAxOFx1MDAxMSz5asO2Y9XB8MCVayDRP2qSXHUwMDFhwFx1MDAwYkU/xs4/VCu0XHUwMDE1TlCCysTXe4ZccpGHuTSh/CaGXHUwMDA1llxueSNBmkZcdTAwMDH/0TAwKJ8jnlx1MDAwMcJcdTAwMTgmaISBQYNR5JNs/nfIU9hcdTAwMWJBXHUwMDAz4/DTXHUwMDFhXHUwMDEznPlcdTAwMDbk32fxcPK9tEWhXGZcdTAwMDHj9G9cdTAwMDf9P4lk/1tcdTAwMDH/96xcdTAwMTbDQLZmgKH8al3YO8Q/kZZfQZxcdTAwMDBcdTAwMDOP4X+oZvjrLPvHq4a/gWXhhLnfkVx1MDAxNMNA25FcdTAwMThNyJTK3tcsplx1MDAwNIEn9D1cdTAwMDWCXHUwMDExQXNcbv5PZtlxXGbE3VdcdTAwMDfaWP59xmf5SVx1MDAxN6T6XHUwMDFia/NcdTAwMDBcblx1MDAxOFx1MDAwMiw+XHUwMDEwtFx1MDAwNPzFOkyEfENcdTAwMDCGXHUwMDEw8lx1MDAxZElAN3xcdTAwMDU2XHUwMDA0Q96AuKBcdTAwMDHgUFx1MDAwMCjqk/nVT2zoXHUwMDE3JVXqt8Pt/z+2lPxOme6bdXkwaoBcdTAwMTBcdTAwMTn0W0RKfLJcdTAwMTj2XHUwMDBilFE0ULNcZkX8+HLcXHUwMDBmKcz/hW+f8/KfU5j/z7Kp3273j/Gpvy5Pfq1cdTAwMDLP0ORcdTAwMWKwLShOXHUwMDEwwPLQX5AojlBv74vS3lfowThFfqNcdTAwMDJcdTAwMGaENYFcdTAwMTA0/b7UlkBAXHUwMDBl+Fx1MDAxYdYkXHUwMDAxXHUwMDEyx3vGfp/XY1x1MDAxMORcdTAwMDej+v87XHUwMDA1+E8z8Vx1MDAxZizAg9yL0CBDf4tVXHUwMDExnP6qLP9cdTAwMGKtYjRcdTAwMTBCKEH+6EXYXHUwMDE0IOtPpmX+y1xu8N+N0/fXV1x1MDAxMfrxcl/x7Fx1MDAwZiu//55CN4NcdTAwMDNoojRcdTAwMGW8+jtcdTAwMWU/OejvdW5wwFx1MDAwN4yiJI5cdTAwMTJArn5cdTAwMTUgv6n4/usm/C+fTVx0gKzwYaVcdTAwMGKKvtegaOLrRpFv1HtQXHUwMDAxgY7DKM3A/2XF91/v6v9wrTqwXHUwMDEyKI1cdTAwMDHpQlEw8ZXRwEFX0EBcdTAwMTnBKE5cdTAwMDE38S3tQ9NvOEUxMIFSXHUwMDE4/uly9k+MXHUwMDA2SPFcZoKhP1lcdTAwMTnkXHUwMDEzefRnkvw8Sd5+a5L8/lp1mkHfZ9m+kSPp71x1MDAxN1x1MDAxN96fXHUwMDFmeleuP7668N9wqfqvXvdcdTAwMWaoWnyVTr+WiFx1MDAxNDBcdTAwMTFcdTAwMWbj7Vx1MDAxZqouXHUwMDEwXHUwMDFhNUbDXHUwMDBi111j2Va6XHUwMDE5njy+/Fx1MDAxNrdDI/BcdTAwMWJC0SRKwVxiMDVfVlx1MDAxM3H67X1BXHUwMDAyjIOcXGZj3ygtICT6XHUwMDA27C3IedRcdTAwMTfVyD/n3H5cdTAwMWTd7m83N4Cx31x1MDAxN1x1MDAxYmBfIfZdXHUwMDA3fe14Pj5xXHUwMDAyRNL7spJcdTAwMWbtbVx1MDAwMEl/0lx1MDAwMX/A23jVtDzj9u8u4S/sf+Npt19p64/xNL+eZH7d0zBv6PtcIu5cdTAwMGYz5lx1MDAwNPZcdTAwMDVfU+RcdTAwMWKN44CPcfT9wdFvPMZcclx1MDAxM29cdTAwMThKXHUwMDAz1Fx1MDAwM8qmXHTiW55cdTAwMDbB31xilCFolKJhXHUwMDAyXHUwMDAz9ulPuv5cdTAwMGWgv7P0/vcsKqLeZ9VQ4pueXHUwMDA2JIHvelx1MDAxYUDYKFx1MDAwZUT/j65iUFxi4Fx1MDAwNfLTqP4v8jTfi9NcdTAwMGZ7v4zQj5f7ioT/+Z5cdTAwMDb4XHUwMDA37MOCXHUwMDFjXHUwMDA2XHUwMDA1JEqRNPpxxu0vXHUwMDFml1x1MDAxNFx1MDAxMTCGXHUwMDAy21xuXHUwMDFjXHUwMDA2uEHkP9vUwG/o+89cdTAwMDZQXHUwMDE00IdcdTAwMThgf/hcdTAwMWJtQoCPpGlcdTAwMWOBcVx1MDAwNFx1MDAwN6mFpr9e5vRPMjVGj+n6kmDnvr9p/44tnJ3U229cXHZcdPxcIk6+RzEwXHUwMDFh8MdcZvih5lx1MDAwM6NvQFx1MDAxZVx1MDAxMyT54YF55lx1MDAxYuJcdTAwMDbF3oDvw2BcdTAwMDZnXHUwMDE48M+3nql/dzNcdTAwMDS4OElcdTAwMDHzXHUwMDA3ulx1MDAxNP9z1eX3XHUwMDEypP9cdTAwMDOKPlx1MDAxOFxmuvhbOlxiQeDvP3hP4O/PXHUwMDA04siPXntcdTAwMDTQXGb+/Nfnx+/G6fvrb1+H6I/MkF9i/jt7/km5XHUwMDAy3m3+ilx1MDAwNFx1MDAxM7U4XHUwMDAxulx1MDAxZGrTrOz4da74Tlx1MDAwMVx1MDAwNMja91x1MDAwMlxigWJcdTAwMDTBXHUwMDEwXz2WwTBvYCdFI1xiQ4CUTn/jeeA/XHUwMDBiID8wYYT/cFx1MDAwMVx1MDAwNCFcdFx1MDAxMPFcZvnN1YpcZvn9KjHQXHUwMDE4OP2p4/pBXHSDXHUwMDA0XGb/gzy/5Md6oY72v/9NdfC8cLLp8fjG01xi3/1cdTAwMDUoXHUwMDAyiFx1MDAwZUDsoG9QXHUwMDAyY5DPQp14L2lcdTAwMDLdgjFcZlx1MDAwNnrwkzLFnz9cdTAwMDH1g4M8+serfO9TmO+e/Ftzn2BcdTAwMDC+XHUwMDFi5DTIQVxiXHUwMDAzRPVcdTAwMWaJ8l/a97tcdTAwMWXgw1skVWzv2mPWi7/Zm79cdTAwMGYr+zvLZiRK/J7qw69A6Nut+VxuQt/6sSZcZmhHmsEpXHUwMDFjpynsi+d5XGKUfmNcdTAwMTiEeKeAz57D+fO3mn5cdTAwMDRi4t+x+Fx1MDAwNlx1MDAxOGPA5OjXXHUwMDBiXHUwMDAwPnTxd1erf/iplveHL390/v+9wfsxXHUwMDE2/7v+UtN/QEP/zF9qKqopP2RllGa43939XGKK1/aNlbXfMYpcZvOOZJihwFh9vuiHIND3Olx1MDAxYoVSKEwgn4bNn07x78P8Q1x1MDAxMZ79Vk78vlNcdTAwMDSmXHUwMDFluMVvLm1/z7jfXHUwMDAzPsjnMIl9Ku1/UCVcckb/W6xcdTAwMGX40yn+PVnkN/n+XHUwMDEw6XM7qStcdTAwMWN4xJyh3fxbuJ9GiLf3XHUwMDA3dUHvUCBcXJDPTVwigeBvIIsgMIngJMZ8ayVcdTAwMTGJvS9cdTAwMTeg6feH+b4tnv+cMvtmWsh/O/FcdTAwMDP0Y1x1MDAxOE7gzDdX3ZLff0yNXHUwMDA2pI8h9Fx1MDAwZnd+XHUwMDE0XGZcdTAwMTO/y/l9xfxfTkRxP4L9/0mTZtyPpvpfX/f/q5NmXGb6xmA0ReNcdTAwMDTIyVx1MDAxOPyF8cWxN+CHcVx1MDAxNIxcdTAwMTfFXHUwMDEw1DeoXHUwMDFlxt/g94eHKIxAYFx1MDAwNiW/QfVA/4NrXHUwMDAz64thXHUwMDA0XHUwMDAzXHUwMDAzn/VRT/xJ9Z9j+v5cdTAwMGZT/fvzvthnXHUwMDBmln5C9ejXv9TxcSUg/D4zXG7O/eFQp2j6v1x1MDAwMdd/N1DfX3/7Okb/OVxc/yNW5KHvXHUwMDBi7HGMYcDQoyj49MlhP89eMW9cZoVcdTAwMDKck/CHXHUwMDAy19fB88NVxr/83GF/jcfxtoCQ+OVm//qq8pX7Pi3/y89ccvvwXHUwMDE0xcfo/+1cdTAwMGYsfuxV4Na63Pn0YVwiaFx1MDAwNN3+McL/4JOQIMRj93p5P/n97b/9cun/I4nnnMT/tfI487rCmlxcXGYseFx1MDAxOTe3XHUwMDE03Vx1MDAwMrxcdTAwMTPfP3Isz4bgX/5cdTAwMTFcdTAwMDdK/r6FXHKM21x1MDAxNVbZacZT0mZZoVwizldRcnOJyvx1cVvD9bHaVIvOxFY7L1x1MDAxZaalklxiUXI33/LHuJpevEwmwZDGnp3w7oN8eHQz+NbE+cODb4rYySSxo7uwujWaqEmYzd5DudfWVZGkpqikklx1MDAxYlx1MDAwZuNAoMCRe6KFolx1MDAxN1x1MDAwMeWGs0ymt3dCXHUwMDBmmX5cdTAwMDZFxIlhoFx1MDAxZYW6wFx1MDAxNVxctIZvJXS+a95Ot8Fcclx1MDAxOVpcdTAwMTk5m3RcdTAwMTUvbTNlSP7gk7HqrnhsZ37g7o9nXFyxc3CZNvT5cMSBfDyq8ZF0ZDdP4lxujdpz0o6GMlx1MDAxOVx1MDAxM09zSz1o5vVcIi1cdTAwMDGXvMeSPOIsru1YvaxPm7k+3jeBw/3HxiDVwO61XHUwMDFiY/hDu1x1MDAxZP3rdb/nLlx1MDAxZq+Td+buOVx1MDAxM4hcdTAwMTaJvTyIm+KcoWyKcVx1MDAxN0ZM7j6262R3wX25XFwuM5pY+Vx1MDAxNKOM0m6uZ9lcdTAwMTirx3FPMdAzylx1MDAwM+RYnirjUVx1MDAxM1x1MDAxN8jdM23YVSjrjTKgaijVVMzXXHUwMDAy12hNoCxcdIPtcYmvhkXE3YTj7Vx1MDAxY6MyzVwi2T3gsVhcdTAwMTibq3I90dZdL6CDXHUwMDFiy4tcdTAwMDBcdTAwMGJ1vlxino5cdTAwMDV207C4dvRcdTAwMTJGnO5cdTAwMTlKZnfUs7ohNiqMhcc9uy/3UzrmXHUwMDBmhiBcdTAwMWKoXHUwMDFhXHUwMDE1uXSGwb4v1Fx1MDAxM/bByE8sWyvE8528W2LTXHUwMDE5qIhcdTAwMWPOuE6GpqFpNLMgLpx93YhHdmsppcmRYdroXHUwMDFjXHUwMDE5Y7TgaOJcdTAwMDS97phcdTAwMTUvfFxuZZJJvCr1XFxo2nHO24OY9yjOX50mtfhSViws3bohXHUwMDE0OaVJdtt9no79UfmJ0cHxsVZqW9V+1jpZ4CPGjYHzXHUwMDE1N+uGcPNcdTAwMWKdO/3JKlx1MDAxOGNK9kdcdTAwMTfIj1lgXHUwMDBmqyZzv1x1MDAxZGNGsciTVdrrM1x1MDAxNrNIZdFLWM9BkLxcdTAwMTBrxq4po/neUVvTyVPIjHpcdTAwMTmreD3qXHUwMDEzfLqQPtVcbumk7c2IuDhqzoJ95dTdquiXfqRwa+5pi2Y1MkZxLFx1MDAxM2vnRM1e5tODfNb24FppQlx1MDAxYZ2Ta/JcdTAwMTNp3aPrk+WJJTvsXG6FZVx1MDAxZaFvpFDfPkRjZXjDXHUwMDBiPVx1MDAxMa/7/ulcdTAwMTJcdTAwMTYyXHUwMDFmMZ5oM62PvqTUirXYvFwibfQ9qCE36ejzqSWk2ZNcZqdhXlK1pVx1MDAwNDh9kFx1MDAwNFx1MDAxMtypn1x1MDAxMrjMwnzd42xOUM3uoFx1MDAxN11rfbPPfOVUPVx1MDAxMcVcdTAwMTRRh9OFW1x1MDAxNENcdTAwMWRIO4VoeYHgiDfamJTy7jhEPsOJMlx1MDAxNNqVXHUwMDBlI7+vXHUwMDFki8o9XHUwMDEwz1x1MDAxZVx1MDAxNmYqWWylaU5T0nKg3yA07TpMRlx1MDAxZeekyy7J/bCfWOVvpzO3XG7yhKDP4DpH5u1EYvBcbq22XHUwMDE4sVx1MDAwNsu6p2HhymA+Xlm03Vx1MDAxZk8oIJxcdTAwMThcbqWUuuMokkRcdTAwMTh5wXTH72OWW7eZzM27VY5ccppIXG53XHUwMDBmXHUwMDE5XHUwMDAyXHUwMDBmek6npK1Ok97bWlE3XHLMK9E28qSbe7rpLEPIbncpkmg9VG1jbJhcdTAwMTC2YEGRemGW3ohj7jGaJt1HcqSjrH5RNjpYyt6XXHUwMDBlPOdm30nvdX4+i7juxNjFcnMqO9GjWNgs7Fx1MDAxMTE6XHUwMDEyR1x1MDAwZd2fRHhcdTAwMGLkXHUwMDE3p1x1MDAwNuLpleH5dL3tt1x1MDAxNrtXgSuyTk9cdTAwMTGnLDuIxlx1MDAxNtdcdTAwMWVcdTAwMWTW6o6eijOVN2dcXHaZXvKxfO58U7SFXHUwMDEwXG7hXHUwMDA0p1x0jrl3TyDwXHUwMDAyxHvV6qYxiyXa1lx1MDAxZDha6lqssarUNsf6Qsuc6lNFpKZnmJfoii1TkMCosD5h5LFFMDTectXheVVcdTAwMTBQr+tcdTAwMDfSrDcsRFx1MDAwNrNBqtvV5ExdUbFiVXGT0raCS3nhXGItayfS2Vx1MDAxYmi1592IXHUwMDE2n3dqxVx1MDAwMuVcdTAwMTSkka6WKJVcdTAwMWTI47For8xVXHUwMDBio8CQU1lA95POclV+R/ZcYmJsVjUvNbRcdTAwMDRcdTAwMTk+XHUwMDE2I8ZdrmFn1DJC5lCk1lY5c835kY/tk8lfXHUwMDAx1NtxKJZcdTAwMTGPP3HLfFLuwzNgyii2fX5dYOSE1KBPMpSDiHj0XHUwMDFlyN4qrDxIi7DsladOXHUwMDE3hY3sXHUwMDA2s9KjXHUwMDBmZcO6vOAsNp1iiG5x11xmKGZiVuGbKXXePUxEVzycL5JZz7ZccvjgcVtBPjBr4Vx1MDAxZUxcdTAwMTikJbFDzlx1MDAxYSu351t2XHUwMDA0eGdcYtdmV8pcdTAwMTdcdTAwMWOI0MV8LfQ2xHS+1ZhcdTAwMWbiXcxcdTAwMTaeScNLXp+Re4w+iXWlTVx1MDAxMzDokNJZuFtXiOU240khkandU93X5PZG3E+QRktcdTAwMTX0OKwmjF1JcpZ7LM3c3V/4iZJ1l0PlrjzRQuuEKY7ooqIqg5iLWlrk4lPflVd6eVx1MDAwMYJRXHUwMDE0dFxuzcTXjCCgN+u1zFxmXG5cdTAwMGJnXHUwMDFmi1x1MDAxZk9a0J57tm7QYKzHlGivybT07K6ZMrk+TdV5n2V6XHUwMDE1bFx1MDAwM1x1MDAwYoMhipPXJFx1MDAxZFx1MDAwNCGdf9lcdTAwMDMltFwiZyuqeeDZVb9xZ4MjXHUwMDFjtnThtETCuEDF3vclRn64XHUwMDA2k9wnxLCbKul1h+B13C50Y2E8pnRaUrTamj5l99lXpdI5Tlx1MDAxOeVJXl2OxEplZVx1MDAwMSex5aRaXHUwMDA0h5JdPVxcXHUwMDE23W6iunY4l5FG3UpP1ZHRtT9cdTAwMWNcdTAwMTG1Z45LlbBcdTAwMTH1Y8YunYNDVLF0ouDzqlxmYVx1MDAwYpFnLmXWo1dvK4Evl1x1MDAwN1x1MDAxMi+9h0S+/ERPXHUwMDAzi7Et1Uh50lx1MDAxZVx1MDAwMUZcdTAwMTGpq1OsLK1YP9dXOfJfSdBxz7tMXHUwMDBiObRGXHUwMDE1N7CiOifypitcdTAwMDJcdTAwMDL11Cl1a4l2XGYjvFx1MDAxOHtdnpjIZ17YMW2w3TzLslx1MDAxOdZsLp6qoD5cdTAwMDNcdTAwMDNcdTAwMGLQ02n3XHUwMDFi7rXLt7QgTjfDjlr0XHUwMDEyqT53YULEhMaBXHUwMDExUHl7oMQzeTpcdTAwMTXeX2SUeU7ihVx1MDAwNqHmKevKVpf7nSRR2nWCcV5ng0+RxFx1MDAwZoRmVpGGU2tIwFaXs8+X0jYjzlx0zvu8yEYje3hgZuZcdTAwMWNcckWRXGKhfy3Gu1x1MDAxZV5DXHUwMDFilfniQp1eUy5cImF3YXzU3Vx1MDAxYlxiXHKVXHUwMDEzdCDZXFzpZP6S6FjXzi/OmjDJf8a4y7KasWhzVjSlVPUsXHUwMDFmqrreXFyboFx1MDAxMpPLXHUwMDE47YsmQoXfeUbfXHUwMDE3sthTXHUwMDE0gFxc3Zs5i+gyybb7abljOiORWVx1MDAwMlf8wNC+dttSRyw1eV7qXHUwMDFjrs3KYPlcZlx1MDAxNWSQXHUwMDE5TVPg9LKWXGbBWlx1MDAwYk7CfVx1MDAxMfRcdTAwMTTn6lZWJr6ymjUkwXSgrjA/k/uSxGdrrvHtXHUwMDE5PWV24KGnorX4eEyxcr92N+ck8yHCmkW+XHUwMDBiXHUwMDFifjtcdTAwMTUhULdpeZ/SmcDS7iqQSvKadt6znUCBKaHDXfk6XHUwMDFmWndcZupcdTAwMTR4XHUwMDFhtlxmRPDCk1x1MDAxOZujsTBqqaLKsmDHpLdXQZSXLVx1MDAwYsigWlxiwTVVqUo6xWcrzvc16Vx1MDAxNFx1MDAxNfLwWGRar42ZXHUwMDE4o85E0FeqXHUwMDFhXHUwMDEwz1xuXHUwMDA1XHUwMDFi4C38zNGGpUVcdTAwMGItXHUwMDFlaqZ6XGaL3ie3v4yrtOjLI3g1J1jI61x1MDAwN3SGYVbqit48ZobTgeUq69Aqc8LMyGpcdTAwMTekPr+Usy3DyVx1MDAxMyFcdTAwMWbrXHUwMDFlXHUwMDFivjCwOZtY4e1xN056XHUwMDExPGPVT0ZtdiZ+18GAUXFVyrF20nb46uP1diwxo1x1MDAxYfbLhW5cdTAwMDZcdTAwMTAh3sEgJzdrd1bUqpUkTz3NXG4v6MlcdTAwMTBcdTAwMTCElStsXlx1MDAwYj3UzqRtlTKxvO5Qv1x1MDAxOFxmg1x1MDAxZit+MVZccoW3O7Q7pb1gl/ZW5fhkkCpcdTAwMDM1vHzWgOK4XHUwMDFkiJqeXHUwMDAxWFwivWPEXHUwMDE2XHUwMDExL1LZZJOLs6rs6FaAw8qRcV6rXFx9qGVHbYnmWV2Ji9s8XGbhxZ/501x1MDAxM3PKgcmqXHUwMDEwXHUwMDAwOzhxWlhHi27TLNeoYnc2sz5cXFx1MDAxZrp4fT5e3FlcdTAwMDItjbdEveOR1FaA77Jg69h11G49muRcYvY0ZdpKc5XFeSA/LoLlY7TO0Vx1MDAxNETXfjdN18pcdTAwMTal7LmDhEq3SdbRpm2L2sVcdTAwMGW56zw8XHUwMDE1zlx1MDAxMUrXWs1un3G/XHUwMDFjYqXe5FhcdTAwMTavcuVcdTAwMDdL6suy21xuM6tsgrnPT2TCdp9mXHUwMDFhjVx1MDAxMka3b+mjNHVP4TZdI1x1MDAxMqVcdTAwMTJcdTAwMDZeJ9SbeFx1MDAxOJy+Nbv9iNA1Ylx1MDAxZlx1MDAwNfy44LZcdTAwMTPlLHAoolx1MDAwNeD+XHUwMDE4Jdnn+2OhkrbVbsPAv1hcdTAwMGXtUyaYZVslL2awVnp6cGolX/iGXHUwMDExgUHrXGaa49FRQW6hXHUwMDE3kqyeXlxmV1x1MDAxY1o+prhcdTAwMTC5PlmTXHUwMDFkOyziw8S9Sdvst+k438SGTK7CXHUwMDE4XYhcdTAwMDBosmOnaUhcdTAwMGVcdTAwMGJksPHI42qc1e1neGF1nnJwz79DgoKZqG+nXHUwMDA1x7DV7aRXxThCmlx1MDAxZo1cdTAwMWObu6BcdTAwMWZegKRqkEGYoLzVheFKLIyY5D562kR241x1MDAxMJ+JrW14XHUwMDA3XHUwMDBmyLI6zk6RnDdqu1xuWFNJXHUwMDAwINenKIuri8Hj7SrqW/FoXHUwMDA2heClmPdccrXgQORaIXqmefUxXHUwMDE5IYf0pmBkrn9ajdWTT+N9viNOV28n9YHqVSb2Nr6ys5QgXHUwMDE3u+mYPk1Z/+bNMpsqmVx1MDAxMGvnto2Y1lxybz64xZSld3woy/PtTu5cdTAwMTa8XG4uy1x1MDAwM0miVCDNuYFG8u295nlUXHUwMDE2t8WtZvXlnVx1MDAxNCqIimZny2dxg5ZTmkZcdTAwMDFcdTAwMDfLR9LEXHUwMDE1h0T54zSGolxizVT2eGwnQSMuXHUwMDA05e9BvDrcTYzjdlx1MDAxY4yllVx1MDAwYnzQr97Enr1TrClccmE6r2KOXHJcdTAwMDU1XHUwMDFll+RcXJ9x+l6ruy5cYlx1MDAwMXzKk0eeutp5XG7vXHUwMDBmXHUwMDA25CpcdTAwMWROTV4sLzxRn7RtedKGNKql7mRuXGI4tyo7XGK0v11cdTAwMGXwgnirs7slgszYMCslr7dcdTAwMDbtxWZrqItY3oL82OwhPUNhmq5SXHUwMDEycce03Fx1MDAxMpHCa3x/mkFn8SrERfLVqPWYtOdwsIeYVdhcdTAwMTRoZurUXHUwMDE0tpxHL5iUWlx1MDAxMiGJ4prvm8+uXHUwMDA35cdcdTAwMGLjXHUwMDBlQVx1MDAwZrpNPWD/XCJcdTAwMTVcdL9cdTAwMWSqR/CngUx2mT4h9jXKxlwiVKnirstEm2m0rC+meLFYh3dRUb9sOU7Laya7Wje+glx1MDAxMYYgXG62tVtUZlS/eu5td32Wk2g6UVx1MDAxZSzUXHUwMDE2a75cdTAwMWN2ofh9YSayPaquJ4z5Plx1MDAwZdBcdTAwMWSiLNUz+2vTnEfI50STsvSpRa9D9mqt5kbGI3K1XHUwMDFlemRaxnWg6ytO6Ydeq7jKs3B6Mz3y3kI7ISH8JnEnTOQqJJqfNypMXHK5XHUwMDE0+1asrluy8uPyilx1MDAxZfxkS1e+iS+K8aJcdTAwMWNiPsJcdTAwMTPQlDolzOJVnSBcdTAwMWNcdTAwMWZmyFnR6NmMutYgKshcdTAwMDDcyoZsilxc8/TWMFo1Plx1MDAxZefrpTlcdTAwMDKlWNxYtfpcdTAwMWQ+efGlXHUwMDE5m6Kmr/R8k612XCKQXHUwMDA3SWdy47FcdTAwMWMv0mHeXHUwMDE1Veq/dHa59bKRa2S9mEjOlf2hXW2NKjB3j/Q+PdG3zPPW11WGo/a+OmLkj1x1MDAxZHVuKk+Gb1x1MDAwNu9FjkpcdTAwMWJGS+pQTurn3qsw/tHcVyXDd+O287aE81x1MDAwNPO67ORcXGp8MVxcydyjrlxupY1I+IxcdTAwMGYwXHUwMDE4XHUwMDExRy9QXHUwMDE5xu1raVx1MDAxN852JW9JfGTqS0TwbUl+QVn4Wo0sXHUwMDA1lntAvSe73q3p0I5cdTAwMTRdcosv1jRY/Ophx0st8lx1MDAwYlPSXHUwMDFhMqdn5t5cdTAwMDZcdTAwMWLzfID9nMeroSlcdTAwMGVFglx1MDAwZa8rW9JcIoX6xKZcZpF6XHUwMDBi1IWhNDiMrDNh+GT21GinoTVcdTAwMTRF5Eag7fJiXt2Ny/0oOFx1MDAxM5pXZJexasE3XHUwMDBi5Hw/bdCdupxWt1x1MDAwMONTfKiNna8uIU7NuSiK//k/P5lumfLP6sooRiFcdTAwMTSJflaTvebLVOWvr4/6dOrkt/8ky++tI/7+33r543VEx1x1MDAwNn9cdTAwMTT45zriXHUwMDExZ+L0rTqi+t6fP9VcdTAwMTHnwM7hs1x1MDAxOHhQR1kvXHUwMDFkUaW2zjuSjPpcdTAwMDWVznY72cr5NjTO2Vx1MDAwNaZIlyVW9LirK/JigIiceLudm0Zii+ZhXHUwMDBiPF6EvoSNZD5F2+nylG30Vd9cdTAwMWSGvHev1DNcdTAwMTLmJPZP6tHF42Gq2bE8p5zCXGKPXCJez+kxUnxcdTAwMWNcdTAwMWE7zTf9SG33yMl39tzLV9Z3w5jLrlx1MDAxZH2uXHUwMDE1n5PFlGVf7GOw5FMh6CxV8DA3s1gn8PJ2LYz2aXNKoVx1MDAxNs1FmlvSdSs8lVx1MDAwNmFcZrliXHUwMDE1XGZHZI3AfeA6mVx1MDAwNVx1MDAxOTZcdTAwMWRcbi9PoifKm3TlaKWYYdZ/zIhcdTAwMDRs63BuREs3gdE9qlx1MDAxMs20k7Ozt+5Fy/FTLu5Rt7JF3OhcdTAwMTNcdTAwMWFd8v1irjJt4qxcdTAwMDW+1mmpXFzNhDubbYt3n17doiQneKQusOj0vlhYbFJBum5cXPCJvHgtoSZcdKDmXFxIWZ5d8lx1MDAxOVx1MDAxM9NG5V5sqJPUXHUwMDBin1x1MDAwN1x1MDAwM0bvRleigI0sUT9zNlePXHUwMDFhbNywWSE0xe75dq3Vc3eY7CC8VCo6LacpjpmVzPLJhVx1MDAwNqc0MNZgd6RcdTAwMDdcbkc8XHUwMDEyZZns2je2jr7gnLsj7fJcblxyQCfClJZcXOpWXHUwMDBmXHUwMDBm61x1MDAxZYx5sjj9zOrcMsawoqEvO+ecwlp3/6pfKXjIb6RwXHUwMDAxpvR4iTRFeeSVeJ3KQUKBvFm4XHUwMDFiXHUwMDFh7PmmR1x1MDAxNtrcQ29++i6u4Nd7XHUwMDA2XHUwMDA1WFx1MDAwZr12jTxccuGudbJcdTAwMWSSzSCj4nRNM1x1MDAxNOfhWYo2oVpVNHXy81x1MDAxY0U4XHUwMDFkXHUwMDFip5iPM7N7JMY6lo1sXHUwMDBlXHUwMDBmbil5mM4tIPb6XGZcdFxc2ZZoXHUwMDA1NryrTtVVKNHVWjSSdqXXgCvA8Vx1MDAxZLexr7iUN/S5XHUwMDBixW2VdEq7nVx1MDAxZrvkc68qnvpcdTAwMGJxtvTYL4xkbJZcdTAwMDT0b2inr57eTVx1MDAwMZqHXHUwMDE3r2z8wWZl5tHqtFx0Ja1qrnBcdTAwMWFMxGRcdTAwMGZBcC42r0qX6GWgpbNm9pVcdTAwMWWAijK7K13aZS89rq68XHUwMDA3nd/6iqNcZn05NrhcdTAwMWRcdTAwMThzfpzYS5GvfpWZ/lnfMISWlVx1MDAxM0VBj8VAa0VcdTAwMTBsI9ZHNrSvXHUwMDA2X4vDcXT3YkeGvbtu9rRdSv1ilM15PetwOUU7ey3qiKDSvj7NiflcIpqoJ1x1MDAwN8YwjONsby5v7W3xZO5RW+zCxXZYZrj4dZxcdTAwMDRpqp14nO2o1KGvk7jOKz561Y1AK3Zz2VVQXHUwMDFkvjBi3pg7dEb9Lod5IJxcdTAwMWXwNte7wHEnwlx1MDAxZFx0cVx1MDAxMFhY1sObMFxiwELF8MmYXHUwMDA1bdlcdTAwMDVcXNhutyzKoFV/dVx0smRcdPnS+2K4L7pcdTAwMWNcdTAwMWOCXHUwMDFl8+0g+1x1MDAwN5qic2H4xCN1xynMLyu0UfO6rlNvXFzoWjhGI5xcdTAwMWI/ont2XHUwMDFizmjh6GOb2kZcIrBcdTAwMDagXaIyXHUwMDE5XHUwMDFkxVFcdTAwMWU5z/grbVwi66400nT2a+KuXHUwMDEwXHUwMDBiVdFcdTAwMTAnc7ec4ZONr4fMuGNHs1bpYEW6xlx1MDAxYoOIxobcefR8lsj6gkhdXHUwMDE0h13Mkv7y3JN5jUpHfvlykVx1MDAxNDEsXuzRJSP4dcdIXHUwMDE5S1x1MDAwNVTrn7y+s17NXHUwMDE3UzNk7lnYlzZcZo0jNFhcdTAwMTKpbFx1MDAwMIGdaaMs7emOhDV4KZeSlfNcdTAwMWK9JVLzaIHGj5I0XGa557lQlVxiXHUwMDFj26N9cSMx39Er2VwiS0g5d3o7kqglhS8xXHUwMDEzMjG6qTFHXFwr1cu4/elcdTAwMWTyo3As/cLL3XUx5Fx1MDAxYpdS8EjMWjJcYvwhrJKqb3w0mKsw+kGCsiGPXHUwMDE5vVmZtilcdTAwMWVUe1x1MDAwYlx1MDAxZVwicSssS+e4e1x1MDAxOXBKpVisafS6fVPDXFw98fszlvzESq9cdTAwMWGLqMLTL7zqffhVOuxY2q1cdTAwMTJEr+dWXHUwMDBmjsF8XVx1MDAxNFtcdTAwMWXiJ1x0sFx1MDAxY8NcdTAwMTHP7XY00/ldU693q7NWpFB3OFx1MDAwMuMtR6rAbkTn2mjMkfrGXHUwMDEy6qVDrXhkz51DXG6PV/WQt5frZaTbSXYnmfpTTFx1MDAxMFx1MDAxMzOBruSNSaZyXGLZtVx1MDAxYc2Ki7I43ZFsc45vPHbGmVx1MDAxObVKI1x1MDAxY8pO9Vxmbl96XHUwMDE4KUJCNWTjUmB0gHNccnv4l9WStfhKs/y5pC5XbS5XbVx1MDAwNCTCq8ZrzH22mbvnmcAmKFx1MDAwMb1saDLG2/KNb6f7clxcXHUwMDFi2EhFJZZcXH5TaCHj6Pp5oXlLQqY5klx1MDAxZXuCSqt7a1xuXHUwMDE0Y1+czpkrXHUwMDBme90lXHUwMDEwTT1f9it227dcdTAwMTNLbYtcdTAwMWOWOsytVL7e2XyPjZt9zrmnTEqW6cFcdTAwMTh259dcdTAwMGVq01ezVOpkclx1MDAxN71cXEX4Ut2oJuq2izGexued0Vx1MDAwZk3ZRqlcdTAwMWPYUFZLXHUwMDE5Xn09rpmcvZLpUzi4JNq8y5ZcdTAwMDAhPNp2OLkujKRcdTAwMWNUP1jDe41cdTAwMWHqJMK65vhaR5Mg9bJcXKWFW4hH2qk+rIQjJodiiDeW6lx1MDAxNqbeLG1mXHUwMDEzz7SKXHUwMDFm3Y7E+s4nK0fzXHUwMDAzuzVO+1xcS5lb9lx0hzrD6Fx1MDAwNFx1MDAwZeQrs9RByIO82aalOYrTKq7s4OX3Wsa6XHUwMDBi/3Dd8YI3h5C4tt3W7ITXW3dcdTAwMDfnXHUwMDE5WHXE+EtY6+xRS1x1MDAwM2iTXUThpVx1MDAxYvWrhMvFyVx0ISvU4Cyup+ekx4SgwGHQJ9ZcdTAwMThx2txXpMFcdTAwMWIlmq4271wie44g/EmOjHOoszh8wNKZk+mSf2I8ipQnhs/v6E3pXHUwMDFmLMxcdTAwMTPpdUz041x1MDAxMvTZU3Rn0chcdTAwMWZpQ0BGikGMXHUwMDE5b8XqXHUwMDE1sMA4iu020lFaxU3m7lx1MDAwMbd3O1a6ttPbSlDLSFx1MDAxMrV69HKft1x1MDAwNX0mSHi7jyj5nIZLmapV4jbAqj7kXCJcdTAwMGK1roMhLuNcdTAwMTTDv1x1MDAxZWKoW1x1MDAxYTSdjutY+St1XHUwMDFin89Zx5L8YSiPm49gyl28wbgsNX1e10uhjzNRgTzJtzPSnZGGe5Fr2dvipnjqkLtDIYJ0enlcdTAwMDXWczOLwLHFe/yadlxihjfZLbJrIVxcriZcdTAwMWOIXHTdsFx1MDAwNVx1MDAwNFx1MDAwZoS1Lfesee1eNpVcdTAwMGb27FjEXHUwMDAxiZDvebL/OuRpVFDfvY7khjja9NT4XHUwMDA2e7WJaOvzu2aQeOjR8qZ6XHQyXGLyRy0onjpu3cqgX5RF5HHQpmbIs7TpvKdg3Vx1MDAxYn1cdTAwMTFcdTAwMWT7vLToUqyPuEksz1x1MDAxY7WEgU2FZI5lgpVcIqdssiXnh4NcdTAwMTZocHk5QrGIyY1OXCKIXHUwMDFkXGZosCvgXHUwMDBlyL2Y24ZcdTAwMDLDjYJxgHTjimhcdTAwMWVcdTAwMTZcdTAwMDPmOEFcdTAwMTfe3Fx1MDAxMFx1MDAwNlbTuohcdTAwMDVYmK5cdTAwMWGMblx1MDAxZOydXiVyijk5oycgXHUwMDAzieXumdfHiXsglyMotMHfXqJcIq9cdTAwMGVcdTAwMTO5W+KrmH25XHUwMDE2XHUwMDAz5/NR3aE5Z7GPdlx1MDAxNEFuL6bXraPu/ON52+8n90BtPj5cdTAwMDWlmSPX10rG1KvzXHUwMDBm8dRs6raL5yDjdzTfOm9cdTAwMTYsclZcdTAwMWI9RzJN6Vx1MDAxZY1cIiXGnPpkeWG8cVx1MDAxMDPqPt12zNq7nq9x5Vx1MDAxYVx1MDAxNlx1MDAxMS9cdTAwMWS37DVcdTAwMDL/aJ74XHUwMDBi415LKl484Vx1MDAxYeZcdTAwMWWxiGZtY73HPMJR9jCbXHJcdTAwMGZcdTAwMGV0XHUwMDFj6FrhuoFcXH6H8bO2VvKzNYBfjz1E1autTFx1MDAwN3HSg2hhx9Leu7Yu8odcdTAwMGbs1DapqKDaz1g1oEBaXHUwMDA20ZQgXHUwMDBmWaYjJ1x1MDAwMbfd0Vx1MDAxOOfb8crBz9q4OGxcdTAwMWHcRkLGIC++TfA2lY0w2FMsNFx1MDAxY9lWWM5cdTAwMWXsXHUwMDAzSK0zXHUwMDFknKSmXsek3K4nXHUwMDFkpK/HcjtcdTAwMDelVyNX4a4l04nMXHUwMDE0Mblv4bVcZttBsrlcdTAwMWJcdTAwMTb0oGVcdTAwMGafl6X6etCSjHmS9lxuS+yaTlx1MDAxMcPi4ulcdTAwMDHL6/nZ1dxo2Y8rx0vJlTZeyyi8XG4gkGt6Or0uWbZcdTAwMTA6ykV1b6JQ0PBBXHUwMDFjclxmfKJe416xNlx1MDAwZdqqg45ccuxePXC1KEiCu1MzOM8+ltHqTVwiUMNHXHUwMDExM9wh01x1MDAwNtVfXHUwMDFmrO6xpGDLa+nCJjZ3q3aXnepS5lx1MDAwNuxcdTAwMThUzKt06l9cdTAwMDYu1dAjXGJcdJOEXHUwMDFms89cdTAwMGZcdTAwMWVGbm1cckSvvHZsXHUwMDExiKKDl+r6Klx1MDAwYnmWo9lX7SWCJ+Iq6GhT1/6culx1MDAwYmtcdTAwMDHJccxSXHUwMDFirFx1MDAxNFx1MDAxNj1ccpBcdTAwMWHqXHUwMDE3XHUwMDE2fvhen1nF0IJikFx1MDAwZTqCPGt5iuVYSyBQ/Kj9llRnot+wpFx1MDAxMoTqIEszI1x1MDAxYyCNV3A68Fx1MDAxMrw0OVx1MDAxNJuvto4jRyAxJ1NcdTAwMGX1Oakt/i5cdTAwMTJhu+ZcdTAwMTVktr2l5tNcdTAwMTO6S1x1MDAwZW1cdTAwMTak4Mhs6cGWXHUwMDFh0bbtWCU+VaHTXHUwMDA3t1x1MDAwNquvnuDouEKTTiZHXHUwMDE2JTDrfrpcdTAwMThcdTAwMTKGZFx1MDAxNkmGXHUwMDExV51bXHUwMDE1OCWgWSrZVk9i14j7sVCIXHUwMDE1tEgt1ZXuMUuVU5NcdTAwMWZsXHUwMDE2amyv4epwJZMzXHUwMDE2MuF0XHUwMDA0pE2as6RcYvKieYltXHUwMDE2rc+GXHUwMDFjLVty0dtcZlx1MDAwN41pUSbTR3jF74ak3WlbWiE5OaW7eImLl11cdTAwMTbpvMHYMyDT4Vx1MDAxNOqpU2HPdjOGyMtcdTAwMWTcJ+D5NFxcW67CZs1cXFwiaFe1zr5cIubamFx1MDAwMCNcdTAwMGKCXHUwMDBmK1x0co9n81x1MDAwM+Q/dqNjXHTNXHUwMDFme1x1MDAxNvD/cTRGrcpXTiQnXHUwMDExXHUwMDA1dmHwX6zIWpZUZPugeOm+PjftsJ4gMa/ck4lcdTAwMThcdTAwMGKFtlx1MDAwMVx1MDAxM04mTXON6i/mmrEmXHUwMDFkaTiq+z5xjrqLJJ6to+d4RawstIYkXHUwMDEx1cSCXGL1XHL2hTSrWVx1MDAxMKdj7Fxm9VRcdTAwMDVScSirzENcdTAwMTPljVxyk0NcdN0pkki1ZILPeNY+m4ZcdTAwMWVcdTAwMWFUXHUwMDE4suanvl/ISJuNi/VQXHTgqKjpSlx1MDAxY8yrqtc1lfp7eu6WXHUwMDA1XHUwMDEzLPt5J1x1MDAwNMlxlGPEJdq61+Oon8vNbyHJSk3tgvbUXZrXbZam4Fx1MDAxZd2RbW9cdTAwMWaLz+8nIFxuTJyCjp9i5IwydSFcdTAwMDfbQNXhfsGiXHUwMDBinT5XgCvHxjKU2ebSzVx1MDAwYpzVYFxy07BcdTAwMGJSPl+Xxb/IobFhXHUwMDFha5b8ONboMXNcZktcdTAwMWLP81Geeu3G1UVVXHUwMDEw/EHd4bNkMYhKn51pdLagP11qwK43IZXt0odcdTAwMTMhmvxVuiihNouX8+1WoetVl5VmXHUwMDEzg1wi4GjpQvjkYKyv26tdXHUwMDEzpdZZXHUwMDE2+EmQZ2yE3SdZQls4XHUwMDE1nTzhXHUwMDA0XHUwMDEywa1cdTAwMTmqr4tcIllk75z7XHUwMDFic0+miaZlzYpcdTAwMDLLT+hJqm5zwCh1eMZwWIe4WfVccqFCXcGNQlxmytST0Fx1MDAxNlx1MDAxNVO/vDRGXHUwMDAym7Kf66VspqeszDWtiFx1MDAxMsbk5dIoM/CcLOxYNtvIx7Reht0sXHUwMDA1P8PrmfKW2bvSPpvOU3qzxZP62qxS1zDMjevnXHUwMDFhXHUwMDBilkVcdTAwMTPktCTQXHUwMDE4bYXa4FxuyJdwv53zM53Nq+1Ez+pEwHf/9Nrm+2RcdTAwMWTafVx1MDAwN1x1MDAxY1x1MDAxNPFccldcdTAwMDVcdTAwMGLmXHUwMDEyXG5CdTzXqkBfcJ1IpSVLqpq/nDBDvt9go7tcdTAwMDFabJErXk+rUKpcdTAwMWOFU2bgO8JrTVx1MDAwNFFcdTAwMTiAfXuMRDbTTsiFh1ueZCpoqWUqKs+VRbzTV695+Or68FjDQCudXHUwMDE36OfN6lx1MDAwNW7IkzCMOeDN1SBjXVx1MDAxNfCdudj+SeVTo4HPSe5cdTAwMWX4pIQugb+etn1+UsttXHUwMDFiqWU4dVx1MDAxMN/pxWzv8Fx1MDAxNeh2u98tWYCcslxm5Mlyhlx1MDAwNvia/qBcdTAwMTjLh1fDbpoz7WzbpVx1MDAxYW6OUVxu7SlU6mBfgdRNo7qRpddVN9j4XX+C7NR2QMPzgkeG3tFcdTAwMDNcclBcdTAwMWH3xH+2z6d55Jw7Sy6rvVx1MDAwNnZ02Gy7XHUwMDAyg/DMvFx1MDAxNsZ1p6pcIpJti0fC78arOtshWlx0IJxcdTAwMWP4RrKzhEFPxlx1MDAxOevHdtNEWXY3ZTFcdTAwMGJZR24w19KJoWDGrSq9/VSPPU3pXHUwMDE5S9qZ2ZAmvDeUy+LSe92PhofIXHUwMDE4zCTB1VXI+tqekLOXT1xiOzz01/Ze21xiO7NoQ1xyPTt6Xu3oPlxcUUhEKvh+vVx1MDAxY2PuzamDc2e0V0nbfF6wuytcdTAwMDJcdTAwMGKByFwiXHUwMDEwXHUwMDA0h82eubpcItpcdTAwMDeM6JAzdYFLdllFXHUwMDA3lWCh63Qtr8FQ3HXXuqibKELNxDHYyZF43DheUTucfZ6r0topklLhsFE9cUZhpY/ThTRcdTAwMWRCurhNbPZ3mFhccujWuDlLYOpcdTAwMDPx4Zv5XHUwMDFjXGKTQOVcdTAwMDcgdKNX6O3iPoJcdTAwMDBlWDF53G6HdU5CUyNuNIpcdTAwMDWigfa3UXJcdTAwMWY89DqtJitk+jXY0ttcdTAwMDdcdTAwMGZ3MnQ/dp82e1xyW3aHgY3z1GOKX+eFvbp25I07LZPW4SHtVLda64xQXHUwMDEymECAY3Y+XHIgs4Xy5dKr11x1MDAwMpU2WcBcdTAwMTWRa9BBoVaJ3+LmST3I5+M4Qb3sZZcxvYz5XHUwMDE07chlzDSKXHUwMDE1pqfTYVx1MDAxM3dDXHUwMDFkXHUwMDE0XHUwMDBmh1xcqzkzXFxmWZDzM7vcu6pvZ0IkglCu4448TP+UcrpcdTAwMWGB+5Mq38MxaF9J6JVcYlx1MDAwYmQxcsWyt1fQXHUwMDA3+lxcXHUwMDFk6eWiXHUwMDEzXHUwMDBly0psoZRMYYTiYOHJ5Vx0XHUwMDE1PsrTwnCJ7/c4Uu2+XHUwMDExbfc1ijHwIMDnwzJcdTAwMTZcdTAwMTiCezXDXHUwMDAzL7plelx1MDAxNvorXHUwMDE5XHUwMDFlqrXLl3xW0mB19uK5sYdxXHUwMDEyfL7mXjirllxm/7NeI6v6ttzsMN2gZt2f/lwiZyHKWXjDXHUwMDEyT/Qk4DC7XHUwMDE3N5p12Fx1MDAxYVx0Z1x1MDAxMlVAvlx1MDAwMZ0l2NHtcVxiwybCzm0kXHUwMDExWoHRlbujkvuEoEvrIVx1MDAwNDHgxCZcdTAwMDRuJlxuKinkfCZcdTAwMWaqve1cdTAwMDJPk6SrwD2pwGyKsFx1MDAxOLmcN51cdTAwMTjNXHUwMDAy4XCWWqNcIsXcXVx1MDAxNUN6f7kpu8CJeqmmXHTRiFx1MDAwN5VjXGaNhnTmLFat8orzonSdS1x1MDAxMFx1MDAxY16RQqQl2Fx00o7LgtvqKWR7YovTXHUwMDE4OVqEZKafOWy4bcJaRYJ+7WKZt2Z/vKyLPmRcdTAwMGJelS+UYFx1MDAxYbVcdTAwMGVej0rAclx1MDAxNVx1MDAxM9zl5EBrwjPR1cRcdTAwMTB1kFxmXHUwMDFiXHUwMDAzKj4p1XNHrbV9z4ZDr1x1MDAxZFYtSkxUuLtcdTAwMWOUNqBcdTAwMTO0T2T7vZ7FadO8cVx1MDAxMaqmcc9kXHUwMDE4XHUwMDEzXHUwMDA0bUP2Sz3cbpggWVx1MDAwNXmydzeDMV+BXHUwMDE4I12ywE03fJ1ZcUz9fpBcYqlnM/6c+qOypVx1MDAxMaTW4nGVik6/nP16STWNZpvwejXHgpqfYiiEx3FcdTAwMGJsXHUwMDFmN1x1MDAxZOv2WHNu3Sa3L/rL5NxmtuGWxM5cdTAwMWTFrVx1MDAwNnhGp6DI73dcdTAwMWadXHUwMDE457Q2pdFUY7eh+lx1MDAwMDl3XFxrkfZV3lVrlGrCxqyCd+Nccva8hFE5XHUwMDFmLjrgVji+yLxQkFx1MDAxZKbQaVx1MDAwM9xcdTAwMTnEuKiUJLtHIP3VYnh296BcdTAwMTZVXHUwMDEws1pcdTAwMDYj69elq7dhJ+7GXHUwMDAzjlx1MDAwM3RJXHJePdxCcmzFPVx0RKVCXHUwMDFigo6VXHUwMDE0XFxE9HJcdTAwMGZ9JHJRmIjKUD0vXHRdrff5UkBOgK9cdTAwMWN0hlx1MDAwNKF4uIc0jdeATDhOunRFkkym2Vl9fZ1cdTAwMTj75em135xDnLNA4oQm9cYldZsuqXisk3bakc1QXHUwMDA0IUVcdTAwMTPex/H+vDqmf81OIVx1MDAxOfRQrbdcdTAwMTDiY1xy4LOUbK+K3lC7eEqoLZLqXHLdS/j0lLjXdsWmXHUwMDEwOnZcdTAwMGVcdJAmy1x1MDAwNNc4KUZcdTAwMDE7KX1g81wi1OdcbnjRx8Poq6hcdTAwMTCo7SrDtNdg7Kqw6Fx1MDAxZeI1cmSsTWOr2aJ0U3qXQl5hjGPMXHUwMDEzdvdyVTn3x6W9X7SHcufDTYeXKMj600hywy13xtc66t6lVHTN7fFXnJRJmaVXvCs7SEukM9QmnEOTT/xITqVcdTAwMDRMrP24ZFx1MDAxNJNQ/Vx1MDAwYmWvxjVcblx1MDAwM7vyOc+EXHUwMDAw6FFcdTAwMGJcdTAwMTHKoVVcdTAwMTXlJy+HwM+pvse8YNTP15MqcVx1MDAwNmjpk4zvL8N/TiFcdTAwMWRcdTAwMWVRoXCDT44jS3ZcdTAwMGJ1SFpXXGJcdTAwMTNBoY+cvuNHdVx1MDAxMJFcdTAwMThzmHtcZlx1MDAxMp5pZbTgQZdcdTAwMDfQvTDKec21ZM5rXHUwMDE2jVx1MDAxM8tWi0pcdTAwMDHMXHJ7jaIpVEaejytqe1afXHUwMDE5XHUwMDA05E7PRM6j2V2vl8eKXHUwMDA3rF1SXf1IXHUwMDEwXHUwMDE3nUOas+WgV1x1MDAxMF2+k8mgs/COv66reKXuu+TZiu1aSI48yNuB3pxam2yWljtLrsOme0himGHB1bxHlF7lYuCOgZbUXHUwMDA2mSPMyFx1MDAwNfjCibD0c73afswxnFQzbzjJXHUwMDE0hlx1MDAxY0RBj9Ozv4f7XHL1XHUwMDE22pdcdTAwMDRlJ1x1MDAxYbhcdTAwMWTcfDuVXHSftNalnU1cdTAwMDS45Nqj0C46ONu2bMF+XljBuEePKFx1MDAxNJ6UJTP3wKdHJJs4XHUwMDFkQ7tjI+ihlNJTdufSXHUwMDBid2TDjiN33ba8gYOKI7yCVNZMtmdcdTAwMTZcdTAwMDTKkEJhvPR7XG5cctB2daVcdTAwMDHeqi2ZXHUwMDE5Y1x1MDAwMzpcdTAwMTS9YNOcK1X+soI+XVx1MDAxN+VIdu1cdTAwMTE1+jaFrv7gQSpcdTAwMTAom7mj1NprdVx1MDAxZnNez9xE1+qqqU5cdTAwMTQz1WKinGbxTL1I4PH08CG2tV9UcXDBL7Ke0+xcdTAwMWGnft3hksSaXHUwMDEw0OD48Eh9WLo43JlyXHUwMDE5PrjWJ/KaVT4pXHUwMDE5JjdcdTAwMDIlXGJtMn5EM4O/QnmjXHUwMDFjtSEyIOWvRiDRi1FcdTAwMTExx9BcdTAwMDJXd+RoXFy8aGFcdTAwMDZccn3yXHUwMDBl2lx1MDAxMcWDX25cdTAwMDMxXHUwMDFiiLrei0LhbeJqUoTv1pq9dM1dQ7P2wlx1MDAwN9tcXJ3WZKb1Q+fzNZZeXHUwMDE2TYZcdTAwMTaGXHUwMDA1g9JcdTAwMGVcdTAwMTe/XHLcRJn7QsalWVx1MDAxY45cInpsXHUwMDFh6lx1MDAxNFPje3QhM69cdTAwMDS+mGN3f69ttWzVZ4KqdLPz9Io6ufE9XHUwMDA07+/VJSAjosSKhKiaW+eUP+5XW0fx8dpcdTAwMTaw7INcXIafhsw8oqNEmer5UFVcIlKwYV11/lx1MDAxOE6xhVx1MDAwNkncy+0hw7LLi5JTXHUwMDA0XHUwMDFllpH0po8+KTy4TC56t5Z6nT1nXlx1MDAxObfVLX64wPJk89LPXHUwMDFiibJeioXOjJTj80Vjp4l0e+wyXebB9VUxiVx1MDAwNMKT3j19vVx1MDAwNVx1MDAxZdLbvZGmK3tCrYA5XHUwMDFkgYJcdTAwMDZnXHUwMDFjicckXHUwMDEy4VY1lj2iI45dj3VBsDtcdTAwMDT7XGZL6F1sXHUwMDA0uMKLJpubXHUwMDE4K8UvoFxiTMo9WSM/MVx1MDAxY3V/7E3P57ynVNKLQ4WlfFxus5q8PP5EJYg3ttqo8aN/9fjpvHSv8co9Sl6KXf2YXHUwMDE1YVxynlx1MDAxMcHyXHUwMDBmWeO5XHUwMDE3yjCNa6BcdTAwMTA0xNTONYPbgl7ARlx1MDAxNOf0KVYt91E6aoAm9lx1MDAwMcNdabpBd0yEQ1x1MDAwM89pOUy7n+/VOJCHXHUwMDE1NFYz+lx1MDAwM6eWncl03Uxd3Ylccj2qaE9JXHUwMDFiXHUwMDBmtyiD2Si3PZckXHUwMDE0p5VOoYdcdTAwMGZcdTAwMDaQ0iexR2+NpZ1cdTAwMWNcbrWfJzhdo/ThTtP9nsvmY/db/3FcdTAwMWNcdTAwMDNcdTAwMWPS6nPzm5eW+oZcZpexOlx1MDAwYoqzXHUwMDFmWSGzjj+fX1x1MDAwNUZx4o5XYXdcblx0db/UJ6pcdTAwMWVhRvF5LzJ4OFx1MDAxMpSiJlYoelx1MDAxYXHda3BcdTAwMWLzo5lcctztnIsnVt08nnwtkY4kOFqf08tdK1xmnnlC8pQ4r12Xq/NjpPG5RutEM9TdTEl4ICizk5fShDfPfJA9ZCpOT5r8mVx1MDAxNmG+q+M7XHTNYnWuXaaZ0k3YZ+OXOjxi1Vx0buInhFx1MDAwM97JQZ+D722Zhlx1MDAxNlOIk7ryOlx1MDAwZjmXOlx1MDAxYbtcdTAwMDNfNN9cdTAwMWXivTg/WVx1MDAwYrjhjIGeXHJSxW1cdTAwMTM+3e0pkZdcItmRQ7x4pVx1MDAxN1RizIa2pPaD40enXHUwMDFhXHUwMDA3wtTTXHUwMDAzMYZ5vFf0l0By5+JsQziqyd35XHUwMDAyccpcdG9cdTAwMWVcdTAwMDRcXJ7apczhc1i1L46/c099UFx1MDAxZVx1MDAwNcCafaFImofEzFx1MDAxY2/4LFxyz7at9pipXHKtrrBcdTAwMTPn81x1MDAxN05NUSlcdTAwMDdJS7ne86ejXsnI6iFcIldcdTAwMTIpdFx1MDAwNvqQPSfiQztj8z0llNf1MGL0ffpcdTAwMDKPlYrar9xcdOeFu0CBsOMhiDJcbnN8XGbda9GijcrPT6ErVGOqyODGnsLZv1wi0F7o4Fx1MDAwNtJcdTAwMWVcdTAwMTYxpM60Klv74nFU3nNcdTAwMWHDi46rPKPgXHUwMDFm5ozN6YFcdTAwMGWnsC5A8G9GXHUwMDE0Zp2567gwVSdP104red9cdTAwMTWFbaDTPTgwt8Yoelx1MDAxNPs9kS/FPothX7fOsrFcdH6/KtnN7JFg8LhwZEGvidqqXHUwMDE4r5NcdTAwMDGzyXmtgeI5Tn6aYFx1MDAxM/pCmujFwf3eXHUwMDE3VrdGsq9cdTAwMTIjqtyKOqKB1zvEs+VcXIVq2PzuXHUwMDAy31L5tCwgxfXD61x1MDAxOZFcdTAwMDJxXHUwMDEwvJqe0rafR6bEp5NcdTAwMTiSWOt1wFx1MDAxZmSLpMXMlOWYXHUwMDE23UxAXHUwMDE1fcO2dX9GXHUwMDAzXHUwMDA3KN1BXCKvaVx1MDAxOI6wXG5cIsfXUiGzseFcdTAwMTjDXHUwMDE37oqKcCE30pqV69N/udCKLy3/XCKNZVK6kyRzWXW1XHUwMDFlXG7jXHUwMDFkW+x6enHQrDb6N8yeqDB7wPz5ZVx1MDAwMa6MXCJcdTAwMWaObcfkpWdIwnTi26y73VBYJo3jxEJCXHUwMDE55oEj7JZcdTAwMWTwJPZog3LfStrmatTvfGHNUvd+Z1TQNiBcdTAwMDP2XHUwMDFjlofidtefJvBcdTAwMDEnvIBkxrnsqsld7VxmqJ4sftlmTZpMM7e0xOXZXHUwMDA0ychcdTAwMTJ6OfHCXtFQU1x1MDAxZJ/C9OBcdTAwMDZcdTAwMWKzyaOA+FqyyOEp0Vx1MDAxMWsk1lx1MDAxOPfWx/m6h7EjXCLm+yX65Xq9XHJcdDbWZLnGtyDr7ppcdTAwMTE2XHUwMDEzk8JjczV4Y2hu+0k7w7h8lySRJ89wd19er/KGQJlcdTAwMDe0gDgq511cdTAwMWa7xY5cdTAwMTKyn7ZcdTAwMDflSDJcdTAwMTJcdTAwMTn39P8h6j2WJGWaRdtcdTAwMDdigFZDtFaJZoZcdTAwMTaJ1snTX6q/f59rPWpr61x1MDAwMoJcYve1iHAvXHUwMDE5XHUwMDA2hZ85XSC7R93QhTO3U6l9J1x1MDAxYle9ibNcdTAwMTQq/0hWY8OxKFx1MDAxZZtcdTAwMWUl0K6ruTOct6jETkuPn4+dWrG6XHUwMDE2I7zuXHUwMDAxhpBZ5GImsXvb9VubXHUwMDEx1+u7/JWwJqDWXlP1V37hX/rCWMo9kUmRj9Ol7pCJtibPe+itTmrOYpq3M3Ht7Vx1MDAxNrVcdTAwMTZcdTAwMThcdFN/Vv9vT6h+XCLeLKMv9qslX/YyXHUwMDExkVx1MDAxOKpSW31/c4afp4RcdTAwMThcdTAwMTNuxVx1MDAxNWc03DUo5mAjrfrlXHUwMDE0j1x1MDAxOa3QPUNk03ovqIlDvjhWXHUwMDFhQOT9S1fjXHUwMDFhrrAl28FcIpv1PvpUZe+uKvzzh0pJXHUwMDA3ISG1XHUwMDFj4Sf+Pt7i85/velx1MDAxNJ+dMyZr/O20XHUwMDAy8VuJXHUwMDE0VzWtXHUwMDEwlHFcdTAwMWLEnCSfhsO+XHUwMDFiUbTANul40lxca1xcJfTIUFx1MDAxM/N0kOHfd6ojU0mnmTeTcmizXHUwMDFmi1RWfqCAfNYgs/x6slx1MDAxMDpMsCUx78NcdTAwMGJQorq0ukMmXHUwMDE3kTf67F+1LWPUQ7qB81x1MDAxMc8svlx1MDAxNG9Ull0/XHUwMDE3vMHvPYhcdTAwMWOff1x1MDAxNVx1MDAwN2Tc4Vx1MDAxYYvvXHUwMDEwu6Uya8UwXHSP06SZTPmxt7yRZfy1QvTgy158OOS3wYugh4VcdTAwMDb4bmyU8/AjZTG+OFx1MDAwNGaUXGJcdTAwMDP2w61IjVOnd76hYUxcdTAwMWE1taa0XHUwMDE1XHUwMDFikOtcdTAwMTdcdTAwMTb4ukSGXHUwMDE3Q0yr9Clm8/BpoqNccvDuXHUwMDA1XFxcdTAwMDVpXHSQRv2Go8bbKpU86s0xOIs24lx1MDAxNFx1MDAwYuej1UQyYM5cdTAwMDaGdncn5e1DJ/PrJUHBc0x40Fx1MDAxZkHWXHUwMDEwS1x1MDAwNZgvvqCw7orFnVx1MDAwNL/jhOkzPt7p4jL1hTnz9YRcbjNlq6uX44U/f/8/czFcdTAwMTFRJrCBs8UyUjhFSYs9eL09XHR0XHUwMDE073jq3ILAyP1cdTAwMWH6+ihbmlx1MDAxZr4rNC9183fPzTstgsHxWsRXctpEnnd22l1bXHUwMDBltbNccuRcdTAwMTR8SfeznoigXHUwMDE3Y1x1MDAwMIHZdrFcdTAwMTBRmlx1MDAxM/vvW37RXHUwMDFjYtWnS7ZAcql/Y2JPyfXFKlMh2i9idFx1MDAxOVx1MDAxMm5xJXdbqVx1MDAwZUDKeCYnrlx1MDAxYkGyXHTD2rJcdTAwMDf/Vmj30Vx1MDAxOf6ST0xXdkdH1JPBO86hXHUwMDFild+AqWPfQk3+zUEjXHUwMDA0+XlcdTAwMTdcZkNCzOtmiNl/yCX7jVx1MDAxZig0sXZcdTAwMDJ9ysFcdTAwMWGDxUBpXHUwMDAyXXLsUEl9x7VLdem8kJjFeVxyz+KWQzQqXHUwMDE2SsmoZ5eYi2Lud7y5r61cdL7bjTZcdTAwMGJcdTAwMTJjXHUwMDFiuVjz/O+aeoBccllUVjo2XHUwMDFlT5FV4rnaKZrX4GJcdTAwMDUvQ6WALb3aXHUwMDAz3ne6IMYhYyBHN1x1MDAwNkh2KZM48Y7zXnaijdxcbjxcdTAwMGbA+q/H299cdTAwMTR56YnbyG65pypbaIx9feaLmFx1MDAxMkjW/+KbkYIsvkPkUN5cdTAwMWZFJ36l/+qhy3MqvX2/oV18rM825d5XQH2blyvGgDKn095QT3zaTctMvT9cdTAwMWNkc1x1MDAwYjzDXHUwMDFj5lxu74O69Dx9PS38jZIvPHWTkTJkPcw71/7tz1x1MDAxNek2vivlZWndekJUyJxAXHUwMDBmNVx1MDAwZtPl2Vx1MDAwNmCFL13BUp14i1x1MDAwMMMkgFx1MDAxY3/HXHUwMDFkmoJqeYx3bP3f7OfgXHUwMDA3a+grq/us+1xmPsVu3ObSbF9N6PVcIs9u/FSt+d8+YVtcdTAwMWWiiFx1MDAwMrpgXHUwMDE2XHUwMDA1vJJJN2I8+fA5/L68/1x1MDAxYq/fliXka1x1MDAwNvfXmMfgoFx1MDAxYWK7v1lcdTAwMWNfMItcdTAwMWNybFxu1Fx1MDAxNIf3qWnPtzwtL2V9gzOIXHUwMDBleu9utddcdTAwMWZkwFx1MDAxNyvMjV2sRUiqvFx1MDAxYVpcdTAwMTadSJdcdTAwMTD9l4vykOBcZvNCd7Swo/mrdfBcdTAwMWJOlkcnXHUwMDE3XHUwMDAw5VtjUNWvg++dXHUwMDAxMM+/9+ifLkpcdTAwMTFOyKLZXHUwMDBiXHRO2Fx08vW6XHUwMDFhgVx1MDAwZeVMYGzhPzpcdTAwMDJoNm98QK1cdTAwMDC+PLzeQ2edozGSIfUkzlxmuSDU5T9lnDFBV49cdTAwMDc/ZFEmXG7kubmJv/1qzr8uPVx1MDAxMLA9cK/2PXzDycwjvUSa/dWvvW5DPb9cdTAwMDdNXHUwMDAyfzO9XHUwMDA1JEtb3WKf2FfxRFnhk8sj21OV1LnGXHUwMDAy0v1WdMaKSWVHrYVr/2LRxHlcdTAwMWJ/KJ+2i9OlI6JeXHUwMDFkkbGj6uhEXHUwMDEz4lx1MDAxNEZ/+Cl0Wazn0FXIwWfeSkFccsRDLk7A8LkxvThiw5YvYqc4I8MyQ2NcdTAwMTF9Nr8+xkmnN8T0U1lRVlx1MDAxN0JJXHKvVX5cdTAwMTiGqVx1MDAxOaFcdTAwMTecwJEoXHUwMDA2i0tcdTAwMDFWU49pXHUwMDFjSMZ0TPTXXHUwMDA1IH2fLKKo7SdbQ1x1MDAwNzI2mGd8Uz7NmEjP8pboXHUwMDA01KSMINu1z9ojmva9gG2otaKIIHLmXHUwMDA0WccjbX2D7Fx1MDAwNL3qwdjXXFxcdTAwMWKZuNduWvg39r6j/PtSXHUwMDFl6F8zXHUwMDFkdX72pINgZGOJTvnea6Ig/MS/g1QwnpNcclwiKsl9XHUwMDEwuCat+e5cdTAwMWRNnIqCZrpcdTAwMTeP1zKvxujw+z7T0Tnh9TD61GwyXHUwMDA3l14oarP3klx1MDAwNGObedMvhkFgXHUwMDAxMartwLNvlP7vjNpxkclruTKOq92SXHUwMDBlMVx1MDAxOMTsXHUwMDA2wjzgxvFtsqWJKndpXHUwMDFj/zx2WJhel828RMArc/RuXHUwMDEyvIMhuZVcdTAwMDSlXHUwMDBmcu2Mxut7ZYpbIWFcdTAwMWOknTuFXHUwMDAwXHUwMDA1t1VcXEqqsH2ZXHUwMDAxXHUwMDE0vn9ccv1cdTAwMThC0Ctq2omfKlx1MDAwM3xAdpV3IURfN1x1MDAxOFxyy1x1MDAxYYfa41x1MDAxOVx1MDAwYtyAk6SHg1FcdTAwMDUsXHJcdTAwMWWsk1x1MDAwN5u/XHJcdTAwMDVC4nIvYLxYXHUwMDE5rf5cdTAwMDL1sFx1MDAwM/2qXHUwMDE27MOol6yYvqhIXHUwMDE32Vx1MDAxYnNzbO0vR92xQlY9IY1yr1XwTWVqXHUwMDE1SchuemVljcFyQmk8TKm7XHUwMDAzkCdV3jrXiJhcdTAwMDDM8f58UpMtVeQ/MFx1MDAxY4ZCX2GtkGF6rKNXKfW6ez1ShHXYfUVVRU67XHUwMDAy3pUvrVx1MDAxMVx1MDAxOfnMXHUwMDAyfF31Ni3Nn/G9xbFh8+8lLcbK7LWlmlhkZIz/ztDcgVD7O1x1MDAxZbq/8apuyc9cdTAwMTSiJ1Le4pBL08+93KR6X829XVnsujefz8n1czpcItxCa1ngXHUwMDFlmVmf0FxyYVx1MDAwN5C0WntixClTlFx1MDAxN8TwxbQsx1xmWOLe8ICQNU/LXHUwMDA2K5n5Zzrqx3R4kOlcdI/44NhcdTAwMWSDsUF7nidcdTAwMGUwZ657IdhswEiXyeBKcFx1MDAxZInrrr4+0G0oXHUwMDAyipGcN7Nd3HCQJIUxhVx1MDAwMcCV5WZpQbpcdTAwMTWhenJabPk019E73150XHUwMDA0O+DjcNzAM1x1MDAxMFx1MDAxOcRFb1x1MDAxMZlccoLyI3IjnFwiXHUwMDAzn2VcbvP6oTnoxqAjg5ecIfxTXCLdXHUwMDBis1x1MDAwN3HsRFLhUKyf7vyO60GDiq6/Nj2ni3JcdTAwMGW6VyeYRfGSibpIOX8xzFx1MDAxZFt7xFRcdTAwMTmvfkj+++LDltI4+HdcdTAwMTJAXHSsiVr8YlxcnUow/pjQm/SaJ8YyyOeOM/vpb29cdTAwMTPaJduRXHUwMDE5dVx1MDAxYlx1MDAxMk1cdTAwMTjkMFx1MDAxNTkrb8Zcbm9eL3NoqIcz4PNcdTAwMDf9LOWNKkDKr9BcdTAwMWRARV5EvDDkz1mrmM9qXHUwMDBi9fFNv/xcdTAwMDT7O1x1MDAwMzFEUN3urIRqPddcdTAwMTdcdTAwMTlcdFx1MDAwMsDxZSqHZoJbXHUwMDE5Tlx1MDAxZLqoensxyrc0a0p7XHUwMDA0zVxiXCJMwJrn1nVuV0aOnk/EYYGuNV5cdTAwMDR1KaxHU0OXXHUwMDFh055JcrrGg31W4VuR369TTEp4XHUwMDA2mVQ2ttR/qm6A2LTUsPFcdTAwMWVGXHUwMDExennZmkwrRtOLXHSgyFTC1y1cdTAwMTVcdTAwMWVcdTAwMGZcdTAwMTNcdTAwMWVMaFx1MDAxMFx1MDAwZU1NxIwmUrlKhWJcdTAwMWNcdTAwMTnyQ5Kb6TvjYEGW6Fx1MDAxMixSWDepYuP3XHUwMDBmYzdtkb70MX8tXFyjY1xuc6eygITBU1x1MDAxN9hccrNu6q+bWjdowMiQIfz2xLWhXHUwMDEzxFx1MDAwNbpiZeyBw1x0XHUwMDExsm9sPlhcdTAwMGaq2sNfXHUwMDE1MsHO/vhiuFx1MDAwNTChXHUwMDE0dFdcdTAwMWKTQZSE7dte69aXtGBcdTAwMTkjdOnF+Z3RXHUwMDE3olx1MDAwYlx1MDAwMY5leLDprVx1MDAxOcJOXHUwMDEx6/abSlx1MDAxZorfYzRI6Wvwmlx1MDAxYrbYbPbWXG61LapCti79f/xcdTAwMTagcsxcdTAwMTVp3TGFMti179eyRWulXHUwMDFm+lx1MDAwMpOCM4gxk2hA1Vx1MDAwMalfXFxcdTAwMDdcdTAwMDXTVptER2+iQVx1MDAxZKdcXJJTXHUwMDEw/85mJF9u37bQKLGtP3L1XFz0N8+ngyGxkTM6n294h9D22Vx1MDAxMFx1MDAwNnR0XHUwMDE4rPxXXHUwMDFlQpJcIvt8XHUwMDFkVJHxotqW7k2zXHUwMDFk9IOx+mN7XHUwMDBmOmvoXHUwMDFhvnpWXHUwMDFl3Yow/k6Pm7Dcc2S5XHUwMDEwXHUwMDEyVbJcdTAwMWOnxK6CuKKFLzvLyX5cdTAwMTmxXHUwMDFjXHUwMDE1XCJesft98fuPWHpcdTAwMDZcXMlcdTAwMTIuXrE+YKOa3vx1y7X4XHUwMDBll9NJYZxsXHUwMDEwXHUwMDBiXHUwMDE1cYSl7dj/XHUwMDEwiVx1MDAxZNdcdTAwMDfBZZGe7mq7bydnXHUwMDEz9lVjfZus3/VNMahcZtNvfcRK7tQvKFx1MDAwN+J5mcRcdTAwMDWqk9U7icI/vnx5ZC8s/U6pX1U9zXU2tHqnnlSjLjJLed1JS7VgQMmQ6aCvXCJcdTAwMDdcdTAwMGI4rIBcYuw791x1MDAxYj2YrTioMITXpOpN8rVZ+yjqs19KbUf9nMj4IS7AXHUwMDAwllwigK3ub1FMzO5cdTAwMDH6TFxmyEX6qdFrXHUwMDAw7u9cdTAwMDB2XGLDo7lWQ6i05Kv0uDzDIIJlUFDP2lx1MDAwNq+OXHUwMDAxksN+K9eVXHUwMDAz1MzA5C1cbjm2sKbYScNbUuCC8kZcImBmXHUwMDBlb1iI6ZdH0bqZ48yt/Vx1MDAxOGZcdTAwMTC9TOA6Jeleqrg1QogkUnBKXHUwMDE4XHLX7bPP0tGqQFFCh1xu6Xx3nfqoXHUwMDBm34JfvDtcdTAwMDexTlxmYnDRZfi4vcv/Pl2Qxz9Vzq2Iyz5ccjs1d7FcYl84JlG33/WR5n/7iHKxlOn9OSX6t3tIXHUwMDAy/tbMXHUwMDE2TFx1MDAwM9L3NjDf8UaUcKe1XHUwMDE25W3Z2vZcdTAwMGLed9boUc7li6CHZp5K0i+wXY/8MVx1MDAxNvFu+Fr6++Xnh+RcdTAwMDNNfVqgvEE8y1/kozZcciD/Klx1MDAwN1x0h960k1x1MDAwNDDYebyhOjZyg4NSXHUwMDAyQbVgas3aViVbiKjrzNntmPGGxzAnol+psmj3SHdcdTAwMDDupMhhazFYzOFLSHXiPD75a4JF5UTUXHUwMDE5hXvgprp0ZedG4TUxQCRMSiaE8bKKKu1cdTAwMGJcdTAwMDCc+TUpNrTGo9dk19BcdTAwMTmO7fFcdTAwMWMyQZRcbubS/JRvlIicfO3zpl3Y34xcdTAwMDDdPJTP4DJvbPZn0ZtH2isuXHUwMDEzkuzniF97Ko7PlXbzwpbueN1IRoDfXHUwMDEzlpjehIzUllx1MDAxZnoozFJpbsu3M6dcdTAwMWO/T2U1TX3VfY1MXHUwMDFko+LNuci+k5Ar0F3SMNGIOyOzXHUwMDAwm1x1MDAxMSd0n18mXHUwMDBiOyP748N778jKjGEyXHUwMDE3c33y6OT7LYZiTohcdTAwMWOZP8ksZoOPm/1cdTAwMDGMxOQmY1xct1x1MDAxMVx1MDAxNXy1w1x1MDAxMI1SSFiYKTQxUPmVL+VSmmHq2I53LKmO8fHSIGdfRtizLFxykWZccmLSJyRWinrW0DlcdTAwMWVcZlx1MDAwZVx1MDAwNWVRfHb8XHUwMDFllzfoQ4fp11x1MDAxY8zSwGN7XFwyoFhcdTAwMTfZ8/tcdTAwMDXtXHUwMDA2x1x1MDAxObT+O7doXFy1bF420/G+cVx1MDAxYj5jJJjBXHUwMDFjh3JVXHUwMDA321x1MDAwZobeXHUwMDA3z6diSqv66qVaMVb88cY06Fx1MDAxY/bYmMXQur/zJMJcdTAwMTYzPT7Oj3Cr41x1MDAxYXyFLVigd01QXGL20+KrXHUwMDFkc/wvLlx1MDAwMoGhS+UsQKrUXHUwMDA1/qDV+CVtYUrzXHUwMDEwTV1cdTAwMDKX86uoXHUwMDFmm/zKQfDxP9gvTC9DXFyPcoVcdTAwMDaUvLHhXHUwMDEx0N+6IbFg7zxcXFx1MDAwNdHrcl741fieLH8mz2P1XHUwMDFiO6VWXHUwMDEyaqPOMGhcdTAwMTV08e/XRUjH+Vx1MDAwNEfyQya6fvozkiBgJj9QfCRXbMHJKFx1MDAwNtRL5Wfh7OmzZqiicstsPvP6oVx1MDAxOSHloyH6lrp+d0aBd8450uWUdVx1MDAwMy+Et2SwYW3Xnnj63+9zvJLV1Fxutj62XHUwMDBl+N9cXOlbW1x1MDAwMEKWOmPsnod954XGXG6zLWwpP9mj8DyDoqiX5GCwZ5HePylapHlio+hcdTAwMDaA4JdcdTAwMWGqveaietpcYlwiXG5cdTAwMDJcdTAwMTgshmeGl0aDh35GXHUwMDBiME8nWJtdR7pcdTAwMTRHqKT8XHUwMDE57X3IZ1xyUM82JqBcdTAwMDRhm9CgXHUwMDFm9NhcdTAwMDXXwJVcZmc7XHUwMDExiD3jMDe94oxcdTAwMWPoa2o9/lfvld6ub8BuMJWuXGLc75vfa03Julim1u7pXHUwMDFjL4dcdTAwMDGU9MiwZSZQm1x1MDAxMOomsZo5MGlBkdtQp/VcdTAwMTI3lVLHXHUwMDFmqWmBXHUwMDA20LjPVk2urnnkp7wrL1Aor7e1XHUwMDBiXHUwMDFmNJ8mK0NcIlx1MDAxYUomMVx1MDAwYlWUXHUwMDA21z6QZ2Kqt43XXHUwMDAxKaqjhlx1MDAxZDRgO3jSu8DKzq7SmZpcdTAwMGZcdTAwMTEzXHUwMDAwcy1WPDDoXHUwMDE3XWYpJPFcYlx1MDAxM3u5XHUwMDE0cfT8XGYrd+Hw8W+P/NW3pPuS7FbMTKFuXHUwMDFhzrpcdTAwMDOIXHUwMDAySzo9/r/z/lx1MDAwMcZehbxbzFxuMpdcdTAwMDFo50JpMllS5Fx1MDAxYlx1MDAxY2TpXU9/XHUwMDFmUZWKIToyWyyZXHUwMDE4UFx1MDAxMKxcdTAwMTVBc6Ty3Pc4TWjvsVI2XHUwMDA0u6RIcOTOodJcdTAwMDTKqD5Nh1hNmzz9KZRcdTAwMDP7OuWjUzRlcPJ92PA9ZdItY/xhxbLix9f9XHUwMDFiOdnQ8Vd4y9pcdTAwMTnG1dBTYyfeIZ96crYyx29cdTAwMGZv+Fx1MDAwNUxcdTAwMTg7ilx1MDAxN27M2qj48Od/bqltZWZlKWT0ilpcdTAwMTFcIlx1MDAwNKyvQHrMqFuEvMGWN/FcdTAwMDNyaKP5XHUwMDFjXHUwMDExJWKuXHUwMDE3uX1QNvreSE/iXHUwMDA21lx04K9oXHUwMDFkXGIme17eyNn3fKzDVahcdTAwMTLIolx1MDAxOVwiSlCEI4po70EkLv2ppF70ZGu9zVxm/f18245cbqNQkFVjTcFSOsY3ae9e3mjqKVx1MDAxMmqEgsyq8lWOTVx1MDAwZk37I2B0jGpcdGlVeL2C0uSodFxmb1xijZ+G3eifgo5ssr13+baLXHUwMDAxQF4+YGBcdTAwMTbSXHUwMDE5XHUwMDFkyY2Nj3yxinZCpbT+cOtBXHUwMDE0f6ssPiXyseeerCmGeNSzX/6+OobwQlFsa00go/5ipGU5xlx1MDAwMOxSX3Bq7aNcZlx1MDAwNFx1MDAwMyYwwVx1MDAxMJ+osvKU56zh1yDhXHUwMDBlIfJcdTAwMTO8Tlx1MDAwNobRqno8a1x1MDAxMOMl1fs8a9WAmX3OXHUwMDA0xuo5/uPY9/VtUlxuym6UxudpJaSUy1x1MDAwYoac0pJcdTAwMTWs2aSckaBoovpNesBA/1wiylx1MDAwM1ZPOv48iKU+VrX5o8VcIvzS+bbq13tek2f4+F/573tcdTAwMGJcdTAwMWHZUD1cdTAwMTZ1KFhcdTAwMTJUz5+RIDPsQli/j0O+z1x1MDAxNrXOUW7TSvJcdTAwMWRcdTAwMTFcdTAwMDSy9LpcdTAwMTW0mdZ0K9R22dZcdTAwMWVtXHShI+NcYraiszftllxiNt3DXHUwMDA0XHUwMDFh5KwxZnCcLzlfXG6al0KMze4ynVJW7L+j+C1cdTAwMDHTXHUwMDFmTMZ2yJXO1flVcVxmylxyIIP+6iBp1++f74CMJVwi00nExje+U667+y1Bn4BcdESL/F18+rN96DtcdTAwMWPjnef66edcdTAwMTPrXHUwMDEz2epWXHUwMDEzXG5x3Doq0zVcdTAwMTDdgGpPa4U8npzl7ntcdTAwMTOLa/c1yl8oMYI/ZLZl/XORIPRmcdlcdTAwMTJfXHUwMDEzhlx1MDAwNcDCaIjHXHUwMDA0uNxQrKBcdTAwMDfv2Vx1MDAwNiV2TTGCcMlnXHUwMDA0ykQkRaKLy9LtI8DH9k2K0Hfvs0ok71x1MDAwZav0TfBSXHUwMDA27KdcdTAwMDE0+luk21dfKfprXHUwMDBlWjtdXHUwMDAyISi8I9lbK1h4g1x1MDAxZqekXHUwMDA3N4agTOKOrlx1MDAxYWPhPyfuar6Yr1OxRmZTXHL9YN1vtUimYaGB+a49bHJgZC4oXHTLj6OXkMLh3excdPGBLdrsija3VCZJuoazjlx1MDAwNFQ374ApcVx1MDAxNatBlXt9PqH3SFx1MDAwMFqlsZE+uFx1MDAxYso3ZVx1MDAxNM52+n5cdTAwMTJ45axebMOr8lX1YMFcdTAwMTk2pYOgcE2zXHQpXHUwMDE2gH+1hODk6zthL6cpyixwZvup/CqGk37Ux66t+rMsTllcZiWerqa44GhXbn3u7YzE1Vx0eiYptDzpckjw5zedi5oyXHUwMDA1cNGbKDolO3RdY0SoSpdcdTAwMTEx5Vx1MDAxMH3A4IuI2d+en6RccmYsXHUwMDBiQCwrymqqyKvLXHUwMDE3Mtk4XHUwMDFkJMhcdTAwMDPnRT5CvGJHXHUwMDE1gT2MQrEkiEaRQ/07XHUwMDFiW51Sr5YxsiU/XCJcdTAwMTSej9xcbjbjmpmlWMJcdTAwMTJQXHUwMDEzcnpN9aBcdTAwMWWwXHUwMDEylFx1MDAxM0+GT8G2XG5cZnLbvOtcdTAwMTIl07vl97M3J4M4zlx1MDAxN+KtwV+FZSncJWLHXHUwMDBmjFfLXHUwMDFifTo9XHS07FfRaXp8pFx1MDAwMPlML/fdO2FKyv5yyd6JP1x1MDAxMlx1MDAwYvlcdTAwMTNAOk9PXHUwMDFlwrNjTVVI2oYv7+B2baZSclx1MDAwNddcXJWQZGJcdTAwMWbr6t+1c0qE5fNV931HJEbEXHUwMDFhStJcdTAwMTJcdTAwMDdcdTAwMTGyXHUwMDA2imtO5ZG0nvOLe0ez8bL4Lnijs6pmXHUwMDEyJUlsNMhWOdKwjPDebtGgYmBcItdcdTAwMTKoROzZkqguwNn05GhGbE6+mVdpXHUwMDBmXHUwMDFkWpKZL4WE+1x0/FfC3+v3pFlRd1x1MDAxMYXhaD9B6/1SssRcdTAwMWZ6RFx1MDAxOMclXGZX/DtcdTAwMDZrS2uP9NrAXGKbptfBl2egTf2reYhqfoVcdTAwMWbmIFssZ/VcdTAwMGZccnXm+Fx1MDAxMYY2xlx1MDAwZZDZa9qd30XcK6jcrTQgIFx1MDAxZCpHxMFQQuZxz2eocUTcdV1cdTAwMDR34MQ/a1x1MDAxNX2iPVx1MDAwYj5Rivi7wXQmQ1x1MDAxYnVSXHUwMDA0p0tjqCenXHUwMDE1P99cdTAwMTQj//kg5fpXoPg5XHUwMDFhXHUwMDFjokan0l2QrWdcIiwxZfZWwjrjL4wv869cdTAwMWQh3i1qKJs4jG1TnilcdTAwMWXThpTyXHUwMDFiOZJa2vSzu/NcdTAwMDK/XGKs2TF3NUv44LQn46E/91wim4E+U8pAaFx1MDAxMTKYa7tyzn2v3cdcXGlcYqmDXHUwMDE0YYnreJNkyo+9xXtV7iclX1xilfCdNZC550VH1Fx1MDAxM9BeKZTGXHUwMDFkJ09cdTAwMTaHjFxuMPtB94xdXHUwMDE3ZuektHGrbVwiWDPMglx1MDAxMYnvddNcdTAwMTlLkrmZpFhaJi3cXHUwMDAwiObkz/ikZku8XHUwMDEwdVJK87c/4npcZiBOXHUwMDA0LPbfxrY+2lx1MDAxMSD6ylx1MDAxZU+Wz0xQMDnykDBYUktcdTAwMDJMuXKJ59T+7VxyMpNuKklya5eVjFtcdTAwMDDJlEZcIjfVP1x1MDAxMVxyh1xiV1wiv+lYzVx1MDAxMCk7XHTt+t3wK8lrjOQ3KYfW1b/bfO+89jPFnuEw54n3Z1x1MDAxOUS5uXnQ5nH2ilx1MDAwNoScnzquLN9/bv5cdTAwMTIypNZj5I1aXHUwMDBiXHUwMDEyclx1MDAxM7DytqRKby5cdTAwMDKznTd1ovw54i7QTb+UXHUwMDBiMu+DpLUq8/Lhn1x1MDAwZlx1MDAwNJGY4tc5k1x1MDAwNILA87xcdTAwMGXDbpk5PHtcdPyTKlx1MDAxMVbOu/JcdTAwMTK0I7qPs1x1MDAxZWR+mFd2Un1Xs49M+Fx1MDAxMu7vSnbsY8HLO/Bd+czN+Z5ccoDlav/q9JMlnrjck5L1q0Xwcv/YXHUwMDEzjl5cdTAwMTI013ZroOW16sDpxsB55zY/1c1IokdG5paTgvdcdTAwMTBwksvKrWK/XHUwMDA0McVsLKGa3Vx1MDAwMcY19qF4xl3Dv3gpOXvNJMbrbp6k90ZcYs1ZVNSzXGbSnkvYMr8jmapoXHUwMDBml/RQ+dlcdTAwMDFwM6zv3p3MnkdcdTAwMTi536LnSlx1MDAxYqDCO6+8c/lhqsXa285cXFFPn9tYLVx1MDAwYiVcZvJ5pc9cZjn370+YnmZcdTAwMWY0plx1MDAxMMDFtf77XHUwMDBlPmRJXHUwMDFiJWb9XZm7XHUwMDE25qXez1Xs3OYxeGdkZDhcdTAwMGW6YCtuO8JvajxOXHUwMDEy6HCW+J75ZjQ+7PKHTmyLk/aNRVV+7dgrRlx1MDAwNcmdXHUwMDE2bT6AuTpdrPrXQOVcXKzjUIe7KzW16vWoXHUwMDEyejkpOlx1MDAwZVxyupiHXHUwMDBi7MfpRVx1MDAwYmPoilx1MDAxMFj35lpJZbhi7lx1MDAxOD3zOTpcdTAwMDOhV6ZcdTAwMTBNPyNcdTAwMDJbz8Xr8k5t2bpOVdj+glx1MDAwMVqdv2i22ZOCPK5mJWipOaTNg5dcdTAwMWJcdTAwMTGFWET+ly1ccjiz/Ye7LOJ53oVBNm7UXHUwMDE3uq6lduxzhYNuVicg0Fx1MDAxY2vX8Tt7tFhb96mv+45txmzekeVcdTAwMTRcIm24n7+7W/gplvJSXCLVRW9/MzKNXXc1XHUwMDExXHUwMDExXG6ETlx1MDAxOVxc2lx1MDAxNpyP/6t3XHUwMDA2prRcdTAwMDHH72SdXHUwMDA2ofTvXHUwMDAzaEthxlx1MDAxOeF8bU6tXHUwMDAxMlx0qVx1MDAxM1x1MDAxODRcdTAwMWRcdTAwMTiwP1x1MDAxNy8wXHUwMDFlPlx1MDAwM1Io9E9GLbhmbZRUPY6hXHTiXHUwMDFiXHUwMDAw+Fx1MDAwMcraXHUwMDE1xU7V7zcwXHUwMDAxQ1x1MDAwM+Jxck2/u2/QUDHe1W9cdTAwMWbb3FGAyYW8RjJzLVx1MDAwNX2xXHUwMDA3ubpcdTAwMWOBXy5TXHUwMDEzXHUwMDE3ULXvXHUwMDFiI6oklMt8TIMsvJ6Gq1x1MDAxMoyEynaNXHUwMDEyy1x1MDAxMVx1MDAxY1x1MDAxM329PFx1MDAxOM/EXHUwMDFlQj9cdTAwMTdiPf+culx1MDAxOVx1MDAwMoaM9JLdsvJcdTAwMDJTY3WsiqhWgMgkPENAWcvzkFgyxlx1MDAxNVFetdmQfVk6+Vx1MDAwNaZxXcbvYnCpXHUwMDEyZEHBkn0octnpolx1MDAwM1ZKWa3I4oxJX66xufJpNzCjSYWj2G7vJaQn/DYv/2xcdTAwMDeHtLHROvXH156kvulLYNxfU7hcdTAwMDG48o2vNt38RS6I2XmR5fJBM5mb94WZn/1n41+HtOIpk4aYw0l7XHUwMDA1NNHW1jPGycotccn9fTAxJmFY+ELaoJa7T9OfXHUwMDBmIyyHXHUwMDBlICErXHUwMDAxxt76b0AoWlx1MDAxNsnyXHUwMDE1NSGWJ1x1MDAwZcw+XCJcIr7utqj/xkv1RTwjtYQ41sSbfm/4X5fCXHUwMDE2tWDI3lx1MDAxMddr5dCz+keZ8Fx1MDAxYlx1MDAxM6HMXHUwMDE4JnrywTdO+EfNXCLQkdJoJbu4MXif3y81XHUwMDExqnSkwaxRNPjDXHUwMDFldS2okre/nCxAkvjm40ekXFzIwaZcdTAwMWbfd5SGZtxcdTAwMGbRLjv4XHUwMDFkb5JccjDJXHUwMDEwxlFRXHUwMDA2vnOWXHUwMDFl6tzCcGN1QOwsuERoNtPYK6d6TVx1MDAwYvmDMnw9x59cdTAwMWTTrlx1MDAwZcNcdTAwMThcdTAwMTExfiedNU+MOXHvalM4/9YmLeGK2dlPsuPjWOaAmJlNlvV/Kcfyf9hSXGKWXHUwMDEwPYpyXHUwMDFjOu3LmVx1MDAxOeczmF3fntNFn1x1MDAwNZuKabQy4EjnXHUwMDBiM3rQTNw8/f81xbvvXFyMyuyrNVx1MDAwMD4987uFVlx1MDAwMr6vtXexRIqhj0SnITIkXHUwMDBljFx1MDAxM3iHXHUwMDA1vpgl6p5QRz1cdTAwMWTYXHUwMDFiXGLbN1x1MDAwN1HF/OzWWFx0qlIkppFuOuHNJ7N8ZcrfXHUwMDBiXHUwMDE0XHUwMDA02qe/0syebp/1oVdY/9tnPmc2YtZPXU+NSkRUXHUwMDA3xNhcdTAwMWWH0YO1lVGKJFKrOa88c4uQ6lx1MDAwMX/IkUnroL42JWzVkoE/J32BXHUwMDA1ioKJXHUwMDA2x1x1MDAxZdPGXHUwMDFllz5lUyTCxsmFUmzFXHUwMDFhwONPoKlcbrYhXm9cdTAwMTOWt6CPPYAwc1x1MDAxYlx1MDAxY1jYkG5cZjzaXHUwMDE1XHUwMDA1clx1MDAxM1N86pRrXHUwMDBmtsijXHUwMDExtzNcdTAwMDZcckZcdTAwMDFwpE/KXGJcdTAwMWTrXHLvozgm+7Ozwf42/ndcdTAwMTY0+JeIIflMrrP8wmStjVWUT8ToyFx1MDAwMf98vsHrmTVcdTAwMDZcbrzDaPtQlcf6XHUwMDAxhsdVbEHXXHUwMDE5XGZcdTAwMTn775JmwGfKd+5XjEl029hHRK+VdWQsaqLfd3PrXCJkYGVhVcc3S28nJ2pt1ibipjeGwFXY70dcdTAwMTRcdTAwMTWWcmX0nlx1MDAxOVaj0qnVXHUwMDBiL1x1MDAxOW3Mp8/16lx1MDAwNIC1XpFBqrMpXHUwMDBlhdX5jlx1MDAxY5hcdTAwMTHjxNnHm2/xNKDcXHUwMDAypvtfZlx1MDAwYkrNQZ5wLt3aXHUwMDAyqFc374WNh51cdTAwMTPA2c5cdTAwMTFcdTAwMDYyYDvn3jOU86jmXHUwMDAxVc9Ffp9cdTAwMTJxmbjso3mkPndY3tB27KRNV1x1MDAxYkl5jOvUvHtccul1PDH9NZgsMVx1MDAxY5BZhvKM8lx1MDAxZvBTdI/ukPBBMDhjiCFcdTAwMTNbwzNmaFx1MDAxY4aknaFGnqiXpX5cdTAwMTFcdTAwMTbcOuhcbi94XGbs/85wXHSfJuvEeE/32UiwQTH3NkCk1Fx1MDAwNP3uXHUwMDFh3IdBoF1FuiST40K7XHUwMDFhgs6odFx1MDAwMz5bXlxmv1WFx3LHQFx1MDAwYmWs4HZ/uNPcLU32XFxSyl7sVFwi8TGubsBDtUiKVzGkXHUwMDFlfil7z/p8wjTcT0NidPwvWPdNZKxcdTAwMWbeJIH1rFxi41x1MDAxYyOi+75cdTAwMWWh/4qJIYBcdTAwMDJrMeagfOJccvtkde1s2u1of+5cdTAwMWPo21lcbrltN9RcdTAwMWKdXHUwMDFkXHUwMDAyXHUwMDAxxYck2/nOj1x1MDAxZb5mUWc6VfdhudC4M0H7mZf1Y1x1MDAxMEZWmKjb2eZV0fFcdTAwMDBcdTAwMDMt+DrvjPhcYsxcdTAwMTk2MWiiK1s3ZVlcdTAwMDJcdTAwMTBcdTAwMWMkJZxcdTAwMTWT9q9uU5OFg09ZP8PcUHdhXHUwMDFj7Vx1MDAwMWaVZGZcdTAwMWbujchZUDWdzlxi2obZQugjPHN0teKZ35Zcbv1cdTAwMTJ/jVx1MDAxMFx1MDAwMlx1MDAwMMFO4IqBXHUwMDFiyLi7tri2XHUwMDFjJq9PoTVcdTAwMWFKhlJl1em/XHUwMDBmheGO8Kwr4KMm1nNm41Dxq0iaeDNcdTAwMWH9zpnfh+UvY11dXHUwMDA0XHJa3c9HhcSUa/P55NO6qN5cdTAwMTlcdTAwMWVPzf3xSchg5bLJhmFcdTAwMTh4TmJf9YdHkpL1WOVcdGIjfa9eMVx1MDAwN3NcbtVvxMDjXHUwMDE1TeTK8kMg91x1MDAxM35qndiZfDBcdTAwMWS1+SjltcyBXHUwMDEzbd7RWllG6zHv53EptHTvQmAwSeMjXHUwMDE0JohcIoPg3lx1MDAxOFXZSGKUh1x1MDAwN2x2PSXHz68t82NvXGbKqlx0XFxcdTAwMDSvKFxcXHUwMDAwXHUwMDBlyHZxOIPP9e7OuEfTXCJfJCCe4qVcdTAwMDBcdTAwMTG/Le2Es1x1MDAxODc75HBGgPp8j2esWFpcZlFcXITgSChcbvBB/+v1MYcnMzpKLVx1MDAwNtCdfX+R8cGEr1x1MDAxYnX9XHUwMDE3XHUwMDAzIYqo0FwiI1JcdTAwMDBXqM/uXHUwMDE221x1MDAxY1wiiYvWXHUwMDE5xpiv7kJnqzSTlaNcdTAwMDVKXHUwMDAzzWdJcV0qXHUwMDFlQK0wXHUwMDA1XHUwMDA2c/mqpN4/hlx1MDAxZIu6XHUwMDBmblJzQu/kO4c8xsRcdTAwMTNcdTAwMDG6m0uu+UnZ1nc9hYZcdTAwMGI2bu3vXGJuXHUwMDE38KpghJ832vZgeSZ8n8txXHUwMDFhXuqsvVOS1fJWjUvNXHUwMDEx9uSKXHUwMDE16km4OeojXHUwMDFmJHHmiLjlk1x1MDAxN7PYXHUwMDBiWGZNXHQ92eYvJCefwGKpd8DMWZHshHRcdTAwMWasXHUwMDFiXHUwMDA3nrtcdTAwMDG70YU3tSkgc1x1MDAxZFKJk1A47z6WWcFcdTAwMDY8XGa3xCDYRjedJsqzeyaKbvVcdTAwMWRDRGVcdTAwMGVwXHUwMDFh4Vx1MDAxNuI0SPlDPlxi24+jUHFcdTAwMWafQdcsvFhHXHUwMDA3d/x9XFyru2j4x05ITl1UXHUwMDAwQvj6XHUwMDE5XG6b6ueBitxcdTAwMWSD3eKg/Y9oXHUwMDExxzeJiMxcdTAwMDdcXCaPZFt4wedOnZ26had659YhyFx1MDAxNo5cbo5Wz9RcYtqm8X28XHUwMDFmXHUwMDAxPVBNaP6J7U+CzrFcdTAwMTNYZDJhjofx9+bGXHUwMDFkPIxYTXlsXHUwMDFiXHUwMDA3LuGHhcMgYuLkdfTRW41y3lx0P87bz/5cdTAwMTY85p094vtcdTAwMWSyf3qyzG39+3ON8Jlh8Dcw6k9cdTAwMTU+94Ls2pWWn5ClJ699QYnCXHUwMDFjM25Ta+WAXHUwMDAzY0DPt2pcdTAwMGWFXHUwMDEwXHUwMDA3vO7AO6y1utxFQpuISI1cdTAwMTRGXGY7XHUwMDE3oU9fZ6ZmTFFcXLpcdTAwMDBDvmtcdTAwMWGAx9dkoTiYX1x1MDAwNlx0L+nbro3RbfNYn7fP2Fx1MDAwYshWiF517L+9QL/UXHUwMDBlt2D8SbwlW/jrXHUwMDE2rFxiXCIunfbEnbva2XBb81k7jfeLkqCMMOZEKFxy4ZJljLL3ndBcdTAwMTHt51nQe1x1MDAxZfX6rb3JjFxmgUxZKeGW8Fmc4ayzYZqx2kz39+3dVj1GTLRjn/1ccuh5z5AjJpuKVs2t8O+Mx9lcdTAwMDJcdTAwMTaXP2Gya1x1MDAxNPdhWKBbdy/ch8ZYf35cdTAwMWMzSVx1MDAwMYvVXGaiyZlcdTAwMDFcdTAwMDC3qd9kXHUwMDE1gXWtnUFccvpcdTAwMDFhPT/zqcB0da5NXHQ/oGP6UFx1MDAwNNZ0jnQ74O/N+rVsXCLM+DfKQZBhOS1cdTAwMTSc7Vx1MDAxMnmuN7nWXHUwMDA2dfjvm21cdTAwMTd9evOKKyZwq9o60i+cNe7aXHUwMDE1/dVQpSGj4/Vdu/VyXHUwMDBlTL0z/4PqhsWtMVXcja//RmjczynYNVxmXHUwMDFjj+lcdTAwMTjwwD2gNYVR38jdbHyJst90XGbktJ9cZkxcdTAwMWGQZlxifYZcdTAwMTRcdTAwMTKvIJFnXHUwMDE02Vx1MDAxM1x1MDAwMbQxPkcyXHUwMDFk19XMYFx1MDAwZbresUNYe1x1MDAwNOONJk3ehTl2wPeUkOpamGqAKyP2vtW6XHUwMDE5kNePpFx1MDAxOJ+ilJtwZntcdTAwMTVxa1Cdllx1MDAxMMulTKa6hZJcdTAwMTfBXGKwZdJ3np6uXHUwMDAw+Gz5u6i954o+TL1cXNzUhGqp3kxhYMyyfdt7M85vPKjovlx1MDAxMfrz/mhcdTAwMTbQltJOXHUwMDA3r5vxSYwpLOvRTFxuof6bP5bMIIdcdTAwMWRcdTAwMWNcYlx1MDAwN7fwRDR7ek3z8eFcdTAwMTPvniWEf4M8xlr6eYJy2IhWNJ6/Q1xiOnw5sr/GQtaWQVx1MDAwYoawV0kvI1x1MDAxYfanfiBCXHUwMDE2oenXc776X2+s4Uv1XHUwMDAxXGaXpEbzjnFcdTAwMWJcdTAwMTeDQVP6rfB0XG5YrEBcdTAwMDIlXHUwMDEwsvibjr7tsLQpZVx1MDAwMln+XHUwMDAw70Hxo9dcdTAwMDErv2rpXHUwMDFkXHUwMDBmYjnG0YOK2Fx1MDAwZYrL83hHVWKN1bFW0U+bjFvI7qnqQOpcdTAwMTO9z1x1MDAwNoardjhcdTAwMDGmY+nrXHUwMDA341wiXHUwMDE2i5Mksv5ccmDlY7ffKsXw+1x1MDAxYo55Ylx1MDAxOU1XXHUwMDFijUzv4qmNz8W8/vLyVVJ4Wl5cdTAwMTlSXHUwMDA1KjMsqjtcdTAwMTNxJIlcdTAwMDJcdTAwMGZHme09vdrL3FNVR1x1MDAxN2e+nmxsoVx1MDAxMLevZt+/YZJFKTbzPUCph/hsINiAL1x1MDAxNY21xO530Mos4+RrNpxR2WvMjIO9QX/rwVx1MDAxYp7fXHUwMDE5xqppXHUwMDE53kOxJGtPQ8vQr9jlrlxmwT9cdTAwMDauXHUwMDFkVndXk9q9XCJ0suxcdTAwMGL9r/5NSFx1MDAxOJw+JcVP0r++lWwt1XK+X2f8ssJcdTAwMGbxPZVcdTAwMTM8N9BQ2IexRn6Uyv8sXHUwMDE12/GGITGxJCVtscxcdTAwMGVoL1x1MDAxNkrjgSQxvVxiqV5cdTAwMTdxRDT56yUqjG1eutBJ35XtMXF73e1cdTAwMTO6XFybaOxccqXWKzG8XHUwMDAylrNzW9CyNH2+b1x1MDAwZVtRTCyQ/OdcdTAwMTnp8uyJWl/dg1x1MDAxMHN7XHUwMDEyXHUwMDEy+/Ivt6Ux9lx1MDAwYrmSxDtcdTAwMTl2XHUwMDAwXHUwMDA1otGhYFx1MDAwNKb1Mmfo2i8+XHUwMDA0+Ky+bm9/xFx1MDAxM1x1MDAxOXVi8Xd4pmA0vJBdgvGmXHUwMDExQurecUG4/vWcIYFZ3sqGg1fY9Vx1MDAxMYW85S5cdTAwMDF9xoigv7FcdTAwMDS1tNnmXHUwMDE4Z3R2UFx1MDAwNUn138WZdVx1MDAxYZDI5Cg8qPRlPvylbuv8lFx1MDAwYt7Qm+u8JLpcdTAwMTQj0rxzUVxyXHUwMDE0qdMtTJJb+eJfb1x1MDAxM1x1MDAxMdtdQb7jgThD9ttcdTAwMGJEXHUwMDE3LFx1MDAxNDD620ZD+sVd5dL4XG7ZKlx1MDAwNJfxaSqPW1x1MDAwMnYsTJ77Xbo57/ORmyGAX9jZqilcdTAwMWNcdTAwMTJA76XEXGKv23BcdTAwMTGSky5u85XVYWNcdTAwMTiOYVxc/8NcdTAwMDavQn7kXHUwMDFi10NcdTAwMTfyd85cdTAwMDdhr1x1MDAxNPv8zsV6j4VfdfPSJShcdTAwMWVNbEiKvX5cdTAwMWUhfMtddTyQrcKXzN99r87c5C5cIndBvaXsqF0tcVbPTSMue1x1MDAxYpJK7THCXHUwMDAwXHUwMDFiXHUwMDE52FvgUeXPKNnvXHUwMDAxRsWb0XMnnXLNWGKBZXvao22oa4Azzd/nY1X29ZGtrXXskjn+IcHp8VxyeGRcdTAwMGIyo19cZlx1MDAxYb5i5kVMfUujYVx1MDAxOfC3Rlx1MDAxMOlcdTAwMTdj8Y96wmJcdTAwMGJcXKqUgs/nXGIm7mu8TJaMl02tMfGuXYRcdTAwMWZZM97VaizTufba+n/8oy00JopcdTAwMWGTZVxi1vhIorLDayRMJ5exs1x1MDAwZcZSvapcdTAwMTlIofQzk4pfeO2WXHUwMDAzXHUwMDAzcVdRo1x1MDAxNlglW4+y3TfBc7+/alx1MDAxYsc4fMGZUzbo/1RjXHUwMDA11UlcdTAwMDXQXGZcZqf9xFdtfN/ygsYhfiXF7OKRhFx1MDAwN1x1MDAwYqWBccU3cbFbh1x1MDAwZaOOXptMhfDaMpJEN3JcdTAwMWLfXHUwMDFkxC4k+Fx1MDAwMjFBbnF0nV5poOAvQW3h4b4m31x1MDAxOUiVXHUwMDAxrKhXcFx1MDAxZX/7orEuXHUwMDAyXHUwMDA2ZHebkf18TrNIpWi3WsFSqWBjXHUwMDE2MnI7IEWk+CbjUtI+ZfTLQinCjX/70Z9aMzaKl9VcdTAwMDXRRZ1sgZPunSak/6tH/1dHmYR4mDJHXHUwMDE3VNGrf1g6vWnZn/FcXJl+rzrXvWCtXHUwMDAz6V17vE7PXHUwMDFiOL7QjGmVmai/qYixwUtcdTAwMTbIXHUwMDFk+1x1MDAwNlx1MDAwNSV+xORwiYKctCGluYjg6DbkZatvottJkXZcdTAwMWOMVvU1wbRXONKkrlx0XbpcXM9WPtyBfrRcZpTAlWD0jFjHXHUwMDEwc1SJU2xcbup4VLRcdTAwMDU7Yfpww3aEXHUwMDA22ax4XHUwMDE1c+BcdTAwMTdnScRcdTAwMDCwc7/bTyr/1Z1rX25cbl51XjP85i++MuCkToOe/kZZXHUwMDE3bcvDp8/3QqBZOVx1MDAxMjL/UF9trYVrSVx1MDAwMiBe3Vdcbntqedgr191cdTAwMDFcdTAwMDK5/epcdTAwMTanTqazzCiJrNKdaqQwKpO6R7R5ZtVGN4NWJD0x/etl65YsbIbxnlx1MDAxYlx1MDAxYbI386BI4HzOsszDXHUwMDFkXd9B/nhIMFwinKtQmIw55+1gQ8DwlH4tnIOnNHgvS1x1MDAwYi7m4lZcdTAwMWR0m1dvpefagigsZo7I89m+XHUwMDE3ulx1MDAxMcBsI4CRfdHDm8iNh6k6Uc+/wScsQ5VcboPm85JVSZrwsbXDXHUwMDAwXTFVRtBcXERcdTAwMDG1i8yiO3OLQlx1MDAwMvo15qFo0yszXHUwMDBiXCLnXHUwMDFjTc9nclx1MDAwNPxNWinIQ2atpuZxq/0n+NBg4LwgXHUwMDFlo8z0uqqt86tEkc9s9fbXMlxieflrTiOIJFx1MDAxMd9PUrRKLuDs71x1MDAwMOeuXHUwMDAz/vVcdTAwMTH6yNV6jKLc8MZcdTAwMGLauFJCosew6L+9gbyTXHUwMDE4O3IrQPG6XHUwMDEyo1x1MDAxNPt3K4C7XHUwMDA3lZs3W8J5v1xiXHUwMDEzbytnJFx1MDAxNXJcdTAwMWUxjFx1MDAxZruRNvdcdTAwMDNcdTAwMGVcdTAwMWbPcOqmMUqsU7Stwec3YWD+XHUwMDFhKrf5+5VQkpChvdlcdTAwMDIxgebIKXbp+1x1MDAxZkDB6t5b7vBd0E5cdTAwMTdcdTAwMTdt9lX3XHUwMDE1blx1MDAxOHt6kznU5UX7XHUwMDE1kIzaxNZt3dNcdTAwMWFLcM6LRrNcdTAwMWSVOVxio/irI3VhQoZ60oHZKUXFXHUwMDE4XHUwMDEwS877nqmOWl7laIdkQ3lYpVVdViXy+4p+cdo4KHTHil/w6+zbYj8hgZVMey2Arcllnq1QQJ7mpigybVx1MDAxY87VlMS5XHUwMDAwblx1MDAwMyeZUn92o+go4OyP2dhHQ+agI39ySFTBxlx1MDAxOUaRXGKpfGk9uIZcdTAwMTM45Fx1MDAxZEwoNrGoXGJpY1x1MDAxM3FTu4VAYPxMvFx1MDAxOVwid/hmsydhoDWXyeXYdbOsXHUwMDAyL71cdTAwMDWumORriYGgX0Oe4rFV/75cdTAwMDBuXHUwMDEyleqrOJhcdTAwMDY/vFx1MDAxNKpcdTAwMThcdTAwMTnUg/pcdTAwMTTlepA93iXcRFx1MDAwN2llXHUwMDBiv8UsjLDVk6zo4kP57nyBS/C//oFcdTAwMWNccl/CXHUwMDE1q7ZcdTAwMTbVXHUwMDAwRI3BzoQ3QVx1MDAwMFPgMiRswPC99Fx1MDAwM8B97Tj/JbWAZbDonKtbNOWPl8n1vfVcbtdcdTAwMTNcYnBcdTAwMWa+2TTNr5AlYr3sXHUwMDAywkpon5VOXHUwMDE5llx1MDAxYY6TTH7BXHUwMDBivPH5XHUwMDFkZlx1MDAxM+JcdTAwMThMcH5B9lf8iE5cdTAwMTfFOFx1MDAxZv1oP9RcdTAwMTLLtayRIC+YXCJUlC2LxHlFX2CqkzQyXHUwMDAxoIi01F2aMyU/tV6IXHUwMDE4XHUwMDAxSTrmylx1MDAxMTeg6b2z4f38/q+fJmGKMsO3XGL1aFxy1V/cXHUwMDEyXHUwMDFk94lvM/4xYF2xXHUwMDEwXHUwMDAy0GN6olirR7zrlar2yVx1MDAwMjC4q1x0fvqs2pEuxzh9mZygt1Xh1nE+RUI37cJGuGR3ry12ZVx1MDAwZv21eITLXHUwMDE57CO2RzvB6faBIaKwq1x1MDAxZsBcdTAwMWGxIyGZ9PCXRVx1MDAxNWEtXHJcdTAwMGYvTMahnWORXHUwMDBiv1x1MDAxNJKX2Vx1MDAxNcQva1x1MDAxM7ZegJ14P1VcdTAwMWHsXFxcdTAwMTgy6JLtXHUwMDBiwlx1MDAxNFx1MDAxNsuaXHUwMDA0yOfuzpxsXHUwMDE361PzJH42U0BqXHUwMDA259p/qM9h/LWkXZ1cIu+M8Cv0eyxnxFx1MDAxZLdcXEeFJoY5OyY1wjeT0Lm7z1BVl9aJ5FwiUl5cdTAwMGVDXHUwMDE4LUBYtLZrXHUwMDFlXGK/XHUwMDA2XCJYjkuYXHUwMDEwf8G33FNcdTAwMWT06oCuSTdcdTAwMDSnjy9YKGve6NI0XHUwMDBisZOQhqFz4J6fXHUwMDAxKvIzo9s8obVX0DztyKHz91x1MDAxNTBv10JsJP/OKFx1MDAwYvqnXHUwMDA1sVmI2L1md1x1MDAwNuL7UJxgvO5d+Km1N5yye0P8NLnB5uN9vbwxkFx1MDAwNTq+7HFJa1xyXHUwMDBi8ta1aLI3kK3vXHUwMDFmfkYkJa1cdTAwMTl4JYqztVtcdTAwMDA/53eNxVx1MDAxYcJMyozSlsdcdTAwMTAhytiSLVx1MDAxNX4r4Fx1MDAwMsS2ZF1LWGKEmbDhKKCn1+c6TW40XHUwMDEwg3zin3k49/a6RNKokE6mM2X//ZtmjE/Sq6rHRlx1MDAxYeasf71cdTAwMWGc+id7O8lSvI5cdTAwMDeb1lRbIFx1MDAxZFJcdTAwMTGZYERcdTAwMThcckv81L1cdCNZXHUwMDFjq+VrNFxm6DFBVY1msLnTRMGbOexcdTAwMTmT7lqgXHUwMDBiKPZSjYI0XHUwMDEyJKlVK1x0TC79mnN+9URJ92S4rtJcdTAwMDBaXHUwMDEyXHUwMDA0YOmzq1x1MDAxMrB/b+Zy1M01Q1Q8WVx1MDAwM1LC/VlcctZcdTAwMDO7v1x1MDAxZZxcdTAwMTXX+MpcdTAwMDVniqe/uVxmTlx1MDAxNtEp9eKdot+ckDzh9uav8Muu4F9tr6hjKuhAMyMvTb63PS1wXHUwMDAygPsjRlGxXHUwMDE3SjFzSI+y5Gn8rz6wcPFcbszmNUdcXD5Pg+y7VdNccrOrUFx1MDAwNnuJXHUwMDFhUuBcdTAwMDLyTZ9cdTAwMTj9ry6QXHUwMDE3jyv5XHUwMDBiS81AQ1x1MDAwN2d37IvvcFx1MDAxMitcbvqjXHUwMDE1ILOGjvtcXLn9jmjafYiefVB5/rn0xewqXHUwMDA0bNQxk4WzsdT1ibv8XCKnKTM8oVxiuFx1MDAwNjcp11Qu8n1emDDzRqRcdOZj2pYgblx1MDAxNcHTwfh3LlSlWXP6zPtlNs7uKpmhhphcdTAwMTLju32Bzj1cbtyKpEn7sZhnJU1cdTAwMDFfrY00oH2+d1x1MDAxOcLqIL4wuElimlx1MDAxOf9671x1MDAxOaL/MZ6/+tZcdTAwMTckR+xRq8LfXHUwMDE5ikpcdTAwMWTPtFNZOq6ApXBcdTAwMDQlQyady1x1MDAxObnNMbw2mFmWdGfkosw7vc5cdTAwMWFcdTAwMTHu+PPq//eey5pCSFx1MDAxOIpcdTAwMWNm2t549JxHXHUwMDE5d+785ss7XHUwMDAzX3HxTqPDWfd9hJ1vo9hoSrNcdTAwMWNLpjjJalx1MDAwMeT9OzpcdTAwMDdcdTAwMDfLjWVcdFx1MDAwMr18xVx1MDAwZrz8q6ft4FXcduCZ/6vjXHUwMDAzXGbpg3lcdTAwMDXX66XwlJZlX+Q+1smlOVjFgVxy9VxiXfrO5Lgn+Cc7baRKS1ZfutLfzbBlqT+hbNt0V2VccouxXHUwMDAzxSCAviNcbq2HWNBcdTAwMTNcdTAwMTF0hIN76uP+15fu2Zx4vlx1MDAwYs3oPWyLP3tENbc+zfeyf1x1MDAwMFx1MDAxOGHPh8r++lx1MDAwMsybQGRcZs6t3YbWgc52Vro1vE6Ie1x1MDAxOWlcdTAwMWJMfsiQXHUwMDEyzO3BXsKqgaSSoH91o6A1XFxu/WHb/fPh4dIydk+uxVxiSdo7XHUwMDEweIMoOrtOOVx1MDAxZDCuKnD1ebyV3//GbipcdTAwMWLArDrpwlx1MDAxZCV0+16cvjbzXHUwMDEzXHUwMDExdjEstr+1qyNhk4P3XHUwMDAwUu67YVxyTFx1MDAwZpGvXHUwMDFmfquQ0lx1MDAxM7yPdUtBXHUwMDE5dG7qodKhXHUwMDE1b8jm/lg1iFx1MDAxN03b1Zh4toi+dyWX1M5+rVFl9aWlh1x1MDAxOLtJ4GqbnyEsoFmvujJBznWs7lx1MDAxMknIbZ8zXHUwMDExpJ03XHUwMDBl428g+3tvNbFcdTAwMWHhYHhcckJ/f4yHoKlvXHUwMDFiXHUwMDEysK5cdTAwMWFYXHUwMDFh5FxcuHVMXHUwMDFmXHUwMDExs3x4p4zQSFx1MDAwNI60/lfP/FSUkoYm3+dcdTAwMWHS1nVf6d9cdTAwMTnfnFx1MDAxNNpZl1x1MDAxMyTdx2TJhIN1Wfis6/7qTM1JXHUwMDE53imIzKmOr9Bfr3WJ8Vu9XHUwMDA1XHUwMDA0XHUwMDAx1M/6R0Gy8OWgjDpcdTAwMTP6yNVC/YaCp1x1MDAxY7l//krub0w5KFSoptaZPCSvXHUwMDA0REa49lslLWnul210ozeQmVxuXGJDO/ZPcFxuhtf/O5uAYMLjtCl/bLfI/NJZ5965obn8571M6E912E9cdTAwMWY1z1x1MDAwYuWYOfdJL9uiXGL/L46wM2BVrsT961dqUVxulUk3XG5oXFycXHUwMDA3s/fzXHUwMDAwMev2ov3bXHUwMDE3XCJYaaaVTUgs811cdTAwMDU1eVx1MDAwMiRcdTAwMDFOuWz3QLp//36LWZbiXHUwMDFjYkRcXIrygXy9WqtERHjQTLZcdTAwMDdL/vS3XHUwMDAwqrGCXHUwMDE0cJrkgvn5TdayglPqZXjoK7869fzCjOWE8Tt721x1MDAwMrDwuu/xqS/mk1x1MDAwN5Xcc54jfCfROiwyV+dYXHUwMDA1mU/bcPTV84/xN/fPUV+2XHUwMDFmzF644mJjU8vNoGwqZ1x1MDAxOPbCT8BTylx0hyFcdTAwMDZm98SMcZskboqaoI811FBcdTAwMDfT8PIkb47c1cxsxzdrhqtcbjtGP27f/KKKXHUwMDAw5pWhJeh9ptjMq1xuQL/6Ya1e1qk+XHUwMDAx8yEzrfqaSE/0YYaTzsOaqVx1MDAwM+xcblxmSZ76/esodF9QuDGf4Vx1MDAxML+e4EVpv0dmXHUwMDExrJSrplx1MDAxOL6P1+pcZtnEqiCHcitcdTAwMGWCjXZcdTAwMDL6zMKM9bK57sU3ljqprJ853m9cdTAwMWa7+31cdTAwMDT9Pi4qy1x06IhRQSzK+EomM0BW7EkgviW1XHUwMDEyXHUwMDA3e1x0UpJEft8xdq5PWuCnPdu0ztpruMlUdcxcdTAwMWGJXHUwMDFm/ujTcivZzGrh6zxcdTAwMWbVXHUwMDEwMbthWdWd6Hn1XHUwMDFkVnyOvFPWpIOaoI1P+t/sXHUwMDFlO0yD0/WpI1x1MDAwN32nKcBS8o/w936n4mLTPYH7SZFcdTAwMDBj/VXHiZ30kdZaw+RsfUaMx/xf3f5cbtheKP5uuZV51sq2WeGuciX1WFlcdTAwMTVL37B5gWFuNUf22o+dY1x1MDAxYWBcdTAwMTUzrr+yXHUwMDFmvYhKidJndlBcZjVcdTAwMTX+5Vx1MDAwMmmwXalrWthPSWyVXHLd2aqNuVx1MDAwYmXEKO1v/Fx1MDAxZFx1MDAwMXcudVLQlP+vrPPocVx1MDAxNuq29Pz+iqtvSkvk1DNyMNnkXHUwMDE5OWNyku5/b+ptqSdtqVx1MDAwNlZhbO2z91rrqTJcdTAwMDfe11x1MDAxODpg118rXHUwMDFlxLDErPcvMsStXHUwMDE5qY9710R67Vx1MDAwM/Xvu2wpp36FWHkhqcrGf/eOwNfProws0Yb04vbHKPBCfCrQ8lKTYD99NrAx8PVQ5opII1JcdTAwMDeWQzjWaaxcdTAwMTfmP1xi7UVlXGZcdTAwMTLhXHUwMDE07iRI45fe1Z9cdTAwMThUyTVcdTAwMTRwYPiagY5cdTAwMWRVg207r51w6T1nmzRb115kerBBXHUwMDEzYlllkDn1b1x1MDAwZle0Rlx1MDAxMiswf/ePbWOQMilcdTAwMWRTf7tOV1x1MDAxY7BcdTAwMGIqdEzlZXGoNP7xaVnJ12w71KT4wPkynVwi1Fx1MDAxYr7id/hw3Farc5pvxYLt20soTZhxXHUwMDE0XHUwMDBi8XmUgYJuRVx1MDAxY6NTNlZQXG6hylx1MDAxZcFcbparUlx1MDAwMJhcIoqefvNcdTAwMWTMwUGLOEJcdTAwMTVcdTAwMDS2j1hAJs68XGY4albSmFx1MDAwMlxuy32NUbRcdTAwMWKXi4iB7WXmYmtEeaJrorPwwpBef1x1MDAxNadTXHUwMDFmfeomVtjyPu+0n/xcYsJjZjvmMVx1MDAxNvQwI7VcdFx1MDAwNtRN6IXvlTWiomtViKmajLx2b1x1MDAwZZfwWm4jm0ersq3LPVx0v3P4XWVfgcPiMmia0qGc1ZngzCtcdTAwMTVTUfhcdTAwMGK2NiThIfP7wVx1MDAxZdrqbaLoeqxcdTAwMTmxeXlC/bwwokM7kuBrXWc3wFx1MDAxMFx1MDAxYaH+nOidsDdcdTAwMDQmm0ZIfWfK/KhcdTAwMTKjXHUwMDAy131cZjpUyP5cdTAwMDRYv1mCiVx1MDAxOVxylGurUIBcdTAwMDCSnN6Cq4fYmJGxTq1Hmqlnj1x1MDAxYiXQX7dgxOWOXHUwMDFir1xigVx1MDAxYeoynILeMlx1MDAxNT13XmtIs61cdTAwMDG8XHUwMDExXHUwMDA286NcdTAwMWRcXHNbUa9cdTAwMTdaxlx1MDAxNIFPpyBcdTAwMWOa11x1MDAxYm1yVVs41G6nISpLV/NvhzvjjXegXHUwMDBllIaNt1x1MDAxOHIySJqa/cq01XxvwvEmnGO7hjXyiqdKl4Wkh/LlQ71jlzogM0m5XHUwMDE5ppxnXHUwMDAy3UF5xZ3gXFyS01xiQoOkXHUwMDA0fDJYglx1MDAxZMxaccHi5CWy4L3XNDeQs6lj4ytcdTAwMWUm7qP5QVx1MDAxNVx1MDAxNdsqc+rwUEbcj09McZuSZ2NvxL/3i/W1iv1hgMSlpFx1MDAwMfInXHUwMDBmRFxiXHUwMDFio6BAuURo6Vx1MDAwMSTyZu19dV/3OEjPjK5cdTAwMDG2Wv/EwDaF5TuDXHUwMDBiQembXHUwMDA32J5j9bCGSWiGw9D5zIpD+NTfXvBi6lxco03If9eK6r49XHUwMDE0UcBcdTAwMTl1dUd2LNyUXHUwMDA1bmO4Z7JcdTAwMTj4r6WN+1B8pZiVhZUxvn5cdTAwMGX7d65cdTAwMDS6sVx1MDAxNIHNhtFJ+X3Vrc36+VXrUspcdTAwMGVcdTAwMGJcdTAwMGLhVTlN89NcdTAwMTXu85BcdTAwMTFcdTAwMGa29Vx1MDAxYTGWr9p+4Nu24Pks/6GrWEl2ol/faMFyLPe1XHUwMDA270LHXGbJh+LmuOBL7MSyL69cdTAwMGKAQFpQYFNcZj1AzDtG91evgVFcdTAwMTJRq4DOTlx1MDAwMTW5meJeXHUwMDA3qlZcdTAwMGW/WnRotJAyXHUwMDA1k2SA6Fx1MDAxZICsPSA6XHUwMDE01cBcdTAwMTLbc2fBcy3fXHUwMDExNNUvP2wqXHUwMDFk9lxcSEZi4kFcdTAwMTBcdTAwMDJHylx1MDAwMONcdTAwMTKrXHUwMDE5PZbOwKRO95OVykVbSlx1MDAwMJU916hShpfETPjxi2hcbmdccneUXGJHVTtxLd+SkHAl5zNzYlx1MDAxOcjohW9AizTqkyxcdTAwMDbhWlsl0Fx1MDAxOCn8zKUsMZvEqCXLM4aLyemAspNTeIdfuVx1MDAwMX+TrEORpl9ccnmkXHUwMDA2aFxuXHUwMDExLFx1MDAxNlx1MDAwZZp3Yp623lx0XHUwMDBi2Vx1MDAwNjb+UPW1hUEq9+JcdTAwMDVcdTAwMWIqv7jfLef8gjy1I1x0M6dcdTAwMWRcdTAwMWZcdTAwMWWYPTyahMVGRW1cdTAwMTJUXHUwMDFlXHUwMDBlXHUwMDAziOzC+Ftl7th+6PxcdTAwMTVAqupcYiZ/S57wLMB8XunwlaiG1zb7rGHDmsPaOW2CXHUwMDFi7stcdTAwMDb7XHUwMDFjnkRjhpx5mFxuUkLluZq14+1cYtxcdTAwMDFzQVvTXG5zXHUwMDE3XHUwMDE564oqrnhcdTAwMDBcZprV61x1MDAwZUrSdWpaTdqmzVx1MDAwNMk291x1MDAwZU+phG+21PC2XFzlXHUwMDA25alcdTAwMGVSKEFcdTAwMWJ7kZ2gtNwzN4KM2KPOjOgqW2xcdTAwMWRmI+3U0SXUXHUwMDBlNoxfzO2Vy+BcZtvF2r3QeVx1MDAxOPhcdTAwMTCBk6RcdTAwMTaC7E3VXHUwMDA1w62hWOJjuFJwSI4wMDUsrOCMjoVn5cHmXHUwMDA30GfxidYtXHUwMDEw7YxrLUdcdTAwMDbi+zrMTzAqlqrqTMiv2lS0slx1MDAwYpksIS9/WFx1MDAwNlux3lxcklx1MDAxYs2y2c6snufGXHUwMDA2KEJcdTAwMWEjXWZhQWLi6fOHOmhCLtCtgqlcdTAwMTalaE1cdTAwMWadRzz4zVx1MDAwZlmJUFxuazDvta8xWT6qfUz6V9KiL4qzilRtSd1cdTAwMTJyfMJzl1x1MDAxZDzoVlf3me3qMN0x4Vx1MDAwM9evcEmu3vk8vdKEKofshu5qXHUwMDBmXSRaYMr1WYS13z/aT5V6f1x1MDAwNc4kedPzb9ltteXZ1MHbzaut6oPhz6dcdTAwMTXLMfGGJlx1MDAxYkuv34jegJ5mMOnrJHZ5PFx1MDAxMWJsIKH9PvI3nKkx7sjT34MoXHUwMDE3XHUwMDAxp31V5Ju4spLjaHVcdTAwMWVVX+1NVE/uT1e3XHUwMDFiWfOOor6UxSnY/Fx0ICEttVxi+NJS/1x1MDAxMlx1MDAxMHRcdTAwMDXsj+lcdTAwMGKRcVlcdTAwMGaG4ztru3mAjmhjUca8iy52vElcdTAwMTeYXHUwMDEw+Innt0yQ4CnSmU04Y+pozDpcdTAwMDYsMMg4OuBDsNo0SWoqhS3kbcssr1x1MDAwZfHcSSjawDZy0JrjgeROS1WK3HmFifFcdTAwMTO6xFx1MDAxZGad+IRhtlx1MDAwZjNcIjPZrVx1MDAxYr7RXHUwMDFlMsS1n52qx7pcdTAwMDQu8zGLXHUwMDE3XGZcdTAwMWRcdTAwMDFIyPjjpqFcdTAwMDSK6y5cbiRShvQ5tyYhJblcdTAwMDex0Vx1MDAxYVx1MDAxOFxmuVx1MDAwZSR92HZcdTAwMDZcdTAwMGLQN1x1MDAxZVxinWXag1ZcXMz/nYU35Fx02fTDOuA6XHUwMDEwi2dcdTAwMTZcdTAwMWGHXpjfMSziPXRxavfbzD3SVFx1MDAwNKafOliMMPi7s4LHXHUwMDBirLnC4O9s9bzpJ3dJXHUwMDE2aEc99kUy0TVrx2uyXHUwMDExIYpcdTAwMTNdLnROQ1x1MDAxOZDDel/E7zn2X4x4X1xuytiauIrfT1x1MDAxZfC0XGJA5eipVVx1MDAwZVx1MDAxYbH8+Ps6J4Pp9jiuxVx1MDAxNfDm/1pbKDn5zIqrXGaVn1x1MDAxY75cdTAwMWM2656rlOGrXHUwMDBlteKUvuvccUtB7kYkRVqKXHUwMDE2+1x1MDAxNlPKolx1MDAxOcDb5T2Y1jyLQpKHXHUwMDAxO0GAIVx1MDAxNZK9ajjs6r2oKC6v0Ca1x2ylWe58WXyyXHUwMDEwRDIt+HFkY8TsSFx1MDAxZYArI5L62tSCcVx1MDAwMSXi+u3L2a378UOs05D9m8hjf9ZAR0/pXHUwMDFmmOdne2VKUSrU9kCPc+nZRVx1MDAwZlx1MDAxMyffSlx1MDAxMJPeuFx1MDAwZXxcdTAwMWKP77hYTp3O8FxiTVx1MDAxZaSn5P6h4/W6dVx1MDAxOCh/4CtH889xra+0P3D8pVx1MDAwMvtcdTAwMDF3qZqAolx1MDAxY4qeV/Rbu6C98btMXHUwMDAxmFxiOz5PkOh16GxT3thTXHUwMDAyh1x1MDAwMvAoj7Yluu16/KKUu8Y4K3MwKdNuIyVmi5XNok2HKFhcdTAwMDfNiWfKZ09j2lx1MDAxNPiDLVx1MDAxOYQxjG9/+G0knk998JIzW9eoXHUwMDEzl3rHP1x1MDAwMaBCp4WYXHUwMDFkqPSYmS/OVlx1MDAwMfbgb7Hf+Y/EneFcZmpcIiGmllx1MDAxMm2ohKCkm0J0XHUwMDA2aZX7orlqxnzlvyVcdTAwMWRL4/RApMLqc/kkwidyXHUwMDFkO/O7XHUwMDFm0LJcdTAwMWW/8yhEVny+XHUwMDFjXHUwMDAyXHUwMDFmMkA7QLpm0OFCrzb+9V2l1z3xeXWXcn1I0/rvNy5zXHUwMDEzXHUwMDBmrJv3wlx1MDAwNjlcdTAwMTPuZ1x1MDAxMMZcdTAwMWWNyFcyZUauZNuihOiT7yQ3JFx1MDAwMFBcdTAwMTR43/aNXHUwMDFmLHDT3uM5oFx1MDAxOFx1MDAwMCZ2++MuIXuu8Vx1MDAwMOf8XFzMaqmsXHUwMDFmv9tSS99vqpM7qsVcdTAwMDX771Y7L9dGXtW6NFx1MDAxNWHfjIMwUJo3qKxzWVx1MDAwZvyJxNOTVc6n8avxqalLXG5cXI4tw9qqsdBKn0TOi9m3VS/mQKzOrsinOJJcZqdRsf7+l+wwu1x1MDAwMbZcdTAwMTh1YafM7K9cdTAwMGJsXHUwMDBlqZ/twjuMa2zZXHUwMDFhMuNV8EqgnoD9Y+BcdTAwMTKpP7DGYonkr2VcdTAwMWRxKzL7n1lcdTAwMTZ0715cdTAwMGLM51x1MDAxZbs3M2dcdTAwMTX8/fBx0GxEqXhXzy9KU0uN/lx0sqbGW42V1r+h4CxmrySb+3RcdTAwMDC9XHUwMDFhoOkg2Fx1MDAxM9xjgT9izde8J4Cc2LGSw2b6cU9cdTAwMTitgyD6ieH0o8dcdTAwMDNcdTAwMTnVXHUwMDA1dIf5eJ4sXHUwMDAyqVSBXn5cdTAwMDL33Vx1MDAwN4an2M83QIYoalx1MDAxOHaw/XVRSFRwLZ1ydOO8zazcam/JXHUwMDE1yoV73rjhuW1DXHUwMDE3XHUwMDFjwV1WY4FfxWvDPMzFXHUwMDE19fJKK3+CXHUwMDBlLJfF6LTjjvEuOk5omepyTsKvziHxkbuYflx1MDAxMVx1MDAxZUfpcVx1MDAxN+o0X1x1MDAwMPbjfZpwfFx1MDAwM2b2O6z6Xlx1MDAxZOg7w86BXGZcdTAwMWZcdTAwMWFf47hqhW/DXHUwMDA2drJ7n1/2rVNAMVwifW/1bZOAQ746csVnd9DegU2CuffFSY/1cehRdVx1MDAxYjAyXFzIi7k/XHUwMDAwgreK0LOm4ufcvL1Kw3b4d9z9gFx1MDAxOfjTdVx1MDAwZmtcdTAwMTj9pFuQxNzf5OpcdTAwMWK45YScfEpcdTAwMTGaXGaG+a5RIb9KeWjikFx1MDAxNNfiXHUwMDAyLMJ8N29cdTAwMWXX71x1MDAwN7ZftnPTPoBCXHUwMDA1dzjMybb45cJofFL5sFx1MDAwNK1cdTAwMGVcdTAwMWZcdTAwMTJhQck7OJ1cZkA0QoUgyW355uJtXHUwMDFkhaJd3lX1JorwarlJ51x1MDAxMTfQkvs9XHUwMDFmKLPFdCFfelZHz0Wa3yHIlkuztGBQQ7KXv28jgLZslumlMlx1MDAwYlZcdTAwMDY4x1x1MDAwMKYxbYdrWayM+1/cb1x1MDAxYYrJmGjecvXNN1x1MDAxML/YMqiUpPTdh0BXXHUwMDFjwav6XHUwMDE2+Ny5ZY20vDpl+jglXHUwMDBioFx1MDAwMZ431URcdTAwMTlonF1kXHUwMDFmkVxy+bu69PWJ/lx0e9a6XHUwMDAxbVwiXGZcdTAwMWRcdTAwMTVcdTAwMTevXHUwMDEyXHUwMDE0oHpcdTAwMDM/eOru7WM2XCJixlx1MDAxYlasqqBfJHvPT1x1MDAxZN9ayVx1MDAwZty0OVx1MDAxY/KRMCFeXHUwMDEx0GCI+/uip0e9vdUkXHS9lVx1MDAwM3L7v8r31fGRRUhFXGaq1Y1SciqWdJJcYko24sHBhVx1MDAwN2Mpqlx1MDAwNsj5Ojcz2KEuMfpcdTAwMTPWeqLVfvw8lFxcY36QXFysXHUwMDExS0bwpdBuSDSDXHUwMDFkmWFcdTAwMDQ8TZFtctCrrycodVx1MDAwNpmpPrhGXHUwMDFizDK2cNixxOPJ+YCi3U0tkYaLOFx1MDAxMrxcdTAwMTBcdTAwMDXK7txcdTAwMTGNXHUwMDEx7JRcdTAwMTZlfCnlmdom4i1dUJrMNr+cv8hbdFZcdTAwMWRcdTAwMGbhdlnL50RpUJKRL4Vx2v0z1Y/Nh9tcbsab8rTQ9HYtMlx1MDAwNDJYcLaZb+mAXHUwMDBlXHUwMDExloytx3fVXHUwMDFju/PNviHXS7HWmD7Qj6Syed/NfaCpsfDbXHRiKjyt1ZdcdTAwMTneNb8zSTfsb6O8OeVn9CjTOClH7IBRp1IxZmXIQz9cdTAwMTmlnjLtXHUwMDEx4PthLKLnu8F1vNQnwG9GXFyS2twswEqvbnX5nuebx+BcdFxcKOrrIUK5KrGr4S6ydiqgoLnkyVx1MDAwNitcdTAwMWZcdLffX+vsXHUwMDE5XHUwMDA1qVx1MDAxZVVQRJVcckheq3ZYXHUwMDA23ixBpcRnfS1ccttcIlx1MDAxZC4m3yPG6DkgQf7YRHjGOWGXsFx1MDAwZYdyVD5jXHUwMDA3cV3VR3t/5YniXHUwMDAyM5P9XGYtU3Ql+yrsXCJ0QvfpcfnWOXNcdTAwMDbxVlx1MDAwNUg+XHUwMDE0oKjr0viMmJFm/947Q2CS85hk0ZNxRKeXXHUwMDFiS7RQXlZn9Vx1MDAxNKasUjXTs3cgo/jJkY3pmPtcdTAwMTZQZTn4J1xyd60wIG6HrONcdTAwMGVLTEmwnPagf/gxy+7036b3iVx1MDAxOehcdTAwMDfUh8ypOlx1MDAxYz2HjDUzxHJxU2MtbTnn824oyEIvXHT4XHUwMDExd7/6XHUwMDE1MYb2slx1MDAwYlxcXHUwMDEzVVx1MDAwYp83XHUwMDA3XHUwMDA1XHUwMDBm6VRcdTAwMWb6+4zBaOGsXzy3f44vVCx4Rm1cdMGA5Fx1MDAwN3b/1aL9q8WeJu14gdM4T5f8zrqmgUd7vfmyXGJcdTAwMDNUM9ld+MBe50a+aDTW5l+ITOFcdTAwMTjNTIpcdTAwMWF83JdT14/zeaWSXHUwMDEy7E2Q97lcdTAwMTUknySW9nid7J6KWVx1MDAxNzdcdTAwMTlgUFDrvaw1QOrVY1x1MDAwZlx1MDAxMm9cdTAwMTJcdTAwMTR2XHUwMDA2jjHGkVtbXHUwMDAwNMZSU28rUJ5JpzQvcMHUsOGSgaVdLey5XHUwMDAw9stcdTAwMDRb9D5cdTAwMTFIzop+XHUwMDE3WmBitPCVpFx1MDAxNtiS3Vx1MDAxYmjDye9gIKSC3vhcdTAwMDAw6bdhoonshv9bXHUwMDEzdKTPm3JcdTAwMWLY2TdII9Zibj3JoJF52lx1MDAxNF5cdTAwMDUmKCFB8Ogz/ljetTGSpdUt8nFu9muHxlacPlNcdTAwMTJQhFFcdTAwMDBla5ea2ddcdTAwMDd9I9iupi9cdTAwMDVcdTAwMTFt+dO/nFx1MDAxZU9L1Vx1MDAwYprUmlnFk/M3/Fx1MDAxY2DAYVxmXHUwMDA360l7WeP42Y85pN6IX1xiWrYoXHRHxdPIvC9BZorRREU3tDxNSTcupuS5Ku5DomVcdTAwMGI23luyXHUwMDA0Mk/uh05cdTAwMTVFVH6zP9d+JGNCL9RF8JqfP5XDz5SaReBsKlx1MDAwZlxistLf/Vgh5NvbrFjcmYVcdTAwMGY7WbTEU4dVXCJRXHUwMDEzXHTGn5zd8ezBZuavbZpcdTAwMWRDT6dlaEn07zGva6plKVx1MDAwMXxZXHUwMDE41Fxc8+13XHUwMDE5bCbiXHUwMDA3LFiDiFx1MDAwYo1J9S9cdTAwMGZm7OGBN7JXXie7U5OFgKD8eY3lPV2oia1tkur+t0FZp4DpZ1x1MDAwNlx1MDAwM3cxXHUwMDA2uoHLY7z02OGl/MHeJp9exjMpXHUwMDA2u465y1VcdTAwMWHtWdDn4eytvFx1MDAxZPY74PJ/u7O6XHUwMDE02HzGSjlcdTAwMDRcdTAwMDWTsriys65631dK8aeSa/t8kTawXFz/KC3kpfX7XGLxOVx1MDAxOPr4RU2mXG5cdTAwMTOVPyxcdTAwMWar+O1dmdrg+HedPkP7xFx1MDAxNFDCxVx1MDAxMn/UVf8sgELETvJDXHSX6pgv13Guk8FcdTAwMTXE+4Anv6g0dKmBpcx9/tWr/a7DSlJDcFKTSVxypeC+nGHenUnPZELLmNX9hlx1MDAxNFx1MDAxNlx1MDAwMZNcdTAwMGY7g/qGUKX+lL/eLyBhMV9DtG2vTmDuJF6Mh7HkXGb9qTjuy8yKVFxiWf1HlsOXxptcdTAwMDRcXFx1MDAxY1NcdDcmw5E3O25cdTAwMWVviujAloFFsKJmifKfl4zX4nCezdnuXHUwMDE39kP4jFxiXHUwMDFhgnksI+cz3kAuXHUwMDFiXHUwMDEzveCpXHUwMDEwyivePJ/9N/XDXHUwMDBlXHUwMDBmdXrQhVp5Y5BxeHO9SJjKeZVRzKfeje3DwlL6ibtasKDDMMpcXMzQQD5ZIV1Wl+i+2M6lwvXs8Vxm7tnt06Nhw2ZRT7KTcfD7MalcdTAwMDYgM1d+4neBNUJrXHUwMDEw6rSZMMNcdTAwMDeZgTZk2YrlpLsluolUXHUwMDBlk0f11Fx07LlQzeCnSUqa5Vx1MDAxNCdn5vzoXHUwMDE2lsdd+byo/spcdTAwMDRcdTAwMDeoXFxcdTAwMTcsXHUwMDFjV07G0uZcdTAwMTg4ReCEu84zfdtcdTAwMDahhYiCo9dcdTAwMDZcdTAwMTL14tyfMcqC2chklLnY+XDAc9bLb3Fs5DP8/X1cdTAwMWHNwVx1MDAxMLo365tTr4yXadY5XHUwMDExZlx1MDAwZlcmXHUwMDFl/KNRKTO+8U9cYm31XHUwMDAwK7jiXjYpzzT/XHUwMDE13Fx1MDAxN1widpE4LHpcdTAwMTksXHUwMDEzkXxcdTAwMDRcdTAwMWSDKjbh7+88m6BcdTAwMTBY0P00keuamHJx6q+b1cVcdTAwMDRVXHJcdTAwMDelRHCgXGZcdTAwMDP56lx1MDAxZjdJ8eW6Q9ZcZkjpNPxcdTAwMDZcdTAwMWN+WitmKb7BhplcdTAwMGVNXHUwMDEw3yHmcbbUacu3XHUwMDE5hkUm1Vx1MDAxMURcdTAwMGZCklx1MDAxNliPWD94hm70VGxBhDaspVx1MDAxN+VcdTAwMDOSZXHbaE6Rxz3uXHUwMDAwWVx1MDAxZD7x1fE5j9mLT4dcdTAwMTK2MtHr3cOXY1x1MDAxMNvfMVx1MDAwNCHTJT6Kl8RcdTAwMTnQN3U1XHUwMDE1a1erN1x1MDAxY+9cdTAwMWVcdTAwMTeq3Vx1MDAwNt/n9Et97DCfIVx1MDAxNv81z9RcdTAwMTdBr0dt0WeOrVZ59XLPfa2Ak/GUSiq/XHUwMDBlylx1MDAxYVx1MDAwYoJcdTAwMDBcckJcdTAwMWKPf8PI4VxmXHUwMDE4XHUwMDEx/cw9TSlVsTrlgCxhavTLeZvHXHUwMDBmVsjv4uZhq4vVfpWgmVVvY2yQgquy4NF0aa1cdTAwMDFUmzxcdTAwMWaP+1PnuTx3dUqPR57aOpcuqnzgcV+jPu5cIvP1XHUwMDAzNkApXHUwMDFmXzbrQ/5tMbt1XHT2sdFpLN+SNXQ9bYBUXHUwMDA1M2xipHR9T4GYMXi6bapcdTAwMWbNn5qF6N3+YNlGWI15XTBYO5w5XVx1MDAwM0bp6/WcgHSd5Vo94lx1MDAxMIv07/qien6hubhcdTAwMGbAQ8lcXDkqjlx1MDAxMyVDXHUwMDAx3VrNXFxmeTV9tY82SVf2kFx1MDAxM5Fncl5cdTAwMWTN+c/AiVnxXHUwMDEzsiRcdTAwMDBws+IsznZwMljv2kzTPc3Sr3b2IbPzik6ENd8m1IbKbXG0p05cdTAwMTlw1Vt1pJr0QP1zzD6TXHUwMDFikmu35/eXw6HB+aKFnIhL6PZ4svXbTMBcdTAwMGWWbFx1MDAwMuWpXHUwMDE2blhh1Vx1MDAxNpqvt1jdbMJUnTI0/nfw5flcblx0Xr9cdTAwMTV1v4SF59j0LFx1MDAxZFx1MDAxZpk4lFxy5TNcdTAwMGLeWt3IKdufv1tQ6/zuLJz62Fx1MDAxM/hUx4R3cffU7/m4f+er7ue10/JNOlwi5Nnr+XPn9zPXg/+KUFxi0TlcdTAwMDJme/hpY0jSQ9BcdTAwMWNccji9ik96upVzqlx1MDAwMsNNaOK17VHnYrBcIiowfoe1kiXatz8ql89cXOjEq0XPILhcdTAwMGXeIWzklm+95Vx1MDAxYUDi95jJ2JJmRuPQOVZcdTAwMWTImD1bXHUwMDBloFmU+s1CMVx1MDAwNSOUpGj9ZdfaT/yZ89NPXG6ZP12HkvnwrphcdTAwMTLK/KdcdTAwMTFcdTAwMTO4nT8uTl7us1x1MDAxYuayY8shyJ+lO8lcdTAwMWS44UcyXHUwMDE2XHUwMDFitVx1MDAxYVx1MDAwMk62cKHouWmSg2bVP5/tyJtcZrNcdTAwMDKTMYyHlHVDcd2BopclQTRcdTAwMDE+cbvm38DePlxcTbSVrFx1MDAwMzowOj+X6H9cdTAwMTlfmFx1MDAwNHJcdTAwMWXCQEFDzkBLXHUwMDA0KYmKc9hPXHUwMDE4xmU3MiZL46lKJmVh2CVTuZRu3Phqovvi7e7HfO34oGyOQ1x1MDAxZKN/ayeyqTcwlCtcdTAwMWTKXHUwMDE3u1x1MDAxMuZkx/eov1tBxyrZyqx941x1MDAxNq4u4URcdTAwMTL+udapTKNvo2NtXHUwMDFiYM2o32lrKozYV01cdTAwMWP79TNilIuVTILHzdBbV8rDXHUwMDBixtuQuaz417u/Qcqq9mdcdTAwMThvXHUwMDE5f1x1MDAxNnNcdJish1x1MDAxMGrOqJlXXHUwMDA3019cdTAwMDLUKEPIZT6qXHUwMDAwM1uiVpRmZTX1YFx1MDAxYpVPXHUwMDA3dFx1MDAwYk6/XHUwMDA1wi5xKUNBjFxyMS6z/kQ3VH7PXHKVcT/WqM34RiE2Z8VcdTAwMDJ45XPjXHUwMDEwJnrL6FVq25Cg2ddcdTAwMDaMSJmqhiHwrrpHUK9cdJKpZmY+zfKQXCLJXHUwMDFhM/ArNP2rXG7YLid4RHGpXHUwMDFhSZe43KkzlaI/QV9cci54MsKh6jxZ3m5/alB93WRcdTAwMGZTzMNkXHUwMDFkwvBvmFx1MDAxOZFdv+7F4mQ35U98wzppx6Y1imG6e1x02VHS44M7+EhcdTAwMTW/okGHglx1MDAxY2zl9lx1MDAwMNzeKYWxZlx1MDAwYjl7giRJ0uBcdTAwMDNqxoIz8Vx1MDAwZvXwgsRcdTAwMTN0OXSUeXlcXDxcdTAwMWSUYOeqyVZ7YH6sZvubfnDcv7w2ypLPKlf0/Fx1MDAwNko+I2iUiDFcXPzMjYdoxlSCu35ry3p5fPdcdTAwMDO+UFx1MDAxYVx1MDAwNcN9oWrgPNq/XHUwMDA1OGBgt6695Fx1MDAwMj5cdTAwMTK6xqx2gjM6lN+ovmNCREz4zidcIrTytlx1MDAxZjHzNox3/lx1MDAwZr6qV0Bs56tcdTAwMDTN16X868VZPTlF3aeq5UPgYOi0i1x1MDAxNeAnXXBP4I1cbi5cdErLg9/J7nk4TVHek9DXv0yPvpLLm7Gin0DwLIg3IIgzeum6kjLfs+m+XHUwMDFi26GWMb6E7X9cdTAwMDaC4qJv63Jh+vZ7UfM6rST48S5cXJwyTddcYvzMSshXS7tcdTAwMWVHbVx1MDAxYvy7VFx1MDAwMJuw+Vx1MDAxY/xV+aTwOlx1MDAwMqtGc67NS/Mt2bxcIkHc9sPG8INcdTAwMWZa5lOjx9BcdTAwMWQk+cBMtYxcZpG0iVx1MDAxMPA2yK3o+s/qvsMmeFxy/NM3XHUwMDAwZLDZ6EZ94NjMWUVI5nlcdTAwMDWvI1FcdTAwMTbEeVx1MDAwNCBcdTAwMGJIXHUwMDFm84XV8SNcdTAwMTjVp8ptXHLZk1xmn/xPXHUwMDFmc+vrK+tcdTAwMWRcdTAwMGU9/PB1KVx1MDAwMspcZqHLiD8l5/a69Zjc9rc3ka9Oq1x1MDAxN1x1MDAwNrH9rGNqXHUwMDEwaeXWXHUwMDE2VXKZOLRQWO0xOaQ5g7CZ/YlcdTAwMDXSNeTzXHUwMDA1lfJzKaU4ckY1YqRXMGCdikqqPZxcdTAwMTa3YplMWm4wffc2XHUwMDBlolx1MDAwNrT/XHUwMDA17C9jUVx1MDAxZoEhc1WBPF5cdTAwMTJrXHUwMDE5M/fPaXq87bOWV1SDL+iVUamxSLog85RcdTAwMDW+XHUwMDFjTIzJl1/xbtToyYFI5Wlk3kAhy9g3cNKhXHUwMDE0+Xvd4GZoVlbaRN00pS6HukVaXHUwMDEySe2d/jyoYoXCXsmKf4SAjYJpxdbFgF1cdTAwMDLR1Vx1MDAxZHuzKDMmX1pcZj5TiMOm4lYlg1VW6qaWRWY3n32/XCJcdTAwMWTfdrajMFbINZ8thUhcdTAwMDW2MqlcdTAwMDazVOE2ff0nXGbzUKp2KzrYRmCpxryyPjQ0mGExXHUwMDAxXHUwMDEwyeHsQKo+6GVcdTAwMDXOXHUwMDA2s39RTnRjxLib6C0/U8eX5oaI7oOe9JdNODNcdTAwMTLfcNm9LeH4XHUwMDE2NDGKrlx1MDAxN9NcdTAwMWTJpL5a2sI/amdpPlx1MDAwMJTcySFUXCIoMZsyXWojzUXv/lMs2dskXUOuuvec7u1cdTAwMGXpO9fMUEdcdTAwMDRnVZb8RldcdTAwMTZDXHUwMDA3XHUwMDE16KI3aEtcdTAwMTVcdTAwMWRcdTAwMTB8MLdSs9dsM1x0XGJcdTAwMWEvVVx1MDAxZDG1XmV/XHUwMDFijF9cdTAwMDR52cdvYlx1MDAwZebvIfSi2313e+C4//yv//rvf4//vFx1MDAxNUm2XCL/z//+b5jEYZRCcFx1MDAwNMVI5P/9vk/WzSm2pSmO//+of1x1MDAwN/3Pf/39/M//XHUwMDAxXHUwMDAxXHUwMDFiLlx1MDAwMiJ9KafkaClientKafkaBrokerKafkaBrokerKroxyliciousKafka ClusterVirtual Cluster AKafkaClientVirtual Cluster B \ No newline at end of file diff --git a/documentation/0.20.0/html/images/cluster_topology_one_to_one.svg b/documentation/0.20.0/html/images/cluster_topology_one_to_one.svg new file mode 100644 index 0000000..a7730d8 --- /dev/null +++ b/documentation/0.20.0/html/images/cluster_topology_one_to_one.svg @@ -0,0 +1,4 @@ + + +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nOy717LcWJYl+F5fkVx1MDAxNv3olYRWNdZcdTAwMGbQgMOh3KFn2sqgtXBcdTAwMDBcdTAwMGXV1v8+uIxIiiBcdTAwMTnJiGRl5kyl04y8hPKNc/baa619zv3f//anP/0070P603/86ad0i8OmTMZw/enf344v6TiVfXeegt//f+pfY/z+ymKeh+k/XHUwMDAw4ONcdTAwMWTv4r79+a60Sdu0m6fzuv/7/P+f/vS/3/99nimTt3tcdTAwMWZ3U21bQeZzfm2Qx5+74KlcdTAwMWPvb31/0V+CXHUwMDE503hcdTAwMGW7vEk/ntrO41x1MDAxOIa/I0lcYlx1MDAwMlx1MDAxMVxmwnBcdTAwMTj7cHI/T1wiKPZcdTAwMGWmXGJcdTAwMTKGQFx1MDAxNKVgiPpwdi2TuTivgCDoXHUwMDFkgVx1MDAxMiBcdTAwMDFcItAnN1x1MDAxN2mZXHUwMDE383meQN9hIInjOHXeTlx1MDAxMlx1MDAxZq/4OZT/+Fx1MDAxM/jhyDSPfZ2yfdOPb/H+XHUwMDBmKH378zHaKIzrfOxfXfLhmnlcZrtpXGLHc3g+XpeVTfOY9/dPP4f4XHUwMDFjzp9+9Vx1MDAxZO4vwcO/Ov6tu84vzYsund6mXHUwMDAw+nC0XHUwMDFmwric34ZcdFx1MDAwMj++xVuEg5y8n63/9TGmMWxT+W26ulfTfDhcXHZJ+jZcdD9FcPfZ13XJL1/3l7n+OJHIL0f+z8fg0/TtySSKYlx1MDAxOHhO1odcdTAwMTNcdTAwMWbzXHKHvziq9d373ENcYoJCXHUwMDEwmPo4t+XEnTk3v39oXHUwMDE2NlP6cVxu3lwi43+dj5/m5GcpN6fbx3n5JGPF+oVkI4SCfkDuxq1D5c57/vThuv/z719/7M83S8VcdTAwMTiTXHUwMDEzXHUwMDA13i1OXHUwMDAx8/x4PJ1cdTAwMDfy+bf85fvDcezXT577y09cdTAwMWan5TUk4c/vXHRcdTAwMTFcdTAwMTiEkFxihoBcYoh+ON+UXf3rOWv6uP44NP/2ScC/wuXX3/JcdTAwMGJcXH42SD9DksTenVHgOIpDXHUwMDEwXHTh6OeYxIh3XHUwMDE4XHUwMDA2Q1x1MDAxOIqhXHUwMDEweGL2XHUwMDBiTGLoO5KiKJSEYFx1MDAxMIKIT1D7XHUwMDAxllx1MDAxOPgvIH5cdTAwMGKI4teR+Nn1v0BcdTAwMGWi0HM6MFxi/Fx1MDAxYebO2ftcdTAwMTbmIILCQJxcIlHkj4DuR+bvx3R8S8NzXHUwMDAwlDCrw/+nY5vy87nsu/lRXHUwMDFlb8HD4GdHhbAtm7fBxz57XHUwMDE23ZT52yj8XHUwMDE0n89Jx58+XHUwMDFkirk8We7DXHUwMDA1bZkkn7JSfD40LLt0lL+H3vqxzMsubKxP4//Tr8NcdTAwMGZfc39Pp59fYFx1MDAxZV/pp0OUSn+BXHUwMDA19Fx1MDAwZcZ+XHUwMDAz0TQxjPFVw8a7zpWDwVx1MDAwN1x1MDAxY3R/fDfTXHUwMDEyJy5hXHUwMDE4RyGcwlBcdTAwMWMmPs792+jBKPxcdTAwMGUmXGJcdTAwMDKkKFx1MDAxY6SQT5jyL7CGXHTwXHUwMDFkXHUwMDA1nmmDkeBZ5r9KtzBcdTAwMDG/e6vlXGJcdTAwMDFcdTAwMTMojlBcdTAwMWZT4V8w/1x1MDAxY+b938y3MITiJFxiY59cZvInhIsjvz76XHUwMDE38Fx1MDAxM1x1MDAwNIyd2Ic/vtnfTLh/MzP+JuNaZTBy/ylkxMaMTl2JoFx1MDAwNSrjXHUwMDBmY1xc8qyeP4hxXHRi+LPz51x1MDAxMnO1hVWM/SCOQNO+XHUwMDFin1x1MDAxMEhh71xiXG6m8E916nvKhdB3J+RwmDpcdTAwMTGFfSZ0v66DQVx1MDAxMES+XHUwMDA0J1x0vkNP+Fx1MDAxMzCCI/CJX+pf4PxcdTAwMDY4h79cdTAwMTmcXHUwMDE4XHUwMDA1Y1x1MDAwNHLKp69gXHUwMDEzw4lvXHUwMDEyM4yAJIYj6N9RXHJftS4li6JcdTAwMWGT1MSJtiVLz+x+J4beKOPHYOjr0XyHaj1cdTAwMTFAvYMg/MTHyT5vQPhcdTAwMWNDMPVcdTAwMGVGKFx1MDAwMsIwXHUwMDAy/0yU/lx1MDAwNUI49lx1MDAwZXyTracyOl+JQsgvXHUwMDExhIEnXHUwMDBlP/lA/0LQt1x1MDAxMOR8v4qlQPysWPCXXHUwMDE28e2dvrSTf8FcbkadQEJcdTAwMTFcdTAwMWP7I1D5kdn8LVxyy7xNwvhcclxy+3lcIn2imf9cdTAwMWWa9q9cdTAwMTDV1zXtr1/nx2haqOqlknSk23Rv7ytVdivELb+HM4mTM9/70F/1jlCIfFx1MDAwN2JvOP65XHUwMDFhfMz0f3HmL9P8I1x1MDAxMY9wfzNnQlx1MDAxOIyTJEFAX1x1MDAxNbToXHUwMDE3VPqBNEmIPDFLUn/Izf4x0kxGU2+YSqVcdTAwMGazspPauo2UR/3DSPPr0XxcdTAwMTdpwtBJmihGkPDPSPhcdTAwMWNDXGLyXHUwMDBlJk+TgVIgjKBfc4X/Ys1cdTAwMWaIIf77SVx1MDAxMz6TXGJHMOxrWDnn4VtYOd09jp+z/Yf05X9v0vwrTPX3JM3fdtq/csOfXHUwMDAxXHUwMDFlJ+B3KPRGaVxiRFx1MDAxMOivRTJBvqMwkFx1MDAwNE+hfP6NQ1x1MDAxZk9/IE1cdTAwMTh5d7ItXHUwMDAyUihFnf98rbt7Rk9hXHUwMDEwXGbjXHUwMDA0RqCn3v6kzfgvxH+OeOl7WVx1MDAxM/4ma55TQMA4heKfZvYvlVx1MDAwMFx1MDAwMtFv6meUJJDTKX1iRv/RPeChL39Nylx1MDAxZn/608ecef+fXHUwMDBmP/+vf//q1d9O1LfPn7/M0Y9cdTAwMGb8grybcJrZvm3L+XxT4y3KL6ryXHUwMDFjjjNzTmzZ5Z/P3y/Lp9/TTH5fyOLX21xi/PmsdVx1MDAwNFx0gThCkVxigVx1MDAxMyfBflx1MDAxMv9PeTi8zeA7XHUwMDFjRKnTXHUwMDA3nVx1MDAxZpx461x1MDAwNX6RJGmX/PWosu1RkoKVN9tMgC/6YMD+mXwtKvBcdTAwMWSC4NBpoM/Ewc8vRjDii6BOPUFS0Hnm5Fx1MDAwNFx1MDAwMoZRXGL/MnPfXHUwMDA2i34rTkVcdTAwMWF+gY4z5E/P/bqKpU3Ur9/Xjovi9Tpoxkz063N/KCtcdTAwMWZcbvD3qFwi8jRcdTAwMDanoTjNXHUwMDAzeWpcIlxu+VWnXHUwMDFjw9+hp1x1MDAxZlx1MDAwMM+8eVt/+ZqxgM/Zo05bXHUwMDAyXHUwMDEzJFx1MDAwMn/qPT52yn/wUvT/yN5//j9eXHUwMDBmMfV3LH6h6Ila5EzCr0kg5Nt24Zw8XHUwMDE4okjsR2sglFwiqU+q6Vx1MDAxZtFAY7/tTVx1MDAxOZf9XHS3r0ug3yV5mjSbf0PwzP3wLbXzWdRfSJuvhvljpM3MXHUwMDA0WC1HL2q69606eWhcdTAwMGVHzJegLdsw/1UvgMLPekidSYHAp8ZcdTAwMDWhj3z4M2rhd1x1MDAxNEFiKIy+LX+cyvlcdTAwMGLYXCLUu7fbyNNccn1jN8k3r/irXHUwMDEw/qpk+fHSXHUwMDA2/dXxfyCUceZ3QPlklXNcXDHii0Wr9zn/XHUwMDA1wD+BMvqmVJE/0lx1MDAwM/wskC/AjFAgiv0hMJ/sNr9ny5+mcEmTz6bx51x1MDAxMftcdKPwJCVSmFx1MDAwNFx06Iz+zEYkQ1x1MDAxMTIjT0WCIFhKhDGCJSD2yTSfuE0/U0ZcdTAwMWam7fzxXHUwMDBiwVx1MDAxMo/98Eu4v4G1XHUwMDFhsjJcdTAwMDffXHUwMDBifYk6a1x1MDAxNk6+9lx1MDAxZO939N5cYuI0ZNjJb1/rXHUwMDFkwFx1MDAxOPqOOllcdTAwMTQ90UacXoOCv1x1MDAwMFx1MDAxY4yciMXO11x1MDAwN3FcdTAwMWNcdTAwMDVxXHUwMDE4/1x1MDAxMnGnsH2HXHUwMDEyXHUwMDEwREFvXHUwMDE3/HNt34K+XHUwMDA1tqR/04l/X7RcdH9z+1xyPSeCIDDka1x1MDAxOEQ/2bDza1xmntGfeUugP3w9+W9Y9/3333pu93wpkS7um8FcdTAwMGZcdTAwMTPYu5KJ+PdcdTAwMWa3nvzj2nqmxHCSV+romiVIXHUwMDFmOIhNYtJ3ceFpbKB3b41cdTAwMWVcdTAwMTh7M/KnlfhcZptcYoq+eSNcdTAwMTI8i1x1MDAwZYmRpyD6XHUwMDAym1x1MDAwNPJcdTAwMGUjT4n/825cdTAwMTCU+lxuNt9cdTAwMTbcUPytXHUwMDBiRZxeXG78pEH7z0KH/1RcYv09+7qQs65Sp/X7Ylx1MDAwN9fb5Fx1MDAxMV/0/P6CRVx1MDAxODz/IH9cZoq/TYd/vL/3XHUwMDFkdFxiRlSWQTGCQFxiXG6FcITHRPK2uTDGMDRcIrP4VHZcdTAwMTCcXHUwMDEy4H8xXHUwMDFkXHUwMDBlg8fvrtyT2vyfXHUwMDEzOokvMsfl7+yin0hAoNOLv3VXwc83TMI48rbMhIIwTJJcdTAwMTTxXHRMPvhFXHUwMDA0eneqgPMsdl6MXHUwMDEzn6yEfuJcdTAwMTd/1fwkvlx1MDAxZm3/ffwj/o1+2lc76OesoadNh79KeF9K0b+AjITeXG4rXHUwMDAy/pO20P/ENq9p/q9pof9X+cmvx/1jXGblb6uI3+qVUyT+XHUwMDBlQzCUolxi4q1cdTAwMDH3XHUwMDE5qlFcYn9HoafVRN+6YSSJfLlcdTAwMGaaIN/h0JvjXHUwMDA0T2V95tnXukDEm1x1MDAwMMZcdTAwMTCUPDVcdTAwMTSJY/Dv4ND/Xp3yTyvxXHUwMDFm7JSfJHJOXHUwMDA3/uW26PeC6dsuXHUwMDEzxkmIXCIw8Fx1MDAwZlx03P9cdTAwMTLA/9BG+TfT9O3zZYJ+fNxcdTAwMTc0+8Pa5N/dkP4z+Fx1MDAwZUIhXGJHwJN14bMyXHUwMDEzOPzJZX/pSJNcdTAwMDSEUSRcZuLnXHUwMDA155VfZsh3tcl/2y5/XHUwMDFl1VuDXGJG4FNcdTAwMTdcdTAwMTM4iX7ZuoeIt6BcYuiU31x1MDAwNPn2+0lfsWV/ny75b4/1X91UTuHvUFxmwiFcdTAwMTQhTlx1MDAwMVx1MDAwM//aZ4Bvu1x1MDAwMzBcdTAwMTTF34aC+orPOEfgNPhcdTAwMDRcdTAwMDViMPH5XHUwMDBlg098xttiXHKEwOAvXHUwMDFizz+WpX9cdTAwMTXJz4vk43uL5Ld3lZNcdTAwMTT8tknyKzWS/HKn+Ye9eMiJP1x1MDAwMvlj21xuPlx1MDAwNPf/mz3l0FktP+qBv6lcdTAwMDeAKcRcdTAwMTD0XHUwMDBiqtravK1k3b9YdP5cdTAwMWVTcnLWWddBnELPXHUwMDFhXHUwMDAzY7/6JS70XHJ1XHUwMDE4XHUwMDAyXHUwMDEyXHUwMDE4XHUwMDBln7z4XHUwMDE1XFye0MVcdTAwMTCKXHUwMDAyIVx1MDAwMkFOb4KiX1x1MDAwMvNfa1hfXHUwMDA1of39XHUwMDFlXHUwMDA0QdC3xXvki1xy4W9yXHUwMDA1/CbcIFx1MDAwMkXQs1j+cEVcdTAwMDJi1Cetoj9gQZxynF9h81dMyD+D6fhmpD/Gdvx2k/G3bVx1MDAwN/lcdTAwMGV+a+CdrPk2XHUwMDFmn69jnZP+XHUwMDBlXHUwMDAyidO6kiBK4Z/0gj7YXHUwMDBl4q3vToAghZ2EfIL7K4yKvMNwgkBPWYuc8lx1MDAwM/vXXHUwMDA2nW+C+Vx1MDAxYvvYf89cdTAwMDZcdTAwMWTibYVcbsa+YTu++UuaKPX2XHUwMDFiQVx1MDAwNPHDf0fzn8R2fCtN3z5//jJDPz7vXHUwMDBiXHUwMDAy/t2+49dK+lx1MDAwN2p/8N1ZRUlcdTAwMTiHT72KkDj5cVx1MDAxZsJH7Y+/bcHDYFxugU/jhaLUP0z7a1x1MDAxZKKqc4RcXLvuofwnMjNmVG3fuY9cdTAwMTB6d9YnXGImwLNUfdJcdTAwMGJ731x1MDAxYlx1MDAwMZF34CksYFx1MDAxMoFA7NPq8q9dhL9cdTAwMWP9sUXK/Vx1MDAwMb2R00JcdTAwMTPo13RcYvRphL9cdTAwMTZcItRp/jCQ+GO/r/ZbReotr/7xRepcdTAwMWa6ifDbVerLu35orfi3X8L+KVx1MDAxY4bHfE7Mh1xc+mkp05X5tnL/t19S6/3izsdcdTAwMTT8/lxyXHUwMDBmXHUwMDFmk/antmxT69MlTmA4X/5jnv3BnVx1MDAxNGeihfb99nbz24//8eHR/1dcdTAwMTROKY7+e+kw+n1cdTAwMDVcdTAwMTUx7+nzoz3sgrfz8yf+7b9cZs3S/vkv+1xmPSl9O0J72uNcdTAwMGXK9DihMW7SNFdi1zsv2KlAJO46241mu0ily3mrI6uZ5k/dkHFcYiuYh2u4Q1iOXHUwMDBiK+KR18ehY0as/cSfzmnzXFxjZNz+ydZ5aCVcdTAwMDLfkq1fPmqFV1x1MDAwNMSkM1/slHWVXHUwMDA0oc5LoWCGQzsgwLPEXHUwMDBla4BgwYBUs+ZRd/aW61x1MDAwMN1NgFx1MDAwMLtQXHUwMDE00MFA69mcXHJX4KNcdTAwMDCumeLsZOM9oL5cdTAwMTGhq06W4dzUY1x1MDAwMqVPNlx1MDAxYcr2joZm4nr2/nyFJT15t3GDX0+L7/Hns1x1MDAxY55Ri7fTyK/AoLxG5ahcdJ3S0Tg15IOkllx1MDAwNTc4VHCec/RcZpOwMkP5tr5M6v58O3Re7j43XG4qe3qv7Fx1MDAxMEGfyuPoliXLUptcctfRuTJZSnm8gSOLXHUwMDAzMGOYUoRJUPZM8VHmXCK7irc31Fx1MDAxNYv5NsGRkY4hTEnNZjuGidBqXHUwMDE4dlx1MDAwNFx1MDAwNbyC1IOO+SVTXHUwMDBlMTKe2L7iml65otpcYlxyKPtCjvl0zVGFVDjCXHUwMDEwXHUwMDEw0Fx1MDAxY+bwrlx1MDAxOVjYjijaTCEskjSUZFx1MDAxZYuE3FDfpfuFNDI1XHUwMDA3XHUwMDBlZihuXHUwMDFjyFXpzDkq4pl1TaPK0Vx0XGJ2yVx1MDAxMlx1MDAxOE8y2DHaPtRKhFx1MDAwNoc9yebsXHUwMDEyXHUwMDBm6ZPC8Fx1MDAxYShcdTAwMDdJLKy+N7OZeIHuOfMjTVdcdTAwMTL2OjNcdTAwMTVssE2lgDywXHUwMDE47T5qilx1MDAwMsfBRJ95Ye3rhj2TR0NIdVxu9eNGptBcdTAwMTDCOUNiXHUwMDE3YMlcdTAwMTAjnNlcdTAwMThIXHUwMDA0XHUwMDFkW0r5mivKcU2bXHUwMDAzm/YgTJdWXHUwMDExXHUwMDFhdC5KXHUwMDFhXHUwMDE0XHUwMDFlbe/zjFRHu2m/Lsf+LN1Ia8HwWEu5KSs3aazEcyHtQYHpiupVjdnpg0yt7mLklDZG+7P1xOfE0YdR4anbXGYhJVx1MDAxOfjFKMz1XHUwMDE18kkg0/DNrybPi1x1MDAxNsiYkHtMKa5zVMZ4cSQ8IVx1MDAxNm3l70d1XHUwMDAxLzfcJVx1MDAxYS5cdTAwMWWVvVx1MDAxZSBcdTAwMWKF9Ykz74y8XHUwMDFiJbmoR1xmNvpcdTAwMWU3cFJBQ1x1MDAxMIZcIra2VlDvRTo+8Vdl9rZcdTAwMTFHuNZaqVwivqDGPtouml9ItIM2l1x1MDAxYvrhu1pcZnTNk9dWitVcdTAwMWPf4dGq6142ZkDTXHUwMDExopEykergXG5SJVx1MDAxObPJSsJGZl5cdTAwMDXYUUteL1xyJkyOoFk1tVxi5Vx1MDAxNmPn7b3A4eebujGGijTIVlx1MDAxZEqnXHUwMDE4Ue9cdTAwMTZ8U5XG1bvElS7lXHUwMDBiknRcdTAwMWW2XHUwMDE4lXtcdTAwMDQh0J5lJ+dccsfjLP5BaqNUZJaFpVx1MDAxM1x1MDAxOEl9rtxJP3C7yjKI1Dnz2UH8RMbzrdD1cYxcdTAwMWHmXHUwMDFjN1x1MDAwMI7bXHUwMDE2XHUwMDExoec1apNblFx1MDAxZOZcdTAwMGIp3e1yZVZOXHUwMDFjIfjl3adAf1xccFx1MDAwNFxcgdXkXHUwMDAzWqNp+9LPTOFNx5JcdTAwMDRb9nxcdTAwMDFcdTAwMWVmhYAvxESGwlBcdTAwMTQg+FxyUS23XHUwMDBiaWbdJjzVM6NcdTAwMThqOFx1MDAxMiQm8ylcZvU6RiWErYqjztlcdTAwMWFe1TXEKeAmcISHfXmoNIWJdnvLo2A9ZGWjTFx1MDAxMOM2b4ahaqbmTlx1MDAwYkPmOeg62Vx1MDAwNWKgwrR6kzbSm4vOXHUwMDE1XHUwMDBlNGUm14qzKr1eeVS1QuRm2CmRXFzIgc9NXHUwMDFhdLBcdTAwMTBcdTAwMWWwI1x1MDAwNbJcdTAwMTfmPzxxYWSPvyxcdJqO98f+aJCs9GyetjpcdTAwMDK7JMmB1Sa/dnC/llx1MDAxOXzJr0RaX1HRpjrBRdKpdXXe5HzAXHUwMDA3I5TEXHUwMDE4Kmtfp8ryIGep5E2hZoM3jVxmXHUwMDAxQeKer6EsVSZDu1xcQ12qS4nFuqPpt+COzKNcdTAwMTeBMLe+QOi5XHUwMDA1IDA8UtliWZnjYKftelxcrzbEh3q9hsrHXWd0VZKRfJVRnVC2nIlZ7vBccmPH4snpSblj7YDkX1x1MDAxObFcIp508eJAlVx1MDAwYphIXHUwMDBl6PmclSWx5Vxcy1x1MDAxMehS5EB2UWmmTDNoXHUwMDBmXHUwMDAwyqRl/VZcdTAwMDGzl6BDPiDM7e63WiVCeFxuXHUwMDA0cmVcdTAwMTRcdTAwMTNTX5/p0LyodPGAzlxmfb5cYlj0hVx1MDAxYfqLsJ+OXHUwMDA2XHUwMDEyWr7t03JcdTAwMDOhXHUwMDBiVJ1jksBcZoCFg/OE9kaixV6YuXkvXHUwMDFkebxJdGDWiFx1MDAxMVx1MDAxZp0vasZtXHUwMDAxk1C38j54hG3dw4iOXHUwMDE4uavHxHV3XHUwMDEwXHUwMDFlXlF/ulx0ejWZ5slcdTAwMDfPx3rWXHUwMDAzveIyb0RcdTAwMDAlXG4tfFJosbk+ksNDW42717tULKDHXHUwMDAzN32Zya1cdTAwMGbJdKtcdTAwMTDXR9uQzlx1MDAxZJ1cdTAwMDTntLpCWVxiv7B1JXX9ZNA+Jlx1MDAxM3837lx1MDAwMM1s2ouAXHUwMDAyXcli1VXE5oFlXHUwMDE3QCGFXHUwMDEyeFx1MDAxZUbth7YgWHNcdTAwMTZcblx1MDAxM5O5MztcdTAwMTKiajOw2Fx1MDAxNlx1MDAxN5JrLD9GIZWXZKnnU16J85R/qbu0xLflJFx1MDAxOEmCR1+PXFxF8zxyM5Z5omCQu7pI+HyRnPLak3VcdTAwMDN6bT3GSFlG3VCTTNFFfH3pslx1MDAwNVFcYrHkdFxycr3G86NTRy1cdTAwMDBArXvbPck3XHUwMDAya8vLqWfpVX0wV43BLLqwwbiA/DCH+c51XHUwMDA1SnzaXHUwMDFhXHUwMDE1ZSOkmXVcdTAwMTl1qoWxKmrmqjZTXHUwMDBlVVhccs5cdTAwMWJNRV6SbHJlobCOS0I4glNcdTAwMTVcdTAwMDO2XHUwMDEySZGDUWhYsVx1MDAxMoC+YJZPm4a3XHUwMDA3L68tyiS4VjXCS7ZEeO1cdTAwMGWLh82JYWLJr3n1mJBba6FcdTAwMDCRzy3PuawsXHUwMDAyyIyliU3o1eBU24qh8+1cdIVz50CBK77gS08jdEPUQlx1MDAxYTWHh1x1MDAxMFhsq1x1MDAwNC1cbivSTdVdXGbcJfJa5pWJJJdcdTAwMDJrUDI9zctTJG6qxEFAR1xcYrtcdTAwMTJIS9P8m7ZXxYVcblxcakGOcVx1MDAwM836VVx1MDAxNHW/JlP+kjn55WmIXHUwMDA3Xy67WzPLLj7iXHUwMDFjuzw0M2jgWyC7zI3yIVx1MDAxZFx1MDAxOHqKg8XtXHRjr+hllWh3XHUwMDEzYeo18jfyTDVHWle6vGVcdTAwMTmOw6RtecO0Tlx1MDAxYVx1MDAxYkOR63H1JEM1I1dcdTAwMDCHrDZjXm+FqVx1MDAwN4zlXfdpXHUwMDE2tVp0UE9P9Cno8zzifPeeXHUwMDBmmerffVx1MDAxM1x1MDAxNtn8RlxcljHlIb+9US5s7zVcdTAwMDD70lx1MDAwNTigZCpVPF1cdTAwMDQyVJXrwlx1MDAxOCNcIrivXHUwMDEwtWla0WZlSvK6XHUwMDEwyo5mfVlV63vtlXx0XHUwMDFign1WeCB3W0frulxc5DuCOCFXdXpKQ6qI081+mTNEpVx1MDAwNDyJwJLtKdJVXHUwMDFlW2zxhVwiTnOVgpVeajSbwJx4VkZd51x1MDAxOLWoXHUwMDA0jTPWnFx1MDAxMVCXP0eKsVUjKVwiV1r1XG5cdTAwMTBA0pNXkJ3wfY7CqzFV6PZcbl5cIt2zwEtSXHUwMDFhdDjGUMru7cO6iKxcdTAwMGbRep7u3IY+Lrl/qtu4yMZ4wpC4vXO4XHUwMDE0LePOOqblSSDBtagt3qdDaY9eXHUwMDFlPUdB5lx1MDAxZfNcdTAwMTY0mpApXHUwMDE4cq1cdTAwMTJKoihyeog6c+V4cd5cdTAwMTJcdTAwMGb3ylx1MDAxOeNsXVx1MDAxNsqolVxcumRcXFdcdTAwMTEuQS72z1kk1UqbsCFodVxiXmJZXHUwMDAzWJrLaVx1MDAwZm3AV1xu1zTJXHUwMDFicP6UXHUwMDEz2aFoOFx1MDAxYu3uNqzCrM5Pb6kvIJdWT+BcboK00OadfkxcdTAwMTSjdtZcXFS+UaSYnuDlzlx0XXorJlNcdTAwMDSjXHUwMDE3hD/XPdRcXK6nUzoy/Mcz0y5q7r1C2Y1cdTAwMDZlskZ2V89cdCPCslx1MDAxMEPlouzg3UWr7ZhDStbMxVx1MDAwNlx1MDAxZdopQpyDgi520uw0r5Qrjl86kuZcdTAwMTbgRWFcdTAwMDCAXHUwMDE0K6jfc9VXrrhpXHUwMDE0XCI2L1x1MDAxOdDNXHUwMDFhRaHHit60VYHBLVx1MDAwM3arMGfk1jzKXHUwMDE0XHUwMDFkNVxcpoCaXHUwMDE1r8qpOFx1MDAxZVx1MDAwNyTH11x1MDAxMyyB2lJ8XHUwMDAz8TehqJPRRmlZtFTDQ0HpSFx1MDAxOKeR7i7Q0IMyXHUwMDA30ySv2M2un1x1MDAxYbewV/byQqyip5LSP4HtXVx1MDAxOMWvglk1SZqpZb696knnr0+Vv7+eXHUwMDBic1x1MDAxNc5Iwy2SMzRcdTAwMTCa8uS7xNtaelx1MDAxZJRHXHUwMDA3RymEvHSRNOJUplH2lFx1MDAxZjfOcFx1MDAxMVJlSFx1MDAwMiArt1x1MDAxZMd7afJC8trPgko2UdKSumnyys30mfvUvyTG4lxu21j1dp9Qt+hDqdrEUOTvYul6c+yKot1wXHUwMDEzLW2cvk8vaER2l6RqheBcdTAwMDa7a8ij0FVHYjZVwVwiqeR6VsXkXHUwMDA3f2iMutW7+Vxm4DWgnzn4vKGmXHUwMDE1pPTpUHjjhPtzXHUwMDEwRJftjpmImkZ59D270Fxm3MWUN4mmjN90by3V+GDkUryxNcWfXHUwMDA2rdVIhoVcdTAwMDdcdHr4jo/TanzTbL5v2JBgfOj+onV6aJGA9SP7IWyT28TD9OBrPLpzQ3DDvFOTXHUwMDFkO0lcdTAwMDKin0O9iVx1MDAwNlx1MDAwZVOhtGq+/Fx1MDAxYq2yhIU6blx1MDAwNnBcdTAwMTKiw65cdTAwMTnnXGZFl4+LWubDXHUwMDAwKG4wMHRqn+OwnCRVnVx1MDAxNYTyikeVa7ZAg5CO74OjjHg79OFcdTAwMTXbmpq1UFx1MDAwZi/K42rl0XUjtjuH1KVwXHUwMDAy5P7iRX61XHUwMDExcHjceXXLn3UvYaxcdTAwMTCyribnzJm5hlx1MDAwZl9JVn6Oms9Anc5pie1eVm11xMuQTVx1MDAxOWS11XaRn7BaJnxnois9XHRcdTAwMTF0M+uW6uKYdlx1MDAxZs4k0rGUcKFybZqAamz/4Z6vXHUwMDE40+SO9kVxfWT4boArZ9PsKUmk8ixztqfgbJNVLFx1MDAwYov8NtvlJC/ORVwivCCvd7p45Vx1MDAwZmC+xHHgMaB4RHVYMlCQPi+Dz/PARCTP53bhXHUwMDE07IZcdTAwMTHu7oWrxTz4MGyGXptcdTAwMWIxR3v17oz01bmEilRjurXkU6hJsPa8RdfqipJZJe8qx3ngJY2eaWwr19HPntRZq1Qw1lm+uLFYdVG2+UVqwiBcdTAwMTeqldj+ybll0Vx1MDAwMmf8zXycXHUwMDFmgDVas51cdTAwMDNAXHUwMDBmNb2U0mqr4Y6vt5q48cXDS4/N7OMr4MfxKkRcdTAwMDFzjPMj4lx0tEL3l+61XHUwMDA2K1x1MDAwM0wg3rVKXHJxc/J7s1x1MDAwZmmJjk/NTFxc6txcdTAwMTTTYFx1MDAwMXGhwSFcdTAwMWPL7+m+ufR6XHUwMDEwbjhTdu9157DJXHUwMDA36N6EPGK3Q3Yw9tLj0S6SXHUwMDE3yLxcdTAwMDfJkPsykWeqiDWJQorqrPM3g7ZYXHUwMDFi5tXblqKkuCairbTD4lxyIFx1MDAwMFx1MDAxMKCpPIJcIiG61bFcdTAwMWa77dKMQJKR9KSBJl/T+TBzye1yPVx1MDAxMs1Btlx1MDAxZG5I96FcdTAwMDcygDBkR+/udX1cdTAwMWRcdTAwMDCX4XXCUMdcdTAwMDa+98nSXHUwMDE49Vx1MDAwM1x1MDAwZlx1MDAwN+huPNVAN7R7T1Z3lFBcdTAwMGa1klGZpcH4oTt41lx1MDAwMDsmQOwmMFx1MDAxN4RnSiiYXlx1MDAwZsKPNbHgu4Yv71u0ssO8XHUwMDA0T3Y0hTtbhzdJW1xiXHUwMDBim1x1MDAwZf9yakqV4Cb+Lo9cdTAwMDCK9lx1MDAxM2CtcPCqXHUwMDA3Vakh+axcdTAwMDDMSvt0XGbd0/hRU0o5PJ/X+60+PCmf7VA2ulx1MDAxZLw44a1cdTAwMWXqvFwi7+T0XHUwMDEwjWbEoCdOJmLt0Fxmy5N+2uZl7C4qPT86UUtcdTAwMTW8mnUoZYruUO6mQuSIvVx1MDAwN2pcdTAwMTdfyEfiOOtyXHUwMDE3waDJVotcdTAwMGbcoSWudemI4ENjncCSSU1rcFx1MDAxNUhx9do5JcI+62yVXHUwMDEydNdcdTAwMWU7a1xuKItRy23Hp0Jh8/6Op1x1MDAwZXGXXGJlgPxXeJyTXHUwMDExMORcZlx1MDAxNH7YLHMzM6YtOHPkQmNXQJxrXG7iXHUwMDAyJP6yakl8Wu5cdTAwMWV2XvSaXHUwMDE546FcdTAwMWMxPKdcdTAwMDabr7E3u+XTXGbnimdnqiBcdTAwMTVoiq9U1nhcdTAwMWL1ep7nXHUwMDE5h5V9ne/zXGLulztdkDxcdTAwMDG72Cb1gfzw5JlcIlx1MDAxNNBcdTAwMGaMK6a5ePJSSKsmXHUwMDE1XHUwMDE4hsSaI83ipt/tjUndwLtiipMnt6Fszm/m8Cm7bEBG3C6rnZ/zk7/vjV3vNsaP9TXP8//5Pz9ZlVx1MDAxZNPPurswQkCfbNR631x1MDAxOb2n81imy5dXfbp88f07xX9vXHUwMDFm8fdvQf/jfUTLPP+SwF/6iEeY8OPX+ojy23j+3EecPDNcdTAwMDWvvOdcdTAwMDAtYSwqJFx1MDAwYk2VtjhcdTAwMWV0MyxcXM1mNKXro6+tq32aXCJVXHUwMDE0aN5h7jbP8lx1MDAxZcQz/ONxrWuBzuunybFo7rtcdTAwMDIy4OlcdTAwMThsl9tLNOGlyixcbs/aJXa0iLrw3Yt4tuFw6HJyzK8xJVx1MDAxMMwhsOU1Plx1MDAwN4Jccn1tJ9m6XHUwMDFiiC1cdTAwMGKsdKevnXinXdtcdTAwMGaZ5N6S10pyXHUwMDE5kY9peqGfvSFeck6liZxcdTAwMDWZiUZajlx1MDAxNbd7rjUvk5FyOa9vwtTgtl2isdBzg8/kK6dZPK159lx1MDAxM1XxxEuQ8ZBYceRcdTAwMWRe3IQ7Q0r5XHUwMDA00u5zgoTTtvbXmjdU/TS6R1nAiXKxdvrRLqRcdTAwMTi+xDxcdTAwMGLalc7DWlx1MDAxZOHglu43fVx1MDAxNUlcdTAwMWSljfNrrYZI5YTL6GSbnWxcXNpZii7gQNxA3upcXD436KhcdTAwMDRUVbuhI35zXHUwMDFhTI6ik5pTLqZZek4nhI9rmVloX8WJXHUwMDA1nXpccoQzrS3gk41cZl69MiZTXHJcbqg9kEnCXHUwMDE0yezYZq3ka3vodM8tMlx1MDAxMVxc5stcdTAwMTiG1Ion6WhcdTAwMDO9VWhcYq3RO9SdXG6HP1wiaVx1MDAxZc3K1baWvKGMvUPNvPjaSSfcXHUwMDE4XHUwMDE3TGyXT1x1MDAwN2mflH4xXHUwMDE49UqrzDyEoKTAi5kyVm6su3tX71x1MDAwNNinXHUwMDBmnLudpvRYeJIgXHUwMDFj/I4tl6JcdTAwMTfgU97MzFx1MDAwM/b2dFNcdTAwMDNcdTAwMDOuM9+ZXq6NSug9S1x1MDAwMFx1MDAwZumAZVfwS+/vSiuaPl73XCLMj/c4gVFcdTAwMTachGDjylWGYyu9TkGAkqF2XHTZMNHbZ6StQ1GLev9k5oJcdTAwMDXJ1DjFXpdAni2aXHUwMDAyKYGac1eJqvRcdTAwMDWyXFzzWlDu5Oox+Xl9y2z0XHUwMDEyXHUwMDE24lx1MDAwNr92Ln+sgkooj+tzXHUwMDE3XFxmKcOxu2FXQ1xy3Vxci4Z6js7x9c146chd54CpX1hpY1x1MDAwZjopXHUwMDEyh5THjStIWbG5S69DOn1wnHUzWVm4XHUwMDA1i1x1MDAwNlx1MDAxN9aamHeyP1WU3t7Jwiw64Xm3xd1r3caVLKnviqFGTU+b0uNC3/J0dctEd6/qhkCkKF1cYlx1MDAwMnjOXHUwMDFhXFxJXHUwMDFjZ2qhOtC+edfYiu+Po83yXHUwMDFk6vf2vpnjdivUm1bU1/WqgsVcdTAwMTjs9D2vXHUwMDAyjIi76jJF+oLVQYf3lKZpx9XcbNbYm/xFZUGT79zNtGiqv7lVXHUwMDE4eXGsXFxYlG6J2Fwi7yO/Tis6OOVcdTAwMDODS3qz6ZWTLTbXQlabWniC3TZcdTAwMDXZUzg9wW2qdo5hLpg9YHzP0aCo+lx1MDAwZq7nTlx1MDAwYlx1MDAxNYJcdTAwMTdt4pR551BuezySIFx1MDAwMVZ1aSNoTlwifFG7vM9mVfRcdTAwMGVOXHLZplx1MDAxN91cdTAwMDOO4SnXXFzsXHUwMDE528Pop7dcdTAwMTXYiGld17HTbmTFXHUwMDFkg+ZPtVx1MDAxYpBcdTAwMWS99Vc4t9ShiU0t4mjtpF2s1ClcdTAwMTVGYVx1MDAxNrpO6Fx1MDAxMteBkUm1MF7dXG7LJGwmSlx1MDAxMmBE5pFSbLSxVZ9oXHUwMDE5ctRrXHUwMDE590agKqzW83Coia1DTldcdTAwMDGvbpDQXHUwMDA2od+GNO7Orz2a1qCwxMVcdTAwMTXzKFx1MDAwZkH+Zlx1MDAwZTZcdTAwMWWAS4bgXCJcdTAwMTJzsNK9WHWnnYrNx7pP7Cu3z43va4ev0ThUmidcdTAwMDR2qlx0krgjW1x1MDAxY1TAuZhcdTAwMGJaTFx1MDAxZuRcdTAwMTZcdPWzOTV+XHUwMDEwxb7PvK65LFx1MDAwNee1XHUwMDFk3OVcdTAwMGZcdTAwMWNxLbVcdTAwMTRccrxcdTAwMDCka6s2XHUwMDAzXHUwMDBlXHUwMDFigr/wXHSX8MFDXHUwMDBlXHUwMDE57F7KTsLsL+dcdTAwMTCfuWWoN1Zs77MmPpiYXHUwMDAwXHUwMDA3bFKinmNcdTAwMGZuXHUwMDE1ZHVjg15fucH1XCKY9llE6/RSN3X+IJqH9+SxR25cdTAwMTgqw2SFx0ilZNC61qnmQ/ZT+cLur1BwIyO+KzQkcy83d8q36ZdJv6VJu4wgtZpcdTAwMWHVO3p9uUmm2Icv/MRyXGJcdTAwMDYss5vBRKaZXCLfM6M1ViiXdzA451tcZmSO3rDWNuGQwdWNxuRbXHUwMDBiXHUwMDFi4UBfW1x1MDAwYueeS/lcdTAwMTS3xXZcdTAwMTLcblx1MDAwNbNcdTAwMTV09cVHkI7op65ktVEkUlx1MDAwMNqVXG5O8ps0W+1cdTAwMTFtU4puLHJFqVx0Nlxuze+LVnY0Zp87XHUwMDEwyn1M1kTtliOkhzI1fbi31Vx1MDAxMJXwTtLstSBud2UqVmU4SYSVtWVIXbqe2tdcdTAwMTVDRiA6R1lTRIQ1xVx1MDAwN9uM2Xzca1CLeSlcdTAwMTRsdpNILmHI6nUjWUOAxilcdTAwMTCee1x1MDAwNFx1MDAwYqv9qHNcdTAwMTihXHUwMDE3RmX0lVx1MDAwNZ325vG6ms77XHUwMDFkeezbhSa2WfRcdTAwMGJcdTAwMTVkVlwiXTM63UPtYV5T5iXigqE7IIJk7NpcdTAwMDJNvNRzKY86c1OLlVx1MDAwN2/lg6iDdrtpw2V4ZZR6KNI2XGJFT/uiXFyI4OqqYUWl9Fx1MDAxZI9f3MFEwebctuhcdTAwMTTCg2n6o22DUMxcdTAwMDDVk9acZVBgK+LWNUXXKlx1MDAxODmhXHUwMDEzxTLO7Zw/4lZ2QclcdTAwMWZcdTAwMTDR5320NmQ719V6blx1MDAxMlx1MDAxM3vFZfhsdyhUdzZaXHUwMDE5ku3prbaa11qIzLyPKNBqWssxZ73SXHUwMDBi9Uz5s242caFcdTAwMGb8uPIr3TtpVolIe2Oftj3c0PrgXCLbNJuKXHUwMDFl0Wprs/M+XHIpj1x1MDAxMF24tUqeldCfMZl54N/aQb1cdTAwMGKomF8sXHUwMDFmMHxcdTAwMDVMwmp8jWqIcVx1MDAxMuh7XWRcZlx1MDAwMaNMXYlrrFbA8WqyNrSnXHUwMDEwxF7EQLv6Ko2CXHUwMDA3KFxcXHUwMDE5kSzYXHUwMDE3wsJQcaHYNINcdTAwMWZS96RBXHUwMDE2i+9DpFx1MDAxZTevS168PfFa+oxrXGbQYlx1MDAwNKD0cMtXJ1x1MDAwNznKkky7XHUwMDE2jsLIXHUwMDFmXCKTecze7khhm1ZnSl4lQlHQqMFiv1x1MDAxZTP8iiD/kVxyMP5cdTAwMWH7W1x1MDAxMctlZNenVX2KeeIrbVx1MDAwYlx1MDAwMkzCSJp7P3hfNVx1MDAxNGC8XHUwMDFj96F0V+IxvF6TikTpU5OeXHUwMDBmXHUwMDE3QqSMf4CoKNRdWlVzrlx1MDAwZVx1MDAxM1aedZJtJqi9QjWz4GvRmfwmOXKf2n3On+X0tnjGa9NzzzL5LFxcxlx1MDAxZFx1MDAwMMFNtPPknnO3u1x1MDAwZXp8RNZ0XHUwMDBlgD1mbHOW1MvuJGPxpK+WgVx1MDAxZFx1MDAwMFx1MDAwZriOI7rLIY6DXHUwMDA0u/Z9wDfIUsaXwtbI0kS8qU5vmkFggWfD6vLNS1x1MDAwMMBcdTAwMWRcdTAwMTQvf6mo8Si8bpZmnkXPmOo+TeK6dV6ckdXqzFvmdW7gOV+fYVx1MDAxZFx1MDAxOY4+KFx1MDAxMVx1MDAwNepcdTAwMTJOXHUwMDFk81xiSnlKmHiDT09cdTAwMGLOYe+2WFxcPvPRg4xcdTAwMDKA7jWgN8vTXHUwMDFk4Hs+NTVxTjd8zlx1MDAwM6Bqd0hxkPBkjlx1MDAwYnBj9VxyokA5rvKQXHUwMDAzufGugPDWgs5lKaBLyIhcdDmeMlx1MDAxMJszR78/L8xcdTAwMTO6XHUwMDFkXq707rbwkrhaVGBvkSsj5u2e94zLXHUwMDA2VVx1MDAwYqeMQT+bgT9rez4uj5bI2OfrsWdcdTAwMTf7gE02vHiFnkL3ZcVDYmndg7/Um7zt/NVL2Fx1MDAxZE631pk4XHUwMDAzn+RaTaFEkdpnLVx0kTbFLl7cKGfo+YTIxseOXHUwMDE4e9uxXHUwMDE1Kt39PGCF45Esw+lcdTAwMWb1XHUwMDBie6Pse0GEs8Pd/dTBZl6vTKRzqKc/iFx1MDAwZWLS/sGcXHUwMDAzd1x1MDAwZS13385anoHoVVlL8dVop19cdTAwMGZcdTAwMWRIVsutiHt+VL1gpofC3NumytOne9qpbZRhTjZfoaxcdTAwMDGeMPe8Llx1MDAwMFx1MDAwZTSPR4qf3JbBIco2w51cdTAwMDFflXaz6Nh7XGaYiFx1MDAwME74XHUwMDE4wW0saq43x5CrXHUwMDE5vCmRlD7o5ym1rqR3XHUwMDEx6mpcdTAwMWSiYrtf1LN8PefH1SucXG66c5lcdTAwMTKNXHUwMDE3PJH4KNv8e+E3vWAyXHUwMDBmxOvOyJ4uK1xu1f0gXHUwMDA1XHUwMDExcVx1MDAwNGXxXHUwMDBi5Fx1MDAxZY9cdTAwMDFFo/zlXHSK6/XVVsxgmM87w1xu0Z3UlnnglvxcdTAwMTTIXHUwMDE1OV6WW5LMmFxuM0HV6TDg1axcdTAwMTf6XGZcdTAwMDVeiGXYS9pEz1jVc2A9s5NcdTAwMGZUznNcdTAwMWNjMmI67zOPeTA6XHUwMDFk82T/mYdcdTAwMTRziKRGdPcnrTo0zpniWtigjkztqmSiVd6KVFx1MDAwMy2NXGJZmYzdW8/EXG58eD6m4+BzctneQfCtqU7RK64tnXs8b6GFvC5FLk5iMLmyOVx1MDAwN+CI3TlcdTAwMTWuq8qdYnumjVNyXHUwMDFjk9B4K4FcdTAwMDQv7SxcctWC+O+/16VW3jeA8CxcdTAwMDcthl+VNEZSpMEgIHxWboPLXHUwMDEz1m1IVHJcXHnghZ5g1imN1/P200uwwmhcdTAwMTF0upoqXG5cdTAwMWSeQF100VenqDLYjMf8Zk1LQG86Q07HXHUwMDE3kFx0XHUwMDE2qec4Z4l04YCGXHUwMDFjkKZpXHUwMDE5XHUwMDA1Opa+1XmPXHUwMDFhqe5cdTAwMGVnqahE4lZcIlx1MDAwNlx1MDAwNsFR6365aVx1MDAwMlx1MDAwMiVcdTAwMDaO+1x1MDAwMVNeXHUwMDFi+XRKp2YpRVO+8G3N78dMQIbXQJVQlapDzWVKjK63XHUwMDE5sLYt/d1iXG4qpVxmaETJ4JQ2cUrj/FlcdTAwMTf1W2jScHXVxGDeopvaJOhcdTAwMTlMXHUwMDAzU4k6gCuaaYKSkaawXHUwMDAyYnSJd/5cdTAwMTbmi1nk8bSByMvD4/7iq7FVXCKvZtP6wEkt1MXA6dLfXHUwMDFipkQmRZ9cdTAwMDNgl5XWvEP6WusnRmZcYu1X/Kw9jsn2gPvctZbGXHUwMDE0d+jok/+Po9YqWbwzPD7y8GlcdTAwMTd6d6F52jCEPNl7yYn39bUph/E6XHUwMDBi88q8qIAyYGDrXHUwMDEx7qKTJFPL7qyvXHStk4GCwqrrYtegvVx0/NU4OoaV+NKAK0DgYYXPMV/dQJeLk4o+83RcYq2+XHUwMDFhS0/IXHUwMDBmaVx1MDAxNVlgJJyhplIgXCJbSeCJXHUwMDA2j9BcdE2aV12TfVxyc31S/zz2M1x1MDAxZSiTdjOeMnY6KmK8Y1x1MDAwN7WU1brGQpfF13aeXHUwMDExzjBfXHUwMDE5xlx0liVcdTAwMWRcdTAwMDMqkEZWXHKDei02t1x1MDAwMVx1MDAwNCPWlVx1MDAxYtxcdTAwMTGZMK3bJIxeXHUwMDE2ZNC2N8/ZZffLKVxudJRcdTAwMDCOn3PkXG5TVS56W09U/n5Dglx1MDAxYlx1MDAxOb/WXHUwMDEzV5aJJDC1TYWd5iitgFxuoiA3qHgtt9m9ib62IVxurVx1MDAxN+wwVPAxMVx1MDAxNE1qr+tRXFw65cFUeZlj7EFk4FUwKEgmr9Y4WJvXXW7Vya5cdTAwMGYuXHUwMDE2zcJcdTAwMDUjLlx1MDAxON1VuEm+MvG36+NRwutdXHUwMDE1pXrjvdxjSOGGuXivrctjadZIqlSaPv3kWWdMiN5HUYBcdTAwMWIw5q00YjhcdTAwMWNCjVx0qO6zJFx1MDAxOHhnXbtcdTAwMDeVReNIkqJiXHUwMDA0nuFG5CiUj8mjpMq/XCIoqFx1MDAwMswku1x1MDAxYVfCNmdcdTAwMDc+XHUwMDAyJPKFa/KSqlx1MDAxNidcdTAwMGUhzyTM13or6vElSlNFSryAUGkx19J0ek5cdTAwMWG0XGaTrsVjXFxv/a5cdTAwMTecm6DVRDjz5NxJl46nMX6Y/EVeNqNQXHUwMDE1XHUwMDA0scPqtYacYZBcdTAwMTg+zlx1MDAxMTBcdTAwMDRbLteodNZLsNuu6ZVMptW0gld5wcDMvSzblI3GoWT7yUFcdTAwMDFbM6U3IzYmQUTLMo186lx1MDAwYqblibigcVlx51x1MDAwYqKJ2Vx1MDAwM9Tax0mLXHJ0R6tx5VxumSFQQvdcXItb1ojjuf60b89cdTAwMDFLJtLyXHUwMDE5/7CLi0h4XHIxj3np2Fwij7bq6tRPV16fXHUwMDBlrWlwqbJcdTAwMWP5elx1MDAxOFx1MDAxZMf0aeT7IXN6c9lLaFs++U6fTfdcIrOxVoPXKLVcdTAwMGZ0lHxcdTAwMWJDl5dpXl/E/NhcdTAwMDZi7i8twLZqPpk7eD91u9nthshcdTAwMDFWUXjiaFh9ffqa7iAow1x1MDAwNVfNrOsraW3brexcdTAwMWaWVnDNxZcqb19PqVx1MDAxYlx1MDAwN1UtXG7LXdXo8E1/ntWpaU9ccs9yXHUwMDBl7jtHd2qAQstcIvfVvF76kTL2JNi0svT0YNHJdj9ccsIrcVx1MDAxYVx1MDAxMFWtslxmcLrJn1x1MDAxMbtrS3k1fbjkznSywFx1MDAwN05PXHUwMDAyXHUwMDAyvChrqJ7bQ+FF0d6kWc9FXHUwMDE1eoBMQ0aahGiPsnD2SzV0JKEmNG4meo3r4F5cdTAwMTM2jVxub30/XHUwMDEy7Fx1MDAwM63Xo1xilVcu6SpzhK5OOkJ0/1SX7a234bd63vhcbny11LTc4b2/w1x1MDAwMFx1MDAwZpVgdr9cdTAwMWRD6kyxhTJXuJNxU3/dkMzmT1x1MDAwYlx1MDAwMYn8KVxiXHUwMDBlk74yVYk1T1x1MDAxMFJcdTAwMDFrbD1cdTAwMWJvk5L0Ss6A1/Fe3L0+z1TbuMlcdTAwMWLPXHUwMDAz9chQyMVcdTAwMTJYVDuWoOmvLsuUcWXlUSExyCBfXHUwMDE4LTfi5+WG61x1MDAxNibc7DrUu1xmxFZccnjUdkpjiPyEXFzwob96TMdg8XlcdTAwMTK61knkdrOfnlx1MDAwN1M0XHUwMDFmPVx1MDAxZo/DuEa+rmBcdTAwMGZcdTAwMTJGPF6Du8cg2E9cdTAwMTZYLqtOc4l697b48d7DXTTVXHLtl0nf/YbewdPGOfIxhst1pu+2XHUwMDE5OMNOirhxOFAzVo3SWFx1MDAwM1x1MDAxMHn6KcBcdTAwMTEzXHUwMDFk+7Oy+eLt1sn3XHUwMDFjXHUwMDE2NpFDJZ6p4V5cIlaB3cL6RTzx1/O4XHUwMDAwnegktyG+XHLpXHUwMDE47NBtSFx1MDAxNILmxpfVXCIj84AtXHUwMDE49ftUqVx1MDAxON2fJ5FcdTAwMTPTKz1nbdk1XHUwMDEzxmOeL1Zhi1x1MDAxZrp7iVx1MDAxOVVcdTAwMGXO91x1MDAxM0rXQVx1MDAxMWBfcWCJuFx1MDAxOTAosaTpx+J1njqVR3y7qZhF01x1MDAwMp1LXHUwMDA1lWs+31x1MDAxYmh0e1x1MDAwMblcdTAwMGKzJNffwixcdTAwMGJcdTAwMDPZ7GretJeBXHUwMDBmT1x1MDAwZnL6fFBEPI2z77p/oHk7j69cXF2i/ilcdTAwMWK7eEsnKfZWa89fXHUwMDFifWhcdTAwMTfOZStmQWm5oNhf9Fx1MDAxYV5Wj/lh+vFcdTAwMDbU6/5yZzHxYcZAa1x1MDAxYXvBXHUwMDE3XHUwMDBlXHUwMDA16T1/kLRFV5A/4bB01ptzsDgzeDxcdTAwMGau33jQelxmOERKILwyXHUwMDE5LNgvXHUwMDAwuDVcdTAwMGWEYT2KbZxnJzwn41xcyibiIZvbzrEkjttcdTAwMTLY4Vx1MDAxMkjHXHUwMDEwjeDzdVOxQc8hXHUwMDA2pYk1yGPE3mXeJ/fFjulcdTAwMTmM5Fs5jpCCPYlcdTAwMTShSNgnXHUwMDEzazYqmZWshVBVJoJQcIVynlx1MDAxNEDLi1sm8Vx1MDAxZasj4c2Fzi9DYClcdTAwMDGU6G5i0f62cWtcdTAwMTlw6r1cckXWmNzhts5qn8xoWSwwRtVy5S3PkkNSXHUwMDE54ez5Ylx1MDAwMWvEUsFdRyC5XHUwMDE3NFx1MDAxMzlVfFTI15ZYKzNL+kOtLFrOXHUwMDBihJeYTPRcbvOkXHUwMDEzuItE862fxSjjtDFcdTAwMDEsx2FHJVxi5XlNjXdz1T9cdTAwMWVcYidcdTAwMTg5fjF3O1x1MDAwMVx1MDAxMVdcdTAwMDIoLZ5cdTAwMTPPjjd0nWh+iN2uXHUwMDE3MKGjXHUwMDEz9lx1MDAxYbuDtMVcdTAwMDEgV/xxXHUwMDE38la9Xd1qjlx1MDAxNYWka/9+14ecmF68z/nH8fBMXHUwMDE31S3j8VxcU2bdRrvLu9toPSa6ZubITC3JLntwgkcvT7PMhUfKuqx1odXl0G6w2lx1MDAwM1aGKlxy1CxFJlx1MDAxYoNQYSZi5KxcdTAwMWRuoONElMy4YN6eboVh88TxOdGicpXUzjdcdTAwMDMoXHUwMDFiXHUwMDE2omh3MKi7XHUwMDFiXHUwMDE0S+9cdTAwMGXQwFx1MDAxMqSXc68l3Tq31dbvWKY9wdCD51hj5cPOXHUwMDA1y5TsXHUwMDBih5UysEHwUFxu3o2Hb5nvQoFccoNYUPjydY7Ics2mW1x1MDAwZVhcdTAwMWW6MsBcdTAwMTXguPxpXHUwMDFmwjjcPTxiXHUwMDE44dbmUTTqemt01X2kzMVRK7e++ihjnIVcdTAwMTNcdTAwMTjlXHUwMDA3XHUwMDEzVU08x/yxjsplhzZN4rhcdTAwMTiOWFx1MDAxN0W762rp7j25+LjXXHUwMDAxldpcdTAwMDCQi9Qnn8V4c5fUmtj5S0RsgVBt8F6Al5fALNtcdTAwMWRcdTAwMTl94NhcdTAwMTnIg+ok4WztXCJpOWjF5IFMM1ddy9OLPp9aV1x1MDAwNjlHbHdcdTAwMTEknVx1MDAxYaFXiYZ3XHUwMDFmraAjoU1cdTAwMTJZ9Vx1MDAwNibrwrnl4lxuXCJcZqVfkMxJZenaXHUwMDFktya7KU8pY/1NXHUwMDA158BLusuAM/0jtYZlXHUwMDFkVOdWSKpid+hcdTAwMTJGRVQk8Vx1MDAxZG2LXHUwMDE2UFwi4VxuNFx1MDAxMWOR+Fx1MDAwYj2iSyGcJtZ83lx1MDAxMoKKiG6B6bt2XHUwMDBmfM8sXcbRgVx1MDAxM/SwXHUwMDAxcUXfyJL0s5eDwNdYZSHLadVreVx1MDAxMVx1MDAwNUqdWvpcIqL7ormv0Sf9I8glpnfxYaDxdiZcdTAwMGVBaXNuxFxi+JmSXHUwMDE5epRcdTAwMDdcdTAwMTbwIYPYRy+giVJcdTAwMDQz6rWpXHUwMDA3ZLlWTGuqRFNa0XBcdTAwMThcdTAwMTmmnJfSydygU0uKRCT49bjDpmN0iYZcdTAwMDH2+IrENJjs9X57rqhHm1x1MDAwNdFWz1xisuHJJ1x1MDAxOVP0Olx0UsVcZo96lVx1MDAwNnd0ua/8nch2wTEl0zagXHUwMDE0euKPXHUwMDAzfliVMpo0KbaGWPl1+1x1MDAxNHg/Qby7nlx1MDAwNYRaprxnXHUwMDBmnlx1MDAxMlVcdTAwMWGeQtTAeOjM8KDwS7/afE4hXHUwMDE4lVx1MDAxM6tZ0ej7XGZAXHUwMDAwz8ury/z9XHUwMDAxOzPpXG6ctGM12PR2ul2KiI1cdTAwMWHj1kw6dLrkyiHgNjhcdTAwMTjTNEzOfN1oTsuCZ+BzL8JcdTAwMTCpzHPJXHUwMDAxSkZGReD22DCyL4T4kmRMfGOOpN9RKFNNw+lcdTAwMTkgP/z7Wcrq0XT0XHUwMDFjgymcy7VFzWKgXHUwMDA3trst9OBWbtFEadupQ+FcdTAwMWIyTqlUpovhdfE6S0e0K8+gVrfRt9Une5ZcdTAwMDKOMKlcZibWTqm6kHE66sHbRluOVSTpsVx1MDAxMmLFOPFXYsFPj6f6T76p3LxcZr1cdTAwMWJ6XHUwMDEz1ZSk1zB2q1x1MDAxNlx1MDAxNVx1MDAwNFpcdTAwMDdOXHKO9s/YXHUwMDA1hZvFXFxcdJtivXt1we9J6eKCpjPDqVx1MDAwNIFNRI9gotDFXHUwMDE3N8KSayw5pfxd81x1MDAwNHLWSixkKJJjqlx1MDAxNlx1MDAxZrSbXHUwMDEzzFSvwC/Wglssf7Lzo8cmXHKS1yzPJdbE7jqBuXalmHNbZ1xunDQ31tum8rJGXHUwMDEzqVx1MDAxZSqbrqGwXHUwMDE4JO5cdTAwMWJcYuL1UtPf3MazI2nqclx1MDAxMVx1MDAxNSa+P/LguSmwlY+165C5SC1cdTAwMTF404c2e+ttNXTZJZwstZP1cvIqerBcdTAwMWRcdTAwMDDub92lU0ZcdTAwMDSRXHUwMDExcEE5NdYlfWZ3U4XR4d7koOietVxmvfSJflx1MDAwNEdcdTAwMDFT5espy1ggIf26quzRX0JcdTAwMDP2orBcdTAwMTObQ1x1MDAwNEWb5Vx1MDAwNSv3XHUwMDFjJMHJTVx1MDAxZFxcnHsyiZh3diV0Kn1NnFwibMpH+LRPy5NMczdtOEw7MeJbXHUwMDEzVFxmr4VELiNud8htvE297cp8XHUwMDE0cJgjvHn6avNcdTAwMWOoMzstjlf6XHUwMDAyXHUwMDFiXHUwMDFldTk8XHT2rihcdTAwMTRcdTAwMGVRwIONrM17QFx1MDAwNlxmvVx1MDAxZetcZiFcdTAwMTlcdTAwMDC6XHUwMDE0jaltqHmoxPI6nepcYi2Ey6lcYnTCvlx1MDAxOFx1MDAwMztSXGaRPfe6Y1PWkUphYWBuLl7cJEeLw16IXGJyhkZcdTAwMTlcdTAwMTR2cO9cdTAwMGU7Xud2XHUwMDE57syzYIXQVo9J4lbvXHUwMDE1YDT7XHUwMDE0XHUwMDE1lllgiqptXHJcdTAwMDaAPiR2pu7t5lx1MDAxY1x1MDAwNWSAUUZcdTAwMWRD2bCfhSV7cGRcdTAwMWUg2Fx1MDAxNrrttceIWeTpOVxyi2r2a1ZcdTAwMGU9flx1MDAxOF5t1IPbM3LR6lTbTsTdXHUwMDFlad8h8uZcdTAwMTI1Yf9cYlx1MDAxMpBcdTAwMGVS07FxTLJcdTAwMWHh4jtor51S+sJ38KM2lItFwObrXHUwMDAyxmtcdTAwMTA/7XHMslTUn7vbuM/j6EGflF+bWy9K7GpcIliE8sRJ1n4kuUhb7nRdcoRg+Fx1MDAxZC399uJj8n6rLkQ1gJTksk6gsWDASXmFrUDw0sKqU8AmZFx1MDAwNz3pmcc15S+0vDksvsyBXG5FKFxcXeNbpuRcdTAwMWFLvVx1MDAwMHGMrGVXxfL6XHUwMDFjSHSq4CpSNHnXY1x1MDAxY+wxQm/FudDBzdGfeFx1MDAwN+iS1eE6eyV5kG2rMMOBiS+vlU3VY7xx+6R96MNDRlx1MDAxNaE6eoGY0ztZ8Kt3nS1R4Hz0UVxclZZrnzKxpdD76Yumx5PP8uuLNk43nFDAq4bKsKn9l729XHUwMDA0/JZHO3TwN6dwvJJcdTAwMGZp31x1MDAxNOSut9zgUqGnMHVUj1x1MDAwZkFcdTAwMTbtJHXhcOaaX01cdTAwMDCFXHUwMDE1sb3eXHUwMDAwRrqg9Vx1MDAxM1x1MDAwM4tLM1x1MDAxNyl49ctmYdiMeam99MxPrJk3XHUwMDAyJ1mAT/ThgU5C/2qaclx1MDAwZqlKU6pcdTAwMTK5MC57Y+RcdTAwMThcdTAwMTbSs2hJ9yx9WfJcdTAwMWRcdTAwMGaMXHUwMDBlwFIpXHUwMDEyfKsnXHUwMDBm0bFcdTAwMDLWN1x1MDAxMzrdY0xa7odcdTAwMTbCb8tcdTAwMTdoKJXEfmcuKMtlXHUwMDFjcaZcdTAwMWRcdTAwMGJcdTAwMDCEluvDs2+XWVx0Nlwivb64Npe1scS9XHUwMDA3ffEn91x1MDAwZVx1MDAwMXuuni9cdTAwMTB3II9AVaKUydrlz6N0XuPg31RUZilcdH2/ZqyPT7i/+FV+Jv+mXHUwMDA1ftLqu4pyY3lxVOWy4tkuSXRcclxcMu9A7FxuIciB7/ZIvOX7xPtd1VjzRkdodpeSh95BXu8w/kCfo8Yrq6QtXHUwMDE3XHKko+tanYrnuLhxhIzwXHUwMDAy1cHCgN3e5Ua7XHUwMDA2oitjXHUwMDAzLD3yKiBPr3fwV8O6c2W/ue1ccnzE4mWez1x1MDAxMtf1yyvAOezAWDm+xE03XHJUgY5cdTAwMTfex5HGaU9/kMyCXHUwMDEyUmOSXCJK8NBPquhquqm6K+xZp9LtXHUwMDA1/Fx1MDAxZfv+XHUwMDAwymfmuErMJSbSXHUwMDFmg7+gNi9xN3zDjUm6v9zFXHUwMDA2VnRu2Fx1MDAwNdfmUWovgsgk5d14SpRzbKHtqPlB0srgPlx1MDAxMHMk/ORcdLLXxTi5MlxiXFwwNC2dXHUwMDE1Xj5cdTAwMGWSkWvS9vaAQVx1MDAxMdeOXHUwMDBiXHJwhZ96XHUwMDE2t1x1MDAxYqbH4siz8Yp9K0iTqWC3dbk1ie0so+QztlNcdTAwMDbsKSj2+SNTX/rpXHUwMDAzLmhcdTAwMGWIlHXbZZ25m8mpepJwMfVcbtepempIgUmTXHUwMDExXHUwMDEwodl3UmxBlqCviJaNQbK3vY3axIGDXFwlmkX/XHUwMDEyqZAxYGuIOuvzet/90OIh/e1cdTAwMTHdfL8/+lxiXHUwMDE5KrxYw4eXtJmi+fVIxeBQ3zVW6+vHflGuICpmgsCz+Fx1MDAxNWyzeVmKXHUwMDA3XHUwMDA0JM6pXHUwMDA1+EG67urQzmZcdTAwMTDh3bg9XHRLXHUwMDEwoUDLYlx0XHUwMDAy+F3rV4CZvaqt3IGdydDYgonNTuJM+cx+XHUwMDA1ozphqOd3RYPgSFXl7OJcdTAwMGWTl6KLfvOPu1x1MDAxMer+dUw6aJxcdTAwMWRcdTAwMTQmXCLvgWr4bE3rPlx1MDAxNlx1MDAxZHbLt3RPIYVH9Dkn81o6xb9YQ2jIXHUwMDFlnkZcdTAwMTKHWYWPNlx1MDAxMlxmRVx1MDAxYWbXXHUwMDFhzVBcdTAwMWKEMC5cdTAwMDd8ncvJK3XA4/tmyT6sXHTlh8dpqVejey7aklx1MDAxNVx0sEiT2bW8zSdn2HGIXHUwMDBiPv7I2GTx2i1cdTAwMDeEXHUwMDE4KMTxtprJoXkjuFxyIFGU1inUhDZ+mnrogMS2h6O6tqtbXHUwMDEyZatcdTAwMTPFuL2a8MpsVZbYy46IQVx1MDAwNcIu+Xy5d78+rKfN3evxldxnVu31bp8pXHUwMDE55KZcdTAwMTRO1qxcdTAwMWZBMGInkF5cYi5023lWPe9cdFx1MDAxOYRpiUOusFx1MDAxOd/AbY5cdTAwMGb9i3Df+lSv6EqYxTBppElpTZeEkrxcdTAwMDM8fFx1MDAxZp1It/Nehyk3QJ+Btr0sXHUwMDA3wbNVySu4f8DSRC3NaW1TXHUwMDFmseCqZW3Y0pKa5NRMN/JjhSbojEFgubiWTYB+tGuX1K3/SOVBSdqeP8xcIowk0vat51lZur3kvVx1MDAwM3vOyZ2F91x0evI3N1Eu9sNX06HdXHRJ8FdcdTAwMTaGaPn/Jeo9llx1MDAxZVWahttcdTAwMGJigHdDvHfCM8NcdTAwMWLhvbj6n6f3+51cdTAwMTM96uhoIYqqzLWoylSEXHUwMDAx++FWpMap0zvf0DAmjZpaU9qKXHLI9Vx1MDAwYlx1MDAwYnxdXCLDiyGmVfpcdTAwMTSzefg00dFcdTAwMDZ491x1MDAwMq6CtFx1MDAwNEijfsNR422VSlx1MDAxZfXmXHUwMDE4nEVcdTAwMWJxioXz0WpcIlx1MDAxOTBnXHUwMDAzQ7u7k/L2oZP59ZKg4DkmPOiPIGuIpVx1MDAwMsxcdTAwMTdfUFh3xeJOgt9xwvRcdTAwMTlcdTAwMWbvdHGZ+sKc+XpChZmy1dXL8cKfv/+fuZiIKFx1MDAxM9jA2WJcdTAwMTkpnKKkxVx1MDAxZbzenlx1MDAwNDqKdzx1bkFg5H5ccn19lC3NXHUwMDBm31x1MDAxNZqXuvn7zs07LYLB8VrEV3LaRJ53dtpdW1x1MDAwZbWzXHLkXHUwMDE0fEn3s56IoFx1MDAxN2NcdTAwMDCB2XaxXHUwMDEwUZpcdTAwMTP7711+0Vx1MDAxY2LVp0u2QHKpf2NiT8n1xSpTIdovYnRcdTAwMTlcdTAwMTJucSV3W6lcdTAwMGVAyngmJ65cdTAwMWJBslx0w9qyXHUwMDA3/1Zo99FcdTAwMTn+kk9MV3ZHR9STwTvOoVx1MDAxYpXfgKlj30JN/s1BI1x1MDAwNPl5XHUwMDE3XGZDQszrZojZf8gl+41cdTAwMWYoNLF2XHUwMDAyfcrBXHUwMDFhg8VAaVx1MDAwMl1y7FBJfce1S3XpvJCYxXlccs/ilkM0Klx1MDAxNkrJqGeXmIti7ne8ua+tXHS+2402XHUwMDBiXHUwMDEyY1x1MDAxYrlY8/zvmnqAXHJZVFY6Nlx1MDAxZU+RVeK52ima1+BiXHUwMDA1L0OlgC292lx1MDAwM953uiDGIWMgRzdcdTAwMDZIdimTOPGO8152oo3cXG48XHUwMDBmwPqvx9vfXHUwMDE0eemJ28huuacqW2iMfX3mi5hcdTAwMTJI1v/im5GCLL5D5FDeXHUwMDFmRSd+pf/qoctzKr19v6FdfKzPNuXeV0B9m5crxoAyp9PeUE982k3LTL0/XHUwMDFjZHNcdTAwMGI8w1x1MDAxY+Zcbu+DuvQ8fT0t/I2SLzx1k5EyZD3MO9f+7c9cdTAwMTXpNr4r5WVp3XpCVMicQFx1MDAwZjVcdTAwMGbT5dlcdTAwMDZghS9dwVKdeItcdTAwMDDDJIBcdTAwMWN/x1x1MDAxZJqCanmMd2z93+zn4Fx1MDAwN2voK6v7rPtcZj7Fbtzm0mxfTej1XCLPbvxUrfnfPmFbXHUwMDFloohcdTAwMDK6YFx1MDAxNlx1MDAwNbySSTdiPPnwOfw+vP9cdTAwMWKv35Yl5GtcdTAwMDb315jH4KBcdTAwMWFiu79ZXHUwMDFjXzCLXHUwMDFjcmxcbtRcdTAwMTSH96lpz7c8LS9lfYMziFx1MDAwZXq/3WqvP8iAL1aYXHUwMDFiu1iLkFR5NbQsOpEuIfovXHUwMDE35SHBXHUwMDE55oXuaGFH81fr4DecLI9OLlx1MDAwMMq3xqCqX1x1MDAwN987XHUwMDAzYJ5/z9E/XZRcIpyQRbNcdTAwMTdcdTAwMTKcsFx1MDAxM+TrdTVcdTAwMDJcdTAwMWTKmcDYwn90XHUwMDA00Gze+IBaXHUwMDAxfHl4vYfOOkdjJEPqSZxcdTAwMTlyQajLf8o4Y4KuXHUwMDFlXHUwMDBmfsiiTFx1MDAxNMhzc1x1MDAxM3/71Zx/XXogYHvgXu17+IaTmUd6iTT7q1973YZ6flx1MDAwZppcdTAwMDT+ZnpcdTAwMGJIlra6xT6xr+KJssInl0e2pyqpc41cdTAwMDWk+63ojFx1MDAxNZPKjlpcdTAwMGLX/sWiifM2/lA+bVx1MDAxN6dLR0S9OlwiY0fV0YkmxCmM/vBT6LJYz6GrkIPPvJWCXHUwMDFhiIdcXJyA4XNjenHEhi1fxE5xRoZlhsZcIvpsfn2Mk05viOmnsqKsLoSSXHUwMDFhXqv8MFxmUzNCLziBI1FcZlx1MDAxNpdcdTAwMDKsplx1MDAxZdM4kIzpmOivXHUwMDBiQPo+WURR20+2hlx1MDAwZWRsMM/4pnyaMZGe5S3RXHSoSVx1MDAxOUG2a5+1RzTte1x1MDAwMdtQa0VcdTAwMTFB5MxcdLKOR9r6XHUwMDA22Vx0etWDsa+5NjJxr9208G/sfUb596U80L9mOur87ElcdTAwMDfByMZcdTAwMTKd8r3XREH4iX9cdTAwMDepYDwnXHUwMDFiRFSS+yBwTVrz3TuaOFx1MDAxNVx1MDAwNc10L1x1MDAxZa9lXo3R4fd9pqNzwuth9KnZZFx1MDAwZS69UNRm7yVcdMY286ZfXGaDwFx1MDAwMmJU24Fn3yj931x1MDAxObXjXCKT13JlXHUwMDFjV7slXHUwMDFkYjCI2VxyhHnAjePbZEtcdTAwMTNV7tI4/nnssDC9Lpt5iYBX5ujdJHhcdTAwMDdDcitcdEpcdTAwMWbk2lx1MDAxOY3X98pcdTAwMTS3QsI4SDt3XG5cdTAwMDFcbm6ruJRUYfsyXHUwMDAzKHz/XHUwMDFh+jGEoFfUtFx1MDAxMz9VXHUwMDA2+IDsKu9CiL5uMFx1MDAxYZY1XHUwMDBltcczXHUwMDE2uFx1MDAwMSdJXHUwMDBmXHUwMDA3o1xuWFx1MDAxYTxYJ1x1MDAwZjZ/XHUwMDFiXG6ExOVewHixMlr9XHUwMDA16mFcdTAwMDf6VS3Yh1EvWTF9UZEusjfm5tjaX466Y4WsekJcdTAwMWHlXqvgm8rUKpKQ3fTKylx1MDAxYYPlhNJ4mFJ3XHUwMDA3IE+qvHWuXHUwMDExMVx1MDAwMZjj/XxSky1V5D8wXHUwMDFjhkJfYa2QYXqso1cp9bp7PVKEddh9RVVFTrtcdTAwMDLelS+tXHUwMDExXHUwMDE5+cxcdTAwMDJ8XfU2Lc2f8b3FsWHz7yUtxsrstaWaWGRkjP/O0NyBUPs7XHUwMDFlur/xqm7Jz1x1MDAxNKInUt7ikEvTz73cpHpfzb1dWey6N5/PyfVzOlwi3EJrWeBcdTAwMWWZWZ/QXHJhXHUwMDA3kLRae2LEKVOUXHUwMDE3xPDFtCzHXGZY4t7wgJA1T8tcdTAwMDYrmflnOurHdHiQ6Vx0j/jg2Fx1MDAxZIOxQXueJ1x1MDAwZTBnrnsh2GzASJfJ4EpwXHUwMDFkieuuvj7QbShcdTAwMDKKkZw3s13ccJAkhTGFXHUwMDAxwJXlZmlBulx1MDAxNaF6clps+TTX0TvfXnRcdTAwMDQ74ONw3MAzXHUwMDEwXHUwMDE5xEVvXHUwMDExmVxygvIjciOcXCJcdTAwMDOfZVxu8/qhOejGoCODl5wh/FNcIt1cdTAwMGKzXHUwMDA3cexEUuFQrJ/u/I7rQYOKrr82PaeLclx1MDAwZbpXJ5hF8ZKJukg5fzHMXHUwMDFkW3vEVFx1MDAxOa9+SP774sOW0jj4d1x1MDAxMkBcdKyJWvxiXFydSjD+mNCb9JonxjLI544z++lvb1x1MDAxM9ol25FcdTAwMTl1XHUwMDFiXHUwMDEyTVx1MDAxOOQwXHUwMDE1OStvxlxub14vc2iohzPg81x1MDAwN/0s5Y0qQMqv0Fx1MDAxZEBFXkS8MOTPWauYz2pcdTAwMGL18U2//Fx1MDAwNPs7XHUwMDAzMURQ3e6shGo911x1MDAxN1x1MDAxOVx0XHUwMDAywPFlKodmgltcdTAwMTlOXHUwMDFkuqh6ezHKtzRrSntcdTAwMDTNXGJcIkzAmufWdW5XRo6eT8Rhga41Xlx1MDAwNHUprEdTQ5dcdTAwMWHTnklyusaDfVbhW5Hfr1NMSnhcdTAwMDaZVDa21H+qboDYtNSw8Vx1MDAxZUZcdTAwMTF6edmaTCtG04tcdKDIVMLXLVx1MDAxNVx1MDAxZVx1MDAwZlx1MDAxM1x1MDAxZUxoXHUwMDEwXHUwMDBlTU3EjCZSuUqFYlx1MDAxY1x1MDAxOfJDkpvpO+NgQZboXHUwMDEyLFJYN6li4/dcdTAwMGZjN22RvvQxfy1cXKNjXG5zp7KAhMFTXHUwMDE32Fxys27qr5taN2jAyJAh/PbEtaFcdTAwMTPEXHUwMDA1umJl7IHDXHRcdTAwMTGyb2w+WFx1MDAwZqraw19cdTAwMTUywc7++GK4XHUwMDA1MKFcdTAwMTR0V1x1MDAxYpNBlITt217r1pe0YFx1MDAxOSN06cX5ndFcdTAwMTeiXHUwMDBiXHUwMDAxjmV4sOmtXHUwMDE5wk5cdTAwMTHr9ptKXHUwMDFmit9jNEjpa/CaXHUwMDFitths9tZcbrUtqkK2Lv3/+C1A5Zgr0rpjXG5lsGvfr2WL1ko/9Fx1MDAwNSZcdTAwMDVnXHUwMDEwYybRgKpcdTAwMDNSv7hcdTAwMGVcbqatNomO3kSDOk65JKcg/p3NSL7cvm2hUWJbf+Tquehvnk9cdTAwMDdDYiNndD7f8Fx1MDAwZaHtsyFcZujoMFj5rzyEJEX2+TqoXCLjRbUt3ZtmO+hcdTAwMDdj9cf2XHUwMDFldNbQNXz1rDy6XHUwMDE1YfydXHUwMDFlN2G558hyISSqZDlOiV1cdTAwMDVxRVx1MDAwYl92lpP9MmI5KkS8Yvf74vdcdTAwMWax9FxmuJIlXFy8Yn3ARjW9+euWa/FcdTAwMWQup5PCONkgXHUwMDE2KuJcYkvbsf8hXHUwMDEyO65cdTAwMGaCy1wiPd3Vdt9Ozibsq8b6Nlm/65tiUFx1MDAxOabf+oiV3KlfUFx1MDAwZcTzMolcdTAwMGJUJ6t3XHUwMDEyhX98+fLIXlj6nVK/qnqa62xo9U49qUZdZJbyupOWasGAkiHTQV9FXHUwMDBlXHUwMDE2cFhcdTAwMDFcdTAwMTHYd+43ejBbcVBhXGKvSdWb5Guz9lHUZ7+U2o76OZHxQ1xcgFx1MDAwMSxFXHUwMDAwW93fopiY3Vx1MDAwM/SZXHUwMDE4kIv0U6PXXHUwMDAw3N9cdTAwMDHsXHUwMDEwhkdzrYZQaclX6XF5hkFcdTAwMDTLoKCetVxyXlx1MDAxZFx1MDAwMySH/VauK1x1MDAwN6iZgclbXHUwMDE0cmxhTbGThrekwFx1MDAwNeWNRMDMXHUwMDFj3rBcdTAwMTDTL4+idTPHmVv7McwgepnAdUrSvVRxa4RcdTAwMTBJpOCUMFx1MDAxYa7bZ5+lo1WBooRcdTAwMGVcdTAwMTXS+e469VFcdTAwMWa+XHUwMDA1v3h3XHUwMDBlYp1cdTAwMTjE4KLL8HF7l/99uiCPf6qcW1x1MDAxMZd9XHUwMDFhdmruYlx1MDAxMb5wTKJuv+sjzf/2XHUwMDEx5WIp0/tzSvRv95BcdTAwMDT8rZktmFx1MDAwNqTvbWC+440o4U5rLcrbsrXtXHUwMDE3vO+s0aOcy1x1MDAxN0FcdTAwMGbNPJWkX2C7XHUwMDFl+WMs4t3wtfT3kyyH5Fx1MDAwM019WqC8QTzLX+SjNlxyIP8qXHUwMDA3XHSH3rSTXHUwMDA0MNh5vKE6NnKDg1JcdTAwMDJBtWBqzdpWJVuIqOvM2e2Y8YbHMCeiX6myaPdId1x1MDAwMO6kyGFrMVjM4UtIdeI8PvlrgkXlRNRcdTAwMTmFe+CmunRl50bhNTFAJExKJoTxsooq7Vx1MDAwYlx1MDAwMJz5NSk2tMaj12TX0Fx1MDAxOY7t8Vx1MDAxYzJBlFxu5tL8lG+UiJx87fOmXdjfjFx1MDAwMN08lM/gMm9s9mfRm0faKy5cdTAwMTOS7OeIX3sqjs+VdvPClu543UhGgN9cdTAwMTOWmN6EjNSWXHUwMDFmeijMUmluy7czp1x1MDAxY79PZTVNfdV9jUxcdTAwMWSj4s25yL6TkCvQXdIw0Yg7I7NcdTAwMDCbXHUwMDExJ3SfXyZcdTAwMGI7I/vjw3vvyMqMYTJcdTAwMTdzffLo5PsthmJOiFx1MDAxY5k/ySxmg4+b/Vx1MDAwMYzE5CZjXFy3XHUwMDExXHUwMDE1fLXDXHUwMDEwjVJIWJgpNDFQ+ZUv5VKaYerYjncsqY7x8dIgZ19G2LMsXHKRZlxyYtInJFaKetbQOVx1MDAxZVxmXHUwMDBlXHUwMDA1ZVF8dvxcdTAwMWWXN+hDh+nXXHUwMDFjzNLAY3tcXDKgWFx1MDAxN9nz+1x1MDAwNe1cdTAwMDbHXHUwMDE5tP47t2hcXLVsXjbT8b5xXHUwMDFiPmMkmMFcdTAwMWOHclVcdTAwMDfbXHUwMDBmht5cdTAwMDfPp2JKq/rqpVoxVvzxxjToXHUwMDFj9tiYxdC6v/Mkwlx1MDAxNjM9Ps6PcKvjXHUwMDFhfIUtWKB3TVBcYvbT4qtcdTAwMWRz/C8uXHUwMDAygaFL5SxAqtRcdTAwMDX+oNX4JW1hSvNcdTAwMTBNXVx1MDAwMpfzq6hcdTAwMWab/MpB8PE/2C9ML0NcXI9yhVx1MDAwNpS8seFcdTAwMTHQ37ohsWDvPFxcXHUwMDA10etyXvjV+J4sfybPY/VcdTAwMWI7pVZcdTAwMTJqo84waFx1MDAxNXTxr3e5dJxPcCQ/ZKLrpz8jXHRcdTAwMDJm8lx1MDAwM8VHcsVcdTAwMTacjGJAvVR+XHUwMDE2zp4+a4YqKrfM5jOvXHUwMDFmmlx1MDAxMVI+XHUwMDFhom+p63dnXHUwMDE0eOecI11OWTfwQnhLXHUwMDA2XHUwMDFi1nbtiaf//T7HK1lNrWDrY+uA/82VvrVcdTAwMDUgZKkzxu552HdeaKww28KW8pM9XG7PMyiKeklcdTAwMGVcdTAwMDZ7XHUwMDE26f2TokWaJzaKblx1MDAwMFxifqmh2msuqqeNIKIggMFieGZ4aTR46Ge0XHUwMDAw83SCtdl1pEtxhErKn9Heh3zWXHUwMDAw9WxjXHUwMDAySlx1MDAxMLZcdFxy+kGPXXBcclxcyXC2XHUwMDEzgdgzXHUwMDBlc9MrzsiBvqbW43/1Xunt+lx1MDAwNuxcdTAwMDZT6YrA/T75vdaUrItlau2ezvFyXHUwMDE4QEmPXGZbZlx1MDAwMrVcdKFuXHUwMDEyq5lcdTAwMDOTXHUwMDE2XHUwMDE0uVxydVovcVMpdfyRmlx1MDAxNmhcdTAwMDCN+2zV5OqaR37Ku/JcdTAwMDKF8npbu/BB82myMiSioWRcdTAwMTKzUEVpcO1cdTAwMDN5JqZ623hcdTAwMWSQojpq2EFcdTAwMDO2gye9XHUwMDBirOzsKp2p+Vx1MDAxMDFcdTAwMDMw12LFXHUwMDAzg37RZZZCXHUwMDEyjzCxl0tcdTAwMTFHz8+wclx1MDAxN1x1MDAwZVx1MDAxZv/2yF99S7ovyW7FzFx1MDAxNOqm4aw7gCiwpNPj/zvvXHUwMDFmYOxVyLvFrCBzXHUwMDE5gHYulCaTJUW+wUGW3vX091x1MDAxMlWpXHUwMDE4oiOzxZKJXHUwMDAxXHUwMDA1wVpcdTAwMTE0RyrPfY/ThPZcdTAwMWUrZUOwS4pcdTAwMDRH7lx1MDAxYypNoIzq03SI1bTJ059CObCvUz46RVNcdTAwMDYn34dcct9TJt0yxlx1MDAxZlYsK3583b+Rk1xyXHUwMDFkf4W3rJ1hXFxccj01duJcdTAwMWTyqSdnK3P89vCGX8CEsaN44casjYpcdTAwMGZ//ueW2lZmVpZCRq+oXHUwMDE1IULA+lxupMeMukXIXHUwMDFibHlcdTAwMTM/IIc2ms9cdTAwMTFRXCLmepHbXHUwMDA3ZaPvjfQkbmCdXHUwMDAw/orWgWCy5+WNnH3PxzpcXIUqgSyaIaJcdTAwMDRFOKKI9lx1MDAxZUTi0p9K6kVPttbbzNDfz7ftqDBcblx1MDAwNVk11lx1MDAxNCylY3yT9u7ljaaeXCKhRijIrCpf5dj00LQ/XHUwMDAyRseolpBWhdcrKE2OSsfwhtD4adiN/inoyCbbe5dvu1x1MDAxOFx1MDAwMOTlXHUwMDAzXHUwMDA2ZiGd0ZHc2PjIXHUwMDE3q2gnVErrXHUwMDBmt1x1MDAxZUTxt8riU1wiXHUwMDFme+7JmmKIRz375e+tY1xiL1x1MDAxNMW21lx1MDAwNDLqL0ZalmNcZsAu9Vx1MDAwNafWPspAMGBcdTAwMDJcdTAwMTNcZvGJKitPec5cdTAwMWF+XHJcdTAwMTLuXHUwMDEwXCI/wetkYFx1MDAxOK2qx7NcdTAwMDYxXlK9z7NWXHKY2edMYKye4z+OfVx1MDAxZt8mpaDsRml8nlZCSrm8YMgpLVnBmk3KXHUwMDE5XHSKJqrfpFx1MDAwN1xm9C+iPGD1pOPPg1jqY1WbP1oswi+db6t+vec1eYaP/5X/3regkVxy1WNRh4IlQfX8XHUwMDE5XHQywy6E9fs45PtsUetcdTAwMWPlNq0k31x1MDAxMUEgS69bQZtpTbdCbZdt7dGWXHUwMDEwOjKOYCs6e9NuiWDTPUygQc5cdTAwMWFjXHUwMDA2x/mS86WgeSnE2Owu0yllxf47it9cdTAwMTIw/cFkbIdcXOlcXJ1fXHUwMDE1x6DcXHUwMDAwMuivXHUwMDBlknb9/vlcdTAwMGXIWFwiMp1EbHzjO+W6u99cdTAwMTL0XHSYQLTI38WnP9uHvsMx3nmun34+sT6RrW41oVx1MDAxMMetozJdXHUwMDAz0VxyqPa0VsjjyVnuvl9ice2+RvlcdTAwMGIlRvCHzLasfy5cdTAwMTKE3iwuW+JrwrBcdTAwMDBYXHUwMDE4XHLxmFx1MDAwMJdcdTAwMWKKXHUwMDE19OA926DErilGXHUwMDEwLvmMQJmIpEh0cVm6fVx1MDAwNPjYvklcdTAwMTH67n1WieTdYZW+XHReyoD9NIBGf4t0++orRX/NQWunSyBcdTAwMDSFdyR7a1x1MDAwNVx1MDAwYm/w45T04MZcdTAwMTCUSdzRVWMs/OfEXc1cdTAwMTfzdSrWyGyqoVx1MDAxZqz7rVx1MDAxNsk0LDQw37WHTVx1MDAwZYzMXHUwMDA1JWH5cfRcdTAwMTJSOLybPSE+sEWbXdHmlsokSddw1pGA6uZcdTAwMWQwJa5iNahyr88n9Fx1MDAxZVx0QKs0NtJcdTAwMDd3Q/mmjMLZTt9PXHUwMDAyr5zVi214Vb6qXHUwMDFlLDjDpnRcdTAwMTBcdTAwMTSuaTYhxVx1MDAwMvCvllx1MDAxMJx8fSfs5TRFmVx1MDAwNc5sP5VfxXDSj/rYtVV/lsUpi6HE09VcdTAwMTRcdTAwMTdcdTAwMWPtyq3PvZ2RuDpBzySFliddXHUwMDBlXHT+/KZzUVOmXHUwMDAwLnpcdTAwMTNFp2SHrmuMXGJV6TJcIqZcdTAwMWOiXHUwMDBmXHUwMDE4fFx1MDAxMTH72/OTtMGMZVx1MDAwMYhlRVlNXHUwMDE1eXX5QiZcdTAwMWKng1x1MDAwNHngvMhHiFfsqFwisIdRKJZcdTAwMDTRKHKof2djq1Pq1TJGtuRHhMLzkVvBZlxcM7NcdTAwMTRLWFx1MDAwMmpCTq+pXHUwMDFl1Fx1MDAwM1aCcuLJ8CnYVoFBbpt3XaJkerf8fvbmZFx1MDAxMMf5Qrw1+KuwLIW7ROz4gfFqeaNPpyeBlv0qOk2Pj1x1MDAxNCCf6eW+eydMSdlfLtk78UdiIX9cdTAwMDJI5+nJQ3h2rKlcbknb8OVcdTAwMWTcrs1USq7gmqtcdTAwMTKSTOxjXf27dk6JsHy+6r7viMSIWENJWuIgQtZAcc2pPJLWc35x72g2Xlx1MDAxNt9cdTAwMDVvdFbVTKIkiY1cdTAwMDbZKkdcdTAwMWGWXHUwMDEx3tstXHUwMDFhVFxmTORaXHUwMDAylYg9W1x1MDAxMtVcdTAwMDU4m55cdTAwMWPNiM3JN/Mq7aFDSzLzpZBwP4H/Svh7/Z40K+ouojBcdTAwMWPtJ2i9X0qW+EOPXGLjuIThin/HYG1p7ZFeXHUwMDFiXHUwMDE4YdP0OvjyXGa0qX81XHUwMDBmUc2v8MNcdTAwMWNki+Ws/qGhzlx1MDAxYz/C0MbYXHUwMDAxMntNu/O7iHtcdTAwMDWVu5VcdTAwMDZcdTAwMDSkQ+WIOFx1MDAxOErIPO75XGY1joi7rovgXHUwMDBlnPhnraJPtGfBJ0pcdTAwMTF/N5jOZGijTorgdGlcZvXktOLnm2LkP1x1MDAxZqRcXP9cblx1MDAxND9Hg0PU6FS6XHUwMDBisvVMhCWmzN5KWGf8hfFl/rUjxLtFXHJlXHUwMDEzh7FtyjPFY9qQUn4jR1JLm352d17gXHUwMDE3gTU75q5mXHRcdTAwMWac9mQ89OdeZDPQZ0pcdTAwMTlcYi1CXHUwMDA2c21XzrnvtfuYK1xyIXWQXCIscVx1MDAxZG+STPmxt3ivyv2k5Fx1MDAwYqFcdTAwMTK+s1x1MDAwNjL3vOiIelx1MDAwMtorhdK44+TJ4pBRXHUwMDAxZj/onrHrwuyclDZutU1cdTAwMDRrhlkwXCLxvW46Y0kyN5NcdTAwMTRLy6SFXHUwMDFiXHUwMDAw0Zz8XHUwMDE5n9RsiVx1MDAxN6JOSmn+9kdcXI9cdTAwMDHEiYDF/tvY1kc7XHUwMDAyRF/Z48nymVx0XG4mR1x1MDAxZVx1MDAxMlx1MDAwNktqSYApVy7xnNq/vUFm0k0lSW7tspJxXHUwMDBiIJnSSOSm+iei4Vx1MDAxMOFK5DdcdTAwMWSrXHUwMDE5XCJlJ6Fdv1x1MDAxYn4leY2R/Cbl0Lr6d5vvN6/9TLFnOMx54v0sgyg3N1x1MDAwZto8zl7RgJDzU8eV5fvPzV9ChtR6jLxRa0FCblx1MDAwMlbellTpzUVgtvOmTpQ/R9xcdTAwMDW66ZdyQeZ9kLRWZV4+/POBIFx1MDAxMlP8OmeSQFx1MDAxMHie12HYLTOHZy+Bf1Ilwsp5V16CdkT3cdaDzFx1MDAwZvPKTqrvavaRXHRfwv1dyY59LHh5XHUwMDA3viufuTnfs1x1MDAwMbBcXO1fnX6yxFx1MDAxM5d7UrJ+tVxiXu5cdTAwMWZ7wtFLgubablxytLxWXHUwMDFkON1cdTAwMTg479zmp7pcdTAwMTlJ9MjI3HJS8Fx1MDAxZVx1MDAwMk5yWblV7JcgppiNJVSzO8C4xj5cdTAwMTTPuGv4XHUwMDE3LyVnr5nEeN3Nk/TeXGKhOYuKepZB2nNcdFvmdyRTXHUwMDE17eGSXHUwMDFlKj87XHUwMDAwbob13buT2fNcYiP3W/RcXGlcdTAwMDNUeOeVdy4/TLVYe9uZK+rpc1x1MDAxYqtloYRBPq/0mSHn/v1cdNPT7IPGXHUwMDE0XHUwMDAyuLjWf+/Bhyxpo8Ssvytz18K81Pu5ip3bPFx1MDAwNu+MjFxmx0FcdTAwMTdsxW1H+E2Nx0lcdTAwMDJcdTAwMWTOXHUwMDEy3zPfjMaHXf7QiW1x0r6xqMqvXHUwMDFke8WoILnTos1cdTAwMDcwV6eLVf9cdTAwMWGonIt1XHUwMDFj6nB3paZWvVx1MDAxZVVCLydFx6FBXHUwMDE383CB/Ti9aGFcZl1cdTAwMTFcdTAwMDLr3lxcK6lcZlfMXHUwMDFko2c+R2cg9MpcdTAwMTSi6WdEYOu5eF3eqS1b16lcbttfMECr81x1MDAxN802e1KQx9WsXHUwMDA0LTWHtHnwciOiXHUwMDEwi8j/sqVcdTAwMDFntv9wl0U8z7swyMaN+kLXtdSOfa5w0M3qXHUwMDA0XHUwMDA0mmPtOn5nj1x1MDAxNmvrPvV137HNmM07spxCpFxy9/N3d1x1MDAwYj/FUl5KpLro7W9GprHrriZcIkKB0CmDS9uC8/F/9c7AlDbg+J2s0yCU/r1cdTAwMDFtKcw4I5yvzak1QCYhdVx1MDAwMoOmXHUwMDAzXHUwMDAz9ufiXHUwMDA1xsNnQFxuhf7JqFx1MDAwNdesjZKqxzE0QXxcdTAwMDNcdTAwMDA/QFm7otip+v1cdTAwMDYmYGhAPE6u6Xf3XHJcdTAwMWEqxrv67WObO1xuMLmQ10hmrqWgL/YgV5cj8MtlauJcdTAwMDKq9n1jRJWEcpmPaZCF19NwVYKRUNmuUWI5gmOir5dcdTAwMDfjmdhD6OdCrOefUzdDwJCRXrJbVl5gaqyOVVx1MDAxMdVcblx1MDAxMJmEZ1xiKGt5XHUwMDFlXHUwMDEyS8a4XCLKqzZcdTAwMWKyL0snv8A0rsv4XVxmLlWCLChYslx1MDAwZkUuO110wEopq1x1MDAxNVmcMenLNTZXPu1cdTAwMDZmNKlwXHUwMDE02+29hPSE3+bln+3gkDY2Wqf++NqT1Dd9XHSM+2tcbjdcdTAwMDBXvvHVppu/yFx1MDAwNTE7L7JcXD5oJnPzvjDzs/9s/OuQVjxl0lx1MDAxMHM4aa+AJtraesY4WbklLrm/XHUwMDBmJsYkXGZcdTAwMGJfSFx1MDAxYtRy92n682GE5dBcdTAwMDEkZCXA2Fv/XHJcYkXLXCJZvqImxPLEgdlHRMTX3Vx1MDAxNvXfeKm+iGekllx1MDAxMMeaeNPvXHL/61LYolx1MDAxNlxm2Tvieq1cdTAwMWN6Vv8oXHUwMDEzfmNcIpRcdTAwMTnDRE8++MZcdP+oWVx1MDAwNDpSXHUwMDFhrWRcdTAwMTc3XHUwMDA27/P7pSZClY40mDWKXHUwMDA2f9ijrlx1MDAwNVXy9peTXHUwMDA1SFx1MDAxMt98/IiUXHUwMDBiOdj04/uO0tCM+yHaZVx1MDAwN7/jTbJcdTAwMDEmXHUwMDE5wjgqysB3ztJDnVtcdTAwMThurFx1MDAwZYidXHUwMDA1l1xizWZcdTAwMWF75VSvaSF/UIav5/izY9rVYVx1MDAxOCNcIsbvpLPmiTEn7l1tXG7n39qkJVxcMTv7SXZ8XHUwMDFjy1x1MDAxY1x1MDAxMDOzybL+L+VY/lx1MDAwZltcbsFcdTAwMTKiR1GOQ6d9OTPjfFx1MDAwNrPr23O66LNgUzGNVlx1MDAwNlx1MDAxY+l8YUZcdTAwMGaaiZun/7+mePedi1GZfbVcdTAwMDbAp2d+t9BKwPe19i6WSDH0keg0RIbEgXFcdTAwMDLvsMBcdTAwMTezRN1cdTAwMTPqqKdcdTAwMDN7XHUwMDAzYfvmIKqYn91cdTAwMWErQVWKxDTSTSe8+WSWr0z5e4GCQPv0V5rZ0+2zPvRcbut/+8znzEbM+qnrqVGJiOqAXHUwMDE42+MwerC2MkqRRGo155Vnblx1MDAxMVI94Fx1MDAwZjkyaVx1MDAxZNTXpoStWjLw56QvsEBRMNHg2GPa2OPSp2yKRNg4uVCKrVhcdTAwMDN4/Fx0NFXBNsTrbcLyXHUwMDE29LFcdTAwMDdcdTAwMTBmboNcdTAwMDNcdTAwMGJcdTAwMWLSjYFHu6JAbmKKT51y7cFcdTAwMTZ5NOJ2xqDBKFx1MDAwMI70SVx1MDAxOaFjveG9XHUwMDE1x2R/djbY38b/zoJcdTAwMDb/XHUwMDEyMSSfyXWWX5istbGK8olcdTAwMThcdTAwMWQ54J/PN3g9s8ZAgXdcdTAwMThtXHUwMDFmqvJYP8DwuIot6DqDIWP/XdJcZvhM+c79ijGJblx1MDAxYvuI6LWyjoxFTfT7bm5dhFxmrCys6vhm6e3kRK3N2kTc9MZcdTAwMTC4XG77/YiiwlKujN4zw2pUOrV64SWjjfn0uV6dXHUwMDAwsNYrMkh1NsWhsDrfkVx1MDAwMzNinDj7ePMtnlx1MDAwNpRbwHT/y2xBqTnIXHUwMDEzzqVbW1x1MDAwMPXq5r2w8bBzXHUwMDAyONs5wkBcdTAwMDZs59x7hnJcdTAwMWXVPKDqucjvXVwiLlx1MDAxM5d9NI/U51x1MDAwZctcdTAwMWLajp206WojKY9xnZp3ryG9jiemv1x1MDAwNpMlhlx1MDAwMzLLUJ5R/lx1MDAwM36K7tFcdTAwMWRcdTAwMTI+XGJcdTAwMDZnXGYxZGJreMZcZo3DkLQz1MhcdTAwMTP1stQvwoJbXHUwMDA3XeFcdTAwMDWPgf3fXHUwMDE5LuHTZJ1cdTAwMTjv6T5cdTAwMWJcdDYo5t5cdTAwMDaIlJqg312D+zBcYrSrSJdkclxcaFdD0Fx1MDAxOZVuwGfLi+G3qvBY7lx1MDAxOGihjFx1MDAxNdzuXHUwMDBmd5q7pcmeS0rZi51KJD7G1VxyeKhcdTAwMTZJ8SqG1MMvZe9Zn0+YhvtpSIyO/1x1MDAwNeu+iYz1w5sksJ5cdTAwMTVhnGNEdN/XI/RfMTFcdTAwMDRQYC3GXHUwMDFjlE+8YZ+srp1Nu1x1MDAxZO3PnVx1MDAwM307SyG37YZ6o7NDIKD4kGQ73/nRw9cs6kyn6j4sXHUwMDE3XHUwMDFhdyZoP/Oyflxmwshcblx1MDAxM3U727wqOlx1MDAxZWCgXHUwMDA1X+edXHUwMDExXHUwMDFmgTnDJlx1MDAwNk10ZeumLEtcdTAwMDCCg6SEs2LS/tVtarJw8CnrZ5hcdTAwMWLqLoyjPcCskszsw71cdTAwMTE5XHUwMDBiqqbTXHUwMDE5QdswW1xifYRnjq5WPPPbUqFf4q9cdTAwMTFCXHUwMDAwINhcdFxcMXBcdTAwMDNcdTAwMTl311x1MDAxNteWw+T1KbRGQ8lQqqw6/feiMNxcdTAwMTGedVx1MDAwNXzUxHrObFx1MDAxYyp+XHUwMDE1SVx1MDAxM29Go9858/uw/GWsq4ugQav7+aiQmHJtPp98Wlx1MDAxN9U7w+OpuT8+XHRcdTAwMTmsXFw22TBcZlx1MDAwM89J7Kv+8EhSslx1MDAxZas8QWyk79Ur5mBOofqNXHUwMDE4eLyiiVxcWX5cYuR+wk+tXHUwMDEzO5NcdTAwMGamozZcdTAwMWalvJY5cKLNO1ory2g95v08LoWW7l1cYlxmJml8hMJcdTAwMDRRZFx1MDAxMNxcdTAwMWKjKlx1MDAxYkmM8vCAza6n5Pj5tWV+7I1BWTWBi+BcdTAwMTWFXHUwMDBiwFx1MDAwMdkuXHUwMDBlZ/C53t1cdTAwMTn3aFrki1x1MDAwNMRTvFx1MDAxNCDit6WdcFx1MDAxNuNmh1x1MDAxY85cYlCf7/GMXHUwMDE1S4shiotcdTAwMTBcdTAwMWNcdEVcdTAwMDE+6H+9PubwZEZHqcVcdTAwMDC6s+8vMj6Y8HWjrv9iIERcdTAwMTFcdTAwMTVaZERcbuBcbvXZ3WKbQyRx0TrDXHUwMDE489Vd6GyVZrJytEBpoPksKa5LxVx1MDAwM6hcdTAwMTWmwGAuX5XU+8ewY1H3wU1qTuidfOeQx5h4XCJAd3PJNT8p2/qup9Bwwcat/Vx1MDAxZMHtXHUwMDAyXlx1MDAxNYzw80bbXHUwMDFlLM+E73M5TsNLnbV3SrJa3qpxqTnCnlxcsUI9XHQ3R33kgyTOXHUwMDFjXHUwMDExt3zyYlx1MDAxNntcdTAwMDHLrCmhJ9v8heTkXHUwMDEzWCz1XHUwMDBlmDkrkp2Q7oN148BzN2A3uvCmNlx1MDAwNWSuQypxXHUwMDEyXG7n3ccyK9iAh+GWXHUwMDE4XHUwMDA02+im00R5ds9E0a2+Y4iozFx1MDAwMU4j3EKcXHUwMDA2KX/IXHUwMDA3YftxXHUwMDE0Ku7jM+iahVx1MDAxN+vo4I6/t2t1XHUwMDE3XHL/2Fx0yamLXG5AXGJfP0NhU/08UJG7Y7BbXHUwMDFjtP9cdTAwMTEt4vgmXHUwMDExkfmAy+SRbFx1MDAwYi/43KmzU7fwVO/cOlx1MDAwNNnCUcHR6plcdTAwMWFB2zS+j/cjoFx1MDAwN6pcdM0/sf1J0Dl2XHUwMDAyi0wmzPEw/t7cuIOHXHUwMDExqymPbePAJfywcFx1MDAxOERMnLyOPnqrUc474cd5+9nfgse8s0d8v0P2T0+Wua1/f65cdTAwMTE+M1xm/lx1MDAwNkb9qcLnXpBdu9LyXHUwMDEzsvTktS8oUZhjxm1qrVx1MDAxY3BgXGbo+VbNoVx1MDAxMOKA11x1MDAxZHiHtVaXu0hoXHUwMDEzXHUwMDExqZHCiGHnXCL06evM1IwpiktcdTAwMTdgyHdNXHUwMDAz8PiaLFx1MDAxNFx1MDAwN/PLIOElfdu1MbptXHUwMDFl6/P2XHUwMDE5e1x1MDAwMdlcbtGrjv23XHUwMDE36Jfa4Vx1MDAxNow/ibdkXHUwMDBif92CXHUwMDE1QcSl0564c1c7XHUwMDFibms+a6fxflFcdTAwMTKUXHUwMDExxpxcYqUhXFyyjFH2vlx1MDAxMzqi/TxcdTAwMGJ6z6Nev7U3mZEhkCkrJdxcdTAwMTI+izOcdTZMM1ab6f7evduqx4iJduyzv1x1MDAwMT3vXHUwMDE5csRkU9GquVx1MDAxNf6d8ThbwOLyJ0x2jeI+XGZcdTAwMGJ06+6F+9BcdTAwMTjrz49jJilgsZpBNDkzXHUwMDAw4Db1m6xcIrCutTOoQT8grOdnPlx1MDAxNZiuzrUp4Vx1MDAwN3RMXHUwMDFmisCazpFuXHUwMDA3/L1Zv5ZNhFx1MDAxOf9GOVxiMiynhYKzXVwiz/Um19qgXHUwMDBl/72z7aJPb15xxVx1MDAwNG5VW0f6hbPGXbuiv1x1MDAxYao0ZHS8vmu3Xs6BqXfmf1DdsLg1poq78fXfXGKN+zlcdTAwMDW7hoHjMVx1MDAxZFx1MDAwM1x1MDAxZbhcdTAwMDe0pjDqXHUwMDFiuZuNL1H2m46BnPaTgUlcdTAwMDPSXGahz5BC4lx1MDAxNSTyjFwie1wigDbG50im47qaXHUwMDE5zEHXO3ZcYmuPYLzRpMm7MMdcdTAwMGX4nlx1MDAxMlJdXHUwMDBiU1xycGXE3rdaN1x1MDAwM/L6kVx1MDAxNONTlHJcdTAwMTPObK9cIm5ccqrTXHUwMDEyYrmUyVS3UPJcIlx1MDAxOFx1MDAwMbZM+s7T01x1MDAxNVx1MDAwMJ8tf1x1MDAxN7X3XFzRh6mXi5uaUC3VmylcZoxZtm97b8b5jVx1MDAwN1x1MDAxNd03Qn/ej2ZcdTAwMDFtKe108LpcdTAwMTmfxJjCslx1MDAxZc2kXHUwMDEw6r/5Y8lcZnLYwYFwcFx1MDAwYk9Es6fXNFx1MDAxZlx1MDAxZj7x7llC+DfIY6ylnycoh41oReP5O4Sgw5cj+2ssZG1cdTAwMTm0YFxie5X0MqJhf+pcdTAwMDdcImRcdTAwMTGafj3nq//1xlx1MDAxYb5UXHUwMDFmwHBJajTvXHUwMDE4t3ExXHUwMDE4NKXfXG5Pp4DFXG4kUFx1MDAwMiGLv+no21x1MDAwZUubUiaQ5Vx1MDAwZvBcdTAwMWVcdTAwMTQ/elx1MDAxZLDyq5be8SCWY1x1MDAxYz2oiO2guDyPd1Ql1lhcdTAwMWRrXHUwMDE1/bTJuIXsnqpcdTAwMGWkPtH7bGC4aodcdTAwMTNgOpa+fjAuYrE4SVwi699cdTAwMDBWPnb7rVJcZr+/4ZgnltF0tdHI9C6e2vhcXMzrLy9fJYWn5ZUhVaAyw6K6M1x1MDAxMUeSKPBwlNne06u9zD1VdXRx5uvJxlx1MDAxNlxucftq9v1cdTAwMWImWZRiM99cdTAwMDOUeojPXHUwMDA2glxy+FLRWEvsflx1MDAwN63MMk6+ZsNcdTAwMTmVvcbMONhcdTAwMWL0t1x1MDAxZbzh+Z1hrJqW4T1cdTAwMTRLsvY0tFxm/Ypd7spcdTAwMTD8Y+DaYXV3NandK0Iny77Q/+rfhITB6VNS/CT961vJ1lIt5/t1xi8r/Fx1MDAxMN9TOcFzXHUwMDAzXHKFfVx1MDAxOGvkR6n8z1KxXHUwMDFkb1x1MDAxOFx1MDAxMlx1MDAxM0tS0lx1MDAxNsvsgPZioTRcdTAwMWVIXHUwMDEy04uQ6nVcdTAwMTFHRJO/XqLC2OalXHUwMDBinfRd2Vx1MDAxZVx1MDAxM7fX3T6hy7WJxt5Qar1cdTAwMTLDK2A5O7dcdTAwMDUtS9Pn++awXHUwMDE1xcRcdTAwMDLJf56RLs+eqPXVPVxiMbcnIbEv/3JbXHUwMDFhY7+QK0m8k2FcdTAwMDdQIFx1MDAxYVx1MDAxZFxuRmBaL3OGrv3iQ4DP6uv29kc8kVEnXHUwMDE2f4dnXG5Gw1x1MDAwYtklXHUwMDE4b1x1MDAxYSGk7lx1MDAxZFx1MDAxN4TrX89cdTAwMTlcdTAwMTKY5a1sOHiFXVx1MDAxZlHIW+5cdTAwMTLQZ4xcYvpcdTAwMWJLUEubbY5xRmdcdTAwMDdVkFT/XZxZp1x1MDAwMYlMjsKDSl/mw1/qts5PueBccr25zkuiSzFcIs07XHUwMDE31UCROt3CJLmVL/71Nlx1MDAxMbHdXHUwMDE15DtcdTAwMWWIM2S/vUB0wUJcdTAwMDGjv200pF/cVS6Nr5CtQnBcdTAwMTmfpvK4JWDHwuS536Wb8z5cdTAwMWa5XHUwMDE5XHUwMDAy+IWdrZrCIVx1MDAwMfReSozwulxyXHUwMDE3ITnp4jZfWVx1MDAxZDaG4Vx1MDAxOMb1P2zwKuRHvnE9dCF/53xcdTAwMTD2SrHP71xcrPdY+FU3L12C4tHEhqTY6+dcdTAwMTHCt9xVx1x1MDAwM9kqfMn8fe/VmZvcReQuqLeUXHUwMDFktaslzuq5acRlb0NSqT1GXHUwMDE4YCNcdTAwMDN7XHUwMDBiPKr8XHUwMDE5Jfs9wKh4M3rupFOuXHUwMDE5SyywbE97tFxydVxycKb5e3+syr4+srW1jl0yxz8kOD2+XHUwMDAxj2xBZvSLQcNXzLyIqW9pNCxcdTAwMDP+1lxiXCL9Yiz+UU9YbIFLlVLw+Vx1MDAxY8HEfY2XyZLxsqk1Jt61i/Aja8a7Wo1lOtdeW/+Pf7SFxkRRY7JcZsFcdTAwMWFcdTAwMWZJVHZ4jYTp5DJ21sFYqlc1XHUwMDAzKZR+ZlLxXHUwMDBir91yYCDuKmrUXHUwMDAyq2TrUbb7Jnju91dt41x1MDAxOIcvOHPKXHUwMDA2/Z9qrKA6qVx1MDAwMJqB4bSf+KqN71Ne0DjEr6SYXTyS8GChNDCu+CYuduvQYdTRa5OpXHUwMDEwXltGkuhGbuO7g9iFXHUwMDA0XyAmyC2OrtMrXHJcdTAwMTT8JagtPNzX5DtcdTAwMDOpMoBcdTAwMTX1XG7O429fNNZFwIDsbjOyn89pXHUwMDE2qVx1MDAxNO1WK1gqXHUwMDE1bMxCRm5cdTAwMDekiFx1MDAxNN9kXFxK2qeMflkoRbjxbz/6U2vGRvGyuiC6qJMtcNK904T0f/Xo/+ook1x1MDAxMFx1MDAwZlPm6IIqevVcdTAwMGZLpzct+zOeK9PvVee6XHUwMDE3rHUgvWuP1+l5XHUwMDAzx1x1MDAxN5oxrTJcdTAwMTP1N1x1MDAxNTE2eMlcdTAwMDK5Y9+goMSPmFx1MDAxYy5RkJM2pDRcdTAwMTdcdTAwMTFcdTAwMWPdhrxs9U10OynSjoPRqr4mmPZcbkea1DWhS5fr2cqHO9CPloFcdTAwMTK4XHUwMDEyjJ5cdTAwMTHrXHUwMDE4Yo4qcYpNQVx1MDAxZI+KtmAnTFx1MDAxZm7YjtAgm1x1MDAxNa9iXHUwMDBl/OIsiVx1MDAxOFx1MDAwMHbud/tJ5b+6c+3LTcGrzmuG3/zFV1x1MDAwNpzUadDT3yjrom15+PT5XlxiNCtHQuZcdTAwMWbqq621cC1JXHUwMDAwxKv7SmFPLVx1MDAwZnvlujtAILdf3eLUyXSWXHUwMDE5JZFVulONXHUwMDE0RmVS94g2z6za6GbQiqQnpn+9bN2Shc0w3nNDQ/ZmXHUwMDFlXHUwMDE0XHScz1mWebij6zvIXHUwMDFmXHUwMDBmXHRGhHNcdTAwMTVcbpMx57xcdTAwMWRsXGJcdTAwMTie0q+Fc/CUXHUwMDA272VpwcVcXNyqg27z6q30XFxbXHUwMDEwhcXMXHUwMDExeT7b90I3XHUwMDAymG1cdTAwMDQwsi96eFx1MDAxM7nxMFUn6vk3+IRlqFJh0HxesipJXHUwMDEzPrZ2XHUwMDE4oCumylximosooHaRWXRnblFIQL/GPFx1MDAxNG16ZWZB5Jyj6flMjoC/SStcdTAwMDV5yKzV1Dxutf9cdTAwMDRcdTAwMWZcdTAwMWFcZpxcdTAwMTfEY5SZXle1dX6VKPKZrd7+Wlx1MDAwNiEvf81pXHUwMDA0kSTi+0mKVslcdTAwMDWc/Vx1MDAxZODcdcC/PkJcdTAwMWa5Wo9RlFx1MDAxYt54QVx1MDAxYldKSPRcdTAwMThcdTAwMTb9tzeQd1x1MDAxMmNHblx1MDAwNSheV2KUYv9uXHUwMDA1cPegcvNmSzjvXHUwMDE3YeJt5YykQs4jhvFjN9LmfsDh41x1MDAxOU7dNEaJdYq2Nfj8JlxmzF9D5TZ/v1x1MDAxMkpcdTAwMTIytDdbICbQXHUwMDFjOcUuff9cdTAwMDMoWN17y1x1MDAxZL5cdTAwMGLa6eKizb7qvsJccmNPbzKHurxov1x1MDAwMpJRm9i6rXtaY1x0znnRaLajMlx1MDAwN2FcdTAwMTR/daQuTMhQTzowO6WoXHUwMDE4XHUwMDAzYsl53zPVUcurXHUwMDFj7ZBsKFx1MDAwZqu0qsuqRH5f0S9OXHUwMDFiXHUwMDA3he5Y8Vx1MDAwYn6dfVvsJySwkmmvXHUwMDA1sDW5zLNcdTAwMTVcbsjT3Fx1MDAxNEWmjcO5mpI4XHUwMDE3wG3gJFPqz25cdTAwMTRcdTAwMWRcdTAwMDWc/TFcdTAwMWL7aMhcdTAwMWN05E9cdTAwMGWJKtg4wyhcdTAwMTIhlS+tXHUwMDA313BcdTAwMDKHvINcdMUmXHUwMDE2XHUwMDE1IW1sXCJuardcdTAwMTBcYoyfiTdD5Fx1MDAwZd9s9iRcZrTmMrlcdTAwMWO7bpZV4KW3wFx1MDAxNZN8LTFcdTAwMTD0a8hTPLbq31x1MDAxN8BNolJ9XHUwMDE1XHUwMDA30+CHl0JcdTAwMTUjg3pQn6JcXFx1MDAwZrLHu4Sb6CCtbOG3mIVcdTAwMTG2epJcdTAwMTVdfCjfnS9wXHT+1z+Qo+FLuGLV1qJcdTAwMWGAqDHYmfAmXGJgXG5cXIaEXHJcdTAwMTi+l35cdTAwMDC4r1x1MDAxZOe/pFx1MDAxNrBcZlx1MDAxNp1zdYum/PEyub5fvcL1XHUwMDA0XHUwMDAy3IdvNk3zK2SJWC+7gLBcdTAwMTLaZ6VThqWG4ySTX/BcdTAwMDJvfH6H2YQ4XHUwMDA2XHUwMDEznF+Q/Vx1MDAxNT+i00Uxzkc/2lx1MDAwZrXEci1rJMhcdTAwMGKmXGJcdTAwMTVly1wicV7RXHUwMDE3mOokjUxcdTAwMDAoXCItdZfmTMlPrVx1MDAxN1wiRkCSjrlyxFxyaHrvbHg/v//rp0mYoszwLUI9WkP1XHUwMDE3t0THfeLbjH9cZlhXLIRcdTAwMDD0mJ4o1upcdTAwMTHveqWqfbJcdTAwMDBcZu5qgp8+q3akyzFOXyYn6G1VuHWcT5HQTbuwXHUwMDExLtnda4td2UN/LVx1MDAxZeFyXHUwMDA2+4jt0U5wun1giCjs6lx1MDAwN7BG7EhIJj38ZVFFWEvDw1x1MDAwYpNxaOdY5MIvheRldlx1MDAwNfHL2oStXHUwMDE3YCfeT5VcdTAwMDY7XHUwMDE3hlxmumT7gjCFxbImXHUwMDAx8rm7MyfbxfrUPImfzVx1MDAxNJCawbn2XHUwMDFm6nNcdTAwMTh/LWlXp8g7I/xcbv1cdTAwMWXLXHUwMDE5ccct11GhiWHOjkmN8M0kdO7uM1TVpXVcIrmIlJfDXHUwMDEwRlx1MDAwYlx1MDAxMFx1MDAxNq3tmlx1MDAwN8KvgVxiluNcdTAwMTImxF/wLfdUXHUwMDA3vTqga9JccsHp41x1MDAwYlx1MDAxNsqaN7o0zULsJKRh6Fx1MDAxY7jnZ4CK/MzoNk9o7Vx1MDAxNTRPO3Lo/H1cdTAwMDXM27VcdTAwMTBcdTAwMWLJvzPKgv5pQWxcdTAwMTZcInav2Z2B+D5cdTAwMTQnXHUwMDE4r3tcdTAwMTd+au1ccqfs3lx1MDAxMD9NbrD5eFx1MDAxZi9vXGZkgY4ve1xc0lrDgrx1LZrsXHJk6/uHn1x1MDAxMUlJa1x1MDAwNl6J4mztXHUwMDE2wM/5XWOxhjCTMqO05TFEiDK2ZEuF31xuuFx1MDAwMLEtWddcdTAwMTKWXHUwMDE4YSZsOFxu6On1uU6TXHUwMDFiXHLEIJ/4Z1x1MDAxZc69vS6RNCqkk+lM2X//plx1MDAxOeOT9KrqsZGGOetfr1x1MDAwNqf+yd5Oslx1MDAxNK/jwaY11Vx1MDAxNkiHVEQmXHUwMDE4XHUwMDExRsNcdTAwMTI/dW/CSFx1MDAxNsdq+Vx1MDAxYVxyXHUwMDAzekxQVaNcdTAwMTls7jRR8GZcdTAwMGV7xqS7XHUwMDE26Fx1MDAwMoq9VKMgjVx1MDAwNElq1UpcdTAwMDKTS7/mnF89UdI9XHUwMDE5rqs0gJZcdTAwMDRcdTAwMDFY+uyqXHUwMDA07N+buVx1MDAxY3VzzVx1MDAxMFx1MDAxNU/WgJRwf1aD9cDur1x1MDAwN2fFNb5ywZni6W8ug5NFdEq9eKfoNyckT7i9+Sv8siv4V9sr6phcbjrQzMhLk+9tT1x1MDAwYpxcdTAwMDDg/ohRVOyFUsxcdTAwMWPSoyx5XHUwMDFh/6tcdTAwMGYsXFy8XHUwMDAys3nNXHUwMDExl8/TIPtu1XTD7CqUwV6ihlx1MDAxNLiAfNMnRv+rXHUwMDBi5MXjSv7CUjPQ0MHZXHUwMDFk++I7nMSKgv5oXHUwMDA1yKyh4z5Xbr8jmnZcdTAwMWaiZ1x1MDAxZlSefy59Mbtcblx1MDAwMVx1MDAxYnXMZOFsLHV94i6/yGnKXGZPKFx1MDAwMq7BTco1lYt871x1MDAxNybMvFx1MDAxMWmC+Zi2JYhbRfB0MP6dXHUwMDBiVWnWnD7zfpmNs7tKZqghpsT4bl+gc49cdTAwMDK3XCJp0n4s5llJU8BXayNccmif712GsDqIL1xmbpKYZsa/3nuG6H+M56++9Vx1MDAwNclcdTAwMTF71Krwd4aiUscz7VSWjitgKVx1MDAxY0HJkEnnckZuc1xmr1xyZpYl3Vx1MDAxObko806vs0aEO/68+v8957KmXHUwMDEwXHUwMDEyhlwih5m2N1x1MDAxZT3nUcadO7/58s7AV1xcvNPocNZ9b2Hn2yg2mtIsx5IpTrJaXHUwMDAwef+OzsHBcmNZgkAvX/FcdTAwMDMv/+ppO3hcdTAwMTW3XHUwMDFkeOb/6vhcdTAwMDBD+mBewfV6KTylZdlcdTAwMTe5j3VyaVx1MDAwZVZxYEM9Qpe+MznuXHT+yU5cdTAwMWKp0pLVl670dzNsWepPKNs23VVZw2LsQDFcYqDviELrIVx1MDAxNvREXHUwMDA0XHUwMDFk4eCe+rj/9aV7Niee70Izelx1MDAwZtviz1x1MDAxZVHNrU/zvexcdTAwMWZcdTAwMDBG2POhsr++XHUwMDAw8yZcdTAwMTBcdTAwMTmDc2u3oXWgs52Vblxyr1x1MDAxM+JeRtpcdTAwMDaTXHUwMDFmMqRcdTAwMDRze7CXsGogqSToX90oaFxyl1t/2Hb/fHi4tIzdk2sxQpL2XHUwMDBlXHUwMDA03iCKzq5TTlx1MDAwN4yrXG5cXH1cdTAwMWVv5fe/sZvKXHUwMDA2MKtOunBHXHTdvlx1MDAxN6evzfxEhF1cZovtb+3qSNjk4D2AlPtuWFx1MDAwM9ND5OuH3yqk9Fx1MDAwNO9j3VJQXHUwMDA2nZt6qHRoxVx1MDAxYrK5P1ZccuJF03Y1Jp4tou9dySW1s19rVFl9aekhxm5cdTAwMTK42uZnXGJcdTAwMGJo1quuTJBzXHUwMDFkq7tEXHUwMDEyctvnTFx1MDAwNGnnjcP4XHUwMDFiyP6eW02sRjhcdTAwMTheg9DfXHUwMDFm4yFo6tuGXHUwMDA0rKtcdTAwMDaWXHUwMDA2OVx1MDAxN25cdTAwMWTTR8QsXHUwMDFm3ikjNFx1MDAxMoEjrf/VMz9cdTAwMTWlpKHJ97mGtHXdV/p3xjcnhXbW5Vx1MDAwNEn3MVky4WBdXHUwMDE2Puu6vzpTc1KGd1xuXCJzquMr9NdrXWL8Vm9cdTAwMDFBXHUwMDAw9bP+UZAsfDkoo86EPnK1UL+h4ClH7p+/kvtcdTAwMWJTXHUwMDBlXG5cdTAwMTWqqXUmXHUwMDBmyStcdTAwMDGRXHUwMDExrv1WSUua+2VcdTAwMWLd6FxyZKZcdTAwMDLC0I79XHUwMDEznILh9f/OJiCY8Dhtylx1MDAxZtstMr901rl3bmgu/3kvXHUwMDEz+lNcdTAwMWT200fN80I5Zs590su2KML/iyPsXGZYlStx//qVWpRCZdKNXHUwMDAyXHUwMDFhXHUwMDE358Hs/TxAzLq9aP/2hVxiVpppZVx1MDAxM1x1MDAxMst8V0FNnlx1MDAwMEmAUy7bPZDu379fMctSnEOMiEtRPpCvV2uViFxiXHUwMDBmmsn2YMmf/lx1MDAxNkA1VpBcdTAwMDJOk1xcMD+/yVpWcEq9XGZcdTAwMGZ95Vennl+YsZwwfmdvW1x1MDAwMFx1MDAxNl73PT71xXzyoJJ7znOE7yRah0Xm6lx1MDAxY6sg82lcdTAwMWKOvnr+Mf7m/jnqy/aD2Vx1MDAwYldcXGxsarlcdTAwMTmUTeVcZsNe+Fx0eEo54TDEwOyemDFuk8RNUVx1MDAxM/Sxhlx1MDAxYepgXHUwMDFhXp7kzZG7mpnt+GbNcFVhx+jH7ZtfVFx1MDAxMcC8MrRcdTAwMDS9z1x1MDAxNJt5VVx1MDAwMehXP6zVyzrVJ2A+ZKZVX1x1MDAxM+mJPsxw0nlYM3WAXYEhyVO/f1x1MDAxZIXuXHUwMDBiXG435jNcdTAwMWPi11x1MDAxM7wo7ffILIKVctVcdTAwMTTD9/FanSGbWFx1MDAxNeRQbsVBsNFOQJ9ZmLFeNte9+MZSJ5X1M8f77WN3v4+g38dFZTlcdTAwMDFcdTAwMWQxKohFXHUwMDE5X8lkXHUwMDA2yIo9XHTEt6RW4mAvQUqSyO8zxs71SVx1MDAwYvy0Z5vWWXtccjeZqo5ZI/HDXHUwMDFmfVpuJZtZLXyd56NcdTAwMWFcImY3LKu6XHUwMDEzPa++w4rPkXfKmnRQXHUwMDEztPFJ/5vdY4dpcLo+deSg7zRcdTAwMDVYSv5cdTAwMTH+3u9UXFxsuidwPylcdTAwMTJgrL/qOLGTPtJaa5icrc+I8Zj/q9tfXHUwMDAx21x1MDAwYsXfLbcyz1rZNivcVa6kXHUwMDFlK6ti6Vx1MDAxYjYvMMyt5she+7FzTFx1MDAwM6xixvVX9qNcdTAwMTdRKVH6zFx1MDAwZYqhpsK/XFwgXHK2K3VNXHUwMDBi+ymJrbKhO1u1MXehjFx1MDAxOKX9jb8j4M6lTlxumsJcdTAwMDc6Q4fsNnXiSVxma8L6/5Ah6axYfbxfQ2T3MVD/zrJlnOpcbonySlKdj/9+O1x1MDAwMt+0Q1x1MDAxOVmii+jV689R4IXkUqD1tSbBefp8YFx1MDAxM8D1UeaOSTNWXHUwMDA3lkM49tPar8xrXGLtx1VcdTAwMDJcdTAwMTLRXHUwMDFjXHUwMDFkJEjjt/FttFx1MDAwNFTJLVx1MDAxMnBgcK3QwM66xfaD1y+48p+rS9v9291kdrJhXHUwMDFiYXltklx1MDAwNfWvhyvaIKlcdTAwMWRa029iu1x1MDAwNKQsysDU6TDomlx1MDAwM1x1MDAwZUGFzrm6bVx1MDAwZZXGPz+tavlenFx1MDAwZjUrXHUwMDAxcL1Op1xizY5v+C96OG5v1CUr9nLFjv01lDbKOYqF+FwizkHBsGOOMShcdTAwMDcrKYVQZZ9gXHUwMDA121MpXHUwMDAwzFx1MDAxMMXI3OJcdTAwMDBcdTAwMGJw0GOOUFx1MDAwNYHtY1x1MDAxNpCJq6hCjlqULKGA0vbexCg6rcfFxMD2MnOzXHKiPPE903l0Y0hvvFx1MDAxMeerPsb8nVlhL/riq0/yI1xij5VcdTAwMWaYz9jQw4zULpjQd0Zv/KjtXHUwMDExXHUwMDE1PbtGLNVi5O37criEN3JcdTAwMTc7PFpXXVNcdTAwMWRp5C6Ru8mBXHUwMDAyR+Vt0jRlQFx1MDAwNWsw4VXUKqaisFx1MDAwYnZcdTAwMGUk4Vx1MDAxMTNNsI92RpcqhpHoZmLdvtA8r4xcdTAwMTjQgaT41jT5XHUwMDBmYFxinVCnT/yusP9X1nnsOMwtR3jvpzDullx1MDAwNpiTd8xBzGLeMWeKOVx1MDAwMffdzflccnhjXHUwMDAxs1x1MDAxOIhDXHR9uqvqk4aHb1xiTDaNkPrOlPlRJUZcdTAwMDWu+1x1MDAxOHSokP1cdLB+s1x1MDAwNFx1MDAxMzNcdTAwMWEo11ahXHUwMDAwXHUwMDAxJDm9XHUwMDA1V1x1MDAwZrExI2OdWo80U89cdTAwMWU3SqC/bsGIy1x1MDAxZDdeXHUwMDExXHUwMDAyNdRlOFx1MDAwNb1lKnruvNaQZltcdTAwMDN4I1xm5kc7uOa2ol4vtIwpXHUwMDAyn05BODSvN9rkqrZwqN1OQ1SWrubfXHUwMDBld8ZcdTAwMWLvQFx1MDAxZChcclx1MDAxYm8x5GSQNDX7lWmr+d6E4004x3ZccmvkXHUwMDE1T5UuXHUwMDBiSVx1MDAwZuXLh3rHLnVAZpJyM0w5z1x1MDAwNLqD8oo7wbkkp1x1MDAxMYRcdTAwMDZJXHT4ZLBcdTAwMDQ7mLXigsXJS2TBe69pbiBnU8fGVzxM3EfzgyoqtlXm1OGhjLhcdTAwMWafmOI2Jc/G3oh/71x1MDAxN+trXHUwMDE1+8NcdTAwMDCJS0lcdTAwMDPkT1x1MDAxZYhcdTAwMTA2RkGBconQ0lx1MDAwM0jkzdr76r7ucZCeXHUwMDE5XVx1MDAwM2y1/omBbVxuy3dcdTAwMDZcdTAwMTeC0jdcdTAwMGawPcfqYVxyk9BcZoeh85lcdTAwMTWH8Km/veDF1LlGm5D/rlx1MDAxNdV9eyiigDPq6o7sWLgpXHUwMDBi3MZwz2Qx8F9LXHUwMDFi96H4SjErXHUwMDBiK2N8/Vx1MDAxY/bvXFxcdHRjKVx1MDAwMptccqOT8vuqW5v186vWpZRcdTAwMWRcdTAwMTZcdTAwMTbCq3Ka5qcr3OchI1x1MDAxZWzrNWIsX7X9wLdtwfNZ/kNXsZLsRL++0YLlWO5rXHLehY5cdTAwMTmSXHUwMDBmxc1xwZfYiWVfXlx1MDAxN1x1MDAwMIG0oMCmXHUwMDE4eoCYd4zur15cdTAwMDOjJKJWXHUwMDAxnZ1cdTAwMDJqcjPFvVx1MDAwZVStXHUwMDFjfrXo0GghZVxuJslcdTAwMDDRO1x1MDAwMFl7QHQoqoEltufOgudaviNoql9+2FQ67LmQjMTEgyBcdTAwMDSOlFx1MDAwMcYlVjN6LJ2BSZ3uJyuVi7aUXHUwMDAwKnuuUaVcZi+JmfDjXHUwMDE30Vx1MDAxNM5cdTAwMWHuKFx1MDAxMY6qduJaviUh4UrOZ+bEMpDRXHUwMDBi34BcdTAwMTZp1CdZXGbCtbZKoDFS+JlLWWI2iVFLlmdcZlx1MDAxN5PTXHUwMDAxZSen8Fx1MDAwZb9yXHUwMDAz/iZZh1wiTb9cdTAwMWHySFxy0Fx1MDAxNFwiWCxcdTAwMWM078Q8bb1cdTAwMTNcdTAwMTayXHJs/KHqa1x1MDAwYoNU7sVcdTAwMGI2VH5xv1vO+Vx1MDAwNXlqR1x1MDAxMmZOOz48MHt4NFx0i42K2iSoPFx1MDAxY1x1MDAwNlx1MDAxMNmF8bfK3LH90PkrgFTVXHUwMDExTP6WPOFZgPm80uErUVxyr232WcOGNYe1c9pcdTAwMDQ33JdccvY5PInGXGY58zBcdTAwMTWkhMpzNWvH21x1MDAxMbhcdTAwMDPmgramXHUwMDE15i4y1lx1MDAxNVVcXPFcdTAwMDBcdTAwMTg0q9dcdTAwMWSUpOvUtJq0TZtcdJJt7lx1MDAxZJ5SXHTfbKnhbbnKXHLKU1x1MDAxZKRQgjb2XCI7QWm5Z25cdTAwMDRcdTAwMTmxR51cdTAwMTnRVbbYOsxG2qmjS6hcdTAwMWRsXHUwMDE4v5jbK5fBXHUwMDE5tou1e6HzMPAhXHUwMDAyJ0ktXHUwMDA02ZuqXHUwMDBihltDscTHcKXgkFx1MDAxY2FgalhYwVx1MDAxOVx1MDAxZFx1MDAwYs/Kg81cdTAwMGagz+JcdTAwMTOtWyDaXHUwMDE511qOXGbE93WYn2BULFXVmZBftaloZVx1MDAxNzJZQl7+sFxmtmK9uSQ3mmWznVk9z41cclCENEa6zMKCxMTT51x1MDAwZnXQhFxcoFtcdTAwMDVTLUrRmj46j3jwm1x1MDAxZrJcdTAwMTKhXHUwMDE01mDea19jsnxU+5j0r6RFX1x1MDAxNGdcdTAwMTWp2pK6JeT4hOcuO3jQra7uM9vVYbpjwlx1MDAwN65f4ZJcXL3zeXqlXHRVXHUwMDBl2Vxy3dVcdTAwMWW6SLTAlOuzXGJrv3+0nyr1/lxunEnypuffsttqy7Opg7ebV1vVXHUwMDA3w59PK5Zj4lxyTTaWXr9cdTAwMTG9XHUwMDAxPc1g0tdJ7PJ4XCLE2EBC+33kbzhTY9yRp79cdTAwMDdRLlx1MDAwMk77qsg3cWUlx9HqPKq+2puontyfrm43suZcdTAwMWRFfSmLU7D5XHUwMDEzQEJaalx1MDAxMfClpf4lIOhcbthcdTAwMWbTXHUwMDE3XCLjslx1MDAxZVxmx3fWdvNcdTAwMDBcdTAwMWTRxqKMeVx1MDAxN13seJMuMCHwXHUwMDEzz2+ZIMFTpDObcMbU0Zh1XGZYYJBxdMCHYLVpktRUXG5byNuWWV5cdTAwMWTiuZNQtIFt5KA1x1x1MDAwM8mdlqpcdTAwMTS581xuXHUwMDEz4yd0iTvMOvFcdMNsXHUwMDFmZkRmsls3fKM9ZIhrPztVj3VcdFxc5mNcdTAwMTYvXHUwMDE4Olx1MDAwMpCQ8cdNQ1x0XHUwMDE0111cdTAwMTRIpFxm6XNuTUJKclx1MDAwZmKjNTBcdTAwMThyXHUwMDFkSPqw7VxmXHUwMDE2oG88XHUwMDEwOsu0XHUwMDA3rbiY/ztcdTAwMGJvyFx1MDAxM7Lph3XAdSBcdTAwMTbPLDRcdTAwMGW9ML9jWMR76OLU7reZe6SpXGJMP3WwXHUwMDE4YfB3Z1x1MDAwNY9cdTAwMTdYc4XB39nqedNP7pIs0I567ItkomvWjtdkI0JcdTAwMTQnulxc6JyGMiCH9b6I33Psv1x1MDAxOPG+XHUwMDE0lLE1cVx1MDAxNb+fPOBpXHUwMDExgMrRU6tcdTAwMWM0Yvnx93VOXHUwMDA20+1xXFyLK+DN/7W2UHLymVx1MDAxNVdcdTAwMTkqPzl8OWzWPVcpw1dcdTAwMWRqxSl917njloLcjUiKtFx1MDAxNC32LaaURTOAt8t7MK15XHUwMDE2hSRcdTAwMGZcdTAwMDN2glx1MDAwMEMqJHvVcNjVe1FRXFxeoU1qj9lKs9z5svhkIYhkWvDjyMaI2ZE8XHUwMDAwV0Yk9bWpXHUwMDA141x1MDAwMkrE9duXs1v344dYpyH7N5HH/qyBjp7SPzDPz/bKlKJUqO2BXHUwMDFl59Kzi1x1MDAxZSZOvpUgJr1xXHUwMDFk+DZcdTAwMWXfcbGcOp3hXHUwMDExmjxIT8n9Q8frdeswUP7AV47mn+NaX2l/4PhLXHUwMDA19lx1MDAwM+5SNVx1MDAwMUU5XHUwMDE0Pa/ot3ZBe+N3mVx1MDAwMjBcdTAwMTF2fJ4g0evQ2aa8sadcdTAwMDRcdTAwMGVcdTAwMDXgUVx1MDAxZW1LdNv1+EUpd41xVuZgUqbdRkrMXHUwMDE2K5tFm1x1MDAwZVGwXHUwMDBlmlx1MDAxM8+Uz57GtCnwXHUwMDA3WzJcYmNcdTAwMTjf/vDbSDyf+uAlZ7auUScu9Y5/XHUwMDAyQIVOXHUwMDBiMTtQ6TEzX5ytXHUwMDAy7MHfYr/zXHUwMDFmiTvDXHUwMDE51ERCTC0l2lBcdEFJN4XoXGbSKvdFc9WM+cp/SzqWxumBSIXV5/JJhE/kOnbmdz+gZT1+51GIrPh8OVx1MDAwND5kgHaAdM2gw4Vebfzru0qve+Lz6i7l+pCm9d9vXFzmJlx1MDAxZVg374VccnIm3M8gjD1cdTAwMWGRr2TKjFxcybZFXHTRJ99JbkhcdTAwMDCgKPC+7Vx1MDAxYj9Y4Ka9x3NAMVx1MDAwMEzs9sddQvZcXONcdTAwMDHO+bmY1VJZP363pZa+31Qnd1SLXHUwMDBi9t+tdl6ujbyqdWkqwr5cdTAwMTlcdTAwMDdhoDRvUFnnslx1MDAxZfhcdTAwMTOJpyernE/jV+NTU5dcdTAwMTS4XHUwMDFjW4a1VWOhlT6JnFx1MDAxN7Nvq17MgVidXZFPcSRcdTAwMTlOo2L9fZfsMLtcdTAwMDG2XHUwMDE4dWGnzOyvXHUwMDBibFx1MDAwZamf7cI7jGts2Vx1MDAxYTLjVfBKoJ6A/WPgXHUwMDEyqT+wxmKJ5K9lXHUwMDFkcSsy+59ZXHUwMDE2dO9eXHUwMDBizOdcdTAwMWW7NzNnXHUwMDE1/P3wcdBsRKl4V88vSlNLjf5cdLKmxluNlda/oeAsZq8km/t0XHUwMDAwvVx1MDAxYaDpINhcdTAwMTPcY4E/Ys3XvCeAnNixksNm+nFPXHUwMDE4rYMg+onh9KPHXHUwMDAzXHUwMDE51Vx1MDAwNXSH+XieLFx1MDAwMqlUgV5+XHUwMDAy991cdTAwMDeGp9jPN0CGKGpcdTAwMTh2sP11UUhUcC2dcnTjvM2s3GpvyVx1MDAxNcqFe9644bltQ1x1MDAxN1x1MDAxY8FdVmOBX8VrwzzMxVx1MDAxNfXySit/glx1MDAwZSyXxei0447xLjpOaJnqck7Cr84h8ZG7mH5cdTAwMTFcdTAwMWVH6XFcdTAwMTfqNF9cdTAwMDD2432acHxcdTAwMDNm9jus+l5cdTAwMWToO8POgVxmXHUwMDFmXHUwMDFhX+O4aoVvw1x1MDAwNnaye59f9q1TQDFcIn1v9W2TgEO+OnLFZ3fQ3oFNgrn3xUmP9XHoUXVcdTAwMWIwMlxcyIu5P1x1MDAwMIK3itCzpuLn3Ly9SsN2+Hfc/YBcdTAwMTn403VcdTAwMGZrXHUwMDE4/aRbkMTc3+TqXHUwMDFiuOWEnHxKXHUwMDExmlxmhvmuUSG/Snlo4pBcdTAwMTTX4lx1MDAwMizCfDdvXHUwMDFl1+9cdTAwMDe2X7Zz0z6AQlx1MDAwNXc4zMm2+OXCaHxS+bBcdTAwMDStXHUwMDBlXHUwMDFmXHUwMDEyYUHJOzidXGZANEKFIMlt+ebibVx1MDAxZIWiXd5V9SaK8Gq5SedcdTAwMTE30JL7PVx1MDAxZiizxXQhX3pWR89Fmt8hyJZLs7RgUEOyl79vI4C2bJbppTJcdTAwMGJWXHUwMDA2OMdcdTAwMDCmMW2Ha1msjPtf3G9cdTAwMWGKyZho3nL1zTdcdTAwMTC/2DKolKT03YdAV1x1MDAxY8Gr+lx1MDAxNvjcuWWNtLw6Zfo4JVx1MDAwYqBcdTAwMDGeN9VEXHUwMDE5aJxdZFx1MDAxZpFccvm7uvT1if5cdHvWulx1MDAwMW1cIlxmXHUwMDFkXHUwMDE1XHUwMDE3r1x1MDAxMlx1MDAxNKB6XHUwMDAzP3jq7u1jNlwiYsZcdTAwMWJWrKqgXyR7z09cdTAwMWTfWslcdTAwMGbctDlcdTAwMWPykTAhXlx1MDAxMdBgiPv7R0+PenurSVx1MDAxMnorXHUwMDA35PZ/le+r4yOLkIpcdTAwMThUq1x1MDAxYqXkVCzpJFx1MDAxMZRsxIODXHUwMDBiXHUwMDBmxlJUXHKQ83VuZrBDXWL0J6z1RKv9+Hkoucb8ILlYI5aM4Euh3ZBoXHUwMDA2OzLDXGJ4mlwi2+SgV19PUOpcZjJTfXCNNphlbOGwY4nHk/NcdTAwMDFFu5taXCJcclx1MDAxN3EkeCFcbpTduSNcdTAwMWEj2CktyvhSyjO1TcRbuqA0mW1+OX+Rt+isOlx1MDAxZcLtspbPidKgJCNfXG7jtPtnqlx1MDAxZptcdTAwMGa3XHUwMDE1jDflaaHp7VpkXGJksOBsM9/SXHUwMDAxXHUwMDFkXCIsXHUwMDE5W4/vqjl255t9Q66XYq0xfaBcdTAwMWZJZfO+m/tAU2Pht1x1MDAxM8RUeFqrLzO8a35nkm7Y30Z5c8rP6FGmcVKO2Fx1MDAwMaNOpWLMypCHfjJKPWXaI8D3w1hEz3eD63ipT4DfjLgktblZgJVe3eryPc83j8FcdTAwMTO4UNTXQ4RyVWJXw11k7VRAQXPJk1xyVj5cdTAwMTJuv7/W2TNcblI9qqCIKlx1MDAxYpC8Vu2wXGa8WYJKic/6Wlx1MDAxYbZFOlxcTL5HjNFzQIL8sYnwjHPCLmFcdTAwMWRcdTAwMGXlqHzGXHUwMDBl4rqqj/b+ylx1MDAxM8VcdTAwMDVmJvtcdTAwMTlapuhK9lXYReiE7tPj8q1z5lxm4q1cbpB8KEBR16XxXHUwMDE5MSPN/r12hsAk5zHJoifjiE4vN5ZoobyszuopTFmlaqZn70BG8ZMjXHUwMDFi0zH3LaDKcvBPXHUwMDFh7lphQNxcdTAwMGVZx1x1MDAxZJaYkmA57UH/8GOW3em/Te9cdTAwMTMz0Fx1MDAwZqhcdTAwMGaZU3U4elx1MDAwZVx1MDAxOWtmiOXipsZa2nLO591QkIVeXHUwMDEy8CPufvUrYlxm7WVcdTAwMTe4JqpcdTAwMTY+b1x1MDAwZVxuXHUwMDFl0qk+9PdcdTAwMTmD0cJZv3hu/1x1MDAxY1+oWPCM2lx1MDAxMoJcdTAwMDHJXHUwMDBm7P5Ti/avXHUwMDE2e5q041x1MDAwNU7jPF3yO+uaXHUwMDA2XHUwMDFl7fXmy1wiXGZQzWR34Vx1MDAwM3udXHUwMDFi+aLRWJt/ITKFYzQzKWrwcV9OXT/O55VKSrA3Qd7nVpB8klja43WyeypmXdxkgEFBrfey1lx1MDAwMKlXjz1IvElQ2Fx1MDAxOTjGXHUwMDE4R25tXHUwMDAx0Fx1MDAxOEtNva1AeSad0rzAXHUwMDA1U8OGS1x1MDAwNpZ2tbDnXHUwMDAy2C9cdTAwMTNs0fuLQHJW9LvQXHUwMDAyXHUwMDEzo4WvJLXAluzeQFx1MDAxYk5+XHUwMDA3XHUwMDAzIVx1MDAxNfTGXHUwMDA3gEm/XHJcdTAwMTNNZDf8b03QkT5vym1gZ98gjViLufUkg0bmaVN4XHUwMDE1mKCEXHUwMDA0waPP+GN518ZIlla3yMe52a9cdTAwMWRcdTAwMWFbcfpMSUBcdTAwMTFGXHUwMDAxlK1damZfXHUwMDFm9I1gu5q+XHUwMDE0RLTlT/9yejwtVS9oUmtmXHUwMDE1T87f8HOAXHUwMDAxhzFcdTAwMWOsJ+1ljeNnP+aQeiN+IWjZoiRcdTAwMWNcdTAwMTVPI/P+XHQyU4wmKrqh5WlKunExJc9VcVx1MDAxZlx1MDAxMi1bsPHekiWQeXI/dKooovKb/bn2I1x1MDAxOVx1MDAxM3qhLoLX/PypXHUwMDFjfqbULFx1MDAwMmdTeUCQlf7ux1xuId/eZsXizix82MmiJZ46rFx1MDAxMomaSDD+5OyOZ1x1MDAwZjYzf23T7Fx1MDAxOHo6LUNLon+PeV1TLUtcdODLwqDmmm+/y2AzXHUwMDExP2DBXHUwMDFhRFxcaEyqf3kwY1x1MDAwZlx1MDAwZryRvfI62Z2aLFx1MDAwNFx1MDAwNOXPayzv6UJNbG2TVPe/XHLKOlx1MDAwNUw/M1x1MDAxOLiLMdBcclxcXHUwMDFl46XHXHUwMDBlL+VcdTAwMGb2Nvn0Mp5JMdh1zF2u0mjPgj5cdTAwMGZnb+XtsN9cdTAwMDGX/9ud1aXA5jNWyiEomJTFlZ111fu6Uoo/lVxc2+eLtIHl+kdpIS+t30eIz8HQxy9qMlWYqPxh+VjFb+/K1Fx1MDAwNse/6/RcdTAwMTnaJ6aAXHUwMDEyLpb4o676Z1x1MDAwMVx1MDAxNFwidpJcdTAwMWZKuFTHfLmOc51cZq4g3lx1MDAwNzz5RaWhS1xyLGXu869e7XdcdTAwMWRWklx1MDAxYYKTmkxqKFx1MDAwNfflXGbz7kx6Jlx1MDAxM1rGrO43pLBcYph82Fx1MDAxOdQ3hCr1p/z1flx1MDAwMVx0i/lcdTAwMWGibXt1XHUwMDAycyfxYjyMJWfoT8VxX2ZWpELI6j+yXHUwMDFjvjTeJODimEq4MVx1MDAxOY682XHzeFNEXHUwMDA3tlxmLIJcdTAwMTU1S5T/vGS8XHUwMDE2h/Nszna/sFx1MDAxZsJnRNBcdTAwMTDMY1x1MDAxOTmf8Vx1MDAwNnLZmOhcdTAwMDVPhVBe8eb57L+pXHUwMDFmdnio04Mu1MpcdTAwMWKDjMOb60XCVM6rjGI+9W5sXHUwMDFmXHUwMDE2ltJP3NWCXHUwMDA1XHUwMDFkhlHmYoZcdTAwMDbyyVxu6bK6RPfFdi5cdTAwMTWuZ49ncM9un1x1MDAxZVxyXHUwMDFiNot6kp2Mg9+3STVcdTAwMDCZufJcdTAwMTO/XHUwMDBirFx1MDAxMVqDUKfNhFx1MDAxOT7IXGa0IctWLCfdLdFNpHKYPKqnTmDPhWpcdTAwMDY/TVLSLKc4OTPnR7ewPO7K50X1VyY4QOW6YOG4cjKWNsfAKVx1MDAwMifcdZ7p2zZcYi1EXHUwMDE0XHUwMDFjvTaQqFx1MDAxN+f+jFFcdTAwMTbMRiajzMXOh1x1MDAwM56zXn6LYyOf4e/zaTRcdTAwMDdD6N6sb069Ml6mWedEmD1cXJl48I9Gpcz4xj8htNVcdTAwMDOs4Ip72aQ80/xXcF+I2EXisOhlsExE8lx1MDAxMXRcZqrYhL+/82yCQmBB99NErmtiysWpv25WXHUwMDE3XHUwMDEzVDVcdTAwMWOUXHUwMDEywYEyXGbkq3+4SYov11x1MDAxZLJmQEqn4Tfg8NNaMUvxXHI2zHRogvhcdTAwMGUxj7OlTlu+zTAsMqmOIHpcdTAwMTCStMB6xPrBM3Sjp2JcdTAwMGJcIrRhLb0oXHUwMDFmkCyL20ZzijzucVx1MDAwN8jq8Imvjs95zF58OpSwlYle71x1MDAxZb5cdTAwMWOD2P6OIVximS7xUbwkzoC+qaupWLtaveF497hQ7Tb4Pqdf6mOH+Vxmsfiveaa+XGJ6PWqLPnNstcqrl3vua1x1MDAwNZyMp1RS+XVQ1lhcdTAwMTBcdTAwMDRoXHUwMDEw2nj8XHUwMDFiRlx1MDAwZWfAiOhn7mlKqYrVKVx1MDAwN2RcdFOjX87bPH6wQn5cdTAwMTc3XHUwMDBmW12s9qtcdTAwMDTNrHpcdTAwMWJjg1x1MDAxNFxclVx1MDAwNY+mS2tccqDa5Pl43J86z+W5q1N6PPLU1rl0UeVcdTAwMDOP+1x1MDAxYfVxXHUwMDE3ma9cdTAwMWawXHUwMDAxSvn4sllcdTAwMWbyb4vZrUuwj41OY/mWrKHraVx1MDAwM6QqmGFcdTAwMTMjpet7XG7EjMHTbVP9aP7ULETv9lx1MDAwN8s2wmrM64LB2uHM6Vx1MDAxYTBKX6/nXHUwMDA0pOss1+pcdTAwMTGHWKR/11x1MDAxN9XzXHUwMDBizcV9XHUwMDAwXHUwMDFlSubKUXGcKFx1MDAxOVxu6NZq5jLLq+mrfbRJurKHnIg8k/PqaM5/XHUwMDA2TsyKn5AlXHUwMDAxgJtcdTAwMTVncbaDk8F612aa7mmWfrWzXHUwMDBmmZ1XdFwirPk2oTZUboujPXXKgKveqiPVpFx1MDAwN+qfY/aZ3JBcXLs9v79cdTAwMWNcdTAwMGVccs5cdTAwMTct5ERcXEK3x5Ot32ZcdTAwMDJ2sGRcdTAwMTMoT7Vww1xuq7bQfL3F6mZcdTAwMTOm6pSh8b+DL89XSPD6raj7JSw8x6Zn6fjIxKFsKJ9Z8NbqRk7Z/vzdglrnd2fh1MeewKc6JryLu6d+z8f9c77qfl47Ld+kI0KevZ4/d37fcz34r1xihVx1MDAxMJ0jYLaHnzaGJD1cdTAwMDTN0YDTq/ikp1s5pyow3IQmXttcdTAwMWV1Llx1MDAwNiuiXHUwMDAy43dYK1miffujcvnMhU68WvRcZoLr4Fx1MDAxZMJGbvnWW65cdTAwMDEkfo+ZjC1pZjRcdTAwMGWdY9WBjNmz5Vx1MDAwMJpFqd8sXHUwMDE0UzBCSYrWX3at/cSfOT/9pJD503UomVx1MDAwZu+KKaHMf1x1MDAxYTGB2/nj4uTlPrthLju2XHUwMDFjgvxZupPcgVx1MDAxYn4kY7FRqyHgZFx1MDAwYlx1MDAxN4qemyY5aFb989mOvMkwKzBcdTAwMTnDeEhZN1x1MDAxNNdcdTAwMWQoellcdTAwMTJEXHUwMDEz4Fx1MDAxM7dr/lxy7O3D1URbyTqgXHUwMDAzo/Nzif6X8YVJIOchXGZcdTAwMTQ05FxmtESQkqg4h/2EYVxcdiNjsjSeqmRSXHUwMDE2hl0ylUvpxo2vJrov3u5+zNeOXHUwMDBmyuY41DH6t3ZcIpt6XHUwMDAzQ7nSoXyxK2FOdnyP+rtcdTAwMTV0rJKtzNo3buHqXHUwMDEyTiThn2udyjT6NjrWtlx1MDAwMdaM+p22psKIfdXEsV8/I0a5WMkkeNxcZr11pTy8YLxccpnLin+9+1x1MDAxYqSsan+G8ZbxZzGXgMl6XGKh5oyaeXUw/SVAjTKEXFzmo1xuMLMlakVpVlZTXHUwMDBmtlH5dEC34PRbIOxcdTAwMTKXMlx1MDAxNMTYXHUwMDEw4zLrT3RD5ffcUFx1MDAxOfdjjdqMb1x1MDAxNGJzViyAVz43XHUwMDBlYaK3jF6ltlxyXHSafW3AiJSpalx1MDAxOFx1MDAwMu+qe1x1MDAwNPWaIJlqZubTLFx1MDAwZimSrDFcdTAwMDO/QtO/qoDtcoJHXHUwMDE0l6qRdInLnTpTKfpcdTAwMTP01eCCJyNcdTAwMWOqzpPl7fanXHUwMDA21ddN9jDFPEzWIVxm/4aZXHUwMDEx2fXrXixOdlP+xDesk3ZsWqNcdTAwMTimu5eQXHUwMDFkJT0+uIOPVPErXHUwMDFhdCjIwVZuXHUwMDBmwO2dUlx1MDAxOGu2kLMnSJIkXHI+oGYsOFx1MDAxM/9QXHUwMDBmL0g8QZdDR5mXx8XTQVx0dq6abLVcdTAwMDfmx2q2v+lcdTAwMDfH/ZPXRlnyWeWKnt9AyWdcdTAwMDSNXHUwMDEyMYaLn7nxXHUwMDEwzZhKcNdvbVkvj+9+wFx1MDAxN0qjYLgvVFxynEf7t1x1MDAwMFx1MDAwN1xm7Na1l1xcwEdC15jVTnBGh/JcdTAwMWLVd0yIiFx03/lEhFbe9iNm3obxzv/BV/VcbojtfJWg+bqUf704qyenqPtUtXxcYlx1MDAxY1xmnXaxXHUwMDAy/KRcdTAwMGLuXHS8UcElQWl58DvZPVx1MDAwZqcpyntcdTAwMTL6+pfp0VdyeTNW9Fx1MDAxM1xinlx1MDAwNfFcdTAwMDZcdTAwMDRxRi9dV1Lmezbdd2M71DLGl7D9z0BQXFz0bV0uTN9+L2pep5VcdTAwMDQ/3oWLU6bpXHUwMDFhgZ9ZXHT5amnX46htg3+XXG5gXHUwMDEzNp+DvyqfXHUwMDE0Xkdg1WjOtXlpviWbVySI237YXHUwMDE4fvBDy3xq9Fx1MDAxOLqDJFx1MDAxZpiplpEhkjZcdTAwMTFcdTAwMDLeXHUwMDA2uVx1MDAxNV3/Wd132Fx1MDAwNK+Bf/pcdTAwMDaAXGY2XHUwMDFi3ahcdTAwMGZcdTAwMWObOatcYsk8r+B1JMqCOI9cdTAwMDBkXHUwMDAx6WO+sDp+XHUwMDA0o/pUua0he5Lhk//pY259fWW9w6GHXHUwMDFmvi5FQJkhdFx1MDAxOfGn5Nxet1x1MDAxZZPb/vYm8tVp9cIgtp91TFxyXCKt3NqiSi5cdTAwMTOHXHUwMDE2XG6rPSaHNGdcdTAwMTA2sz+xQLqGfL6gUn4upVx1MDAxNEfOqEaM9FxuXHUwMDA2rFNRSbWH0+JWLJNJy1xypu/exkHUgPa/gP1lLOojMGSuKpDHS2ItY+b+OU2Pt33W8opq8Fx1MDAwNb0yKjVcdTAwMTZJXHUwMDE3ZJ6ywJeDiTH58ivejVx1MDAxYT05XHUwMDEwqTyNzFx1MDAxYihkXHUwMDE5+1x1MDAwNk46lFwif69cdTAwMWLcXGbNykqbqJum1OVQt0hLXCKpvdOfXHUwMDA3VaxQ2CtZ8Y9cdTAwMTCwUTCt2LpcdTAwMTiwSyC6umNvXHUwMDE2ZcbkS4vBZ1xucdhU3KpksMpK3dSyyOzms+9XpOPbznZcdTAwMTTGXG655rOlXHUwMDEwqcBWJtVglircpq//hGFcdTAwMWVK1W5FXHUwMDA321xiLNWYV9aHhlx1MDAwNjMsJlx1MDAwMFwiOZxcdTAwMWRI1Vx1MDAwN72swNlg9i/KiW6MXHUwMDE4d1x1MDAxM73lZ+r40txcdTAwMTDRfdCT/rJcdGdG4lx1MDAxYi67tyVcdTAwMWPfgiZG0fViuiOZ1FdLW/hH7SzNXHUwMDA3gJI7OYRKXHUwMDA0JWZTpkttpLno3X+KJXubpGvIVfee073dIX3nmlx1MDAxOeqI4KzKkt/oymLooFx1MDAwMl30XHUwMDA2bamiXHUwMDAzglx1MDAwZuZWavaabSZcdTAwMDFB46WqI6bWq+xvg/GLIC/7+E3Mwfw9hF50u+9uXHUwMDBmXHUwMDFj96//+o///Ofxr7dcIslW5P/67/+ESVx1MDAxY0YpXHUwMDA0R1CMRP7v+T5ZN6fYlqY4/v9R/1x1MDAxY/Tv//j7+ff/XHUwMDAwI2xhJiJ9KafkaClientKafkaBrokerKafkaBrokerKroxyliciousKafka ClusterVirtual Cluster \ No newline at end of file diff --git a/documentation/0.20.0/html/images/entity-isolation-seq.svg b/documentation/0.20.0/html/images/entity-isolation-seq.svg new file mode 100644 index 0000000..0cfb39b --- /dev/null +++ b/documentation/0.20.0/html/images/entity-isolation-seq.svg @@ -0,0 +1,4 @@ + + +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nOy9aZPb1pYl+r1/xVxy95d+wXJcdTAwMTLzUC/6XHUwMDAzZoLESFx1MDAwMsTwbsdcckzEPFx1MDAxMFx1MDAwMImhov77O5R9rZSUaSvltK+rS5QlZ1x1MDAwMiBcdJyz19pr732G//hcdTAwMWZ/+9tcdTAwMGbj0iU//PvffkjmKKjyuFx1MDAwZqZcdTAwMWb+7XH8nvRD3jbgXHUwMDE08uH3ob310Ycrs3Hshn/fbj++4ylq65/elVRJnTTjXHUwMDAwrvv/wO9/+9t/fPhcdTAwMTecyePHe09HU61rUVx1MDAxNlJhqtDTj41/PaxcdTAwMWbe+uGif95Mn0Rj0KRV8vHUXGaOoyj5RGA4hVMkhVwiXHUwMDEwXG7jv5xewOlcdTAwMWZhmH6CMZKkKVx1MDAxOEIoXHUwMDEypslfzk95PGbgXHUwMDFhXHUwMDE4xZ9gXHUwMDFjQyhcYoYhXHUwMDEyRmHil0uyJE+zXHUwMDExXFxDQ080RFx1MDAxMVxijWIoQlx1MDAxMCj6yyU/3dO//1xy+uXIMPZtmXBt1faPXHUwMDFi/59w8vjz8bbDICrTvr018S/XjH3QXGZd0IN2+njdJa+q07h8+HTQ1qBdf/jsO5yfn1x1MDAwMPns+GvvXHUwMDAyX5pmTTI8+lx1MDAwMv7laNtcdTAwMDVRPj5aXHUwMDBihj4+xeNcdTAwMGU7Of7Qbf/n4z31QZ3Ij35rblX1y+G8iZNHb/xcdTAwMTBcIs0nX9fEP3/dPzv9Y4+iP1x1MDAxZvnPjzefJI9PpjBcZschkvr4VFx1MDAxZlxyXHUwMDBmhmj488Na23ywQlx1MDAwNFwicVx1MDAxMiNcdTAwMTD0Y1x1MDAxN+dcdTAwMDNcdTAwMGbMb/zwsZegXHUwMDFhko+d8Lg34XPTfG6en1jfmMxcdTAwMWZ75pnxSuVccr30MFx1MDAwNnk+tVx1MDAxOEqDyY17/eGX6/7z558+NuCti4Of7lx1MDAwNyZxXHUwMDE4pUhcdTAwMDSmXHUwMDEw/KPRVnlTft66VVx1MDAxYpVcdTAwMWZcdTAwMWbhfzxrtM+g9PLdfFx1MDAwMaVPXHUwMDFl5idcdTAwMTSRyFx1MDAxM0LQXGJFoOCuKIj6XHUwMDFjRVx1MDAxMPpEwlx1MDAxMEzRXHUwMDEwhIGLYOxcdTAwMGJcdTAwMTRcdTAwMTE4QFxiiSFcdTAwMTiNXHUwMDEwoFx1MDAxZij4S1x1MDAxMFx1MDAxMdBcdTAwMTOEolx1MDAxOFxmXHUwMDAzQFwi4GOw7yB6XHJE0sso+uT6n+FcdTAwMDLTXHUwMDE4ioNeg17EXHUwMDBisLLX8EJANFx1MDAwMjqCgL9cdTAwMDUuv2XRxFx1MDAxYiz6o4E+XGZcdTAwMTM0wCG4lMHfXHUwMDFirso/7cu2XHUwMDE5T/n6XHUwMDAx69hcdTAwMTNcdTAwMDSjKFx1MDAwMaiComhcdTAwMWF79n2Pq8SgzqtHZ+CffDZT5emjVX6IwOcm/Vx1MDAwZs9bZsyB6/rlgjqP4+euJlx1MDAwMlx1MDAxZlx1MDAxYeRN0stf47PaPk/zJqis58/zt89cdTAwMWYnuI3tMVx1MDAxOX56oLG/Jc+bLNn9XHUwMDEzNfBcdTAwMTOC/1xu5tM8JJ2zjN5bm4VcdTAwMDP6XHUwMDFm++He3L/afVx1MDAwMlx1MDAxYz7hwDVSOFxyMIt8ZM6fnSf5hMEkXHUwMDAxoVx1MDAxNIXiNFxmfWzlX5wnST5BOE6QXHUwMDAw8ThJw1x1MDAxZo3wXHUwMDE32Fx1MDAwM4/6XHUwMDFk6C9cdTAwMDOdmH63t8RgXHUwMDAyoZDnbfzcW5LUa+hcdTAwMDfvXHUwMDAwrI/S9Ecp84d7y8qUJvJSSOtu19RcdTAwMDN86lZIPX+ttyRRYKRcdTAwMTRGUVx1MDAxOPRcdTAwMWMo3+4tX76br/CWXHUwMDAwXHUwMDEwQFNcIsBcdTAwMTnSKFx1MDAwNEjvM9TQxFx1MDAxM41cdTAwMDGRiCBcdTAwMThcdTAwMDYhJI5+XHRcdTAwMWFcYjhLoFZcdFx1MDAxMihS8CHPOPq54oRwoEhcdFx1MDAxMoFcdTAwMDCn0sR3XGa9gqH5Lb5cdTAwMTJwXHUwMDFj0PE4/Vx1MDAxMlqQZ131XHUwMDE5WoDmIUiaRuhvXHUwMDAxy6/ZM/4wk9/jK4VmXHUwMDA0Tfn3Rlx1MDAwNi1cdTAwMWaM4Jb/3oh59Yl3++v4zd9wVp/7za94tvdxosFJtYpjxiFer7jSNVxi1YbYfUlcdTAwMDV5XHUwMDFkpJ85UNCHT4CBUVxugFx1MDAxNVx1MDAwMij92J4/XHUwMDBiZ+qJoHFwXHUwMDFjpWjgROmPwPknXHUwMDE5IOSDXHUwMDBicFxiRKiAjjFcdTAwMWF+gVxmfuWa32SDXHUwMDE3kf7+jIB9dvxfyVxiy1x1MDAxYlx1MDAxOFx1MDAwMVx1MDAwNCtcdTAwMTTANvpcdTAwMDX0XHUwMDFmKHiWLfjcfVx1MDAwMpGL4lxigb6jev6JXHUwMDExgNpcIt/i4Z61ezDehlx1MDAwZk1cdTAwMWXck/iTTvypvX5cdTAwMDCGXHUwMDE4J2SCUFx1MDAxMPA7wFx1MDAxYVFcdTAwMWO9YCh1oXBgVyiekEGE4jGEP+tkgO7kXHUwMDEzj//LXHUwMDAzg1x1MDAxZr9w2FHfdj/f7q/ALeHSMJSbMLWowIzj5keR16Sv1qzwI6dD41x1MDAxNFx1MDAwNlx1MDAxOFx1MDAxOaFwXHUwMDE0wj7DXHUwMDFjjD9cdTAwMDGCo1x00D0gcFx1MDAwNTHOt6hWXG7gmqRAaIXgMEZcdTAwMDCm/O5/X0Hb+rs1LFxmg2aGaPJlr0z+SsZcdTAwMDf5kJEg/sSMXHUwMDBmt0bHQI+UpVx1MDAxNHc96nFcdTAwMDaUicKbMj4wgFx1MDAxZPTxjn+Xhn35br5Cw4Imh59cYlx1MDAxY0Mx7OFXSOIzXHUwMDExS1x1MDAxMU9cdTAwMTCBXHUwMDAx88BcdTAwMTBcdTAwMDRIVPpLXGLh6Fx1MDAxM/BqNIBcdTAwMDdQVECYY19iXGJcdTAwMDVcdTAwMWFcdTAwMTZcdTAwMTAsQFx1MDAxYYlcdTAwMTJcYoZcIt8x9DKGSOhcclx1MDAxZYvEXHUwMDEx8lx1MDAxMby9iFx1MDAxNpTCXkNcdTAwMGJMwDhGYM9h9j5cdJ83XHUwMDFi9Fx1MDAxN1wi9qdcdTAwMDRcdPvohb+kbv1ccof1cr7n88d5XHUwMDFmqerAhyqFz+Oys2b2XHUwMDFmN6eTXHUwMDBmXHUwMDEx9lVSXHUwMDE1RjDkXHTYXHUwMDA3jVx1MDAwMn9cdTAwMDZcdTAwMTQr8jE38LNWpVx1MDAwMSNcdTAwMDCswyiIbOHnIedH0D+RNFxieVFcdTAwMWGEpjRgj1x1MDAxN0olXGLwviiKgmCJXHUwMDAwpkaS9Fx1MDAxYlD/J2lV+LPjv7wrbscx+ZOhXHUwMDBmfz30XHUwMDAx5jGYgl9K9YBcdTAwMDZ/XHL3XHUwMDAw8zCBUe9cdTAwMTm7/lx1MDAwNHsgj6G3VC7eolShkL5cXOBcYlx1MDAwNUSHwVx1MDAwMVx1MDAxMlx1MDAxMlx1MDAxMVx1MDAxOePAXHUwMDFmRTiOhdQlosFDIclz3vxDlGpnOeZ4XFzNuGlcdTAwMTMva+LxcvLqt1x1MDAxNydpoENcdTAwMDGsPlx1MDAxNapcdTAwMDRcdTAwMDFIXHKjwVlcdTAwMDJcdTAwMDVQeim5+r0y+Y5AQ18pqrxFqFx1MDAwMvYjUIj8UpI+Tj5cdTAwMTc4n+ePYJpCkW+D4Lfp1EBcblx1MDAxMvbs7y16XHUwMDEyaed+1FWHyd5WmURBaPxOlcmX7+YrdOrHyiRcdTAwMDFCPvpcdTAwMTn3fYBcdTAwMTBJP2FcdTAwMTSJXHUwMDExXHUwMDE0XGLgMZT+Xpb8Y1x1MDAxMXR+g0xcdTAwMDWd8shvUi/KVFx1MDAxMDS8KlNx5FGHXHUwMDA24fs7+6s32/PLMvWvXFyX/Fxyd/Vn1iVcdTAwMTO3juN1XHUwMDE0aIVsYTUqRFxmkl9Iqf5KXVx1MDAxMlgsTpFcdTAwMTCQpfgzXHL5k+fEnz50KFxmzOuRzv/Sc35FWVx1MDAxMvpelnxccuj4O7hKlCYpXHUwMDFj+3K4zlx1MDAwN26AX69LXCJcdTAwMTRJkSSBf1x1MDAxM/y/zVdcdTAwMTbn8Vx1MDAxZlx1MDAwMcuiXHUwMDE4R7A8vFioKGX1m+qSNEJcdTAwMTJcYvxcdTAwMWMo3+4rX76br/CVJFx1MDAwZVx1MDAwMjhcdTAwMDJcdTAwMDFKXHUwMDEziFxyoFLoT0FDQk9AJ4Lg7cGvL0Dme1HyPVx1MDAxMfRcdTAwMTZXSYOgXHUwMDBlg7AvRur85FxyoVehXHUwMDAyXHUwMDAwRmBcYlx1MDAwMr13XHLizdb8haf8L1WV/FxyV/Uvq0pcdTAwMWWRo0f9I//HXHKtXHUwMDE1/Fx1MDAxZlVcdTAwMTVJckt8XVVcdTAwMTJoWprEcFxmh0FXYuSnw/lcYoJ6XCJpXHUwMDFhgihcblx1MDAwNzxcdTAwMDF/yVx1MDAwNd9rku9OXGLEW1xiXHUwMDAxwVx1MDAwMf3SXHUwMDA08YVIfvQt+rrvhCFcdTAwMDKoXHUwMDFknHr3IX3fLJ3/61x1MDAxNCUjQjCubGQzp1x1MDAxNjo482EyhHj8asH6sShJPWJN7LM4lSCfcPxcdTAwMTHHYiSJfK9H/qFIo95BvNI0XHUwMDAx3Cpo55dcXDJcdTAwMDG9OqaWQkBcdTAwMWZRNPJnitfr3SWWXHUwMDAzXHUwMDFjK1NBXHUwMDBldJdynVf+y1x1MDAxMj0v381XiNdnXHUwMDA1SZyEXHTq03okQZNPQCE8XG6JMFx1MDAwMdMvQeh7PfI9MfRcdTAwMTZv9Uhig9b8slx1MDAwMvHBxF7Xr9ijcFxiopVvqt7/8Ymev3A98jd81Z9ZjzyJgixccjFicVx1MDAwYs6c5ypu70fljfVIXHUwMDEwUqIg4vw8t4s+4Vx1MDAxOFx1MDAwMV4oXHUwMDA2opLv1cg/XHUwMDA1+MxcdTAwMWJwXHUwMDBmXGZcdTAwMWZCXGLQdy/gXHUwMDFl9N6rPlx1MDAxMlx1MDAwNJlcdTAwMThcdTAwMDS9/7yTP1Kk/kXqkYfjrj35UPFcdTAwMGZpP01q0FxyaeFFX6LtXHUwMDAx4E/BhkHYXHUwMDEzXHUwMDA10VxiRUFAn0LIZ7XIXHUwMDFmQTRcdTAwMDeiRVx1MDAxYSMg0I5cdTAwMTCNYdRcdTAwMTdwe4yqg0FkSVx1MDAwM1x1MDAwN1xmY1x1MDAxMIG8XHUwMDEwXHUwMDE0XHUwMDAyhftcdTAwMDQuwVx0XHUwMDFjpkDLPNNPv+1hoyTG4uC/XHLS2K9VqcirKpVcIuDH6JsvR6k+UEa8hj9cdTAwMWFHIYjE39/t4vDzXHUwMDFj1lx1MDAxYvDXtfnnXHUwMDEy+ONPf/toMlx1MDAxZn755ef/828vXv3j63b6eH1hoVx1MDAxZj/vXHUwMDBiTFbBMHJtXedcdTAwMGbrMFx1MDAxZTf5XHUwMDA1XHUwMDE1jkE/sqBX8yb9/Fxc0sSvnPnwLqbv2ylLgi9sXHUwMDA0vO/Vc11bLemH/v0tIY5p5vpcdTAwMGZcdTAwMDe7Tlx1MDAxYVx1MDAxMlx1MDAxZnBccs1cdTAwMWGsXHUwMDBlvoYpKFx1MDAxOH1cdTAwMDKxXHUwMDBmhUOPciv8bEDBT0RcdTAwMDHiUNCqNFxmJFx1MDAxZlx1MDAwMtqW/HJ6XHUwMDBi8OokgnyI5PFHafZFnsCfUFxifcw+XHUwMDA0kVx1MDAxNkW/pVx1MDAxNPPfjCe4389cdTAwMTM4XHJiVpL6Mmx9dPer8pxCMVx1MDAwNLiEdy/DXHUwMDEyXHUwMDE0XHUwMDA2f9OUl3eliVeN9PH6wjz/LyWJRVx1MDAxYbO9QU+LXHUwMDFlXHUwMDFjK7uD7Ju9sF9DXHUwMDEyMIIgT8CsMJpGXHUwMDEx4Ia+YFx08lx0XHUwMDA1oTxoPtDXOHA3X7JcdTAwMDT5XHUwMDA0XHUwMDFjXHUwMDExRsPIa8UmXHUwMDEygp9AhPiYOFx1MDAwM6L650M3vnPE3z7lXGL+93NcdTAwMDRcdTAwMDHjXHUwMDEwieHwS1x1MDAxY/FlXHUwMDFl+pdcdTAwMTBcdTAwMWV9jPGg3z/hTFx1MDAwMJr4plxu1PtqiVeM9PH6wjz/L+WI1o1cbjecba2R1Fx1MDAxM2ZrNEGV1JdcdTAwMWNcdTAwMTE8vunzmIN4olx0gn6UjFx1MDAxMVx1MDAxOPTopzk9XHUwMDE4JZ6A0UHEo4qEoehcdTAwMGJcdTAwMWOBwfBcdTAwMTP4S2IoTLxcdTAwMTJxwFx1MDAwNLjiMXrys1x1MDAwYv5cblx1MDAxOb1XOeJfkNHLfjdFXHUwMDAwXHUwMDFiJ1FcdTAwMDR6MctcdTAwMDe9WpPCaeQxT1x1MDAxYf1cdTAwMTMz4kG0KKyopGQnQXY20nF4zsk3XGbnICBcdTAwMDB59NtcbuDvSj+vmv/j9Znh/1xu+/xcdNzyOfyTKmynr1x1MDAxYlx1MDAxOfpiZ31BL19cdTAwMTZcZjCSfFwioVx1MDAwZlx1MDAwM0OBt0Cex7M/sVx1MDAwYvxE4STgXHUwMDFknIQ+LFx1MDAwYvRlnELQTzRcbpzXwzxf1iDfXHTldUJ5Q4lcdTAwMDCnSFx1MDAwMCjspbFg2K+NXHUwMDA0g2FcbsXhb1qh4lfR/Sizflx1MDAwYrr/WVx1MDAxZthcdTAwMDOUS492OybXWzKM/6tePjTj//NysVx1MDAwMPrk6Fx1MDAxZl1cdTAwMWP4XHKH/Xlx4Cue5X0qXHUwMDA1V6DJr2f8hO57xZ9wKjLO9Fx1MDAwYlx1MDAwYr29ICQoXHUwMDE4eaLpx2IlXHUwMDE0XHUwMDAyxOZnq1OBXHUwMDEw7Vx0RKqPhVDIx+uF1OV3XHUwMDFk8W6wL363jiBx5MO4o5fKXHUwMDA2yOul9ceIQ1x1MDAxNKbhb6tcdTAwMWJ8m5LA9Dtd05e24Fx1MDAwNCs0qWXtT53zNiWB4yjyTYthfVdcdTAwMTI/nf5qJfFyZ32FkqBBJPdIXHUwMDA1XHUwMDExNPjvsfjgp/RC0k9cdTAwMDRcbuOPZTwoiFx1MDAwMlx1MDAxY/SlkECxXHUwMDBmQlx1MDAwMsJcdTAwMWVTg7BcdTAwMTfHXHUwMDFl4Fx1MDAxZqH3nVI+pZTy64VcdTAwMDRM4o8yLoW9VPIgXp9+RcFcdTAwMTD8WMHsvZVcdTAwMDRcdTAwMGXkye9cdTAwMWEo+4X3XHKqPEp+/HvzV1JcdTAwMTS/4bl/U1H89Ex/lK7Q24Xn3evNvsHJcVx1MDAxOKdcdTAwMGJ+pV6YXHUwMDEx/WKCXHUwMDAyf6JcdTAwMDDqcYR+jGOlPlvJXHUwMDBiQZ8oiqDgx6h5XHUwMDFjXHUwMDAxuuKFxXtcdTAwMTDqicJcdTAwMTBcYlx1MDAwM/aFXHUwMDEzXGJGv4B84lx0onGYekzPhEn4eTnkt4lcdTAwMDB8fUJcdTAwMTP/XYig+v1pTFx1MDAwNJBcdTAwMDNF0dRLaUzkV0bOXHUwMDEyXHUwMDEwREH481x1MDAxMOWPX1xyb66tUUXMm7LD93SroNeITN4kLlx1MDAxZcvkPpvF/y8rpbxcboLH61x1MDAwYvP/r6ovXu6vr9BcdTAwMTePTFx1MDAwNdBcdTAwMTgoXHScXHUwMDA1XHJkXHUwMDA2/Pkym9BcdTAwMTNQXHUwMDBlMERCKEngXGLy4kxw4lx0XHUwMDA1XG6Dolx1MDAxZmtOXHUwMDEx5Fx1MDAwYlx1MDAwM4S/88qrvFJ/vcCgQfxcYkEk8VKqgnp1SFx1MDAxM/xhcj6QJu9YLP2dXGL/p8BcdTAwMDA+Nlx1MDAwM19cdTAwMDTc/ZhcZn9vgsffhzt+enr6K0iL33Den0uLr3qa95FcdTAwMTVRz1HmKbyvP96p4Z4yKJVcdTAwMDcvyIpcdTAwMTfgXHUwMDBlk09cYonSMCA9oDuhz+COXCJAdGDAziCEglx06qWyXHUwMDA3XHUwMDAyP9HwI9lB/8So31x1MDAxM5NvQXv79WhcdTAwMDeNj4KgXHUwMDBmfymagJHXV1JCXHUwMDFlQ1x1MDAwM1x1MDAxMMDm71xyd1x1MDAxNMGQ37WS0tM74bpKLuOvoHpsu9cg/cndfo7fpz9cdTAwMDCoe9qQNVx1MDAwMlVYXHUwMDE0+vFHXHUwMDE0z1fVk15YXHUwMDAz7Vx1MDAwNf1cdTAwMGYjXGL2hOHA59IglFx1MDAwM1x1MDAxMvDTaeZcYo49gXj/sX1cdTAwMDSCvlx1MDAxY/l/KHHiOP551vBcdTAwMTecQk8gRkTRh63gKPxcdTAwMWS1r6K2+/3an6IgioRfdN2vr4L/WONcdTAwMGUhSPhPXHUwMDE0/rrmZdwlTqNcXD6m8Sknj1rAvS2rXGLcw7M1jP9lwyNeMf9cdTAwMGbnPrf8/6qy/+Xe+lxuXHUwMDFkXHUwMDAwnPdcdTAwMTNOPlbOp3BcdTAwMWF9vr7TXHUwMDA3csGQJ1x1MDAwNPBcdTAwMGZcdTAwMDVjXHUwMDA0aKXnk1x1MDAxNz4mXHUwMDE3oMc8XVxuSFx1MDAwMewxXG5ccnpxfsN3RnmNUd6wiVx1MDAwNlx1MDAwMlx1MDAwMa1GQsSLNYlXV1aD0Vx1MDAwZnuhUN+WNfhVfEPoM2f0+/KKQ9c2Q/K/gOf9SyRcdTAwMTN/w13/SjLxxVx1MDAwN3lcdTAwMWZcclx1MDAwMaWNNs+pqHgnRilcdTAwMTNeglx1MDAxM7z7KlxyQUH4XHUwMDEzcFx1MDAxZjREXHUwMDAzXCJEsM9cdTAwMTaoQnDqXHSY1WObXHUwMDE1+rE++HdcdTAwMDXxx+G9/91cblx1MDAwMpAtjZH0y7tcdTAwMDO8PlBcdTAwMWGGXHRcdTAwMDRcdTAwMDJd9GeOcZqIXHUwMDFiXHUwMDEx5GaJwv/onNBH5c6rw7dpXGKKeJ5p+q4h/kBccvFyb32FhsBoXHUwMDE4SFx1MDAwMFxmgVx1MDAxZktcdTAwMDPQJIx/Os5cdTAwMWHBiKdcdTAwMDerXHUwMDAwhlx1MDAwMf7isc7nd1x1MDAxMfHOpPKWnbhcdTAwMTCEJFCCejGd8PrakDBCw1xigUL0O07I+lx1MDAxOeEgcv1dm4v8dVXEbzjsf42K8Fx1MDAwZbE6VOI/QnOh73F5YZDb6atWY8eQx6Q09FG8eizITn2Kclxuf/pQO0Dox/6G2EtcdTAwMDNcdTAwMTC+J1xmf1x1MDAwN8aHN1xyZERhmnh5qVx1MDAwM+LVJFx1MDAwM0WjXHUwMDEwkH/wu5dcdTAwMDdQXGYlv+dcdTAwMGLfhlJFjFx1MDAwYlx1MDAwNHXESYyrK0Xqx05cdTAwMTb8r1x1MDAxYy9cdTAwMDBgXG5cdTAwMTBcbmGAsIFLJT9cculR4KxcdTAwMWZznkDPPDb7IagvvfH3gYjvhtrxd8t9XHUwMDE4oVx1MDAxZUuIQl/i9oNuenXS02M0OXCs3zYz8tvkfltqXHUwMDE2esbiUFx1MDAwZa+idLR2/1Dl9W1jXHUwMDA1wGNC//qxXHUwMDAy/1x1MDAxZFx1MDAwNlwivtxZXyNcdTAwMDNI+Fx0x1x1MDAxZqsv0kBcbsBcdTAwMDT8qVx1MDAwZVx1MDAwMLHQXHUwMDEzTUMkjUDAzdP0SylDXG55eqzLj9DQI4n0XCLBfFx1MDAxZon4Kqfc3iD2aSCvIaCwX0pcdTAwMTm+vvhcdEnSXHUwMDEwXGK733Nx61x1MDAwZvDGaFx1MDAwMn6WvfxcdTAwMDYloOTDaD26MnqsaTn8c+zeo3f/3lxmwYejp1x1MDAxMXzrv/9Nb1LAXHTpX1wiXHUwMDEw+Fxyb/65oPiVp/ytZ3yn0YqF9GPrwpTo7M5ztkcywri+MIroxVlcdTAwMTDY02O/VkCcyIdlPT8hXHUwMDA3QJtPwKxgYJLwY/ezXHUwMDE3yOG7+Hg3orj/fvFBk49NO5438vOSw6/NinpcdTAwMTSUXHUwMDEw6E/c84xg6ivalUM38VNp8OZFvTLiXHUwMDFi1Vx1MDAwN/J8cNR39fHHqY+XO+sr1Fx1MDAwN0VSTziCo8iH9djwZ0v5fOBcdTAwMTdcdTAwMTh9okjkMYhcdTAwMTMlSFx1MDAwMn4huFx1MDAwMZb5XXx8O6e8slx1MDAxN/iL45Yw8rHn7ItcdTAwMGI/0a8u/Fx1MDAwNKM0QUPU8yTyO6UhgFx1MDAxYf19o1x1MDAxNH9xy8FcdTAwMTd++e/NX1h9/IY3f1V9fPmYf5L8SGtokPP1R6Web9U0XHJWPMjXr1x1MDAxZCyFgs9GKVxugknoUS//hFx1MDAxZnBcZnnCSVxie1x1MDAxMFxiQWIv5T6+VzrfiSle2fH8LepcdTAwMDNcdTAwMDNEgFx1MDAxMzj6kvqAyVdTXHUwMDFmXHUwMDE09UiY/JmZj2OkZXW44Fx1MDAwNqfbhqeKa7dcdTAwMTDHt2mPx+S974XOP0V8vNxbXyM+aPRcdEgvXHUwMDA0JimYwInPNvzBaFx1MDAwNIQ+jzXxgTp7lDm+XFz/XHUwMDE5wZHHXHUwMDFjzMdu3lx1MDAxMFx1MDAwND7kxehcdTAwMDb6rj5e45Q37JlOUFx1MDAwNPxYIf3FOVx1MDAxMq/WQFxiXG567E/4nttQ/lx1MDAwNG9cdTAwMDRcdTAwMDJk9i7i459O+edcdTAwMTLh35v/+PtcdTAwMGY/zV1cdTAwMWPnXHUwMDA2/vujXHUwMDFh8Z//9ulR5PnRsFxyf1xmouinQ39cdH3yXHUwMDFi7v43syPv3Vx1MDAxMu8jYuaSXHUwMDFh7rrNjNLpujvqXHUwMDAx81x1MDAwZtxzvzKH8kihYjj92KRcdTAwMDGioc80XGaOP0HoYzNBXHUwMDFjsPDzXHUwMDA1yL5rmPfmm6/eNf51XHJcdTAwMDNTNCBcdTAwMTRcYn2Jh1x1MDAxMPzVXGbKY25cdTAwMGWCodg3RUHfJmJcdTAwMTZLILtBI+5pL2Rl6lx1MDAxMsxind4kYjBcdTAwMDKnyG9cdTAwMWFcdTAwMTH6XcT8fPqrRczLvfVcdTAwMTVcIlx1MDAwNqNcdTAwMWU7+lx1MDAxMjRcbsEohZM4/GmKXHUwMDE2h8knlIBcdTAwMTCIfOzWXHUwMDBiPSOHt4iYN83z/G/FKVx1MDAxNPT1XHUwMDFhXHUwMDA2RjBcdTAwMDJcYlx1MDAwN/zFVWjoX5noSTwq+1x1MDAwNPneKlx1MDAwNuBcdTAwMWKD3rd+89x3f+61P/rrv4RM+Vxyh/4mmfJVj/pmXHUwMDFk8j9+Zq9cdTAwMWaCrvuQovnFV/1wz5OJ/Vx1MDAxMlf/8/Lh9WD5XHUwMDBmNPNhM4GPLu7rt7366Fx1MDAxNEEz1on1fEeNbVx1MDAwN1jyoyl+aMy376dcdTAwMDVsMbCPyuPNj1x1MDAxZv/9l4/+f8NgSFxi7N/yM6tcdTAwMWYn6CClLVx1MDAwM17ayc5cdTAwMDQ7XHUwMDA1P1x0j19ZhmM88H/uXHUwMDFhuLvkcYRxtdNcdTAwMTGSmX7AXCLCZFx1MDAxOD7H90dBtFx1MDAxM5GMnWm0K8120EKX01pHJzNJr7ohXHUwMDEzMJ6xJ8dwuiDv75xEhG5cdTAwMWJcdTAwMDVnM+TsK3E9U2XrXHUwMDE4Peu0V65MXHUwMDAzK1x1MDAxNoWaqr38VFx1MDAxZYSDiJrMxZOawzTtRLFMczFju1Vb4a1rSVxyXm39O75NNGvs9fNS881Wd+Ktj29oetsg29q1eVx1MDAxYimgU7bdX1x1MDAwZeeFqtxcdTAwMTPcVlx1MDAxMrzXqTxcdTAwMTirso/h5MqFXV5cdTAwMWaxwIxcdTAwMWTXXq63IGdcdTAwMDZX6WfkdrWElrhe8+5cdTAwMWHWRD30wrTtXHUwMDBlt/6wlqRO61iUXHUwMDE48krR9zth8Jh4vo7hNYiDwlxmZGW6mfTx+jhcdTAwMDQud64zXHLnLbNcdTAwMTR2gGLXw2lt7vfLJbG5YOrPe/aS0K5gXHUwMDEw6P28ZfsgoUmTpO2RXHUwMDE2wouDLipRK5gjZaMyIKGR9Fx1MDAwMULvqtk+XHUwMDFiJsqoQdCQ9PbmJy68jjeZPpM960r1LSqZic+KmdS2eZvJkZBMKXagXHUwMDBlPGmIKGR2Y3DUXGY8qHtcZquGXHUwMDAwkShcdTAwMDaOLy6HXHUwMDA2fFdcdTAwMWV3x1xyZVxc1HS7sl2m8Fx1MDAxMF8kI39WUdcsS1x1MDAwNjusjYjim0uMXHUwMDEw8Vx1MDAwNTlcdTAwMWJ1XHUwMDFiaDnKQN1cdTAwMTJfxssm6pIrjVx1MDAxM+U273ZSZrWteVx1MDAxOclcdTAwMWLkgJ7vXHUwMDE5ptjhN2CpUIXPKr1NfYvVjr12OCCRPzDALqxlmvFrfKrIXZnAbT9TXHTcXHUwMDA1SMpS+GZ7v6BGMHLRNlx1MDAxNnX8nsv79HBY90m14sPiXHUwMDA3yb0+iFx1MDAxNTZmOVx1MDAwM4mnuvVcdTAwMDR2V4aLad8263LNnVCroWCdcrnKXHUwMDBiJ66s2HVg7URDyYTpRYnbyYlKrGZjpLTWh8u1dqXrwDOrUVx1MDAxMIlTdVx1MDAwMb0ziI2RmdMtXHUwMDEwYl9mXHUwMDEwxStcdTAwMDbXXHLvsDGgx4g+OOe1MPrNeUfE5F2bhONabKCNQjhkxUf9YSk72MZcdTAwMTB94M0jKy9GTt3VNYIqfYkqJC7gzlx1MDAwZlx1MDAwMlx0n2rLL5cs6a/ErTBb24hCQqut5CDd4Mpe6yZcdTAwMWNvaLhANp9cdTAwMWH66jlatG2qq6BNNKedvbOAXHUwMDE1TXOzcVx1MDAwM1x1MDAxZdZcdTAwMDBcdTAwMGJcdTAwMGZcdTAwMDOldo64K3bGaHI7caYubrG1w5rabypcXFx1MDAxY86iZpX0XcznXGJcdTAwMDdvb0WeXHUwMDAwT+pEOCYxXHUwMDEwVzRcdTAwMTiT4GS5WIiiXHUwMDFlKkdvYme3yW/wTlx1MDAxN1x1MDAxMItV+ZNcdTAwMWZsa0A7qWCcXd5cdTAwMTJOlNbvsotl4clcdTAwMDCFuzY9XHUwMDFjKc93msIyyORcZuz5jHqxTKRzput9XHUwMDFmVixoty1cdTAwMTLVNSrB131Yx0p4Wc1cdTAwMWKaO/Nmz0681MPIzT1cdTAwMGW+ftqAYGDaTqbgM1x1MDAxYcPYm3ZkM3dY77E/X663rYtbwdZcdTAwMTMj8oIhcOijhIKqltNcdTAwMDRcZjvNXHUwMDAzkehcdTAwMTcj60okXHUwMDE0d+zFo3HMbViVXHUwMDE051wiXG6b81xcXHSqrqHnXGap/LN4sjcnlaFxya6VNPSnVT7MtFx04fzsjlxiXFyM9NhoQcBeO12nXHUwMDFhX/JVhFGV3Uy5Y9Y44ool7OBY0aVI9ntcdTAwMDFTrVx1MDAwMFVcZjsh41xy1Vx0qclAZzxAOnxNtpdcdTAwMWLunVxc6c7KrrC5x1jSXHUwMDFmT8upQi+5a1x1MDAwYozVkPgmjle8NIWpQdopvyCbdE8m5Vx1MDAxZZNsulx1MDAxMVx1MDAxZDRcdTAwMTlqR1x1MDAxN0ze23pQiFE4S1/qXHUwMDFiUFxcLny+XHUwMDE38nygR0MwjctDa1x1MDAxZdMpkHeFyTJcdTAwMGVf0Ztik+ORftZ0xT+iY++GXHUwMDEwwk83XGK+zj607U6JbHGczPPIuW5aQi9m1INbvYTz01FndXUno+kkYzp5mFM24vjVM4xcdTAwMDWPhnNLyVxyZ/uUcLuQXHUwMDEz6u42buSrcoaQ8VxuX6/j4Vx1MDAxZdtyqqUovMnS7WWjMmyeXFzgxd/SJiPrSrFcdTAwMWTdXHUwMDE469JcdTAwMGVllaNXa4VcdTAwMDRcdTAwMTPJ1pdcdTAwMGIjXHUwMDFi2HJ/TbrqRid3d9uYgSdkPofdMEO/kfb1rEGkls7LcFcgeFx1MDAwM1x1MDAxN6BNYoTd4kF3vsJLtWOkVlx1MDAxY/lxyc9yr+xcdTAwMTjfLFEjWlx1MDAxYk/SXGblXHUwMDBlxYFupa1/XG7qskVQXHUwMDFkNVJHj8j9ckZcdTAwMDVkwrxBXHUwMDEx9WIwTeBcdTAwMGaup1x08IFe8Fx1MDAxN7dHt4cwsIjhwEjV/lx1MDAxNK8uVmv8sVxcdtlcdTAwMWRyha2i30dqblx1MDAwMyqZXHUwMDBi1PGwOmDSs05BY1Ls4UuA3PBponRcdTAwMWR40DaiYm8xjluGnbVcdTAwMWJcdPv64Vx1MDAxMqnOQapO+GWzPVBivr2uRulcdTAwMDW2KFrjJVx1MDAxMFx1MDAwN/bijFxcT0qqzVwiUp1tKL6yvFxig1VhJ+9aIVx1MDAxMVx1MDAwZVGaXGI3ddndI+VcdTAwMGVcdTAwMWPMbof0nlx1MDAxZTpcdTAwMDfNdanZuI9cdTAwMDONQPzeQYPrjeJcdTAwMGa3JZ7mbatNa1x1MDAxZlx1MDAxZe69bqjx5aBLxHTTZVx1MDAwYqZR8p4yJcS3miD05zKst1u4dpTF3XmGb81pPrRcdTAwMWMzqSd2r7G4xWQ2XHUwMDE0ZbBcdTAwMTekiNA4jkhLV1ujw0tcdTAwMGZrZpmHjWrhnIqZqaqN9JnOrIpcdTAwMTCMqqA28WVwZDGz1k1MnsVzkXX4RMZZXG6FgWFFXHUwMDA3XHUwMDFm8kQzv9pcZjKfXHUwMDA0eaoxNia0olx1MDAxMm+yJSFTs1pcdTAwMDJiXHUwMDBlLFx1MDAxYu28UlDXXHUwMDAxVWpcdTAwMGLbkulYXHUwMDBivMPJ0lx1MDAxNlx1MDAxZPEktkm96M7FPOHYqFxc4WBszrDvSDdk0zIoU5GlmITV6qIkXHUwMDFl2SrJSOKENkNxlHznXHUwMDFlujV7u0hcdTAwMTSfbCc/Z1tGkIdQmtVcdTAwMWRcdTAwMGZvXHUwMDFiclx1MDAxM9mFSFma5inaUmRcdTAwMWLad+g7uvYzZJa3LCvbKVx1MDAxZdKbzMs3V0NdZLNZnJK9L9IpSvHNSTP9XG5RfNlhXHUwMDE12oP1bdfSPFwizVdcdTAwMDS/hTcrx1x1MDAxYUVC6FsvKFx1MDAxNDC1826amFxcuVxcXGJcdTAwMDKhbMvthmnQuFxiXHUwMDBlXHUwMDFkly9cdTAwMDdcdTAwMTkuWbnY8uhks+ZeyUzdZy13v1xmo6SV0lx1MDAxOXP1WFx1MDAxZvw2TUPec45pd1G9o2dcIlx1MDAxMpcq5ObeJ1x1MDAwMuzVXG7tIPZSblx1MDAxMW+32a5wPOQqkdxFKlBcdTAwMGb7O2v0qOjcXHUwMDAyzGaYgzZcdTAwMWWGOC0zMW9cdTAwMTjOk1W1PJZuLoRK5y/jQdimTn3WmiaVhIYkXHUwMDAx5IpGT1x1MDAxOFiVXGKmWjbjXHUwMDA1VWmRiEMo51qaclx1MDAwZac5soTsIFxyY5FAhZ5rXGZcdTAwMTcjvFx1MDAwNJhR13lWzVxuUeONKWVFzFx1MDAxMUBLsbZqxFno7Ca92IpcdTAwMTDlylx1MDAxM8RccsQyhsHeXHUwMDE4XG5svvk3iWm57W13qLBu7YPd5VifrI3EeTCjp8nCz9hpk3pA3UbZpY9cdTAwMDZcdTAwMWON6iNP7MJ7v3Bn03J3XHUwMDEwydeYLVx1MDAxZIf1UK+t3LvnXHUwMDAzOra4e8fCXHUwMDAxXHUwMDFk/C7VXG4xJ7MsZbqwMSdekMY5dlx0N1x1MDAxZnHe1mUxXHUwMDBm653D5KzjXHUwMDFjxI2fSu11lCi10Fx1MDAwNrzza1x1MDAxZEbukaxtOYZPXHUwMDE5XHUwMDE3q6BbgpRcZiVcdTAwMThIepVj+UwzyKW3XHUwMDFipZvEUVx1MDAxZK/uvdxAfFJcXLd7XGJixDpt9HWgWbWxxqzwjCzB9ZjIXHUwMDE3XmxcdTAwMTIlXHUwMDFiTFx0XG5vMHGdlkBz+JZJmNDwTteLtlFT91x1MDAxNshO2Fx1MDAxZFx1MDAwNqvnXHUwMDE2XHUwMDE1dFx1MDAxOFx1MDAxOeSZXHUwMDE0XHUwMDFjNodcdTAwMDU6Olgxr2NAy5p5t7cnXHKIkPNKw1x1MDAxYjuuXHUwMDE2RjjkXHUwMDEzQWxcdTAwMWGK4e/bXHUwMDFijW+3aDZB+jFVvcOeMI1Mwsf7ZduMXHUwMDFhTWPrhCnadECg+bJdrMxcdTAwMWNRpTrlXHTWa4RMb0tO2lx1MDAxZoDiOK2wXHUwMDFj7Vx1MDAwMVh8taaFXG5cdTAwMTZcdTAwMTQxK+Pexlx1MDAxOFmyVMPFoN1cdTAwMWGz52p3dLZcdTAwMTXTXHUwMDFkRn9cdTAwMTjkXHRX7PKq8Xduz21uqJW1dJx7XHUwMDAw2O6GPXiFP6omxbClLNR7PW686apcbsfb9c7uRXCnwVx1MDAxY8pcdTAwMTfMXHUwMDE3q1x1MDAxY/i72J1rZupcdTAwMGWnXHUwMDA2XHRcdTAwMTNcdTAwMTi96Vx1MDAxMmVEicxgXHUwMDFjkFx1MDAxZlxubzgopbJcdTAwMTS5pVxup+77Y25cbmJ8W1x1MDAwMKFSVVx1MDAxONeUbprCQTE99ji0t1x1MDAxZGvxmW1Mer1cZpiTtcGumKVAXHUwMDEyjlLuuGPkSJJd8Vx1MDAwM7ObeX1cdTAwMTlucI8uXHUwMDBlRZdcdTAwMDeS7+ymotZMV887dlZcdTAwMGZ4uMv5llNx+SSsXHUwMDFhq87lYl59ZPKZa1xuXVx1MDAxNcy0/IRcdTAwMDFcdTAwMTGKYFx1MDAwMLhfO1FyuGZcdTAwMWTJsKpcdTAwMGWntuXuXGaLNFx1MDAxMe1cdTAwMGWSKVx1MDAxM4ruTrlcdTAwMWGtrJxLXG5X0lx1MDAwMlxi0GqNYjmk28En7+xcdTAwMTGMXHUwMDFhKZottFx1MDAxNVx1MDAxN5CsXHUwMDA3XHUwMDFmb4zOdDXqc15on8R5cKqoXHUwMDFiTkJJhEe+81x1MDAxNdxcdTAwMDWabF0oait5KdyamH9mXHUwMDBijFHNm6cwKkda2Nm5bPlcdTAwMWSqI45cdTAwMTmlLM3kp42ap123PTh+xzKJXHLa4Vx1MDAwZZxUXHUwMDAxXHUwMDE4hHazU5FqtshAsE4s3fnQXHUwMDEzdddcdTAwMDZ7fK5KzsJcXFwiy9e9lYb7mZyPPFrmXCJcdTAwMDDI8SZIwmSjUHc6XG7qnF7LdodzYsA5mpyywHJcclx1MDAwZtlTnHztNY+FXHUwMDFinddi29lM2nSWNt1luMBWXcxcdTAwMWL5iqh5LDQmNjGDXHUwMDE4wopZ1nRcdTAwMTNFjHM6XHUwMDBmXHUwMDEyXHUwMDEz7WI+OOyryqcr2zs54Fx1MDAxMSOGWrA2y/anXHUwMDBisVx1MDAxONDE21xmXHUwMDA3JMkuXHUwMDA3NGe7XHUwMDA3gqsuXHUwMDA1xyGSMI92Psj382ZHun5aLkx2S0/bcVx1MDAxM0W+y0LSXHUwMDFhlkHOwn5y3XSeIGxcdTAwMDcyvl7nXHJ/wFx1MDAxNZx0XHUwMDE2N5gs9iRcdTAwMDRB1bXaWEkp1qrHc8/sz5vgsCtx3bqnQ6DtXHUwMDEw7aqE+2KPUZdCXlSed6FNXHUwMDEyXpPIPux773KlXHUwMDAxV6lQpHNCpnB4sTnM443SxE7OVCu2PeBz86zegvuvxlx1MDAxNby2nFGb9ehv9UDT811SzCXSXGLlXFySipCd3GSdzTbab70omsTQZ9d+PIVcdTAwMDKJXHUwMDE12HLT3drg5C3rS0etUFx1MDAwM8JcdTAwMWO81mxcdTAwMDNmx0RAM5ObMjWlxL9DhFhcdTAwMTEwgafHZJlcdTAwMWRmWkknXHUwMDE4abt1XHUwMDFi0GzyXG45ipiG3LzKZ5zbtES4SNRcdTAwMDY2j37cpZ5Mplx1MDAxN1XCq/hASeqoXHUwMDBiisFYnI1cYqoyJ1x1MDAxOCVNsWRcdTAwMWbq7u520HZLQubh5Gcx2Uxn+7TYXHUwMDBlw4pcdTAwMTRcdTAwMTXursy2SqdkXFzNdOc0qVx1MDAxZUpmJ9tnvkuWrt1etqQhn/XmWJb7buuwgk5cdTAwMWFqXyHHNr5XRnlcIoJcdTAwMGU+XHUwMDFhV9XXXHLt2FLFXHUwMDExI9VVLWRM5lx1MDAxOCg66WfiUm1cdTAwMTdcXIS5WWQ3qMDmsD/cTqRcdTAwMTdpUiY0lZBcdTAwMWbncOK68e5fud5cdTAwMTSPXFxcdTAwMTkoO+1OWviwelx1MDAxYqApVZJcdTAwMWaEo9xvMaxcdTAwMWS21oT4t7JTXHUwMDBmJSxcdTAwMDNcdTAwMDZgJ8ZjXCL4mESnkj7k3fW6Pyrl6u7S0Vx1MDAwZWSjWaDNOVDKrkxcdTAwMGLqSFxyJ8moelx1MDAxY75cdTAwMTJULJVnhuVcdTAwMDTKS+o0j5y7yoynRtKSXHUwMDAzUYw6nLBZs1x1MDAxZY7mgUxRe/HVJtpQp/h8nu5HXHTyq8tkXHS+09XkvszPXHUwMDEydNK4s2/JlKZVhLpNXGJ135xzlLuWl2lcdTAwMTdji3ZaOFPEOJy+K1x1MDAwYjFkXHUwMDA3Lm2PRHImjzvy0MHeLVhBZ/gsNW4zL6juYzWypi2ex9CB+yaDecdcdTAwMTSl+zb27pNcdTAwMTZHIORukfONmS5Gv1x1MDAxZdZcYlx1MDAxOVx1MDAxM4NLp8hcdTAwMWSd/GpcdTAwMDZjIXAjnVFcdTAwMDd4iPb0pXJn+nZcdTAwMDXn2TMne7rQpiHS3o9MRlx0JOLg86715ZMrjzR5gDzf2OOaQ8S3XHUwMDAzZZXUXHUwMDAxQWCp5CkzU/SjPbOJ47t7/HBOY6XLK/DNPDFcXDbz9kIqm8lOQf+kXHUwMDFmcmP7o41cdTAwMGJ9uU/T9H//72dcdNA++WTHI1x1MDAwNCVh8tlcdTAwMDLGj1x1MDAxZIOOydjnyf2TYjdJUVx1MDAxOP28dvH1O5O+NY/49i1Pvz2PaJngn1x1MDAxZPRzXHUwMDFlcVxyYqF/KY8oP9rzpzzi4JpcdLRcdTAwMTfc87YmjbtcbstiVSQ1QfjNiIh7s+rN3f7UltbeXHUwMDA2QZEqiYxwZo+2wFx0Liywwum0L0uRScuryXNY6jlcItpcdTAwMTFJ789cdTAwMWLlJpnIvbhYNHGp79FZXHUwMDBi6Y3Q3MhrXHUwMDFkdKsux+t461x1MDAxM1x1MDAxMsXPJH6/9deO5Fx1MDAwMk9bKK5sOnK++FayMPtGOjKO7Vx1MDAwNWx8rKl9sXNYSYhcdTAwMTjmzlxcW0PapLzKkClcdTAwMDexXHUwMDAzg9Y8J83HVKtuJrtL5bRUxKFcImw7x1wiseU7j00nXrNcdTAwMDRGc+0rplx1MDAxMrFcdTAwMWKj/brjpF44XHUwMDBi0ixcdTAwMWVZapdcdTAwMGVcdTAwMTDjXFxcdTAwMDdYXHUwMDA0YWu7L1x1MDAwNUPVQaC75lx1MDAxOVx1MDAxMlx1MDAxZjbWwpzqOyVcdTAwMDU3Kb349cSkQan2iK8ki6JPXHUwMDEypWOMXHUwMDAxvtaqyESO+Vx1MDAwYlx1MDAxM8/j+dLf63FcdTAwMTduoI5UIMFqXHUwMDFjITWYMN+qqqZgPaGcK1xcXHUwMDBlQ+CaXHUwMDEzPmI4ZkxcdTAwMDZUiEqZvTOeSpB3bGg1XGK5aHWGXHUwMDAwb2RcYuqeNdmiO0DaXHRcdTAwMWR2+GFnNlxcNVx1MDAxNfK+XnWm5e8y6W/GTVx1MDAxZlx1MDAwNPRExElvb1sr01BGY1x1MDAxNrhcdTAwMDFcbkdYw93Ym4WjzTWlYKy9wNV49zTgTvg+ytjIzq9ntL7S+sZg1T2jsmNcdTAwMTdAu1x1MDAwM3I3XHUwMDEz1kqNaXGO6pGE2uRE8FxuXGJK17tAkeSZOOL3TdaKXGKQNyN7QtwlmVXfQMqLd1x1MDAxZW6Oje2w4yXeumizvS9cdTAwMDdi03rLoZZMjyhbXHRcdTAwMTH6Y1x1MDAxNCNcdTAwMThcdTAwMDdccqI/8/kkI5GV7Fx1MDAwN9/HqEDbXHUwMDA0XFxcdTAwMTDr9TXUpi4rJb29smPGQVRiXHUwMDAwsdfEsGtLpkjtIO18VMlcIvdEKp/SUjxcdTAwMWOpyWVTcH3Nzsw9yKRcdTAwMTm5LXx6mkSVPJz210V02HtcdTAwMWX0jYLvXHI1cFIt7MoxXHUwMDA07euZ0b2hXHUwMDE2nd9cdTAwMGXtndvN3MrEWXym5H7mM0o+2Pym1WGdWXneUkxOXHUwMDE2XHUwMDE1/64hmTXF5pFqgYrS6yOVmVkjXo+2tLi1Uzk7a9c2WVdipqtccsm6YZQ0mZw81p29OqMwJe02JLm9jlx1MDAxYVLseN7UXHUwMDAytWM886hxhdCua31JXHUwMDE3uF3q42z2s5KpipaV+2mvQlnvL8wxLXycjJpiM4T6XHUwMDFkL/2GaGlN09a9OducsVTpjb74VbrwimkxdKs4RVx1MDAxMLpRdNhwXHUwMDE4U5ORRVx1MDAxZHthXHUwMDFhJqw75ydcdTAwMWPJmdlmJl62uFRcdTAwMGI4baiRXHUwMDAxcepcdTAwMDTigHC6QvNQLDzLbnC7w4WWZyBJ9U58y4NcdTAwMTAqgDbawFx1MDAxZsaFx/j5dIr9eDup9zqExzgk7mqTtpdRldyVV1x1MDAwM65qJWdFXCJkSDVcdTAwMDe/RnbXe4kybWdymKapbzSFKvi107yhdHyqYeZ2j6SW2lWRqYU8o1x1MDAwMbeL5zqtXCJcdTAwMTjCwftcdTAwMDG7R6VvXFx2pdjvnVx1MDAwMr/s8JHMqS0rsaeE5sKZK9pYu6BrOeVRa/jqgdNaXHUwMDAxXHQ0qT5Tw14kXG5cdTAwMDVcdTAwMTZrP/DqgCGc8baEw+RnlnR3pDRMXHUwMDAzSFDMziZ86H5BXHRcdI145NDcOHVhzlx1MDAwNZf2ZVx1MDAxYtt7flx1MDAxOSvP01ZPY1xiODdcdTAwMDFcdTAwMDRcdTAwMTa68uOooWpcdTAwMDI6QGM2ZoyUnKg5XHUwMDE0y2tcdTAwMDU0vlx1MDAxZkaex972qbzzwbVcctKkJ1x1MDAwMnUsNZdcZlwi2+72tVp1XHUwMDA0YojeXYj5WPBPcsDix1xcPsfscjuv0jW1XGZV4aT6OGrSiY1IqMOHQ9jy3MpPoqzOnN/qXHUwMDEz3zluiDBcdTAwMWWHao2e66YurGR1cq9cdTAwMDJ+SlxyQ2XZS+ayu3xnMLrWqOZJ9lx1MDAxMnnDLbdAdEIjOlx1MDAxZVx1MDAxOFjmb056zlx1MDAxZt0vU17NUHZcdTAwMWXCajFUqru2+l3ZmVJcdTAwMWLcXGKA5Vx1MDAwMPI5djH9gUouXHUwMDA3+XgxamOCU3mBfNDfki/zzIzXtolcdTAwMDQsoc5cZi4rNWJcdTAwMDRcdTAwMWSzry2Cv97zqzTf7XNM2LVo1qKu3oRcdTAwMTDWUVx1MDAxZOhKTuslMtnCy6FA4lTZjVa9hvOQYDOH7jF6QIxM89qsls9cdTAwMWG7jFxyXHUwMDA0p1x1MDAxZS5rkqakKOVibMmsjjJcdTAwMTnSIThSXGa3z0jleFx1MDAxOLLp0Fx1MDAwMSfCydq9S1x1MDAxY6ZcdTAwMWPq21x1MDAxZUf7bVxiWlk7SChnSieu6i/jeiwhLVx1MDAxMnaBaHPzjuJjlipuXG7FXHUwMDE5XCLcXHUwMDBmvnhdQkSc7FOZXCIoc2dVVp846FxcK66gq8m4XHUwMDFj0dMyb1x1MDAxOHJcdTAwMWUlL1Mhdlwik+nCJEugncx9wt4kQjT0M4SiXHUwMDE3bqq3VXQvx1xc7nVWUbNJgJT8RJZ+PStat+luXHUwMDE3Wl1cdTAwMGa7uVx1MDAxM7OW8SQ5k6DJUYOCTpgjXHUwMDEx3fiVXHL9+azMIVx1MDAxMMKdaXq9bUNwxG6LK6Od791cdTAwMDGxQn6aXHUwMDEybCr8nlx1MDAxN1x1MDAxYknKo9ROhTWqZVx1MDAwN9p5XHUwMDFkKnmCh5WGbKe6Wo5VbOK3KFx1MDAwZq71XHUwMDAyXHUwMDA36sKFXHUwMDEzS3EtM5dWdZsyiVx1MDAxZJdcdTAwMWXb1ppW8yzgKz1TgclcdTAwMDPerKJM74R+XHUwMDEyJqY9J5dCQmuFu9p2p2Dlyoe2aVZcdTAwMDXTY8VcXF/A+zQ0X1x1MDAwM+zOT0V8LcRcdTAwMTbck5n6nlJ36lHEpHRjeVvDO0BxUPS3XlxycH5cdTAwMDd5blx1MDAxM1x1MDAxYZ3PXHUwMDFlhiYnNE7LkGgyOVx1MDAxYl5cdTAwMTJcdTAwMTjmNpKv7T2VwaBcdTAwMTVcdTAwMTL3rERl3Fxy5Vx1MDAxMDjb0FxcckFOu+bKQFx1MDAxY1x1MDAxZVx1MDAxZLtQXVx1MDAxNbeJb4I9XGJaco1KfKtF6JbWgzmdzinE09bOtEtxzYz0JLFcdTAwMTeXXepcdTAwMDXNbNNqzJ1bSHDoV6p/t2+nXHUwMDExuYWwd7p0XGJx61sli+Q8tEtcdTAwMTCqXqU09lx1MDAwZXVccm3ZmN1pznFcdTAwMTU81Ths+8167HJnXCJP3e02qGiYXFy13fXkwOjuXCKcIExcdTAwMTLLJimKMVW7XHUwMDAxz1x1MDAwMU9y1Vx1MDAwMNd7uGTvxJQ1pjDvznKb2G0qXHUwMDAwOlXurnGb9dS1TOFcdTAwMTLc+2VcdTAwMGJBs2Sn8THllaNcdTAwMGW5QkiVTLqFWtyYx0tcXN6Xc9xnV2ZvXHUwMDE5+LpcdTAwMTW2zvksOfdV6rtcdTAwMWTi2MeOmGHr0N9cdTAwMGVcXIneq1Aw1eGhXHUwMDE5RG57rThdVtx4u3W6g5veVMw4ZW4z7kaBw8A9lW1cdTAwMTJHZX2+8calVEfBMvdjhYzpdFxyytA4690hpCF9R9Dr2EO7NCFNolwihquFpIir3C0+XHUwMDFkhfBEhf6WabVta+YgOiCWdKhKXHUwMDEydDdcdTAwMDL6YatqR/hwRlx1MDAwM+A5NluF02eYhuSoSFx1MDAwM1x1MDAxZeL741x1MDAwMULmXHUwMDFhOm/uXHUwMDE5vFx0WCmmeiBcdTAwMDPx8XLWj9dccnuFldVNXHUwMDBmrTPfhZ00WbRvz6Ejo6ZyTFvW4fyiRlx1MDAxMtZgrlUnXHUwMDAwbk/7+6kmL9z1dlouXHUwMDFie0VMLti4mZ7Ax/tEXHUwMDA05L12VmFTzvK8XGJ7N+ZcdTAwMTYkmevzwFx1MDAxYsQgl2pcdTAwMDLHh119LXdiqFxykUNkXG597lohJi/9aUGNpW64XHUwMDAy21x1MDAxZL3U58T1XHUwMDE03ztcdTAwMTA/6lx1MDAxYk6h7WNGXHUwMDA245k/eslcdTAwMTlcdTAwMWZcdTAwMDW9MNHmTF+9TjqjJuOtLGg40LT8cVx1MDAwNlxcfoGw/WHKpVulgXg9OMOyms9Z1Fxuver6I9Nl5lJXRZpcXFx1MDAxZFx1MDAxME7NvYzwsnlcdTAwMGJkbeuKYyvo4vZcZo/9mlx1MDAxMMC3XZBcdTAwMDDjqu7IQrdCUywmck9cdTAwMWQuodtzcOqhuc9KvjX7gC9ZosrRhFmZK5Bae8rdiGUxdWE2XHUwMDFmNyqgr+t42rvZuYCP/OVcdTAwMTD2XHUwMDFiXCLeXHThZfaOmVe1osmeULdcdTAwMDF3dnU4SSyOKyVK6Fk83L1cZj1GvU8zmLC5QtK0v9VcdTAwMDXbXHUwMDE55vXIcmJ4pLT72PH3XHUwMDE0XGLkguo3dyWOR1xcRVi/aHRk65acXHUwMDFieCxccm3Ie7fkjImBe1VBw7pmI6+YnKZcdTAwMDTOXshcdTAwMDG8z1xcx85odNyVvWtcdTAwMWHQ7CpRXHUwMDFh2Vx1MDAxY6+MemZcYt6UpsyGdHSop8NFsnIlSzTI0siAk6nIUVo2OiCr6+E6XHUwMDAxXVx1MDAwN4drzygxV1x1MDAwNVx1MDAxML3SVDOpK1xiXHUwMDE2lsnTPUulQfJcdTAwMDdHNkdcdTAwMWbq8SOvXCJlUThDZI+MXHUwMDAxJMc6iJU7kah/01x1MDAwMDVcdTAwMTR31PvwvVx1MDAwZT1cdJ6xXHJcdTAwMDBcdTAwMWTUOLE/JFx1MDAxMZqgXHUwMDE1XHUwMDBlb4Nr4VSEPODNjIY5z+crkekxblx1MDAwMWk8gbeDWIJcdTAwMTN7i2SSyVQxeHVFeqNLnjqEhcFdXHUwMDA03KumJN/qVWPISX/bXkSL0lOCtyQmO0OG7FOmaVx1MDAxOVx1MDAxOdbnntW4p1x1MDAxMi2OZ95SsVx1MDAxZEVYseRcdTAwMWIkT0/LRtFEXHUwMDE0jlxygvB8Nt9XMoiUgGbJJVPeXGJ1KSzrSMKGW8GFWOTqmVx1MDAxZfOE7Fx1MDAxZHc2XHUwMDEwbb63R4vN6IQ24Fx1MDAxZaN8IG2ihCFcdTAwMDTAi7pcdTAwMTKYXGZS7DXJXHUwMDFm51BRq1x1MDAxOFx1MDAwMzdTIXSsdtCEXTTxcKFMcdpK4SZaXHUwMDA0JUjvZpZGw1xmoTeXiNqNp0ZWjt6qWWv9c2JhXHUwMDBlXHUwMDBlXHKb9lixOTpcdTAwMWP00d8u8qE2j7A+lTrAyFxiY+1EXHUwMDAw7jmbXFy7da6LVjP4welcdTAwMWFcdTAwMDb4/3UttUKWjqxA9Fx1MDAwMlx1MDAwMsKF1rkzXHUwMDAyY1x1MDAxOGJcdTAwMWEv7e5cdTAwMWMt020+rMZcclx1MDAxMPPE3mifNpDt3KL8RqcotpSdUZ9iRqf8XHUwMDAzhqiOg+/9Wlx1MDAxMYW9sTYst1x1MDAxM3JcdTAwMDMptqKAXHUwMDFjhFx1MDAxNPfUXHUwMDE5cvgoLlx1MDAxOGCnXWC1RZ+7YrruJonb9uS5K+lkXHUwMDFiUvVOXHUwMDE0yIpcYrFcdTAwMDGLq1tZUm2J8G1cXP7U9iPhXHUwMDFmXHUwMDA2TTGuMlx1MDAwZVwiKrI/4it9z4tpisTmXHUwMDEy7etxRHnDvF1wXrSs3dphXCJlXFyKrlP32exUW9GI9IOCNORFXHUwMDFjpnlcdTAwMTB79+Jf4HmprqPDLVx1MDAxYiBcbnSM3K4/2chcdTAwMWWhi1Ry55YsvEVBfYWKblx1MDAxM8CVZaIxQs9DZicpxlx1MDAxY6BcdTAwMDN6QFx1MDAxNTi73ZXRUSRPm9FcdTAwMDOjZ1xc11x1MDAxNcg6sDRDabf9mm2aw4kt0jzFuZW8QHvRoGGZ2lt9Z81us1FcbuBdT3wkmZlcdTAwMDOFvN87k6jsvMMgKPvTKUemoyrtyllwU5elRFx1MDAwNXeIVpvup3s1hbtCZVx1MDAxOFx1MDAxME9cdTAwMDKeMWFm6SVcdTAwMTGpoEiwkpDlXHRcdTAwMTgzhm1xXHUwMDFjd6JBNNa+OdGXsO8pSjpcdTAwMTi+azgh1Yv5aXDpXeHtUVxmUrfsIDtcdTAwMWGfIzZv+1x1MDAxZbqN5VxyX6U5XdzPUVx1MDAwMLsmad4mJSv7m7RcdTAwMWJcbmoniCidZGO5XHUwMDFiQMzJQJZhMqW09pPSLnrGOzFWXGbkeVx1MDAxY85HymGioY9OprCR77ORqVx1MDAwN1x1MDAxNLWD4jZcdTAwMDW8YVA40Y/htvPnVC6xXHUwMDFk4EuomffJnoqHybT8W77BoYuzuc/DpTfWw2VcdTAwMDE+yOdKNndH1MZ3MFlzbCVcdTAwMDN9wdZcdTAwMDJcdTAwMTllXGYhXHUwMDFmnHGDatLlXHUwMDA0afVcdLjFXG4+YkU/8ZnMklx1MDAxOKm7jsXfp5BcdTAwMTf4XHUwMDE2hG/XXHUwMDBlj1x1MDAwN8ryWG+1s41Eulx1MDAxNTn2aX62JVx1MDAwMavV6VxcXlx1MDAxZHm6nlx1MDAxOU1DcpXjqdvJaHi2TULPXHUwMDBiWFx1MDAxMJvLbszYMvB3+mg6XHUwMDFimYu0XHUwMDEy2oeJvWL9zrNx7H4zzf2NXHUwMDFjT3NHju2m3nK1mlx1MDAwZeZcdTAwMDJcdTAwMWSBbjebxZD4rZVlrtRcdTAwMWJWW4K4pllJ2nCgSTPLck9Z86zk7cnSMr7aeLvCXSYgdSO/KCXxflQ1JnjoT8BOVVxyNDzHn1x077w2QFx1MDAwM2TaJXRu1e2mr1x0a1x1MDAwZqLNXHUwMDFj7i3TWUw8XHUwMDFmQYBwi89cdTAwMTWEqVae+1x1MDAwNFOl15BbtHu+Nz0k54E5WdCJYFx1MDAwNlx1MDAxMd3eaKsrrvPpIEiSPe9GPZVU+Fx1MDAwNLFcdTAwMTVcdTAwMTVqO1Q75dl52Vx1MDAxNF1DkWrMXHUwMDEwZqyXhFx1MDAwZS0laTOY+Mj7UVDra61cdTAwMWWGmDzxcVOYPbw/Jz3MtFf1Pj9yXHUwMDFiXq2nlXdA9paa5Fx1MDAwYrK0R2QrwDl0OSprl5yHyMLYPdLIhKnfXHUwMDE09GJcdTAwMGIghIAlXHUwMDAxXGKC1WT2bJHj1Vx1MDAxNYLVrdXXrk3UcU65OW8gU3/Mjm6bXlTbUORZXHUwMDEwtmXP0ujGXHUwMDEyOUxb737V7lx1MDAxZI7No8JKw2zHop28YbXUiK5cdTAwMWKF0C1cXFTsMtCbXHUwMDBihE/a9lTaXHSDo/JcdTAwMTV2oJN+a3FcdTAwMWRHpCtw6Fqzo2bFvrouQjNCeD2dVmNcdTAwMWZ6+lx1MDAwMT9RXGLqXG5cdTAwMWHSnDrRvnLb+2bSXHUwMDE5PlaP7lx1MDAxY50+xHBcdTAwMWJNdVx1MDAwMvtmMkevYlx1MDAxNlxihHFnee2D+35kjrbpn7uFklxiYz3DVV9Uh8rqtqGrXHUwMDAzXHUwMDAxjppJ31x1MDAwMmbzJEVp5GOKiLPEYzuBLZF2R05cIjdcdTAwMDfljbxcdTAwMTK367rZNtI5VrpI6ZLeX2Cli1x1MDAwZiTD9zerRnv2hFhcYua1yaFgdW9cdTAwMWMkXkr2zHip86ZcdTAwMWFwXHUwMDAxdz2pXGJqYtWdTcSqslx1MDAwZp5PzJ0zhm6XidjeQ37cXHUwMDFhtJQzzOnuNq465GukKCpuMYzIpLuMTjVPaFxyLFRu29RBOIpvleByXHR82WxKwbTvnVx1MDAxMIBcdTAwMThcdTAwMDTE+ZCEulx1MDAxYW9cdTAwMWZ1b8XSeuxvqXpcdTAwMGbbq2wskpJcZrvInawlvc3Mqm14hyvYO8bIXHUwMDE5zf2s14i8OI0n04vmbTktN2eUYlx1MDAwZmFccqxk8Fx1MDAxYrLhMYhZ0lx1MDAxM8VYTFx1MDAwMXtcdTAwMDOB7Fx1MDAwMN+AxuJN/3Rd+XZcdTAwMTYg69RcdTAwMTEwtYOQib0gon3bbpXqXGbjeIvhM+/ascDLXHUwMDA0n3CxtMrmvPBcdTAwMWNFXHUwMDEw9lx1MDAwZWqIXHUwMDFkxEQwg1x1MDAxMuN+VvFOT2FcdTAwMTZjyMlPI9ReZMGjlrtcdTAwMWQxI1x1MDAxNMpK3vfwXHUwMDAxv5JcdEpTiEfF1mhcdTAwMTQyt7PupKqyIYxBXHUwMDEznFxulFxiWW5Us7F7ms47otow6abzrYNcdTAwMGbHulx1MDAxM1uMN8/8lPu8eqxcdTAwMDOJM1x1MDAwNqdTplFt41x1MDAxMcuzO4LTpVxcuPdrzqOJjPL2uLG2U8jR/lFHYblcdTAwMTU1XHUwMDEzXHUwMDA1Kj7M5H1NToV5idtVLSxGTjNU2LFcdTAwMTfJzUzgTpAmlMxHPos99MPM+ohcdTAwMWNcdTAwMDVcclx1MDAxZKO061Yl0YxFezqhvGikxMZcXOxcdTAwMThCnd2W1qIxdu1oxqaBXHUwMDExushpWlx1MDAxMVx1MDAxN1x1MDAxYibm9pHT7ebI38qFsFx1MDAxZcW0VpW9U4zR4UAxpXc86l1KXHUwMDBlN8HjvXU9uaaD6ZZxuk5cdDvNvd2kjdJbp4Ep2TE0XHUwMDEza2fnLTQgvZsml4uD9LS1mcpMK/Ounlx1MDAxMbXdWlx1MDAxN+xQwdU9u8hGJ1x1MDAxNriJXHUwMDFhKWdcdTAwMDczdD6HtMw6UFqDaIXl0vjs8ZJFpyqlgSfb0jZcIobhcsbh5mjQXHUwMDFjs5y3XHUwMDE1soP1fGy1uJnGupjbXHUwMDA1v2hXKHCRMdI4ebVT0TJ39obHc3k7w0iXi65cIiDKxXNg30Yg3M88eT+GVD5dXHUwMDA2Jd1aLjax2/2W59OrvYp9d3SJkGVFpU7DsNf12miKY0+b97NaOOXew1hcdTAwMDNcdTAwMTDntpdPbFhU0Vx1MDAxOFx069RcdTAwMWY2XHUwMDBiPGs7no+QkHMwrNlPlu5cdTAwMWPjjUe4zbZQqy3soCXwZ1x1MDAxMVFcdTAwMWR3akkuwiYkZ18sZmTJoM1NZO/zXHUwMDEx7b3turCwXHUwMDBil3HM29pmp6WQXHUwMDE1USs6jHyxz0Eser1qTe6nPDlcdTAwMWYliDqXKDPtXHUwMDE4ZPGwXHUwMDAyXmPGpNBJr1x1MDAxMKrMzkoqTVx1MDAxMMrS+lx1MDAwNr2cXHUwMDEzebdvVqW6KIfr7sJ5s1xujb5cdTAwMWI3m45g21NidfepU89KtlNcdTAwMGZ2g92DMFx1MDAwYrM4OmJ1Vm9cdTAwMGahuN9WIWtRxFxyW8NNJoIg1rwqMUmHZHNHmKN29D3XzFx1MDAxZPasb1x1MDAwMehcdTAwMTFcdTAwMDPms7aSd7ufYjlcdTAwMTi69cUl4HituN1vZIbRQEtvJGy5a86t9yhv9dNcdTAwMWTbOkTXMUQ9kqt4qFO+x0nkmlBcdTAwMTdszVfcXHUwMDE3XHUwMDAyXHUwMDE2tddWxOJD5o+YWyfu9pJq2TAlh3BIXG5cdTAwMDZcdELDlNN8XHUwMDA3PDd0LneHXHUwMDFkXHUwMDE5XHUwMDEz+/WImGejiTV8a/e3UEr8wZ6OynXCXFzGzMi6uIawjVxmXHUwMDFlxZqS2+xgVbpcdTAwMTBhqzLQgt2Pk3AkL4t4NnembcBcdHwlTitysopDbzKUVFx1MDAxYlLhlfVVXHUwMDE0vFx1MDAxOHWP+sUn1TxcdTAwMTFcXLtzXHUwMDBmYaFcdTAwMTFcdEx3rIuNrFx1MDAwMIk/56vN61x1MDAxMEBhPnCaXHUwMDE19p7HbsntdXNrLt5yQs4j5Yj8bsFLqGrtZN5kIVx1MDAxN1aGUlxyOlxmouTiTFwitb+ypmmYvHlTXHUwMDE4Xrv4V9/jb6Qh0Vx1MDAxN9ehOjjuWVx1MDAxNUXqdcapNlx1MDAxM6NNfGEjhV3jdsHgi2pcdTAwMWHnlt2mq3dcdTAwMDRUVvbmWU9xhCb4VLurl2jbbuejLbbQnM/hQGsz0KGIgvZDssuTu+E20TTu1nA5XFz9Up17z1avXHUwMDFjoFx1MDAwMp406Vx1MDAwYkJOzaFoXHUwMDAy9tzQJ8E26rwvwp1cdTAwMWVcdTAwMWRcdTAwMDI861x1MDAwN2FP3lx0XHUwMDEw46neVahcbifNXHUwMDAzV8FcdTAwMTRJTShmXG5cIqeoMVFk9C3Q4Fh7jVx1MDAxY0hULHZP2jTnXHUwMDFli1xycYxzh1x1MDAxMDWd7YBcdTAwMTLczlx1MDAxMrb6XHUwMDAzjd09aSYtucRjIOWPmitSo5bjXHUwMDAxS1M8W9REpylnf6TbXHUwMDAzcuMspMbTKzeeWnzQYHm6pOmOM/GjTuKOXVx1MDAxY8yxLi9cdTAwMDckrlx1MDAxNM6dh3wzhVx1MDAwM6WuKpdMgXg3KMIzUNRtd1WrOJVrh7uhSSVMXHUwMDFjhHZN/et8QKy0L50zlUr0PYRcdTAwMTS9qy+P3FbF5E3My7t6sG7ntFxiT1xcs4WWR3ZcdMhcYj80fN7Ph8raJNfL0VRcdTAwMTGsO1YpJDmAy7BNXHUwMDFi66u/Zlxind+usoz7O7SdJpVb201gIG5cdTAwMTg0UrVKkGRzgmil7lx1MDAxOY1cdGpWO4fgr2wspY1diI3K7ONzXHUwMDE2VPkpuNog5ImHsVx1MDAxOWZcdTAwMDJhzlx1MDAxMepZXHUwMDAznHW3O4VuesJuUKVXhtZ2ZCH0efwsPmL6YnbPcGM2Wlx1MDAxNE3MXHUwMDA2MVxcerO6O8TdY3DQhb5cdTAwMDBVsjYuPuWzzLROI4xetpBDM7haXHUwMDA3movtOEFnXHUwMDEyXHUwMDFkZcTgXHUwMDBlXHUwMDE0gU7aXHUwMDFio+N6miUv16VsuIQ773Lxzlwi/Jjd+EFcdTAwMGXvZ25DhvC5q1x1MDAwZd2B65zjmev3Y33vjuw148TAVtdhx0/uzcdcdTAwMTnuKlx1MDAxZDj2jtB0aWvIdttcdTAwMDbkwpatXYFWQDtcdTAwMDRj1T6QXHL7mlmyi4TmXG5Bdabbbr32uEWBmNOw6GrZX/KuJVbDLY2yc1pWzmqdruuBPNo9453JtNqEVdCe/Fx1MDAxOGL8xDzbXHUwMDA0vrMqceOdsVZcdTAwMDNSeiM0yKk0XHUwMDBlXHUwMDFii0TM21x1MDAwNoomP7rafX+5JJJ+XZzKua5rXHUwMDBieZR8m53yfohcdTAwMWNNgrJAXHUwMDFl+J21rHEqMZYz7O8pSrLCguVevfFweVGKXHJZdFx1MDAxML1zuLOvcZDP79JcdTAwMDKftv5NXHUwMDBiiuZcdTAwMDBVXHUwMDAx1+lxy572ibBh5PnMXHUwMDEx99FX4Vx1MDAxMEOKfaRcXFx1MDAwZanG0bet1IfWfVGlfH/tKGwokFwiPPz/RLzH0qQ603B7QVxm8G6I967wzPCm8L64+sPT+/3+XHUwMDEzPero6Fx1MDAwMkQqcy2klKn8rJyAJpy0XHUwMDA2aW8s6Fx1MDAwZayFXHUwMDE4QUv2RsLiVEqAuKFLK1x1MDAwMtyEVu18+rvmN//bzP/3XHUwMDFkXHUwMDFltrtcZrMwXHUwMDAwZl938pBjXG6Du9CQeo0xwpBPdSrZ3NOY3+tFm7tcYlWtXHUwMDFljP3acEGDx1x1MDAxN27T/lx1MDAxYlx1MDAxZv59iIReZz/4XHUwMDEx9KBcdKJWSJnYXHUwMDExlXHywlx1MDAwNOiwXHUwMDE3TFx1MDAwMyNcdTAwMTJSiMNG2Th5glVr1Vx1MDAwMTFEk1x1MDAwNlVcdTAwMDdZXHUwMDE5wL5cdTAwMGJcdTAwMGU1QL83JaTGbX+yXFzFXHUwMDFlxiQv9TvXXHUwMDFjnSQoXHUwMDBlXHUwMDE0XG5rdrFNnI6+b38p3Zla16JcdTAwMDBcdTAwMWJyOqvkiFi+SUv+VOXhKVx1MDAxZlwisUdcdTAwMTAv5UyMvYl6pMBLuNgpmPKX4/L5ecxcdTAwMTT5W77AUrklf1x1MDAxZlx1MDAxNsA4vuLJN+w4XHUwMDEwJM3ampdpOHctuclSPfihVsy1JVwil1x1MDAwMeIt/MDgrzbeXHUwMDA3yEdIQOGu0NriXHUwMDFh6+Vpg2OdY93AXHUwMDE0jpaxf2vG1rogXHUwMDEzXHUwMDEwd/VcdTAwMWL8t5nExWD9XGaMX1sgMDTgXCKqnywzX1x1MDAxMKiiXHUwMDA39TuUpGZh/GWSXv82IVx1MDAxZbve228mw6qPXFy41lxiR1PAxjPzjpqgXbJ5XHUwMDAyJsRk6tW9xPNcdTAwMDBhnqErcsLf5GSh8TfW9nAlUqjgM1wiu3WXUK/rPYJqe1x1MDAxZr6d7nDQITeXgH1/U9w4nUdC8PiDc0pcdTAwMGXk/bjNdIOtgFx1MDAxMFx1MDAxM2hcdTAwMWZcZq9cdTAwMWZcdTAwMTS7qKX0WpSolrjWWyrGL9N3o4pE3ku6k0h88jieIeWNnFDL+cJBp2eOT8xcdTAwMTdkXiduwt7kz1x1MDAxMZ4+eGF7z52Eua/yXHUwMDAwiFx1MDAxMlu0XHUwMDFme5Hp4LlTPzDqh2K0OXRRZyXjYoE49bTfWpkkIZQ6nsWJR0xAVFx1MDAxNjqMf7tcYiRcdTAwMTHmXHUwMDAzMCDfxGXk8T/biThcdTAwMDJd+qj53Vxy5bBcdTAwMWRcdTAwMTJcdTAwMGUhf1x1MDAxNblfVbTy3tuLXHUwMDAxv1x1MDAxMpKm2q2Mw3o9XHUwMDAwwGpQoj39p1jsxyle6inS07E6wqK/W0+JbFmsoFx1MDAwNO9xUOIneiZTR1x1MDAwZVxcXHUwMDBlUZNcdTAwMWbd9C3NPFx1MDAxY2rZLsVAZsD2jF8pXHUwMDE2XFyL+vnFqSfA1t9PjPvn405cdTAwMTk6d0RzpW5UXGaVZsbflc6h+fsxOXP6uj9AUyFMqkRR4FxiXHUwMDE1XHUwMDFhqv08XHUwMDFiXHUwMDE3XHUwMDA2i+BlXHUwMDAxYZbVnzFcdTAwMGa7k2TEuN5cdTAwMGLpiVx1MDAxMpyYVS7DoPAzp1x1MDAwYmT3qFx1MDAxYrpw5nYqte9k46q3cJZC5Vx1MDAxZslqbDhcdTAwMTbFY9OjXHUwMDA02nU1d4bzXHUwMDE2ldhp6fHzsVMrVtdihNc9wFx1MDAxMDKLXFzMJHZvu35rM+J6fZe/XHUwMDEy1lx1MDAwNNTaa6r+yi/8S19cdTAwMThLuScyKfJxutRcdTAwMWQy0dbkeVx1MDAwZr3VSc1ZTPN2Jq693aLWXHUwMDAyI2Hqz+r/rVx01U/Em2X0xX615MteJlwiXHUwMDEyQ1Vqq+9vzfDzlFx1MDAxMGPCrbjijIa7XHUwMDA2xVx1MDAxY2ykVb+c4jGjXHUwMDE1umeIbFrvXHUwMDA1NXHIXHUwMDE3x0pcdTAwMDOIvH/palxcw1x1MDAxNbZkO1hks95Hn6rs3VWFf/5QKekgJKSWI/zE38dbfP7zXY/is3PGZI2/nVYgfiuR4qqmXHUwMDE1gjJug5iT5NNw2Hcjilx1MDAxNtgmXHUwMDFkT5prjauEXHUwMDFlXHUwMDE5amKeXHUwMDBlMvz7TnVkKuk082ZSXHUwMDBlbfZjkcrKXHUwMDBmXHUwMDE0kM9cdTAwMWFkll9PXHUwMDE2QodcdLYk5n14XHUwMDAxSlSXVnfI5Fwi8kaf/au2ZYx6SDdwPuKZxZfijcqy6+eCN/i9XHUwMDA3kePzr+KAjDtcXGPxXHUwMDFkYrdUZq1cdTAwMTgm4XGaNJMpP/aWN7OMv1aIXHUwMDFlfNmLXHUwMDBmh/w2eFx1MDAxMfSw0Fx1MDAwMN+NjXJcdTAwMWV+pCzGXHUwMDE3h8CMXHUwMDEyYcB+uFx1MDAxNalx6vTGXHUwMDFiXHUwMDFhxqRRU2tKW7FcdTAwMDG5fmGBr0tkeDHEtEqfYjZcdTAwMGafJjraXHUwMDAw717AVZCWXHUwMDAwadRvOGq8rVLJo95cdTAwMWODs2gjTrFwPlpNJFx1MDAwM+ZsYGh3d1LePnQyv15cdTAwMTJcdTAwMTQ8x4RcdTAwMDf9XHUwMDExZFxysVSA+eJcdTAwMGJcbuuuWNxJ8DtOmD7j41xyXHUwMDE3l6kvzJmvJ1SYKVtdvVx1MDAxYy/8+fv/mYuJiDKBXHKcLZaRwilKWuzB6+1JoKN4x1PnXHUwMDE2XHUwMDA0Ru7X0NdH2dL88F2heambv3tu3rBcYlx1MDAwNsdrXHUwMDExX8lpXHUwMDEzed7otLu2XHUwMDFjamdcdTAwMWLIKfiS7mc9XHUwMDExQS/GXHUwMDAwXHUwMDAys+1iIaI0J/bft/yiOcSqT5dsgeRS/8bEnpLri1WmQrRfxOgyJNziSu62Ulx1MDAxZICU8UxOXFw3gmRcdTAwMTOGtWVcdTAwMGb+rdDuozP8JZ+YruyOjqgng3ecQzcqv1x1MDAwMVPHvoWa/ItBI1x1MDAwNPl5XHUwMDE3XGZDQszrZojZf8gl+41cdTAwMWYoNLF2XHUwMDAyfcrBXHUwMDFhg8VAaVx1MDAwMl1y7FBJfce1S3XpvJCYxXlccs/ilkM0Klx1MDAxNkrJqGeXmIti7ne8ua+tXHS+2402XHUwMDBiXHUwMDEyY1x1MDAxYrlY8/zvmnqAXHJZVFY6Nlx1MDAxZU+RVeK52ima1+BiXHUwMDA1L0OlgC292lx1MDAwM953uiDGIWMgRzdcdTAwMDZIdimTOPGO8152oo3cXG48XHUwMDBmwPqvx9vfXHUwMDE0eemJ28huuacqW2iMfX3mi5hcdTAwMTJI1v/ym5GCLL5D5FDeXHUwMDFmRSd+pf/qoctzKr19v6FdfKzPNuXeV0B9m5crxoAyp9PeVE982k3LTL0/XHUwMDFjZHNcdTAwMGI8w1x1MDAxY+Zcbu+DuvQ8fT0t/I2SLzx1k5EyZD3MXHUwMDFia//W54p0XHUwMDFi35nysrRuPSEqZE6gh5qH6fJsXHUwMDAzsMKXrmCpTrxFgGFcdTAwMTJAjr/jXHUwMDBlTUG1PMY7tv5v9nPwgzX0ldV91n1cdTAwMDafYjduc2m2ryb0epFnN36q1vxvnbAtXHUwMDBmUURcdTAwMDFdMItcdTAwMDJeyaRcdTAwMWIxnnz4XHUwMDFjfl/e/43Xb8tcdTAwMTLyNYP7a8xjcFBccrHd3yyOL5hFXHUwMDBlOTZcdTAwMDVqisP71LTnW56Wl7K+wVx1MDAxOURcdTAwMDe9d7fa61x1MDAwZjLgi1x1MDAxNebGLtZcIiRVXlxyLYtOpEuI/qtFeUhwhnmhO1rY0fzVOvhNJ8ujk1x1MDAwYoDyrTGo6tfB985cdTAwMDCY59979E9cdTAwMTelXGInZNHshVx1MDAwNCfsXHUwMDA0+XpdjUCHciYwtvBcdTAwMWZcdTAwMWRcdTAwMDE0mzc+oFZcdTAwMDBfXHUwMDFlXu+hs87RXHUwMDE4yZB6XHUwMDEyZ4ZcXFx1MDAxMOrynzLOmKCrx4NcdTAwMWayKFx1MDAxM1x1MDAwNfLc3MTffjXnX5dcdTAwMWVcYthcdTAwMWW4V/tcdTAwMWW+4WTmkV5cIs3++tdet6Ge34Mmgb+Z3lx1MDAwMpKlrW6xT+yreKKs8Mnlke2pSupcXGNcdTAwMDHpfis6Y8WksqPWwrV/sWjivI0/lE/bxenSXHUwMDExUa+OyNhRdXSiXHRxXG6jP/xcdTAwMTS6LNZz6Crk4DNvpaBcdTAwMDbiIVx1MDAxNydg+NyYXlx1MDAxY7Fhy1x1MDAxN7FTnJFhmaGxiD6bX1x1MDAxZuOk01x1MDAxYmL6qawoq1x1MDAwYqGkhtcqP1xmw9SM0Fx1MDAwYk7gSFx1MDAxNIPFpVx1MDAwMKupxzRcdTAwMGUkYzom+utcdTAwMDKQvk9cdTAwMTZR1PaTraFcdTAwMDNcdTAwMTlcdTAwMWLMM74ln2ZMpGd5S3RcdTAwMDJqUkaQ7dpn7Vx1MDAxMU37XsA21FpRRFx1MDAxMDlzgqzjkba+SXaCXvVg7GuujUzcazct/Fx1MDAxYnvfUf59KVx1MDAwZvSvmY46P3vSQTCysUSnfO81UVx1MDAxMH7i30YqXHUwMDE4z8lcdTAwMDZcdTAwMTGV5D5cYlxck9Z8944mTkVBM92Lx2uZV2N0+H2f6eic8HpcdTAwMTh9ajaZg0svXHUwMDE0tdl7SYKxzbzpXHUwMDE3wyCwgFx1MDAxONV24Nk3S/+3R+24yOS1XFxcdTAwMTnH1W5Jh1x1MDAxOFxmYnZcdTAwMDNhXHUwMDFlcOP4NtnSRJW7NI5/XHUwMDFlOyxMr8tmXlwi4JU5ejdcdN7BkNxKgtJcdTAwMDe5dkbj9b0yxa2QMFx1MDAwZdLOnUKAgtsqLiVV2L7MXHUwMDAwXG7fv4Z+XGYh6Fx1MDAxNTXtxE+VXHUwMDAxPiC7yrtcdTAwMTCir1x1MDAxYoyGZY1D7fGMXHUwMDA1bsBJ0sPBqFx1MDAwMpZcdTAwMDZcdTAwMGbWyYPN34ZcdTAwMDIhcblcdTAwMTcwXqyMVn+BetiBflVcdTAwMGL2YdRLVkxfVKSL7I25Obb2l6PuWCGrnpBGudcq+JYytYokZDe9srLGYDmhNFx1MDAxZabU3Vx1MDAwMciTKm+da0RMXHUwMDAw5nh/n9RkS1x1MDAxNflcdTAwMGZcZoeh0FdYK2SYXHUwMDFl6+hVSr3uXo9cdTAwMTRhXHUwMDFkdl9RVZHTroB35UtrREY+s1x1MDAwMF9XvU1L82d8b3Fs2Px7SYuxMnttqSZcdTAwMTZcdTAwMTlcdTAwMTnjvz00dyDU/o6H7m+8qlvyM4XoiZS3OOTS9HMvN6neV3NvV1x1MDAxNrvuzedzcv2cjlxit9BaXHUwMDE2uEdm1id0Q9hcdTAwMDEkrdaeXHUwMDE4ccpcdTAwMTTlXHUwMDA1MXwxLcsxXHUwMDAzlrg3PSBkzdOywUpm/pmO+jFcdTAwMWRcdTAwMWVkesIjPjh2x2Bs0J7niVx1MDAwM8yZ615cYjZcdTAwMWIw0mUyuFx1MDAxMlxcR+K6q69cdTAwMGZ0XHUwMDFiioBiJOfNbFx1MDAxNzdcdTAwMWMkSWFMYVx1MDAwMHBluVlakG5FqJ6cXHUwMDE2Wz7NdfTG24uOYFx1MDAwN3xcdTAwMWOOXHUwMDFieFx1MDAwNlwig7joLVwis0FQfkRuhFNk4LNMYV4/NFx1MDAwN91cdTAwMTh0ZPCSM4R/SqR7YfYgjp1IKlx1MDAxY4r1053fcT1oUNH116bndFHOQffqXHUwMDA0syheMlFcdTAwMTcp5y+GuWNrj5gq49VcdTAwMGbJf1982FJcdTAwMWFcdTAwMDf/dlx1MDAwMiiBNVGLX4yrU1x0xlx1MDAxZlx1MDAxM3qTXvPEWFx1MDAwNvnccWY//a1tQrtkOzKjbkOiXHSDXHUwMDFjplwiZ+XNWOHN62VcdTAwMGVccvVwXHUwMDA2fP6gn6W8UVx1MDAwNUj5XHUwMDE1ulx1MDAwM6jIi4hcdTAwMTeG/DlrXHUwMDE181ltoT6+6ZefYH97IIZcYqrbnZVQref6XCIjQVx1MDAwMDi+TOXQTHArw6lDXHUwMDE3VW8vRvmWZk1pj6BcdTAwMTlBhFx0WPPcus7tysjR84k4LNC1xougLoX1aGroUmPaM0lO13iwzyp8K/L7dYpJXHTPIJPKxpb6T9Vcclx1MDAxMJuWXHUwMDFhNt7DKEIvL1uTacVoejFcdTAwMDFcdTAwMTSZSvi6pcLjYcKDXHRccsKhqYmY0UQqV6lQjCNDfkhyM31nXHUwMDFjLMhcdTAwMTJdgkVcbusmVWz8/mHspi3Slz7mr4VrdExh7lRcdTAwMTaQMHjqXHUwMDAyu2HWTf11U+tcdTAwMDZcclx1MDAxOFx1MDAxOTKE3564NnSCuEBXrIw9cDghQvaNzVx1MDAwN+tBVXv4q0Im2NlcdTAwMWZfXGa3XHUwMDAwJpSC7mpjMoiSsH3ba936klx1MDAxNixjhC69OL8z+kJ0IcCxXGZcdTAwMGY2vTVD2Cli3X5T6UPxe4xcdTAwMDYpfVxyXnPDXHUwMDE2m83eWqG2RVXI1qX/j99cdTAwMDJUjrlcIq07plBcdTAwMDa79v1atmit9ENfYFJwXHUwMDA2MWZcdTAwMTJccqg6IPWL66Bg2mqT6OhNNKjjlEtyXG7i396M5Mvt21x1MDAxNlx1MDAxYSW29Ueunov+1vl0MCQ2ckbn81xy71x1MDAxMNo+XHUwMDFiwoCOXHUwMDBlg5X/ykNIUmSfr4MqMl5U29K9abaDfjBWf2zvQWdccl3DV8/Ko1tcdTAwMTHG3+lxXHUwMDEzlnuOLFx1MDAxN0KiSpbjlNhVXHUwMDEwV7TwZWc52S8jlqNCxCt2vy9+/1x1MDAxMUvPgCtZwsUr1lx1MDAwN2xU01u/brlcdTAwMTbf4XI6KYyTXHJioVwijrC0XHUwMDFk+1x1MDAxZlwiseP6ILgs0tNdbfft5GzCvmqsb5P1u74pXHUwMDA2lWH6rY9YyZ36XHUwMDA15UA8L5O4QHWyeidR+MeXL4/shaXfKfWrqqe5zoZW79STatRFZimvO2mpXHUwMDE2XGYoXHUwMDE5Mlx1MDAxZPRV5GBcdTAwMDGHXHUwMDE1XHUwMDEwgX3nfqNcdTAwMDezXHUwMDE1XHUwMDA3XHUwMDE1hvCaVL1JvjZrXHUwMDFmRX32S6ntqJ9cdTAwMTNcdTAwMTk/xFx1MDAwNVx1MDAxOMBSXHUwMDA0sNX9LYqJ2T1An4lcdTAwMDG5SD81elxywP1cdTAwMWTAXHUwMDBlYXg012pcYpWWfJVcdTAwMWWXZ1x1MDAxOESwXGZcbupZ2+DVMUBy2G/lunKAmlx1MDAxOZi8RSHHXHUwMDE21lx1MDAxNDtpeEtcblxcUN5MXHUwMDA0zMzhXHJcdTAwMGIx/fIoWjdznLm1XHUwMDFmw1xmopdcdFxcpyTdS1x1MDAxNbdGXGKRRFxuTlx0o+G6ffZZOlpcdTAwMTUoSuhQIZ3vrlNcdTAwMWb14Vvwi3fnINaJQVxmLrpcZlx1MDAxZrd3+d+nXHUwMDBi8vinyrlcdTAwMTVx2adhp+YuXHUwMDE24Vx1MDAwYsck6va7PtL8b1x1MDAxZlEuljK9P6dE/3ZcdTAwMGZJwN+a2YJpQPreXHUwMDA25jveiFx1MDAxMu601qK8LVvbfsH7zlx1MDAxYT3KuXxcdTAwMTH00MxTSfpcdTAwMDW265E/xlwi3lxyX0u8XHUwMDFjtYfkXHUwMDAzTX1aoLxBPMtf5KM2XHIg/ypcdTAwMDdcdIfetJNcdTAwMDQw2Hm8oTo2coODUlx1MDAwMkG1YGrN2lYlW4io68zZ7ZjxhscwJ6JfqbJo90h3XHUwMDAw7qTIYWsxWMzhS0h14jw++WuCReVE1Fx1MDAxOYV74Ka6dGXnRuE1MUAkTEomhPGyiirtXHUwMDBiXHUwMDAwnPk1KTa0xqPXZNfQXHUwMDE5ju3xXHUwMDFjMkGUXG7m0vyUb5aInHzt86Zd2N+MXHUwMDAw3TyUz+Ayb272Z9GbR9orLlx1MDAxM5Ls54hfeyqOz5V288KW7njdSEaA31x1MDAxM5aY3oSM1JZcdTAwMWZ6KMxSaW7LtzOnXHUwMDFjv09lNU191X2NTFx1MDAxZKPizbnIvpOQK9Bd0jDRiDsjs1x1MDAwMJtcdTAwMTEndJ9fJlx1MDAwYjsj++PDe+/IyoxhMlx1MDAxN3N98ujk+y2GYk6IXHUwMDFjmT/JLGaDj5v9XHUwMDAxjMTkJmNcXLdcdTAwMTFcdTAwMTV8tcNcdTAwMTCNUkhYmCk0MVD5lS/lUpph6tiOdyypjvHx0iBnX0bYsyxccpFmXHJi0ickVop61tA5XHUwMDFlXGZcdTAwMGVcdTAwMDVlUXx2/Fx1MDAxZZc36EOH6ddcdTAwMWPM0sBje1xcMqBYXHUwMDE32fP7XHUwMDA17Vx1MDAwNsdcdTAwMTm0/tu3aFxctWxeNtPxvnFcdTAwMWI+YySYwVx1MDAxY4dyVVx1MDAwN9tcdTAwMGaG3lx1MDAwN8+nYkqr+uqlWjFW/PHGNOhcdTAwMWP22JjF0Lq//STCXHUwMDE2Mz0+zo9wq+NcdTAwMWF8hS1YoHdOUFxi9tPiq1x1MDAxZHP8Ly9cdTAwMDKBoUvlLECq1Fx1MDAwNf6g1fglbWFK81x1MDAxME1dXHUwMDAyl/OrqFx1MDAxZpv8ykHw8T/YL0wvQ1xcj3KFXHUwMDA2lLyx4Vx1MDAxMdDfuiGxYO88XFxcdTAwMDXR63Je+NX4nix/Js9j9Zs7pVZcdTAwMTJqo84waFx1MDAxNXRcdTAwMTEn35l/nE9wJD9kouunPyNcdFx1MDAwMmbyXHUwMDAzxUdyxVx1MDAxNpyMYkC9VH5cdTAwMTbOnj5rhioqt8zmM69cdTAwMWaaXHUwMDExUj5cdTAwMWGib6nrd2dcdTAwMTR455wjXU5ZN/BCeEtcdTAwMDZcdTAwMWLWdu2Jp//9PscrWU2tYOtj64D/zZW+tVx1MDAwNSBkqTPG7nnYd15orDDbwpbykz1cbs8zKIp6SVx1MDAwZVx1MDAwNntcdTAwMTbp/ZOiRZonNopuXHUwMDAwXGJ+qaHaay6qp40goiCAwWJ4ZnhpNHjoZ7RcdTAwMDDzdIK12XWkS3GESsqf0d6HfNZcdTAwMDD1bGNcdTAwMDJKXHUwMDEwtlx0XHL6QY9dcFxyXFzJcLZcdTAwMTOB2DNcdTAwMGVz0yvOyIG+ptbjf/1e6e36XHUwMDA27Fx1MDAwNlPpisD9vvm91pSsi2Vq7Z7O8XJcdTAwMThASY9cZltmXHUwMDAytVx0oW5cdTAwMTKrmVx1MDAwM5NcdTAwMTZcdTAwMTS5XHJ1Wi9xUyl1/JGaXHUwMDE2aFx1MDAwMI37bNXk6ppHfsq78lx1MDAwMoXyelu78EHzabIyJKKhZFx1MDAxMrNQRWlw7Vx1MDAwM3kmpnrbeFx1MDAxZJCiOmrYQVx1MDAwM7aDJ71cdTAwMGKs7Owqnan5XHUwMDEwMVx1MDAwMzDXYsVcdTAwMDODftFllkJcdTAwMTKPMLGXS1x1MDAxMUfPz7ByXHUwMDE3XHUwMDBlXHUwMDFm/9bIX31Lui/JbsXMXHUwMDE06qbhrDuAKLCk0+P/2+9cdTAwMWZg7FXIu8WsIHNcdTAwMTmAdi6UJpMlRb7JQZbe+fT3XHUwMDExValcdTAwMTiiI7PFkolcdTAwMDFcdTAwMDXBWlx1MDAxMTRHKs99j9OE9lx1MDAxZStlQ7BLilx1MDAwNEfuXHUwMDFjKk2gjOrTdIjVtMnTn0I5sK9TPjpFU1x1MDAwNiffh1xy31Mm3TLGXHUwMDFmViwrfnzdv5mTXHJcdTAwMWR/hbesnWFcXFxyPTV24lx1MDAxZPKpJ2crc/z28IZfwISxo3jhxqyNilx1MDAwZn/+55baVmZWlkJGr6hcdTAwMTUhQsD6XG6kx4y6RchcdTAwMWJseVx1MDAxMz8ghzaaz1x1MDAxMVFcIuZ6kdtcdTAwMDdlo++N9CRuYJ1cdTAwMDD+itaBYLLn5Y2cfc/HOlxchSqBLJoholx1MDAwNEU4ooj2XHUwMDFlROLSn0rqRU+21tvM0N/Pt+2oMFxuXHUwMDA1WTXWXHUwMDE0LKVjfJP27uXNpp5cIqFGKMisKl/l2PTQtD9cdTAwMDJGx6iWkFaF1ysoTY5Kx/CG0Php2I3+KejIJtt7l2+7XHUwMDE4XHUwMDAw5OVcdTAwMDNcdTAwMDZmIZ3RkdzY+MhcdTAwMTeraCdUSutcdTAwMGa3XHUwMDFlRPG3yuJTXCJcdTAwMWZ77smaYohHPfvl76tjXGIvXHUwMDE0xbbWXHUwMDA0MuovRlqWY1xmwC71XHUwMDA1p9Y+ykAwYFx1MDAwMlx1MDAxM1xm8YkqK095zlx1MDAxYX5cclx1MDAxMu5cdTAwMTBcIj/B62RgXHUwMDE4rarHs1x1MDAwNjFeUr3Ps1ZccpjZ50xgrJ7jP459X98mpaDsRml8nlZCSrm8YMgpLVnBmk3KXHUwMDE5XHSKJqrfpFx1MDAwN1xm9C+iPGD1pOPPg1jqY1WbP1oswi+db6t+vec1eYaP/5X/vregkVxy1WNRh4IlQfX8XHUwMDE5XHQywy6E9fs45PtsUetcdTAwMWPlNq0k31x1MDAxMUEgS69bQZtpTbdCbZdt7dGWXHUwMDEwOjKOYCs6e8tuiWDTPUygQc5cdTAwMWFjXHUwMDA2x/mS86WgeSnE2Owu0yllxf47it9cdTAwMTIw/cFkbIdcXOlcXJ1fXHUwMDE1x6DcXHUwMDAwMuivXHUwMDBmknb9/vlcdTAwMGXIWFwiMp1EbHzjO+W6u99cdTAwMTL0XHSYQLTI38WnP9uHvsMx3nmun34+sT6RrW41oVx1MDAxMMetozJdXHUwMDAz0VxyqPa0VsjjyVnuvjexuHZfo/yFXHUwMDEyI/hDZlvWP1x1MDAxN1x0Qm9cdTAwMTWXLfE1YVhcdTAwMDAsjIZ4TIDLXHLFXG568J5tUGLXXHUwMDE0I1xil3xGoExEUiS6uCzdPlx1MDAwMnxs36JcYn33PqtE8u6wSt9cdTAwMDQvZcB+XHUwMDFhQKO/Rbp99ZWiv+agtdMlXHUwMDEwgsI7kr21goU3+HFKenBjXGLKJO7oqjFcdTAwMTb+c+Ku5ov5Olx1MDAxNWtkNtXQXHUwMDBm1v1Wi2RcdTAwMWFcdTAwMTZcdTAwMWGY79zDJlx1MDAwN0bmgpKw/Dh6XHQpXHUwMDFj3s2eXHUwMDEwXHUwMDFm2KLNrmhzS2WSpGs460hAdfNcdTAwMGWYXHUwMDEyV7FcdTAwMWFUudfnXHUwMDEzeo9cdTAwMDSgVVx1MDAxYVx1MDAxYumDu6F8U0bhbKfvJ4FXzurFNrwqX1VcdTAwMGZcdTAwMTacYVM6XGJcbtc0m5BiXHUwMDAx+NdLXGJOvr5cdTAwMTP2cpqizFx1MDAwMme2n8qvYjjpR33s2qo/y+KUxVDi6WqKXHUwMDBijnbl1ufezkhcXJ2gZ5JCy5Muh1x1MDAwNH9+07moKVNcdTAwMDBcdTAwMTe9iaJTskPXNUaEqnRcdTAwMTlcdTAwMTFTXHUwMDBl0Vx1MDAwN1xmvoiY/a35SdpgxrJcdTAwMDDEsqKspoq8unwhk43TQYI8cF7kI8QrdlRcdTAwMTHYwyhcdTAwMTRLgmhcdTAwMTQ51L+9sdUp9WpcdTAwMTkjW/IjQuH5yK1gM66ZWYolLFx1MDAwMTUhp9dUXHUwMDBm6lx1MDAwMStBOfFk+Fx1MDAxNGyrwCC3zTsvUTK9W34/e3MyiON8Id5cdTAwMWH8VViWwl1cInb8wHi1vNmn05NAy35cdTAwMTWdpsdHXG6Qz/Ry371cdTAwMTOmpOwvl+yd+COxkD9cdTAwMDGk8/TkITw71lSFpG348lx1MDAwZW7XZiolV3DNVVx0SSb2sa7+nTunRFg+X3Xfd0RiRKyhJC1xXHUwMDEwIWuguOZUXHUwMDFlSes5v7h3NFx1MDAxYi+L74Q3OqtqJlGSxEaDbJUjXHLLXGLv7Vx1MDAxNlxyKlx1MDAwNiZyLYFKxJ4tiepcdTAwMDKcTU+OZsTm5Jt5lfbQoSWZ+VJIuJ/AfyX8vX5Pmlx1MDAxNXVcdTAwMTdRXHUwMDE4jvZcdTAwMTO03i8lS/yhR4RxXFzCcMW/bbC2tPZIr1xyjLBpelx1MDAxZHx5XHUwMDA22tS/noeo5lf4YVx1MDAwZbLFclb/0FBnjlx1MDAxZmFoY+xcdTAwMDCZvabd+Z3EvYLK3UpcdTAwMDNcdTAwMDLSoXJEXHUwMDFjXGYlZFx1MDAxZfd8hlx1MDAxYUfEXddFcFx1MDAwN078s1bRJ9qz4Fx1MDAxM6WIv1x1MDAxYkxnMrRRJ0VwujSGenJa8fNNMfKfXHUwMDBmUq5/XHUwMDA1ip+jwSFqdCrdXHUwMDA12Xomwlx1MDAxMlNmbyWsM/7C+DL/2lx1MDAxMeLdooayicPYNuWZ4jFtSCm/mSOppU0/uzsv8IvAmlx1MDAxZHNXs4RcdTAwMGZOezJcdTAwMWX6cy+yXHUwMDE56DOlXGaEXHUwMDE2IYO5tivn3PfafcyVhpA6SFx1MDAxMZa4jjdJpvzYW7xX5X5S8oVQXHTfWVx1MDAwM5l7XnREPVx1MDAwMe2VQmnccfJkccioXHUwMDAws1x1MDAxZnTP2HVhdk5KXHUwMDFit9omgjXDLFx1MDAxOJH4XjedsSSZm0mKpWXSwlxygGhO/oxParbEXHUwMDBiUSelNH/rI67HXHUwMDAw4kTAYv9tbOujXHUwMDFkXHUwMDAxoq/s8WT5zFx1MDAwNFx1MDAwNZMjXHUwMDBmXHSDJbUkwJQrl3hO7d/aIDPpppIkt3ZZybhcdTAwMDWQTGkkclP9XHUwMDEz0XCIcCXym47VXGaRspPQrt9ccr+SvMZIfpNyaF39u833zms/U+xcdTAwMTlcdTAwMGVznnh/yyDKzc2DNo+zVzQg5PzUcWX5/nPzl5AhtVx1MDAxZSNv1lqQkJuAlbclVXprXHUwMDExmO28qVx1MDAxM+XPXHUwMDExd4Fu+qVcXJB5XHUwMDFmJK1VmZdcdTAwMGb/fCCIxFx1MDAxNL/OmSRcdTAwMTBcdTAwMDSe53VcdTAwMTh2y8zh2Uvgn1SJsHLelZegXHUwMDFk0X2c9SDzw7yyk+q7mn1kwpdwf1eyY1x1MDAxZlx1MDAwYl7ege/KZ27O92xcdTAwMDAsV/vXp58s8cTlnpSsXy2Cl/vHnnD0kqC5tltcdTAwMDMtr1VcdTAwMDdON1x1MDAwNs5cdTAwMWLb/FQ3I4lcdTAwMWVcdTAwMTmZW05cbt5DwEkuK7eK/Vx1MDAxMsRcdTAwMTSzsYRqdlx1MDAwN1x1MDAxONfYh+JcdTAwMTl3XHL/4qXk7DWTXHUwMDE4r7t5kt5cdTAwMWIhNGdRUc8ySHsuYcv8jmSqoj1cXNJD5WdcdTAwMDfAzbC+e3cye1x1MDAxZWHkfoueK22AXG7vvPLG8sNUi7W3nbminj63sVpcdTAwMTZKXHUwMDE45PNKn1x1MDAxOXLu358wPc0+aEwhgItr/fdcdTAwMWR8yJI2Ssz6uzJ3LcxLvZ+r2LnNY/DOyMhwXHUwMDFjdMFW3HaE39R4nCTQ4SzxPfPNaHzY5Vx1MDAwZp3YXHUwMDE2J+1cdTAwMWKLqvzasVeMXG6SOy3afFx1MDAwMHN1ulj171x1MDAwMJVzsY5DXHUwMDFk7q7U1KrXo0ro5aToODToYlx1MDAxZS6wXHUwMDFmp1x1MDAxNy2MoStCYN1bayWV4Yq5Y/TM5+hcZoRemUI0/YxcYmw9XHUwMDE3r8s7tWXrOlVh+1x1MDAwYlx1MDAwNmh1/qLZZk9cbvK4mpWgpeaQNlx1MDAwZl5uRFx1MDAxNGJcdTAwMTH5X7Y04Mz2XHUwMDFm7rKI53knXHUwMDA22bhRX+i6ltqxz1x1MDAxNVx1MDAwZbpZnYBAc6xdx+/s0WJt3ae+7ju2XHUwMDE5s3lHllOItOF+/u5u4adYykuJVFx1MDAxN739zcg0dt3VREQoXHUwMDEwOmVwaVtwPv6v31x1MDAxOZjSXHUwMDA2XHUwMDFjv5N1XHUwMDFhhNK/XHUwMDBmoC2FXHUwMDE5Z4TztTm1XHUwMDA2yCSkTmDQdGDA/lxcvMB4+FxmSKHQP1x1MDAxObXgmrVRUvU4hiaIb1x1MDAwMuBcdTAwMDcoa1dcdTAwMTQ7Vb/fwFx1MDAwNFxmXHKIx8k1/e6+QUPFeFe/fWxzR1x1MDAwMSZcdTAwMTfyXHUwMDFhycy1XHUwMDE09MVcdTAwMWXk6nJcdTAwMDR+uUxNXFxA1b5vjKiSUC7zMVxysvB6XHUwMDFhrkowXHUwMDEyKts1SixHcEz09fJgPFx1MDAxM3tcYv1cXIj1/HPqZlxiXHUwMDE4MtJLdsvKXHUwMDBiTI3VsSqiWlx1MDAwMVwik/BcZlx1MDAwMWUtz0NiyVx1MDAxOFdEedVmQ/Zl6eRcdTAwMTeYxnVcdTAwMTm/i8GlSpBcdTAwMDVcdTAwMDVL9qHIZaeLXHUwMDBlWClltVwiizMmfbnG5sqn3cCMJlx1MDAxNY5iu72XkJ7w27z8s1x1MDAxZFx1MDAxY9LGRuvUXHUwMDFmX3uS+qYvgXF/TeFcdTAwMDbgyje+2nTzXHUwMDE3uSBm50WWy1x1MDAwN81kbt5cdTAwMTdmfvafjX9cdTAwMWTSiqdMXHUwMDFhYlx1MDAwZSftXHUwMDE10ERbW89cdTAwMTgnK7fEJff3wcSYhGHhXHUwMDBiaYNa7j5Nfz6MsFx1MDAxYzqAhKxcdTAwMDRcdTAwMTh7679cdKFoWSTLV9SEWJ44MPuIiPi626L+XHUwMDFiL9VcdTAwMTfxjNRcdTAwMTLiWFx1MDAxM2/6vel/XVxuW9SCIXtHXFyvlUPP6lx1MDAxZmXCb06EMmOY6MlcdTAwMDffPOFcdTAwMWY1i0BHSqOV7OLG4H1+v9REqNKRXHUwMDA2s0bR4Fx1MDAwZnvUtaBK3v5yslx1MDAwMEniW49cdTAwMWaRciFcdTAwMDebfnzfUVx1MDAxYZpxP0S77OB3vEU2wCRDXHUwMDE4R0VcdTAwMTn4zll6qHNcdTAwMGLDjdVcdTAwMDGxs+BcdTAwMTKh2Uxjr5zqNS3kXHUwMDBmyvD1XHUwMDFjf3ZMuzpcZmNExPiddNY8MebEvatN4fxbm7SEK2ZnP8mOj2OZXHUwMDAzYmY2Wdb/lVx1MDAxY8v/YUshWEL0KMpx6LQvZ2acz2B2fXtOXHUwMDE3fVx1MDAxNmwqptHKgCOdL8zoQTNx8/T/91x1MDAxNO++czEqs6/WXHUwMDAw+PTM71x1MDAxNlpcdPi+1t7FXHUwMDEyKYY+XHUwMDEynYbIkDgwTuBcdTAwMWRcdTAwMTb4Ypaoe0JcdTAwMWT1dGBvXCJs31x1MDAxYURcdTAwMTXzs1tjJahKkZhGuumEN5/M8pUpfy9QXHUwMDEwaJ/+SjN7un3Wh15h/W+d+ZzZiFk/dT01Klx1MDAxMVFcdTAwMWRcdTAwMTBje1x1MDAxY0ZcdTAwMGbWVkYpkkit5rzyzC1Cqlx1MDAwN/whRyatg/ralLBVS1x1MDAwNv6c9Fx1MDAwNVx1MDAxNihcbiZcdTAwMWFcdTAwMWN7TFx1MDAxYntcXPqUTZFcYlx1MDAxYidcdTAwMTdKsVx1MDAxNWtcdTAwMDCPP4GmKtiGeL1NWN6CPvZcdTAwMDDCzG1wYGFDujHwaFdcdTAwMTTITUzxqVOuPdhcIo9G3M5cdTAwMTg0XHUwMDE4XHUwMDA1wJE+KSN0rDe8j+KY7M/OXHUwMDA2+9v431nQ4F9cIobkM7nO8lx1MDAwYpO1NlZRPlx1MDAxMaMjXHUwMDA3/PP5XHUwMDA2r2fWXHUwMDE4KPBcdTAwMGWj7UNVXHUwMDFl61x1MDAwN1x1MDAxOFx1MDAxZVexXHUwMDA1XWcwZOy/S5pcdTAwMDGfKd+5XzEm0W1jXHUwMDFmXHUwMDExvVbWkbGoiX7fza2LkIGVhVVcdTAwMWTfLL2dnKi1WZuIm95cdTAwMWNcdTAwMDJXYb9cdTAwMWZRVFjKldF7ZliNSqdWL7xktDGfPterXHUwMDEzXHUwMDAw1npFXHUwMDA2qc6mOFx1MDAxNFbnO3JgRoxcdTAwMTNnXHUwMDFmb73F04ByXHUwMDBimO5/mS0oNVx1MDAwN3nCuXRrXHUwMDBioF7dvFx1MDAxNzZcdTAwMWV2Tlx1MDAwMGc7R1x1MDAxOMiA7Zx7z1DOo5pcdTAwMDdUPVx1MDAxN/l9SsRl4rKP5pH63GF5Q9uxkzZdbSTlMa5T8+41pNfxxPTXYLLEcEBmXHUwMDE5yjPKf8BP0T26Q8JcdTAwMDfB4IwhhkxsXHLPmKFxXHUwMDE4knaGXHUwMDFheaJelvpFWHDroCu84DGw/9vDJXyarFx1MDAxM+M93WcjwVx1MDAwNsXc21x1MDAwMJFSXHUwMDEz9LtrcFx1MDAxZlx1MDAwNoF2XHUwMDE16ZJMjlx1MDAwYu1qXGI6o9JccvhseTH8Vlx1MDAxNVx1MDAxZctcdTAwMWRcdTAwMDMtlLGC2/3hTnO3NNlzSSl7sVOJxMe4ulx1MDAwMVx1MDAwZtVcIilexZB6+KXsPevzXHTTcD9cconR8b9g3TeRsX54k1x1MDAwNNazXCKMc4yI7vt6hP4rJoZcdTAwMDBcbqzFmIPyiTftk9W1s2m3o/25c6BvZynktt1Qb3R2XGJcdTAwMDRcdTAwMTRcdTAwMWaSbOc7P3r4mkWd6VTdh+VC485cdTAwMDTtZ17Wj0FcdTAwMThZYaJuZ5tXRcdcdTAwMDNcZrTg67xcdTAwMTHxXHUwMDExmDNsYtBEV7ZuyrJcdTAwMDQgOEhKOCsm7V/fpiZcdTAwMGJcdTAwMDefsn6GuaHuwjjaXHUwMDAzzCrJzD7cXHUwMDFikbOgajqdXHUwMDExtFxys4XQR3jm6GrFM78tXHUwMDE1+iX+XHUwMDFhIVx1MDAwNFx1MDAwMIKdwFx1MDAxNVx1MDAwMzeQcXdtcW05TF6fQms0lFxmpcqq039cdTAwMWZcbsNcdTAwMWThWVfAR02s58zGoeJXkTTxVjT6jZnfh+UvY11dXHUwMDA0XHJa3c9HhcSUa/P55NO6qN5cdTAwMTlcdTAwMWVPzf3xSchg5bLJhmFcdTAwMTh4TmJf9YdHkpL1WOVcdGIjfa9eMVx1MDAwN3NcbtVvxMDjXHUwMDE1TeTK8kMg91x1MDAxM35qndiZfDBcdTAwMWS1+SjltcyBXHUwMDEzbd7RWllG6zHv53EptHTvQmAwSeMjXHUwMDE0JohcIoPg3lx1MDAxOFXZSGKUh1x1MDAwN2x2PSXHz68t82NvXGbKqlx0XFxcdTAwMDSvKFxcXHUwMDAwXHUwMDBlyHZxOIPP9e7OuEfTXCJfJCCe4qVcdTAwMDBcdTAwMTG/Le2Es1x1MDAxODc75HBGgPp8j2esWFpcZlFcXITgSChcbvBB/zvrY1x1MDAwZU9mdJRaXGagO/v+XCLjg1x0Xzfq+i9cdTAwMDZCXHUwMDE0UaFFRqRcdTAwMDCuUJ/dLbY5RFx1MDAxMlx1MDAxN60zjDFf3YXOVmkmK0dcdTAwMGKUXHUwMDA2ms+S4rpUPIBaYVxuXGbm8lVJvX9cZjtcdTAwMTZ1XHUwMDFm3KTmhN7JN4Y8xsRcdTAwMTNcdTAwMDG6m0uu+UnZ1nc+hYZcdTAwMGI2bu3vXGJuXHUwMDE38KpghJ832vZgeSZ8n8txXHUwMDFhXuqsvVOS1fJWjUvNXHUwMDEx9uSKXHUwMDE16km4OeojXHUwMDFmJHHmiLjlk1x1MDAxN7PYXHUwMDBiWGZNXHQ92eYvJCefwGKpd8DMWZHshHRcdTAwMWasXHUwMDFiXHUwMDA3nrtcdTAwMDG70YW3tCkgc1x1MDAxZFKJk1A47z6WWcFcdTAwMDY8XGa3xCDYRjedJsqzeyaKbvVcdTAwMWRDRGVcdTAwMGVwXHUwMDFh4Vx1MDAxNuI0SPlDPlxi24+jUHFcdTAwMWafQdcsvFhHXHUwMDA3d/x9XFyru2j4x05ITl1UXHUwMDAwQvj6XHUwMDE5XG6b6ueBitxcdTAwMWSD3eKg/Y9oXHUwMDExxzeJiMxcdTAwMDdcXCaPZFt4wedOnZ26had6Y+tcdTAwMTBkXHUwMDBiR1x1MDAwNUerZ2pcdTAwMDRt0/g+3o+AXHUwMDFlqCY0/8T2J0Hn2Fx0LDKZMMfD+Htz41x1MDAwZVx1MDAxZUaspjy2jVx1MDAwM5fww8JhXHUwMDEwMXHyOvrorUY5b8CP8/azv1x1MDAwNY95Z4/4fofsn54sc1v//lxcI3xmXHUwMDE4/FxyjPpThc+9ILt2peUnZOnJa19QojDHjNvUWjngwFx1MDAxONDzrZpDIcRcdTAwMDGvO/BcdTAwMGVrrS53kdAmXCJSI4VcdTAwMTHDzkXo09eZqVx1MDAxOVNcdTAwMTSXLsCQ75xcdTAwMDbg8TVZKFx1MDAwZeaXQcJL+rZrY3TbPNbn7TP2XHUwMDAyslx1MDAxNaJXXHUwMDFk+28t0C+1wy1cdTAwMTh/XHUwMDEyb8lcdTAwMTb+Tlx1MDAwYlZcdTAwMDRcdTAwMTGXTnvizl3tbLit+aydxvtFSVBGXHUwMDE4c1wilIZwyTJG2ftO6Ij28yzoPY96/dbeZEaGQKaslHBL+CzOcNbZMM1Ybab7+/Zuq1x1MDAxZSMm2rHP/lx1MDAwNvS8Z8hcdTAwMTGTTUWr5lb4t8fjbFx1MDAwMYvLnzDZNYr7MCzQrbtcdTAwMTfuQ2OsPz+OmaSAxWpcdTAwMDbR5MxcdTAwMDCA29RvsorAutbOoFx1MDAwNv2AsJ6f+VRgujrXpoRcdTAwMWbQMX0oXHUwMDAyazpHulx1MDAxZPD3Zv1aNlx1MDAxMWb8XHUwMDFi5SDIsJxcdTAwMTZcbs52iTzXm1xca4M6/PfNtos+vXnFXHUwMDE1XHUwMDEzuFVtXHUwMDFk6Vx1MDAxN85cdTAwMWF37Yr+aqjSkNHx+q7dejlcdTAwMDem3pn/QXXD4taYKu7G138jNO7nXHUwMDE07Fx1MDAxYVx1MDAwNo7HdFxmeOBcdTAwMWXQmsKob+RuNr5E2W86XHUwMDA2ctpPXHUwMDA2JlxySDOEPkNcbolXkMgziuyJXHUwMDAw2lx1MDAxOJ8jmY7ramYwXHUwMDA3Xe/YIaw9gvFGkybvwlx1MDAxYzvge0pIdS1MNcCVXHUwMDExe99q3VxmyOtHUoxPUcpNOLO9irg1qE5LiOVSJlPdQsmLYFx1MDAwNNgy6TtPT1dcdTAwMDB8tvyd1N5zRVx1MDAxZqZeLm5qQrVUb6YwMGbZvu29XHUwMDE55zdcdTAwMWVUdN9cYv15f5pcdTAwMDW0pbTTwetmfFx1MDAxMmNcbst6NJNCqP/mjyUzyGFcdTAwMDdcdTAwMDfCwS08XHUwMDExzZ5e03x8+MS7Z1x04d8kj7GWfp6gXHUwMDFjNqJcdTAwMTWN5+9cdTAwMTCCXHUwMDBlX47s72Aha8ugXHUwMDA1Q9irpJdcdTAwMTFccvtTP1x1MDAxMCGL0PTrOV/972ys4Uv1XHUwMDAxXGaXpEbzjnFcdTAwMWJcdTAwMTeDQVP6rfB0XG5YrEBcdTAwMDIlXHUwMDEwsvibjr7tsLQpZVx1MDAwMln+XHUwMDAw70Hxo9dcdTAwMDErv2rpXHUwMDFkXHUwMDBmYjnG0YOK2Fx1MDAwZYrL83hHVWKN1bFW0U+bjFvI7qnqQOpcdTAwMTO9z1x1MDAwNoardjhcdTAwMDGmY+nrXHUwMDA341wiXHUwMDE2i5Mksv5ccmDlY7ffKsXw+1x1MDAxYo55Ylx1MDAxOU1XXHUwMDFijUzv4qmNz8W8/vLyVVJ4Wl5cdTAwMTlSXHUwMDA1KjMsqjtcdTAwMTNxJIlcdTAwMDJcdTAwMGZHme09vdrL3FNVR1x1MDAxN2e+nmxsoVx1MDAxMLevZt+/YZJFKTbzPUCph/hsINiAL1x1MDAxNY21xO530Mos4+RrNpxR2WvMjIO9QX/rwVx1MDAxYp7fXHUwMDE5xqppXHUwMDE53kOxJGtPQ8vQr9jlrlxmwT9cdTAwMDauXHUwMDFkVndXk9q9XCJ0suxcdTAwMGL9r/9NSFx1MDAxOJw+JcVP0r9zK9laquV8v874ZYVcdTAwMWbieyoneG6gobBcdTAwMGZjjfwolf9ZKrbjXHJDYmJJStpimVx1MDAxZNBeLJTGXHUwMDAzSWJ6XHUwMDExUr0u4oho8tdLVFx1MDAxONu8dKGTvivbY+L2utsndLk20dhcdTAwMWJKrVdieFx1MDAwNSxn57agZWn6fN9cdTAwMWO2ophYIPnPM9Ll2Vx1MDAxM7W+ulx1MDAwNyHm9iQk9uVfbktj7Fx1MDAxN3IliXcy7Fx1MDAwMFxuRKNDwVxiTOtlztC1X3xcYvBZfd3e/ognMurE4u/wTMFoeCG7XHUwMDA0400jhNS944Jw/Ttzhlx1MDAwNGZ5K1x1MDAxYlx1MDAwZV5h10dcdTAwMTTylrtcdTAwMDT0XHUwMDE5I4L+xlx1MDAxMtTSZptjnNHZQVx1MDAxNSTVfydn1mlAXCKTo/Cg0pf58Je6rfNTLnhDb67zkuhSjEjzxqJcdTAwMWEoUqdbmCS38sW/3iZcIra7gnzHXHUwMDAzcYbst1x1MDAxN4guWChg9LeMhvSLu8ql8Vx1MDAxNbJVXGIu49NUXHUwMDFlt1x1MDAwNOxYmDz3u3Rz3ucjN0NcdTAwMDC/sLNVUzgkgN5LiVx1MDAxMV634VwiJCdd3OYrq8PGMFx1MDAxY8O4/odccl6F/Mg3rocu5O+cXHUwMDBmwl4p9vmdi/VcdTAwMWVcdTAwMGK/6ualS1A8mtiQXHUwMDE0e/08QviWu+p4IFuFL5m/+16ducldRO6CekvZUbta4qyem0ZcXPY2JJXaY4RcdTAwMDE2MrC3wKPKn1Gy31x1MDAwM4yKt6LnTjrlmrHEXHUwMDAyy/a0R9tQ11x1MDAwMGeav8/HquzrI1tb69glc/xDgtPjXHUwMDFi8MhcdTAwMTZkRr9cdTAwMTg0fMXMi5j6lkbDMuBvjSDSL8biXHUwMDFm9YTFXHUwMDE2uFQpXHUwMDA1n89cdTAwMTFM3Nd4mSxcdTAwMTkvm1pj4p27XGI/sma8q9VYpnPttfX/+EdbaExcdTAwMTQ1JstcdTAwMTCs8ZFEZYfXSJhOLmNnXHUwMDFkjKV6VTOQQulnJlx1MDAxNb/w2i1cdTAwMDdcdTAwMDbirqJGLbBKtlx1MDAxZWW7b4Hnfn/dNo5x+IIzp2zQ/6nGXG6qk1xuoFx1MDAxOVx1MDAxOE77ia/a+L7lXHUwMDA1jUP8SorZxSNcdFx1MDAwZlx1MDAxNkpcdTAwMDPjim/iYrdcdTAwMGVcdTAwMWRGXHUwMDFkvTaZXG7htWUkiW7kNr47iF1I8Fx1MDAwNWKC3OLoOr3SQMFfgtrCw31NvjOQKlx1MDAwM1hRr+A8/vZFY11cdTAwMDRcZsjuNiP7+ZxmkUrRbrWCpVLBxixk5HZAikjxTcalpH3K6JeFUoRcdTAwMWL/1qM/tWZsXHUwMDE0L6tcdTAwMGKiizrZXHUwMDAyJ907TUj/14/+r48yXHTxMGWOLqiiV/+wdHrLsj/juTL9XnWue8FaXHUwMDA30rv2eJ2eN3F8oVx1MDAxOdMqM1F/U1x1MDAxMWODlyyQO/ZcclxuSvyIyeFcdTAwMTJcdTAwMDU5aUNKc1x1MDAxMcHRbcjLVt9Et5NcIu04XHUwMDE4reprgmmvcKRJXVx1MDAxM7p0uZ6tfLhcdTAwMDP9aFx1MDAxOSiBK8HoXHUwMDE5sY4h5qhcdTAwMTKn2Fx1MDAxNNTxqGhcdTAwMGJ2wvThhu1cYlxyslnxKubAL86SiFx1MDAwMWDnfrefVP7rO9e+3Fx1MDAxNLzqvGb4zV98ZcBJnVx1MDAwNj39jbIu2paHT5/vhUCzciRk/qG+2lpcdTAwMGLXklx1MDAwNEC8uq9cdTAwMTT21PKwV667XHUwMDAzXHUwMDA0cvvVLU6dTGeZUVx1MDAxMlmlO9VIYVQmdY9o88yqjW5cdTAwMDatSHpi+neWrVuysFx1MDAxOcZ7bmjI3syDXCKB8znLMlx1MDAwZnd0fVx1MDAwN/njIcGIcK5CYTLmnLeDXHJcdTAwMDHDU/q1cFx1MDAwZZ7S4L0sLbiYi1t10G1evZWea1x1MDAwYqKwmDlcIs9n+17oRlx1MDAwMLONXHUwMDAwRvZFXHUwMDBmbyE3XHUwMDFlpupEPf9cdTAwMDafsFxmVSpcZprPS1YlacLH1lx1MDAwZVx1MDAwM3TFVFx1MDAxOUFzXHUwMDExXHUwMDA11C4yi+7MLVxuXHTo15iHok2vzCyInHM0PZ/JXHUwMDEx8DdppSBcdTAwMGaZtZqax632n+BDg4HzgniMMtPrqrbOr1x1MDAxMkU+s9XbX8sg5OXvcFx1MDAxYUEkifh+kqJVclx1MDAwMWd/XHUwMDA3OHdcdTAwMWTw71x1MDAxY6GPXFytxyjKXHJvvKCNKyUkelxmi/5bXHUwMDFiyDuJsSO3XHUwMDAyXHUwMDE0rysxSrF/t1x1MDAwMrh7ULl5syWc94sw8bZyRlIh51x1MDAxMcP4sVx1MDAxYmlzP+Dw8Vxmp25cdTAwMWGjxDpF21x1MDAxYXx+XHUwMDBiXHUwMDA25q+hcpu/X1x0JVx0XHUwMDE52pstXHUwMDEwXHUwMDEzaI6cYpe+/1x1MDAwMVx1MDAxNKzuveVcdTAwMGXfXHTtdHHRZl91X+GGsae3mENdXrRfXHUwMDAxyahNbN3WPa2xXHUwMDA057xoNNtRmYMwir8+Ulx1MDAxNyZkqCdcdTAwMWSYnVJUjFx1MDAwMbHkvO+Z6qjlVY52SDaUh1Va1WVVXCK/r+hcdTAwMTenjYNCd6z4XHUwMDA1v86+LfZcdTAwMTNcdTAwMTJYybTXXHUwMDAy2JpcXObZXG5cdTAwMDXkaW6KXCLTxuFcXE1JnFx1MDAwYuA2cJIp9Wc3io5cdTAwMDLO/piNfTRkXHUwMDBlOvInh0RcdTAwMTVsnGFcdTAwMTSJkMqX1oNrOIFD3sGEYlx1MDAxM4uKkDY2XHUwMDExN7VbXGJcdTAwMDTGz8SbIXKHbzZ7XHUwMDEyXHUwMDA2WnOZXFyOXTfLKvDSW+CKSb6WXHUwMDE4XGL6NeQpXHUwMDFlW/XvXHUwMDBi4CZRqb6Kg2nww0uhipFBPahPUa5cdTAwMDfZ413CTXSQVrbwW8zCXGJbPcmKLj6U785cdTAwMTe4XHUwMDA0/zs/kKPhS7hi1daiXHUwMDFhgKgx2JnwJlxiYFxuXFyGhFxyXHUwMDE4vpd+XHUwMDAwuK9cdTAwMWTnv6RcdTAwMTawXGZcdTAwMTadc3WLpvzxMrm+t17helx1MDAwMlx1MDAwMe7DN5um+Vx1MDAxNbJErJddQFhcdO2z0inDUsNxkskveIE3Pr/DbEJcdTAwMWODXHTOL8j+mlx1MDAxZtHpolx1MDAxOOejXHUwMDFm7YdaYrmWNVx1MDAxMuRcdTAwMDVThIqyZZE4r+hcdTAwMGJMdZJGJlx1MDAwMFx1MDAxNJGWuktzpuSn1lx1MDAwYlx1MDAxMSMgScdcXDniXHUwMDA2NL13Nryf3/+dp0mYoszwLUI9WkP1XHUwMDE3t0THfeLbjH9cZlhXLIRcdTAwMDD0mJ4o1upcdTAwMTHveqWqfbJcdTAwMDBcZu5qgp8+q3akyzFOXyYn6G1VuHWcT5HQTbuwXHUwMDExLtnda4td2UN/LVx1MDAxZeFyXHUwMDA2+4jt0U5wun1giCjs6lx1MDAwN7BG7EhIJj38ZVFFWEvDw1x1MDAwYpNxaOdY5MIvheRldlx1MDAwNfHL2oStXHUwMDE3YCfeT5VcdTAwMDY7XHUwMDE3hlxmumT7gjCFxbImXHUwMDAx8rm7MyfbxfrUPImfzVx1MDAxNJCawbn2XHUwMDFm6nNcdTAwMTh/R9KuTpF3RvhcdTAwMTX6PZYz4o5brqNCXHUwMDEzw5xcdTAwMWSTXHUwMDFh4ZtJ6NzdZ6iqS+tEclx1MDAxMSkvhyGMXHUwMDE2ICxa2zVcdTAwMGaEX1x1MDAwM1x1MDAxMSzHJUyIv+Bb7qlcdTAwMGV6dUDXpFx1MDAxYoLTx1x1MDAxNyyUNW90aZqF2ElIw9A5cM/PXHUwMDAwXHUwMDE1+ZnRbZ7Q2itonnbk0Pn7XG6Yt2shNpJ/e5RcdTAwMDX904LYLETsXrM7XHUwMDAz8X0oTjBe9y781NqbTtm9IX6a3GDz8b5e3lx1MDAxOMhcdTAwMDJcdTAwMWRf9riktYZcdTAwMDV561o02Vx1MDAxYsjW91x1MDAwZj8jkpLWXGa8XHUwMDEyxdnaLYCf8zvHYlxyYSZlRmnLY4hcdTAwMTBlbMmWXG6/XHUwMDE1cFx1MDAwMWJbsq4lLDHCTNhwXHUwMDE00NPrc50mN1x1MDAxYYhBPvHPPJx7e11cImlUSCfTmbL//k0zxifpVdVjI1xyc9a/s1x1MDAxYZz6J3s7yVK8jlx1MDAwN5vWVFsgXHUwMDFkUlx1MDAxMZlgRFx1MDAxOFxyS/zUvVx0I1lcdTAwMWOr5Ws0XGboMUFVjWawudNEwZs57Fx1MDAxOZPuWqBcdTAwMGIo9lKNgjRcdTAwMTIkqVUrXHRMLv2ac371REn3ZLiu0lx1MDAwMFpcdTAwMTJcdTAwMDRg6bOrXHUwMDEysH9v5nLUzTVDVDxZXHUwMDAzUsL9WVxy1lx1MDAwM7u/MzgrrvGVXHUwMDBizlx1MDAxNE9/a1x1MDAxOZwsolPqxVx1MDAxYqLfnJA84fbmr/DLruBfb6+oYyroQDMjL02+tz0tcFx1MDAwMoD7I0ZRsVx1MDAxN0oxc0iPsuRp/K8/sHDxXG7M5jVHXFw+T4Psu1XTXHKzq1BcdTAwMDZ7iVx1MDAxYVLgXHUwMDAy8k2fXHUwMDE4/a8vkFx1MDAxN48r+UtLzUBDXHUwMDA3Z3fsi+9wXHUwMDEyK1xu+qNcdTAwMTUgs4aO+1xcuf2OaNp9iJ59UHn+ufTF7CpcdTAwMDRs1DGThbOx1PWJu/xcIqcpMzyhXGK4XHUwMDA2NynXVC7yfV6YMPNGpFx05mPaliBuXHUwMDE1wdPB+LcvVKVZc/rM+2U2zu4qmaGGmFx1MDAxMuO7fYHOPVxu3IqkSfuxmGclTVx1MDAwMV+tjTSgfb53XHUwMDE5wuogvjC4SWKaXHUwMDE5/87eM0T/Yzx//a0vSI7Yo1aFvzNcdTAwMTSVOp5pp7J0XFxcdTAwMDFL4VxiSoZMOpczcptjeG0wsyzpzshFmXd6nTVcItzx59X/7z2XNYWQMFx1MDAxNDnMtL356DmPMu7c+a2Xd1x1MDAwNr7i4p1Gh7Pu+1xiO99GsdGUZjmWTHGS1Vx1MDAwMsj7d3RcdTAwMGVcdTAwMGWWXHUwMDFiy1x1MDAxMlx1MDAwNHr5ilx1MDAxZnj510/bwau47cAz/9fHXHUwMDA3XHUwMDE40lx1MDAwN/Ncbq7XS+EpLcu+yH2sk0tzsIpcdTAwMDNcdTAwMWLqXHUwMDExuvSN5Lgn+Cc7baRKS1ZfutLfzbBlqT+hbNt0V2VccouxXHUwMDAzxSCAviNcbq2HWNBcdTAwMTNcdTAwMTF0hIN76uP+dy7dsznxfFx1MDAxN5rRe9hcdTAwMTZ/9ohqbn2a72X/XHUwMDAwMMKeXHUwMDBmlf2dXHUwMDBiMG9cdTAwMDKRMTi3dlx1MDAxYlpcdTAwMDc621np1vA6Ie5lpG0w+SFDSjC3XHUwMDA3e1x0q1x1MDAwNpJKgv71jYLWcLn1h233z4eHS8vYPblcdTAwMTYjJGnvQOBccqLo7DrldMC4qsDV5/FWfv9cdTAwMWK7qWxcdTAwMDCz6qRcdTAwMGJ3lNDte3H62sxPRNjFsNj+1q6OhE1cdTAwMGXeXHUwMDAzSLnvhjUwPUS+fvitQkpP8D7WLVx1MDAwNWXQuamHSodWvCGb+2PVIF40bVdj4tlcIvrelVxcUjv7tUaV1ZeWXHUwMDFlYuwmgattfoawgGa96spcdTAwMDQ517G6SyQht33ORJB23jyMv4ns773VxGr8fz2dx460UJCl9/1cdTAwMTSt3jJcdTAwMTLezVx1MDAwZW9cdTAwMTKf+Fx1MDAxZN6TeCf1uzf192hSqkWpKEjFjYhzvkyIXHUwMDFiXGa6WyN0dzMugiaepUvAsnzAQien/FtF9Fx1MDAxZTKzw9tFiIZcIrAn1b/nmZ+SUpLA4PvsgzRV1ZdaN+GrnUBcdTAwMWL75Vx1MDAwNEnzMFkyYH+ZZz5t27/nTI2fMrwpiEyJhi/Q36x1ifFcdTAwMWGtXHUwMDAxXHUwMDA0XHUwMDAx1I7qpiBZ6DgopY6Y3jM1V7tAcJU984674P5iykGBQtWVxmRcdTAwMDF5xiAywpXXKElBc3e60rVWQ0ZcIiBcZm1bt2DnXGav/e+9XHRcYiY8dpPw+3qJzJ1MXHUwMDFh9+bG58s772VcdTAwMDLvV1x1MDAwNf3PUbMsV/aJ+z7JaZlcdTAwMTTh/fVcdTAwMTF2XHUwMDAyzPIrcf/mlZqUQqXShVx1MDAwMlx1MDAxZi7K/Mm9XUBM2y1v/r5cdTAwMTdcIlhpopVViE3jrYKKPFx1MDAwMJJcdTAwMDB/mWz1QLJ1f7uYpVx0ziF6yCUo78vni7VKSFx1MDAwNDvNpJs/Z09/XHSgXHUwMDFhKUhcdTAwMGUncSZcdTAwMTjO/TPnXHUwMDA1/CVuilx1MDAwN55yV4nr5UYkx4zXWuvqg7nbdrtTnYyT+aXcc64tdD/R3E0yU6dIXHUwMDA1XHUwMDE5p6k5+uz5R//L/WPU5vWG2Vx1MDAxM1e+2FhXcj0oq8rpujXzP+Ap5JjDXHUwMDEwXHUwMDFks3piwrhVXHUwMDEyV0WN0cdcdTAwMWMqqIVpeH7iVyM3NTWa8VXNYFFhW+/HtctOKvdhXlx1MDAxOVx1MDAxYYLeJopN3TJcdTAwMDe0s1x1MDAxZpby9Tql4zNcdTAwMGWZfsrOQHqiXHUwMDBmUpy0XHUwMDFm1khsYFNgSHLV7m+i0HVCwco4wy52ruCGSb+FRu4v1FdNMHxcdTAwMWLPxVx1MDAxZdJcdTAwMWarglx1MDAxY8otOFxi1p9cdTAwMDPQJlx1MDAxNmbM15trbnRhiZ3I2pHh/epY7e1cYtq1n1SaXHUwMDEx0Fx1MDAxZaGCmFx1MDAxN9FcdTAwMTn/XGZcdTAwMWZZsCeG+Ib8XHUwMDE0ONhLkFx1MDAxMsfyu8bYsTxJjlx1MDAxZtZk0Vx1MDAxYWstwSpT5T59SHz3Ro+WXHUwMDFiyWJcdTAwMTZcdTAwMTNfpmkvh5DZdNMsr1jLym5Y8Cl0XHUwMDBm+SPt1Fx1MDAwZlr5uL+n777BNPg7nSq00TdNXHUwMDAxlpJvwtv6jYryVXNcdTAwMDXulkJcdTAwMDHG+rOKYivuw09jXHUwMDBlP3vtU2Lcp/99bn9cdTAwMDEsN1x1MDAxMO9LbmSeNdN1UrizWEgtUlx1MDAxNsXUVmyaYZhbjJE9t33jmFx1MDAxYVjElOvP9KZnUSlQ+kh3iqF+uXd+gcRfz+RrmNitxJbKXHUwMDA238ms9KlccmREL6wu6kbgO1x1MDAxNVx1MDAxYSl8XHUwMDE03tdcdTAwMTg6YNdfK1x1MDAxZcSwxKz3zzLErVx1MDAxOamPe9dEeu1cdTAwMDP17162lFO/Qqy8kFRl47+9I/D1sysjS7Qhvbj9MVxuvFx1MDAxMJ9cbrS81CTYT59ccmxcZnw9lLlcItKI1IHlXHUwMDEwjnVcdTAwMWHrhflcdTAwMGZCe1FcdTAwMTmDRDiFO1x00vild/UnXHUwMDA2VXJcclx1MDAwNVx1MDAxY1x1MDAxOL5moGNH1WDbzmsnXFx6z9kmzda1XHUwMDE3mVx1MDAxZWzQhFhWXHUwMDE5ZE79m+GK1khiXHUwMDA15u/+sW1cZlImpWPqb9fpilx1MDAwM3ZBhY6pvCxcdTAwMGWVxj8+LSv5mm2Hmlx1MDAxNFx1MDAxZjhfplOEesNX/Fx1MDAwZVx1MDAxZo7banVO861YsH17XHSlXHQzjmIhPo8yUNCtiGN0ysZcbkohVNkjWMFyVVxuXHUwMDAwU0TR02++gzk4aFx1MDAxMUeogsD2XHUwMDExXHUwMDBiyMSZl1x1MDAwMUfNSlx1MDAxYVNAYbmvMIp243JcdTAwMTExsL3MXFxsjShPdE10XHUwMDE2Xlx1MDAxONLrb8fp1EefuolcdTAwMTW2vM877Sc/gvCY2Y55jFx1MDAwNT3MSG2CXHUwMDAxdVx1MDAxM3rhe2WNqOhaXHUwMDE1YqomI6/d68MlvJbbyObRqmzrck/C71x1MDAxY35X2VfgsLhcZpqmdChndSY480rFVFx1MDAxNP6CrVxySXjI/H6wh7Z6myi6XHUwMDFla0ZsXp5QPy+M6NCOJPha19lccjCERqg/J3or7DWByaZcdTAwMTFS35kyP6rEqMB1XHUwMDFmg1x1MDAwZVx1MDAxNbI/XHUwMDAx1m+WYGJGXHUwMDAz5doqXHUwMDE0IIAkp7fg6iE2ZmSsU+uRZurZ40ZcdPTXLVx1MDAxOHG548YrQqCGulxmp6C3TEXPnddcdTAwMWHSbGtcdTAwMDCvhcH8aFx1MDAwN9fcVtTrhZYxReDTKVxih+b1RptcXNVcdTAwMTZcdTAwMGW122mIytLV/JtwZ7z2XHUwMDBl1IHSsPFcdTAwMTZDTlx1MDAwNklTs1+ZtprvTTheh3Ns17BGXvFU6bKQ9FC+fKh37FJcdTAwMDdkJik3w5TzTKA7KK+4XHUwMDEznEtyXHUwMDFhQWiQlIBPXHUwMDA2S7CDWSsuWJy8RFx1MDAxNrz3iuZcdTAwMDZyNnVsfMXDxH00P6iiYltlTlx1MDAxZFx1MDAxZcqI+/GJKW5T8mzsjfj3frG+VrE/XGaQuJQ0QP7kgVxiYWNcdTAwMTRcdTAwMTQol1xiLT2ARN6sva/u61x1MDAxZVx1MDAwN+mZ0TXAVuufXHUwMDE42KawfGtwISh981x1MDAwMNtzrFx1MDAxZdYwXHTNcFx1MDAxODqfWXFcYp/6m1x1MDAwNS+mzjXahPz3rKju20NcdTAwMTFcdTAwMDWcUVd3ZMfCTVngNoZ7JouB/0rauFx1MDAwZsVXillZWFx1MDAxOePr57B/50qgXHUwMDFiS1x1MDAxMdhsXHUwMDE4nZTfV93arJ9ftS6l7LCwXHUwMDEwXpXTND9d4T5cdTAwMGZcdTAwMTnxYFuvXHUwMDExY/mq7Vx1MDAwN75tXHUwMDBins/yXHUwMDFmuoqVZCf69bVcdTAwMTYsx3Jfa/AudMyQfChujlx1MDAwYr7ETiz78qpcdTAwMDBcYqRcdTAwMDVcdTAwMDU2xdBcdTAwMDPEvGN0f/VcdTAwMWFcdTAwMTglXHUwMDExtVxu6OxcdTAwMTRQk5sp7nWgauXw24tcdTAwMGWNXHUwMDE2UqZgklxmXHUwMDEwvVx1MDAwM5C1XHUwMDA3RIeiXHUwMDFhWGJ77ix4ruU7gqb65YdNpcOeXHUwMDBiyUhMPFxiQuBIXHUwMDE5YFxcYjWjx9JcdTAwMTmY1Ol+slK5aEtcdKCy51x1MDAxYVXK8JKYXHQ/flx1MDAxMU3hrOGOXHUwMDEy4ahqJ67lW1x1MDAxMlx1MDAxMq7kfGZOLFx1MDAwM1x1MDAxOb3wNWiRRn2SxSBcXGurXHUwMDA0XHUwMDFhI4WfuZQlZpNcdTAwMTi1ZHnGcDE5XHUwMDFkUHZyXG7v8Cs34K+TdSjS9Kshj9RcdTAwMDBNIYLFwkHzTszT1jthIdvAxlx1MDAxZqq+sjBI5V68YEPlXHUwMDE397vlnF+Qp3YkYea048NcdTAwMDOzh0eTsNioqE2CysNhXHUwMDAwkV1cdTAwMTh/q8xcdTAwMWTbXHUwMDBmnb9ccpCqOoLJ35AnPFx1MDAwYjCft3X4SlTDa5t91rBhzWHtnDbBXHL3ZYN9XHUwMDBlT6IxQ848TFx1MDAwNSmh8lxczdrxdlx1MDAwNO6AuaCtaYW5i4x1RVx1MDAxNVc8XHUwMDAwXHUwMDA2zep1XHUwMDA3Jek6Na0mbdNmgmSbe4unVMLXW2p4W65yg/JUXHUwMDA3KZSgjb3ITlBa7plcdTAwMWJBRuxRZ0Z0lS22XHUwMDBls5F26uhcdTAwMTJqXHUwMDA3XHUwMDFixi/m9rbL4Fxm28XavdB5XHUwMDE4+Fx1MDAxMIGTpFx1MDAxNoLsTdVcdTAwMDXDraFY4mO4UnBIjjAwNSys4IyOhWflweZcdTAwMDfQZ/GJ1i1cdTAwMTDtjGstR1x1MDAwNuL7KsxPMCqWqupMyK/aVLSyXHUwMDBimSwhL39YXHUwMDA2W7FeX5JcdTAwMWLNstnOrJ7nxlx1MDAwNihCXHUwMDFhI11mYUFi4unzhzpoQi7QrYKpXHUwMDE2pWhNXHUwMDFmnUc8+M1cdTAwMGZZiVBcbmsw77WvMVk+qn1M+lfSoi+Ks4pUbUndXHUwMDEycnzCc5dcdTAwMWQ86FZX95nt6jDdMeFcdTAwMDPXr3BJrt75PL3ShCqH7Ibualx1MDAwZl0kWmDK9VmEtd8/2k+Ven9cdTAwMDXOJHnd82/ZbbXl2dTB282rreqD4c+nXHUwMDE1yzHxhiZcdTAwMWJLr9+I3oCeZjDp6yR2eTxcdTAwMTFibCCh/T7yN5ypMe7I09+DKFx1MDAxN1x1MDAwMad9u8g3cWUlx9HqPKq+2puontyfrm43suZcdTAwMWRFfSmLU7D5XHUwMDEzQEJaalx1MDAxMfClpf4lIOhcbthcdTAwMWbTXHUwMDE3XCLjslx1MDAxZVxmx3fWdvNcdTAwMDBcdTAwMWTRxqKMeVx1MDAxN13seJMuMCHwXHUwMDEzz2+ZIMFTpDObcMbU0Zh1XGZYYJBxdMCHYLVpktRUXG5byJuWWV5cdTAwMWTiuZNQtIFt5KA1x1x1MDAwM8mdlqpcdTAwMTS581xuXHUwMDEz4yd0iTvMOvFcdMNsXHUwMDFmZkRmsls3fKM9ZIhrPztVj3VcdFxc5mNcdTAwMTYvXHUwMDE4Olx1MDAwMpCQ8cdNQ1x0XHUwMDE0111cdTAwMTRIpFxm6XNuTUJKclx1MDAwZmKjNTBcdTAwMThyXHUwMDFkSPqw7VxmXHUwMDE2oG88XHUwMDEwOsu0XHUwMDA3rbiY/ztcdTAwMGJvyFx1MDAxM7Lph3XAdSBcdTAwMTbPLDRcdTAwMGW9ML9jWMR76OLU7reZe6SpXGJMP3WwXHUwMDE4YfB3Z1x1MDAwNY9cdTAwMTdYc4XB39rqedNP7pIs0I567ItkomvWjldkI0JcdTAwMTQnulxc6JyGMiCH9b6I33Psv1x1MDAxOPG+XHUwMDE0lLE1cVx1MDAxNb+fPOBpXHUwMDExgMrRU6tcdTAwMWM0Yvnx93VOXHUwMDA20+1xXFyLK+D1/7W2UHLymVx1MDAxNVdcdTAwMTkqPzl8OWzWPVcpw1dcdTAwMWRqxSl917njloLcjUiKtFx1MDAxNC32LaaURTOAt8t7MK15XHUwMDE2hSRcdTAwMGZcdTAwMDN2glx1MDAwMEMqJHu74bCr96KiuLxCm9RcdTAwMWWzlWa582XxyUJcdTAwMTDJtODHkY1cdTAwMTGzI3lcdTAwMDCujEjqa1NcdTAwMGLGXHUwMDA1lIjrty9nt+7HXHUwMDBmsU5D9m9cIo/9WVx1MDAwM1x1MDAxZD2lf2Cen+2VKUWpUNtcdTAwMDM9zqVnXHUwMDE3PUycfCtBTHrjOvBtPL7lYjl1OsMjNHmQnpL7h47X69ZhoPyBbzuaf45rfaX9geMvXHUwMDE12Fx1MDAwZrhL1Vx1MDAwNFx1MDAxNOVQ9Lyi39pcdTAwMDXtjd9lXG7ARNjxeYJEr0Nnm/LGnlx1MDAxMjhcdTAwMTSAR3m0LdFt1+NcdTAwMTel3DXGWZmDSZl2XHUwMDFiKTFbrGxcdTAwMTZtOkTBOmhOPFM+e1x1MDAxYdOmwFx1MDAxZmzJIIxhfPvDbyPxfOqDl5zZukaduNQ7/lx0XHUwMDAwXHUwMDE1Oi3E7EClx8x8cbZcbrBcdTAwMDd/i/3OfyTuXGZnUFx1MDAxM1x0MbWUaEMlXHUwMDA0Jd1cdTAwMTSiM0ir3Fx1MDAxN81VM+Yr/1xy6VhcdTAwMWGnXHUwMDA3XCJcdTAwMTVWn8snXHUwMDExPpHr2Jnf/YCW9fidRyGy4vPlXHUwMDEw+JBcdTAwMDHaXHUwMDAx0jWDXHUwMDBlXHUwMDE3erXxr+8qve6Jz9t3KdeHNK3/fuMyN/HAunkvbJAz4X5cdTAwMDZh7NGIfCVTZuRKti1KiD75TnJDXHUwMDAyXHUwMDAwRYH3bd/4wVx1MDAwMjftPZ5cdTAwMDOKXHUwMDAxYGK3P+5cdTAwMTKy51x1MDAxYVx1MDAwZnDOz8Wslsr68bsttfT9ujq5o1pcXLD/ttp5uTbyqtalqVxi+2ZcdTAwMWOEgdK8QWWdy3rgTySenqxyPo1fjU9NXVLgcmxcdTAwMTnWVo2FVvokcl7Mvq16MVx1MDAwN2J1dkU+xZFkOI2K9fddssPsXHUwMDA22GLUhZ0ys78qsDmkfrZcdTAwMGLvMK6xZWvIjFfBK4F6XHUwMDAy9o+BS6T+wFx1MDAxYYslkr+WdcStyOx/ZlnQvXstMJ977N7MnFXw98PHQbNcdTAwMTGl4l09vyhNLTX6J8iaXHUwMDFhbzVWWv+KgrOYvZJs7tNcdTAwMDH0aoCmg2BPcI9cdTAwMDX+iDVf855cdTAwMDByYsdKXHUwMDBlm+nHPWG0XHUwMDBlgugnhtOPXHUwMDFlXHUwMDBmZFRcdTAwMTfQXHUwMDFk5uN5slxipFJcdTAwMDV6+Vx03HdcdTAwMWZcdTAwMTieYj/fXHUwMDAwXHUwMDE5oqhh2MH210UhUcG1dMrRjfM2s3KrvSVXKFx1MDAxN+5544bntlxyXXBcdTAwMDR3WY1cdTAwMDV+XHUwMDE1r1xy8zBcdTAwMTdX1MsrrfxcdDqwXFxcdTAwMTaj0447xrvoOKFlqss5XHS/OofER+5i+kV4XHUwMDFjpcddqNN8XHUwMDAx2I/3acLxNZjZ77Dqe3Wg71xmO1x1MDAwNzJ8aHyN46pcdTAwMTW+XHJcdTAwMWLYye59ftm3Tlx1MDAwMcWI9L3Vt01cdTAwMDJcdTAwMGX56shcdTAwMTWf3UF7XHUwMDBiNlx05t5cdTAwMTcnPdbHoUfVbcDIcCEv5v5cdTAwMDBcYt4qQs+aip9z8/Z2XHUwMDFhtsO/4+5cdTAwMDfMwJ+ue1jD6CfdgiTm/jpX38AtJ+TkU4rQZDDMd41cbvntlIcmXHUwMDBlSXEtLsBcIsx38+Zx/X5g+2U7N+1cdTAwMDMoVHCHw5xsi18ujMYnlVx1MDAwZkvQ6vAhXHUwMDExXHUwMDE2lLyD08lcdTAwMDBEI1RcYpLclm8u3tZRKNrlXVVvolxir5abdFx1MDAxZXFcdTAwMDMtud/zgTJbTFx1MDAxN/KlZ3X0XFyk+Vx1MDAxZIJsuTRLXHUwMDBiXHUwMDA2NSR7+fs2XHUwMDAyaMtmmV4qs2BlgHNcZmBcdTAwMWHTdriWxcq4/8X9pqGYjInmLVdff1x1MDAwM/GLLYNKSUrffVxidMVcdTAwMTG8qm+Bz51b1kjLq1Omj1OyXHUwMDAwXHUwMDFh4HlTTZSBxtlF9lx1MDAxMdmQv6tLX53on7BnrVx1MDAxYtAmwtBRcfEqQVx1MDAwMarX8IOn7t4+ZiNcIma8ZsWqXG76RbL3/NTxrZX8wE2bwyFcdTAwMWZcdFx1MDAxM+JtXHUwMDAyXHUwMDFhXGZxfzd6etSbW02S0Fs5ILf/q3xfXHUwMDFkXHUwMDFmWYRUxKBa3Sglp2JJJ4mgZCNcdTAwMWVcdTAwMWNcXHgwlqJqgJyvczODXHUwMDFk6lx1MDAxMqM/Ya0nWu3Hz0PJNeZcdTAwMDfJxVx1MDAxYbFkXHUwMDA0X1xu7YZEM9iRXHUwMDE5RsDTXHUwMDE02SZcdTAwMDe9+nqCUmeQmeqDa7TBLGNcdTAwMGKHXHUwMDFkSzyenFx1MDAwZija3dRcdTAwMTJpuIgjwVx1MDAwYlGg7M5cdTAwMWTRXHUwMDE4wU5pUcaXUp6pbVwi3tJcdTAwMDWlyWzzy/mLvEVn1fFcdTAwMTBul7V8TpRcdTAwMDYlXHUwMDE5+VJcdTAwMTin3T9T/dh8uK1gvClPXHUwMDBiTW/WXCJDIINcdTAwMDVnm/mWXHUwMDBl6Fx1MDAxMGHJ2Hp8V82xO9/sa3K9XHUwMDE0a43pXHUwMDAz/Ugqm/fd3Fx1MDAwN5pcdTAwMWFcdTAwMGK/nSCmwtNafZnhXfM7k3TD/jbK61N+Ro8yjZNyxFx1MDAwZVx1MDAxOHUqXHUwMDE1Y1aGPPSTUeop01x1MDAxZVx1MDAwMb5cdTAwMWbGXCJ6vlx1MDAxYlxcx0t9XHUwMDAy/GbEJanNzVx1MDAwMqz09q0u3/N881x1MDAxODyBXHUwMDBiRX01RChXJXY13EXWTlx1MDAwNVx1MDAxNDSXPNlg5SPh9vtrnT2jINWjXG6KqLJcdTAwMDHJa9VcdTAwMGXLwOslqJT4rK+kYVukw8Xke8RcdTAwMTg9XHUwMDA3JMhcdTAwMWabXGLPOCfsXHUwMDEy1uFQjspn7CCuq/po7688UVxcYGayn6Fliq5kX4VdhE7oPj0u3zpnziDeqlx1MDAwMMmHXHUwMDAyXHUwMDE0dV1cdTAwMWGfXHUwMDExM9Ls37UzXHUwMDA0JjmPSVx1MDAxNj1cdTAwMTlHdHq5sURcdTAwMGLlZXVWT2HKKlUzPXtcdTAwMDcyip9cdTAwMWPZmI65b1x1MDAwMFWWg3/ScNdcblx1MDAwM+J2yDrusMSUXHUwMDA0y2lcdTAwMGb6h1x1MDAxZrPsTv9ccr1PzEA/oD5kTtXh6DlkrJkhloubXHUwMDFha2nLOZ93Q0FcdTAwMTZ6ScCPuPvVr4gxtJdd4JqoWvi8Pih4SKf60N9nXGZGXHUwMDBiZ/3iuf1zfKFiwTNqS1xiXHUwMDA2JD+w+y9cdTAwMTbtXyz2NGnHXHUwMDBinMZ5uuS31jVccjza6/WXRVx1MDAxOKCaye7CXHUwMDA39jo38kWjsTb/QmRcbsdoZlLU4OO+nLp+nM/bKinB3lx1MDAwNHmfW0HySWJpj1fJ7qmYdXGTXHUwMDAxXHUwMDA2XHUwMDA1td7LWlx1MDAwM6TefuxB4k2Cws7AMcY4cmtcdTAwMGKAxlhq6m1cdTAwMDXKM+mU5lx1MDAwNS6YXHUwMDFhNlxcMrC0q4U9XHUwMDE3wH6ZYIveX1x1MDAwNJKzot+FXHUwMDE2mFx1MDAxOC18JalcdTAwMDW2ZPdcdTAwMDbacPI7XHUwMDE4XGKpoNc+XHUwMDAwTPptmGhcIrvhf2OCjvR5U25cdTAwMDM7+1x1MDAwNmnEWsytJ1x1MDAxOTQyT5vCq8BcdTAwMDQlJFxiXHUwMDFlfcZcdTAwMWbLuzZGsrS6RT7OzX7t0NiK02dKXHUwMDAyijBcbqBs7VIz+/qgr1x1MDAwNdvV9KUgoi1/+pfT42mpekGTWjOreHL+hp9cdTAwMDNcZjiM4WA9aS9rXHUwMDFjP/sxh9Rr8Vx1MDAwYkHLXHUwMDE2JeGoeFx1MDAxYZn3X5CZYjRR0VxyLU9T0o2LKXmuivuQaNmCjfeGLIHMk/uhU0VcdTAwMTGV3+zPtVx1MDAxZsmY0Fx1MDAwYnVcdTAwMTG85udP5fAzpWZcdTAwMTE4m8pcdTAwMDOCrPS3XHUwMDFmK4R8e5tcdTAwMTWLO7PwYSeLlnjqsEokalwiwfiTszuePdjM/KVNs2Po6bRcZi2J/j3mdU21LCWAL1x1MDAwYoOaa775LoPNRPyAXHUwMDA1a1x1MDAxMHGhMan+5cGMPTzwWvbK62R3arJcdTAwMTBcdTAwMTCUP62xvKdcdTAwMGI1sbVNUt3/XHUwMDA2lHVcbph+ZjBwXHUwMDE3Y6BcdTAwMWK4PMZLj1x1MDAxZF7KXHUwMDFm7E3y6WU8k2Kw65i7XFyl0Z5cdTAwMDV9XHUwMDFlzt7I22G/XHUwMDAzLv83ndWlwOYzVsohKJiUxZWdddV7XSnFn0qu7fNF2sBy/aO0kJfW7yPE52Do41x1MDAxNzWZKkxU/rB8rOK3d2Vqg+PfdfpcZu1cdTAwMTNTQFx0XHUwMDE3S/xRV/2zXHUwMDAwXG5cdTAwMTE7yVx1MDAwZiVcXKpjvlxcx7lOXHUwMDA2V1x1MDAxMO9cdTAwMDOe/KLS0KVcdTAwMDaWMvf5XHUwMDE3r/a7XHUwMDBlK0lccsFJTSY1lIL7coZ5dyY9k1x0LWNW91x1MDAxYlJYXHUwMDA0TD7sXGbqXHUwMDFiQpX6U/5yv4CExXxcdTAwMDXRtr06gbmTeDFcdTAwMWXGkjP0p+K4LzMrUiFk9Vx1MDAxZllcdTAwMGVfXHUwMDFhb1x1MDAxMnBxTCXcmFxmR17vuHm8KaJcdTAwMDNbXHUwMDA2XHUwMDE2wYqaJcp/WjJei8N5Nme7X9hcdTAwMGbhM1wiaFxi5rGMnM94XHUwMDAzuWxM9IKnQiivePN89t/UXHUwMDBmOzzU6UFcdTAwMTdq5Y1BxuHN9VwiYSrnVUYxn3o3tlx1MDAwZlx1MDAwYkvpJ+5qwYJcdTAwMGXDKHMxQ1x1MDAwM/lkhXRZXaL7YjuXXG7Xs8czuGe3T4+GXHKbRT3JTsbB79ukXHUwMDFhgMxcXPmJ31x1MDAwNdZcYq1BqNNmwlxmXHUwMDFmZFx1MDAwNtqQZSuWk+6W6CZSOUxcdTAwMWXVUyew50I1g58mKWmWU5ycmfOjW1hcdTAwMWV35fOi+itcdTAwMTNcdTAwMWOgcl2wcFxcOVx1MDAxOUubY+BcdTAwMTSBXHUwMDEz7jrP9E1cdTAwMWKEXHUwMDE2XCJcbo5eXHUwMDE5SNSLc3/GKFx1MDAwYmYjk1HmYufDXHUwMDAxz1kvv8Wxkc/w9/k0moMhdG/WN6feNl6mWedEmD1cXJl48I9Gpcz42j8htNVcdTAwMDOs4Ip72aQ80/xXcF+I2EXisOhlsExE8lx1MDAxMXRcZqrYhL+/82yCQmBB99NErmtiysWpv25WXHUwMDE3XHUwMDEzVDVcdTAwMWOUXHUwMDEywYEyXGbkq3/cJMWX61x1MDAwZVkzIKXT8Fx1MDAxYnD4aa2YpfhcdTAwMWFcdTAwMWJmOjRBfIuYx9lSpy3fZlx1MDAxOFx1MDAxNplUR1x1MDAxMD1cYklaYD1i/eBcdTAwMTm60VOxXHUwMDA1XHUwMDEx2rCWXpRcdTAwMGZIlsVtozlFXHUwMDFl97hcdTAwMDNkdfjEV8fnPGYvPlx1MDAxZErYykSvdlx1MDAwZl+OQWx/x1x1MDAxMIRMl/goXlx1MDAxMmdA39TVVKxdrd5wvHtcXKh2XHUwMDFifJ/TL/Wxw3yGWPzXPFNfXHUwMDA0vVx1MDAxZbVFnzm2WuXVyz33tVx1MDAwMk7GUyqp/DooayxcYlx1MDAwMjRcYm08/jUjhzNgRPQz9zSlVMXqlFx1MDAwM7KEqdEv501cdTAwMWU/WCG/i5uHrS5W+1WCZla9jbFBXG6uyoJH06W1XHUwMDA2UG3yfDzuT53n8tzVKT1cdTAwMWV5autcXLqo8oHHfY36uIvMV1x1MDAwZthcdTAwMDClfHzZrFx1MDAwZvk3YnbrXHUwMDEy7GOj01i+IWvoetpcdTAwMDCpXG5m2MRI6fqeXHUwMDAyMWPwdNtUP5o/NVx1MDAwYtG7/cGyjbBcdTAwMWHzqmCwdjhzulx1MDAwNozS16s5XHUwMDAx6TrLtXrEIVx1MDAxNunf80X1/EJzcVx1MDAxZoCHkrlyVFx1MDAxYydKhlx1MDAwMrq1mrnM8vb01T7aJF3ZQ05Ensl5dTTnP1x1MDAwMSdmxU/Iklx1MDAwMMDNirM428HJYL1rM033NEu/2tmHzM4rOlx1MDAxMdZ8k1BcdTAwMWIqt8XRnjplwFVv1ZFq0lx1MDAwM/XPMftMbkiu3Z7fX1x1MDAwZYdcdTAwMDbni1x1MDAxNnJcIi6h2+PJ1m8yXHUwMDAxO1iyXHSUp1q4YYVVW2i+3mJ1s1x0U3XK0PjfwZfnKyR4/VbU/Vx1MDAxMlx1MDAxNp5j07N0fGTiUDaUzyx4Y3Ujp2x//rag1vndWTj1sSfwqY5cdO/i7qnf83H/zlfdzyun5et0RMiz1/Pnzu97rlx1MDAwN/9tQiFE51ximO3hp40hSVx1MDAwZkFzNOD0Kj7p6VbOqVxuXGY3oYnXtkedi8GKqMD4XHUwMDFk1kqWaN/+qFxcPnOhXHUwMDEzr1x1MDAxNj2D4Dp4h7CRW771lmtcdTAwMDCJ32MmY0uaXHUwMDE5jUPnWHUgY/ZsOYBmUeo3XHUwMDBixVx1MDAxNIxQkqL1l11rP/Fnzk8/KWT+dFx1MDAxZErmw7tiSijzn0ZM4Hb+uDh5uc9umMuOLYcgf5buJHfghlx1MDAxZslYbNRqXGI42cKFouemSVx1MDAwZZpV/3S2I28yzFxuTMYwXHUwMDFlUtZccsV1XHUwMDA3il6WXHUwMDA00Vx1MDAwNPjE7Zp/XHUwMDAze/twNdFWslx1MDAwZejA6PxcXKL/ZXxhXHUwMDEyyHlcYlx1MDAwM1x1MDAwNVxyOVx1MDAwMy1cdTAwMTGkJCrOYT9hXHUwMDE4l93ImCyNpyqZlIVhl0zlUrpx46uJ7ou3u1x1MDAxZvO144OyOVx1MDAwZXWM/o2dyKbewFCudChf7EqYk1x1MDAxZN+j/raCjlWylVn7xi1cXF3CiST8c61TmUbfRMfaNsCaUb/T1lRcdTAwMTixr5o49utnxChcdTAwMTcrmVx1MDAwNI+bobeulIdcdTAwMTeMtyFzWfGvd3+DlFXtzzDeMv4s5lx1MDAxMjBZXHUwMDBmIdScUTOvXHUwMDBlpr9cdTAwMDSoUYaQy3xUXHUwMDAxZrZErSjNymrqwTYqn1x1MDAwZehcdTAwMTacflx1MDAwYoRd4lKGglx1MDAxOFx1MDAxYmJcXGb9iW6o/J5cdTAwMWIq436sUZvxjUJszopcdTAwMDXwyufGIUz0ltGr1LYhQbOvXHJcdTAwMTiRMlVcckPgXXWPoF5cdTAwMTMkU83MfJrlIUWSNWbgt9H0b1fAdjnBI4pL1Ui6xOVOnalcdTAwMTT9XHT6anDBk1x1MDAxMVx1MDAwZVXnyfJ2+1OD6usme5hiXHUwMDFlJutcdTAwMTCGf8PMiOz6VS9cdTAwMTYnuyl/4lx1MDAxYtZJOzatUVxm091LyI6SXHUwMDFlXHUwMDFm3MFHqvhcdTAwMTVccjpcdTAwMTTkYCu3XHUwMDA34PZOKYw1W8jZXHUwMDEzJEmSXHUwMDA2XHUwMDFmUDNcdTAwMTaciX+oh1x1MDAxNySeoMuho8zL4+LpoFx1MDAwNDtXTbbaXHUwMDAz82M129/0g+P++bVRlnxWuaLnN1DyXHUwMDE5QaNEjOHiZ248RDOmXHUwMDEy3PVbW9bL47tcdTAwMWbwhdIoXHUwMDE47lx1MDAwYlVcdTAwMDPn0f4twFx1MDAwMVx1MDAwM7t17SVcdTAwMTfwkdA1ZrVcdTAwMTOc0aH8RvVcdTAwMWRcdTAwMTNcImLCdz5cdTAwMTGhlbf9iJm3Ybzzf/BVvVxyxHa+StB8Xcq/XpzVk1PUfapaPlx1MDAwNFx1MDAwZYZOu1hcdTAwMDF+0lx1MDAwNfdcdTAwMDTeqOCSoLQ8+J3snofTXHUwMDE05T1cdH31y/ToK7m8XHUwMDE5K/pcdFx1MDAwNM+CeFxygjijl64rKfM9m+67sVx1MDAxZGpcdTAwMTnjS9j+ZyAoLvq2Llx1MDAxN6Zvvlx1MDAxNzWv00qCXHUwMDFm78LFKdN0jcDPrIR8tbTrcdS2wb9HXHUwMDA1sFx0m8/BX5VPXG6vI7BqNOfavDTfks0rXHUwMDEyxG0/bFxmP/ihZT41elxm3UGSXHUwMDBmzFTLyFx1MDAxMEmbXGJcdTAwMDFvg9yKrv+s7ltsgtfAP31cdTAwMDNAXHUwMDA2m41u1Fx1MDAwN47NnFWEZJ5X8DpcdTAwMTJlQZxHXHUwMDAwsoD0MV9YXHUwMDFkP4JRfarc1pA9yfDJ//Qxt766st7h0MNcdTAwMGZfl1wioMxcdTAwMTC6jPhTcm6vW4/JbX+ziXx1Wr0wiO1nXHUwMDFkU4NIK7e2qJLLxKGFwmqPySHNXHUwMDE5hM3sTyyQriGfL6iUn0spxZEzqlx1MDAxMSO9glx1MDAwMetUVFLt4bS4XHUwMDE1y2TScoPpuzdxXHUwMDEwNaD9L2B/XHUwMDE5i/pcYlxmmatcbuTxkljLmLl/TtPjbZ+1vKJcdTAwMWF8Qa+MSo1F0lx1MDAwNZmnLPDlYGJMvvyKd6NGT1x1MDAwZUQqTyPzXHUwMDA2XG5Zxr6Bk1x1MDAwZaXI36tcdTAwMDY3Q7Oy0ibqpil1OdQt0pJIau/050FcdTAwMTUrXHUwMDE09kpW/CNcdTAwMDRsXHUwMDE0TCu2Llx1MDAwNuxcdTAwMTKIru7Ym0WZMfnSYvCZQlx1MDAxYzZcdTAwMTW3Klx1MDAxOayyUje1LDK7+ez7XHUwMDE16fi2s1x1MDAxZIWxQq75bClEKrCVSTWYpVxut+nrP2GYh1K1W9HBNlx1MDAwMks15pX1oaHBXGaLXHSASFx1MDAwZWdcdTAwMDdS9UEvK3A2mP2LcqJcdTAwMWIjxt1Eb/mZOr40N0R0XHUwMDFm9KS/bMKZkfiay+5NXHTHt6CJUXS9mO5IJvXV0lx1MDAxNv5RO0vzXHUwMDAxoOROXHUwMDBloVx1MDAxMkGJ2ZTpUlx1MDAxYmkuevefYsneJOlcdTAwMWFy1b3ndG93SN+6ZoY6XCI4q7Lk17qyXHUwMDE4OqhAXHUwMDE3vUZbquiA4IO5lZq9ZptJQNB4qeqIqfUq+1x1MDAxYjB+XHUwMDEx5GVcdTAwMWa/iTmYv5fQi2733e2B4/7r//zHf/57/ddcdTAwMWKRZCvy//q//1x0kziMUlxijqBcdTAwMTiJ/P+/98m6OcW2NMXx/45cIlGKgHCSojD630H//Vx1MDAxZn8///0/folcdTAwMWP9In0=KafkaClientEntityIsolationFilterKafka BrokerKafkaClientEntityIsolationFilterKafka BrokerJoinGroupRequest(mygroup)JoinGroupRequest(alice-mygroup)authenticatesasalice.......JoinGroupResponse(...)JoinGroupResponse(...)....ListTransctionsRequest(transactionState: Ongoing)ListTransactionsRequest(transactionState: Ongoing)ListTransctionsResponse({"alice-txn1"...},{"alice-txn2"...},{"bob-acc"...})ListTransctionsResponse({"txn1"...},{"txn2"...}) \ No newline at end of file diff --git a/documentation/0.20.0/html/images/filter-short-circuiting.svg b/documentation/0.20.0/html/images/filter-short-circuiting.svg new file mode 100644 index 0000000..55d0fcb --- /dev/null +++ b/documentation/0.20.0/html/images/filter-short-circuiting.svg @@ -0,0 +1,4 @@ + + +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO17a5OjuJbt9/5cdTAwMTVcdTAwMWQ1X+5ccp82kkAgzo35XHUwMDAwNsZcdTAwMThcdTAwMDN+g5k7cVx1MDAwMlx1MDAwM8aYp1x1MDAwMVx1MDAxYttcdTAwMTPnv4+c1Z3vrM6qzjrdXHUwMDEzU66KTCdcYiGkvfZae2vzXz/9/POn5lKGn/7+86fw7HtpXHUwMDFjVF776W+346ewquNcIqen0N3fdXGs/LuWu6Yp678zzMNcdTAwMTVdv8g+X1x1MDAxNaZhXHUwMDE25k1N2/1cdTAwMDf9++ef/+vuJz1cdTAwMTNcdTAwMDe3a+ezqZFlXHUwMDAzTYmUNmXnv+TuQb/eXXrX6LfBVKHfeHmUhlx1MDAwZqfO9DgrcF1ERFx1MDAxZUJcdTAwMDJ5XHUwMDBl8Fxi35++3E7zfFx1MDAxN1x0XHUwMDEwXHUwMDAwjrBcdTAwMDLGgnB/to2DZkdbQJbrQlx1MDAwMULMsyzkII/IfZNdXHUwMDE4R7uGtiFil+NcdTAwMDEkRFx1MDAxMCFcdTAwMDZcdTAwMDTD+yafR/T3n8H9kbqpiiTsXHUwMDE1aVHdhv1vMLz9e1x1MDAxOPTG85OoKo55cN+mqby8Lr2KztJDu22cpvPmctc7nWk6q5+e3cP+9Vx00LPjb11Fb1x1MDAxYe3ysL6txMNcdTAwMTNcdTAwMTSl58fNba7oLN1cdTAwMWa9jbDUgrtF+8+HMVVeXHUwMDE2ardVy49pen84zoPwtlx1MDAxNp82KH9yuzz49Xa/LfnDerK/XHUwMDFl+efD4MPw1jPhOIyBQFx1MDAxZZ7qwexcYuKeXHUwMDFmNYv8zlx1MDAwNCFmkVxiXHUwMDEwz7FcdTAwMGbDqvvU9pq7XrdeWodcdTAwMGZrcFx1MDAxYpry3C5cdTAwMWbb5lx1MDAxM9NrwvPDwjyyXFw1ObLbXG5yYO2Sy2Scc1ruXHUwMDFjPt23++ffXu/288XDXeWTWlx1MDAwNLNFX1x1MDAwN1F0nVx1MDAxZlZz9uldfru/V1VF+6jfX789rMuxXGa8z89cdFx1MDAwNVxmWcJhQVx1MDAwNPyDIadxnjxftLTwk4ep+enRgJ/h8/WnfIHPJ5N0XHUwMDA3TVx1MDAwZZAuhyAn0DFcdTAwMTGBxc+QSUBXJFx1MDAxYyuyPFx1MDAxNnlcIvAvocnjrlxiXHUwMDA0XHUwMDBlcVwi4lx1MDAwNSxcdTAwMTD4XHUwMDEymTzoXHUwMDAyluUgpLdBXHUwMDFj4blcdTAwMWbIfFx1MDAwYpnq69B80v5XXGZCkWMxXTXwXHUwMDFhXGJFIL5cdTAwMDVCliW8yPOs8C1cdTAwMTj8SHN+sM6bVdLn171t4v3/vJfGT5eyyJt5fL2NXHUwMDFkcV1cdTAwMDBZlqfuh1x1MDAxMFHkMP+k1cDL4vS2XHUwMDE2+EnfUlx1MDAxYUe3Sfnk037D6tPjmWliSob3XHKyOFxiXHUwMDFlk5dPO/XiPKy097BgUcVRnHvp4vHz/Pz8cbxjU8zC+vNcdTAwMDM11TF8PGXh8DfQwC7CX1x1MDAwMLwklJU/MnE1s/pxOVHcPpzN303IPFx1MDAxMro3vFxuXHUwMDAwXCJcdTAwMWVcdTAwMDPxwVx1MDAxNi53s8x2KVx1MDAxOXP0uFxiXHUwMDAwS5f1XHUwMDA16jnaXHUwMDA0slxiXHUwMDBikLBcdTAwMTiw8KGDe9SzgFx1MDAxMjLBPEI8XSmO+8HHb6G++MN8TFx1MDAxZDhPXHUwMDAwwuJcdTAwMGLqvVxyXHUwMDExXG4vXFzEb86AY1x1MDAxMYtcdTAwMTFcdTAwMDc+kJD/MHN+kZFcdTAwMTexW/X/Mdhcbme5WiV7XHUwMDE1LIBe/Vx1MDAxNVx1MDAxOVlcdTAwMTDKX1a/xNg2Tz19crlcblfXNN9cclBcYlm+i1lcdTAwMDFgXHUwMDExXG6AXHUwMDA3XHUwMDAy+1x1MDAwNKEshVx1MDAxZj3BXHUwMDEyLN5EMybcXHUwMDBihD6XzCz3XHUwMDEyolwi3+UhXHUwMDEwXHUwMDA0jlBcdICJiL9cdTAwMDKiflx1MDAxOHCB979cdTAwMDWi5Vx1MDAxZoYoXHUwMDE2qbdkaVx1MDAwNPRcdTAwMWFC0aNo5Vx1MDAxOUJcdTAwMTFcdTAwMDQ8Xb5HXHK+u2RcdTAwMWWZeUh2u31cdTAwMTWEU17IMlx1MDAxMjvT/GuAxLOYXHUwMDEyXHUwMDA0+Fx1MDAxOCC9Ppp3SFtIY80u5niW0LhDXHUwMDEwXHUwMDA1TJ5iiEddRKFFWVx1MDAxMCMkwlx1MDAxN1xiXHUwMDEySFx1MDAxN2K6MpBKX15cdTAwMTB58SWAnivbXHUwMDFmXHUwMDAwelx1MDAxM0Cr9ytb6oQxXHUwMDAwXGK9JmwhelvZXG5cIitcdTAwMTJcdTAwMWF+flx1MDAxM5l9pDW/pWzl2ypU71K2/1ph+ztk9bqwff40XHUwMDFmI2y/LFx1MDAxY56R+1x1MDAxM7xTpHZcdTAwMTHPXHQ8oJGRyFx1MDAwYs/gToQuoSdcdTAwMTBcco2o5nlEqPeMKVwi2oLwgIZcdTAwMTWYo7Hsw2Q/iFpcdTAwMWFcdTAwMGVT2Yt5QkVcdTAwMTVVxuzDTX6o2ieIZ4fvpUz0XHUwMDE2ZUJcdTAwMDBFgUZcdTAwMGaPwPDIXHUwMDExkEd5wuececsyUch+U4j7bZw58/ZDXHUwMDA32LN/XFyPrZW2zrVcbrT46zhcdTAwMTOIVO19i5cpi/j52P/j0VxiwePhgvvv//m3V1u/jYLb56X9P/T34lx1MDAxMVOvbnpFlsVccn3QyW2QL1x1MDAxY37jVY1MjSbOo6e28WtC+j1x952P9I+3XHT4XHUwMDA1UNGMWF6kqpZcdTAwMDY13Fx1MDAwM4XcXGbZK+9cdTAwMTDMiphcdTAwMDVcdTAwMThcdTAwMTNIRVx1MDAwMVx1MDAxMpHwwvzCPPj9MW00XHUwMDE0r5b8RYyO1k4q+Mmk/Ef42phAl0NcdTAwMDBiXHUwMDBlUtd+c078Q7R9PyhIxy2y1P1cdTAwMGKIqkRcdTAwMWXy4ktM3KZKunm9Xei9wFx1MDAxZFx1MDAxZPLjc8/dY5huivZdaut1O36H2sJcIulcIpZGXHUwMDExrMhyXHUwMDFj/yjkvPO+gtDleUBjTVx1MDAxNoo04lx1MDAwMFx1MDAwZr713v1cImpbNILleYyRQCOcV3L8X8j//Fx1MDAxNdwvfHb8/qqguEHgX+t/tfdcdTAwMGIuapyYkiZ+oaxuU47fdLNUNvNIXHUwMDEw+G/RW0+G8WogLvwhxSW9qrKg2L3FU1wijYppaCziR6nof4XM+lx1MDAxZG3zXFxmSVx1MDAxZq2thI3fjkpz0lxiRXu4zPVW8Vx1MDAwNug94Fx1MDAxNohISYGn0Fx1MDAwNISGROiptKKRT5dCkr+xXHUwMDA2XCJPdudcdTAwMWVnI7BcdTAwMDBcdTAwMDTCXHUwMDBiXHUwMDAwXG601SvZXGKWXHUwMDA2U5Cex1Sc8ZS+4Vx1MDAwN2urf9veff6H6ypsfMVcdTAwMTZcdTAwMDHHXHRcdTAwMWNLXHUwMDFkMn5ssr9cdTAwMDJcdTAwMWK/XHJsXCIgXGJZ+G366ftuXHUwMDExVMX5ksZ+XFxQbn1PXHUwMDFj9ZU7XHUwMDA0abhtvoDvpijfXHUwMDAy95OneFx1MDAxMTC9OuyPXHUwMDAxdSO7ONE2R7GeXHUwMDE1mVE7XFyENvJLUMeZXHUwMDE3PU8yXHUwMDAyXHUwMDAwu1RcdTAwMDVcdTAwMDFAIESYh0+TjIhcdTAwMTO7N6pcdTAwMTapXHUwMDE05Fxiy1xuL2HNXHRdeuqWPqRcdTAwMDL25lx1MDAwMl6i+u0mv1x1MDAwYupX2fjjWZt7dvxPXHUwMDA0Ny9/XHUwMDA1uFmeXHUwMDA2SPzjSPZcdTAwMDHcLHlzXHUwMDEznueohOdcdTAwMTH+4CzJXHUwMDFmXHUwMDAwN5W2zZ1U/lR7p8cyia7h5+n6hEU+XGKFXHUwMDEwXHUwMDExIEBwk5iY3VKFuCVcdTAwMThcIpbFoeD5LFx1MDAwZVx1MDAwMH60xlx1MDAxNLfhk5jofs3o11x1MDAxN7GKX1x1MDAxNeWvw/1cdTAwMDLWtud5TFx1MDAwNosoPTdcdTAwMDI4SldcdTAwMTlcdTAwMTSH4CXW3tp1w4jKfEzXTCQ0tH20I3YnkYHQRVxiiFx1MDAxOENIlfKjNNdvaGNFrkuVMYCERmVcYqLX4IZcdTAwMDDfJVRBXHUwMDBiXHUwMDE4cFwihVx1MDAxYvqx2f5cdTAwMTbW5q9j7Wu23VxiXHJcdTAwMWYhfo1dIeLfRCBdZJFcdTAwMDeYPEow/UlcdTAwMTD8gqljXSjd4sRcdTAwMTlLszm3JCmOPa55n1aEXVx1MDAwMrlbnEuxKYpPjZxGupxcdTAwMDBZJN6iXFzEk5dby5AnXYGDgki7uFx1MDAxNYW9YuQ/lOK7XGZ8+X4yYVnulmpjX0jCO7f1ZsZcdTAwMWRcbrdwnnDwr0MmvynFVVxcNUcv/bmXXHUwMDFl6+adSfe/hlh8c+RcdTAwMWajXHUwMDE394hccitcdG5ysqkv62mUq5Wjv5vDaPjWZTFcdTAwMTJuqVx1MDAxY57QXHUwMDFmT+HN0TBPpKxcdTAwMDNcYoUwXHUwMDA15kt03yQnpJ6B3NJzPMu/XHUwMDAybypJqVx1MDAwN7ltq/FcdTAwMDJcdTAwMTI5gX24yVx1MDAwZlx1MDAwZXtcbnHnj+9L3+RcYsLci1xy6DtcdTAwMTLjvlDLybGIh+I3cdj98F6p8LD6KZ466/XYTDaxM5fkXHUwMDAxUVx1MDAxZrZJn9joV1WOfK+KXHUwMDE0uVx1MDAxYVx1MDAxMzRcdK6z0Sy6XHUwMDFl+EmrmGLzvn5fqNBcdTAwMTebXHUwMDAyiOfxI+f6h1x1MDAxOP3LXHUwMDE56y8xOuS6XHUwMDAypnyLXHUwMDEwi257Mk8xTzDla4J4IJJbNckrxWJUXHUwMDEwXGJcdTAwMDIlfMJcdTAwMDGCXHUwMDAw+0qJ6I/E7vsxXHUwMDFmvJ/WqTal4Vx1MDAxZcTCa+hm4YvI8b5GlLI6XHUwMDEwiPiBRSffv6D6XHUwMDBm7KD9Jlx1MDAxYVx1MDAwNv9H+r/fI3H8nZTC0+F+jDxQPblcdTAwMTlZLjqky8BcdTAwMTn09pdEn5bv8lx1MDAxMlxidjmARCCw+Fal8dRLcHRcdTAwMDZFQM9DXHUwMDE2cuRcdLE82lx1MDAwMFx1MDAwMjxLKN2LVCXgx2+J/PBcdTAwMTPf4Cey9/tcdFx1MDAwMVPXzdG5f03+s2/Lf1wiXHUwMDAyquTgQ4NcdTAwMGZyXHUwMDEz35lTkfgoZv9cdTAwMDY34fxcdTAwMGbyXHUwMDExzkc7iC+vzZdcbnSogOhCcFx1MDAwN+/bviF6XHUwMDFhO3A0qsdcdTAwMDDxmNyyYzx4ZVx1MDAxM+mmNFx1MDAwMCuKrIhcYkdcdTAwMDPEXHUwMDA3/rp3XHUwMDEwoEtPUZnBibdyPFx1MDAxYTs82OZfwUH8lWKHd79cdTAwMDb2doFcdTAwMGVdQ1x1MDAxNlx1MDAwM/E1dUHPgOeH7/1cdTAwMDZcdTAwMDCE/WB98XtcdTAwMDU6fuBcdTAwMWXA7Cgqu8u1V1xydqvddsN9pd9cdTAwMTDJI1b7s1xudH55XHUwMDFiXHUwMDA2d9e/XHUwMDAwwEOHL57xwyp0vpxU+PlJhVx1MDAwZeIwy9GppFx1MDAwNlx1MDAwMlx1MDAxZVXV/nxfXGbzwtyeXHUwMDE05LxcdTAwMWPe96+Ked143iGK7qpihFuRvkiBXCI8XG6OPotcItLFiFx1MDAwNlZcIuFcdTAwMDRcdTAwMGWJ7Fx1MDAwZlH0vZ3eXHUwMDFi79q8XHUwMDFhPEGWZ7H4en5cdTAwMWbxb1bsQ1wi4Fsp8rf4tt9Jif6xmpjvXCJb/mhNzO/Iie8uZ5q+fyVEy7hrj23c8rrixsv2PdC+xTtIRNwt5Vx1MDAwMdDjXHUwMDEw+3MmlKfA5Vx1MDAxMKQ8yMFX01wimOpcdTAwMWRcdTAwMWVxhOMxXHUwMDBmqat+LVx1MDAxNfpcdTAwMDPa74d29X5oi4BqXHUwMDBm8kpcdTAwMDXM50j1LWRcdTAwMTOEMcDcX/DV2UGcvrXJ8ddcZkueXHUwMDBm+GPA7KXjy3HGzao2USdzvlxyr3J4eVx1MDAwZphFcKt6xpj+p1x1MDAxMVxifP7uXHUwMDAwRl1qXHUwMDE2gOVcdOAh5el/PZa//9tCfyks119B01x1MDAwNEO6YJB9LVxuwehNmiYsonxcbj54XHUwMDBmnqfSVnzEXHUwMDA1P7D8rVjemMcqlmeZryNcdTAwMTNcdTAwMTl8JctcdTAwMTF/el+eQVx1MDAwMF2Bwuu2XHUwMDE0hPLvs1x1MDAxMoTbW680clx1MDAxMnhcdTAwMTFAkVx1MDAxNV5WorOgS1x04vbOJUfRSif5tbfbUVx1MDAxN1NlSGOsW837jzKbt6HcvFx1MDAwZeWvSTPcXorAXHUwMDFjne/XhLhcdTAwMDDezjNcYohcdTAwMTDEPtbqXHUwMDFmXHUwMDAzcqr7XGL489/VoVxulFx1MDAxMpaAXHUwMDA0XHUwMDFlQp5cdTAwMTW5hzqY21x1MDAwN/Jd7kZlXCKBt4JeXHUwMDAyhN/r71x1MDAxN0L7Q1TfYOpcdTAwMWJcdTAwMDGPkPi4v1x1MDAxNyb/0N1Pz7r9+sTC87j9z43391x1MDAxNVblw8pQMN4ge050u8rcd9dIkNubwyyLqFx1MDAxOLi960Je1khcdTAwMTDuVlNcdTAwMGJcdTAwMDXAUvZ64X++e43E/6pXj1x1MDAxZpPGN9ZIQO62acC+XujHvnRLXHUwMDBmmVx1MDAwMCzeXl+EXHUwMDFm7X+ocSHxa/zPZ1v/6VeIfvLKct7QLu+n4dMpXHUwMDBlW/ntSriffp2Vu5Lch9l7f13uw3x/yuIsXFw8rkpnSlxu9IdcdTAwMTn6xoJfOkXecja+U6z069/vu/5/XHUwMDFir1x1MDAwZalSileyNWuBrkaFRD/mfLlTllx1MDAxMf2m3P6UpZ60pr97XHUwMDA3z1x1MDAxOYa3I5JjzmdAk6qa8/mpJPVjPJopg2U4XHUwMDEwXHUwMDAyu22Wqbm02b2lRZnFttMwOlhcdTAwMTONh3gnz+2JXXpxdeqp/MYpfG813fSWXHUwMDA3/rBcIklhTyrZLlx1MDAwZb0k8lx1MDAxNsFAyUi2jueJruhcdTAwMDN2Km3Xaq637XAwSKJ4sJPLq3mFjLNQc5wy7lx0M6G5aCprdcn6OWPZXHUwMDAx4+KOKDI5YjJn2V+iPZjvmNFWX11I6sxhkapwZJHYa9KkXG5geOhtyjibcd40sJ3l5XD0Yql2xtVcdTAwMTlcdTAwMWRcdTAwMGZcdTAwMGKl4Fx1MDAwZoe4PGwyPqsrpWVK/Vjp10SwRIvzw4l2JeLpxE/63GB1aDZcdTAwMDcv8PZTT1x1MDAxYrfHqTg73Fx1MDAwZdHm9uEswriQLvulx3JcdTAwMDd9fs1Pp+02XFz2vLZajeRtKDrKhGdPK0auvFBcdTAwMTSmgrhsRGWztdmLwWdjzlZ3zbhGm0lYeUhcdTAwMWOm5+VqMmUlw/NyQWSObujAa3PUxJVQyY6aXHUwMDFk/URq+7v9WTCZuNhpvlx1MDAxMrZcdTAwMTGnXHUwMDEzvS9MXHUwMDA2LJiWjTczJ9jLKo5La1x1MDAwZqlEgsHW6bFev0xmw1mHTLZGxFxc5XI37oP+Pmz6K4N1pklcInH6NVx1MDAxZrC4s1xyXHUwMDEwXHUwMDFmbNFqklx1MDAxNZ5cdTAwMTmzXHUwMDEyKC/Bttl2/DI8UFx0njBxOVR3i6KYblx1MDAxYuFcYmy68pUk7Yf4SC1cdTAwMTWk+GyITOQuZHNWmbqOfLeWqF0sLu1cdTAwMTlcdTAwMWaCeSpcZpNcdTAwMTBcdTAwMTbVmYSw9FAkXHUwMDEz3GFOW3biNT2fXHRcdTAwMDZcdTAwMTY+xdoo0vXrKEyvuL64XnjK9EHKNbtYXHUwMDAyg3lWrFx1MDAxNXmYbC7T5bFzvVx1MDAxY2J7Y2bAu7axlsZ7O0hcdTAwMTeBY0NzLoKw5ax9gpfhnISLvDOJRLPaXFxcdTAwMGWZo1x1MDAxZeq+dJ3s+dBOS09cdTAwMWNO+M5kN22Pnlx1MDAxMriahMbrfe04m1x1MDAxM5zU7MxcdTAwMTd1e3XdT6rOashcdTAwMDfCyWyV2XXfXHUwMDAxnTFvXHUwMDBiad+v9EtSwiWHrLo/ncnaZVx1MDAxMpOTcfVBal38XHUwMDE0XHUwMDA1e1i6nqfiNlu4yWVcdTAwMTdWXHUwMDA3/rifXHUwMDE2y4m/4c1sXHUwMDEx6upcdTAwMTGmy2uWb5oju7mAZT+aWNe1bfpMnlx1MDAxZVx1MDAxNLNcdTAwMTV75mq9Urh9nlx1MDAxZpd4XHUwMDAy66vHbfSaXHUwMDE4pT1cdTAwMTjuh5Nm2lx1MDAxYlx1MDAwZc5k6+yZ5SYjo06KXHUwMDA39WpgLlx1MDAxMvE0iM8+ppdcdTAwMTeDPk+f1PYxp0qgt885KcRCclmgsaGntpVcdTAwMDf2sFx1MDAxM1x1MDAxZuHQUtBCNvpz12My6nZcImWycvpcdTAwMGJlTsxquNsuXHUwMDE2OKzBZlhE+oysXTvfLyZCuKL2vGLXgcZH551lVdUmlem8McjPMlaFh9EmXHUwMDBixpvtdXpkY/vcXHUwMDE5yW1frSA6OrPateZcdTAwMWSeXHUwMDA1LdNOXHUwMDE1VzIladkpXHUwMDFheefU11PgnreHI+PghcesXHUwMDA3vrDlXHUwMDEw3LgsP2aNhZ17ktyeaz60tpNdmaDNYChv11wi5pxcXDaEwXnvb/LVOVVcZstkVzuUuqvBfNmZXHUwMDFikojVZTaONm571fSzOFx1MDAwNbh/dlx1MDAxYVx1MDAwNPeN2OSm58mH0rJI7qqugSRjPDxcdTAwMTOn2eX24MqFcm0v/O0+XHUwMDFjjVx1MDAxNM5YeOx4slxmhaBDSiWaSmCFPVTia8hsj3g9d9STrDlK51x1MDAxNHBhNZtf5im7jZ2lXCItclx1MDAwMXeC4IqTqdLmqGjjLepEIyFMRpy6XHUwMDE084HNhnVmW8q0v2bWYMNcdTAwMTEsi9vsSFx1MDAwNYJcdTAwMDNXp7121sVmokwnW1x1MDAxNlx1MDAwMGFcdTAwMTa1njbcT2XJ7qdiZ9+JsW+tTGvsztimcjZcdTAwMDD12yOAh7NcdTAwMGKYclx1MDAxZWqLXk/r99Eqy1x1MDAwYt7an9k1LKxcdTAwMDTG85klW8ZQY6NW4yxBP0ey3+tf15PJXHUwMDA1+/WqIFreW7pEOW6FlnWGXHUwMDFkx3dccm2HhOBcblx1MDAwZodGP1x1MDAwNUstMiNcdTAwMTZ2dlx1MDAxMbPtXHUwMDE4klx1MDAxY4dbeHFcdTAwMTlxKmnWeM80TsCVUcnK49k6M/cq5EPG1faTXS0no0NYpkcxPDlMPvXWys7tcUduYlx1MDAxZIXlYWVcdTAwMDLBjM6X+jRcdTAwMDawXHUwMDAz93ROXHUwMDAyJDPYK1dcdTAwMDd4SYeSWlxmmn5ziVdaNVx1MDAxZUruNGEn/jVfq+ZkfFx1MDAwMoFnLaLCnXtZUiDWYieRbfnC6LJiXHUwMDE11HLrejyw9vV0SvngMG+pP7D2/a1TsYy+8Vx1MDAxNnytS2o6mlx1MDAwN1eHy8z+LLlcZncn4CjM2Do15FxceCQ871l7zWWeXHUwMDE0rSxcdTAwMDKacD+CW1x1MDAwZlx1MDAxZHHbXHUwMDEyy6JcZlr4JFhfJjNGks/mUYCupW99w9bVdI63XHUwMDFkRieDmDlcXCfJ2ltcdTAwMGVcdTAwMDaLZutccmp5aze9SlCNpYzUbNch/XSx9jloKENtWCihovtRqFx1MDAxY43L8OSPT5RghkNUra2NrZuOQ86TU1OLXGL0RzbrXHUwMDFkjqSvXHUwMDFmL0F7Zlxus71WXHUwMDFi/VRZXHUwMDEzI9jqlsq3R0tb3FJcdTAwMDGnSEpAvzBcdTAwMTWlWiWbjGFgZo8vznA9cVx1MDAxN+coroue1Fx1MDAxYXN5ZMp4Ie2WwN/BtVx1MDAxNyElt+2BqFx1MDAxZZamuNlW0Jwm8SY3XHUwMDE2uGdw08gwXHUwMDFicSXuXHUwMDE2Ka9M0j3pXHUwMDA029rWXHUwMDA2u8W1XHUwMDEzXGKrwWq/K3ErXHUwMDA0u1xibLzJwtddsFx1MDAxZUzjw1JC57mitVx1MDAxOSdcdTAwMDe8uU9cdTAwMDdHbaGiNr8uXHUwMDE0NK1l2Vx1MDAxZq5cdTAwMTPFuNbsOFtwjFx1MDAxMDWZ0rd7msqwXHJcdTAwMGWDpWDty9X+3GKuXHUwMDE5XHUwMDFmoNfkK+ja6lx1MDAxMXVcbomVUiFcdTAwMTmEm/Tq0DjPX1x1MDAxYYKkXHUwMDBlWjav9zPVtU9cdTAwMWInk49blfRDpnVjuZBcdTAwMTSt3qhnY9iHTC50/OV+QFx1MDAxNqa5XHUwMDFlm5f9riO6tnhir9VcdTAwMTlMk+Nul1x1MDAxNG1QR0etr1x1MDAxZFx1MDAxZJN1UKdzsVx1MDAxM/l0Ued+hDtzc+qmaOxqtjxcdTAwMTbX0GLKQuwj9XxA+Lg5LmIuXHUwMDFmq0g8VsqYUFNbXHLbVorH2y3PI7JcXDhl3dZmz4dcdTAwMWLb6Se1XHUwMDA2XHUwMDEzWdszfbZdytPReDe1XFx54YwudaOaibriXHUwMDFjK7Bqt4iiTX9tz6Jya6xn6ylSe9FY6JyqUIHrbCzaaHlJXHUwMDE4tFx1MDAxZXaYK1xm6tjgw9OAeIY+OsmTilx1MDAxZNhHj1tKkm42elx1MDAxZETJblx1MDAxMOdSb61cdTAwMTlGMkucWNmMS/fS6FxuXHUwMDEz2dnKzPNIVXJBoJDb51YoQUPlpfTSabasIVx1MDAwZfhgXHUwMDAz4l4hXHUwMDEyW5+f/YWy09W62Ydgb8Wm1Fx1MDAwYlBfpZ7RsvqysdtcdTAwMGbM/qSN5Fx1MDAwMWcrdKbkpTFcdHZcdTAwMWJ72Fp7Zlx1MDAwMIijtaBX85dm440m9Z47XHUwMDFm3aMqXHUwMDE1PeY41FOuvFbecDvL5ouO2ltDyYrCS//MzTvRmqpbf7et/Fx1MDAxYbN+Nuvzw82puvRW04UzXHUwMDA0Qj/jluqsvurZtdAqZ6WzTYGdXHUwMDEzt6nZ2i0jcz+Ihd0ukspNPm37itqcXHUwMDAzh3fiXHUwMDA295eWNog32dCWYtm29UHHjdTi0KjE2Js1Lt3MgujkaybTk/qR5HApOIYokYgyQdFBXHUwMDBitJUooW21zMdlO2iM5uCcklx1MDAwZeiH+1x1MDAwMzNcdTAwMDJAXHUwMDFhZFFuXWtRNvJFs9uvJ7tcdTAwMTBbXHUwMDAxXHUwMDFmX/qDPFx1MDAxY+/qqVxuNkfIXHUwMDFm2otn2v1CXG6lzWQ9P2zNjlx1MDAxMTlHT7M3pV4vqt7FoFx1MDAwYiZ48U719I5+XHUwMDAxM5vbn6+NJ2rm9LRk5iZcdTAwMTUhq6tcYjvLIL1Iilx1MDAxZbc838mJ1D8xR1x1MDAxMTNcZrtrgTWLjLU+4qeTnYqb05bJXHUwMDFiU1x1MDAxNLlry43NVkfgvGUui920YcfpPFx1MDAwZbnK5DWRSXrqSKeKY36Fmj+iYHGNTFRSqIxcdTAwMDe7JKiWnKSpXHUwMDBiY+JwYHhccuRVOpzZTCqVeuPWtdbi8TI5mP1Tb9TrXHUwMDFj2cWuXHUwMDEwg3hNge10ZH29d1x1MDAxYmNKJDnRlGxkXHUwMDA1+bo9XHUwMDE4yux4OMmjXHUwMDAxXHUwMDFkqXfeaFvOXHUwMDFkpDHlu8A5Z1Jb6vNcdTAwMWNtQshcdTAwMWUtlUz8UJO4XHUwMDFllVx1MDAxZuP+xGaJIVx1MDAxM4Ehezurqlk8VVx1MDAwNsHxQlx1MDAxZCpJN0FGrOlU0cfTtTyri+NQXvR3y0lrZZeas3eFN9yfVU9VZmpsO41vq+oy7dfS8Ny3LvVcdTAwMTFW7MUmYqJcdTAwMGL9cpmn5LqzjNVQPlx1MDAxYjreXGbjftEzsDZXrqZsnJPL9OCi1pVcdTAwMGVcdTAwMTE4jLnpwlxyJVx1MDAxYaEoXHUwMDEzXG73QzlQ7V5+bYRNmurzouidJFx1MDAxOeW+6NTqVOPHltPGhn+VtVhcdTAwMWT3XHUwMDEyUaFcdTAwMDFaZlx1MDAxMrmHyiGcr1drXjL8sblUirTnXHTyXHUwMDFhzo6SJZVcdTAwMTnr9tab5Xxwru3UL+u5kvCbWb90x9ihmux6IYRR11x1MDAxMSymnLuS95xkTI/rsWT0hFx1MDAwNbeyt0x/yFrInvqRLErxvGPEUVkyuu2Wslx1MDAxNC7pPJwoSe2pXHUwMDA3XHUwMDExnd18XHUwMDFmmcuBXHUwMDA0oMVfypVe8VlZeCN8TpPegnP4XXxcdTAwMWQtos3oLJxnfTaJXHUwMDA3XHUwMDE0ILOjoirtklx1MDAwNeV8plx1MDAxOOfokFx1MDAxNEPcXHUwMDFieD3b1FwimVruZI1GpKdcdTAwMWQqcy3D3OqbwdLutGa7Ujvltt7CRbY/d7RcdTAwMDMy4kDJp1xcK9WDXHJcdTAwMWNPk0zMfV+y56talfxh0Pf0UZq6YrpcXM9t+oi+RC5cXLHbjeZb/jJcdTAwMDFtfyn1qCRcdTAwMTnG1M0tXHUwMDFkne+l232vh1Tl3CzjWjutOkPBcaPkXCLtjtGcaTq+7zoyUK+bxItl6IaHTrlWXHUwMDE0plx1MDAxNoLD4dzp63iMXHUwMDA1++J47UKeK56XloXZpGrEXHUwMDE1xmxVSaNVx9OHXHS2XHUwMDE2p6j2zCEyXHUwMDBm481oP+LIdq9djH7fXHUwMDAxnXBzXGL9pT6q1tuDSH2VXHUwMDAxfKun7MY9vO/o5+ZIzEGp7YxFsFxcU86Nd1x1MDAxOUPHnzZX+mF6k2yaNS5jeaZcdTAwMTVcdTAwMGbD/TlBuZKcXHUwMDEzYazs5k54PU9cdTAwMGJ/xKx9v1x1MDAxZGxcXPlaNfONXCJwe+5ytJxs0tNcdTAwMTjZVWfm3vD4ab0upoUnXHIln2pmoZNEUzV0T4BcdTAwMWakt23AaFx1MDAxNl7OttReXHUwMDA122vEZeHkdNq0K7DHg2jTO1+1XHUwMDE17nVcbn5zUUlcdTAwMDdOZ25QRmtNiLaGitNAJ6rRWMp4XCItekukXHUwMDE443PIXHUwMDExtVxy1KWelSenXHUwMDA0XGYjgKk+d3eBkLer5fyytG8vy5DN8CAxadSGzXVcdTAwMWFccu08sjbqtNSWq35cdTAwMTleyoLZMsJEW1n5LElGJWPLiiVMjCpFs1wiOKWTZM57JZxNXHUwMDBlhmtNzFlB9jNOMK7GXuO0nlx1MDAwNPy5teK3KXPBXHUwMDAz2DtcdTAwMGbkXHUwMDBlq8gxdOvjXFxY+6a6U/JUiWfnTdsrm5N76FXTwayXeOOheVx1MDAxMlx1MDAxNri+rjtUU1x1MDAxYUK/VmZaxXBcXFEzi1x1MDAxNrnHpDT0XHUwMDA0atRcdTAwMDPIrbSWfDhcdTAwMGL9eVwi6nF5OIxm4+TqXGajZulpk/xcdTAwMDI6K2+clEm0JzNSz9VJWmF44EmgJitJ7ilkXHUwMDFkZlHs2ydDaua5aoY6v28sXHUwMDE4yrv8qs+mulx1MDAxMLHLi2vkfofMg9WqPc1U4KbbdqG4dplcdKMkXqlgbvZW7kIjppnyXHUwMDA2XHUwMDEz8sYoX8Vs75Bs22HAXcz5pTdcdTAwMWRwPSyexlx1MDAxN77e6b2omPHhSphcclx1MDAwNb2E66N3pYvhyqRhdmsvPTVpI0+Xg1WzsWGV72Dfnlx1MDAwZdRcdTAwMTNcdTAwMTOsT61cdTAwMTn4NOQu0OootdtJddWvPmrCSS9qfaex48PUa/ZKr1x1MDAxMXdEh7U/XHUwMDEyt6lzXHUwMDE2j1x1MDAwN3peXvW0taVcdTAwMTTRXHUwMDA2XHUwMDE1p5m0I4qAbHxcdTAwMWVcdTAwMTauNne0Rlx1MDAxNHSwdicjbNp8cNTJXCIhOkJQTfpkulx1MDAxYluz5VlcdTAwMGVt11x1MDAxOWF9XHUwMDE1XHUwMDA14zJO6Z37fL3tnJmtMO60y4iuT3SXXHUwMDFiXHUwMDFizZZYqZJRXHUwMDE0Rf/+74/2XGKr8EleXHUwMDEysVx1MDAwMlx1MDAxNPiH3O9tXHUwMDE3YFx1MDAxNjZVXHUwMDFjnl62uk9J/vOnf/43ZsfxZCJ9KafkaClientKafkaBrokerAKroxyliciousVirtual ClusterF(A)XXFilterFilter \ No newline at end of file diff --git a/documentation/0.20.0/html/images/landscape.svg b/documentation/0.20.0/html/images/landscape.svg new file mode 100644 index 0000000..0370d98 --- /dev/null +++ b/documentation/0.20.0/html/images/landscape.svg @@ -0,0 +1,4 @@ + + +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nOy9WZfbRrot+H5+RS3fR55KYlx1MDAxZU6v+4BcdTAwMTkgiInE3H1XLUxcdTAwMDQxg1x1MDAwMEhcZnfd/95ByWWllCmXZOtUuatN21ImXGKQgYhv72/vL1x1MDAwMuH//Vx1MDAxZn/5y0/T2mc//ddffsqWJKqLdIjmn/7zefyRXHJj0bXgLeTD72N3XHUwMDFmklx1MDAwZmdep6lcdTAwMWb/a7//dMVL0jVcdTAwMWavyuqsydppXHUwMDA05/3f4Pe//OV/f/hcdTAwMTO8U6TPa88nS2tcdTAwMWFRXHUwMDExcmGu0fNf2/Cmblx1MDAxZi79cNLfXHUwMDFiM2TJXHUwMDE0tXmdfXprXHUwMDAxx3FcdTAwMTR+wSlcYoEgmFx1MDAwNj8j+C/vrs92kvhcdTAwMGKJo1xihKFcdTAwMThOQij8y7tzkU5XcFx1MDAwNlxmwy8kRkLPN19dfM2K/DqB90nsXHUwMDA1hyiCIGhcdTAwMWGBKfLTXHUwMDE5XHUwMDFm2/Jff4F+OTJOQ1dlXFxXd8Ozwf9cdTAwMDPOnv98am5cdTAwMWMlVT509zb95ZxpiNqxj1x1MDAwNtA/n867XHUwMDE0dX2e1lx1MDAwZp9cdTAwMGX6XHUwMDE49OdPX3yH93PjkS+Of+0q8KX5tc3G51x1MDAxOHzqgq6PkmJ6dlx1MDAxM1xmfbqLZ1x1MDAwYnsl/TBcXP/rU5uGqMmU53i197r+5XDRptlzXHUwMDE0foqR9rOva9Ofv+7vg/1pJNGfj/yfT43PsucnU1x1MDAxOIbjXHUwMDEwSX26q09cdTAwMDGHY8SXR/Wu/Vx1MDAxMHxcYlxmI1x1MDAwNIFcdTAwMTD0p1aNPFxiuunDh16iesw+XHLBs2XCl1x1MDAwMfk6KD+LuSlbPo3Lq5CVqjt6XHUwMDE5YFxmXG5CajWPLaa0/u2nX877P//5/sd+vFi+XHUwMDBlXHQ10tDJ5lUoz7fzzT2jn3/L378/XHUwMDFhhm5+9bk///RpWO59XHUwMDFhfbxPmMRhlEJcYorC6U9DXFxcdTAwMTdt9eWY1V1Sfeqa/3jV4C+A+f5dvlx1MDAwMeZnnfRcdTAwMTGTXHUwMDA09Fx1MDAwMkEoScBcYlxy41x1MDAxMEp/jkmKXHUwMDAy71x1MDAwMlSSXHUwMDE0XHUwMDA2k/Srcfs7JnHshaJpXHUwMDFho2BcdTAwMDSCYVx1MDAxMqbfwlx1MDAxMof+XHUwMDA04teAKL2PxM/O/1x1MDAxOXIwjaE4iFx1MDAxY+g9zKFcdTAwMTT+NcyhXHUwMDA0YFxcXGai0d+CuVx1MDAxZlx1MDAxOb6fovFcdTAwMTmF4P7V6FJF/0/L1cXnQ9m107nYPvBcdTAwMDX02VExaor62ff4Z5/F1EX+7ISfXHUwMDEy8DnZ8NPrnphcbpDlfjmhKdL0dVZKwIdGRZtccsq3pLduKPKijWr7dfv/8mXzo/vUnbLx41xyTMM9e91Fmfx3VMAvXGL+K4BmyH5IXHUwMDBlOj6cXGa+6E0h5OHT+ZszLUmjL1x1MDAwNEA1SiA0hFx1MDAxM1x1MDAxOPU5qjHkXHUwMDA1IUlcdTAwMTKiaVx1MDAwMsTFq0T5S6YlqVx1MDAxN1xupiiMJHBcdTAwMDLBXHUwMDAxQbyFNVxuoy9cdTAwMTiOXHUwMDAy9Fx1MDAxMyRBUyj8ifX/hPnnMO9+d75FYIxcdTAwMDDKXHSnsfdcdTAwMTIu9Obo38GPgVFGQCB8urPfnXB/d2b81YybXFyO8t9cdTAwMGVcdTAwMDHRJCe5Olx1MDAxOONcXHB491x1MDAwMz7XLsKB/5t4IVx1MDAxN3Zwq1KCbEhcdTAwMWR+VCZcdTAwMDfxXHUwMDBm0dBrnP/2TE6S/V/dv1x1MDAxNrinPzjVXFw3clx1MDAwYnX9m4FcdTAwMGbDXHUwMDEw+Vx1MDAwMiFcdTAwMTSQ0W9cdTAwMDU2XHUwMDAxOFx1MDAwN4hnXHUwMDFhQShcdTAwMWN+4vpcdTAwMWYobOhd3FPQXHUwMDBiRlx1MDAwMDWAoFx1MDAwNIqAtE//XHT7r8C+/92wx2lcdTAwMDQnUVx1MDAxOKbeQT1Gflx1MDAxNfWAKlBcZqbgXHUwMDFmiPp/JLNcdTAwMGZ6m1HXazmkmUWQTUNcdTAwMTW+1X5cdTAwMWaISFx1MDAxYyHIXHUwMDFmXHUwMDAzovdb81xyclx1MDAxOIZR6Fx1MDAwNcVB6kPojzb0XHUwMDBij0q8YChcctIjRlx1MDAxMO/qYVx1MDAwMn+BnnpcdTAwMTiHXGJcbsVplHpcdTAwMGIg/Km4X73gP1x1MDAwMfQ1XHUwMDAwud8uj2mIXHUwMDAwhIUg76ljmKK/XHUwMDA2XHUwMDE1wGAwTVx1MDAwMcb7wer4u6P5a+qYfVx1MDAwZcLwXHUwMDE1dfx5IL2SXHUwMDAx/1xmtfxcdTAwMGYy1ftq+cvb+TFqXHUwMDE5Lju5oFxc+TiemtNMXHUwMDE37Vxm84/vSZo0SJpcdTAwMDRKkJ+VjdZcdTAwMGbuXHRcdTAwMDdfjWNcdTAwMTBMXHUwMDAwblx1MDAwMNHyZ87874Q8yv/unFx0409rSpLwu1JcdTAwMTn/qk+GUWCtYVxiJ/+Jxal0sIyaLTVms0onrezjQPv0vyxrvt+ab8uayFx1MDAwYorRNEJTXHUwMDEw/SZros/wp0jwL1x0ziCod1xm559p81x1MDAwN2JI+PasiYAgXCJQwG/vYFx1MDAwNSG+WseFIUB15Gsw/Zk1vzFr/oNU9c/MmtKUjnaPVn3Anlx1MDAxY42O7P60Tt+RNWHohcBcdIqA0C/s5LP7gEB+efrMp4FBMFx1MDAwNH5Vf/wzc/481j9cdTAwMTT14lx1MDAwZnCbKIRcdTAwMTMw8Z6EXHUwMDA2XHUwMDAz/VUyoGBcZtgmXGb+gYnzY4CWROMq41Ci98ZobrNoVyHqvV+0+YD/f1Xi/PV2/nriRF9AzsRcdTAwMTCEJj9E+OdcdTAwMTii4Fx1MDAxN1x1MDAxY8Q+sCgwXHUwMDA2XHUwMDAxhFx1MDAxMW8w9Gfi/IFcdTAwMTD6ntlcdTAwMTgwWiggtleTW69KM2+P/lx1MDAwMlx1MDAxNlx1MDAxYadcdTAwMTFcbiPo31Sb+f936vxcdTAwMDf56p+ZOn+9/P1FKfkzyFx1MDAxM1x1MDAxOPlCo1xigkJcdTAwMTCIIOrVbN5cdTAwMDepXGacKIEgJFx1MDAwMDtcdTAwMDFcdTAwMTBPo596+JesiWEvKI6RwJBcdTAwMTI0hVx1MDAwMavzXHUwMDE28vBcdTAwMGKMg7xM4Fx1MDAxNE3jXHUwMDEwgr4650/Mf455+VvTJvK1tFx0xDBNXCJcdTAwMDT9dtnDc7ipN7XbX6q0IFxuXHUwMDAwZ6O/KW3+6mxcdTAwMDRCwvjrsP5WJui74sus/Omnv3xcbplcdTAwMGa//PLz//rPd8/+epw+X399XHUwMDFiop8+8E32rqNx4rqmKSZwp+azlW9oeYqGiVx1MDAwNeNatPnnw/fzmqZvmeH9wGPJ/dlcdTAwMDN/XHUwMDA1VEdcdTAwMDJhXG6MXHUwMDBlXHUwMDAyP7UphVOvTsuj/slzL1x1MDAwNMhcdTAwMDNcdTAwMTiJfZxGfVx1MDAxMyBZm/7jJv36TO+rJkEv+LPkTCGgVcBEg3a9aVx1MDAxMPLyQSXDMHifosGJ72i9Z0cxT166ZtFcdTAwMWJggFx1MDAxNr9+70tcdTAwMDLL6ribv21cdTAwMWErTuZDr5tcdTAwMTPZzbf1rM5CJFwi31wiiShcdTAwMTQoflx1MDAxNIZoXHUwMDAy+Fx1MDAwMVx1MDAwMsI/V0QoUERcYlxiXHUwMDE4XG6DnpZcdTAwMDJ/r1x1MDAxY4eAkaNpXHUwMDE4QsiP02Bv6Vx1MDAxMfnBS8P+x+XD6//jVIhr3yF/MFx1MDAxMPUoXG5G4Fx1MDAxZM5cdTAwMDNe7Wuch6MwXHUwMDE4V4z+0ZyH4SAmflx1MDAxM+f9on6GblnrXCIpOlx1MDAwMLb3xc93iZ06u0y/XCJ1pq7/ms75rNVvRM27zfwxomZiQ7xS4js9nrpGXHUwMDFifSxHYvYtZosmyr+oXHUwMDA1UDT5XHUwMDAyUYDDSZxAMfJV4ejDrFx1MDAxOY6+XHUwMDEwXHUwMDE0XHUwMDAxP0FLXHUwMDAyXHUwMDEzXHUwMDAzvVP/+6RzfkHpq2P/XHUwMDEwpe9cbpJcdTAwMWYvXFywL47/XHUwMDBi0Uqw34FWlFx1MDAwMFwihcBJ9HVA/n1yXGb56uRcdTAwMThKICj62WXfjtbP2vFWo+AkYJDfgleQv6ZcdTAwMGbp8KcxemTpZ6P4scN+wmlcIs3IXGahIFx1MDAxMlx1MDAwNlFcdEhcbr1gKHV5VqNQXHUwMDE0z8goQfFcdTAwMTTCX40ygGb2me55lVvhN3IkXHUwMDE5uv7n5v5cbpyWv7n32pGqXHUwMDFjrXVMm6a73SPNty+WRujnVDOgNfipPT5fl1x0qPdcdTAwMDVcdTAwMTAwhdEkTZHYO4D6hrXS1LNwQOKANz9bXHUwMDAz9qdB+Fx1MDAxY2fc75+RXHUwMDAyflx1MDAwZcKe6fJcdTAwMWT44Sj5NfjBXHUwMDE4jkBcdTAwMTBQMr9pcvqX9n3XjNTdsbNzPPxN7Fx1MDAxN9Ns2lx1MDAwMbbm9vpPWLz1XHUwMDA2Y2/Xm9JcYkF9XCLg31Wwe/8uv0Gd4jj5Qlx1MDAxMUB3XHUwMDAycY2RXHUwMDE09EXNXHUwMDFiw18o8ml2cPBcdTAwMWVKom9x+ed66b/8XHUwMDBlLH5ldvi9nIcjXHUwMDFmTNBcdTAwMWJwPYFK/srEXHUwMDE2sM84RWE/embrw2pp5Dui961A/aOtlv5cdTAwMDf57Z+5WvrXiefXy3HYXHUwMDBiilx1MDAwMHVAQUCdXCL0p3j5OIlFPlx1MDAwYvA0XHUwMDA08iywLvDb+juMXHUwMDExLzD68zrpt1hGX1BcdTAwMTRcdTAwMDP5+flcdTAwMWZcbv9Zef9cdTAwMWGwvzJl/T1VOFx1MDAxY8KfpXX4vSSLYfCXRz/NXlx1MDAwMfOCXHUwMDAxzv7Rz0dcdTAwMDBcdTAwMTdEkr9cdPE/uFxm906APl9fhOanz3mTin9Y9e3XXHUwMDE54y+fVd+Aalx1MDAwNchDcVxug4nnXHUwMDE0XHUwMDE48uq0j8UuXHUwMDE03Fx1MDAxNziBJv4+O/YmNH5s/e2vz6lonHpcdTAwMWFcIvhD6eNTcf51m4BcYlx1MDAwMHRcdTAwMGY8L1BcdFx1MDAxOPk2XFz/OfW3XG62Ly6xXo1H3NqTiFNk4PrfPrdcdTAwMGZR1Fx1MDAwYlx1MDAwMlx1MDAwMlx1MDAwM8feW9CDQMhcdTAwMGJcZuNcdTAwMWaMXHRcdTAwMTA6yKvE9ndeRFDiXHUwMDA1R1x1MDAxMYBIkkSx11x1MDAxOfdcdTAwMTM3klxioF6aovGPz4Oif6xcdTAwMDdI4C+O/3JV2j1x8M/lx98/uVx1MDAwZrwkSpIgKt9cdTAwMTNE8Nc9XGKId+BcdTAwMGWxXHUwMDFmuZb8n/FExlx1MDAwZpzdt2SWl/3CwOZLinahizpcdTAwMTQuv4XSO2UxXHUwMDE4QbFcdTAwMTdcYlx1MDAwNzaBXHUwMDA27lx1MDAwNTTri2I2Rr08XHUwMDBil1xisOHA6sHk2yUyJPpcdTAwMDK8P/7zg1pcdTAwMTj9XHUwMDBljGCYXHUwMDA2vPRcXMVFXCJcdTAwMDBKr571+qNUzf5QSPquOX5cYoxcdTAwMWNKU2/Ew5Pg3q6Z+1x1MDAwNTMg59JP+/dbMPNcdTAwMGbqZr95lv9cdTAwMWLqZlBMXy5wglx1MDAwMirG4FxiiYmETFx1MDAwMfKhXHUwMDA0pIGYuiQ0gcFIRkL/zXWzvveF1VM6Sp/+NmKjdKdyQvm21TRcdTAwMTj0Qlx1MDAxMFx1MDAwNIWRQMm/Xp3wIWnB0Fx1MDAwYo1cdTAwMTFcdTAwMTTxXHUwMDE09Fx1MDAwMFHUXHUwMDFisMEo/EKB4Vx1MDAwNoD7sFx1MDAxOPzVs1x1MDAwNK+mjr5YXHUwMDAy8YNn1v89ppKIr8yqv7tcdTAwMDRcdTAwMTVGaFxmXCJcdTAwMDE/vpeZqK+vpHk+XHJNUij6o4U7hWKvZ+1/q1VcdTAwMDdW9z5O/z0raf67Jpfeb/eP8ei/nu9/zaPTJPFCXHUwMDAxSOJcdTAwMTBJ0uRrp/ZxSph+XHUwMDAxqVx1MDAwZoVgIESB5HxV8vlcdTAwMDXYXHUwMDEw/IJcdTAwMDP/Q0LPylx1MDAwZUXh7yyZQV8g9MOaLpBIXHUwMDExjIK/Y/Lp/2deXflWLfpVr1x1MDAwZdJcYkzhXHUwMDA08V5eJb8+XHUwMDFkXHUwMDA18PlMTVx1MDAxNPHHeVjrx1r1r4bp8/UmQD993JtE+8NcdTAwMWP795hjiCRIXHUwMDAyXCIhQOZcdTAwMDCTXHUwMDA0/qra8LM7pl5cYlxumD1cdTAwMTKYSsDbNEa/XHSQb3Lsv+5tv2hcdTAwMTSG0Fx1MDAwNEguXHUwMDE4XG6MOfxcXK3+plUw+UKCcKRcYqDCn7qB+pctmon/XHUwMDE24vHS+zeL8HrUaqqHP89vKfLJul/Mv1PAbUMkXHUwMDA29CqMXHUwMDEwgFx1MDAwNT9jSJiEX1CMpFx1MDAwMOA+LO9+azOQ51wiYlx1MDAwMlxmXHUwMDFkXGLB91x1MDAwYplcdTAwMDSgYFxmXHUwMDA2UEGfjyRTn8oxf1xievxDOYzD7+ZH5PksXHUwMDA0SUPIe7NcdTAwMTdcYvxGKH2aMKSelpP+bzBcdTAwMWVcdTAwMDTQ1uj3zL7991Dk11x1MDAwMvX5elx1MDAxM6I/kiC/XHUwMDA0/Ffe+S6i+Oy9vqvX/MNcdTAwMDD/I5a4Li2PpqtcdTAwMTB1Plx1MDAwZUnhIy9l6/hNLEFjLzToP1x1MDAxOHlyXHUwMDFkRHw+14E/t4egnlx1MDAwZiNcdTAwMDCXXHUwMDA0XHUwMDE08FtcdTAwMTn1J0v8QJZQfzdLXHUwMDEwXHUwMDE0YHuYgN7zTcjbndk++Sb0w3Jl+odPceI4XHUwMDA0/evXXHUwMDFk/0lcdTAwMTF/+cnUXHUwMDFkr/lryztcdTAwMThiz5F+t8XLhfqWXHUwMDEyXG6BIS8kiuBcdTAwMTTycZuYz4VcdTAwMDROQy80TFx1MDAwM2Fcblx1MDAwM6GEv1P2h4GYQnBAMVx1MDAxNLD1XHUwMDE0XHJcdTAwMTHvllB+LCv8m5RMju9cdTAwMTPCuyVcdTAwMTOAs+d+fN+9oFxiIFx1MDAxZkVcYlx1MDAwNPrhz+1iz91cdTAwMTF+XHUwMDBi9P9eMuG7uVx1MDAwNWOQRa9WXHUwMDEw/OFcdTAwMTbfvtfIXHUwMDFmU1x1MDAxY1x1MDAxOYIgPGTnkD1cdTAwMWT/XG5cdTAwMTX+XHUwMDE5wzJcIvymmidcdTAwMDTSNlx1MDAwZZxcdTAwMGKw1J/v5fZcdTAwMTGwXHUwMDA0cEDAlJGAniFcbntcdTAwMGJYgGhcdTAwMDKmaVx1MDAxNIMo5CtLXHUwMDA1/8Tru3j9jtXy6HP1XHUwMDFmXHUwMDE4nvfqXHUwMDFkxNt9Kv5cdTAwMGVX+ulZod/2WO2vVjuAXHUwMDAx/11LkZz+XHUwMDBmXHUwMDBm1bdN/DFA/Vsw4fjfeuJSOWGgPKjmbyN1/6YqJknQL+SzYlxyoEZSX06pXHUwMDAzjL7AXHUwMDEw+VxcPUiiT+Xybmol/76/xrtAhV5QXHUwMDA0xlx1MDAxMVx1MDAxMkJcdTAwMTAgfNDXT1n8XHUwMDEx5PdcdTAwMWZcdLz671bfXGJBYthz9va9XHUwMDE0TH59v6mnk8Zw7DdNp/9cdTAwMWGoXHUwMDExkn5VT/2XlTC/XHUwMDEypFx1MDAxZi5+XHUwMDEznn909f3bK3nBUWdZyYNpu7XWW6RcdTAwMWMu4fjORunv0Fx1MDAwNHB0xFx1MDAwYklRIK8/q6g0/fmzNFx1MDAwNERcdTAwMDNcdTAwMGZcdTAwMGbBMFxyYo/A39mBXHUwMDBlxulcdTAwMTdcdTAwMWOHn1x1MDAxYrt82M7qvV013lx1MDAwZcWf01x1MDAxZF+jXG7j91NcdTAwMDVJXHUwMDExXHUwMDE08XqPudf7anxVraNcdTAwMThcZuxcdTAwMTiC/LvOdnw1Tj9cXP42Qv992aJcdTAwMWMtgdT/Zlx1MDAxZDrKVYtcdTAwMDTlztn9nYree8uXkedcdTAwMTJcIlxiR1x0+vnoXHUwMDFk+fluXHUwMDAyXHUwMDA0hLxQT1xuXHUwMDAxhIxgxLtb8OAvXHUwMDE0hoJMRj036Xm9NderzVx1MDAwNHBcYnn+j1x1MDAxNVx1MDAxMFx1MDAxOHxcdTAwMTL951x1MDAwNlwiX+dcbvP3L2MmcdDRXHUwMDE0XGL498ji6/tYwsTz6Vx1MDAxOPKHc1x1MDAwNYyg9L++7P/Xr8fpx7ffhOi/L1lIumtcbv5ondLW8I/qZaJELf02skChXHUwMDE3XHUwMDE4XHUwMDA1rpJcIsFfMPWlXHUwMDAzgV8wXHUwMDA0XHUwMDAy+lx1MDAxNEiPr+zX9SdZ/Eiy+Mrutt/10Fx1MDAwM1CK1Guj92ohXHUwMDA19saafJonXHUwMDA0XHUwMDE3Ylx1MDAxMIz9eLpAQar5ky7+QHTRo4cpPa5Sr5DrjLFcdTAwMDRcdTAwMTFq2bfRXHUwMDA1XGbh+Fx1MDAwYonSXHUwMDEwyC3P7Yq+WE9JQPhcdTAwMGJEYiT63K5cYqawd5xcYlx1MDAwNr9cdTAwMDBbilx1MDAwMjv81Vx1MDAxOUNcdTAwMTi4XHUwMDE5IFx1MDAwMklcdTAwMWPkLlx1MDAxY5z0J198lS+s301cdTAwMTckQkNcdTAwMTj0WiV8olx1MDAwYlxu+upGRTD0xNKPnzB8rmf/bZtcdTAwMDD8YLb4apx+fPtNiP77soXIVbRElHB8Olx1MDAwNXNcdTAwMTkr8IVy82+Zh3huV1x1MDAwMFx1MDAwM/WAXHUwMDAysnhOsX5GXHUwMDE1XGLy/Fx1MDAxZr9hMI09Nyd6b1x1MDAwMdKTsFx1MDAxMZqmaFx1MDAwMsHAh2Dv7WP4Zun1XHUwMDBmrln8m8xLnL7jXHUwMDAxXHUwMDA3XG7HQLhD7+qHd1TFL5VcdFx1MDAxNLhcdTAwMDKQNX/4yuvnI/Wf6l2/YWaC6fu6SKJcdDT2a7v4/Fx1MDAxMVx1MDAxN16/3+zvnrH4j5+Z6Keo789cdTAwMTPo21/Sw0+PXCKb2a/H/H/8TFxiXHUwMDFmnlx1MDAwNvmUVb59K5VPeeinpmgy+/VDUfu+fcUhXHUwMDFmieb792hcdTAwMDGxXHUwMDEyOafj8+Lnj//1y0f/X3E0Zlx1MDAwNPafhctcdTAwMWGnXHUwMDE5UqW8Y8BLPztXwcnBT8LzV5bhmFx1MDAwMPzN3VwiX86eR1x1MDAxOF8/nyCFXHUwMDE5RiwhLIbhXHUwMDBi/HBcdTAwMTJEJ1x1MDAxM8nUmyen1lx1MDAxZFx1MDAwZi1cciVvXGZ0trL8Zphcblx1MDAwMeNX9uyZXlx1MDAxZlx1MDAxNcODk4jY75LItWLOuVx1MDAxMTeXqjrPXHUwMDFjWK+7cVVcdTAwMWXZqSg0VFx1MDAxM1x1MDAxNOdKXHUwMDE1VFx1MDAxMbWYSyC16jzLoljlhXhl+03f4L1vSy1e78NcdTAwMDe+z3R7XHUwMDFhXGZ3bfh2b3jpPsR3NL1vkX3jO7yDlND5uj9cXFR3pWr/XGZ3tVx1MDAwNFx1MDAxZlxmqoimulx1MDAxYVI4u3FxXzQnLLJSz3fW2z0qmNE/XHUwMDBlXHUwMDBicr/ZQkfcbkV/i1x1MDAxYqJcdTAwMTlcdTAwMDdh3vfqfVC3ijRoXHUwMDAzSzJT2Sj68SBMXHUwMDFlXHUwMDEz3dtcdTAwMTTfojQqrUg5zneLPt2eh8Dp3m2h4aJj1tKJUOymnrf28bhcXDKHi+bBPbCXjPZcdTAwMDWTQFx1MDAxZu6eXHUwMDFkoowmLZJ2JlqIL1x1MDAxZbpqRHPEPOk6XHUwMDFkRyQ2syFCaLleXHUwMDFj17RQRouilqT39zDz4W26K7RLXHUwMDBlrC8196RiZv5aLqS+L7qrklxi2ZxjKqXypCmikNVP0Uk38ahcdTAwMTkwrFx1MDAxZSNEolx1MDAxODi9+Fx1MDAxY1x1MDAxYfF9dZJPO8q8aPl+Y/vrkYf4Mpt4V0N9q6pcdTAwMThM3VpcdTAwMTHFd5dcdTAwMTQh0lx1MDAwYuKaTVx1MDAxN+lcdTAwMDXKQP2aXqbLLumzXHUwMDFijVx1MDAxM9W+6GXpaneddZnIO+SBkVx1MDAxZlx1MDAxOKaU8TuIVKjGXHUwMDE3jd7noc3qp0FXVSRcdEdcdTAwMDbEhb3OXHUwMDBifkvPNSlXXHUwMDE53FxyXHUwMDBilcF9hOQshe/2j1x1MDAwYmpGXHUwMDEzl+xT0cBcdTAwMWaFcshVdTtk9YaPa1x1MDAxOGWPRlx1MDAxNWtsulx1MDAxNlxmJJ6bLlx1MDAxMFi5ilfLue+29VZ4sd5A0TZcdTAwMTdKXZReWtup78H6mYayXHUwMDE5M8pcbneyM5XZ7c7MaX2I11vjS7eRZzazJDKv7iNaNomdebXmeySkocIgx6BcdTAwMWN9P37A5oieXHUwMDEyWvXcrTSHnStcdTAwMTMp+dBn4bSVO2h3JDyy5pNBXatcdTAwMWV2MMRcdTAwMTh568Qqq1lQXHUwMDBmbUug2liTXHUwMDFhSUu4XHUwMDBmo0jC58ZcdTAwMGWr9ZpccjfiXlqdYyYxoTd2pkp3uHa2po2nO1x1MDAxYa+Qw+emsVx1MDAwNZ6e7Nv6Jugzzelu4FxuWNm2d1x1MDAwNzfhcYuwWFx1MDAxZCmt90S5lM3J4mRxoS5+uXfihjrsalxcXHUwMDFjXVG3K/ohXHUwMDE2S4KDyzuRJ8Cdelx0jklcZsSVLcZkOFmtNnLU1Noz2tSTd8VcdTAwMWSWXHJcdTAwMDGxWY0/h9G+XHUwMDAxtJNcdTAwMGKm6/O2cKb0Qb5ebFx1MDAxYs9GKJa7XFw9UUHotaVtkplcdTAwMGLi2UWDVCHy5WpcdTAwMTjDXHUwMDEw1yzotz2SNFxyKsG3Q9ykx/iyWXe08JbdgZ15aYCRu39cdTAwMWFD47wjUGjez5ZcdTAwMTAyOsM4u25ir/64PdJwudzue1x1MDAxZrejfSAm5Fx1MDAwNfjWOESJI6rZXlx1MDAxYjHsvIxEZlxczGtfIbEos5eAxjG/ZTVSXFzKJG7dpVx1MDAxNjRDR90rUoeueHZ2Z42hcclpjnlcdTAwMWPOm6IutFx1MDAwNeH84k9cYlxcTvTU6lHE3nrDoNpQXG41hNGO8kL507X1xFxyy9jRs5NLmVx1MDAxZFx1MDAwZVx1MDAwMqbZXHUwMDExejSdjEx3VC/kXHUwMDE2XHUwMDAzuXiE9PiW7S93PDj70oNVfGH3SLFsOJ3Xc41eXG7fXHUwMDExXHUwMDE4uyXxXZpueGVcdHOLdHNxQXb5gcyqXHUwMDAzJjl0K3poNjaeIVh8sFx1MDAwZqBcdTAwMTijcJa+NHegiHzYfZTKotKTKVjmXHUwMDA1XHUwMDE4UPKUz5FcIpdcdTAwMTbLeHxN78pdgSeGq1x1MDAxYsfwhE6DXHUwMDFmQ1xiP98h+LaE0L4/Z4rNcVxuzyNu03aEUS5oXHUwMDAwd0ZcdTAwMDVcdTAwMTfnk8FcdTAwMWGarKD5rGBcdTAwMDapLjmbcPxcdTAwMTaY5oono9tRSss5ISXcL+SM+vLOT0JNuVwiZLrBt9ukPlJHyfVcdTAwMWOFd9d8f9lpXGZbZFx1MDAxN3hccve0xSjGsdxPfor1eY+yx1PQ6KVcdTAwMDRcdTAwMTPZPlRK8zqy1eGW9fWdzlx1MDAxZf6+taJAuIZcdTAwMWN2x0zjTjo3V4dIPV/W8XGE4Fx1MDAxZFxcgj5JXHUwMDExdo9HvXuD11pmpE6c+GktXFxlOMpMaFWomWxtIOnm8Vx1MDAwMaWRYeddeI6aqkNQXHUwMDAzNXPPSMjD6qJcdTAwMDIyY8F4XHUwMDE0jXK0LJBcdTAwMGZu51x1MDAxOfCBUfJcdTAwMTd/QPdqXHUwMDFj2cSoMlJ9OKebjzU6f6pW+fqAfGF/NFx1MDAxZVx1MDAxM7V0XHUwMDExlS0l6lx1MDAwNVhcdTAwMTMxuWtQ0JSVXHUwMDA3+Fx1MDAxMiF3fJ4pw1x1MDAwMFx1MDAxObRLqDRYzdOeYVx1MDAxN/1OwqGhXlx1MDAxMs1TpfqMX3Z7lVx1MDAxMov9bTOrIHJE0Z4ukTiyXHUwMDE3b+JcdTAwMDZS0lx1MDAxY1x1MDAxNpGa647iaztIMFhcdTAwMTNkRe6ETFCTPFx1MDAxM+7aKj+S41x1MDAwMyRcdTAwMThZRobAiD1V931qMVx1MDAxZtNII1x1MDAxMH/w0Oh2p3j1vqbzsu/0eVx1MDAxYmL1MVx1MDAxOKaWXlRDXCLmu6HYMI2Sj5ypIL7TXHUwMDA1YXCruNnv4cY7rr5cdTAwMWOYob3kxdhxzKyd2YPO4jZzdaDkXG5cdTAwMDdRjlxireeJtHRzdDq+XGawblVF3Go2zmmYlWv6RLv01a5cdMGsS2qXXkZPXHUwMDExr/a2S0lXdMtrj89kes2hODLtRFxyoUC0ipvDIMtZUOZcdTAwMDZjU0Iva/Gu2Fx1MDAxMjK3my0g1siyiVx1MDAxY1SCto3osbGxPZlPjcB7nFwi7dFcdM9ShzTK3i2XXHUwMDE5x6bjXHKOptaFQ0+6I7uOQZmarMQsrjdcdTAwMWYl8cTRSEZcdTAwMTJntFx1MDAxZMuTXHUwMDE0eo/Yb9j7RaL4bD+HXHUwMDA12zGCMsbSosk8vG/JXeKUXCJl63pw1NfyuqNDj36g27BAVnW/XqtuTsf8rvDK3ddRXHUwMDFm2e1Wr2JcdTAwMWardE5yfHfWrbBGjqHisUc6gI1939E8XCItN1x1MDAwNL/Hd7vA2qOE0PdBOFIg1FxceZ6Z4ni5XHUwMDEwwDA6tt+P86hzXHRcdTAwMWN7Pl+NXG5cXLFKuefR2WGtw/FqXHUwMDE5IWv7h3WcJL2SXFzMN1JjXGa7PI/5wDvl/UVcdTAwMGJOgYVIXFx+JHePIVx1MDAxM+CgOdJcdTAwMWXirNVcdTAwMWVcdOTdfoPTsdCI7CFSkaZcdTAwMWVcdTAwMWWsOaCid48wh2FUfVLHNK+uYtEyXFygaFp1qvxCiI99uE6qsM+9xtXbNpeEliRcdTAwMDHkytbIXHUwMDE4WJNcYqZed9NcdTAwMDXVaJFIY6jgOpry1POS2MJVlcapzKDSKHSGS1x1MDAxMV5cdTAwMDLMaFx1MDAxODyrXUtR5805Z0XMXHUwMDEzQE+xjmam19iTZ6Pci1x1MDAxMOUrM8SNxDrF0cFcdTAwMWNLbLmHd4npuP1dVmus34ZIvpyas72TuFx1MDAwMGaMPFv5XHUwMDA1O+/yXHUwMDAwqNvkelx1MDAxOZJcdTAwMTFHk+bEXHUwMDEzcvxcdTAwMThWzrVsX4ZIvsFcdTAwMWPpNG5qs3XK4LsqOnW4/8DiXHUwMDExXHUwMDFkwz7XS7Egr9ec6ePWmnlBmpbUJ/xiwnnHUMRcIm5kjylYz1PFXZhL3W2SKK3UR7xcdTAwMGZcdTAwMWJcdTAwMDNGXHUwMDFliaLvOYbPXHUwMDE5XHUwMDFmq6F7hlRcZiWYSH5TUsWlXHUwMDE55DI47bGfxUmbbv6j2kF8Vt72XHUwMDA3XGJixCZvjW2kWa21p2tcdTAwMTmY11xmN1KiWHmxzY7X0ZKg+Fx1MDAwZVx1MDAxM7d5jXSP75iMic3gfLvoOy3375Hixb062lx1MDAwM7dqYMDIqLhKkbpTV+jkYeWyTVx1MDAxMa3o1sPZn3UgQtyNhndOWq+MoFx1MDAxNjNB7FqK4Vx1MDAxZvs7je/36HWGjFOuXHUwMDA16oGwzKuET4/Lvp10msa2XHUwMDE5O+qzikDLZb/aV2tCj/W5yLBBJ1x1MDAxNHpfcdJBXHUwMDA1iuO8wUpyXHUwMDAwYFx0tYZcdTAwMTZqWDiK1ypcdTAwMWRcdTAwMWOMUSRbM31cZpK3lHVr+eTta6ZXp3BcdTAwMWOVXHUwMDE5PzrVTedcdTAwMWbcgdvdUfva0WlcdTAwMTFcdTAwMDBg+ztWXHLKcNIsimErRWhcdTAwMGVG2lx1MDAwNvNNXHUwMDEzTvfbgz2IoKXRXHUwMDEyK1x1MDAxNyxcdTAwMTTrXHUwMDAy5LvUX1x1MDAxYWbu1XOLxFx1MDAxOYzeXHKJMpNMYTBcdTAwMGXIjyNveiilsVx1MDAxNLmnSq9cdTAwMTmGU2FcdGJ6X1x1MDAwMaFSdZw2lGFZgnq0XHUwMDAy9jR2d5m1+atjzkazjph37VwiuVxcpEhcdTAwMTJOUuH5U+JJklPzIyMvvLGOd3hAV4+iK5Xke6etqe1qaK7MLpqKx3LBd5yGK2dh01ltqVbrXHUwMDE2XCJzyNxy6HbELDvMXHUwMDE44FBcdTAwMDRcdTAwMTPA/daLkse120TGda2eu457MCzSJrQ/SpZCXHUwMDFjXHJ/LrRkY5VCOnJcdTAwMTUtXHUwMDAwg9boXHUwMDE0yyG9XGafXHUwMDAzNyBcdTAwMTgtOeqO0NVcXESyXHUwMDAxfLozXHUwMDA20zdoyFx1MDAwNbFzXHUwMDE2l9Grk348XHUwMDBiXHUwMDE1XHUwMDExn/g+POI+0GTbSlF7KcjhzsJCly0xRrPuwZHRONLGXFzvsudl1EA8K8lZminOO63I+36vemHPMplcdTAwMDP64Vx1MDAwMZJUXHRcdTAwMTiE9q/nMtdcdTAwMWSRgWCDWHtXXHUwMDFkiKbvolx1MDAwM77UXHUwMDE1Z2M+cS22g53Hh4VcXE48Wlx1MDAxNVwiXHUwMDAwyOkuSMLsoFB/Plx02pLfqk7GOTHiPF3JWVx1MDAxMLlmgFx1MDAxYyhOuVxyesDCrcHrqePtZn12pV1/XHUwMDE5L7DdlMtOuSFakVxurYXNzCjG8NGqXHUwMDFhuk1cdTAwMTLGO7ujxCRyykfqoa5DunaCs1x1MDAwN24xYahcdTAwMTXrrtfD+UKsJjTzXHUwMDBlw1x1MDAwMUlcIlx1MDAxN4DmXHUwMDFjXyW4+lJyXHUwMDFjXCJcdMvkXHUwMDE0o/JwdzLph3m1Mtd7ft5PuyRcdH1cdTAwMTaStriKXG5cdTAwMTZcdTAwMGWz265cdTAwMGZcdTAwMDRhP5Lp7bbseFx1MDAxNT/ipLf60WyzZyGK6r7Tp1rKsU47uVx1MDAwM3Nwd5EqV7hhP/Ix0mVEv1x1MDAxZONDecCoS6msXHUwMDFhz/vQLotvWeKohyG43GjAVVx1MDAxYZRcdTAwMTiccD1yeLlTl+lO6WKvXFw1O3VcdTAwMDKQc4trs1x1MDAwN+2vp1xyvPac2VjNXHUwMDE07o1IN1xuOSuXXG5phWqpyKNwPfvZtlhdcthcdTAwMDdJMotxyG7DdI5cdTAwMDVcdTAwMTIrsfVu+I3JKXs2lE56qUWENVx1MDAwNp3VRYzMJEAzk7sqt6QsfECEWFx1MDAxMzCB56dsXTxm3kgvmmin81vQbcpcdTAwMDZ5RzGPuWVTXFyc23VEvErUXHUwMDBltk5h2ueBQuZcdTAwMTdNwutUpSRtMoSjydicg1xi2nHJMEqaU8lRm/7h99B+T0KWelx1MDAwZa8p2c6uc15cdTAwMWSPYUWKiuVcdTAwMWKzr/M5mzYrl702N2LJ6lx1MDAxNcfl+2ztu/1lT5qKa7Snqjr0e49cdTAwMTVcZtLUhlx1MDAxYTl16aM2qzNcdTAwMTH18Mm8aaFh6qeOKk9cdTAwMTipbVqpYFxux0DJ2XCJS71fcVx1MDAxMeZcdTAwMTaR3aFcdTAwMDJbwOF4P5NBoktXoa2F4rTEM9dPj/DGXHKWeOKq6CjrXHUwMDBm0sbHLdhcdTAwMDFNqZH8KJyUYY9h3bi3ZyS8V72mVrBcdTAwMDJcdTAwMTiAnZmASeBTlpwrWi362+1wOlabL+eTXHUwMDEzKWa7Qjs3OlZ9lZfUiVx1MDAxYc+SWVx1MDAwZjh8I6hUqlxchuVcdTAwMDQqyJq8SLyHxkznVtIzlSgnXHUwMDAzzthru6knSyVz1FlDrU121Dl13flxkqCwvsy2XHUwMDEwen1DXHUwMDFlqsKVoLPOuaGtULpeXHUwMDEz2j4jtEPrXHUwMDE2KHerLrOcYqt+XjlLxDicflx1MDAxY1divKpcXN6diMwlTzKp9nBwjzYwXHUwMDE4IUtN+2tcdTAwMTDVj6meWMtcdTAwMTHdKfbgob3CvGeJ0mOfXHUwMDA2j1lPXHUwMDEzYLk7xL0z88VcdTAwMWM2dUuQKTO5fE78yStuVjSVXHUwMDAyN9FXSoXH5EBfan+h7zfwPutySmBcYl1cdTAwMWUj3ePEXFwpgUQ8fJG7UDn7ykSTKlx1MDAxNITmXHUwMDAx1z1cIr2rlF1RKoLAUsVT1vVonJyFzbzQP+Cqm6fHvqjBN/PEeNkt+1x1MDAwYnnczU5cdTAwMGXGJ/9QXHUwMDFiO5xcdTAwMWNcXFx1MDAxOKpDnuf/83++qmBcdTAwMGXZ51x1MDAwNVqUhMlXj/Q8JztO2TRcdTAwMTTZ4+1Zr2dcdTAwMTm+fWuZ760jfv+eNb+9jmhb4Fx1MDAwZlx1MDAxOfq5jrhFqTC8V0dUnv35sY44+lZcdTAwMDZcdTAwMWRcdTAwMDTf3Tek+dBgRazLrCGIsJ1cdTAwMTDxYNWDJVx1MDAxZs5dZVx1MDAxZlx1MDAxY2CKNElkXHUwMDA0lz05XHUwMDAyJ/iwwFxu5/OhqkQmr25cdTAwMTbPYXngiWhPZEO47I53yUJcdTAwMWXlxaaJS/NIXFw9pndCeydvTdRvhpJu033ISFx1MDAxNHdJ/HFcdTAwMWZuPclFgb5SXFzV9uRyXHTtbGVcdTAwMGWtdGI8J4jY9NRQh1L2WElIXHUwMDE45sHcOlPa5bzGkDlcdTAwMDexI4M2PCctp1xcr+9cdTAwMTYr50peXHUwMDFkxbEmXHUwMDFjp8BcdTAwMTKx4/uAzWdet1x1MDAwNUb3nVx1MDAxYqZcdTAwMTGpn6LDJnPSILiCtIgnlpLzXHUwMDExYrzbXGKLwLZ2h0owNVx1MDAwM1x1MDAxON2tuFwiqbqzV+bcPCgpukv5JWxmJo8qbUDCY7ZcdTAwMWWNWaJcZowxwdfaNZkpKX9h0mVyL8OjmeR4XHUwMDA39eRcdTAwMTFcdTAwMTLs1lx1MDAxM3KTiYu9pulHbCCObo0rcVxmUnPGJ1xmx0zZiFxuSaWwXHUwMDBmJtBcYvKBjZ1cdTAwMGUhXHUwMDE3vblcIiBcdTAwMWKZgnZgLbbsVUg/o6OMq7LVcvVcXCqHZjOYjn8oZLibdkNcdTAwMTTRM5Fmg7Pv7KuOMjqzwi1QOMJcdTAwMTbL02CVnr401Fx1MDAxMWOdXHUwMDE1rqdHoIN0wlx1MDAwZsmVTZzi5qLNjTZ2JqtcdTAwMWRcdTAwMTiNnfpcYpJV5GFlrJ2b8+qdtFx1MDAxM1x0ddmZ4I/AlG5cdTAwMGaBXCJJlzjhj921XHUwMDEzXHUwMDExIG8m9oz4a7ZooYlUl8BcdTAwMWTvnoPJ2OmS7n203T9Wldh1wao2klx1MDAxNVx1MDAxMFUnIcJwSlJcdTAwMDTjoFFcZlx1MDAxN76YXHUwMDE1JLGzw1x1MDAxOIZcdTAwMThcdTAwMTXpu4iLUqO5xfrcXyvJ6G7sdOUgKjOB2GtT2HckS6RkSHdPXHUwMDFhWVx1MDAxNoFIXHUwMDE1c16J6omafTZcdTAwMDfnN+zCPKKrtCD3lc/Ps6iR6vlwW0WPfVx1MDAxNNHQXHUwMDFl8YOpRV6ux301xaB/XHUwMDAzK3m01Grw+7F7cPLCbUx6TV1KXHUwMDE5XHUwMDE2/kopqsPvOlx1MDAwMzaYjefto8Up4jF86MjVnlPrRHVARVx1MDAxOc2JulrXVrydXHUwMDFjafVcdTAwMWKv9mRb7tprX2GWr4/ZtmOOeTZ7RWp4XHUwMDA3bUFhSpJ3JLm/TTpSyjxv6ZHWM4F10rlS6LatueQr3K3NabGG5XjVjvq1OsxcdTAwMDdccrpcdTAwMGXhypzyMsTJpC13Y2w88CpsiY7WdX07WIvDmWud3+lLWOcrf7Rshu6OXlx1MDAxOcV+kqg7XHUwMDBlY1x1MDAxYTKxqdMgzOOM9W5xxpGCWVx1MDAxY2bmXHUwMDE1m8v1iNPHXHUwMDA2XHUwMDE5XHUwMDExr8kgXHUwMDBlXGKnXHUwMDFitIzlyrPsXHUwMDBld3pcXOh4XHUwMDA2krTgzHc8sFBcdTAwMTG000denVZcdTAwMWXjl/M5XHLT/aw9mlx1MDAxOJ7SmHhobd5dJk3yN16LuLqTvFxySZAx1z38ljj9XHUwMDEwZMd5v5DjPM9Dq1x1MDAxZqmS33o9XHUwMDE4Ky+kWmbpXHUwMDBlSG5rfZ1YeswzOki7eGHQXHUwMDFhgiFcdTAwMWN8XHUwMDE4sUdSheZFrsTh4JX4RcYnsqD2rMSeM5qLXHUwMDE3ruxS/YJu1VxcJJ1cdTAwMTlqKqd3XHUwMDAyXHUwMDEy6VLjUuNBJMojLDZhXHUwMDE0NFx1MDAxMUN4032Nxzm82tLDk/I4jyDhaPVcdTAwMGVcdTAwMTFCj1x1MDAwYkpIaMIjanvntJVxSy5cdTAwMWaqLnVcdTAwMGX8OtVBoG+Bzlx1MDAxMHBhXHUwMDAxXGKsdFx1MDAxZKZJSzVcdTAwMDSkQtN1ujJSdqaWWKxuNdD4YZxcdTAwMDRcdTAwMDF7P+SKXHUwMDFjgnNbpM3PXHUwMDA06tlaIZnEdS9cdTAwMWZcdTAwMWGt7lx0xFx1MDAxNIOHkPKpXHUwMDEwnpWIxU+F4qbsenc36ZbbpnbkpOY06dKZTUiox0c17nhu42dR0Vx1MDAxNi7sjJnvPT9GmIBD9dYoXGbLXHUwMDEwNrI++zdcdTAwMDE/56apsezl6rNyIZuMobeadVaCTNlx6z1cdTAwMTK92ExOKlx1MDAwMyv83cvd4jn8XG5cdTAwMTU0XGblXHUwMDE0MayVY635W2c8jrIlddGdXHUwMDAwWI6gkGNXK1x1MDAxY6nsoiqni9mYM5wrK1x1MDAxNILxlkKFZ1x1MDAxNrxxLCRiXHRtYXDl2CBm1DOHxib426O4ScvDcVPCaUSrXHUwMDExXHLtLsSwgVx1MDAxYUBXcvogkdlcdTAwMWVe1Vx1MDAxMknzozzZzVx1MDAxNi9jhi1cdTAwMWN6wOhcdTAwMTExr3rQXVx1MDAxYsXV2XVqIThcdTAwMGZwRZf0Y45SPsZWzOZcdTAwMWRnU1KjXHUwMDEzxXCHK3k8qeN1VnuQRDhFf/SZx1Rjcz/g6LCPQS/rqoRylnTm6uEybadcbtJcdTAwMTNBjkSHW2SKT1mqvFx1MDAxZinOXHUwMDE04WFcZsXbXHUwMDFhI+LsnKtcdTAwMWNBmVx1MDAwN6uxxsxBbnP0XHUwMDA1Q8um9YSe12XHkMskXHUwMDA1V1xyYmcymy9Mtkb62Tpk7F1cIkTTcCFcdTAwMTS9cHOzr5NHNVx1MDAxNcpgsEftOlx1MDAwYtCxOJNV2CxHvd/191x1MDAwYq1tqrz04rVjXHUwMDAySblK0OxpUUlnzIlI7vzGxuHiXHUwMDFll1x1MDAxOFxi4d6ygsFxIDhh9+WN0d1Hr1widszPc4bNZTjwYitJRZI7ubAljeJBctCjUiBcdTAwMDRYZSpObmjVVKdcdTAwMTZ+T4ro1qxwpK1cXDyzXHUwMDE01zFLZdf3+Sqx0zpg+0bXXHUwMDFinlx1MDAwNXxlXFw1XHUwMDEw8oA36+Rq9MIwXHUwMDBiM9O52aWU0ObI3Vx1MDAxY6c/YtXGx45l1SUzYOXSXFzAdTpabFx1MDAxMfbg5zK9lWJcdTAwMDfaZOVhcGx67SRiUr6zg71cdTAwMTmoUFx1MDAxYZXDfdBcIpyXocBvY7NcdTAwMGZZdWxcdTAwMGJC5/QrksxcdTAwMTbnwGtcdTAwMDbD3E5cbvVDoDFcdTAwMTi0QeKBlagrd0c5XHUwMDA0vu5oLrsgZ7m9MVx1MDAxMIcnpz7WtqPfpnfBXHUwMDE5XHUwMDA1PbslXHUwMDE1vtdcdTAwMTN0T1x1MDAxYtGSz25cdTAwMGXxtC1bTiVuVzM/S+zFZ9dmRa+OZbeW7JdcdTAwMTJcdTAwMWOHtVx1MDAxNj6c+3lC7jFcdTAwMWOcLz1C3IfueE2UXCJ2KmBVb1KeXHUwMDA2atNAezZlZd07bUKgmep+2G2nvvBm8tzf76OGxtlNl29nXHUwMDBmRuWLcIYwSazarCynXFzrR7xcdTAwMDA8ydUj3Fx1MDAxY+CKfVx1MDAxMPO1tYRFdpUuc7pcXFx1MDAwMHR6fPjmfTFy37aES/RcdTAwMTjWPVx1MDAwNC2Sk6ennD+eXGbIXHUwMDE3Yqpi8j3U4eYyXdLqsbrpcL0xXHUwMDA328S3vbD3XFxX8lx1MDAxZZs09DLiOaeeWGBbXHUwMDFk7ipXoY86XHUwMDE2LG18alx1MDAwNpHb32rOUI5+ut97vernd1xyM89Xv53kSeAw0Kaqy9Kkatw7b14qbVx1MDAxMmzrMNXIlM+3qIpN1+jVmIZcZpmgt2mA5DwjLaImxpuN5Ih/fNh8Plx08ZmKwz3T6fvOKoA7INZ8rCtcdTAwMTJcZjdcdTAwMDLGYa/pJ1h10VxiZI7d/shcdTAwMTlcdTAwMGJMQ0pS5lx1MDAxMVx1MDAwZvHDSYWQpYHc3eNcbu9cIlZKqVx1MDAwMchAfLq4xum2Y2/wcfNztfOWhyBLs02Hzlx1MDAxMntcbmpcdTAwMWRPecd6XFxYNkjGmsyt7lx1MDAwNcDt+fA4N+SFu93P62XnbIjFRTv/amTw6TFcdTAwMTNcdTAwMTH5aLxN2FWLsqzCwU+5XHUwMDE1yZbGXHUwMDFkeZNcdTAwMTiVSsvgVJWbWyWLsT4mXHUwMDFlcT3Sbt9cdCl5XHUwMDE5zitqrk3LlZh8XG7ykFx1MDAxM7dz+uiBfzR23JF2Tlcymlxc/lx1MDAxNGQuPlx0RmmhrUvfgl5yUYtcdDZcdTAwMTZ0XHUwMDFj6Fr+tFx1MDAwMC6/QNhBnVx1MDAwYule68CvRy6saMVyTTph0PxwYvqrtTZ1mWc3XHUwMDBm2KllUFx1MDAxMF6x7pGi731x6lx1MDAwNEPcu/A0bFx1MDAxOVx1MDAwMXLbXHUwMDA1iTCu7k8sdC/1o80k/rnHJXTvRudcdTAwMDFahmvFd9ZcdTAwMTDxXHUwMDE1S9RcdTAwMDWaMVx1MDAxYnNcdTAwMDNS60D5O7Eq5z6+LqedXHUwMDA26Os2nVx1MDAwZv7VLeFcdTAwMTN/UeNhR6SyXHUwMDEwX5bgdFxy6k602DPqt6BlN4+TxPK0UaKEuqL6XGKu6ClcdTAwMTlCmsGE3VxykubDvSnZ3rRuJ5ZcdTAwMTPjXHUwMDEzpT+mnn/kQCCX1LB7XHUwMDFj03TCNYRccsvWQPZ+xflRwNLQjnz0a8FYXHUwMDE4aKtcdTAwMDY61rdaZcOUPCdw9kKO4Dprm3qzNXBfXHRueUSzm0TpZHu6MZrLXHUwMDEwvCXNV1x1MDAwNzLQsZnVi2RcdTAwMTfHa6ZDtk5GnEIl3rFjXHUwMDEzXHUwMDE12fxcdTAwMDA3XGLoNnpcXOeixFKXQPRKc8PkviDY2FWZXHUwMDFm11xcXHUwMDFhpXD0XHUwMDE0a1xuoVx1MDAwMT/xXHUwMDFhUpWlNybOxJhAcmyjWPsziYZ3XHUwMDFkUEP5QINcdTAwMGbf69GzXHUwMDEwmPtcYtBBg1x1MDAxM1x1MDAwNzVL0FxmrXF4XHUwMDFm3UqvJpRcdTAwMTFvXHUwMDE3NC54vtiIq5HiNpDGM7hcdTAwMWN4XHROXHUwMDFjbJLJZkvD4M1cdTAwMTfpnSFcdTAwMDXaXHUwMDE4lyZ3XHUwMDEx8KCes2Jv1K2pZMN9f1x1MDAxMW3KyFx03paYq1x1MDAwYplKSFmWbV6xoVxi7NY/V2h5cnlbw2SKsFMpNEmentfdUVx1MDAxN1E4NVx0XCJcYtniUCvAKVx1MDAwMc1SSJayXHUwMDEzmkpYt4mETb+GS7EsNJeeioxcdTAwMWM8fzFcdTAwMTF9eXQnm73SXHUwMDE5bcJcdTAwMDNGhUDaJFx1MDAxOUNcYoBcdTAwMTeNY2QxSHnQpXBa4qNWp1x1MDAxOGhMjdCp1kMzdtFF9UJZ4ryX4l2yXG7HKH9Y1zxcdTAwMTlcdTAwMTdcYr37RNLtXHUwMDAyLbFcdTAwMGL0Xi96XHUwMDE3upmNeTg07rpTzVx1MDAxNuioXHUwMDFhU7hfXHUwMDE1tbFOsDFXXHUwMDA2wMhcdTAwMDRj3UxcdTAwMDDucS2u23u3VW9cdTAwMThcXPX6llx1MDAwMfl/2yq9VKRcdTAwMTMrXHUwMDEwg4BcdTAwMDC70HlcdTAwMGZGYExTzNO1k91kne+Lupl3QMwze6dD2kT2S4fyO4Oi2ErxJmNOXHUwMDE5g1xuVVxm0TxcdTAwMGY/hM1RXHUwMDE0XHUwMDBl5taynCxcdTAwMTQmUu5FXHUwMDAxUYVcdTAwMWNcdTAwMGa0XHUwMDA18vgkLVx1MDAxOVx1MDAxMKd9ZHflUPhivsmzxO1cdTAwMDfS7Ss628dUI4tcdTAwMDJZXHUwMDEzMTZiaX2vKqqrXHUwMDEwvkurj30/XHUwMDExoTrqR/Om4MBRkcNcdN/oR1HOc1witpfk0ExcdTAwMTPKm9b9gvOibctbj4mUeSn7XjtcXFx1MDAxN6/ei2ZiqEekJS/iOC+jOPiX8Fx1MDAwMi9rfZs8bt1cdTAwMDFRYGDkfvtcdTAwMTgjXHUwMDA3hC5zyV86slxm1iNcdTAwMWFcdTAwMWWp5D5cdTAwMDNcXNlcdTAwMTaaXCL0Ml6dLMdcdTAwMThcdTAwMTVSUVx1MDAxNT3C1/vjOHlHKdBcdTAwMTdUZYwr1/clso0szVD6/bBdd616Zsu8yHFuIy/QQTRpWKFcdTAwMGX20NuL3+6OJciuZz6RrKtcdTAwMDfFfDh4s3iUXHUwMDAzdVx1MDAxNI6H87lA5pMmydVcIvi5z1LiXHUwMDEx94hOn1x1MDAxZudHPcdyqTFcZvCTgGcsmFlcdTAwMDdJRGooXHUwMDEx7CxmeVx1MDAwMsbMcV+eJlk0idY+tGf6XHUwMDEyXHUwMDBmXHUwMDAzRUmqXHUwMDE5+qZcdTAwMTdTg1icR5+Wy+CAYpC2Z0fF0/lcdTAwMDJxeCdcZtB9quz4Oi/o8uEmXHUwMDEx7FukdZ+P12q4S/JYUrIgonR2nSp5XHUwMDA0npOBbNNiKmlcdTAwMWLmY7dcdTAwMWFX3kuxciTdaXRPlMck45CcLWGnPFx1MDAxNvOqqSjqROV9jnjTpHBimOJ9XHUwMDFmLrlSYTLgS6hdXHUwMDBl2YFKx9myw3uxw6GLt3ss42UwN/Wyglx1MDAxY1x1MDAxNHJcdTAwMTVb+Fx1MDAxM+rgMkw2XHUwMDFjWytAX7CNQCZXhlBUb9qhunQ5Q3pzXHUwMDA2abGGT1g5zPxVYUmMNHzP5lx1MDAxZnPMXHUwMDBifFx1MDAwN+zbrcfTkbJcdTAwMDM22JzrTlwi/ZqchrxwXHUwMDFkScBcdTAwMWFtdqubp8w3l9F1pNA4nrqfzZZnuyxcdTAwMGWCiFx1MDAwNd5cXPFTxlFAvjMmy9spXFyiV9Ahzpxcclx1MDAxYuTAwbHH3bJcdTAwMGV3cjovPTl1u2bPNVo+Wit0XHUwMDAyut1qV1Pi9/b16kuDaXdcdTAwMTXwNe1G0qZcdTAwMDfNulVVXHUwMDA3yl6WY9Gdbf3K17tALv11XHUwMDA2UjdcdMtKXHUwMDEyXHUwMDFmJ01noqf+XHUwMDA07FQ3QMNzvEtcdTAwMDTu1lx1MDAwMlxycNUvsXev73djy1hnXHUwMDE0XHUwMDFkRn10TG8z6XJcdTAwMDJcdTAwMDbhnro1hGl2UYRcdTAwMDRT57eYW/VHcbBcdTAwMDKk4EE42dCZYEZcdTAwMTHd32m7L2/LWVx1MDAxNSTJWeTJyCVccj5DbE3Fuozq5+LqrruybylSS1x1MDAxOcJKjYowoLVcIlx1MDAxZFx1MDAwNlx1MDAxM591P1xu6kK9M+JcdTAwMThTZj5tS2uAXHUwMDBmbjbATHfTXHUwMDFly7O2XHUwMDExNEZeXHUwMDA3KnKwtaxYkbU7IXtcdTAwMDEuoMvpuPWZOyY2xlx1MDAxZZBWISzjfkQvjlx1MDAwMCxcdTAwMDQsXHRAXHUwMDEwbFx1MDAxNnNgy1x1MDAwMq9vXHUwMDEwrO3tofFcdTAwMWSiSVx1MDAwYsoveFx1MDAxM5mH0/Xkd/lFc8yjslxiwr5cdTAwMWFYXHUwMDFh3dlcIofp2yOsu4PHsUVS2nl8lVm0V3asnpvJbXckXGZcdTAwMWJcdTAwMTePTlx1MDAxNVx1MDAxOe1cdTAwMDXCZ31/rpyMwVHlXHUwMDA2e9DZuHe4gSPSXHIkdL2VqeXo3HxcdTAwMWahXHUwMDE5Ib6dz5t5iFx1MDAwM0PFz1x1MDAxNIL6go605150btz+sZtccoZPtZO/JOdcdTAwMGZcdTAwMWVup2te5Nwt5lx1MDAxNNTMXG5cdTAwMDFcdTAwMWLnKttcdTAwMTA9XHUwMDBlXHUwMDEzc3Ks0O1XSlwizM2F66Gs1dru97FvXHUwMDAwXHUwMDAxjlrZ0Fx1MDAwMWZcdTAwMGKk47FVTjlcIi5cdTAwMTKPyVx1MDAwMlshnUzOXCK3RNWdvFx1MDAxMffbttu3kptcdTAwMWX75NhnQ7jCxz5VSYZcdTAwMWbudoNcdTAwMGXsXHUwMDE5sVx1MDAxMSzoMrVkjWBcdTAwMWElXspcdTAwMGXMdGmKtlx1MDAxZXFcdTAwMDH3XHUwMDAzqYxcdTAwMWFiM7xdwmpKXGLuTyw8XHUwMDE3Q/frTOxcdTAwMWYxP+1NWipcdTAwMTjm/PBbX1x1MDAxYostOVx1MDAxZTXcZlx1MDAxOJHJ5Sud64HQmVh8vO9zXHUwMDBm4Si+O0aXS1x1MDAxNCpWW1x0lvPohVxieFx1MDAxMODzIVx09XXeOVx1MDAxOcGG5c003HPtXHUwMDExdzfFXFylYzbKiT/ba35fmE3f8Vx1MDAxZVeyXHUwMDBmjFGuNPezXiOK8jydrSBZ9tW83r1JSlx1MDAwM4Q1sYrB78iOxyBmzc9cdTAwMTRjMyVcdTAwMWOMXHUwMDA0XCJcdTAwMDO+XHUwMDAxncVb4fm28d1cIkD2uSdgSoaQmb0gonPf74+1XHUwMDBi43iH4Vx1MDAwYu87qcArXHUwMDA0n3GptCnWsvJcdTAwMWNFXHUwMDEwjlxmtYRcZjFcdMygxHRYNLw3cpjFXHUwMDE4clx1MDAwZfNcdTAwMDR1VkVcYqj14STMXHUwMDA0xcqxXHUwMDE4XHUwMDA2WMVvZIbSXHUwMDE0XHUwMDEyUKk9maXCyfaD1DQ2hjFohnOBXHUwMDEyIdtPXHUwMDFhNvXPsytcdTAwMTP1jsl3fWirIZxcdTAwMWFeajPBsvBzXHUwMDEx8tqpiSTOXHUwMDFjvf44T1qXTlhxfSA4XSml/7hcdTAwMTU8miko70w7ez/HXHUwMDFjXHUwMDFknlxmXHUwMDE0VjpRt1Cg4uOrcmjIubQuabdppc0o+Vx1MDAxNVx1MDAxNWT2XCL5V1x1MDAwYqRcdTAwMTOkjSXrWc9i1WFcXNhcdTAwMTBRkqilU5T2/bpcItqp7M5nlFx1MDAxN82c2Fmrk0KoJ+9pPZlS30lcdTAwMTZsXHUwMDFlXHUwMDE5oU+8tlx1MDAxM3GxZVLukHi9vCThXimF7STmjXY8eOWUqCrFVMHpZPQ5Od6FgFx1MDAwZrbt7FtcdTAwMWVm2Ob5NmfsvFxmTpu3x8E+j0zFTrGV2bJTdNCIXGZ+nl0uXHUwMDFlMtD2bq6uelX0zYJo3d6+YGpccteP60Uxe7HELdTMOSdaINeNaYX1oLxcdTAwMDFuheXy1FxyeMmmc43SwZ3taVx1MDAwN1x1MDAxMeN4dXG4PZk0x6zuvkZk2CimTk/beWrKpVvxi36DXCJcdTAwMWaZXHUwMDEynVM2J1x1MDAxN21LdnY8Xij7XHUwMDA1RvpC9I9cdTAwMDJyvFx1MDAwNFx1MDAxZVx1MDAxYzpcYoSH10A5TDFVzJfxmO9tXHUwMDFmm9n9Yc/z+c3ZxKE/+UTMsuKxyeN4MIzGbMvTQFtcdTAwMGZXK73qXHUwMDEwYKxcdIhzPyhnNi7rZEqEbVx1MDAxZdTdXG4vuszzXHRcdTAwMTJzXHUwMDFlhrWH2Ta8U7pcdTAwMGJcYr/dl1q9hz20XHUwMDAy+Swh6pOsVeQq7GJyXHTFckHWK7S7i+xjOaFDsN9WXHUwMDE29uEqTXlH38l6XHUwMDBl2Vx0taHjxJeHXHUwMDAyeNHbTW+LMOfJ5SRBlFuhzCwzyFx1MDAxYWAlvKWMRaGzUSNUdXWPuTRDKEtcdTAwMWI79OJminxot2N9Oao3+cJcdTAwMDWLXHUwMDA2TaGftrueYLtzZvePudfc41XWVKfFXHUwMDFlUXyNr2lywpprs1dj8bCvY9amiDu2xburXGJMrHU7piRcdTAwMWST7Vx1MDAwM2FO+ilcZnyr8FjX2Fx1MDAwM9AjJsxfu1qR5Y9eXHUwMDBlhu5DeYk4Xi/vjzt5xWigpXdcdTAwMTK2PnTvPlx1MDAwNFSwhbnMdlx1MDAxZdH3XGbRTOQmqk3OXHUwMDBmOIncMuqCbcWGh0LEos7WiViqXsNcdPObzN9fcv06zplcdTAwMWGPWckgUWxaSl7IIHNDbiWrMplcdTAwMTKH7YRYrtmmOr53hnssZeHozKfjbcZ8xrqSTXmLYVx1MDAwN1x1MDAxOVx1MDAwM4q1JL+VYU26XHUwMDEwcacx0Io9TrNwXCIvq+hasuWYcFx1MDAwNt+I84ac7VJcdTAwMWQshpJcdTAwMWFTKoOquYlCkKL+ybiEpFZkgu/0vlx1MDAxYZc6kcF0z/rYxFxukPhzvdq6jVx1MDAxMVx1MDAxNFx1MDAxNyOn2/FcdTAwMTBcdTAwMDTsntzfdvf2XHUwMDEyrGfEnShP5OVcdTAwMTWvoLpzsmV3jbm4No/1aMDAJZcuiTThxlqWafHW/cjw+iW8hVx1MDAwMX8nTYm++Fx1MDAxZdXD6cBqKNJsXHUwMDBiTnVXMdmlXHUwMDE3NjmyW9qtXHUwMDE4fNEs0+3Yfb5cdTAwMDUnQGXVYLlGjiM0wef6Q7sk+26/nFx1MDAxY7GDlmKJR1pfgFx1MDAwZUWO6DBmcpE9TL9N5kne4lW9hZW2XGaBo904QFx1MDAwNTxp0Vx1MDAxN4ScW7VsI9Zt6bPgmE0xlLFsJGqEX4dROJBcdTAwMGZcdTAwMDJ4PC24XHR16eVF5Fx1MDAxZrGjpGVcdTAwMTQzR4lXNpgoMsZcdTAwMWVocKy7JVx1MDAxZSRcdTAwMWVt9kA6NOefylx1MDAxZHFKXHUwMDBij1x1MDAxMHWD7YFcdTAwMTLcL1x1MDAxMraFI409XHUwMDAyaSFtpcJTIOVPui9Sk17gXHUwMDExS1M8WzZEr1x1MDAxZt1wojtcdTAwMTW5czbS4PmNm85cdTAwMWQ+6rAyX/JcXOYs/GSQuOeUqjU11UVF0vrI+ctY7OZ4pLRN47I5XHUwMDEyXHUwMDFmJkVcdTAwMDQmivqdXFx3R6/2nVhcdTAwMWXbXFzCxFHotjy8LSpi50PluVQu0Y9cdTAwMTg6XHUwMDFhfXN51rZqpmhTXpGb0b67eVx1MDAxOZ+5dlx1MDAwZq3P6lx1MDAxMpBcdTAwMTFhbIZ8WIy1vctul5OlIVh/qnNI8lx1MDAwMJdhuy41tnC7XCJ0cb8pXG5cdTAwMWXKaDfPXHUwMDFht3W7yET8OGqlepMgyeFcdTAwMDTRzn1cdTAwMTdNXHRq0XqP4G9sKuWtU4qtxlx1MDAxY1L3XHUwMDFh1cU5ujnA8qTj1I5cdTAwMGKBMG6CXHUwMDA29lxiX/v7g0J3XHUwMDAz4bTocTiOneMpQlx1MDAxY/K4Kz49fbn4LtxarZ4kM7NDTJ/ebb6M+Fx1MDAwN1xmjvo4XHUwMDE0oFrRpzWkQpaZt3mC0ctcdTAwMWXyaFx1MDAwNteaSPcxmVx1MDAxM1xmJjNQRoxcdTAwMWVAXHUwMDExXHUwMDE4pLMze26gWfJyW6uWyzhXLsRcdTAwMDeL8NP1zo9K/HC5XHUwMDFkXHUwMDE5w25fq73K9d7J5YbD1Dz6XHUwMDEze7tyYuRo2yjzs39cdTAwMGZxhrtJKsc+XHUwMDEwmq5cdTAwMWNcdTAwMWTZ77uIXFzZqnNq0Fx1MDAwYmiPYKw2RIrp3K624iOxtUFQczVcdTAwMWO/2Vx1MDAwNtymgOc0bbpeXHUwMDBml6LviM30K7PqvY5Vro1BN81InpyBXHRcXDKvd3FcdTAwMWR15zCFmDCzXFyHwGW7XHUwMDE2d4GLdTqQ0juhRc6Vqe5sXHUwMDEyse47KJnD5OZcZsPlkknGbfVq77ZtXHUwMDFkXHUwMDE0UMp98aqHmni6XHUwMDA0XSNl5GV73dJcXGJsbzw8cpRkhVx1MDAxNSuCZlx1MDAxN+DKeix3ZNlDtOxxbqhzUMjLeYnP+/CuR2WrQnXE9UbasedDJuxcdTAwMThlcTniMYVcdTAwMWFcdTAwMWNjSHlIjlx1MDAxNzXXOfq+l4bYfqyaVFx1MDAxY249hY0lUsaqrqxGQkBcdTAwMWROXHUwMDFhjTRdXHJocY1cdTAwMWLR7lxy2W5cdIM7UFx1MDAwMsQ1ZXQh9qNQXHUwMDFjSoeuhmTh11H/pVx1MDAwZVx1MDAwZptljFx1MDAxOdhcdTAwMGVmgXeykXvnuUuqXCL5XHUwMDEwYIQmP1x1MDAwZV3GJrbKrMBcdTAwMTeN55twyVx1MDAwZnfGXHUwMDA0bjil9/dcbi6iulxu7s5yXHUwMDE3iWNcdTAwMWWv8CZcdTAwMWPdq+tcdTAwMTdCxFx1MDAwNJaotJ3thbtcdTAwMTJcdTAwMDPC1NV8IYI4rJW1XHUwMDA3T7CH/GDtMUSVmsNxz8o7rLrh0HVXT9dcZjpcdTAwMDRF/WC5XHUwMDBie9c6+ZZcdTAwMDOsWUeSoLi9kFx1MDAxYf1cdTAwMTlcdTAwMWLF7l7XxVx1MDAxYdGlrpZcdTAwMDW6Yz3uyCpcdFwiZoC05NMlu9vKiVxizXaPZ3IsXHUwMDA2dkdtkmuHXFxgpUy2Jrj8OG16hDynL7BILsj1xO4wjr/wJFxiO26/J/Xc6G9d85jUcCGzw51vckVcdTAwMWZcbsI/M7tg9E7wfs01cFx1MDAwM0lcdTAwMGJcdChcXKZqkc5tfttcbvc+9MFRw1x1MDAxNI6WsVx1MDAwZnPGxnBDul1Q5iD4XHUwMDE3PVxm0sZYNYxcdTAwMWaKnaupu5m4rLLMVPvdxd9Qp0RJqlx1MDAxN9o1lo75OlxuQVvW9rQwMXY5yenZaGG/c9mgZ0CvXHTqLOuPnVx1MDAwZTHxYS6B4tl2Xlx1MDAxMqNcdTAwMDPygKvwwULt2uZmM4eSp+A9XCKf8zKkgNfbhINpn/iiW7zmXGKdXHUwMDEzaTdNgOLa7nFcdTAwMGZcdFx1MDAxZd9wTkl2Sd2OPX3Fhp1cdTAwMTBcdTAwMTBo7TbAXHUwMDFmpJOoRvSQZqhcdTAwMWGeXHKQKtqKqcv2gPg2ULqdSJySIOghXHUwMDA1RI6nJnxqod3WXHUwMDA3XHUwMDBmzPl/iXqPpUeVpuH2glx1MDAxOODdXHUwMDEw753wzPBGeC+u/vD0fr//RI86OlqCoipzLaoyJci8TtyEvcmfIzx98ML2njtcdHNf5Vx1MDAwMVx1MDAxMCW2aD/2XCLTwXOnfmDUXHUwMDBmxWhz6KLOSsbFXHUwMDAyceppv7kySUIodTyLXHUwMDEzj5iAqCx0XHUwMDE4/3ZcdTAwMTFIXCLMXHUwMDA3YEC+icvI43+2XHUwMDEzcVx1MDAwNLr0UfO7XHUwMDFiymE7JFx1MDAxY0L+KnK/qmjlvbZcdTAwMTdcdTAwMDN+JSRNtVtcdTAwMTmH9XpcdTAwMDCA1aBEe/pPsdiPU7zUU6SnY3WERX+3nlx1MDAxMtmyWEFcdN7joMRP9Eymjlx1MDAxY7hcdTAwMWOiJj+66VuaeTjUsl2KgcyA7Vx1MDAxOb9SLLhcdTAwMTb184tTT4Ctv49cdTAwMTj3z8edMnTuiOZK3ahcdTAwMTgqzYy/K51D8/djcub0dX+ApkKYVImiwFx1MDAxMSo0VPt5Ni5cZlx1MDAxNsHLXHUwMDAywiyrP2NcdTAwMWV2J8mIcb1cdTAwMTfSXHUwMDEzJTgxq1xchkHhZ05cdTAwMTfI7lE3dOHM7VRq38nGVW/iLIXKP5LV2HAsisemR1x0tOtq7lxm5y0qsdPS4+djp1asrsVcYq97gCFkXHUwMDE2uZhJ7N52/dZmxPX6Ln8lrFx0qLXXVP2VX/iXvjCWck9kUuTjdKk7ZKKtyfNcdTAwMWV6q5Oas5jm7UxcXHu7Ra1cdTAwMDVGwtSf1f/bXHUwMDEzqp+IN8voi/1qyZe9TEQkhqrUVt/fnOHnKSHGhFtxxVx1MDAxOVxyd1xyijnYSKt+OcVjRit0z1x1MDAxMNm03lx1MDAwYmrikC+OlVx1MDAwNlx1MDAxMHn/0tW4hitsyXawyGa9jz5V2burXG7//KFS0kFISC1H+Im/j7f4/Oe7XHUwMDFlxWfnjMlcdTAwMWF/O61A/FZcIsVVTStcdTAwMDRl3Fx1MDAwNjEnyafhsO9GXHUwMDE0LbBNOp4011x1MDAxYVdcdD0y1MQ8XHUwMDFkZPj3nurIVNJp5s2kXHUwMDFj2uzHXCKVlVx1MDAxZiggnzXILL+eLIRcdTAwMGVcdTAwMTNsScz78Fx1MDAwMpSoLq3ukMlF5I0++1dty1x1MDAxOPWQbuB8xDOLL8VcdTAwMWKVZdfPXHUwMDA1b/B7XHJcIsfnX8VcdTAwMDFcdTAwMTl3uMbiO8RuqcxaMUzC4zRpJlN+7C1vZFx1MDAxOX+tXHUwMDEwPfiyXHUwMDE3XHUwMDFmXHUwMDBl+W3wXCLoYaFcdTAwMDG+XHUwMDFiXHUwMDFi5Tz8SFmML1x1MDAwZYFcdTAwMTklwoD9cCtS49TpnW9oXHUwMDE4k0ZNrSltxVx1MDAwNuT6hVx1MDAwNb4ukeHFXHUwMDEw0yp9itk8fJroaFx1MDAwM7x7XHUwMDAxV0FaXHUwMDAypFG/4ajxtkolj3pzXGbOoo04xcL5aDWRXGaYs4Gh3d1JefvQyfx6SVDwXHUwMDFjXHUwMDEzXHUwMDFl9EeQNcRSXHUwMDAx5osvKKy7YnEnwe84YfqMj3e6uEx9Yc58PaHCTNnq6uV44c/f/89cXExElFx0bOBssYxcdTAwMTROUdJiXHUwMDBmXm9PXHUwMDAyXHUwMDFkxTueOrcgMHK/hr4+ypbmh+9cbs1L3fxdc/NOi2BwvFx1MDAxNvGVnDaR552ddteWQ+1sXHUwMDAzOVx1MDAwNV/S/awnXCLoxVx1MDAxOEBgtl0sRJTmxP57l180h1j16ZItkFxc6t+Y2FNyfbHKVIj2i1x1MDAxOF2GhFtcXMndVqpcdTAwMDOQMp7JietGkGzCsLbswb9cdTAwMTXafXSGv+RcdTAwMTPTld3RXHUwMDEx9WTwjnPoRuU3YOrYt1CTf3PQXGJBft5cdTAwMDXDkFx1MDAxMPO6XHUwMDE5YvZcdTAwMWZyyX7jXHUwMDA3XG5NrJ1An3KwxmAxUJpAl1x1MDAxYztUUt9x7VJdOi8kZnFew7O45Vx1MDAxMI2KhVIy6tkl5qKY+1x1MDAxZG/ua2uC73ajzYLE2EYu1jz/+049wIYsKitcdTAwMWRcdTAwMWKPp8gq8Vxc7Vx1MDAxNM1rcLGCl6FSwJZe7Vx1MDAwMe87XVx1MDAxMOOQMZCjXHUwMDFiXHUwMDAzJLuUSZx4x3kvO9FGblx1MDAwNZ5cdTAwMDdg/dfj7W+KvPTEbWS33FOVLTTGvj7zRUxcdCTrf/HNSEFcdTAwMTbfIXIo74+iXHUwMDEzv9J/9dDlOZXevt/QLj7WZ5ty7yugvs3LXHUwMDE1Y0CZ02lvqCc+7aZlpt5cdTAwMWZcdTAwMGWyuVx1MDAwNZ5hXHUwMDBlc4X3QV16nr6eXHUwMDE2/kbJXHUwMDE3nrrJSFx1MDAxObJcdTAwMWXmnWv/9ueKdFx1MDAxYt+V8rK0bj0hKmROoIeah+nybFx1MDAwM7DCl65gqU68RYBhXHUwMDEyQI6/41x1MDAwZU1BtTzGO7b+b/Zz8IM19JXVfdZ9XHUwMDA2n2I3bnNptq8m9HqRZzd+qtb8b5+wLVx1MDAwZlFEXHUwMDAxXTCLXHUwMDAyXsmkXHUwMDFiMZ58+Fx1MDAxY35cdTAwMWbe/43Xb8tcdTAwMTLyNYP7a8xjcFBccrHd3yyOL5hFXHUwMDBlOTZcdTAwMDVqisP71LTnW56Wl7K+wVx1MDAxOURcdTAwMDe9V7fa61x1MDAwZjLgi1x1MDAxNebGLtZcIiRVXlxyLYtOpEuI/stFeUhwhnmhO1rY0fzVOvhccifLo5NcdTAwMGKA8q0xqOrXwffOXHUwMDAwmOffc/RPXHUwMDE3pVxiJ2TR7IVcdTAwMDQn7Fx1MDAwNPl6XY1Ah3ImMLbwXHUwMDFmXHUwMDFkXHUwMDAxNJs3PqBWXHUwMDAwX1x1MDAxZV7vobPO0Vx1MDAxOMmQelx1MDAxMmeGXFxcdTAwMTDq8p8yzpigq8eDXHUwMDFmsihcdTAwMTNcdTAwMDXy3NzE334151+XXHUwMDFlXGLYXHUwMDFluFf7XHUwMDFlvuFk5pFeXCLN/urXXrehnt+DJoG/md5cdTAwMDKSpa1usU/sq3iirPDJ5ZHtqUrqXFxjXHUwMDAx6X4rOmPFpLKj1sK1f7Fo4ryNP5RP28Xp0lx1MDAxMVGvjsjYUXV0olx0cVxuoz/8XHUwMDE0uizWc+gq5OAzb6WgXHUwMDA24iFcdTAwMTcnYPjcmF5cdTAwMWOxYctcdTAwMTexU5yRYZmhsYg+m19cdTAwMWbjpNNcdTAwMWJi+qmsKKtcdTAwMGKhpIbXKj9cZsPUjNBcdTAwMGJO4EhcdTAwMTSDxaVcdTAwMDCrqcc0XHUwMDBlJGM6JvrrXHUwMDAykL5PXHUwMDE2UdT2k62hXHUwMDAzXHUwMDE5XHUwMDFizDO+KZ9mTKRneUt0XHUwMDAyalJGkO3aZ+1cdTAwMTFN+17ANtRaUURcdTAwMTA5c4Ks45G2vkF2gl71YOxrro1M3Gs3LfxcdTAwMWJ7n1H+fSlcdTAwMGb0r5mOOj970kEwsrFEp3zvNVFcdTAwMTB+4t9BKlx1MDAxOM/JXHUwMDA2XHUwMDExleQ+XGJcXJPWfPeOJk5FQTPdi8drmVdjdPh9n+nonPB6XHUwMDE4fWo2mYNLL1x1MDAxNLXZe0mCsc286Vx1MDAxN8MgsIBcdTAwMTjVduDZN0r/d0btuMjktVxcXHUwMDE5x9VuSYdcdTAwMThcZmJ2XHUwMDAzYVx1MDAxZXDj+DbZ0kSVuzSOf1x1MDAxZTssTK/LZl5cIuCVOXo3XHTewZDcSoLSXHUwMDA3uXZG4/W9MsWtkDBcdTAwMGXSzp1CgILbKi4lVdi+zFx1MDAwMFxu37+GflxmIehcdTAwMTU17cRPlVx1MDAwMT4gu8q7XHUwMDEwoq9cdTAwMWKMhmWNQ+3xjFx1MDAwNW7ASdLDwahcdTAwMDKWXHUwMDA2XHUwMDBm1smDzd+GXHUwMDAyIXG5XHUwMDE3MF6sjFZ/gXrYgX5VXHUwMDBi9mHUS1ZMX1Ski+yNuTm29pej7lghq56QRrnXKvimMrWKJGQ3vbKyxmA5oTRcdTAwMWWm1N1cdTAwMDHIkypvnWtETFx1MDAwMOZ4P5/UZEtcdTAwMTX5XHUwMDBmXGaHodBXWCtkmFx1MDAxZevoVUq97l6PXHUwMDE0YVx1MDAxZHZfUVWR066Ad+VLa0RGPrNcdTAwMDBfV71NS/NnfG9xbNj8e0mLsTJ7bakmXHUwMDE2XHUwMDE5XHUwMDE5478zNHcg1P6Oh+5vvKpb8jOF6ImUtzjk0vRzLzep3ldzb1dcdTAwMTa77s3nc3L9nI5cYrfQWlx1MDAxNrhHZtYndEPYXHUwMDAxJK3Wnlx1MDAxOHHKXHUwMDE05Vx1MDAwNTF8MS3LMVx1MDAwM5a4NzwgZM3TssFKZv6ZjvoxXHUwMDFkXHUwMDFlZHrCIz44dsdgbNCe54lcdTAwMDPMmeteXGI2XHUwMDFiMNJlMrhcdTAwMTJcXEfiuquvXHUwMDBmdFx1MDAxYoqAYiTnzWxcdTAwMTc3XHUwMDFjJElhTGFcdTAwMDBwZblZWpBuRaienFx1MDAxNls+zXX0zrdcdTAwMTdcdTAwMWTBXHUwMDBl+DhcdTAwMWM38FxmRFx1MDAwNnHRW0Rmg6D8iNxcYqfIwGeZwrx+aFx1MDAwZbox6MjgJWdcYv+USPfC7EFcdTAwMWM7kVQ4XHUwMDE066c7v+N60KCi669Nz+minIPu1Vx0ZlG8ZKIuUs5fXGZzx9ZcdTAwMWUxVcarXHUwMDFmkv+++LClNFx1MDAwZf6dXHUwMDA0UFx1MDAwMmuiXHUwMDE2v1x1MDAxOFenXHUwMDEyjD8m9Ca95omxXGbyuePMfvrb24R2yXZkRt2GRFx1MDAxM1x1MDAwNjlMRc7Km7HCm9fLXHUwMDFjXHUwMDFh6uFcZvj8QT9LeaNcbpDyK3RcdTAwMDdQkVx1MDAxN1x1MDAxMS9cZvlz1irms9pCfXzTLz/B/s5AXGZcdTAwMTFUtzsroVrP9UVGglx1MDAwMHB8mcqhmeBWhlOHLqreXozyLc2a0lx1MDAxZUEzglxiXHUwMDEzsOa5dZ3blZGj51x1MDAxM3FYoGuNXHUwMDE3QV1cbuvR1NClxrRnkpyu8WCfVfhW5PfrXHUwMDE0k1x1MDAxMp5BJpWNLfWfqlx1MDAxYiA2LTVsvIdRhF5etibTitH0Ylx1MDAwMigylfB1S4XHw4RcdTAwMDdcdTAwMTNcdTAwMWGEQ1NcdTAwMTMxo4lUrlKhXHUwMDE4R4b8kORm+s44WJAlulx1MDAwNItcdTAwMTTWTarY+P3D2E1bpC99zF9cdTAwMGLX6JjC3KksIGHw1Fx1MDAwNXbDrJv666bWXHJcdTAwMWEwMmRcYr89cW3oXHUwMDA0cYGuWFx1MDAxOXvgcEKE7Fx1MDAxYptcdTAwMGbWg6r28FeFTLCzP75cdTAwMThuXHUwMDAxTChcdTAwMDXd1cZkXHUwMDEwJWH7tte69SUtWMZcYl16cX5n9IXoQoBjXHUwMDE5XHUwMDFlbHprhrBTxLr9ptKH4vdcdTAwMThcclL6XHUwMDFhvOaGLTabvbVCbYuqkK1L/1x1MDAxZr9cdTAwMDWoXHUwMDFjc0Vad0yhXGZ27fu1bNFa6Ye+wKTgXGZizCRcdTAwMWFQdUDqXHUwMDE310HBtNUm0dGbaFDHKZfkXHUwMDE0xL+zXHUwMDE5yZfbty00Smzrj1xcPVx1MDAxN/3N8+lgSGzkjM7nXHUwMDFi3iG0fTaEXHUwMDAxXHUwMDFkXHUwMDFkXHUwMDA2K/+Vh5CkyD5fXHUwMDA3VWS8qLale9NsXHUwMDA3/WCs/tjeg85cdTAwMWG6hq+elUe3XCKMv9PjJiz3XHUwMDFjWS6ERJUsxymxqyCuaOHLznKyX0YsR4WIV+x+X/z+I5aeXHUwMDAxV7KEi1esXHUwMDBm2KimN3/dci2+w+V0Ulx1MDAxOCdcdTAwMWLEQkVcdTAwMWNhaTv2P0Rix/VBcFmkp7va7tvJ2YR91VjfJut3fVNcZirD9FtcdTAwMWaxkjv1XHUwMDBiyoF4XiZxgepk9U6i8I8vX1x1MDAxZdlcdTAwMGJLv1PqV1VPc51ccq3eqSfVqIvMUl530lItXHUwMDE4UDJkOuiryMFcdTAwMDJcdTAwMGUrIFx1MDAwMvvO/UZcdTAwMGZmK1x1MDAwZSpcZuE1qXqTfG3WPor67JdS21E/JzJ+iFx1MDAwYjCApVxiYKv7W1x1MDAxNFx1MDAxM7N7gD5cdTAwMTNcdTAwMDNykX5q9Fx1MDAxYYD7O4BcdTAwMWTC8Giu1Vx1MDAxMCot+So9Ls8wiGBcdTAwMTlcdTAwMTTUs7bBq2OA5LDfynXlXHUwMDAwNTMweYtCji2sKXbS8JZcdTAwMTS4oLyRXGKYmcNcdTAwMWJcdTAwMTZi+uVRtG7mOHNrP4ZcdTAwMTlEL1x1MDAxM7hOSbqXKm6NXHUwMDEwXCKJXHUwMDE0nFx1MDAxMkbDdfvss3S0KlCU0KFCOt9dpz7qw7fgXHUwMDE3785BrFx1MDAxM4NcdTAwMThcXHRcdTAwMTk+bu/yv09cdTAwMTfk8U+Vcyvisk/DTs1dLMJcdTAwMTeOSdTtd32k+d8+olxcLGV6f06J/u1cdTAwMWWSgL81s1x1MDAwNdOA9L1ccsx3vFx1MDAxMSXcaa1FeVu2tv2C9501epRz+Vwi6KGZp5L0XHUwMDBibNcjf4xFvFx1MDAxYr6W/n7E/ZB8oKlPXHUwMDBilDeIZ/mLfNSmXHUwMDAx5F/lIOHQm3aSXHUwMDAwXHUwMDA2O483VMdGbnBQSiCoXHUwMDE2TK1Z26pkXHUwMDBiXHUwMDExdZ05u1x1MDAxZDPe8Fx1MDAxOOZE9CtVXHUwMDE27Vx1MDAxZelcdTAwMGXAnVx1MDAxNDlsLVx1MDAwNos5fFx0qU6cxyd/TbConIg6o3BcdTAwMGbcVJeu7NwovCZcdTAwMDaIhEnJhDBeVlGlfVx1MDAwMYAzvybFhtZ49JrsXHUwMDFhOsOxPZ5DJohSwVxcmp/yjVx1MDAxMpGTr33etFx1MDAwYvubXHUwMDExoJuH8lx1MDAxOVxc5o3N/ix680h7xWVCkv1cdTAwMWPxa0/F8bnSbl7Y0lx1MDAxZK9cdTAwMWLJXGLwe8JcdTAwMTLTm5CR2vJDXHUwMDBmhVkqzW35duaU4/eprKapr7qvkaljVLw5XHUwMDE32XdcdTAwMTJyXHUwMDA1uktcdTAwMWEmXHUwMDFhcWdkXHUwMDE2YDPihO7zy2RhZ2R/fHjvXHUwMDFkWZkxTOZirk9cdTAwMWWdfL/FUMxcdJEj8yeZxWzwcbM/gJGY3GSM6zaigq/2v1x1MDAxZquhkLAwU2hioPIrX8qlNMPUsVx1MDAxZO9YUlx1MDAxZOPjpUHOvoywZ1lcdTAwMWFcIs1cdTAwMWHEpE9IrFx1MDAxNPWsoXM8XHUwMDE4XHUwMDFjXG7Kovjs+D0ub9CHXHUwMDBl0685mKWBx/a4ZECxLrLn91x1MDAwYtpcco4zaP13btG4atm8bKbjfeM2fMZIMIM5XHUwMDBl5apcdTAwMGW2XHUwMDFmXGa9XHUwMDBmnk/FlFb11Uu1Yqz4441p0DnssTGLoXV/50mELWZ6fJxcdTAwMWbhVsc1+FxuW7BA75qgXHUwMDEw7KfFVzvm+F9cXFx1MDAwNFx1MDAwMkOXylmAVKlcdTAwMGL8QavxS9rClOYhmrpcdTAwMDQu51dRPzb5lYPg43+wX5hehrhcdTAwMWXlXG5ccih5Y8MjoL91Q2LB3nm4XG6i1+W88KvxPVn+TJ7H6jd2Sq0k1EadYdAq6OLfby5Ix/lcdTAwMDRH8kMmun76M5IgYCY/UHwkV2zByShcdTAwMDbUS+Vn4ezps2aoonLLbD7z+qFcdTAwMTkh5aMh+pa6fndGgXfOOdLllHVcdTAwMDMvhLdksGFt1554+t/vc7yS1dRcbrY+tlx1MDAwZfjfXFzpW1tcdTAwMDBCljpj7J6HfeeFxlxusy1sKT/Zo/A8g6Kol+RgsGeR3j8pWqR5YqPoXHUwMDA2gOCXXHUwMDFhqr3monraXGJcIlxuXHUwMDAyXHUwMDE4LIZnhpdGg4d+Rlx1MDAwYjBPJ1ibXUe6XHUwMDE0R6ik/Fx1MDAxOe19yGdcclDPNiagXHUwMDA0YZvQoFx1MDAxZvTYXHUwMDA118CVXGZnO1x1MDAxMYg94zA3veKMXHUwMDFj6GtqPf5X75Xerm/AbjCVrlxi3O+T32tNybpYptbu6Vx1MDAxYy+HXHUwMDAxlPTIsGUmUJtcdTAwMTDqJrGaOTBpQZHbUKf1XHUwMDEyN5VSx1x1MDAxZqlpgVx1MDAwNtC4z1ZNrq555Ke8Ky9QKK+3tVx1MDAwYlx1MDAxZjSfJitDXCJcdTAwMWFKJjFcdTAwMGJVlFx1MDAwNtc+kGdiqreN11x1MDAwMSmqo4ZcdTAwMWQ0YDt40rvAys6u0pmaXHUwMDBmXHUwMDExM1x1MDAwMHMtVjww6Fx1MDAxN11mKSTxXGJcdTAwMTN7uVx1MDAxNHH0/FxmK3fh8PFvj/zVt6T7kuxWzEyhblx1MDAxYc66XHUwMDAziFx1MDAwMks6Pf6/8/5cdTAwMDHGXoW8W8xcbjKXXHUwMDAxaOdCaTJZUuRcdTAwMWJcdTAwMWNk6V1Pfy9RlYohOjJbLJlcdTAwMThQXHUwMDEwrFx1MDAxNUFzpPLc9zhNaO+xUjZcdTAwMDS7pEhw5M6h0lx1MDAwNMqoPk2HWE2bPP0plFx1MDAwM/s65aNTNGVw8n3Y8D1l0i1j/GHFsuLH1/1cdTAwMWI52dDxV3jL2lx1MDAxOcbV0FNjJ94hn3pytjLHb1x1MDAwZm/4XHUwMDA1TFx1MDAxODuKXHUwMDE3bszaqPjw539uqW1lZmUpZPSKWlx1MDAxMVwiXHUwMDA0rK9AesyoW4S8wZY38Vx1MDAwM3Joo/lcdTAwMWNcdTAwMTElYq5cdTAwMTe5fVA2+t5IT+JcdTAwMDbWXHTgr2hcdTAwMWRcYiZ7Xt7I2fd8rMNVqFx1MDAxMsiiXHUwMDE5XCJKUIQjimjvQSQu/amkXvRka73NXGb9/Xzbjlxuo1CQVWNNwVI6xjdp717eaOopXHUwMDEyaoSCzKryVY5NXHUwMDBmTfsjYHSMalx0aVV4vYLS5Kh0XGZvXGKNn4bd6J+CjmyyvXf5totcdTAwMDFAXj5gYFx1MDAxNtJcdTAwMTlcdTAwMWTJjY2PfLGKdkKltP5w60FcdTAwMTR/qyw+JfKx556sKYZ41LNf/t46hvBCUWxrTSCj/mKkZTnGXHUwMDAw7FJfcGrto1xmXHUwMDA0XHUwMDAzJjDBXHUwMDEwn6iy8pTnrOHXIOFcdTAwMGUh8lx1MDAxM7xOXHUwMDA2htGqejxrXHUwMDEw4yXV+zxr1YCZfc5cdTAwMDTG6jn+49j38W1SXG7KbpTG52klpJTLXHUwMDBihpzSklx1MDAxNazZpJyRoGii+k16wED/XCLKXHUwMDAzVk86/jyIpT5WtfmjxVwi/NL5turXe16TZ/j4X/nvfVx1MDAwYlx1MDAxYdlQPVx1MDAxNnUoWFx1MDAxMlTPn5EgM+xCWL+PQ77PXHUwMDE2tc5RbtNK8lx1MDAxZFx1MDAxMVx1MDAwNLL0ulx1MDAxNbSZ1nQr1HbZ1lx1MDAxZW1cdKEj41xitqKzN+2WXGI23cNcdTAwMDRcdTAwMWHkrDFmcJwvOV9cbpqXQozN7jKdUlbsv6P4LVx1MDAwMdNcdTAwMWZMxnbIlc7V+VVxXGbKXHIgg/7qIGnX75/vgIwlXCLTScTGN75Trrv7LUGfgFx0RIv8XXz6s33oO1x1MDAxY+Od5/rp51x1MDAxM+tcdTAwMTPZ6lZcdTAwMTNcbnHcOirTNVx1MDAxMN2Aak9rhTyenOXue1x1MDAxMYtr9zXKXygxgj9ktmX9c5Eg9GZx2Vx1MDAxMl9cdTAwMTOGXHUwMDA1wMJoiMdcdTAwMDS43FCsoFx1MDAwN+/ZXHUwMDA2JXZNMYJwyWdcdTAwMDTKRCRFoovL0u0jwMf2TYrQd++zSiTvXHUwMDBlq/RN8FJcdTAwMDbsp1x1MDAwMTT6W6TbV18p+mtcdTAwMGVaO11cdTAwMDIhKLwj2VsrWHiDXHUwMDFmp6RcdTAwMDc3hqBM4o6uXHUwMDFhY+E/J+5qvpivU7FGZlNccv1g3W+1SKZhoYH5rj1scmBkLihcdMuPo5eQwuHd7Fx08YEt2uyKNrdUJkm6hrOOXHUwMDA0VDfvgClxXHUwMDE1q0GVe30+ofdIXHUwMDAwWqWxkT64XHUwMDFiyjdlXHUwMDE0znb6flx1MDAxMnjlrF5sw6vyVfVgwVx1MDAxOTalg6BwTbNcdClcdTAwMTaAf7WE4OTrO2EvpynKLHBm+6n8KoaTftTHrq36syxOWVxmJZ6uprjgaFdufe7tjMTVXHR6Jim0POlySPDnN52LmjJcdTAwMDVw0ZsoOiU7dF1jRKhKl1x1MDAxMTHlXHUwMDEwfcDgi4jZ356fpFxyZixcdTAwMGJALCvKaqrIq8tcdTAwMTcy2ThcdTAwMWQkyFx1MDAwM+dFPkK8YkdcdTAwMTWBPYxCsSSIRpFD/TtcdTAwMWJbnVKvljGyJT9cIlx1MDAxNJ6P3FxuNuOamaVYwlx1MDAxMlBcdTAwMTNyek31oFx1MDAxZbBcdTAwMTKUXHUwMDEzT4ZPwbZcblxmctu861x1MDAxMiXTu+X3szcngzjOXHUwMDE34q3BX4VlKdwlYsdcdTAwMGaMV8tcdTAwMWJ9Oj1cdLTsV9FpenykXHUwMDAw+Uwv9907YUrK/nLJ3ok/XHUwMDEyXHUwMDBi+Vx1MDAxM0A6T09cdTAwMWXCs2NNVUjahi/v4HZtplJyXHUwMDA111xclZBkYlx1MDAxZuvq37VzSoTl81X3fUckRsRcdTAwMWFK0lx1MDAxMlx1MDAwN1x1MDAxMbJcdTAwMDaKa07lkbSe84t7R7PxsvgueKOzqmZcdTAwMTIlSWw0yFY50rCM8N5u0aBiYFwi11x1MDAxMqhE7NmSqC7A2fTkaEZsTr6ZV2lcdTAwMGZcdTAwMWRakpkvhYT7XHT8V8Lf7+9Js6LuXCJcbsPRfoLW+6VkiT/0iDCOS1x1MDAxOK74d1xm1pbWXHUwMDFl6bWBXHUwMDExNk2vgy/PQJv6V/NcdTAwMTDV/FxuP8xBtljO6lx1MDAxZlx1MDAxYerM8SNcZm2MXHUwMDFkILPXtDu/i7hXULlbaUBAOlSOiIOhhMzjns9Q44i467pcYu7AiX/WKvpEe1x1MDAxNnyiXHUwMDE08XeD6UyGNuqkXGJOl8ZQT04rfr4pRv7zQcr1r0DxczQ4RI1OpbsgW89EWGLK7K2EdcZfXHUwMDE4X+ZfO0K8W9RQNnFcdTAwMTjbpjxTPKZccinlN3IktbTpZ3fnXHUwMDA1flx1MDAxMVizY+5qlvDBaU/GQ3/uRTZcdTAwMDN9ppSB0FwiZDDXduWc+353XHUwMDFmc6UhpFx1MDAwZVKEJa7jTZIpP/ZcdTAwMTbvVbmflHwhVMJ31kDmnlx1MDAxN1x1MDAxZFFPQHulUFx1MDAxYXecPFlcdTAwMWMyKsDsXHUwMDA33TN2XZidk9LGrbaJYM0wXHUwMDBiRiS+35vOWJLMzSTF0jJp4Vx1MDAwNkA0J3/GJzVb4oWok1Kav/1cdTAwMTHXY1x1MDAwMHFcImCx/za29dGOXHUwMDAw0Vf2eLJ8ZoKCyZGHhMGSWlx1MDAxMmDKlUs8p/Zvb5CZdFNJklu7rGTcXHUwMDAySKY0XHUwMDEyuan+iWg4RLhcdTAwMTL5TcdqhkjZSWjX74ZfSV5jJL9JObSu/t3me+W1nyn2XGaHOU+8n2VcdTAwMTDl5uZBm8fZK1x1MDAxYVx1MDAxMHJ+6riyfP+5+UvIkFqPkTdqLUjITcDK25IqvblcYsx23tSJ8ueIu0A3/VIuyLxcdTAwMGaS1qrMy4d/Plx1MDAxMERiil/nTFx1MDAxMlxiXHUwMDAyz/M6XGa7Zebw7CXwT6pEWDnvykvQjug+znqQ+WFe2Un1Xc0+MuFLuL8r2bGPXHUwMDA1L+/Ad+UzN+d7Nlx1MDAwMJar/avTT5Z44nJPStavXHUwMDE2wcv9Y084eknQXFzbrYGW16pcdTAwMDOnXHUwMDFiXHUwMDAz553b/FQ3I4lcdTAwMWVcdTAwMTmZW05cbt5DwEkuK7eK/Vx1MDAxMsRcdTAwMTSzsYRqdlx1MDAwN1x1MDAxONfYh+JcdTAwMTl3XHL/4qXk7DWTXHUwMDE4r7t5kt5cdTAwMWIhNGdRUc8ySHsuYcv8jmSqoj1cXNJD5WdcdTAwMDfAzbC+e3cye1x1MDAxZWHkfoueK22AXG7vvPLO5YepXHUwMDE2a287c0U9fW5jtSyUMMjnlT4z5Ny/P2F6mn3QmEJcdTAwMDBcdTAwMTfX+u89+JAlbZSY9Xdl7lqYl3o/V7Fzm8fgnZGR4Tjogq247Vxiv6nxOEmgw1nie+ab0fiwy1x1MDAxZjqxLU7aN1x1MDAxNlX5tWOvXHUwMDE4XHUwMDE1JHdatPlcdTAwMDDm6nSx6l9cdTAwMDOVc7GOQ1x1MDAxZO6u1NSq16NK6OWk6Dg06GJcdTAwMWUusFx1MDAxZqdcdTAwMTctjKErQmDdm2slleGKuWP0zOfoXGaEXplCNP2MXGJsPVx1MDAxN6/LO7Vl6zpVYftcdTAwMGJcdTAwMDZodf6i2WZPXG7yuJqVoKXmkDZcdTAwMGZebkRcdTAwMTRiXHUwMDEx+V+2NODM9lx1MDAxZu6yiOd5XHUwMDE3XHUwMDA22bhRX+i6ltqxz1x1MDAxNVx1MDAwZbpZnYBAc6xdx+/s0WJt3ae+7ju2XHUwMDE5s3lHllOItOF+/u5u4adYykuJVFx1MDAxN739zcg0dt3VREQoXHUwMDEwOmVwaVtwPv6v3lx1MDAxOZjSXHUwMDA2XHUwMDFjv5N1XHUwMDFhhNK/N6AthVx1MDAxOWeE87U5tVx1MDAwNsgkpE5g0HRgwP5cXLzAePhcZkih0D9cdTAwMTm14Jq1UVL1OIYmiG9cdTAwMDDgXHUwMDA3KGtXXHUwMDE0O1W/38BcdTAwMDRcZlxyiMfJNf3uvkFDxXhXv31sc0dcdTAwMDEmXHUwMDE38lx1MDAxYcnMtVx1MDAxNPTFXHUwMDFl5OpyXHUwMDA0frlMTVxcQNW+b4yoklAu8zFccrLwelx1MDAxYa5KMFx1MDAxMirbNUosR3BM9PXyYDxcdTAwMTN7XGL9XFyI9fxz6mZcYlx1MDAxODLSS3bLylx1MDAwYkyN1bEqolpcdTAwMDFcIpPwXGZcdTAwMDFlLc9DYslcdTAwMThXRHnVZkP2ZenkXHUwMDE3mMZ1XHUwMDE5v4vBpUqQXHUwMDA1XHUwMDA1S/ahyGWni1x1MDAwZVgpZbVcIoszJn25xubKp93AjCZcdTAwMTWOYru9l5Ce8Nu8/LNcdTAwMWRcdTAwMWPSxkbr1Fx1MDAxZl97kvqmL4Fxf03hXHUwMDA24Mo3vtp081x1MDAxN7kgZudFlstcdTAwMDfNZG7eXHUwMDE3Zn72n41/XHUwMDFk0oqnTFx1MDAxYWJcdTAwMGUn7Vx1MDAxNdBEW1vPXHUwMDE4Jyu3xCX398HEmIRh4Vx1MDAwYmmDWu4+TX8+jLBcdTAwMWM6gISsXHUwMDA0XHUwMDE4e+u/XHUwMDAxoWhZJMtX1IRYnjgw+4iI+Lrbov5cdTAwMWIv1Vx1MDAxN/GM1Fx1MDAxMuJYXHUwMDEzb/q94X9dXG5b1IIhe0dcXK+VQ8/qXHUwMDFmZcJvTIQyY5joyVx1MDAwN9844Vx1MDAxZjWLQEdKo5Xs4sbgfX6/1ESo0pFcdTAwMDazRtHgXHUwMDBme9S1oEre/nKyXHUwMDAwSeKbj1x1MDAxZpFyIVx1MDAwN5t+fN9RXHUwMDFhmnE/RLvs4He8STbAJENcdTAwMThHRVx1MDAxOfjOWXqoc1x1MDAwYsON1Vx1MDAwMbGz4Fx1MDAxMqHZTGOvnOo1LeRcdTAwMGbK8PVcdTAwMWN/dky7OlxmY0TE+J101jwx5sS9q03h/FubtIQrZmc/yY6PY5lcdTAwMDNiZjZZ1v+lXHUwMDFjy/9hSyFYQvQoynHotC9nZpzPYHZ9e05cdTAwMTd9XHUwMDE2bCqm0cqAI50vzOhBM3Hz9P/XXHUwMDE0775zMSqzr9ZcdTAwMDD49MzvXHUwMDE2Wlx0+L7W3sVcdTAwMTIphj5cdTAwMTKdhsiQODBO4Fx1MDAxZFx1MDAxNvhilqh7Qlx1MDAxZPV0YG8gbN9cdTAwMWNEXHUwMDE187NbYyWoSpGYRrrphDefzPKVKX8vUFx1MDAxMGif/koze7p91odeYf1vn/mc2YhZP3U9NSpcdTAwMTFRXHUwMDFkXHUwMDEwY3tcdTAwMWNGXHUwMDBm1lZGKZJIrea88swtQqpcdTAwMDf8IUcmrYP62pSwVUtcdTAwMDb+nPRcdTAwMDVcdTAwMTYoXG4mXHUwMDFhXHUwMDFje0xcdTAwMWJ7XFz6lE2RXGJcdTAwMWInXHUwMDE3SrFcdTAwMTVrXHUwMDAwjz+BpirYhni9TVjegj72XHUwMDAwwsxtcGBhQ7ox8GhXXHUwMDE0yE1M8alTrj3YXCKPRtzOXHUwMDE4NFx1MDAxOFx1MDAwNcCRPikjdKw3vLfimOzPzlx1MDAwNvvb+N9Z0OBfXCKG5DO5zvJcdTAwMGKTtTZWUT5cdTAwMTGjI1x1MDAwN/zz+Vx1MDAwNq9n1lx1MDAxOCjwXHUwMDBlo+1DVVx1MDAxZetcdTAwMDdcdTAwMThcdTAwMWVXsVx1MDAwNV1nMGTsv0uaXHUwMDAxnynfuV8xJtFtY1x1MDAxZlx1MDAxMb1W1pGxqIl+382ti5CBlYVVXHUwMDFk3yy9nZyotVmbiJveXHUwMDE4XHUwMDAyV2G/XHUwMDFmUVRYypXRe2ZYjUqnVi+8ZLQxnz7Xq1x1MDAxM1x1MDAwMNZ6RVx1MDAwNqnOpjhcdTAwMTRW5ztyYEaMXHUwMDEzZ1x1MDAxZm++xdOAclx1MDAwYpjuf5ktKDVcdTAwMDd5wrl0a1x1MDAwYqBe3bxfbDzsnFx1MDAwMM52jjCQXHUwMDAx2zn3nqGcRzVcdTAwMGaoei7ye5eIy8RlXHUwMDFmzSP1ucPyhrZjJ2262kjKY1xcp+bda0iv44npr8FkieGAzDKUZ5T/gJ+ie3SHhFx1MDAwZoLBXHUwMDE5Q1xmmdhcdTAwMWGeMUPjMCTtXGY18kS9LPWLsODWQVd4wWNg/3eGS/g0WSfGe7rPRoJccoq5t1x1MDAwMVwipSbod9fgPlxmXHUwMDAy7SrSJZlcdTAwMWNcdTAwMTfa1Vx1MDAxMHRGpVx1MDAxYvDZ8mL4rSo8ljtcdTAwMDZaKGNcdTAwMDW3+8Od5m5psueSUvZip1x1MDAxMomPcXVcdTAwMDNcdTAwMWWqRVK8iiH18EvZe9bnXHUwMDEzpuF+XHUwMDFhXHUwMDEyo+N/wbpvXCJj/fAmXHSsZ0VcdTAwMTjnXHUwMDE4XHUwMDEx3ff1XGL9V0xcZlx1MDAwMVx1MDAxNFiLMVx1MDAwN+VcdTAwMTNv2Cera2fTbkf7c+dA385SyG27od7o7Fx1MDAxMFxiKD4k2c53fvTwNYs606m6XHUwMDBmy4XGnVx02s+8rFx1MDAxZoMwssJE3c42r4qOXHUwMDA3XHUwMDE4aMHXeWfER2DOsIlBXHUwMDEzXdm6KctcdTAwMTKA4CAp4ayYtH91m5osXHUwMDFjfMr6XHUwMDE55oa6XHUwMDBi42hcdTAwMGYwqyQz+3BvRM6Cqul0RtA2zFx1MDAxNkJcdTAwMWbhmaOrXHUwMDE1z/y2VOiX+GuEXHUwMDEwXHUwMDAwXGJ2XHUwMDAyV1xm3EDG3bXFteUweX1cbq3RUDKUKqtO/70oXGZ3hGddXHUwMDAxXHUwMDFmNbGeM1x1MDAxYoeKX0XSxJvR6HfO/D4sf1x1MDAxOevqXCJo0Op+Piokplxcm88nn9ZF9c7weGruj09CXHUwMDA2K5dNNlxmw8BzXHUwMDEy+6o/PJKUrMcqT1x1MDAxMFx1MDAxYun77Vx1MDAxNXMwp1D9RlxmPF7RRK4sP1x1MDAwNHI/4afWiZ3JXHUwMDA301Gbj1Jey1x1MDAxYzjR5lx1MDAxZK2VZbRcdTAwMWXzflx1MDAxZZdCS/cuXHUwMDA0XHUwMDA2kzQ+QmGCKDJcYu6NUZWNJEZ5eMBm11Ny/PzaMj/2xqCsmsBF8IrCXHUwMDA14IBsXHUwMDE3hzP4XFzv7ox7NC3yRVx1MDAwMuIpXlxuXHUwMDEw8dvSTjiLcbNDXHUwMDBlZ1x1MDAwNKjP93jGiqXFXHUwMDEwxUVcYo6Eolx1MDAwMFx1MDAxZvS/Xlx1MDAxZnN4MqOj1GJcdTAwMDDd2fdcdTAwMTdcdTAwMTlcdTAwMWZM+LpR138xXHUwMDEwoohcbi0yXCJcdTAwMDVwhfrsbrHNIZK4aJ1hjPnqLnS2SjNZOVqgNNB8llx1MDAxNNel4lx1MDAwMdRcblNgMJevSur9Y9ixqPvgJjUn9E6+c8hjTDxcdTAwMTGgu7nkmp+UbX3XU2i4YOPW/o7gdlx1MDAwMa9cbkb4eaNtXHUwMDBmlmfC97lcdTAwMWOn4aXO2jslWS1v1bjUXHUwMDFjYU+uWKGehJujPvJBXHUwMDEyZ46IWz55MYu9gGXWlNCTbf5CcvJcdCyWelx1MDAwN8ycXHUwMDE1yU5I98G6ceC5XHUwMDFisFx1MDAxYl14U5tcdTAwMDIy1yGVOFx0hfPuY5lcdTAwMTVswMNwS1xmgm1002miPLtnouhW3zFEVOZcdTAwMDCnXHUwMDExbiFOg5Q/5IOw/Thcblx1MDAxNffxXHUwMDE5dM3Ci3V0cMff27W6i4Z/7ITk1EVcdTAwMDUghK+fobCpflx1MDAxZajI3THYLVx1MDAwZdr/iFx1MDAxNnF8k4jIfMBl8ki2hVx1MDAxN3zu1NmpW3iqd25cdTAwMWSCbOGo4Gj1TI2gbVx1MDAxYd/H+1x1MDAxMdBcdTAwMDPVhOaf2P4k6Fx1MDAxYzuBRSZcdTAwMTPmeFx1MDAxOH9vbtzBw4jVlMe2ceBcdTAwMTJ+WDhcZlwiJk5eR1x1MDAxZr3VKOed8OO8/exvwWPe2SO+3yH7pyfL3Na/P9dcYp9cdTAwMTlcdTAwMDZ/XHUwMDAzo/5U4XMvyK5daflcdFl68tpcdTAwMTeUKMwx4za1Vlx1MDAwZTgwXHUwMDA29Hyr5lBcYnHA61x1MDAwZbzDWqvLXSS0iYjUSGHEsHNcdTAwMTH69HVmasZcdTAwMTTFpVx1MDAwYjDku6ZcdTAwMDF4fE1cdTAwMTaKg/llkPCSvu3aXHUwMDE43TaP9Xn7jL2AbIXoVcf+21x1MDAwYvRL7XBcdTAwMGLGn8RbsoW/bsGKIOLSaU/cuaudXHK3NZ+103i/KFx0ylxiY06E0lx1MDAxMC5Zxih731x0XHUwMDFk0X6eXHUwMDA1vedRr9/am8zIXHUwMDEwyJSVXHUwMDEyblx0n8VcdTAwMTnOOlx1MDAxYqZcdTAwMTmrzXR/795t1WPERDv22d+AnvdcZjlisqlo1dxcbv/OeJwtYHH5XHUwMDEzJrtGcVx1MDAxZoZcdTAwMDW6dffCfWiM9efHMZNcdTAwMTSwWM0gmpxcdTAwMTlcdTAwMDBwm/pNVlx1MDAxMVjX2lx1MDAxOdSgXHUwMDFmXHUwMDEw1vMzn1xuTFfn2pTwXHUwMDAzOqZcdTAwMGZFYE3nSLdcdTAwMDP+3qxfyybCjH+jXHUwMDFjXHUwMDA0XHUwMDE5ltNCwdkuked6k2ttUIf/3tl20ac3r7hiXHUwMDAyt6qtI/3CWeOuXdFfXHJVXHUwMDFhMjpe37VbL+fA1DvzP6huWNxcdTAwMWFTxd34+m+Exv2cgl3DwPGYjlx1MDAwMVx1MDAwZtxcdTAwMDNaU1x1MDAxOPWN3M3Glyj7TcdATvvJwKRcdTAwMDFphtBnSCHxXG5cdTAwMTJ5RpE9XHUwMDExQFx1MDAxYuNzJNNxXc1cZuag61x1MDAxZDuEtUcw3mjS5F2YY1x1MDAwN3xPXHSproWpXHUwMDA2uDJi71utm1x1MDAwMXn9SIrxKUq5XHRntldcdTAwMTG3XHUwMDA21WlcdLFcXMpkqlsoeVx1MDAxMYxcdTAwMDBbJn3n6elcboDPlr+L2nuu6MPUy8VNTaiW6s1cdTAwMTRcdTAwMDbGLNu3vTfj/MaDiu5cdTAwMWKhP+9Hs4C2lHY6eN2MT2JMYVmPZlJcYvXf/LFkXHUwMDA2OezgQDi4hSei2dNrmo9cdTAwMGafePcsIfxcdTAwMWLkMdbSz1x1MDAxM5TDRrSi8fxcdTAwMWRC0OHLkf01XHUwMDE2srZcZlowhL1Kelx1MDAxOdGwP/VcdTAwMDNcdTAwMTGyXGJNv57z1f96Y1xyX6pcdTAwMGZguCQ1mneM27hcdTAwMThcZprSb4WnU8BiXHUwMDA1XHUwMDEyKIGQxd909G2HpU0pXHUwMDEzyPJcdTAwMDd4XHUwMDBmilx1MDAxZr1cdTAwMGVY+VVL73hcdTAwMTDLMY5cdTAwMWVUxHZQXFyexzuqXHUwMDEya6yOtYp+2mTcQnZPVVx1MDAwN1Kf6H02MFxctcNcdDBcdTAwMWRLXz9cdTAwMThcdTAwMTexWJwkkfVvXHUwMDAwK1x1MDAxZrv9VimG399wzFx1MDAxM8toutpoZHpcdTAwMTdPbXwu5vWXl6+SwtPyypAqUJlhUd2ZiCNJXHUwMDE0eDjKbO/p1V7mnqo6ujjz9WRjXHUwMDBihbh9Nfv+XHKTLEqxme9cdTAwMDFKPcRnXHUwMDAzwVx1MDAwNnypaKwldr+DVmZcdTAwMTknX7PhjMpeY2ZcdTAwMWPsXHL6W1x1MDAwZt7w/M4wVk3L8Fx1MDAxZYolWXtcdTAwMWFahn7FLndlXGL+MXDtsLq7mtTuXHUwMDE1oZNlX+h/9W9CwuD0KSl+kv71rWRrqZbz/Trjl1x1MDAxNX6I76mc4LmBhsI+jDXyo1T+Z6nYjjdcZomJJSlpi2V2QHuxUFx1MDAxYVx1MDAwZiSJ6UVI9bqII6LJXy9RYWzz0oVO+q5sj4nb626f0OXaRGNvKLVeieFcdTAwMTWwnJ3bgpal6fN9c9iKYmKB5D/PSJdnT9T66lx1MDAxZYSY25OQ2Jd/uS2NsV/IlSTeybBcdTAwMDMoXHUwMDEwjVx1MDAwZVx1MDAwNSMwrZc5Q9d+8SHAZ/V1e/sjnsioXHUwMDEzi7/DM1x1MDAwNaPhhexcdTAwMTKMN41cdTAwMTBS945cdTAwMGLC9a/nXGZcdMzyVjZcdTAwMWO8wq6PKOQtd1x06DNGXHUwMDA0/Y0lqKXNNsc4o7ODKkiq/y7OrNOARCZH4UGlL/PhL3Vb56dcXPCG3lxc5yXRpVx1MDAxOJHmnYtqoEidbmGS3MpcdTAwMTf/epuI2O5cbvJcdTAwMWRcdTAwMGbEXHUwMDE5st9eILpgoYDR3zZcdTAwMWHSL+4ql8ZXyFYhuIxPU3ncXHUwMDEysGNh8tzv0s15n4/cXGZcdTAwMDH8ws5WTeGQXHUwMDAwei8lRnjdhouQnHRxm6+sXHUwMDBlXHUwMDFiw3BcZuP6XHUwMDFmNnhcdTAwMTXyI9+4XHUwMDFlupC/cz5cYnul2Od3LtZ7LPyqm5cuQfFoYkNS7PXzXGLhW+6q44FsXHUwMDE1vmT+rnt15iZ3XHUwMDExuVx1MDAwYuotZUftaomzem5cdTAwMWFx2duQVGqPXHUwMDExXHUwMDA22MjA3lx1MDAwMo8qf0bJflx1MDAwZjAq3oyeO+mUa8ZcdTAwMTJcdTAwMGIs29NcdTAwMWVtQ11cdTAwMDOcaf7eXHUwMDFmq7Kvj2xtrWOXzPFcdTAwMGZcdE6Pb8AjW5BcdTAwMTn9YtDwXHUwMDE1My9i6ltcdTAwMWFccsuAvzWCSL9cdTAwMTiLf9RcdTAwMTNcdTAwMTZb4FKlXHUwMDE0fD5HMHFf42WyZLxsao2Jd+1cIvzImvGuVmOZzrXX1v/jXHUwMDFmbaExUdSYLEOwxkdcdTAwMTKVXHUwMDFkXiNhOrmMnXUwlupVzUBcbqWfmVT8wmu3XHUwMDFjXHUwMDE4iLuKXHUwMDFhtcAq2XqU7b5cdJ77/VXbOMbhXHUwMDBizpyyQf+nXHUwMDFhK6hOKoBmYDjtJ75q4/uUXHUwMDE3NFx1MDAwZfErKWZcdTAwMTePJDxYKFxyjCu+iYvdOnRcdTAwMTh19NpkKoTXlpEkupHb+O4gdiHBXHUwMDE3iFx0couj6/RKXHUwMDAzXHUwMDA1f1x0alx1MDAwYlx1MDAwZvc1+c5AqlxmYEW9gvP421x1MDAxN411XHUwMDExMCC724zs53OaRSpFu9VcbpZKXHUwMDA1XHUwMDFis5CR21x1MDAwMSlcIsU3XHUwMDE5l5L2KaNfXHUwMDE2Slx1MDAxMW7824/+1JqxUbysLogu6mRcdTAwMGKcdO80If1fPfq/OsokxMOUObqgil79w9LpTcv+jOfK9HvVue5cdTAwMDVrXHUwMDFkSO/a43V63sDxhWZMq8xE/U1FjFxyXrJA7tg3KCjxIyaHS1x1MDAxNOSkXHIpzUVcdTAwMDRHtyEvW31cdTAwMTPdToq042C0qq9cdKa9wpEmdU3o0uV6tvLhXHUwMDBl9KNloFx1MDAwNK5cdTAwMDSjZ8Q6hpijSpxiU1DHo6It2Fx004dcdTAwMWK2IzTIZsWrmFx1MDAwM784S1wiXHUwMDA2gJ373X5S+a/uXFz7clPwqvOa4Td/8ZVcdTAwMDEndVx1MDAxYfT0N8q6aFtcdTAwMWU+fb5cdTAwMTdcdTAwMDLNypGQ+Yf6amstXFxLXHUwMDEyXHUwMDAw8eq+UthTy8Neue5cdTAwMGVcdTAwMTDI7Ve3OHUynWVGSWSV7lQjhVGZ1D2izTOrNrpcdTAwMTm0XCLpielfL1u3ZGEzjPfc0JC9mVx1MDAwN0VcdTAwMDLnc5ZlXHUwMDFl7uj6XHUwMDBl8sdDglx1MDAxMeFcXIXCZMw5b1x1MDAwN1x1MDAxYlx1MDAwMoan9GvhXHUwMDFjPKXBe1lacDFcdTAwMTe36qDbvHorPddcdTAwMTZEYTFzRJ7P9r3QjVx1MDAwMGZcdTAwMWJcdTAwMDGM7ItcdTAwMWXeRG48TNWJev5ccj5hXHUwMDE5qlRcdTAwMTg0n5esStKEj61cdTAwMWRcdTAwMDboiqkyguZcIlxuqF1kXHUwMDE23ZlbXHUwMDE0XHUwMDEy0K8xXHUwMDBmRZtemVlcdTAwMTA552h6PpMj4G/SSkFcdTAwMWUyazU1j1vtP8GHXHUwMDA2XHUwMDAz51x1MDAwNfFcdTAwMThlptdVbZ1fJYp8Zqu3v5ZByMtfc1x1MDAxYUEkifh+kqJVclx1MDAwMWd/XHUwMDA3OHdcdTAwMWTwr4/QR67WY1x1MDAxNOWGN17QxpVcdTAwMTJcdTAwMTI9hkX/7Vxy5J3E2JFbXHUwMDAxiteVXHUwMDE4pdi/W1x1MDAwMdw9qNy82Vx1MDAxMs77RZh4WzkjqZDziGH82I20uVx1MDAxZnD4eIZTN41RYp2ibVxyPr9cdFx1MDAwM/PXULnN36+EkoRcZu3NXHUwMDE2iFx0NEdOsUvf/1x1MDAwMFxuVvfecofvgna6uGizr7qvcMPY05vMoS4v2q+AZNQmtm7rntZYgnNeNJrtqMxBXHUwMDE4xV9cdTAwMWSpXHUwMDBiXHUwMDEzMtSTXHUwMDBlzE4pKsaAWHLe90x11PIqRzskXHUwMDFiysMqreqyKpHfV/SL08ZBoTtW/IJfZ99cdTAwMTb7XHRcdKxk2mtcdTAwMDFsTS7zbIVcdTAwMDLyNDdFkWnjcK6mJM5cdTAwMDVwXHUwMDFiOMmU+rNcdTAwMWJFR1x1MDAwMWd/zMY+XHUwMDFhMlx1MDAwN1x1MDAxZPmTQ6JcbjbOMIpESOVL68E1nMAh72BCsYlFRUhcdTAwMWKbiJvaLVx1MDAwNFx1MDAwMuNn4s1cdTAwMTC5wzebPVx0XHUwMDAzrblMLseum2VcdTAwMTV46S1wxSRfS1xmXHUwMDA0/Vx1MDAxYfJcdTAwMTSPrfr3XHUwMDA1cJOoVF/FwTT44aVQxcigXHUwMDFl1Kco14Ps8S7hJjpIK1v4LWZhhK2eZEVcdTAwMTdcdTAwMWbKd+dcdTAwMGJcXIL/9Vx1MDAwZuRo+Fx1MDAxMq5YtbWoXHUwMDA2IGpcZnYmvFx0XHUwMDAymFx1MDAwMpchYVx1MDAwM4bvpVx1MDAxZlx1MDAwMO5rx/kvqVx1MDAwNSyDRedcXN2iKX+8TK7vpVe4nkCA+/DNpml+hSxcdTAwMTHrZVx1MDAxN1x1MDAxMFZC+6x0yrDUcJxk8lx1MDAwYl7gjc/vMJtcdTAwMTDHYILzXHUwMDBisr/iR3S6KMb56Ef7oZZYrmWNXHUwMDA0ecFcdTAwMTShomxZJM4r+lx1MDAwMlOdpJFcdFx1MDAwMEWkpe7SnCn5qfVCxFxiSNIxV464XHUwMDAxTe+dXHLv5/d//TRcdFOUXHUwMDE5vkWoR2uo/uKW6LhPfJvxj1x1MDAwMeuKhVx1MDAxMIBcdTAwMWXTXHUwMDEzxVo94l2vVLVPXHUwMDE2gMFdTfDTZ9WOdDnG6cvkXHUwMDA0va1cbreO8ylcdTAwMTK6aVx1MDAxNzbCJbt7bbEre+ivxSNcXM5gXHUwMDFmsT3aXHROt1x1MDAwZlxmXHUwMDExhV39XHUwMDAw1ohcdTAwMWRcdMmkh78sqlxia2l4eGEyXHUwMDBl7Vx1MDAxY4tcXPilkLzMriB+WZuw9Vx1MDAwMuzE+6nSYOfCkEGXbF9cdTAwMTCmsFjWJEA+d3fmZLtYn5on8bOZXHUwMDAyUjM41/5DfVx1MDAwZeOvJe3qXHUwMDE0eWeEX6HfYzkj7rjlOio0MczZMalcdTAwMTG+mYTO3X2Gqrq0TiRcdTAwMTeR8nJcdTAwMTjCaFx1MDAwMcKitV3zQPg1XHUwMDEwwXJcXMKE+Fx1MDAwYr7lnuqgV1x1MDAwN3RNuiE4fXzBQlnzRpemWYidhDRcZp1cdTAwMDP3/FxmUJGfXHUwMDE53eZcdK29guZpR1x1MDAwZZ2/r4B5u1x1MDAxNmIj+XdGWdA/LYjNQsTuNbszXHUwMDEw34fiXHUwMDA043Xvwk+tveGU3Vx1MDAxYuKnyVxyNlx1MDAxZu/j5Y2BLNDxZY9LWmtYkLeuRZO9gWx9//AzXCIpac3AK1Gcrd1cdTAwMDL4Ob9rLNZcdTAwMTBmUmaUtjyGXGJRxpZsqfBbXHUwMDAxXHUwMDE3ILYl61rCXHUwMDEyI8yEXHJHXHUwMDAxPb0+12lyo4FcdTAwMTjkXHUwMDEz/8zDubfXJZJGhXQynSn77980Y3ySXlU9NtIwZ/3r1eDUP9nbSZbidTzYtKbaXHUwMDAy6ZCKyFx1MDAwNCPCaFjip+5NXHUwMDE4yeJYLV+jYUCPXHSqajSDzZ0mXG7ezGHPmHTXXHUwMDAyXUCxl2pcdTAwMTSkkSBJrVpJYHLp15zzqydKuifDdZVcdTAwMDbQkiBcdTAwMDBLn12VgP17M5ejbq5cdTAwMTmi4slcdTAwMWGQXHUwMDEy7s9qsFx1MDAxZdj99eCsuMZXLjhTPP3NZXCyiE6pXHUwMDE371x1MDAxNP3mhORcdLc3f4Vfdlx1MDAwNf9qe0VcdTAwMWRTQVx1MDAwN5pcdTAwMTl5afK97WmBXHUwMDEzXHUwMDAw3Fx1MDAxZjGKir1QiplDepQlT+N/9YGFi1dgNq854vJ5XHUwMDFhZN+tmm6YXYUy2EvUkFx1MDAwMlx1MDAxN5Bv+sTof3WBvHhcXMlfWGpcdTAwMDZcdTAwMWE6OLtjX3yHk1hR0Fx1MDAxZq1cdTAwMDCZNXTc58rtd0TT7kP07IPK88+lL2ZXIWCjjpksnI2lrk/c5Vx1MDAxNzlNmeFcdEXANbhJuaZyke/9woSZN1wiTTBcdTAwMWbTtlx1MDAwNHGrXGKeXHUwMDBlxr9zoSrNmtNn3i+zcXZXyVxmNcSUXHUwMDE43+1cdTAwMGJ07lHgViRN2o/FPCtpXG74am2kXHUwMDAx7fO9y1x1MDAxMFZcdTAwMDfxhcFNXHUwMDEy08z413vPXHUwMDEw/Y/x/NW3viA5Yo9aXHUwMDE1/s5QVOp4pp3K0nFcdTAwMDUshSMoXHUwMDE5MulcXM7IbY7htcHMsqQ7I1x1MDAxN2Xe6XXWiHDHn1f/v+dcXNZcdTAwMTRCwlDkMNP2xqPnPMq4c+c3X95cdTAwMTn4iot3XHUwMDFhXHUwMDFkzrrvLex8XHUwMDFixUZTmuVYMsVJVlx1MDAwYiDv39E5OFhuLEtcdTAwMTDo5St+4OVfPW1cdTAwMDev4rZcdTAwMDPP/F9cdTAwMWRcdTAwMWZgSFx1MDAxZswruF4vhae0LPtcIvexTi7NwSpcdTAwMGVsqEfo0ncmxz3BP9lpI1VasvrSlf5uhi1L/Vx0ZdumuyprWIxcdTAwMWQoXHUwMDA2XHUwMDAx9Fx1MDAxZFFoPcSCnoigI1x1MDAxY9xTXHUwMDFm97++dM/mxPNdaEbvYVv82SOqufVpvpf9XHUwMDAzwFxiez5U9tdcdTAwMTdg3lx1MDAwNFwiY3Bu7Ta0XHUwMDBldLaz0q3hdULcy0jbYPJDhpRgblx1MDAwZvZcdTAwMTJWXHIklVx1MDAwNP2rXHUwMDFiXHUwMDA1reFy61x1MDAwZtvun1x1MDAwZlx1MDAwZpeWsXtyLUZI0t6BwFx1MDAxYkTR2XXK6YBxVYGrz+Ot/P43dlPZXHUwMDAwZtVJXHUwMDE37iih2/fi9LWZn4iwi2Gx/a1dXHUwMDFkXHSbXHUwMDFjvFx1MDAwN5By31xya2B6iHz98FuFlJ7gfaxbXG7KoHNTXHUwMDBmlVx1MDAwZa14Qzb3x6pBvGjarsbEs0X0vSu5pHb2a40qqy8tPcTYTVx1MDAwMlfb/FxmYVx1MDAwMc161ZVcdHKuY3WXSEJu+5yJIO28cVx1MDAxOH9cdTAwMDPZ33OridVcYlx1MDAwN8NrXHUwMDEw+vtjPFx1MDAwNE1925CAddXA0iDnwq1j+oiY5cM7ZYRGXCJwpPW/euanopQ0NPk+15C2rvtK/8745qTQzrqcIOk+JksmXHUwMDFjrMvCZ133V2dqTsrwTkFkTnV8hf56rUuM3+otIFxioH7WP1xukoUvXHUwMDA3ZdSZ0EeuXHUwMDE26jdcdTAwMTQ85cj981dyf2PKQaFCNbXO5CF5JSAywrXfKmlJc79so1x1MDAxYr2BzFRAXHUwMDE42rF/glMwvP7f2Vx1MDAwNFx1MDAwNFx1MDAxM1x1MDAxZadN+WO7ReaXzjr3zlxyzeU/79eE/lSH/fRR87xQjplzn/SyLYrw/+JcYjtcdTAwMDNW5Urcv36lXHUwMDE2pVCZdKOAxsV5MHs/XHUwMDBmXHUwMDEws24v2r99IYKVZlrZhMQy31VQkydAXHUwMDEy4JTLdlx1MDAwZqT79+9XzLJcdTAwMTTnXHUwMDEwI+JSlFx1MDAwZuTr1VolXCLCg2ayPVjyp79cdTAwMDVQjVx1MDAxNaSA0yRcdTAwMTfMz2+yllx1MDAxNZxSL8NDX/nVqedcdTAwMTdmLCeM39nbXHUwMDE2gIXXfY9PfTGfPKjknvNcdTAwMWPhO4nWYZG5OscqyHzahqOvnn+Mv7l/jvqy/WD2wlx1MDAxNVx1MDAxN1x1MDAxYptablx1MDAwNmVTOcOwXHUwMDE3flx1MDAwMp5STjhcZjEwuydmjNskcVPUXHUwMDA0fayhhjqYhpcneXPkrmZmO75ZM1xcVdgx+nH75lx1MDAxN1VcdTAwMDQwr1xmLUHvM8VmXlVcdTAwMDD61Vx1MDAwZmv1sk71XHSYXHUwMDBmmWnV10R6olx1MDAwZjOcdFx1MDAxZdZMXHUwMDFkYFdgSPLU719HofuCwo35XGaH+PVcdTAwMDQvSvs9MotgpVxcNcXwfbxWZ8gmVlx1MDAwNTmUW3FcdTAwMTBstPP/K+s8dpyHgiu991NcdTAwMTjeclx1MDAwMOY0O+YgZjHvmDPFnFx1MDAwML+72b+B2YyAXlxiTVFC3apzztctXlx1MDAwMtrEwoz5ZnPNjS4ssVx1MDAxM1k7MrxfXHUwMDFkq71cdTAwMWRBu/aTSjNcdTAwMDLaI1RcdTAwMTDzXCI645/hI1x1MDAwYvbEXHUwMDEw35CfXHUwMDAyXHUwMDA3e1x0UuJYftdcdTAwMTg7lifJ8cOaLFpjrSVYZarcp1x1MDAwZonv3ujRciNZzGLiyzTt5Vx1MDAxMDKbbprlXHUwMDE1a1nZXHJcdTAwMGI+he4hf6Sd+kErXHUwMDFm9/f03TeYXHUwMDA2f6dThTb6tinAUvJNeFu/UVG+aq7A3VIowFh/VlFsxX34aczhZ699Soz79L/X7S+A5Vx1MDAwNuJ9yY3Ms2a6Tlxud1x1MDAxNlx1MDAwYqlFyqKY2opNM1xmc4sxsue2b1x1MDAxY1NcdTAwMDOLmHL9md70LCpcdTAwMDVKXHUwMDFm6U4x1C/3zi+Q+OuZfFxyXHUwMDEzu5XYUtngO5mVPrWBjOiF1UXdXGJ8p0IjhY/C+1x1MDAxYUNcdTAwMDfs+mvFg1x1MDAxOJaY9f5Fhrg1I/Vx75pIr32g/n2XLeXUr1x1MDAxMCsvJFXZ+O/eXHUwMDEx+PrZlZEl2pBe3P5cdTAwMThcdTAwMDVeiE9cdTAwMDVaXmpcdTAwMTLsp89cdTAwMDY2XHUwMDA2vlx1MDAxZcpcXFx1MDAxMWlE6sByXGLHOo31wvxcdTAwMDehvaiMQVwinMKdXHUwMDA0afzSu/pcdTAwMTODKrmGXHUwMDAyXHUwMDBlXGZfM9Cxo2qwbee1XHUwMDEzLr3nbJNm69qLTFx1MDAwZjZoQiyrXGYyp/7t4YrWSGJcdTAwMDXm7/6xbVxmUialY+pv1+mKXHUwMDAzdkGFjqm8LFx1MDAwZZXGPz4tK/mabYeaXHUwMDE0XHUwMDFmOF+mU4R6w1f8XHUwMDBlXHUwMDFmjttqdU7zrViwfXtcdKVcdDOOYiE+jzJQ0K2IY3TKxlxuSiFU2SNYwXJVXG5cdTAwMDBTRNHTb76DOThoXHUwMDExR6iCwPZcdTAwMTFcdTAwMGLIxJmXXHUwMDAxR81KXHUwMDFhU0Bhua8xinbjclx1MDAxMTGwvcxcXGyNKE90TXRcdTAwMTZeXHUwMDE40uuv4nTqo0/dxFxuW97nnfaTXHUwMDFmQXjMbMc8xoJcdTAwMWVmpDbBgLpcdL3wvbJGVHStXG4xVZOR1+7N4Vx1MDAxMl7LbWTzaFW2dbkn4XdcdTAwMGW/q+wrcFhcXFx1MDAwNk1TOpSzOlx1MDAxM5x5pWIqXG5/wdaGJDxkfj/YQ1u9TVx1MDAxNF2PNSM2L0+on1x1MDAxN0Z0aEdcdTAwMTJ8revsXHUwMDA2XHUwMDE4QiPUn1x1MDAxM71cdTAwMTP2hsBk01xiqe9MmVx1MDAxZlViVOC6j0GHXG7Zn1x1MDAwMOs3SzAxo4FybVx1MDAxNVxuXHUwMDEwQJLTW3D1XHUwMDEwXHUwMDFiMzLWqfVIM/XscaNcdTAwMDT661x1MDAxNoy43HHjXHUwMDE1IVBDXYZT0FumoufOa1xyabY1gDfCYH60g2tuK+r1QsuYXCLw6Vx1MDAxNIRD83qjTa5qXHUwMDBih9rtNERl6Wr+7XBnvPFcdTAwMGXUgdKw8Vx1MDAxNkNOXHUwMDA2SVOzX5m2mu9NON6Ec2zXsEZe8VTpspD0UL58qHfsUlx1MDAwN2QmKTfDlPNMoDsor7hcdTAwMTOcS3JcdTAwMWFBaJCUgE9cdTAwMDZLsINZKy5YnLxEXHUwMDE2vPea5lx1MDAwNnI2dWx8xcPEfTQ/qKJiW2VOXHUwMDFkXHUwMDFlyoj78YkpblPybOyN+Pd+sb5WsT9cZpC4lDRA/uSBXGJhY1x1MDAxNFx1MDAxNCiXXGItPYBE3qy9r+7rXHUwMDFlXHUwMDA36ZnRNcBW659cdTAwMTjYprB8Z3AhKH3zXHUwMDAw23OsXHUwMDFl1jBcdM1wXHUwMDE4Op9ZcVxin/rbXHUwMDBiXkyda7RcdPnvWlHdt4dcIlxuOKOu7siOhZuywG1cZvdMXHUwMDE2XHUwMDAz/7W0cVx1MDAxZoqvXHUwMDE0s7KwMsbXz2H/zpVAN5ZcIrDZMDopv6+6tVk/v2pdStlhYSG8KqdpfrrCfVx1MDAxZTLiwbZeI8byVdtcdTAwMGZ821x1MDAxNjyf5T90XHUwMDE1K8lO9OtcdTAwMWItWI7lvtbgXeiYIflQ3Fx1MDAxY1x1MDAxN3yJnVj25XVcdTAwMDFcdTAwMTBIXHUwMDBiXG5siqFcdTAwMDeIecfo/uo1MEpcImpcdTAwMTXQ2SmgJjdT3OtA1crhV4tcdTAwMGWNXHUwMDE2UqZgklxmXHUwMDEwvVx1MDAwM5C1XHUwMDA3RIeiXHUwMDFhWGJ77ix4ruU7gqb65YdNpcOeXHUwMDBiyUhMPFxiQuBIXHUwMDE5YFxcYjWjx9JcdTAwMTmY1Ol+slK5aEtcdKCy51x1MDAxYVXK8JKYXHQ/flx1MDAxMU3hrOGOXHUwMDEy4ahqJ67lW1x1MDAxMlx1MDAxMq7kfGZOLFx1MDAwM1x1MDAxOb3wXHJokUZ9ksUgXFxrq1x1MDAwNFx1MDAxYSOFn7mUJWaTXHUwMDE4tWR5xnAxOVx1MDAxZFB2clxu7/ArN+BvknUo0vSrIY/UXHUwMDAwTSGCxcJB807M09Y7YSHbwMZcdTAwMWaqvrYwSOVevGBD5Vx1MDAxN/e75ZxfkKd2JGHmtOPDXHUwMDAzs4dHk7DYqKhNgsrDYVx1MDAwMJFdXHUwMDE4f6vMXHUwMDFk21x1MDAwZp2/XHUwMDAySFVcdTAwMWTB5G/JXHUwMDEznlx1MDAwNZjPK1x1MDAxZL5cdTAwMTLV8NpmnzVsWHNYO6dNcMN92WCfw5NozJAzXHUwMDBmU0FKqDxXs3a8XHUwMDFkgTtgLmhrWmHuXCJjXVHFXHUwMDE1XHUwMDBmgEGzet1BSbpOTatJ27SZINnm3uEplfDNllx1MDAxYd6Wq9ygPNVBXG4laGMvslx1MDAxM5SWe+ZGkFx1MDAxMXvUmVx1MDAxMV1li63DbKSdOrqE2sGG8Yu5vXJcdTAwMTmcYbtYu1x1MDAxNzpcdTAwMGZcdTAwMDNcdTAwMWZcInCS1EKQvam6YLg1XHUwMDE0S3xcZldcblx1MDAwZclcdTAwMTFcdTAwMDamhoVcdTAwMTWc0bHwrDzY/Fx1MDAwMPosPtG6XHUwMDA1op1xreXIQHxfh/lcdEbFUlWdXHT5VZuKVnYhkyXk5Vx1MDAwZstgK9abS3KjWTbbmdXz3NhcdTAwMDBFSGOkyywsSEw8ff5QXHUwMDA3TchcdTAwMDW6VTDVolx1MDAxNK3po/OIXHUwMDA3v/khK1x1MDAxMUphXHLmvfY1JstHtY9J/0pa9EVxVpGqLalbQo5PeO6yg1x1MDAwN93q6j6zXVx1MDAxZKY7Jnzg+lx1MDAxNS7J1Tufp1eaUOWQ3dBd7aGLRFx1MDAwYky5Pouw9vtH+6lS76/AmSRvev4tu622PJs6eLt5tVV9MPz5tGI5Jt7QZGPp9Vx1MDAxYtFcdTAwMWLQ01xmJn2dxC6PJ0KMXHIktN9H/oYzNcZcdTAwMWR5+ntcdTAwMTDlXCLgtK+KfFx1MDAxM1dWclx1MDAxY63Oo+qrvYnqyf3p6nYja95R1JeyOFx1MDAwNZs/XHUwMDAxJKSlXHUwMDE2XHUwMDAxX1rqX1x1MDAwMoKugP0xfSEyLuvBcHxnbTdcdTAwMGbQXHUwMDExbSzKmHfRxY436Vx1MDAwMlx1MDAxM1x1MDAwMj/x/JZcdFx1MDAxMjxFOrNcdGdMXHUwMDFkjVnHgFx1MDAwNVx1MDAwNlx1MDAxOUdcdTAwMDd8XGJWmyZJTaWwhbxtmeXVIZ47XHRFXHUwMDFi2EZcdTAwMGVaczyQ3GmpSpE7rzAxfkKXuMOsXHUwMDEznzDM9mFGZCa7dcM32kOGuPazU/VYl8BlPmbxgqEjXHUwMDAwXHRcdTAwMTl/3DSUQHHdRYFEypA+59YkpCT3IDZaXHUwMDAzgyHXgaRcdTAwMGbbzmBcdTAwMDH6xlx1MDAwM6GzTHvQiov5v7Pwhjwhm35YXHUwMDA3XFxcdTAwMDdi8cxC49BcdTAwMGLzO4ZFvIcuTu1+m7lHmorA9FNcdTAwMDeLXHUwMDExXHUwMDA2f3dW8HiBNVdcdTAwMTj8na2eN/3kLslcdTAwMDLtqMe+SCa6Zu14TTZcIkRxosuFzmkoXHUwMDAzcljvi/g9x/6LXHUwMDEx70tBXHUwMDE5W1x1MDAxM1fx+8lcdTAwMDOeXHUwMDE2XHUwMDAxqFx1MDAxYz21ykEjllx1MDAxZn9f52Qw3Vx1MDAxZce1uFx1MDAwMt78X2tcdTAwMGIlJ59ZcZWh8pPDl8Nm3XOVMnzVoVac0nedO24pyN2IpEhL0WLfYkpZNFx1MDAwM3i7vFx1MDAwN9OaZ1FI8jBgJ1xiMKRCsldccoddvVx1MDAxN1x1MDAxNcXlXHUwMDE12qT2mK00y50vi09cdTAwMTaCSKZcdTAwMDU/jmyMmFx1MDAxZMlcdTAwMDNwZURSX5taMC6gRFxcv305u3U/foh1XHUwMDFhsn9cdTAwMTN57M9cdTAwMWHo6Cn9XHUwMDAz8/xsr0wpSoXaXHUwMDFl6HEuPbvoYeLkW1x0YtJcdTAwMWLXgW/j8Vx1MDAxZFx1MDAxN8up01x1MDAxOVx1MDAxZaHJg/SU3D90vF63XHUwMDBlXHUwMDAz5Vx1MDAwZnzlaP45rvWV9lx1MDAwN46/VGA/4C5VXHUwMDEzUJRD0fOKfmtcdTAwMTe0N36XKVx1MDAwMFx1MDAxM2HH51x0XHUwMDEyvVx1MDAwZZ1tylx1MDAxYntK4FBcdTAwMDBcdTAwMWXl0bZEt12PX5Ry11x1MDAxOGdlXHUwMDBlJmXabaTEbLGyWbTpXHUwMDEwXHUwMDA166A58Uz57GlMm1x1MDAwMn+wJYMwhvHtXHUwMDBmv43E86lcdTAwMGZecmbrXHUwMDFhdeJS7/gnXHUwMDAwVOi0XHUwMDEws1x1MDAwM5VcdTAwMWUz88XZKsBcdTAwMWX8LfY7/5G4M5xBTSTE1FKiXHKVXHUwMDEwlHRTiM4grXJfNFfNmK/8t6RjaZxcdTAwMWWIVFh9Lp9E+ESuY2d+91x1MDAwM1rW43dcdTAwMWWFyIrPl0PgQ1x1MDAwNmhcdTAwMDdI11xmOlxc6NXGv76r9LonPq/uUq5cdTAwMGZpWv/9xmVu4oF1817YIGfC/VxmwtijXHUwMDEx+UqmzMiVbFuUXHUwMDEwffKd5IZcdTAwMDRcdTAwMDCKXHUwMDAy79u+8YNcdTAwMDVu2ns8XHUwMDA3XHUwMDE0XHUwMDAzwMRuf9wlZM81XHUwMDFl4Jyfi1ktlfXjd1tq6ftNdXJHtbhg/91q5+XayKtal6ZcIuybcVx1MDAxMFx1MDAwNkrzXHUwMDA2lXUu64E/kXh6ssr5NH41PjV1SYHLsWVYWzVcdTAwMTZa6ZPIeTH7turFXHUwMDFjiNXZXHUwMDE1+Vx1MDAxNEeS4TQq1t//klx1MDAxZGY3wFx1MDAxNqMu7JSZ/XWBzSH1s114h3GNLVtDZrxcbl5cdNRcdTAwMTOwf1xmXFxcIvVcdTAwMDfWWCyR/LWsI25FZv8zy4Lu3WuB+dxj92bmrIK/XHUwMDFmPlx1MDAwZZqNKFx1MDAxNe/q+UVpaqnRP0HW1HirsdL6N1x1MDAxNJzF7JVkc59cdTAwMGWgV1x1MDAwMzRcdTAwMWRcdTAwMDR7gnss8Ees+Zr3XHUwMDA0kFx1MDAxMztWcthMP+5cdKN1XHUwMDEwRD8xnH70eCCjuoDuMFx1MDAxZs+TRSCVKtDLT+C++8DwXHUwMDE0+/lcdTAwMDbIXHUwMDEwRVxyw1x1MDAwZba/LlxuiVxurqVTjm6ct5mVW+0tuUK5cM9cdTAwMWI3PLdt6IIjuMtqLPCreG2Yh7m4ol5eaeVP0IHlslx1MDAxOJ123DHeRcdcdC1TXc5J+NU5JD5yXHUwMDE30y/C4yg97kKd5lx1MDAwYsB+vE9cdTAwMTOOb8DMfodV36tcdTAwMDN9Z9g5kOFD42tcdTAwMWNXrfBt2MBOdu/zy751XG4oRqTvrb5tXHUwMDEycMhXR6747Fx1MDAwZdo7sEkw97446bE+XHUwMDBlPapuXHUwMDAzRoZcdTAwMGJ5MfdcdTAwMDdA8FZcdTAwMTF61lT8nJu3V2nYXHUwMDBl/467XHUwMDFmMFx1MDAwM3+67mFccqOfdFx1MDAwYpKY+5tcXH1cdTAwMDO3nJCTTylCk8Ew3zUq5FcpXHUwMDBmTVx1MDAxY5LiWlxcgEWY7+bN4/r9wPbLdm7aXHUwMDA3UKjgXHUwMDBlhznZXHUwMDE2v1xcXHUwMDE4jU8qXHUwMDFmlqDV4UNcIiwoeVx1MDAwN6eTXHUwMDAxiEaoXHUwMDEwJLkt31xcvK2jULTLu6reRFx1MDAxMV4tN+k84lx1MDAwNlpyv+dcdTAwMDNltpgu5EvP6ui5SPM7XHUwMDA02XJpllx1MDAxNlxmakj28vdtXHUwMDA00JbNMr1UZsHKXHUwMDAw51x1MDAxOMA0pu1wLYuVcf+L+01DMVx1MDAxOVx1MDAxM81brr75XHUwMDA24lx1MDAxN1tcdTAwMDaVkpS++1x1MDAxMOiKI3hV31x1MDAwMp87t6yRllenTFx1MDAxZqdkXHUwMDAxNMDzppooXHUwMDAzjbOL7COyIX9Xl74+0T9hz1o3oE2EoaPi4lWCXHUwMDAyVG/gXHUwMDA3T929fcxGRMx4w4pVXHUwMDE19Itk7/mp41sr+YGbNodDPlx1MDAxMibEK1x1MDAwMlx1MDAxYVxmcX9f9PSot7eaJKG3ckBu/1f5vjo+slxiqYhBtbpRSk7Fkk5cdTAwMTJByUY8OLjwYCxF1Vx1MDAwMDlf52ZcdTAwMDY71CVGf8JaT7Taj5+HkmvMXHUwMDBmkos1YslcYr5cdTAwMTTaXHKJZrAjM4yApymyTVx1MDAwZXr19Vx1MDAwNKXOIDPVXHUwMDA312iDWcZcdTAwMTZcdTAwMGU7lng8OVx1MDAxZlC0u6kl0nBcdTAwMTFHglx1MDAxN6JA2Z07ojGCndKijC+lPFPbRLylXHUwMDBiSpPZ5pfzXHUwMDE3eYvOquMh3C5r+ZwoXHJKMvKlME67f6b6sflwW8F4U55cdTAwMTaa3q5FhkBcdTAwMDZcdTAwMGLONvMtXHUwMDFk0CHCkrH1+K6aY3e+2TfkeinWXHUwMDFh01x1MDAwN/qRVDbvu7lcdTAwMGY0NVx1MDAxNn47QUyFp7X6MsO75ncm6Yb9bZQ3p/yMXHUwMDFlZVx1MDAxYSfliFx1MDAxZDDqVCrGrFxmeegno9RTpj1cdTAwMDJ8P4xF9Hw3uI6X+lx1MDAwNPjNiEtSm5tcdTAwMDVY6dWtLt/zfPNcdTAwMTg8gVx1MDAwYkV9PUQoVyV2NdxF1k5cdTAwMDVcdTAwMTQ0lzzZYOUj4fb7a509oyDVo1xuiqiyXHUwMDAxyWvVXHUwMDBly8CbJaiU+KyvpWFbpMPF5HvEXHUwMDE4PVx1MDAwNyTIXHUwMDFmm1xizzgn7Fx1MDAxMtbhUI7KZ+wgrqv6aO+vPFFcXGBmsp+hZYquZF+FXYRO6D49Lt86Z84g3qpcdTAwMDDJh1x1MDAwMlx1MDAxNHVdXHUwMDFhn1x1MDAxMTPS7N97Z1xiTHJcdTAwMWWTLHoyjuj0cmOJXHUwMDE2ysvqrJ7ClFWqZnr2XHUwMDBlZFx1MDAxND85sjFcdTAwMWRz31x1MDAwMqosXHUwMDA3/6Thrlx1MDAxNVx1MDAwNsTtkHXcYYkpXHSW01x1MDAxZfRcdTAwMGY/Ztmd/tv0PjFcdTAwMDP9gPqQOVWHo+eQsWaGWC5uaqylLed83lxyXHUwMDA1WeglXHUwMDAxP+LuV79cIsbQXnaBa6Jq4fPmoOAhnepDf58xXHUwMDE4LZz1i+f2z/GFilx1MDAwNc+oLSFcdTAwMTiQ/MDuv1q0f7XY06RcdTAwMWQvcFx1MDAxYefpkt9Z1zTwaK83X1x1MDAxNmGAaia7XHUwMDBiXHUwMDFm2OvcyFx1MDAxN43G2vxcdTAwMGKRKVx1MDAxY6OZSVGDj/ty6vpxPq9UUoK9XHTyPreC5JPE0lx1MDAxZa+T3VMx6+ImXHUwMDAzXGZcbmq9l7VcdTAwMDZIvXrsQeJNgsLOwDHGOHJrXHUwMDBigMZYauptXHUwMDA1yjPplOZcdTAwMDUumFx1MDAxYTZcXDKwtKuFPVx1MDAxN8B+mWCL3idcdTAwMDLJWdHvQlx1MDAwYkyMXHUwMDE2vpLUXHUwMDAyW7J7XHUwMDAzbTj5XHUwMDFkXGaEVNBcdTAwMWJcdTAwMWZcdTAwMDAm/TZMNJHd8L81QUf6vCm3gZ19gzRiLebWk1xmXHUwMDFhmadN4VVgglx1MDAxMlx1MDAxMlx1MDAwNI8+44/lXVx1MDAxYiNZWt1cIlx1MDAxZudmv3ZobMXpMyVcdTAwMDFFXHUwMDE4XHUwMDA1ULZ2qZl9fdA3gu1q+lJcdTAwMTDRlj/9y+nxtFS9oEmtmVU8OX/Dz1x1MDAwMVx1MDAwNlx1MDAxY8ZwsJ60lzWOn/2YQ+qN+IWgZYuScFQ8jcz7XHUwMDEyZKZcdTAwMThNVHRDy9OUdONiSp6r4j4kWrZg470lSyDz5H7oVFFE5Tf7c+1HMib0Ql1cdTAwMDSv+flTOfxMqVlcdTAwMDTOpvKAICv93Y9cdTAwMTVCvr3NisWdWfiwk0VLPHVYJVx1MDAxMjWRYPzJ2Vx1MDAxZM9cdTAwMWVsZv7aptkx9HRahpZE/1x1MDAxZfO6plqWXHUwMDEywJeFQc01336XwWZcIn7AgjWIuNCYVP/yYMZcdTAwMWVcdTAwMWV4I3vldbI7NVlcYlxiyp/XWN7ThZrY2iap7n9cdTAwMWKUdVxumH5mMHBcdTAwMTdjoFx1MDAxYrg8xkuPXHUwMDFkXspcdTAwMWbsbfLpZTyTYrDrmLtcXKXRnlx1MDAwNX1cdTAwMWXO3srbYb9cdTAwMDMu/7c7q0uBzWeslENQMCmLKzvrqvd9pVx1MDAxNH8qubbPXHUwMDE3aVx1MDAwM8v1j9JCXlq/j1x1MDAxMJ+DoY9f1GSqMFH5w/Kxit/elalcco5/1+kztE9MXHUwMDAxJVxcLPFHXfXPXHUwMDAyKETsJD+UcKmO+XJcdTAwMWTnOlx1MDAxOVxcQbxcdTAwMGZ48otKQ5dcdTAwMWFYytznX73a7zqsJDVcdTAwMDQnNZnUUFxu7stcdTAwMTnm3Zn0TCa0jFndb0hhXHUwMDExMPmwM6hvXGJV6k/56/1cdTAwMDJcdTAwMTJcdTAwMTbzNUTb9upcdTAwMDTmTuLFeFx1MDAxOEvO0J+K477MrEiFkNV/ZDl8abxJwMUxlXBjMlx1MDAxY3mz4+bxpohcdTAwMGVsXHUwMDE5WFx1MDAwNCtqlij/ecl4LVx1MDAwZefZnO1+YT+Ez4igIZjHMnI+41xy5LIx0Vx1MDAwYp5cbqG84s3z2X9TP+zwUKdcdTAwMDddqJU3XHUwMDA2XHUwMDE5hzfXi4SpnFdcdTAwMTnFfOrd2D4sLKWfuKtcdTAwMDVcdTAwMGI6XGajzMVcZlxy5JNcdTAwMTXSZXWJ7ovtXFwqXFzPXHUwMDFlz+Ce3T49XHUwMDFhNmxcdTAwMTb1JDtcdTAwMTlcdTAwMDe/XHUwMDFmk2pcdTAwMDAyc+Unflx1MDAxN1gjtFx1MDAwNqFOm1x0M3yQXHUwMDE5aEOWrVhOuluim0jlMHlUT53Anlx1MDAwYtVcZn6apKRZTnFyZs6PbmF53JXPi+qvTHCAynXBwnHlZCxtjoFTXHUwMDA0TrjrPNO3bVx1MDAxMFqIKDh6bSBRL879XHUwMDE5oyyYjUxGmYudXHUwMDBmXHUwMDA3PGe9/Fx1MDAxNsdGPsPf36fRXHUwMDFjXGahe7O+OfXKeJlmnVx1MDAxM2H2cGXiwT9cdTAwMWGVMuNcdTAwMWL/hNBWXHUwMDBmsIIr7mWT8kzzX8F9IWJcdTAwMTeJw6KXwTJcdTAwMTHJR9AxqGJcdTAwMTP+/s6zXHRcboFcdTAwMDXdT1x1MDAxM7muiSlcdTAwMTen/rpZXUxQ1XBQSlx1MDAwNFx1MDAwN8owkK/+cZNcdTAwMTRfrjtkzYCUTsNvwOGntWKW4lx1MDAxYmyY6dBcdTAwMDTxXHUwMDFkYlx1MDAxZWdLnbZ8m2FYZFJcdTAwMWRB9CAkaYH1iPWDZ+hGT8VcdTAwMTZEaMNaelE+IFlcdTAwMTa3jeZcdTAwMTR53ONcdTAwMGWQ1eFcdTAwMTNfXHUwMDFkn/OYvfh0KGErXHUwMDEzvd49fDlcdTAwMDax/Vx1MDAxZENcdTAwMTAyXeKjeEmcXHUwMDAxfVNXU7F2tXrD8e5xodpt8H1Ov9THXHUwMDBl81x1MDAxOWLxX/NMfVx1MDAxMfR61Fx1MDAxNn3m2GqVVy/33NdcbjhcdTAwMTlPqaTy66CssSBcYtAgtPH4N4xcdTAwMWPOgFx1MDAxMdHP3NOUUlx1MDAxNatTXHUwMDBlyFx1MDAxMqZGv5y3efxghfwublx1MDAxZba6WO1XXHSaWfU2xlx1MDAwNim4Klx1MDAwYlx1MDAxZU2X1lx1MDAxYUC1yfPxuD91nstzV6f0eOSprXPpospcdTAwMDdcdTAwMWX3NerjLjJfP2BcdTAwMDOU8vFlsz7k31x1MDAxNrNbl2BcdTAwMWZcdTAwMWKdxvItWUPX01x1MDAwNkhVMMMmRkrX91x1MDAxNIhcdTAwMTmDp9um+tH8qVmI3u1cdTAwMGaWbYTVmNdcdTAwMDWDtcOZ0zVglL5ez1x0SNdZrtUjXHUwMDBlsUj/ri+q51x1MDAxN5qL+1x1MDAwMDyUzJWj4jhRMlx1MDAxNNCt1cxlllfTV/tok3RlXHUwMDBmOVx1MDAxMXkm59XRnP9cZpyYXHUwMDE1PyFLXHUwMDAyXHUwMDAwNyvO4mxcdTAwMDcng/WuzTTd0yz9amdcdTAwMWYyO6/oRFjzbUJtqNxcdTAwMTZHe+qUXHUwMDAxV71VR6pJXHUwMDBm1D/H7DO5Ibl2e35/OVx1MDAxY1x1MDAxYZwvWsiJuIRujydbv81cdTAwMDTsYMkmUJ5q4YZcdTAwMTVWbaH5eovVzSZM1SlD439cdTAwMDdfnq+Q4PVbUfdLWHiOTc/S8ZGJQ9lQPrPgrdWNnLL9+btcdTAwMDW1zu/OwqmPPYFPdUx4XHUwMDE3d0/9no/7d77qfl47Ld+kI0KevZ4/d34/cz34r1xihVx1MDAxMJ0jYLaHnzaGJD1cdTAwMDTN0YDTq/ikp1s5pyow3IQmXttcdTAwMWV1Llx1MDAwNiuiXHUwMDAy43dYK1miffujcvnMhU68WvRcZoLr4Fx1MDAxZMJGbvnWW65cdTAwMDEkfo+ZjC1pZjRcdTAwMGWdY9WBjNmz5Vx1MDAwMJpFqd8sXHUwMDE0UzBCSYrWX3at/cSfOT/9pJD503UomVx1MDAwZu+KKaHMf1x1MDAxYTGB2/nj4uTlPrthLju2XHUwMDFjgvxZupPcgVx1MDAxYn4kY7FRqyHgZFx1MDAwYlx1MDAxN4qemyY5aFb989mOvMkwKzBcdTAwMTnDeEhZN1x1MDAxNNdcdTAwMWQoellcdTAwMTJEXHUwMDEz4Fx1MDAxM7dr/lxy7O3D1URbyTqgXHUwMDAzo/Nzif6X8YVJIOchXGZcdTAwMTQ05FxmtESQkqg4h/2EYVxcdiNjsjSeqmRSXHUwMDE2hl0ylUvpxo2vJrov3u5+zNeOXHUwMDBmyuY41DH6t3ZcIpt6XHUwMDAzQ7nSoXyxK2FOdnyP+rtcdTAwMTV0rJKtzNo3buHqXHUwMDEyTiThn2udyjT6NjrWtlx1MDAwMdaM+p22psKIfdXEsV8/I0a5WMkkeNxcZr11pTy8YLxccpnLin+9+1x1MDAxYqSsan+G8ZbxZzGXgMl6XGKh5oyaeXUw/SVAjTKEXFzmo1xuMLMlakVpVlZTXHUwMDBmtlH5dEC34PRbIOxcdTAwMTKXMlx1MDAxNMTYXHUwMDEw4zLrT3RD5ffcUFx1MDAxOfdjjdqMb1x1MDAxNGJzViyAVz43XHUwMDBlYaK3jF6ltlxyXHSafW3AiJSpalx1MDAxOFx1MDAwMu+qe1x1MDAwNPWaIJlqZubTLFx1MDAwZimSrDFcdTAwMDO/QtO/qoDtcoJHXHUwMDE0l6qRdInLnTpTKfpcdTAwMTP01eCCJyNcdTAwMWOqzpPl7fanXHUwMDA21ddN9jDFPEzWIVxm/4aZXHUwMDEx2fXrXixOdlP+xDesk3ZsWqNcdTAwMTimu5eQXHUwMDFkJT0+uIOPVPErXHUwMDFhdCjIwVZuXHUwMDBmwO2dUlx1MDAxOGu2kLMnSJIkXHI+oGYsOFx1MDAxM/9QXHUwMDBmL0g8QZdDR5mXx8XTQVx0dq6abLVcdTAwMDfmx2q2v+lcdTAwMDfH/ctroyz5rHJFz2+g5DOCRolcdTAwMTjDxc/ceIhmTCW467e2rJfHdz/gXHUwMDBipVEw3Fx1MDAxN6pcdTAwMDbOo/1bgFx1MDAwM1x1MDAwNnbr2ksu4COha8xqJzijQ/mN6jsmRMSE73xcIkIrb/tcdTAwMTEzb8N45//gq3pcdTAwMDXEdr5K0Hxdyr9enNWTU9R9qlo+XHUwMDA0XHUwMDBlhk67WFx1MDAwMX7SXHUwMDA191x1MDAwNN6o4JKgtDz4neyeh9NcdTAwMTTlPVx0ff3L9OgrubxcdTAwMTkr+lx0XHUwMDA0z4J4XHUwMDAzgjijl64rKfM9m+67sVx1MDAxZGpcdTAwMTnjS9j+ZyAoLvq2Llx1MDAxN6Zvv1x1MDAxNzWv00qCXHUwMDFm78LFKdN0jcDPrIR8tbTrcdS2wb9LXHUwMDA1sFx0m8/BX5VPXG6vI7BqNOfavDTfks0rXHUwMDEyxG0/bFxmP/ihZT41elxm3UGSXHUwMDBmzFTLyFx1MDAxMEmbXGJcdTAwMDFvg9yKrv+s7jtsgtfAP31cdTAwMDNAXHUwMDA2m41u1Fx1MDAwN47NnFWEZJ5X8DpcdTAwMTJlQZxHXHUwMDAwsoD0MV9YXHUwMDFkP4JRfarc1pA9yfDJ//Qxt76+st7h0MNcdTAwMGZfl1wioMxcdTAwMTC6jPhTcm6vW4/JbX97XHUwMDEz+eq0emFcdTAwMTDbzzqmXHUwMDA2kVZubVEll4lDXHUwMDBihdVcdTAwMWWTQ5ozXGKb2Z9YIF1DPl9QKT+XUoojZ1QjRnpcdTAwMDVcdTAwMDPWqaik2sNpcSuWyaTlXHUwMDA203dv4yBqQPtfwP4yXHUwMDE29Vx1MDAxMVx1MDAxODJXXHUwMDE1yOMlsZYxc/+cpsfbPmt5RTX4gl5cdTAwMTmVXHUwMDFhi6RcdTAwMGIyT1ngy8HEmHz5XHUwMDE170aNnlx1MDAxY4hUnkbmXHJcdTAwMTSyjH1cdTAwMDMnXHUwMDFkSpG/11xyboZmZaVN1E1T6nKoW6QlkdTe6c+DKlYo7JWs+EdcYtgomFZsXVxm2CVcdTAwMTBd3bE3izJj8qXF4DOFOGwqblUyWGWlbmpZZHbz2fcr0vFtZztcbmOFXFzz2VKIVGArk2owS1x1MDAxNW7T13/CMFx1MDAwZqVqt6KDbVx1MDAwNJZqzCvrQ0ODXHUwMDE5XHUwMDE2XHUwMDEzXHUwMDAwkVx1MDAxY85cdTAwMGWk6oNeVuBsMPtcdTAwMTflRDdGjLuJ3vIzdXxpbojoPuhJf9mEMyPxXHKX3dtcdTAwMTKOb0FcdTAwMTOj6Hox3ZFM6qulLfyjdpbmXHUwMDAzQMmdXHUwMDFjQiWCXHUwMDEysynTpTbSXFz07j/Fkr1N0jXkqnvP6d7ukL5zzVxmdURwVmXJb3RlMXRQgS56g7ZU0Vx1MDAwMcFcdTAwMDdzKzV7zTaTgKDxUtVcdTAwMTFT61X2t8H4RZCXffwm5mD+XHUwMDFlQi+63Xe3XHUwMDA3jvuv//NcdTAwMWb/+e/xX29Fkq3I/+v//idM4jBKITiCYiTy/37fJ+vmXHUwMDE029JcdTAwMTTH/3/Uv4P++z/+fv77f1x1MDAwMGwwXHUwMDE4aiJ9KafkaClientKafkaBrokerKafkaBrokerKafkaBrokerKroxyliciousKafkaClientKafka ClusterDownstreamUpstreamApplications \ No newline at end of file diff --git a/documentation/0.20.0/html/images/monitoring-message-counters.svg b/documentation/0.20.0/html/images/monitoring-message-counters.svg new file mode 100644 index 0000000..e84f445 --- /dev/null +++ b/documentation/0.20.0/html/images/monitoring-message-counters.svg @@ -0,0 +1,5 @@ + + +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO19WVMjS5L1+/1cdTAwMTVlNS/f2DQ5XHUwMDExXHUwMDFle79cdTAwMTW7XHUwMDEwq9iZO4ZcdElcYoE2tCBgrP/75y5cbpRSRqpSKEtQTdJm1XWVQpXK8HP8uIeH+//99e3b995Tu/L9n9++V1x1MDAxZUvFeq3cKVx1MDAwZb7/g15/qHS6tVZcdTAwMTMvwfC/u61+pzR8502v1+7+87//e/RcdTAwMWJBqdV4+a1KvdKoNHtdfN//4H9/+/Z/wz/xSq1Mv3tYONhpNNZza9W1QV1cdTAwMWMuNS/u88/DX1x1MDAxZL7p9WY6lVKv2KzWK6NLj/i6ZC4wlilpmVOGXHT+dvVcdK9cblx1MDAwM4FVXG6U4qCdXG5dXHUwMDFk1Mq9XHUwMDFifFx1MDAwN+c8MNIw+lVQb5dvKrXqTVx1MDAwZq9cdTAwMWJcdTAwMTkoZrXWzlx1MDAwMbdm9I6Xe/nnN/b2SrfXad1VVlr1Vodu+D94hf43ut2rYumu2mn1m+W39/Q6xWa3Xezg81x1MDAxOb3vulavXHUwMDFm9p6Gn47PXHUwMDE4n+f3iX/j9OfNw8Trcb+F/2j1plnp0lx1MDAxYYxcdTAwMWVBq10s1Xr0mDhcdTAwMWJ9XHUwMDBiusN2rjxcXK7/XHUwMDFk3VOn2KjkaL2a/Xr97eVas1xcoVX4flx1MDAwNc2xf65Z/vnPvS72aCXFz1f+Nbr5SoU+2UqpXHUwMDE0M3b0rUJcdTAwMDYn7OSru63m0PicNMIxZ+TorrqraHS94YdeXHUwMDE3693KaFx06M7WJlxyMmyUYzbXqzyO1iVkslx1MDAxYnd9cd3hkp1f2Kf97abMNc/uv7+9718//zZ6fP12ufhyP9xIp1x1MDAwNZcgnHVv1+u15t3ks623Snejr/BX6JFNXHUwMDAwyH83XHUwMDExXHUwMDAwjX2ZXHUwMDE37FxiXHUwMDFiXHUwMDAwk5w57rh1Uolx8FhcdTAwMTXgNWWtXHUwMDA2waR2XHUwMDEx8ChcdTAwMTlY55y0XHUwMDFjXHUwMDE454a7KH5cdTAwMTTLXHUwMDEwXHUwMDEzh5hccj9kxt7/XHUwMDEzXHUwMDFi3EmhjOLMXHUwMDA3XHUwMDBlXHUwMDEzi1xyZDetLbfMvFx1MDAwN1x1MDAxY/H2i7bL8f9nsN+ROZJcdTAwMTni989cdTAwMTev74p/N1fqtfGlbDV7h7VnunlgY6+uXHUwMDE3XHUwMDFitTo9ezX2WT/qtSo9hO8l/JxK53v4UfRq6I7e3tColcth91HCXHUwMDBmLdaalU4uiVx1MDAxZmp1atVas1g/XG7f/7fJ2y/2e61CpfvyXHUwMDA1ep1+JfyIKpuvqOBcdTAwMDGoKYj+Ydqd0tau6lx1MDAxNPZWa+39tYtVXjhM7Fx1MDAxMrVlXHUwMDAxs5ZcdTAwMWJcdTAwMTCgXGbwkcnQ01x1MDAwM8lcdTAwMDLNLVx1MDAxN0JJST5tZDyvsNaOXHUwMDA3XHUwMDAyMY1uXHUwMDBmkFx1MDAwMELU+1x1MDAwNmtcdTAwMDEu0EwwdKrOWmX5yFx1MDAxNjKYj8O8NbdjXHUwMDA0LnFNQTlcdTAwMTk27p/g5ypcdTAwMTb9XHUwMDAyXHUwMDE5XTo3+mIpYZ+BXHUwMDBluYq5fJcx7aWTpZo63X1Yye8/PZvni93dxJbOXHUwMDE1qrdX51x1MDAxM1x1MDAxNmdDQ7dootaCw8cwoe6Sij9cdTAwMDSS1JKApFx1MDAwNVx1MDAxMCAyI48x8vbcRq5cdTAwMWOSleA8Ys30SyFcdTAwMTUx6eGs0ijQXHUwMDAx4D1W/j75t7XbrNibm9tOuXKgTaNha2dcdTAwMDfNmeSfklxm0pJ//rtJIP+4XHUwMDEyKPCEUkZcbomPkE3IPyZcdTAwMDOHL1x1MDAxYbxhq8Pi7s1PqICR/FNMW6G8flwik3/xkDlJLv9cdTAwMWNDI2dhI1x1MDAxZoFDR7zCXHUwMDFiNpBcdTAwMTctSMRV6uqPKW1nMN849bdMi9D5XGbq71x1MDAxN47Ir/4mbz9cdTAwMWT1d35eublr50HelY5cdTAwMWY2+1end7fdtcQ+0XJEJdfooi3qOMlGwmxcYmr0eG94NVGPKLlcZjDMsFxifOusXHUwMDE0I8t5gzRSQsAwqqB4Mew1M3yP47s3t0uUjJF4cVx1MDAxMedHMFx1MDAxMG7y1Vx1MDAxMOyVVFx1MDAxYUK/N7dLfLHMm8pRtVvRtzels42zVnGnu5R/XHUwMDFljHvIV+ssdjqtQcgn/mPa55Zlvt+rPDXWq81cdTAwMWaDS7F6sr9ztZ/sc3/pa0FcdTAwMDNzSoaR+H5fW7i4cz9cdTAwMWG5zZ1Gf3/pqtvJX+1v7CSHpjBcdTAwMDE6f1x1MDAwN3hjXGaElOPQXHUwMDE0XHUwMDEwXHUwMDAwXGKEJUZUpDY9epXpwFxijY7AXHJDN+NJuHD0ysJpplxm6lX0XHUwMDFiIZ+RIXRcdTAwMWOhXHUwMDBm8yNUXHUwMDEw0EQ0OfmdMsexolVZifE3S1x1MDAxM6C/0qzn+9tr1ztru0tSbTB9dH9cdTAwMDV72zez4YijVjTp4Mh/N1x0NCuq/UCi6NRKYfAntFx1MDAxOYNcdTAwMTCq6kBcdTAwMDJ3XHUwMDFhL4NcdFx1MDAwM2yU2lxiuEHJiu7LyTHvOPJvmUuLXHUwMDA1zFxmXHUwMDE5S2OMcFx1MDAwMMqXs4i++IpcZuRqxi1j7F3hXFya1lx1MDAxYpGs67U6Ksxv/DOo1V/4oUm1XHUwMDFhvfV0lOpZbrC7Vbw5UetH18Uzcbq3snmSPE+Jy1x1MDAxMnCkQrRcdTAwMTQrILJ1J1x1MDAxOEaXSlnOXHUwMDE0wtWjVTNvmCq4XHUwMDA3c3tDjt6QXHUwMDE5hLDPXHUwMDFkWojfpZCoiIy1doE5XHUwMDFj9XjfPi6WZKFcdTAwMDB3XHUwMDAzcVOodVx1MDAxYa3ih/lD/90k8IfOuFx1MDAwMJhWXHUwMDFjpFx1MDAxYd+Be/GHLFx1MDAwMIdcdTAwMTBxmo/Hgq9cdTAwMTgyXHUwMDEyXHUwMDE1qXNKaC7GNWfmXHUwMDBmXHUwMDEzQGaGXHUwMDE0XHUwMDBlN0qjJOTeJL6KJHbesKGEQUVj37e9vVxih1xin8Eh/sJcdTAwMTPFOERI2yFcdTAwMWVe5Vx1MDAwNo/bXHUwMDAz9lRcdTAwMWFUzs7U84FbPtlKvp3BrFx1MDAwYqTG2FBqZaNcdTAwMWVcdTAwMTFsoFDZKjQlk8WHv1x1MDAxZt7P83tEbSjZ79+5c9F07ptcZubMOM6EWWCE+JC/5qXb69LtXHUwMDBlJXdcdTAwMGL7J3eF0saHeUT/3STwiJxAIPHJvTnFcVx1MDAxMDlcdTAwMWJcdTAwMTgtlGVcdTAwMDJcdTAwMDC08rhEXGJcZu1qXHUwMDAw41ozrrJcdTAwMTBxJszM4lx1MDAxMlx1MDAxNVxuXHUwMDEzXGbUjTfBOSV7XHUwMDAyXGbh8T5sLMIjis/gXHUwMDExf+GKYjyiSNsjXG5+3jmSdvvCbXa7+eP28UEu306CYyVlQJlby7TkXG70eLKUW1x1MDAxNVjGNMJcdTAwMTgjXHUwMDBlXHUwMDE5LoJ4xbGQJpDWIFx1MDAwMTsxsdvxXHUwMDA2ZJltT8ZcdTAwMDBZ8OQ4llx1MDAxOL1cdTAwMTkptW93UkBsrlx1MDAwN2NF1DJcdTAwMGVGXCIlpW2Ke9jsXHUwMDE3ay2bf4T8/vWj48flzkoq21x0KKrQo6DfmIcl7jqtx6d6rVRr9buXpWFcdTAwMDHZZa912aaXLzuV+36lSy/0ivW/m4neS1x1MDAxOL28eupVul7iXHTVZo1cdTAwMTGPXHUwMDFlu7M3XqlXrntTaKfXasdxzthDmCSYhXzrdDhruv1M2M5cdTAwMThpaW1cdTAwMDPQmjPgXHUwMDE4VstcdTAwMTArXHIrkoRccqRRXHUwMDAyMYHMpcJ5klfSXHUwMDAyXGI001x1MDAwZflKg1x1MDAwMlx1MDAwYp79V4VcdTAwMDJcdTAwMDZjSWFRVmJcXKgz/Vx1MDAxZUdhXCKpfoc4/e5IQ1rFvVx1MDAwMoXHynfDpeGoUlKtvCPuXHUwMDEx6Mlmqbx7e7ndqk1cdTAwMTLn6G/fRlx1MDAxNjP8j7e//+8/vO+ONVL6iZjn6NNcIuRaL3Z7K61Go9bDr7lPt1x1MDAxOPEwvWKnt4xrWmtWx5fu57GSXFxcdTAwMDKVMSS+Up++Plx1MDAwYoRcdTAwMTRI4Pg0NVx1MDAxZtZI6NC7qsU2PWz8elx1MDAwNiNwoH0m5iSLhneVZvnXN3X4I9fcr+/ncsfdlfZF4+mqXCLMs++mlniAUVwilePSn4puLnpTXCIwjDNllVx1MDAxMoA6VaiozdKz+kGkdFMpRnCBt1x1MDAxY742yV6V+lVrkCgyey5cdTAwMWaIXHUwMDFisdplK7s7rZPj7YPbxoFOpOhcdTAwMDRcdTAwMGasMk5bK4VcdTAwMGJv8VxmvVx1MDAxMZNcdTAwMDGGXHUwMDAz+P2MYpRHjlxuOjQt4ZxBySBsTLIyXHUwMDEzdLFsKGfJVXJrwKlQwnjEezL66ivvaWFwbVFcIqWt6H5UXHUwMDBiJ8eDzcfSga0v16urZvlx+yotRYdflsEsXHUwMDA1XCLTXHUwMDE13YtKQbnyU7h0Kt12q9mteMVN7Jv/PE33+753SocqptrQVFWHkaRB3S8x6jRjWdVh/O5koJCVXHUwMDE4kjL5RF9RXcBAoDvRWklwPt5cdTAwMTIqcEZcdTAwMGLG0GkqXHUwMDAwxrLzXHUwMDE0cTym5lZ1XHUwMDE4qipDXHUwMDA1jFx1MDAxZXbTXCKe3ajEXHUwMDE5pcNo+dJRde/nn1RVXayV0s9S1EBcdTAwMTeh66ZrjbCEYlx1MDAxOFk5xzmqJ3yiKEqjus5cdTAwMDX4uFxy3jynXHUwMDEzj1x1MDAxOKBNl3XR+/392kpcdTAwMTa2ls/b5zvVlZVcdTAwMWb75abMrZxcdTAwMTTyibLeXHUwMDAwXHUwMDA2XHUwMDE3SFiGJMWkXHUwMDE4pyhudUB7vLSyjJbWJ65cdTAwMDDfgjSmSaBlubKZKMkml1bIL45LJXxcdTAwMTElKqc47lx1MDAxMZwh5oR5VyX/NGV12O43N7pysNJprt/dLVx1MDAxZF6xlntIS1kpkMaOvlNqyqpb6eDzmZo1invvXHUwMDFmrKtS/tYp7XhPtZ9pqopTdYp2XHUwMDA2mMCIVksxnuFcdTAwMWZcdTAwMTJamLM8uorqx5xFKmegmTGenTpDx1x1MDAxZJxWTHFngdssWVx1MDAxNsdhbm5ZxVx08YqDl9t0/D5cdTAwMDBcdTAwMTeSXHUwMDFiIzlLW1hccunnXan6VIXVUqyd0k/EQlx1MDAxN6GrpuuMcV3FpFx1MDAxMVx1MDAxMlx1MDAxMepcdTAwMTRcdTAwMDOrlFxmZftec1OfT0jdXHUwMDFjQOnksMxPXHUwMDBlLutH17fqfGVtnyejJeF0wCzjoIBcdTAwMGJhJ+pcdTAwMDf0sN9cZi4mIOhYiE/eSMlcdTAwMDaUxVx1MDAxYUZcdTAwMThcblx1MDAxN3yE15GScoGT0lJcdTAwMDaLilx1MDAxYkKproyUxklpeX5SQqvlxp/Jsi421lx1MDAxM1pZXHSgR8n2uSlJ0XY1pcXF6Fx0f1x1MDAxYyXFWenL1UlcdTAwMDNdXHUwMDA0J50/bJxtNdeuOo9L97sqXz04KfV6cZxELZ9cdTAwMWNY45S0XHUwMDEyNUSEk0SgmVx1MDAwNCsollGonrWOWMiHk9T0bzw12lNcImDIyE5S3YqG8UOemotAOElccrEs1TpFu15cdC1cdTAwMDJruKHmP1xc6SyTPlx1MDAxMyutJFx1MDAwZvcw0KNyTe2jXHUwMDFmw2JLnPTLXHUwMDFlVeqVXHUwMDEx093imNXNXHUwMDE07c3Jbd5o72dcYlx1MDAxM9r3n5JPjn3zn1x1MDAxN+/9vu+dTsTHb1ubNXuyud0tNFxuXHUwMDAzV2tcdTAwMGX4qifii2/ZgtSDKFR2vCbrpThTUP0y+qPJXHUwMDEzQVnHlrRJbHX+4mZcdTAwMDXaWmO4L48uIf58utb4S2Ok+NuLm8udg7368u3Oj+eD2+Py3dF2x525pMfT/8Rj76m2mPE/vSRCRVx0XHUwMDEzYFx1MDAxNKVcdTAwMDHjJVx1MDAxNWkxI9lQhqJcdTAwMTU5LanbRDTHk/WY+TZcdTAwMDfI15IrXHUwMDE1oOPUQnnP63LJ48CsMEqQStlcdTAwMTRcdTAwMDOll1x1MDAxNjPWOT6XmPh0LWZ+4ThcdTAwMTfZYmajV+5cdTAwMWW1xV37fLlwvOOKR+3CkyfyiPfhKpCSeU5cIlxyUe2oLaikLkF0Qt/TOCrz4mlcdTAwMDF8fW4vjpyKMT73XHUwMDE2b6tQ/elkhMJcdTAwMDT1MXlfY9H3+fBb3TjJdTu3ot/Ya9xcdTAwMGbWj+4uxOksPtFccv1cZlx1MDAwYiPm/T7RfzfJfFwiXHUwMDFkQZKcy5+tXsbQozhcdTAwMGI4IDZcdTAwMTR3ytu1MHOJ3+ZAzCxNd5F+qFg7elx1MDAxNIlcdTAwMDDFY1x1MDAwNa51QnLtUu+6Nqv1fn6X+Fx1MDAwYj+0SJe4edMp2a5jhaPVPKtWn1x1MDAwZu9PXHUwMDBlRVx1MDAxNM+eXHUwMDFkXHUwMDAzpdBdoTM09uch+lx0jStQXHUwMDAxcyGNXHUwMDFlS7S9VfxcdTAwMGJcdTAwMTY4Tuk6XGaZ/JVcdTAwMTdAlVx1MDAxZFxcZv3Wplx1MDAwMntz/r1cdTAwMDLGnVx1MDAwMe2kd7Ngylx1MDAxMX3uuHMm1IY7XHUwMDE1wKN/cFx1MDAwMt51IDHdcv84XHUwMDBiXHUwMDFkXlxm2+bok1wivnjmbYLJlPtcdTAwMDfvJ05NXHUwMDAxTN1PpFxcvbRcdTAwMDZcdTAwMDNyXHUwMDEwgk+WvaOCXG5cdTAwMThzeE2iL+c22rJcbpRcboSRgnNBXHUwMDE04rxcdTAwMDRhXHUwMDA0UHlcdTAwMWVcblx1MDAwNyVRXHUwMDFiZCxcdTAwMTHHXHUwMDEyW3OzhFx1MDAwNi5cdTAwMTg475kgXHUwMDExL5g5w/VcdTAwMTFK2ncl9afIXHUwMDAyhbbFPn5LMdZMh1x1MDAxNyNcdTAwMDaaJlXE7ihObaT6bXxH0XJcdGCdoVx1MDAwNmQgRqv07XVHXHUwMDExRGC4dU5j2MO5sipqIYmOXHUwMDA1TU9cdTAwMDOE7opcdTAwMDXKXHUwMDE4yuJcdTAwMTlpreJWRHc5VYDOXHUwMDA3uGWaoSUgO0eNdjH8OD2VOZVcdTAwMWZcdTAwMTXDp4+PXFxrdKKam/EyMEllyVx1MDAxNomRK9qnXHUwMDBlJ43fXGJSisAq4bSiwyc83HJu1PUksMYoXFw0KzG2slJkKYU4hszPzZCGITFhXHUwMDEw5GNIMLF1YI7q4FFMp1pcdTAwMDY2JEhkyHd1q0635lwi3k6Hl6MmulxijkzMRsiR3FrB8Fx1MDAwYnDqymCsXHUwMDEwobeNTilcIs07QLWIsZCy7+TIxMzNXHUwMDAyJFx1MDAwZYy7iPtcdTAwMDBQn/Jo3T/oQFBPJVx1MDAxMIpcdTAwMGV1Ks95zlx1MDAwNbHkVufZNO/yP6ww1093g/zJ4GD3KFx1MDAxMUtcdTAwMWEqXHUwMDEzXHUwMDE0zihcXFx1MDAwMWZcIjEmkSTVqsVHmaBcdTAwMDL86uS7hm1PvWeQXHUwMDAyJc3PjGsmIOPocXt+erRcZldCe1x1MDAwNaSN1Y9KWzq6knZcdTAwMWY4joI0PDvt49gx1kKHl8eMM01i/FxcceZJ/fTkR3Vt5y6/amz+/ilX1TssSVZZIUFwlK3GMFx1MDAxNSVcYlxmLlx1MDAwM21BXHUwMDE4muPm66VK9WDWODHZ1D8rXHUwMDA3+zUj7PhcdTAwMTnBm1GWIC2GXHUwMDFh3t1cdTAwMTbO4mdcdTAwMWMy2lx1MDAxZlx1MDAwZp88TUdcdTAwMWFpxJSaa5d1v9Mq90uVv5uFl6MmM1VZxWSVf1OVVfytppNBXHUwMDFl9LpPz1x1MDAwZvr28rbWe2hcdTAwMWTtrdZqXHUwMDA1z9xcdTAwMGXPjlx1MDAxMNJdoKktuUNRZdxEryupIEA7dZo6zdOCRU/vXHUwMDE5XGJcdTAwMWNlXHUwMDBiX8d2eLaEMlx1MDAwMMdcdTAwMDJ4d1x1MDAwNlx1MDAwMFx1MDAwM7VcdTAwMDXkoeOlyXpdcSe1cy712MYpJucrk1xioeKldPDPQPDkvaZcdTAwMDPhyi1cdTAwMWNV+s9bq1x1MDAwZlx1MDAxN8Y9PLO106OOp1tcdTAwMWR95DiELVx1MDAxM3S6XHUwMDE4LLWW5Ga8zIlGLsKwb1x1MDAwYmKbo1x1MDAxN472feKBXHUwMDFiXHUwMDBlUqVcdTAwMDShNiZU0Vx1MDAxZdLnlIensTuglUKq+ENSXHUwMDE45Vx1MDAxNkmxxVwi+nz+LC+pbVxmYr05XGZcdTAwMTGLc5q3SFFm6nu/jIYjf7hKjzdT+olcdTAwMTjoZ9fpY9farfpTdbi+v1x1MDAxMunTXHUwMDFiO01x9IbJQFx1MDAxOUmufOKU/Vx1MDAwYk24XHUwMDAwXHUwMDA0XHUwMDFi6fQoTTiM86kzsFx1MDAxM9TpIDzg5I/z81x1MDAxZkFcdTAwMGLFXHUwMDE5XHUwMDFjPac0XHUwMDFjxCh1XHUwMDFkX9xM80apdP1dXHUwMDA1kW+AWXhXS+osN5eOKLdcdTAwMDZNXFziSrHxd7NR6XVqpdlOXFwsVklMvdt0tFx1MDAwNOhqXHUwMDBmXHUwMDA2g4vz3u3gsV+G7o9DtppES9D2U+BcdTAwMDR6XHUwMDEx+sNIOakmhjtcIlx1MDAxMnWfXHUwMDExQmNIXHUwMDE5oVx0Ov7FXHUwMDA1V1Rpr1xy84pcdHBcdTAwMDFz1Fx1MDAwM55pzqXJxEQsa1xczS0mlNFAXT+8XHUwMDA3JeKjfq6MQFeKfiFtNUGNXHUwMDA0P/5gfKyZXHUwMDBlL05cdTAwMWHov6mYOHi67uQ7l5ebpzeNp9WHZVOysptETCD8dcCMoTnuL3JggiZiy0RDw9CUXHUwMDE1XHUwMDBlkPvd+OmLTE0k4IVScjVhuWBcbtWEj1x1MDAwMCB+gK8yRlHBxLuyXHUwMDA207TEb+36o1x1MDAxZGPvi1VetUS//ecoiSn3mo6OaEgmavvillfry3ZweHR1eNq5S3xWwzBcdTAwMWRYzumoJae2xFx1MDAxMyTh8CrDa4LCNVx1MDAxNlJcdTAwMWGvXHUwMDFjYXVAlSeoNKiAzWnPRFx1MDAxOWlcdTAwMDL8bCHp061U5mu1Llx1MDAxY6mAXHUwMDFmg0Fut3d82zspnz02rlx1MDAxYlx1MDAwZs899zZcdTAwMTZ+JmKJ6Sc209lMxS2X3PhGsTlcdTAwMTlfyypcdTAwMThcdTAwMDNH5YppU87m5uFhda+yu7a+5tRTtaeaXHUwMDA3qpdcdTAwMWHloFS2KU2e2WjkT/dLW5tqpVfdWO1d9/bUk2dcdTAwMTZbXHUwMDFj3rhcblx1MDAxY3K9dYDEPpnKRy9cdTAwMTBcdTAwMTiM32kkXHUwMDFiXHUwMDFkn4pcdTAwMWVwplx1MDAwMaVAjVxmtcSvJjzdY8BcdTAwMDRcdTAwMThcdTAwMTZIa6mLJVC1Woa3OfE2y5lcdTAwMTBcdIZzXHUwMDFiUyNcdTAwMWWfXHUwMDE3XHUwMDAwSVx1MDAxOWD5vuahXHUwMDFmhyvacE/pwNThUmE//1xcY3uDq+NeV7Q2L1x1MDAwN7lEM1x1MDAwZan2XHUwMDA1jd1YY7lmVqlcdEixQNOsM6FcZneekb9cdTAwMGVjaac0NXRcdTAwMTKMalA9kGJcdTAwMDGGXHUwMDFmdGZcdTAwMDeMXHUwMDAxq0NeMlx1MDAxNUj9x/Xw56vAaYZcdTAwMTFQKC1oUEB0XHUwMDEyXHUwMDFhfXWIXHUwMDFmXHUwMDE5SrukVDafbp5d0t1IOddcZij/OESuaXRcdTAwMWZcclwiktTjLdR6+Fx1MDAwM9uOpD7+0N6Wbu5s+3htK19+bJ5t71bbV4VkXHUwMDEwXHUwMDA36qFN82MtZ3Kiw7bgNqAh6zRnyFnn6bCdYXzRXHUwMDE4L8/gMjE4XHUwMDAwlETKp0W5mzJOgFtqLPT5MO5cdTAwMWbw9ikxnvpAN7lcXD7sXHUwMDFlNGz5bHXp+WKvs/ZD+Cr9o2ltRHegaC5cdTAwMTJNXHUwMDFlZUxMKmNcdTAwMWRQjMlAONCWuWgoylx1MDAwMqmspSNcdTAwMWF0vMRY6Vx1MDAxN8egpEOi0JxcdTAwMGbz51x1MDAxOcrnQHk9OcrpYdM5SO/s76haXHUwMDFlXHUwMDA1nJZiIaHSrYyZXHUwMDA35anmuOONln6i5jr6vMh6/clZ7qeLtd3j/lWx2ilcdTAwMWSs3JyDvmpuXHUwMDFkJFJcdTAwMDbcXHUwMDA11jBmqFUl/jkxXHUwMDEymZoloPXQ+CQnXGY30dK4TFx1MDAxYSyYNGZQXHUwMDA2klZW2OiRIOKM6G7ZqJjOSDpcdTAwMWGXcpVNXHUwMDFhyoD9OcqApa1cZlSp7fJcdTAwMWL3N3c7N+d1PtiEi/Pjx0RcdTAwMThcdTAwMTf0fKTQznKJbDih/plcdTAwMGJcdTAwMTQzwnIuOFx1MDAwNlxi0e3uXGbii4b4LFx0M2Zccm1jeVugho5reYRcdTAwMDEwXHUwMDA38lx1MDAxM8p//ueAnKdccvJzZtdr++2VanutvH69fVF/zlx1MDAxN2RcIvmveCDx6WtcdTAwMTSDhNaJseyUXHUwMDE4t1x1MDAwMFKB0JKFK6kz+f9hMJ8hkUetXHUwMDAzlbbecjlcdTAwMTetllx1MDAxZpW4XGLgkqpcdTAwMGY+XHLKM/mfvvyXO/mtjb2Vas21XHUwMDBln3fbpZ1yb8UmYlxyTe1R8PHgs0GHwMdcdTAwMWKdXHUwMDEza1x1MDAwMDlcdTAwMTjGXHLo8GDKjDQ+ijQqM0hcdTAwMDNcdTAwMTR71Fx1MDAxMMX5iuzHOuVMslx1MDAwNi6kJMWXsca/M2s81URtZfV6eefxvrVxL90206eNRFx1MDAwMYWSXHUwMDAxXHJ9XHUwMDEw2iiDzyiaNEAmIbXhXHUwMDA0dSiN0kZcdTAwMTZRLJg1rmdcdCiAaiusv7TFxmdcclx1MDAxNI1utUakW02bRkBh/pyAwqRcdTAwMWRQrJnHfCd3rK/tj/3r0+JJO3dZ95ya9fXEoFKb4ahqTqPm5XjaQCqaumW01rg4zLNnOLLtUSVcdTAwMWJcdTAwMDYhQlx1MDAxMatcbonE6/QspWxcdTAwMTU69MGnYvrfqPpV5eauinfU+omqoTw4tjKiXHTCjdQ0Kr50nT9NjbWKy48/Yzf27qhFfnZf//7eXHUwMDE3XHUwMDE3XHUwMDBma7fNwXNuXHUwMDFm2odXV+1272KDryRiXHUwMDAyLoRcdTAwMGIsjf7FKIFJY8erXFyFM9S7yGl8m1x1MDAwMe6hgkAyS0fyqIRIgGbOd7DOXHUwMDA0NP5cdTAwMTlFJ1jk5NnqXFy/XHUwMDE4OczfQ0xKavlmQnhcZlx1MDAwZk6KPzKDK6OFXHUwMDAySHU7cUhcdTAwMGX48/FdXHUwMDE2l6aY6vB61EpcdTAwMTdDXHUwMDE4cZ28tlaeNjY381x1MDAxYn3YfDpXO41tVzyLm+qmnWBC4l1bUKDB016MXHUwMDA3jHrO47cyhnqQqaj5LIartjduc1x1MDAwN8vr22u1ndvCMudX9c1cck9cdTAwMWE0jqtQs2jKejmYXHUwMDE0LTqgTVx1MDAwZaHphJ+yiVSLMCiDJGjqvMlcdTAwMDSN8M6IKY6Y5u/eRaGHXHUwMDE2WkYqfYd3XHUwMDE47Vx1MDAxN/BWzGSGM3neNzBhXHUwMDFhMTmMb0f+7lOolqhF/vuqXHUwMDE2c1VcdTAwMWFstXf3e6Y1uH86zFx1MDAwZtaK61x1MDAxMGWCaJJcdTAwMDJDx8BcdTAwMDCTXGYwQlx1MDAwMcHGx0CAtIGks4+CgbJcdTAwMTJcdTAwMWZkhFxuUFx1MDAxNFwiXHUwMDFkOsej49JGWYqvk8uchVx1MDAwNmZq2SVccvokJ3xKhLPYgn/8NcrfmdQ7/lxibkMh03umQIRcdTAwMDZcYnpcdTAwMTNcdTAwMGYzXHUwMDBlgfhNmVx1MDAwNv9tpjTsYeqhialJXHUwMDA3XHUwMDEw+NHCWio4cuGB8i+RhlxuXHUwMDE0SCm0wDdyj//mgVx1MDAxMMagy3U03FxircpcdTAwMWZpIOiZQT9cdTAwMDNCsdCgkcyff1x1MDAxYlx1MDAwN/L8Z/Mtqk5cdTAwMWE25fXnfMpcdTAwMDAkyv6KUFx1MDAxM9y0/LlxSn+8P1+KN9Th5YiNLsbDx4VcdTAwMTnTXHUwMDBm7YXCXGZcdTAwMTZYyVx1MDAxNEpramBEXHUwMDE1RaE2o69RhlxuXHUwMDA0NVx1MDAxYkX8XG6NQV90vP2i2lx1MDAwNU+NnX45pVxytFx1MDAwZZjU3DCOXHUwMDEywU7oXHUwMDBih1x1MDAxNMlcdTAwMTVYXGa2XGZcdTAwMThcdTAwMTXdXHUwMDAzyU7+Jt5cdTAwMDYpuYO9q9Jho7ZUfy6cPOe21jaWL9+xXHKiYlpcbsxy8JcpPVx1MDAxY2Tg47Pw0ZnJXHUwMDAzVdR4/H39Rd9uznM6cXpOb8yM39NoQFx1MDAwM8xClVOwtr26zNu2sFTZPbhu7fb3Vu7Z7vpcZlgzKuBcdTAwMTjdXHUwMDAxt1x1MDAxY1XaZHHTsEpZa9TxjoFvpFt26nfhWJvlXHUwMDA0XHUwMDEzLlx0yj3OXCJqgEBcdTAwMTUywchwVM24YjptjaBcdTAwMWRFhulcdTAwMTj+efGUXHUwMDFmXHUwMDE5Vb/KX149Pu7fdNbPLjejhu/pP4OOgcamMIphaUd2wr8oakmPvtYxJse602Sb7Fx1MDAxZmTxM5XmoM2jOrBcdTAwMTHbpq9cdTAwMGXRl0fDvdHiabBlqrvs77H5SNz7lU/mbvTqtdvz1p113a1i5/pk5bGQ8zSRiUG5RfozRiNcdTAwMTCtnajA41x1MDAxMGipaJAps8J4XHUwMDFhWmQoXzDKZyilXHUwMDAxTeFcdTAwMDE3vlx1MDAxZHiUMbFDv7khi2DSpp3Mnlx1MDAxZuRf+Wiu27s8OFvt3z/lK7XTu932lX3a9dTL+TpOOlx1MDAxMdDsIU1cdTAwMDN+uJw8mov4lLQ1Z4D6zGWl+Vx1MDAxZlx1MDAwZvJqcpDT1CBcdTAwMTNccvyImlkswingXHUwMDE3oN/Xrua3XHUwMDAwPCuwTb/A9qZaKW26fH/nXHUwMDAy1ObTduO6+Ph8mUhcdTAwMTWAwYiVISk4WlKuJ3vyyFx1MDAwMD2+1cJaYz1d5TJRsGC+uJlB+qPtSz52ujZMXHUwMDE58Z2vXHUwMDE1XHUwMDAwLmq6XHUwMDFiXqlogq98KNe061v3Z7yWr1x1MDAwZpbvly4um6Yk68kgjlx1MDAxMTzKes1A0ujayZo6Jlx1MDAwMkc7kUIqWiVPr/pcZuOLxXgtOcZcdTAwMTFSgtry+IS/i4ZcdTAwMDNvXHUwMDEwt1xmlVx1MDAwNOjQ731cdTAwMTaMf+Uzub1OKXfK7vun5lx1MDAwMaqPOyxcdTAwMDdm3bNP5NH9dFx1MDAxNIZK6Vx1MDAxOGfKsHC9+yhvLej4tsZYT0ZLUDLhv2iQ387kyJ1SXFx5w3tnY1GumFaM+OHTgDzT/ulr/16xvbdUulx1MDAxYWyfb61IXHUwMDAwxpaqR55efT7SXHUwMDAwXHUwMDFkgORWapDaaT6Z+HdcdTAwMDGN4qXqXHUwMDAwjj8jvZiRxkeRxl1y0qAuS1x1MDAxNp2lNyXIVGw5XGZguIdcXFx1MDAwM+n28cpY45OxXHUwMDA2ryqRv7qo91x1MDAxYVfl9v1Dq13b7CbcR6DZ4Fx1MDAxYcWjXHUwMDEzXG65XHUwMDAxPFx1MDAxOVx1MDAwM1x1MDAxOM5cdTAwMTVcdTAwMDNq8utJMmbxxIJZY4bmf3R2TrvwQLMwa4j4nFx1MDAwMUaXmlx1MDAxOZP6Wb75XHUwMDAziq98Jrd4trzLj65cdTAwMWbuntstOOPNu9zqjZ6l8MxcdTAwMDZcbsA45lx1MDAxY65cdTAwMDdcdTAwMWY/46KYQi5FXHUwMDFj42U6osSz0rM50F4od1x1MDAwZY9yl2ypXCLWXHUwMDBm7lx1MDAxZVvdw6vt4/egveFH+1xmpWeKqj1cZlx1MDAwM2+4XHUwMDExra9cdTAwMWR1xse4kyrs06RcdTAwMDD6QIx8QkWPc1x1MDAxNcm0XG5726r32H5cXIZcXEet16+Xts89c2Hjq8NMgDpZS6Bzy6Hq/SFcdTAwMWW4XGak4JJcclx1MDAwN+dYiG6hZ9Vhi4dDM7nzk1KjXtHM5/ysjD+qaqiLTfr97dK0+3tnXHUwMDBmt9V+ia3+XHUwMDE4dG+PXHUwMDBi7Z2DXFw/YdmIXGLo9KlEy2V6vPZYMVx1MDAxN1x1MDAwMPpcdTAwMDXhhiOJZJY7/nBzb81cdTAwMTAhOiZcckjvyWyAKUezmdVcXIzx11x1MDAwN1x1MDAxOXxE633lyrDn+1bhplrfOIHzs/VOzZznhUjUZFx0IS5cdTAwMDPBLHeWWv/JiYhcdTAwMGUjvcBaOlx1MDAwMsqMk4JlnZk/XHUwMDFj5O3kICd7p43g6ECj4UU7paEjLlx1MDAxNOr+dM85p4Lyr1xcXHUwMDFh9nCcO9wp5DZq/f7a1vWqPSt1jo5cdTAwMTOWhulcdTAwMDBcdTAwMDRI67jF5zThyVG7Ylx1MDAxMGe0waBcdTAwMWJ4tDVzlutdNMjvZ1x1MDAwMDlcdTAwMWLGXZ4yMFKu8U1brUFdR1x1MDAxM40/XHLEs1Rv+qneXHUwMDE1WNlrr+vl+45sXHUwMDFj2dbWWaW5+5BIXHUwMDE4gOWBolx1MDAxMS6MKaZccptcdTAwMTBcdTAwMDbcXHUwMDA2XHUwMDE21YIzXFxZxyBcdTAwMTNcdTAwMDZcdTAwMWbOXHUwMDE5nVx1MDAxOUrGmVx1MDAxMdxSb1x1MDAwM1x1MDAxZmeI2O6LQlx1MDAxYYu/+fFZnogs+MrVYVx1MDAwN+ud843abX1wXHUwMDAz962tzf3BVXelklxm485iXGZPJX+AIHZcdTAwMTPDx1x041xc4fogMFx1MDAxOU11yDD+0Vx1MDAxOO/OoFx1MDAwYrRioGmorlx1MDAwZuMuXvtcdTAwMWLDLHUvSHuW0/wg/8rlYVvF86a87F9cdTAwMWXUb/Xede9+45KZUlwi7U97tlxcSVx1MDAwZdxcdFxm8tl4pcdL4loqzqzAh+hcdTAwMTm9mqn/RaO8l1x1MDAxY+VS4ooo69+uiVx1MDAxZspcYlx1MDAwNpCw3Sdy5Jn4T1/8XHUwMDE3+uVuTpw+XHUwMDFm2/JOzuZtafPofilhdZhcclxmXHUwMDE1h1x1MDAxOYxcdTAwMDMkV5OcIVx1MDAwMquRVyhNxI2/XHUwMDE3a8ZcdTAwMTlcdTAwMGLljP5cZsrAOVDMgp80bPzAXHUwMDA2R1x1MDAxZLGcS/fAaMZcdTAwMWGfjDUu13fvtjg72bzl97LWf2xVXHUwMDFhuYR7XHT8pabUMVx1MDAxMNww7UlcdTAwMTlox6zFSENrXHUwMDEzrSnNwolcdTAwMDWTxkNy0lx1MDAwMKYxaGA8Wjz6fdhcdTAwMDUzljQ0QkVrm/qUl/nDia9cXFx1MDAxY1x1MDAwNlerrbPB6fPqztpmf2tcdTAwMTW9gT1ZTVxcXHUwMDBig2tcdTAwMWE44NJcbpCGXHUwMDFiPd4/UTFqX42uQlx00lxiPJpcdTAwMWLMSsOSY32pvv5ULrLn3ZtHu3vgVlx1MDAwZY4uXHUwMDFm3oP1gVx1MDAxZuuzdCVTTOGSW+GlXHUwMDAwXHUwMDE1r1x1MDAxYmiyXG7KxPR3XHUwMDEz0UlcdTAwMThcdTAwMTa2//dcdTAwMTfJ3PXFYP+w8NDfWFx1MDAxM9BkO6xVuagmXHUwMDA2hGFcIkBuXHUwMDE0glx1MDAwNlopdF9cdTAwMTOeT1x1MDAwN0JzOsFPYZeN1kpmxWGLXHUwMDA3xGNy50eqXHUwMDBml8ZbXHUwMDFiXHUwMDE2f1x1MDAwNEuCRM/H0q9cckvR7MtH+d3b3vp2+Xyjfr3WaueP8syTVvJN57JcdTAwMDFlXHTJT6Ignug2ojj6XHUwMDFmNpxcZkd/clx1MDAxMVxyXHUwMDExM7G3YHt/miFCXHUwMDE0XHUwMDE4XHUwMDA1IWNZX+5cdTAwMThAxpo858JJpsLNiD7I5iNq7yuXhzVcbvJgr73yuNrf6rUvqs+35aWTfDKUO4QgKn9mOY1smihcdTAwMWNcdTAwMDGM6JBcdTAwMTdRXHUwMDBlckBcdTAwMWafXHL1/nCQP89cdTAwMTDRSVQsjvmLw6aU+nOpwUpcdTAwMGIpN8VPXHUwMDAz41+5OGxzv1dZOTxp1ep3j8fL62dPJ/3aaZJkr1x1MDAwMVx1MDAxZWjBuUUnXHUwMDBlY0O7X7Wr41x1MDAxMvFccqBcdTAwMDB8w2yyXFzvYkGu2Vxmnpw2gVx1MDAxZFx1MDAxMrivXHUwMDA1qFXxIMeoWzBcdTAwMTXO7X80yLNcXO9vKFx1MDAwZru9PDxcdTAwMTfwxOtnxf3dza3c2k7O0zDbI1xmXHUwMDE40oJcdTAwMTm27maaMzkpXGbQqWOUilx1MDAwMbEjV5I1XHUwMDE0/XDO4Mk5wzJcdTAwMTRcdTAwMDV05NNHXHUwMDE5OrZ5XHUwMDAwrrPBiFx1MDAxNz483I3Igq9cXFx1MDAxY7a5ozpnrVx1MDAxM7tyurd3dWyWoG9+PCVCOIhcdTAwMDAx57hSUiqY6CpEXGJnjjFcdTAwMDbDcUbZZs7HI1x1MDAxY5Ij3FxioTG6929cdTAwMDBHXHUwMDBixt6qRug4XHRKxM+jXHSyyrBv3y/7crO0zlx1MDAxZc5W3EGhe3+pK+ft60TCX9hAYVxmP2xcdTAwMTNcdTAwMWZcdTAwMTm9/ZK0plx1MDAwMTtcdTAwMTT/K1x1MDAxNj3fmVx0/0VDXFwkhzjQgCRcdTAwMWTu0Fx1MDAxMoL4lF5cdTAwMWXI9YJZy1OvXGbLdP8n0v1LP+5vr1x1MDAwNzvHW63jk+pT45Dvto89XHUwMDFkgDycoWTAqeTLYXyIlDHJXHUwMDE51G1USFx1MDAwN4wpbjPK+HjKkMkpQztmrPXucnHGIy+PysJcZlx1MDAxNzRh7fPk/DPKSJ8ySqWL/EFvf2WtW6tcdTAwMWR1XG7HO7VixbNB7lx0JCRcdTAwMGY0eiNcdTAwMGLSXHUwMDFhLpknVeCclFKA0tZTf55cdTAwMDVcdTAwMTJcdTAwMGKmXGY1QyBcdTAwMDHW0TlcdTAwMTNvIFx1MDAxMT1dNsoucqrsXHUwMDEx6fZcdTAwMTlMJZL4ykVh3eVbs3q0VZC6XT1aO3t62FfCs4XggbiQXHUwMDAxwk/SaVEqc1x1MDAxOYe4UFx1MDAxMDBcdTAwMWGzy6xcdTAwMTJcdTAwMTI8uVx1MDAwMi1cdTAwMDJcdTAwMTCcXHUwMDFlr1x1MDAxM6FtpVEx2GhJP8PwXFw58fpcdTAwMDdcdTAwMGXB1iY5WLnmXGaN2HinSvJoXHUwMDFi8fBcdTAwMTBsXHUwMDAx7F1gXHUwMDFku4/omFxcjDNgrlx1MDAxYc7/4n83/4vs/v81/jNcdTAwMDa5fqgudlxmtv8200FtXVxcXFx2XHUwMDBi9eXa0VW5uXlwUuxu91x1MDAxM1x1MDAxZf/UmsSLwjVwisZcdTAwMDCPwVx1MDAxNl9HVFxu1HWaK1x1MDAxZW5xlcF2bti6XHUwMDE5YFx1MDAwYlx1MDAxY1x1MDAxZCzgXHUwMDFheGBcdTAwMGIyvvJcdTAwMWFVKa6fSrsrp3HauLm6cn4t0P71U319L7bbhz18lt9fq26/P9Qqg+V4ufnXT8iTjVeGxbr/+utf/1x1MDAxZug99Vx1MDAxYyJ9KafkaClientKafkaBrokerFilter 1Filter 2Filter 3kroxylicious_client_to_proxy_request_totalkroxylicious_client_to_proxy_request_size_byteskroxylicious_proxy_to_client_response_totalkroxylicious_proxy_to_client_response_size_byteskroxylicious_proxy_to_server_request_totalkroxylicious_proxy_to_server_request_size_byteskroxylicious_server_to_proxy_response_totalkroxylicious_server_to_proxy_response_size_bytesKafkaBrokerKafkaBrokerProduceRequestProduceResponsedownstreammetricsupstreammetrics23017Kroxylicious230172301723017+1+size(m)+1+size(m) \ No newline at end of file diff --git a/documentation/0.20.0/html/images/oauth-bearer-validation-seq.svg b/documentation/0.20.0/html/images/oauth-bearer-validation-seq.svg new file mode 100644 index 0000000..96b5e8f --- /dev/null +++ b/documentation/0.20.0/html/images/oauth-bearer-validation-seq.svg @@ -0,0 +1,4 @@ + + +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nOy9aZPb1rZcdTAwMWX8Pb/C5XzJW7xuYlx1MDAxZe5b+YBcdTAwMTkgiJFcdTAwMDQxJClcdTAwMTcmYlx1MDAxZVxigFx1MDAwNIhU/ns2ZVtqqbtlSdY5x/dGdNU5LVx1MDAxMiQ3917rXHUwMDE51lx1MDAxZfC//8tPP/083fv053//6ed0icO6SIZw/vnfXHUwMDFlz9/SYSy6XHUwMDE2vIS8+/fYXYf43ZX5NPXjv2+3XHUwMDFm3vFcdTAwMTR3zW/vSuu0SdtpXHUwMDA01/1cdTAwMGbw759++t/v/lx1MDAxN7xSJI/3XHUwMDFlbEtrXHUwMDFhUVx1MDAxMTJhrtHDL21wUdd3b3130Vx1MDAxZo1cdTAwMTnSeFxu26xOP7y0gOdRlHxcIjCcwimSQlx1MDAxMVxihfH3L9/By7/AMP1cdTAwMDRjJElTMIRQJEyT71+fi2TKwTUwij/BOIZQXHUwMDEwXGZDJIzCxPtL8rTI8lx0XFxDQ080RFx1MDAxMVxijWIoQlx1MDAxMCj6/pLf2vTvP0Hvn1x1MDAxOaehq1Kuq7vh0fD/XG6nj/8+NDtcbuMqXHUwMDFiumubvL9mXHUwMDFhwnbsw1x1MDAwMfTTh+vORV1cdTAwMWam+7tPXHUwMDA3fVxy+vXnT77D/f1cdTAwMTcgnzz/1rvAl2Z5m46PsYDfP9v1YVxcTI/egqFcdTAwMGa/4tHCXkneXHLb//rQpiFsUuUxbu21rt8/XbRJ+lx1MDAxOI2fI6T96Ova5Pev+2PQP4wo+vsz/+dD49P08clcdTAwMTSG4ThEUlx1MDAxZn7Vh8CDIVx1MDAxYf70ab1r30UhXHUwMDAykTiJXHUwMDExXGL6YYiLkVx1MDAwN+E3vfvYc1iP6YdBeLRN+DQ0n4fnR9E3pcuHkXlcdTAwMTa8UnVFz1x1MDAwM4xBfkDdzX2LKa13+fn9df/n978+dOC1T8Lf2lx1MDAwM5M4jFIkXHUwMDAyU1xi/iFo66KtPu3duourXHUwMDBmP+G/POu0T1Lp9da8SKWPfsxvWURcIk9cYkEjXHUwMDE0gYJWUVx1MDAxMPVpXHUwMDE2QehcdTAwMTNcdEMwRUNcdTAwMTBcdTAwMDYugrFcdTAwMTdZROAgQ0hcZsFohFx1MDAwMONAwS+TiICeIFx1MDAxNMVgXHUwMDE4JCRcdTAwMDI+XHUwMDA2+5FEbyWR9HpcdTAwMTZ9dP3v6Vx1MDAwMtNcdTAwMTiKg1GDXs1cdTAwMTdcdTAwMTBlb+VcdTAwMGJcdTAwMDHRXGJcdTAwMThcYlx1MDAwMv6WdPmziCa+XCKiP1x1MDAwNOgjMEFcdTAwMDeo4blcbv9ny9XFx2PZtdOhWN/lOvZcdTAwMDTBKEpcdTAwMDCooCiaxp593+MqMWyK+jFcdTAwMTj4R5/N1EX26JWfY/C56fDz856ZXG5AXe8vaIokeU41MfjQsGjTQflcdTAwMTLO6oZcIivasD4+/z0/ffpzwuvU2en421x1MDAwZpqGa/q8y1L5j6yBn1x1MDAxMPwzOZ9cdTAwMTVcdTAwMTHpnlx1MDAxNPTWOSxcdTAwMWPSv+7GW3v7YvpcdTAwMDR5+IRcdTAwMDNqpHBcdTAwMWHkLPJcdTAwMDE5fydP8lx0g0lcdTAwMDJCKVxuxWlcdTAwMTj60MvvyZMknyBcdTAwMWMnSJDxOEnDXHUwMDFmgvB92lx1MDAwM9z4keivJzox/2W2xGBcdTAwMDKhXHUwMDEwoFpeZUuS/PTpP7JcdTAwMWangZBB0GdK5lx1MDAxZk6WtSXN5LmUVllum1x1MDAxMT70K6SdvoosXHUwMDAxd5D0d1wiy9db81x1MDAwNWRJotRcdTAwMTNK4KDTKZRCSYr6NGngJ1x1MDAxYVx1MDAwM1wiXHUwMDExQTBcZkJIXHUwMDFjfZk0XHUwMDE4/Vx1MDAwNPhcdTAwMGaBXGJcYsdcYupcdTAwMTlEP1x1MDAxN5xcdTAwMTBcdTAwMGVcdTAwMDQpQVwiXHUwMDEwgFSa+JFCb6TQ8jVUXHQgXHUwMDBlyHicfi1ZkJc59EeykDBcdTAwMTgrwJXflCyfjWdcdTAwMWEnviaeX1ClXHUwMDAxWCRnUzCSw/9sT1x1MDAwZvNcdTAwMTVOoOH/s1x1MDAxNYv6I4r7+5DnnzDWp+T5xb/w+/BpeNCOpZ1ziD/sPelcdTAwMTJGWkvIL2GhaMLsXHUwMDEzLlx1MDAwNYL2iVx1MDAwMlx1MDAwNlx1MDAxMadcdKCU8WdG5Vx1MDAxZC7gyFx1MDAxM4BcdTAwMDNAp1x1MDAxNISDXlx1MDAwN4n/XHUwMDAyXHUwMDE3XHUwMDEw8lx0oDJcdTAwMGVcdTAwMDGziqA0RsOvXHUwMDAww2eu+VNkeDXrvz86YJ88/69Eh/tXoFx1MDAwM/AtXHUwMDE0SpDPKPFcdTAwMDM64PiLZ/9cdTAwMDBcdTAwMDdcdTAwMThHYNBUXHUwMDFh+TBcdTAwMTLfXHRcdTAwMWRcdTAwMTBcdTAwMTRCqOdR/KXoME7hdFx1MDAxZN91eXhLk49cdTAwMDbxt/76XHUwMDE5RGmSkilCQcDYUSiN4uhcdTAwMTlDqTOFg7hC8ZRcZmNcdTAwMTRPIPzZIINcdTAwMWNPP2L/94NcdTAwMDb+fEHe8dD1vzf3M+mWcllcdTAwMTQpbZRcdTAwMWSp0EqS9lx1MDAxN5HXpS+Wr/CjvEPjXHUwMDE0RpDAvOIohH2cczCMP1x1MDAwMZijXHRcdTAwMWPYXHUwMDFjXGJcdTAwMDV251tcdTAwMDQsRT+BrFx1MDAwNS5cdTAwMGLBYYxcdTAwMDB4+YOL38i29S/LWVx1MDAxOFx1MDAwNt1cZtHk61xmTX6m+IO8K05cdTAwMTD/xOJcdTAwMGa3xnZoxPt7JcpcdTAwMDPqcyaUi8JX6VlcdTAwMTikXHUwMDFk9KHFf0nPvt6aL9CzoMvhJ1x1MDAwMsdQXGZ78FxuSXziXHUwMDAyKeJcdIhcdTAwMWZcdTAwMTBcdTAwMWVcdTAwMTiCwFx1MDAxME2/TCFcdTAwMWN9XCJcYlx1MDAxNFx1MDAwMCBcZtRcdTAwMTVNYdjLXHUwMDFjQoGeXHUwMDA1XHUwMDAwXHUwMDBiMo1EXHRcdTAwMDRDkVx1MDAxZjn0elx1MDAwZZHQVzBcdTAwMTaJIyRcbqOvZ1x1MDAwYkphb2VcdTAwMGJMwEB/YM/T7PtQ1ldcdTAwMDf0XHUwMDBiQftbrYR9jMLfUr3+XHRhvV76+fTnfFx1MDAxZqnqwmqdwafpLlx1MDAxZlx1MDAxN/bXq9sraox9kVSFXHUwMDExXGZ5XHUwMDAy8Vx1MDAwMdQqQSMohXzqYSFcdTAwMWEgXHUwMDAyyHVcdTAwMTilIcCJ9CuFXHUwMDFm/ImkIZhEaWBTgZpFX5k1QVx1MDAwMPuiKErTXGJcdTAwMDFCjVx1MDAwNFx1MDAxY/2306rwJ8+/f1fSTVP6T059+MtTXHUwMDFm5DxcdTAwMDZT8GtVXHUwMDFm0OFv5T3IeZjAKORb0v6jVrxMfJxcdTAwMDbg/lx1MDAwZtKqUESfz3CMXHUwMDAyqMPgXHUwMDEwiYiYTHDASDGOY1x1MDAxMXWOafCzkPQ5cv5DtGp/dK3JXq2k7VI/b5PpfPCbr5+ppIFcdTAwMTJcdTAwMDWJ9bFUJYB5hDBcdTAwMWG8SqAgmV6rtP6YpvyOqYa+McPyNVJcdTAwMTXgXHUwMDFmgULkS1H6ePG5xPkkXHUwMDBiKZimUOSbkvBcdTAwMWKVaiiFKXtcbnZHelx1MDAxNmn3Zlx1MDAxYprL5F83TYlcdTAwMDJz/J0qr6+35lx1MDAwYpTqh2lKXHUwMDAymD5cdTAwMWH+uMJcdTAwMDI84Fx1MDAxM1x1MDAwNlxcM0FcdTAwMDFcdTAwMGKPofSPOcp/bFx1MDAwNp2+QqiCQcFcdTAwMDG4Ua9cblVgXHUwMDFi3lx1MDAxNKo48piUponvXVv56nh+Xaj+nScp/4Su/pmTlKnXJMk6XHT0nuxgLS5FXGZSXimqfmaSXHUwMDEyRCxOkVx1MDAxMFx1MDAxMKb4M1x1MDAxNflcdTAwMWJzXHUwMDAyJUqBl1FcbsdI+Fk99EeJ57eB/q5pj39cdTAwMDfiRGlcdTAwMTKM1cuVPO+QXHUwMDAyfpM3YVx1MDAxYcJwgPD0P7HGU56mX0OWRTGOYHn4fkRFKW/+Zcz5emu+gDlJXGZ/XHUwMDAywY1cdTAwMDHBXGZwmPykTlxu2PRcdCWA0aNcYlx1MDAxYSVcdTAwMDD7vVwiPrEnXHUwMDFjh2lcZlxcRNKvT1n+KPH83qY/z6GvoU4wKjBcdTAwMDZhL5bx/Macb89KXHUwMDEwKExcdTAwMDHq/Dsy59At97qIi1x1MDAwZfi+vyFx/lx0W70gzld/zvchTlx1MDAxYrF96tfi1yva7PFf6zqWlI74wtlI4Fx1MDAwNUHaYziMkFx1MDAwNEZ+vKKPIKgnkqYhiKJwXHUwMDE0hV4hzVx1MDAxZnOR3z3tia9Je1x1MDAwNFx1MDAwN3lGXHUwMDEzxFx1MDAwYmn8XHUwMDE4W5T69Nn3aVx1MDAwZkNcdTAwMDTQODj13Vf1fXPa/8eZjIxcdMG8sLHDXHUwMDFjOkh1XHUwMDE3dTaFZPpimfphMpJ6OEzsXHUwMDEzd0qQgEFcdTAwMWbuXHUwMDE1I0nkxzzkPzTTqO8gUmmaQKBHP79GvFx1MDAwNPTmslpcblx1MDAwMWNEfeNqgG9cdTAwMTSpl5tH3FU42c8lOdJ9xvV+9a9cdTAwMTOpr7bmXHUwMDBiROqziUichIHI/ESkkk9AXHUwMDE0PNQlTMD0ayn0Y1x1MDAxZfJ75tDXsNWjdFxyevPlzMO7XHUwMDEwQ6C3klx1MDAwNXtMXHUwMDE4ojT8TY7uXHUwMDFmX975XHUwMDFiz0P+XHRX/TPnIVx1MDAwZqKgSGOCXHUwMDFjuTvOnJY66W72/ivnIXHQl1x1MDAxMI1+WtFFn3CMXHUwMDAwXHUwMDBmXHUwMDE0I1HqxyzkPyXxma/Ie1x1MDAxMPhcdTAwMTBCQC9t6G+j9yZHkiSKQdD333ryj1x1MDAxNKl/k1lI1Za7Q1x1MDAwMJW/Srt51sJ+zEo/fpltj1x1MDAwNP442TBcYnuiIFx1MDAxYaEoXGLoU1xi+WRcdTAwMDbyXHUwMDE34OZcdTAwMWXVIYyAQD9CNIZRL9LtsZpcdTAwMGVcdTAwMDbOklx1MDAwNlx1MDAwNFxmY1x1MDAxMIG8YlxugcJ9XHUwMDAyl+BcdTAwMDRcdTAwMGVToGee6ac/Z9g4TbAk/H8m09gvVanImyqVXCLgx6pcdTAwMWL6VZtIvJV/NI5CXHUwMDEwiX9cdTAwMTPtfn5cdTAwMWRcdTAwMDDQXs9rVV+RgX1XfCqCP/z104egefeP93//r3979epf3o7Ux+NFjH74vFx1MDAxN1lZh+PEdU1TPOLDfDTyXHUwMDA1XHUwMDE4TuEwsWBcXIs2+/S1tE3eeOXdu5hh6OY8XHJfRFx0eN+br/Vdfc/ejfCfSXFMt9ZfXewy60ii4jqat1hcdTAwMTN+XHRWUDD6hDxWsUOPaVb42UKC36BcdTAwMDI4UfhRXHUwMDBiXHUwMDA2olx1MDAwZlx1MDAwMX1LvtzjXHUwMDAyeJ1EkHde/q09Lu/Kzlx1MDAxMPrYglxivFx1MDAxNvVsPuBcdTAwMDdS/PQxUnB/XHUwMDFkKXBcdTAwMWG41sfmg9eQ4k2BTqFcdTAwMThcdTAwMDJI4VvM7J9cdTAwMDBcdTAwMDVBYc+2XHUwMDEx/6uA4s0wfTxeXHUwMDA06H9SmLhLU74z6fluhHbt9JBzde7sl8BcdTAwMDSMIMhcdTAwMTNcYiyMplFcdTAwMDRQ0Vx1MDAwYpwgn1Bg50H3gbHGXHUwMDAx5bzEXHTyXHSQXHUwMDExRsOPpcXoayhBQvBcdTAwMTNwiUD+P4oqz1x1MDAxN238QImfPkZcdP6vo1x1MDAwNFx1MDAwMeNcdTAwMTCJ4fBrKPGyXHUwMDE2/d7Go4/VXHUwMDFk9DdcdTAwMTWd/1xmJlx1MDAwMFB8+Nh/mZ54I0xcdTAwMWaPXHUwMDE3XHUwMDAx+p9cdTAwMTQlzmNcdTAwMTaaTcpTIVx1MDAxMvZ5PXXX2OVeokT4+KZPnVx1MDAwN/1cdTAwMDRhj8WLXHUwMDEwjlx1MDAwMsggPlxi00foY08kXHUwMDAwXHRcbiFQXG6gLIR/8Od/gFx1MDAwNFx1MDAwNlFPJPD/JEKB0HzVdjxcdTAwMDRcdTAwMGJcZvTIb1tcdTAwMTg+uubvUNl7XHUwMDEzJz5T2fvQ3u9cdTAwMGJcdTAwMTPCX4ZcdFx1MDAxYyNJXG553faTn1m/gVx1MDAwMlxyQn//xcdcYk1B0L9eS7xcdTAwMTmlj8fL+Py7w8SnmZzWUTd/0VxmXHUwMDAwZbKU5UXRqP3KJJfWyVFccmW+XGIpKJh6XHUwMDAyXHUwMDE09H5v/YdYeVx1MDAxN/yPSt7j3Fx1MDAwMlx1MDAxOMNcdTAwMWUrPV+ZXHUwMDAz+IFcdTAwMTTfXHUwMDEzKcS/jlx1MDAxNI9cdTAwMTNcdTAwMWKAdH5ccilcdTAwMTD07Vx1MDAwMlx1MDAwNVx1MDAwMSPfupnvM/VBXHUwMDE0oiDim3bU/lx1MDAwMIp/XHUwMDA0UKQ70q1cdTAwMDOk3C9SMUZNYqmlZH/JVCHQYk/Uo3yD0iRcdOHQJ/uXgCshSfRRyIRwINnoV0qZQOc+UUBxkFx1MDAwNHC4j3L0K5OFz+atfiDDx8jwNVx1MDAwN1RcdTAwMDFcdTAwMDFcdTAwMGbBMP76Pom3NytcdTAwMDHHSD1WJX7TTPrnXHUwMDA1XHUwMDAzhoKg+PDF3zA9KIdtMuZhlf5kp5drOr6+XHUwMDAyXHUwMDFj/ro5wTo9P/ucXHUwMDE3M4JT1781XHUwMDFk+FHTP537+0xbv89cdTAwMDSgXHUwMDE4U47VntdcdTAwMWQ6qeUvdiTM3PWVTfyv8D1ITurB6ThcdTAwMDaGXHUwMDE5R8mP5/9wXHUwMDEyXHUwMDE4K1x1MDAxMjxPUCj+qDG8QvfoXHUwMDEzXHUwMDBl1CiBkkBcXGLPXHUwMDBlafhQP3hcIlx1MDAxZsuN4Vx1MDAxZkT/mXTe/fXKXHUwMDAxhFx1MDAwM7pcdTAwMDIj+VrlXHUwMDAwpd5esFx1MDAwNowzROA49L3nXHUwMDAygaOkv21H4vetXHUwMDFjvFx1MDAxOaKPx/Pg/M9L84uforb565HQeEk3S+GaKVP6ZX7gsVx1MDAxMZmCUFx1MDAxOIVhXGLF4Y9cdTAwMGJcdTAwMDdcdTAwMDRcdTAwMDXw4TFBQVx1MDAwMnYhXHTs5dFcdTAwMDQ/8OH74IP61/FcdTAwMDHYNtDFxKtblrG3T6l8nOqKoujzeeTvhFx1MDAwZo9DZj/0zFx1MDAwZnz41+HD7nKVXHUwMDBlpd0x5Vx1MDAxMmY37/bLxF1ewYeXNoCmoCdcZqFcYlxig5FcdTAwMDf9vIBcdTAwMDdcdTAwMDRwXHUwMDBicFLo4/w2+DVcdTAwMTNAP9FcdTAwMDBCSCAzgVx1MDAxOXh2XGbCXHUwMDBmXHUwMDBm8OegsP9cblx1MDAwZlx1MDAwMMiYgiDgxl7J/udboV+sXHUwMDBmfGRcdTAwMDb8vc/dQ1x0jMK/qWD4mv5cdTAwMWb7rlx1MDAxZNP/IFx1MDAwNuDTxn5cdTAwMWZcdTAwMDdcdTAwMDBcdTAwMDW+WZV9ZDX3XHUwMDBiJrk9V/2iv7Io6dW5XHUwMDAxXHUwMDA0kPijolx1MDAwN0NcdTAwMThcdTAwMDShn1T8XGL6XHRcdTAwMDba/0Hz70p+r1mAXHUwMDFmXHUwMDE1v++X09pfr/jhNE6jr/j6d1x1MDAwM/H2Tm9cdTAwMTimsccx1t/bXHUwMDA3YEA6Yt90XHUwMDFj9Y+a3z+C7EM7xFx1MDAwZVx1MDAxNjZfqqFcdTAwMTJFWzclXHUwMDBiXb6E7PHHXHUwMDAxKCiEgDChXHUwMDAxmWBcdTAwMWZvXHUwMDBmXHUwMDAwY/xEPFx1MDAwZYWgMIQmMJR4he1cdTAwMWbHR5CPRU2PU1heXWzwg+3fRFx1MDAwNv3L2Vx1MDAxZVxmXHUwMDBmXGJjXG5+XHUwMDE1XHUwMDAy3r6BXHUwMDAzXHUwMDEwaVxiXHKGXHUwMDE3+paC32chXHUwMDAwXHUwMDAzufVNUv9cdTAwMGa6Z65TXHUwMDBlvlxisPH0XHUwMDFmoeL3+eZ+XHUwMDFmylx1MDAxZtFfvDPMy4uRyT3RzrK+RF9o6lx1MDAxMfJcdIz1Y/Ug+dit83HxXHUwMDFlpumnx1H0JFBcdTAwMDZcdTAwMTBGvDzFhaaeMFxmJDjx221CXtsph1x1MDAxMk/QXHUwMDBmQ/+5bDb+Ms8jMIQ+hNurS4Xwz1x1MDAxMP1jg1x1MDAxY40+P/7hO2U5XHLCXHUwMDA1fVx1MDAxZcv/XHUwMDEyolx1MDAwN+GJXHUwMDAyM4pTXGJcdTAwMGXTXHUwMDBm5/lcdTAwMTHR0084XHJcdTAwMTFcdTAwMTBBUFx1MDAwZqtcdTAwMGY/J/rXP+5cdTAwMTfoXHQoXHUwMDAzoFx1MDAxZVx1MDAxZTc3+lg1vI/y/7xiIcuoIaV8IZ4rx7baSrGI2ytHXHUwMDFjvlJcdTAwMTlA0SeYxFxiXHUwMDFhQrDHWf1cdTAwMWZBXGZcdTAwMDK0XHUwMDE4MJaP82RcdGD+n6+Jfa9cdTAwMTVcdTAwMTD46bGw/ve3Q892Jv1cdTAwMTBcdTAwMGJ/XHUwMDBlL9aXi1x1MDAwNYQgKfKxKfpcdTAwMTVcdTAwMThB3kZcdTAwMTFcZqQ7XHUwMDBl1OD3X3KI0Vx1MDAxOIr+pb2Dt99OqU+PYFx1MDAxNNr/9v/9jYXCmy39Plx1MDAxYeHkXCLmXFxcdTAwMWSdX6SsZ1VLy6SMLV6m71snJpLw0yNHYVx1MDAxNMWQh236uLyHPMr/XHUwMDA0RlFcdTAwMThcdTAwMDGD/57NXHUwMDFkvi9ccoBcdTAwMGZ4bFx1MDAxZiQxYFx1MDAxN17fg1x1MDAwMEPYXHUwMDEzjlx1MDAwMiiGXHUwMDFlp4xhz/dcZv/I6Y9z2v5SyfD2nd0oXHUwMDA0fSykf3VcdTAwMGLC24dcdTAwMTVTXHUwMDE0XHThjynib1x1MDAxMVxm71v3VTvqXHUwMDExXHUwMDA1WjnVoymit+Ff9r1cdIWn81ftqMdB0FFfs9ToM2n0emu+gFx1MDAwNTFcdTAwMDJ6onBcdTAwMDQnSSC3XHUwMDFm9/r6OINQXHUwMDE4enoshXhMreOPw35f2cZDI1x1MDAwZpFBYiREfiRAftDgl6TMVyyTXHUwMDAxelx1MDAxYVwiXHQwVK+5Zvwzi2pcdFxm6Gma/P5EiNMw/V1t82+15/9WtO9o55fpQTrfhVx1MDAxZP/qZvo/4ak/sdd/8rO+XHUwMDBmlark/Zc1/8WlS6bY98gq1ljyilx1MDAxMn6DSnHocT8pkoRg+N1cdTAwMDE71Md7f1GcekLgh6BCYfL5KVx1MDAwZX/AXHUwMDAw9ISSxFx1MDAxZrvsX4eBty/5gVxuXHUwMDFmo8LxL1x1MDAxM+mjdEIgJPZcdTAwMWFUfOY+NVx1MDAwZn+MPFx1MDAxZt7vhlx1MDAxNI9Ntt+J7H6l9TtFso5gV6XXKzoq6TL+JWSHUuhcdTAwMTOCYjBN48jLslx1MDAxMuitJ1x1MDAxMiVcdTAwMWbzSCSGXHUwMDEzOP6K58PIJ6BQKJREKFxi+bEk9CvD2vmK6WDy3Vx1MDAxOaBcdTAwMTD6qlx1MDAxMnz7Ji/AXGLgXGLxTTf4/ZNcdTAwMDDGMFx1MDAxMv1LXHUwMDBiQovzT//j9v7uZOCiolx1MDAxZf/X39j5/Ul7v1x1MDAwZml1S1x1MDAxNWOmXHRcdTAwMWSjSlrl+KLsfuG+bFqYgsgnXHUwMDFj5CxcdTAwMGXhXHUwMDA0jH96Vlx1MDAwNYpcIk+PRcU0XHUwMDA2XHUwMDExXHUwMDE4XHUwMDA2/VhcdTAwMTj6XHUwMDBmS+o3XHUwMDBlgfqaOvHDOFAo9bKW84j5t1x1MDAxN36BcaHJR/Htey/8woEhwv5cdTAwMDZbSn8s/Po5NTBXjdG7wplk61x1MDAwNcL5XHUwMDFj919+9zeUxJ8wXHUwMDAwXHUwMDBl0MNrYzT88eZzIFx1MDAwNJ5cdTAwMTBcdTAwMWF6rPXBwcvQy12lNE48PWLhsYNcdTAwMTBAXHL22r2LKeRcdEhcbiBcdTAwMDUwmEJx8tm9jf5AXG7iXHRcdTAwMDFiXGZcIlx1MDAxZseckVx1MDAxNEV/euLo/6vI4f5llYtAMFx0PSb7X0OO58dcdTAwMTN9Klx1MDAxM2BcdTAwMThcZieMU9/xnPDfXHUwMDE3MquXxOZcdTAwMTZVmeck7bH9sGDz9eP60cec9v6VL6hcdTAwMTiBXGJCoa/RIJ9JLGv0horDXHUwMDE1WSuLI3aRLTJOvvyu4DjyuP1cdTAwMTNcdTAwMDVcXFx1MDAxY1xmXHUwMDAymsA+VtI4XHUwMDA2PVE0XHUwMDA0Y1xiRtEkhLwk31x1MDAxZm7xO+aR/5fzXGKGUVx1MDAxMqVcdTAwMWXHyr5mXHUwMDE339yDXHSj0OPG79+0X/uz/Fx1MDAwYmhcdTAwMWT7msWXn4nzxsdcdTAwMDXvypeKyNkrJqhtLyOvTDC8Ylx1MDAxNmn0iaJQYKRJXHUwMDAyeSdRPiZcdTAwMGZcdTAwMTRwM1x0vduZXHUwMDAyXkZeO21cdTAwMTTYTZymKVx1MDAwNHm3XHUwMDFhiaB+LFx1MDAxZf6asFx1MDAwZb7cLVL0YzM49OrSYejNXHUwMDE5QvJxp1x1MDAwMvybilx1MDAxZJ+LXuIxJ/yX7nD4ifNcdTAwMWGvcVxmfud/JLP4SpO/j1/8PL9+/uBcdTAwMDDiicZcdTAwMWU3RIBe8Ys4Rj9hNPSY60dcYlx1MDAwMiZe8Ysw+thcdTAwMGX8OG2GRkDGv+JcdTAwMTdh5Fx0UFx1MDAxZkFAXHUwMDA0XHRjgFx1MDAxY+lcdTAwMGZcdP8juT9O7vBLOeszx5WhXHUwMDBmXHUwMDA1gr96M+7nt+V6MVx1MDAxZILQXGL50VTW98l7oM6en2Lwr3ONb1x1MDAwNerj8TJEP3zeXHUwMDBiXHUwMDAx+lx1MDAxZL3js4FNf+tO5Vx1MDAwYvzdO0yLr1x1MDAxZlx1MDAwNeIj6MLHKahcYvlEoFxiSGmYgGj6IVx1MDAxNl+Gyj/HpGq71HHtk6BcdTAwMTN3xcR27U6eufKLQFx0RmBcdTAwMWPoXFyMIFx1MDAxZXd0JDDo4+lXXHUwMDFjolx1MDAxZbOzKPo4VVxug/CXS1x1MDAxZFFcdTAwMWH0XHUwMDAyRJPUY5lcdTAwMTL6fMnzh6WO8Fx1MDAxM1xmkcDFQlxihb5bI/ZcdTAwMDOV3kCl+K+jXHUwMDEyXG5SikRg7NXjVt+uZT3OtsJcdTAwMWZa83uLkcdccjL+XHUwMDA2e1x1MDAxON+M08fjZYT+c0DpX1HQslW9bO5T0Syccb4jxzRcdTAwMWR27Vx1MDAxN61XpPEnmqAwiCRcdTAwMWa7ROiPt0HhKPXYXHUwMDA2XHUwMDA1vFx1MDAwNog/XG59XHRcdTAwMTQgXHUwMDFl3k1d4VxiXHUwMDAw/dfPZX7Fi/woXb1cdTAwMGVcdTAwMTTpl3tcdTAwMTPAtVx1MDAxMPr60SYvT0L44KxcdTAwMWZHZsLUN210+PxEXHUwMDE2QWNcYvyXJrI+Wtww/P03N/5Je7/T6lx1MDAwYtr5VaS1msasm97sh8ZZbPJcdTAwMGKNXHT0RMOPVTpcdTAwMThM4J/ub8RI6Fx0SNaHVCNcdTAwMWaHUf840OxcdTAwMWab2ee/LFx1MDAwMVBcYoxcdTAwMTJcdTAwMDS9vlxc+eXhXHUwMDA272vSXHUwMDA0ilx1MDAwMeT+7uVcYlx1MDAxMsJcdPTH7sa/jVx1MDAwMNBVXHSNheI4wdBcdNvhJ6W/Mq/cQuxcdTAwMTVcdTAwMDFAXHUwMDAwq/A4Vlx1MDAxM6cx+vk80zuYwMgnhERcdTAwMTGUREhcdTAwMTKh6ZdcdTAwMGK0fuxt/OkvwEL2XHUwMDE1hFx1MDAwZvxcdTAwMWNcdTAwMThcdTAwMDfs1Wrky1xu+1x1MDAxZvlPkFx1MDAwNHgn/P3zXHUwMDFmeMdcdTAwMWZbXHUwMDFiv53t/8vv2PNz2PeHXHR85ns2+PlWpDP7Muz/6/nd4zG191x1MDAwZVx1MDAwMt7dIeZcdTAwMDOJfPm9XGY/0M7PTdGkx+e3Sdr27bOY/FxyWr7+JokgVkLH3j/e/Pjz399/9P9cdTAwMWaFY0pg/1acWMOeIVXKOlx1MDAwNjz0g5NcdTAwMGJOXHUwMDA2/lx1MDAxMlx1MDAxZf9kXHUwMDE5jvHB/3OX0JPTxzOMp1x1MDAxZmxIYYZcdTAwMTGLXHSLYfhcdTAwMDLf2YLopFwimbjz5NS646KloWSNgc5Wml1cZlMhYDxnXHUwMDBmrun2YTHcOImIvC5cdTAwMGVPVsQ5XHUwMDE34nKiqs41XHUwMDA31u0uXFyVhcdEXHUwMDE0XHUwMDFhqvGLQ6VcbqqIWszZl1p1nmVRrLJCzNl+1Vd461x1MDAxZKVcdTAwMTavt8Fcct+m+nFcdTAwMWGM073h263hJttcdTAwMDDf0PS2RbaN5/BcdTAwMGVSQod8uzurpztVe1x1MDAwN7irJXhnUEU41dWQwOmFi/qisbHQSlxcz7lfrmHBjN5+WJDr5Sh0xOVS9JeoIZpxXHUwMDEw5m2vXlx1MDAwN3WtSIM2sDg1lZWibzfC5DHxdJmiS5iEpVx1MDAxNSr7+WrR9uXxXHUwMDE0uNy9LDRcXHTMvXRCXHUwMDE0u6iHtb3dzufU4cJ5OO3Yc0p7gkmgt9OWXHUwMDFkwpQmLZJ2JlqIzi5614hmj7lSPu1HJDLTIURouV6ck2mhjFx1MDAxNoYtSW+vQerB63RV6Fx1MDAxMzmwntRcXOOKmfm8XFxIfVt0uVx1MDAxMlx1MDAwYumcYSql8qQpopDVT6Gtm3jYXGZcdTAwMThWjyFcIlFcZpycPVx1MDAwZVxy+b6yZXtDmWct265sn+95iC/TiT9pqGdVXHUwMDE1g6lrK6L45pwgRHJGTmbThXqBMlB/T87TeVx1MDAxM/fphcaJalv0spRcdTAwMWa7zjpP5Fx1MDAxNXLByFx1MDAwZlxmU8r4XHUwMDE1RCpU44tGb7PgyOr2oKsqXHUwMDEyXHUwMDA3I1x1MDAwM+LieJ9cdTAwMTf8klx1MDAxY2pSrlK4XHUwMDFiXHUwMDE2KoX7XHUwMDEwyVhcbt9sb2fUXGYnLt4mooHfXG5ll6nqukvrXHUwMDE1XHUwMDFm70GY3lx1MDAxYVWssSkvXHUwMDE4SDw0nS+wclx1MDAxNd0t57pZ75fCjfRcdTAwMDZcbte5UOqidJP6mHgurFx1MDAxZmgonTGjrHAnPVDpsd2YXHUwMDE5rVx1MDAwZtH90njSZeSZ1SyJ1K37kJZNYmPm1nxccoUkUFx1MDAxOGTvl6PnRTfYXHUwMDFjUTumVfe0luawOclEQt70WbDXclx1MDAwM232hEvWfDyo96qHXHUwMDFkXGYxRt6yWeVuXHUwMDE21E1bY6g27nGNJCXcXHUwMDA3YSjhc3NcZqp7nlx1MDAwZVx1MDAxN+JaWp1jxlx1MDAxMaE3x1SVrnDtrE1cdTAwMWJNVzS6Q1x1MDAwZZ+Zxuq7erxt64ugzzSnn/yTgJVte3VwXHUwMDEzXHUwMDFl11x1MDAxMIvUkdJ6V5RL2ZwsTlx1MDAxNlx1MDAxN+rslVsnaqjdpsbF8STqx4q+icVcdTAwMTLj4O2dyFx1MDAxM+CXujGOSVxmxJUtxqQ4Wd2PyF5Ta9doXHUwMDEzV95cdTAwMTRXWDZcdTAwMDTkyGr8IVxit1xygJ1MME9cdTAwMWV/XHUwMDE0XHUwMDBllD7I+fl4xNNcdTAwMTGK5C5TbcpcdTAwMGbctjyaZHpcdTAwMDLxfEL9RCGyJTeMYYhqXHUwMDE29NtcdTAwMTaJm1x1MDAwNpXgyy5qkn10Xq0rWrjLZsfOvDTAyNWzx8A4bFxiXHUwMDE0mrezJVx1MDAwNIzOMM6mm9jcXHUwMDFi11tcdTAwMTIs58t16+HHcOuLMXlcdTAwMDbWN1xuUGKPake3XHJcdTAwMTl2XkZcIjXOZt5XSCTK7NmnccxrWY1cdTAwMTSXMo7a01JcdTAwMGKaoaOnXHUwMDFjqYOTeHA2XHUwMDA3jaFxyWn2WVx1MDAxNMyroi60XHUwMDA14fziTVxiXFxO9NTqYcheesOg2kBcbjSE0fbyQnlT3rriiqXs6Fx1MDAxZeNzme52XHUwMDAyplx1MDAxZEN0bzopmWyoXsgsXHUwMDA2OuEh0uNruj1fcf/gSTdW8YTNLcHSwT7cXHUwMDBmNXouPEdgji2Jb5JkxStLmFukm4szssl2ZFrtMMmhW9FF07FxXHLB4v2tXHUwMDBmRVx1MDAxOIWz9Lm5XHUwMDAyQeTBp1upLCo9mYJlnlx1MDAxZvd4srM5VOTSYlx1MDAxOZev6U25KfDYOOnGPrDRafBcIlxi4ecrXHUwMDA0X5ZcdTAwMDDa9odUOXKcwvPIqWk7wihcdTAwMTfUhzujgouDbbCGJitoNiuYQapLxsZcdTAwMWO/+qZ5x+Px1FFKyzlcdTAwMDElXFzP5Ix68saLXHUwMDAzTclcdTAwMTEyWeHLZVJviaNkeobCmzzbnjdcdTAwMWHDXHUwMDE26Vx1MDAxOb5cdTAwMDdb2mJcdTAwMTRjX24nL8H6rEfZve03einBRLpccpTSzEe22l3Svr7S6c3btlboXHUwMDBiecBhV8w0rqRzOelcdTAwMTCpZ8t9vO0heFx1MDAwM5egT1x1MDAxMoTd4mF/usD3WmakTpz46V6clGEvM4FVoWa8tr6km/tcdTAwMWKUhMYx64JD2FRcdTAwMWSCXHUwMDFhqJm5Rkzu7idUQGbMXHUwMDFm96JRjpZcdTAwMDX44HKYXHUwMDAxXHUwMDFlXHUwMDE4JX/2XHUwMDA2dKtG4ZFcdTAwMThVRqp3h2T1sEbn7eou5zfIXHUwMDEztnvjNlFLXHUwMDE3UulSoq6PNSGTnVxmXG6a0nJcdTAwMDefQ+SKzzNlXHUwMDE4gEG7mEr8u2lvXHUwMDE5dtGvJFx1MDAxY1x1MDAxOOo51lxcVapcdTAwMGb4ebNVKbHYXlaz8kNHXHUwMDE0j9M5XHUwMDE0R/bsTtxASprDXCJSk28ovj76MVx1MDAwNmuCrMidkFxuapylwlW7y7d4f1x1MDAwM1x1MDAwNCPLyOBcdTAwMWKRq+qeRy3mbVx1MDAxYWlcdTAwMDTidy5cdTAwMWFerlx1MDAxNK9e78m8bDt9XodIvVxyhqklZ9WQiPlqKEdcdTAwMTj4iFvGVFx1MDAxMN/pgjCcqqjZbuHG3d892TeD45JcdTAwMTVjxzGzdmB3OotcdTAwMWaZ3IHiXHUwMDFj9sNcZlx1MDAxMVrXXHUwMDE1aeni6HR0XHUwMDFlYN2qiqjVjjinYVam6Vx1MDAxM32i82NNXGJmXVKb5Dy6iphcdTAwMWbXTUKexFOZ9/hMJnlcdTAwMDZFoXmM1Vx1MDAwMPJFq7g4XGayXHUwMDFjXHUwMDA0ZW4wNiH0slx1MDAxNq/KUULmdj1cbog1smws+5WgrSO6b47YlsymRuBdTpG26ISniUNcdTAwMWFlfyqXXHUwMDE5x6b9XHUwMDA1XHUwMDBlp/ZcdTAwMDRcdTAwMDeudEU2XHUwMDFkgzI1WYlpVK9cdTAwMWUwTrGjkYwkzmg7lrZcdTAwMTS4t8hr2OtZovh0O1x1MDAwN1x1MDAwNdsxgjJG0qLJPLxtyU3slFwiddR1f6/fy3xDXHUwMDA3Ln1D12GBrOqa51U3J2N2VXjl6umoh2w2d7dib3fpXHUwMDEwZ/jmoFtBjexcdTAwMDPFZfe0XHUwMDBmXHUwMDFi276jeURaLlxifo2ux1x1MDAwMmv3XHUwMDEyQl9cdTAwMDdhT4FQO8nzzFx1MDAxNPvzmSBcdTAwMTDKOXr9OI86XHUwMDE3w5Hr8dWowFx1MDAxNauUW1x1MDAxZZ1cdTAwMWTW2u1zy1xi2KO3u4+TpFfSXHTzjMRcdTAwMTiDLstcIt537aw/a77tW4jEZXtyc1x1MDAxYlJcdTAwMDH2mz3tXCLOvdpcIr682a5wMlx1MDAxNlx1MDAxYZHeRCrU1N2NNVx1MDAwN1R0ryHmMIyqT+qYZFUuXHUwMDE2LcP5iqZVduVcdTAwMTVCtO+D+6RcbtvMbU5622aS0JIkSLmyNVJcdTAwMDbWJIKp75vpjGq0SCRcdTAwMTFUcFx1MDAxZE256mGJj0KuSuNUplBpXHUwMDE0OsMlXGIvXHUwMDAxZDRcZp7V8lLUeXPOWFx1MDAxMXNcdTAwMDXQU6yjmUlcdTAwMWW58myUW1x1MDAxMaI8ZYa4kbhPUbgzx1x1MDAxMluuwVViOm57ldVcdTAwMWHr1yGUz3ZzOG4kzodcdTAwMTkjS+/8glx1MDAxZDaZXHUwMDBm1G2cn4d4xNG4sXlCjm7DnTtZR0+GSL7BXHUwMDFjyVx1MDAxZVe1WTtl8E4qOnW4d8OiXHUwMDExXHUwMDFkgz7TS7Eg8zxj+qi1Zl6QpiXxXGKvmHDeMVx1MDAxNLGIXHUwMDFh2WVcbtZ1VXFcdTAwMTNkUneZJEor9Vx1MDAxMe+DxoCRW6zoW47hM8bDauiaXCJcdTAwMTVDXHQmkl2URDnRXGZyXHUwMDFlnHbfz+KkTVx1MDAxN+9WbSA+LS/bXHUwMDFkXHUwMDA0MWKTtcY60qzWXHUwMDFlp7z0zTzFjYQo7rzYpvt8tCQousLEZb6Hust3TMpEpn+4nPWNlnnXUHGjXlx1MDAxZI9cdTAwMDN318CAkWGRS6G6Ue+Q7WLlsk4hrejWzdlcdTAwMWV0IEJOK1xyb5ykvjOCWsxcdTAwMDSxaSmGv22vNL7dovlcZlx1MDAxOXam+eqOsMxcXMKn23nbTjpNY+uM7fVZRaDlvL1cdTAwMWZza0L39aFIsUEnXHUwMDE0eltx0k5cdTAwMDWK47DCSrxcdTAwMDPJXHUwMDEyaFxyLdSwsFx1MDAxN/MqXHUwMDE5XHUwMDFjjFGko2Z6XHUwMDE4JK9cdHuqZdvd1kyvTsE4KjO+d6qLzt+4XHUwMDFkt7mix7yjk8JcdTAwMDeJ7W1Y1S+DSbMohq1cdTAwMTSh2Vx1MDAxOUnrz1x1MDAxN02wr5dcdTAwMWK7XHUwMDEzQUvDJVLOWCDWXHUwMDA14LvEW1x1MDAxYWbu1UOLRCmMXlxyiTLjVGEwXHUwMDBlyI89b7oopbFcdTAwMTS5pUq3XHUwMDE5XHUwMDA2u7BcdTAwMDQxud5cdTAwMDGgUnWUNJRhWYK6t3zWXHUwMDFlu6vMXHUwMDFl+dwxZ6O5j5ibd6FcXC5SKFx0tlS43lx1MDAxNLuS5NT8yMhcdTAwMGJv3McrPKB3l6IrleR7p62pNTe0k8wumopHcsF3nIYrXHUwMDA3YdVZbanu1iVA5oC5ZNBlj1nHIGWAQ1x1MDAxMUyQ7pdelFxcrl0nMqpr9dB13I1hkTamvVGyXHUwMDE0Ym94c6HFK6tcdTAwMTTSnqtoXHUwMDAxXHUwMDE4tEanWFx1MDAwZell+OCffILR4r3uXGJdzYUk68P2lTGYvkFcdTAwMDPOj5yDuIxuXHUwMDFk9+NBqIjI5vtgj3tAk613itpKflx1MDAwNndcdTAwMTZcdTAwMTac2Fx1MDAxMmM06+rvXHUwMDE5jSOP2Mk9b3lcdTAwMTk1XHUwMDEw14ozlmaKw0Yrsr7fqm7Qs0zqgH64XHUwMDAxkipcdTAwMDGC0F5+KDPdXHUwMDExXHUwMDE5XGI2iHt/Ulx1MDAwN6Lpu3CHL3XFXHUwMDFkMY/Ii3V3zKLdQi42j1aFXGJcdTAwMTLEvlxukjA7KNRcdTAwMWZsQVuyS9XJOCeGnKsrXHUwMDE5XHUwMDBiXCLX9JFcdTAwMWTFKZdB91m4NXg9cdzNrM8nadOfxzN8bMplo1xcXHUwMDEwrUiE1sJmZlx1MDAxNCN4b1Vcct3GMeNcdTAwMWVOo8TEcsKH6q6uXHUwMDAzunb8g1x1MDAwYn5izFB3rMvz3eFM3E1o5lx1MDAxZIZcdTAwMDOSRC5cdTAwMDDMOZ5KcPW55DhEXHUwMDEylskpRuV22sikXHUwMDE3ZNWdya/ZYTtt4jjwWEhaoyosWDhIL5veXHUwMDE3hO1IJpfLsuFVfI+T7t1cdTAwMGLnI3tcdTAwMTDCsO47faqlXGbrNPs0MLvTJlTlXG43jrdsXGZ1XHUwMDE50S/7aFfuMOpcXCp3jec9aJNGlzR21N3gny80wCpccopcck7I91x1MDAxY15u1GW6UrrYK7l2TFx1MDAxY1x1MDAxZnBukTdb0P56WsFjy5mN1UzB1lxidaOQ03KpkFaolorcXHUwMDBi+cFL18Xq4t3Wj+NZjFx1MDAwMnZcdTAwMWSmQySQWIndr4bXmJyyZVx1MDAwM8nWSy0krNHvrC5kZCZcdTAwMDaamdxUmSWlwVxyXCLEmoBcdDyz0/viMvNKuuFEO53Xgm5TVsjdi1nELatywrlNR0R3idrAllx1MDAxZCR95itkdtYkvE5UStImQ9ibzJFzXHUwMDEwQdsvKUZJc1wiOWrT37xcdTAwMWXabknIUlx1MDAwZkGekO18clx1MDAwZXfHZViRolwi+cJs62xOp9XKZLfNjEiyesU58X1677vteUuayslo7ara9VuXXHUwMDE1XGbS1IZcdTAwMWGxu+RWm9WBXGJ72DYvWmCYut1RpY2R2qqVXG6mcFxmXHUwMDE0XHUwMDFmjFx1MDAxM3Gut3dcXIS5RWQ3qMBcdTAwMTZwMF5cdTAwMGakXHUwMDFm61IutLVQ2Es0c/10XHUwMDBiLtxgiTZXhXtZv5FHfFxc/Vxy0JRcdTAwMWHJj4KtXGZbXGbrxu1xRoJr1WtqXHUwMDA1K1x1MDAwMFx1MDAwMdiZ8ZlcdTAwMTi20/hQ0WrRXy47e1+tnpxNTqiY7Vx1MDAxZNqcwn3VV1lJ2dR4kMx6wOFcdTAwMGJBJVJ1YlhOoPy0yYrYvWnMdGglPVWJcjLglM3bVbUtlcxQ51x1MDAxZWhtvKFcdTAwMGXJ6TTfbFx0XG7q83xcdTAwMTRcdTAwMDK3b8hdVZwk6KBzp+CoULpeXHUwMDEz2jYltF17KlDuUp1nOcHu+uHOWVwixuH0bX8nxlxc5bLOJtJcdTAwMTNpy6Taw/41XFzBYFx1MDAwNCw1bXM/rG9TPbGWI56myIWHNod511x1MDAxMqXbNvFvs57EwHJ3yOnKzGdzWNU1RqbU5LI59ia3uFjhVFxu3ETnlFxuj/GOPtfeQl8v4HX2xCm+IXRZhHQ3m8kpgURcXHyRu0A5eMpEkyrkXHUwMDA35lx1MDAwZdddXCK5qtSxolRcdTAwMDSBpYqnrHxv2M7Cpm7g7XD1lCX7vqjBN/PEeN4s2zO538xOXHUwMDA2xid7V1x1MDAxYtvZXHUwMDBlLlxm1S7Lsv/+359VMof0o1x1MDAwMi2CkjBJfFiT85jesNNpKNLby6uezyt8+e2mv7aO+PX3sf72OuLRXHUwMDAy/yNDv9dcdTAwMTHXMFx1MDAxMYbX6ojKoz9/qyOOnpVCO8E7bVx1MDAxYtK8abBcItZl2lx1MDAxMETQToi4s+rBkneHrjruXHUwMDFjYIo0SWSEXHUwMDEzaztcdTAwMDIneLDAXG6Hw66qRCarLlx1MDAxNs9hme+KaE+kQ7Bs9lfJQm7l+UhcdTAwMTPn5lx1MDAxNp/0iN5cYu2VvDRhv1x1MDAxYUqyTtchJVH8ROK363DpSS709TvFVW1PLufgmN6ZXSvZjOv4IZvYXHK1K2WXlYSYYW7MpTOlTcZrXGaZcVx1MDAxMDsyaMNz0mJnen21WDlTsmovjjXhOFx1MDAwNVx1MDAxNotcdTAwMWTf+2w28/pRYHTPuWBcdTAwMWGReFx0OqwyJ1xywkmQXHUwMDE20WYpOVx1MDAxYiHGvYywXGJsa7erXHUwMDA0UzOA0V2LXHUwMDFjSdTN8c5cdTAwMWOaXHUwMDFiJYVXKTtcdTAwMDfNzGRhpVxySLBP73tjlihcdTAwMDNjTPC1x5pMlYQ/M8kync7DrZnkaFx1MDAwM/XkXHUwMDFlXHUwMDEyjq0rZCZcdTAwMTNcdTAwMTVbTdP32EDsTzWuRFx1MDAxMaDmlI9cdTAwMTmOmdJcdTAwMTFcdTAwMTXiSmFvjK9cdTAwMTHkXHJcdTAwMWI7XHUwMDFkQs56kyOAjUxB27FcdTAwMTZb9iqkXHUwMDFm0FHGVdlquXoulV2zXHUwMDFhTMffXHUwMDE0MthMmyFcZumZSNLB2XbHXFxHXHUwMDE5nbnDLVA4wlx1MDAxYcnTYJWuvjTUXHUwMDFlY507XFxPN19cdTAwMDd0wlx1MDAwZnHOxk5xOaHNhTY2JqvtXHUwMDE4jZ36XHUwMDEwklXkZqXsMTPnu2trNlx0demB4PfAlK43gVwiyVx1MDAxM2Hjt03eiVxikDdcdTAwMTN7QLx7umiBiVRn/zReXVx1MDAwN5Mx+5xsPbTd3u4qsen8u9pIlk9UnYRcYoNcdTAwMWQnXGLGQaNcdTAwMTgsfDErSHxMd2NcdTAwMTBgVKhvQi5MjOZcdTAwMTLpc59XktFd2CnnICo1gdhrXHUwMDEz2HMkS6RkSD/ZXHUwMDFhWVx1MDAxNr5IXHUwMDE1c1aJqk3NXHUwMDFlm4HrXHUwMDFidmFuYS4tyPXOZ4dZ1Ej1sLvcRZe9XHUwMDE14dDu8Z2phW6mR301RaB/fSu+tdTd4Ldjd+PkhVuZJE9OlDIsfE4pqsNvOlx1MDAwMzaYleePe4tTxH1w05H8OCeWTXVARVx1MDAxOY1N5Vbeilx1MDAxN9uR7l7j1q58lLs27yvM8vQxXTfMPktnt0hcZnenLShMSfKGJLeXSUdKmectPdR6xrdsnSuFbl2bc3aHu3tjL9aw7HNtr+fVbt5pUD5cdTAwMDR3xs7KXHUwMDAwJ+O23IyRccOroCU6Wtf1dWctXHUwMDBlZ97r7Eqfgzq783vryNDd3i3DyItjdcNhTEPGR8pcdTAwMWWEeZyx/lRcdTAwMWNwpGBcdTAwMTaHmXnlyGV6yOljg4yI26RcdTAwMTBcdTAwMDeE01x1MDAwNVrG8s6z7Fx1MDAwNnd6XFzoeFx1MDAwNpI0/8B3PLBQIbTRR16d7jzGL4dDXHUwMDEyJNtZuzVcdTAwMTE8JVx1MDAxMXHT2qw7T5rkrbxcdTAwMTZydSe5K1x1MDAxMiNjprv4JXb6wU/383Yhx3meh1bfUyW/9ro/Vm5AtczS7ZDsqPV1bOlcdTAwMTHP6IB28cKgNVx1MDAwNEM4eDdit7hcbsyzXFyJw84t8bOMT2RBbVmJPaQ0XHUwMDE3LVxc2SX6XHUwMDE5Xau5iDsz0FRO71x1MDAwNCTUpeZEjTuRKPew2Fx1MDAwNKHfhFxm4U7XezTOQX6Ubq6URVlcYlx0e6t3iFx1MDAwMLqdUUJCY1x1MDAxZVHbK6fdmVPJZUPVJc6Ov0+17+urrzNcdTAwMDRcXFggXHUwMDA17nRcdTAwMWQkcUs1XHUwMDA0pEJTPuWMlFx1MDAxZaglXHUwMDEyq0tccjR+XHUwMDEwxb7PXneZXCJcdTAwMDfg2lx1MDAxNmmzXHUwMDAzgbpHrZBMXCLfyrtGq3tcdTAwMDIxRf8mJHxcIlx1MDAwNFx1MDAwNyVkcbtQTlx0e7+eVumSXHUwMDFkTW3PSY096dKBjUmox0c16nhu5WdR0Vx1MDAxNi7ojJnvXS9CXHUwMDE4n0P11ihcZstcdTAwMTBWsj54XHUwMDE3XHUwMDAxP2SmqbHsOfdYuZBNxtBbzToofqpsuPs1XHUwMDE03ciMbZWBXHUwMDE1/upmp+Ix/Fxu5TdcZuVcdTAwMTRcdTAwMTGslWOteWtn3PayJXXhlVx1MDAwMLlcdTAwMWNCXHUwMDAxx96tYKTSs6rYZ7MxZzhT7lBcdTAwMDDGW1xuXHUwMDE0nlnwxrGQkCW0hcGVfYOYYc/smiPBX27FRVpuzikhnEa0XHUwMDFh0dCuQlx1MDAwNFx1MDAxYqhcdTAwMDF0JadcdTAwMGZcdTAwMTKZbuG7WlwiSbaXp2OzRsuYYlx1MDAwYofuMHpEzFxc97u8UU46e59aXGLOfFxc0SV9n6GUh7FcdTAwMTWzuvvZlNTQplx1MDAxOG6Xk3tbXHUwMDFk81ntXHUwMDAxiXCKfutTl6nG5rrD0WFcdTAwMWKBXn4sJuAs6cDVw3la7Vxu0mNBXHUwMDBlRYdbZIpPWKq87inOXHUwMDE04WFcZsTLPULE2TlUXHUwMDE5gjI3VmONmYNOzd5cdTAwMTNcZi2d7jZ6uC9cdTAwMWKGXFwmyc81iJ3JdD4z6T3UXHUwMDBm1i5lr1x1MDAxMiGaxlx0QtEzNzfbOr5VU6FcZlx1MDAwNrvX8lmA9sWBrIJm2ev9pr+eaW1V5aVcdTAwMTfzjvElJZeg2dXCkk5cdTAwMTmbiK/8ykbBctovXHUwMDExXHUwMDEwwr1l+YPjQHDMbstcdTAwMGKjn269ilx1MDAxYyN+nlNsLoOBXHUwMDE3W0kq4szJhDVuXHUwMDE0XHUwMDE3kv1cdTAwMWWVfMHHKlNxMkOrpjqx8GtcXISX5lx1MDAwZYfanYtmluI6ZqmO9XXOJXa6XHUwMDBm2LbR9YZnXHUwMDAxXlx1MDAxOblcdTAwMDZCXHUwMDFl4GZcdTAwMWTnRi9cZrMwM90pPZdcdTAwMTLa7LmL4/R7rFr5yLGsumRcdTAwMDasXFyaM3ifjlx1MDAxNmuI3fi5TC6l2IE2WVng75tes0VMyjZHf2v6KpSE5XBcdTAwMWS0XHUwMDEw52XI99rI7Fx1MDAwM1ZcdTAwMWTbgtA5PUfi2eJcdTAwMWP4nsIwt5FcdTAwMDJ952tcZlx1MDAwNq2QuGMlKueuKIfA+Ybm0jNykNtcdTAwMGJcdTAwMDNxeGz3kbbuvTa5XG7OKOjpJa7wrVx1MDAxZaNb2lxil2w+ZVx1MDAxME9cdTAwMWZly6nENTezg8SePfbe3NHcsY6tJXulXHUwMDA0R0GtXHUwMDA1N+d6mJBrXHUwMDA0+4dzj1x1MDAxMNeh2+exUkROXHUwMDA1rOpFylx1MDAxMl9tXHUwMDFhaMsmrKy79ir4mqluh81q94U7k4f+elx1MDAxZDU0Si+6fDm4MCqfhVx1MDAwM4RJYtWmZTllWj/iXHUwMDA1wEmuXHUwMDFl4WZcdTAwMDdX7I2Y89ZcdTAwMTJcdTAwMTb5pHSp02VcdTAwMDKA0/3NM6+LkXlHSziHt+G+haBFcrLEzvi9bUCeXHUwMDEwUVx1MDAxNZNtoVx1MDAwZTeX6ZxUt/spXHUwMDE58lx1MDAwYrM7mvi6XHUwMDE1tu7pJLm3VVx1MDAxYXpcdTAwMTlxXHUwMDFkuydcdTAwMTb4qFx1MDAwZVeVq9BbXHUwMDFkXHSWNj40g8htLzVnKHsv2W7dXvWyq4aZh9xrJ3lcdTAwMTI4XGa0qerSJK6a05U3z5U2XHRHazfVyJTNl7CKzJPRq1x1MDAxMVxyXHUwMDE5MkGv01x1MDAwMMlZSlpETYyXI5Ih3v525LNJiFx1MDAwZVRcdTAwMTRsmU7fdlZcdTAwMDHcXHUwMDAxcc/GulwiwXAjYFx1MDAxY7aabsPqXHRcclx1MDAwMXNstnvOWGBcdTAwMWFS4jJcdTAwMGJ5iFx1MDAxZmxcdTAwMTVCllx1MDAwNjptbjm8XHRZKaFcdTAwMDYgXHUwMDAz8el8MuzLhr3A+9XL1M5dboIszUc6cJbIVVBrb2dcdTAwMWTrckHZIClrMpe6XHUwMDE3XHUwMDAwtmfD7dCQZ+5yPdzPXHUwMDFiZ0UsLtx4uZHC9m0mQvLWuKuwqVx1MDAxNmW5XHUwMDBiOy/h7ki6NKeRN4lRqbRcdTAwMTROVLm5VLJcdTAwMTjpY+xcdTAwMTL5nj71nZCQ5+FwR81703IlJtt+XHUwMDE2cOJ6SG498I/GhtvTjp2T4XTibT894ZNglFx1MDAxNtqe6IvfSyfUYvyVXHUwMDA1XHUwMDFkXHUwMDA3upa3XHUwMDE3gOVnXGLbqXMhXWtcdTAwMWT49fBcdTAwMDQrWrHkcSdcZppcdTAwMTdMTJ9b96Yus/TiXHUwMDAyO7VcZlxuwivWNVT0rSdOnWCI21x1MDAxMzxccmtKXHUwMDAwbjsjIcbVvc1C11LfXHUwMDFmmdg79LiEbk/hYYCWIa/4zlx1MDAxYUK+Yom6QFNmZS5Aau0obyNW5dxH+WJvNFx1MDAwMF+X6bDz8lNcdNv8WY2GXHKRyEJ0Xnw79+tOtNhcdTAwMDPqtaBlXHUwMDE3l5PE0l4pUUJPonrzc9SOh4BmMGFzgaR5d21Ktjeti81yYmRT+m3q+VtcdTAwMDZcdTAwMDRySVxym9s+SSZcXEPYoGxccmTrVZxcdTAwMTf6LFxybchbfy9cdTAwMThcdTAwMGJcdTAwMDNt1UDHelarrJiSZVx1MDAwNM6eyVx1MDAxMbzPWqfebFxy3FP8S1x1MDAxNtLsKlE62dpcdTAwMTdGOzFcdTAwMDRvSXPuQFx1MDAwNjo2s3qWjsU+T3XoqJMhp1Cxu+/YWEVWz8dcclx1MDAwMrqMLtedUGKpSyB6pblhMk9cdTAwMTCOWK7MtzyTRilcdTAwMThdxZpcdTAwMDJowG1eQ6qydMfYmVx1MDAxOFx1MDAxM0iOdVx1MDAxNGtvJtHgqlx1MDAwM2gob6j/7ntdelx1MDAxNnxzXHUwMDFiXHUwMDAyOGhwYqemMZqiNVx1MDAwZW/DS+nWhDLi7YJGXHUwMDA1z1x1MDAxNyuRXHUwMDFiXHR+XHUwMDA00nhcdTAwMDZvXHUwMDA3XoJcdTAwMTOHI8mks6Vh8OqJ9MaQfG2MSpM7XHUwMDBiuF/PabE16tZU0uG6PYtHyshcYv4oMflcdDKVgLKso5ljQ+FcdTAwMWZb71ChpX3ij1x1MDAxYSZTxDGRXHUwMDAyk+Tp+b7Z61wiXG4nJkH4XHUwMDAxW+xqXHUwMDA1OCWgWVxuyVI2QlNcdPd1XCJh06vhUixcdTAwMGLtRE9FSlx1MDAwZa63mIi+3Dr7yOZ0SpvwgFFcdTAwMDGQNnHKXHUwMDEwXHUwMDAywEVjXHUwMDFmWlxmUu50KZiWaK/VXHRcdTAwMDZcdTAwMWFTI3Si9dCMnXVRPVOWOG+laFx1MDAxM9+FfZjdrDyLx1x1MDAwNUKvXHUwMDFlXHUwMDExd1x1MDAxYl+Lj1x1MDAwNXqtXHUwMDE3vVx1MDAwYk7pXHUwMDExc3Fo3HR2zVx1MDAxNuioXHUwMDFhU7C9K2pj2bAxV1x1MDAwNsiRXHTGuplcdTAwMDDYc7K4bute7nrD4Krbt1xm4P91rfRSkWxWIFx1MDAwNlx1MDAwMVx1MDAwMXahc2+MwJimmCX3Tj7F9/m6qKt5XHUwMDA1wDyzVzqgTWS7dCi/MSiKrVx1MDAxNHcy5oQxqEDFXHUwMDEwzXXxXdDsRWFnri3LyUJhXCLlVlx1MDAxNFx1MDAxMFXIcF9bIJePk5JcdTAwMDFx2ofHrlx1MDAxY1xuT8xWeZa47UCe+opOt1x1MDAxMdXIokDWRISNWFJfq4rqKoTvkuq3vp+IQFx1MDAxZPW9eVFw4KjIwcZX+laU81x1MDAxY4vtOd4104TypnU947x4PMprj4mUeS77Xtvli1tvRTM21D3SkmdxnJdRXHUwMDFjvHNwhpd7fZlcXO6+XHUwMDAxosDAyO36W4zsXHUwMDEwuswkb+nI0r/v0WBPxddcdTAwMTnk1dFCXHUwMDEzhF7G3EkzjFEhXHUwMDE1VdE9nF9v+8ndS76+oCpj5Fxc35fIOrI0Q+nX3ZpvWvXAllmR4dxKnqGdaNKwQu2OQ39cXLx2sy9cdTAwMDG7XHUwMDFl+Fiyclx1MDAxN4r4YHBncS/76ijsd4dDgcy2JsnVXCJ4mcdS4lx1MDAxZXeJTp9vh1s9R3KpMVxm8JNcdTAwMDBnLJi5XHUwMDBmkojUUCxcdTAwMWPTiOVcdFx1MDAxODPHbWlPsmhcdTAwMTLtcddcdTAwMWXoczRcZlx1MDAxNCWpZuCZbkRccmJxXHUwMDE4PVou/Vx1MDAxZIpB2pZcdTAwMWRcdTAwMTVX51x1MDAwYsThncBHt4my4eusoMvbKVx1MDAwZWHPXCKt67zPq+EqyWNJyYKI0mk+VfJcYjwnXHUwMDAzXHUwMDFkTYuppHWY993dyHk3wcqRPE3jyaZcXCZcdTAwMWWH+GBcdFx1MDAxYuW2mLmmoqhcdTAwMTOW1znkTZPCiWGKtn2wZEqFyVx1MDAwMC+hdtmlOypcdTAwMTln61x1MDAxOFxci1xyXHUwMDBlnd3NbVx1MDAxOc+DuarnO+CggKvYwptQXHUwMDA3l2Gy4dhaXHUwMDAx+oJtXHUwMDA0Ms5cdTAwMTlCUd1pg+rS+Vx1MDAwMOnNXHUwMDAx0GJccttYOcx8rrAkRlx1MDAxYZ575G9zxFx1MDAwYnxcdTAwMDfs26XHk5E6+qy/OvlGXCK9mpyGrDg5koA12nyqLq4yX06MriOFxvHU9WC2PNulke+HLPDmipcwjlx1MDAwMvjOmCx3o3CxXkG7KHVWbJB9XHUwMDA3x25Xy9pdyemw9OTUbZot12jZaN0hXHUwMDFi6HarvZtcdTAwMTK/Pea5J1xy5rGrgK9pV5I2XWjWraraUcdl2Vx1MDAxN93hqOd8vfHl0rvPQOrGQVlJ4s3WdCZ86E+ATnVcdTAwMDM0PMefXGL/tLZAXHUwMDAz5Po5cq/19WqsKeuMosOot47pj0yy2MAgXFyTU1xyYdqxKFx1MDAwMoKps0vE3fVbsbN8pOBBOFx1MDAxZKFcdTAwMDPBjFwiur3Sx768LFx1MDAwN1WQJGeRJyOTNPhcdTAwMDCxNVx1MDAxNekyqlx1MDAxZor8dN+UfUuRWsJcdTAwMTBWYlSEXHUwMDAx3SvSYTDxUfejoC7QOyOKMGXmk7a0XHUwMDA2eHdKXHUwMDA3mOku2m151Db8xshqX0V2Ry0t7si9s5GtXHUwMDAwXHUwMDE30Nner316XHUwMDFh4yPG7pBWISzjukfPjlx1MDAwMCxcdTAwMDQsXHRAXHUwMDEwrFx1MDAxNrNjy1x1MDAwMq8vXHUwMDEwrG2PQ+M5RJNcdTAwMTSUV/AmMlx1MDAwZnZue1121lx1MDAxY3OvLIKwrVx1MDAwNpZGN0eRw/T1XHUwMDE21N3O5dhcIi6PWZTLLNorXHUwMDFiVs/M+LLZXHUwMDEzxlx1MDAxMVx1MDAxN/dOXHUwMDE1XHUwMDFh7Vx1MDAxOcJnfXuonJTBUeVcdTAwMDK70MG4driBI9JcdTAwMDVcdTAwMTC63srUsncunofQjFx1MDAxMF1cdTAwMGWH1dxFvqHiXHUwMDA3XG5BPUFH2kMvOlx1MDAxN25728xcdTAwMDbDJ5rtLfHhnYfb6JpcdTAwMWI6V4ux/Zq5Q8DGnZR1XGJvu4mxXHUwMDFkKzj1d0pcIsz1XHUwMDA010NZq/Wx30aeXHUwMDAxXHUwMDA0OGqlQ1x1MDAwN5DNl/b7VrEzRFxcJFx1MDAxZZNcdTAwMDW2QjqZnEVuXHSrK3khrpd1s22lU7Lv432fXHUwMDBlwVx1MDAxZN73iUoy/HA9NujAXHUwMDFlkCOC+V2qlqzhT6PES+mOmc5N0dYjLuCeL5VhQ6yGu4lZTVx0wO9cdTAwMTNcdTAwMGL3hKHb+0xsb1x1MDAxMT9tTVoqXHUwMDE45nDzWk9cdTAwMWKLNd7vNfzIMFwik8k5nem+0JlYtL9uM1x1MDAxN+EovtuH53NcdTAwMTgoVltcdJZz64VcdTAwMTB4XHUwMDEw4PMhXHT1dN6xXHJ/xbJmXHUwMDFhrpl2i7qLYt6lfTrKsTdcdTAwMWbv2XVhVn3Du1xcyd4wRslp7ne9Rlx1MDAxNOVhOlh+vGyr+X51JynxXHUwMDEx1sQqXHUwMDA2v1wiXHUwMDFiXHUwMDFlg5h7dqCYI1PC/kggMsBcdTAwMWLQWbxcdTAwMTVcdTAwMWMuK98tXHUwMDAydDz0XHUwMDA0TMlcdTAwMTAys2dEdK7b7b4+wTjeYfjCe05cIvBcbsGnXFxcIq2Ktdx5jlwiXGJHhlpChphcdTAwMThmUGLaLVx1MDAxYd5cdTAwMWJcdTAwMTnMYlxmOVx1MDAwN1mMOndF8Kn7zYmZXHSKlH0xXGawil/IXHUwMDE0pSnEp5LjZJZcbidcdTAwMWZvpKaxXHUwMDExjEEznFx0lFxiXHUwMDFkvbhhXHUwMDEz7zCfZKLeMNmmXHUwMDBmjmpcdTAwMDAnhptcdTAwMWNcdTAwMTl/Wfi5XGJ4zW5CiTNHt9/Pk9YlXHUwMDEzVuQ3XHUwMDA0pyul9G6XgkdTXHUwMDA15Z1pc9zOXHUwMDExR1x1MDAwN7aBwkon6lx1MDAxNlxuVHyUK7uGnEvrnHSrVlx1MDAxZVx1MDAxOSXLUUFmz5KXW4BOkDaSrEc9i1WHcWFcdTAwMDNEicOWTlDa8+qKaKeyO1x1MDAxY1BeNDNiY92dXHUwMDA0Ql15S+vxlHhOvGDzyFxifey2nYiLLZNwu9jt5SVcdTAwMGW2Simstpg12n7nllOsqlx1MDAxNFP5tm30XHUwMDE5OV5cdTAwMDWf99f14FkuZlx1MDAxY83DZU7ZeVx1MDAxOZw2a/fD8TAyXHUwMDE1O0VWepSdooNGZPCy9Hx2kYE+buYq16uib1x1MDAxNkTrtsczptZwfcvPitmLJW6hZsY54Vx1MDAwMp1OXHUwMDExrbAulDXArbBcXJacfF460plG6eCXbWlcdTAwMDdcdTAwMTGj6H7C4dY2aY65n7Y1XCLDRjF1etLOU1Mu3Vx1MDAxZD/rXHUwMDE3KPSQKdY5ZXUy8WjJzobHXHUwMDBiZbvASF+I3l5A9mffhVx1MDAwM1x1MDAwN4HwIPeV3Vx1MDAxNFHFfFx1MDAxZffZ9uhhM7vdbXk+uzirOPS2R0QsK+6bLIpcdTAwMDbDaMy2tFx1MDAwN9q6nbTSrXY+xppcdTAwMDA4t4NyYKOyjqdYWOdB3dzhRZd5PkZcIs7FsHY3XHUwMDFmXHLXTjY+4bXbUqu3sItWgM9iorZlrVwi78ImXCKXQCxcdTAwMTfknkObq8jeXHUwMDE2XHUwMDFiXHUwMDFk/O16Z2FcdTAwMGaukoR39I2sZ9AxplZ0nPhyV1x1MDAwMC96uehtXHUwMDExZDy52Fx1MDAxMkSdKpSZZVx1MDAwNrn7WFx0r1x0Y1HobNRcYlXlp30mzVx1MDAxMMrSxlx1MDAwNj2fUkXeteu+Pu/Vi3zm/EWDpsBL2k1PsN0hPfa3uddO+1xc1lSnxW5hlEd5XHUwMDEy21iTN1s1XHUwMDEyd9s6Yo9cdTAwMTRxxdZok4vAxFqXfULSXHUwMDEx2d5cdTAwMTDG1u3A96zCZU/GXHUwMDE2JD1iwnze1Yos/+blYOg6lOeQ4/XyeruSOUZcdTAwMDMtvZGw+013r4NP+WuQyWznXHUwMDEyfc9cdTAwMTDNRK6i2mT8gJPIJaXO2FqseCCELOqsnYglalx1MDAxZUyY16Te9pzp+TinajSmJYOEkWkpWSFcdTAwMDPmhk6VrMpkQuxWXHUwMDFisU5mm+j41lx1MDAxOa6RlFx1MDAwNqMz2/vLjHmMlZNNeYlgXHUwMDA3XHUwMDE5fYq1JK+VYU06XHUwMDEzUacx0Fx1MDAxZLvZs2CT57t4smTLMeFcdTAwMTS+XHUwMDEwh1x1MDAxNTlcdTAwMWNLdbBcdTAwMThKakyp9KvmXCJcbn6CerZxXHUwMDBlSK1IXHUwMDA1z+k9NSp1XCKF6Z71sIlcdTAwMTUg8fd6tXVcdTAwMTlDKCpGTj9Gg++zW3J72Vxc27N/PyCniXJFXr7jXHUwMDE1VHdOumzyiItqc1+PXHUwMDA2XGZcXHJ5XCKRJlhZyzIt3rruXHUwMDE5Xj9cdTAwMDeXwOevpCnRZ8+lejhcdTAwMTlYXHJFmnXBqS5cdTAwMTfjTXJm4z27Jt1cdTAwMWSDz5plnjp2m62+XHKgrFx1MDAxYayTkeFcYk3wmX7TzvG22y62I3bQUizRSOtcdTAwMGLQochcdTAwMWVcdTAwMWTGVC7Sm+m18TzJa3RXL0GlLYPvaFx1MDAxN1x1MDAwZUBcdTAwMDFPWvRcdTAwMTkh51Yt25A9tfRBcMymXHUwMDE4ykg2YjXE82FcdTAwMTR25I1cdTAwMDBcdTAwMWVP8y9CXbpZXHUwMDExentsL2kpxcxh7JZcciaKjLFcdTAwMDVcdTAwMWFcdTAwMWPrLrFcdTAwMGKJ+yO7I1x1MDAxZJrz7HJD2EnhXHUwMDEyom6wPVCC20XC1mCksZsvLeRRqfBcdTAwMDRIeVv3RGrSXHUwMDBiPGRpimfLhuj1/SmY6E5FrtxcdTAwMTFp8OzCTYdcdTAwMGVcdTAwMWZ1WJnPWSZzXHUwMDE2blx1MDAxYiTuOqVqTU11VpGk3nPeMlx1MDAxNps5XHUwMDFhKW3VuHRcdTAwMGXFm0lcdTAwMTG+iaJeJ9fd3q09J5LHNpMwcVx1MDAxNLo1XHUwMDBiLouKXHUwMDFjs6FyT1Qm0bdcYtpcdTAwMWJ9c37UtmqmaFx1MDAxM16Rm/F4PWVldODaLXR/VJeAjFxiXCIz4INirI+b9HK2LVxywXq7ziDJXHUwMDA1WIZtusRYgzVH6OJ6UVx1MDAxNDyQ0W6eNW7tNqGJeFHYSvUqQZLDXHTiMfNOaEJQi9a7XHUwMDA0f2FcdTAwMTMpa51SbDVml5zysC5cdTAwMGXhxVx1MDAwMZYnXHUwMDE5p3ZcXFxihDnFqH9cdTAwMWPhvL/eKHQzXHUwMDEwTovuh/3YOa5cIkRcdTAwMDGPn8SHpy9cdTAwMTfvXHUwMDA0t1arx/HMbFx1MDAxMNOjN6snI95cdTAwMGWDwz5cblx1MDAwNKhW9OlcdTAwMWVQXHUwMDAxy8zrPMHoeVx1MDAwYrk0g2tNqHuYzFx0XHUwMDA2k1x1MDAxYSgjhjegXGJcZtLZmD030Cx5vtyrlku5k1xciDdcdTAwMTbhp/zKj0p0O3FcdTAwMWIygk99rfYq17v2iVx1MDAxYnZTc+tt9pJzYuho/5eo91iWXHUwMDE0aVx1MDAxYW1cdTAwMWaIXHUwMDAxWlxy0Volmlx1MDAxOVokWidPf9nV33+u1aitrFx1MDAxMlxiPNzXXCLCo59N5q/oSHCGWySNY0+Epr++iYDglJI/9jv5/TtcbuiMYKyxportL42nREjmPFx1MDAxMDQ0llx1MDAxZlxyz4p71Ouctkf3P7Vq54l47Ohrf+dwYpVmsOhh2MiPvzJxQNY9kPXp5CZcdTAwMDXEJKVcdTAwMTP4XHUwMDA0Lnu9XGLEXHUwMDAxNpkvSlx1MDAwM8KIuF9bXHUwMDAzPFx1MDAxMnFcdTAwMGVcdTAwMDDKryRf/HWtqlKyll/Yh8vzTFBMKcdcdTAwMWR+Ty1cdTAwMGZNXHRqUmXjZe/3XHUwMDE0tcR44aaeNUqywlx1MDAwZmvjXHUwMDAxiHHlp3dcdTAwMDDZzVx1MDAxMC2HXFyQmFx1MDAxY5Twct3hXHUwMDE3mFx1MDAxY2bajVx1MDAxYdSn3GxcdTAwMTVcdTAwMTPrqqVcdTAwMDAwylx1MDAxZHDEuSdcdTAwMDacYUin5nql1SZHXHUwMDFmoLRm3vkzpFZdZlxu2zqkyzRT+Vk5XHUwMDAxTThpXHLS3ljQXHUwMDFkWFx1MDAwYjGCluyNhMWplFx1MDAwMHFDl1ZcdTAwMDS4XHSt2vn0d81v/reZ/+87PGx3XHUwMDE5ZmFcdTAwMDDMvu7kIcdcdTAwMTRcdTAwMDZ3oSH1XHUwMDFhY4Qhn+pUsrmnMb/XizZ3XHUwMDExqlo9XHUwMDE4+7Xhglx1MDAwNo8v3Kb9Nz78+1x1MDAxMFx0vc5+8CPoQVx1MDAxM0StkDKxIyrj5IVcdNBhL5hcdTAwMDZGJKRcdTAwMTCHjbJx8lx1MDAwNKvWqlx1MDAwM2KIJlxyqlx1MDAwZbIygH1cdTAwMTdcdTAwMWNqgH5vSkiN2/5kuYo9jEle6neuOTpJUFx1MDAxYyhcdTAwMTTW7GKbOFx1MDAxZH3f/lK6M7WuRVx1MDAwMTbkdFbJXHUwMDExsXyTlvypysNTPkRijyBeyplcdTAwMTh7XHUwMDEz9UiBl3CxUzDlL8fl8/OYKfK3fIGlckv+PiyAcXzFk2/YcSBImrU1L9Nw7lpyk6V68EOtmGtLRC5cdTAwMDPEW/iBwV9tvFx1MDAwZpCPkIDCXaG1xTXWy9NcdTAwMDbHOse6gSlcdTAwMWMtY//WjK11QSYg7uo3+G8ziYvB+lx1MDAxOVx1MDAxOL+2QGBowEVUP1lmviBQRVx1MDAwZup3KEnNwvjLJL3+bUI8dr2330yGVVx1MDAxZrlwrVx1MDAxMY6mgI1n5lx1MDAxZDVBu2TzXHUwMDA0TIjJ1Kt7iedcdTAwMDHCPENX5IS/yclC42+s7eFKpFDBZ0R26y6hXtd7XHUwMDA01fY+fDvd4aBDbi5cdTAwMDH7/qa4cTqPhODxXHUwMDA355RcdTAwMWPI+3Gb6Vx1MDAwNltcdTAwMDEhJtA+XHUwMDE4Xj8odlFL6bUoUS1xrbdUjF+m70ZcdTAwMTWJvJd0J5H45HE8Q8pcdTAwMWI5oZbzhYNOz1x1MDAxY5+YL8i8TtyEvcmfIzx98ML2njtcdHNf5Vx1MDAwMVx1MDAxMCW2aD/2XCLTwXOnfmDUXHUwMDBmxWhz6KLOSsbFXHUwMDAyceppv7UySUIodTyLXHUwMDEzj5iAqCx0XHUwMDE4/3ZcdTAwMTFIXCLMXHUwMDA3YEC+icvI43+2XHUwMDEzcVx1MDAwNLr0UfO7XHUwMDFiymE7JFx1MDAxY0L+KnK/qmjlvbdcdTAwMTdcdTAwMDN+JSRNtVtcdTAwMTmH9XpcdTAwMDCA1aBEe/pPsdiPU7zUU6SnY3WERX+3nlx1MDAxMtmyWEFcdN7joMRP9Eymjlx1MDAxY7hcdTAwMWOiJj+66VuaeTjUsl2KgcyA7Vx1MDAxOb9SLLhcdTAwMTb184tTT4Ctv59cdTAwMTj3z8edMnTuiOZK3ahcdTAwMTgqzYy/K51D8/djcub0dX+ApkKYVImiwFx1MDAxMSo0VPt5Ni5cZlx1MDAxNsHLXHUwMDAywiyrP2NcdTAwMWV2J8mIcb1cdTAwMTfSXHUwMDEzJTgxq1xchkHhZ05cdTAwMTfI7lE3dOHM7VRq38nGVW/hLIXKP5LV2HAsisemR1x0tOtq7lxm5y0qsdPS4+djp1asrsVcYq97gCFkXHUwMDE2uZhJ7N52/dZmxPX6Ln8lrFx0qLXXVP2VX/iXvjCWck9kUuTjdKk7ZKKtyfNcdTAwMWV6q5Oas5jm7UxcXHu7Ra1cdTAwMDVGwtSf1f9bXHUwMDEzqp+IN8voi/1qyZe9TEQkhqrUVt/fmuHnKSHGhFtxxVx1MDAxOVxyd1xyijnYSKt+OcVjRit0z1x1MDAxMNm03lx1MDAwYmrikC+OlVx1MDAwNlx1MDAxMHn/0tW4hitsyXawyGa9jz5V2burXG7//KFS0kFISC1H+Im/j7f4/Oe7XHUwMDFlxWfnjMlcdTAwMWF/O61A/FZcIsVVTStcdTAwMDRl3Fx1MDAwNjEnyafhsO9GXHUwMDE0LbBNOp4011x1MDAxYVdcdD0y1MQ8XHUwMDFkZPj3nerIVNJp5s2kXHUwMDFj2uzHXCKVlVx1MDAxZiggnzXILL+eLIRcdTAwMGVcdTAwMTNsScz78Fx1MDAwMpSoLq3ukMlF5I0++1dty1x1MDAxOPWQbuB8xDOLL8VcdTAwMWKVZdfPXHUwMDA1b/B7XHUwMDBmXCLH51/FXHUwMDAxXHUwMDE5d7jG4jvEbqnMWjFMwuM0aSZTfuwtb2ZcdTAwMTl/rVx1MDAxMD34slx1MDAxN1x1MDAxZlx1MDAwZflt8Fwi6GGhXHUwMDAxvlx1MDAxYlx1MDAxYuU8/EhZjC9cdTAwMGWBXHUwMDE5JcKA/XArUuPU6Y03NIxJo6bWlLZiXHUwMDAzcv3CXHUwMDAyX5fI8GKIaZU+xWxcdTAwMWU+TXS0XHUwMDAx3r2AqyAtXHUwMDAx0qjfcNR4W6WSR705XHUwMDA2Z9FGnGLhfLSaSFx1MDAwNszZwNDu7qS8fehkfr0kKHiOXHRcdTAwMGb6I8hcdTAwMWFiqVx1MDAwMPPFXHUwMDE3XHUwMDE01l2xuJPgd5wwfcbHXHUwMDFiLi5TX5gzX0+oMFO2uno5Xvjz9+8zXHUwMDE3XHUwMDEzXHUwMDExZVx1MDAwMlx1MDAxYjhbLCOFU5S02IPX25NAR/GOp84tXGKM3K+hr4+ypfnhu0LzUjd/99y8YVx1MDAxMVxmjtdcIr6S0ybyvNFpd2051M42kFPwJd3Pelwigl6MXHUwMDAxXHUwMDA0ZtvFQkRpTuy/b/lFc4hVny7ZXHUwMDAyyaX+jYk9JddcdTAwMTerTIVov4jRZUi4xZXcbaU6XHUwMDAwKeOZnLhuXHUwMDA0ySZcZmvLXHUwMDFl/Fuh3Udn+Es+MV3ZXHUwMDFkXHUwMDFkUU9cdTAwMDbvOIduVH5cdTAwMDOmjn1cdTAwMGI1+Vx1MDAxN4NGXGLy8y5cdTAwMTiGhJjXzVx1MDAxMLP/kEv2XHUwMDFiP1BoYu1cdTAwMDT6lIM1XHUwMDA2i4HSXHUwMDA0uuTYoZL6jmuX6tJ5ITGL81x1MDAxYZ7FLYdoVCyUklHPLjFcdTAwMTfF3O94c19bXHUwMDEzfLdcdTAwMWJtXHUwMDE2JMY2crHm+d819Vx1MDAwMFx1MDAxYrKorHRsPJ5cIqvEc7VTNK/BxVxuXoZKXHUwMDAxW3q1XHUwMDA3vO90QYxDxkCOblxmkOxSJnHiXHUwMDFk573sRFx1MDAxYrlcdTAwMTV4XHUwMDFlgPVfj7e/KfLSXHUwMDEzt5Hdck9VttBcdTAwMTj7+sxcdTAwMTcxJZCs/+U3I1x1MDAwNVl8h8ihvD+KTvxK/9VDl+dUevt+Q7v4WJ9tyr2vgPo2L1eMXHUwMDAxZU6nvame+LSblpl6fzjI5lx1MDAxNniGOcxcdTAwMTXeXHUwMDA3del5+npa+Fx1MDAxYiVfeOomI2XIepg31v6tz1x1MDAxNek2vjPlZWndekJUyJxAXHUwMDBmNVx1MDAwZtPl2Vx1MDAwNmCFL13BUp14i1x1MDAwMMMkgFx1MDAxY3/HXHUwMDFkmoJqeYx3bP3f7OfgXHUwMDA3a+grq/us+1xmPsVu3ObSbF9N6PVcIs9u/FSt+d86YVtcdTAwMWWiiFx1MDAwMrpgXHUwMDE2XHUwMDA1vJJJN2I8+fA5/L68/1x1MDAxYq/fliXka1x1MDAwNvfXmMfgoFx1MDAxYWK7v1lcdTAwMWNfMItcdTAwMWNybFxu1Fx1MDAxNIf3qWnPtzwtL2V9gzOIXHUwMDBleu9utddcdTAwMWZkwFx1MDAxNyvMjV2sRUiqvFx1MDAxYVpcdTAwMTadSJdcdTAwMTD9V4vykOBcZvNCd7Swo/mrdfCbTpZHJ1x1MDAxN1x1MDAwMOVbY1DVr4PvnVx1MDAwMTDPv/fony5KXHUwMDExTsii2Vx1MDAwYlx0TthcdPL1ulx1MDAxYYFcdTAwMGXlTGBs4T86XHUwMDAyaDZvfECtXHUwMDAwvjy83kNnnaMxkiH1JM5cZrkg1OU/ZZwxQVePXHUwMDA3P2RRJlxu5Lm5ib/9as6/Lj1cdTAwMTCwPXCv9j18w8nMI71Emv31r71uQz2/XHUwMDA3TVx1MDAwMn8zvVx1MDAwNSRLW91in9hX8URZ4ZPLI9tTldS5xlx1MDAwMtL9VnTGikllR62Fa/9i0cR5XHUwMDFifyiftovTpSOiXlx1MDAxZJGxo+roRFx1MDAxM+JcdTAwMTRGf/gpdFms59BVyMFn3kpBXHLEQy5OwPC5Mb04YsOWL2KnOCPDMkNjXHUwMDExfTa/PsZJpzfE9FNZUVZcdTAwMTdCSVxyr1V+XHUwMDE4hqlcdTAwMTmhXHUwMDE3nMCRKFx1MDAwNotLXHUwMDAxVlOPaVx1MDAxY0jGdEz011x1MDAwNSB9nyyiqO0nW0NcdTAwMDcyNphnfEs+zZhIz/KW6Fx1MDAwNNSkjCDbtc/aI5r2vYBtqLWiiCBy5lx1MDAwNFnHI219k+xcdTAwMDS96sHY11xcXHUwMDFimbjXblr4N/a+o/z7Ulx1MDAxZehfM1x1MDAxZHV+9qSDYGRjiU753muiIPzEv41UMJ6TXHJcIirJfVx1MDAxMLgmrfnuXHUwMDFkTZyKgma6XHUwMDE3j9cyr8bo8Ps+09E54fUw+tRsMlx1MDAwN5deKGqz95JcdTAwMDRjm3nTL4ZBYFx1MDAwMTGq7cCzb5b+b4/acZHJa7kyjqvdklx1MDAwZTFcdTAwMTjE7Fx1MDAwNsI84MbxbbKliSp3aVx1MDAxY/88dliYXpfNvETAK3P0blx1MDAxMryDIbmVXHUwMDA0pVx1MDAwZnLtjMbre2WKWyFhXHUwMDFjpJ07hVx1MDAwMFx1MDAwNbdVXFxKqrB9mVx1MDAwMVx1MDAxNL7/XHUwMDE5+jGEoFfUtFx1MDAxMz9VXHUwMDA2+IDsKu9CiL5uMFx1MDAxYZY1XHUwMDBltcczXHUwMDE2uFx1MDAwMSdJXHUwMDBmXHUwMDA3o1xuWFx1MDAxYTxYJ1x1MDAwZjZ/XHUwMDFiXG6ExOVewHixMlr9XHUwMDA16mFcdTAwMDf6VS3Yh1EvWTF9UZEusjfm5tjaX466Y4WsekJcdTAwMWHlXqvgW8rUKpKQ3fTKylx1MDAxYYPlhNJ4mFJ3XHUwMDA3IE+qvHWuXHUwMDExMVx1MDAwMZjj/X1Sky1V5D8wXHUwMDFjhkJfYa2QYXqso1cp9bp7PVKEddh9RVVFTrtcdTAwMDLelS+tXHUwMDExXHUwMDE5+cxcdTAwMDJ8XfU2Lc2f8b3FsWHz7yUtxsrstaWaWGRkjP/20NyBUPs7XHUwMDFlur/xqm7Jz1x1MDAxNKInUt7ikEvTz73cpHpfzb1dWey6N5/PyfVzOlwi3EJrWeBcdTAwMWWZWZ/QXHJhXHUwMDA3kLRae2LEKVOUXHUwMDE3xPDFtCzHXGZY4t70gJA1T8tcdTAwMDYrmflnOurHdHiQ6Vx0j/jg2Fx1MDAxZIOxQXueJ1x1MDAwZTBnrnsh2GzASJfJ4EpwXHUwMDFkieuuvj7QbShcdTAwMDKKkZw3s13ccJAkhTGFXHUwMDAxwJXlZmlBulx1MDAxNaF6clps+TTX0Vx1MDAxYm8vOoJcdTAwMWTwcThu4Fx1MDAxOYhcZuKit4jMXHUwMDA2QflcdTAwMTG5XHUwMDExTpGBzzKFef3QXHUwMDFjdGPQkcFLzlx1MDAxMP4pke6F2YM4dlwiqXAo1k93fsf1oEFF11+bntNFOVx1MDAwN92rXHUwMDEzzKJ4yURdpJy/XHUwMDE45o6tPWKqjFc/JP998WFLaVx1MDAxY/zbXHSgXHUwMDA01kQtfjGuTiVcdTAwMTh/TOhNes1cdTAwMTNjXHUwMDE55HPHmf30t7ZcdO2S7ciMulxyiSZcZnKYipyVN2OFN6+XOTTUw1x1MDAxOfD5g36W8kZcdTAwMTUg5VfoXHUwMDBloFwiL1wiXlx1MDAxOPLnrFXMZ7WF+vimX36C/e2BXHUwMDE4XCKobndWQrWe64uMXHUwMDA0XHUwMDAx4PgylUMzwa1cZqdcdTAwMGVdVL29XHUwMDE45VuaNaU9gmZcdTAwMDRcdTAwMTEmYM1z6zq3KyNHzyfisEDXXHUwMDFhL4K6XHUwMDE01qOpoUuNac8kOV3jwT6r8K3I79cpJiU8g0wqXHUwMDFiW+o/VTdAbFpq2HhcdTAwMGajXGK9vGxNplx1MDAxNaPpxVx1MDAwNFBkKuHrllxuj4dcdFx1MDAwZiY0XGKHpiZiRlx1MDAxM6lcXKVCMY5cZvkhyc30nXGwIEt0XHRcdTAwMTYprJtUsfH7h7Gbtkhf+pi/XHUwMDE2rtExhblTWUDC4KlcdTAwMGLshlk39ddNrVx1MDAxYjRgZMhcdTAwMTB+e+La0Fx04lx1MDAwMl2xMvbA4YRcYtk3Nlx1MDAxZqxcdTAwMDdV7eGvXG6ZYGd/fDHcXHUwMDAymFBcbrqrjckgSsL2ba9160tasIxcdTAwMTG69OL8zuhcdTAwMGLRhVx1MDAwMMcyPNj01lxmYaeIdftNpVx1MDAwZsXvMVx1MDAxYaT0NXjNXHJbbDZ7a4XaXHUwMDE2VSFbl/4/flx1MDAwYlA55oq07phCXHUwMDE57Nr3a9mitdJcdTAwMGZ9gUnBXHUwMDE5xJhJNKDqgNQvroOCaatNoqM30aCOUy7JKYh/ezOSL7dvW2iU2NZcdTAwMWa5ei76W+fTwZDYyFx1MDAxOZ3PN7xDaPtsXGJcdTAwMDM6OlxmVv4rXHUwMDBmIUmRfb5cdTAwMGWqyHhRbUv3ptlcdTAwMGX6wVj9sb1cdTAwMDedNXRccl89K49uRVx1MDAxOH+nx01Y7jmyXFxcYokqWY5TYldBXFzRwped5WS/jFiOXG5cdTAwMTGv2P2++P1HLD1cdTAwMDOuZFx0XHUwMDE3r1hcdTAwMWawUU1v/brlWnyHy+mkME42iIWKOMLSdux/iMSO64PgskhPd7Xdt5OzXHT7qrG+Tdbv+qZcdTAwMThUhum3PmIld+pcdTAwMTeUXHUwMDAz8bxM4lx1MDAwMtXJ6p1E4Vx1MDAxZl++PLJcdTAwMTeWfqfUr6qe5jpcdTAwMWJavVNPqlFcdTAwMTeZpbzupKVaMKBkyHTQV5GDXHUwMDA1XHUwMDFjVkBcdTAwMDT2nfuNXHUwMDFlzFZcdTAwMWNUXHUwMDE4wmtS9Sb52qx9XHUwMDE09dkvpbajfk5k/Fx1MDAxMFx1MDAxN2BcdTAwMDBLXHUwMDExwFb3tygmZvdcdTAwMDB9Jlx1MDAwNuRcIv3U6DVcdTAwMDD3d1x1MDAwMDuE4dFcXKshVFryVXpcXJ5hXHUwMDEwwTIoqGdtg1fHXHUwMDAwyWG/levKXHUwMDAxamZg8lx1MDAxNoVcdTAwMWNbWFPspOEtKXBBeTNcdTAwMTEwM4c3LMT0y6No3cxx5tZ+XGYziF4mcJ2SdC9V3Fx1MDAxYSFEXHUwMDEyKTgljIbr9tln6WhVoCihQ4V0vrtOfdSHb8Ev3p2DWCdcdTAwMDYxuOgyfNze5X+fLsjjnyrnVsRln4admrtYhC9cdTAwMWOTqNvv+kjzv31EuVjK9P6cXHUwMDEy/ds9JFx1MDAwMX9rZlx1MDAwYqZcdTAwMDHpe1x1MDAxYpjveCNKuNNai/K2bG37XHUwMDA17ztr9Cjn8kXQQzNPJelcdTAwMTfYrkf+XHUwMDE4i3g3fC3xctRcdTAwMWWSXHUwMDBmNPVpgfJcdTAwMDbxLH+Rj9o0gPyrXHUwMDFjJFx1MDAxY3rTTlx1MDAxMsBg5/GG6tjIXHJcdTAwMGVKXHRcdTAwMDTVgqk1a1uVbCGirjNnt2PGXHUwMDFiXHUwMDFlw5yIfqXKot0j3Vx1MDAwMbiTXCKHrcVgMYcvIdWJ8/jkr1x0XHUwMDE2lVx1MDAxM1FnXHUwMDE07oGb6tKVnVx1MDAxYoXXxFx1MDAwMJEwKZlcdTAwMTDGyyqqtC9cdTAwMDBw5tek2NBcdTAwMWGPXpNdQ2c4tsdzyFx1MDAwNFEqmEvzU75ZXCJy8rXPm3ZhfzNcdTAwMDJ081A+g8u8udmfRW9cdTAwMWVpr7hMSLKfI37tqTg+V9rNXHUwMDBiW7rjdSNcdTAwMTlcdTAwMDF+T1hielx1MDAxMzJSW37ooTBLpbkt386ccvw+ldU09VX3NTJ1jIo351wi+05CrkB3ScNEI+6MzFx1MDAwMmxGnNB9fpks7Izsj1x1MDAwZu+9IyszhslcXMz1yaOT77dcdTAwMTiKOSFyZP4ks5hccj5u9lx1MDAwNzBcdTAwMTKTm4xx3UZU8NVcdTAwMGVDNEohYWGm0MRA5Ve+lEtphqljO96xpDrGx0uDnH1cdTAwMTlhz7I0RJo1iEmfkFgp6llD53gwOFx1MDAxNJRF8dnxe1xc3qBcdTAwMGZcdTAwMWSmX3MwS1x1MDAwM4/tccmAYl1kz+9cdTAwMTe0XHUwMDFiXHUwMDFjZ9D6b9+icdWyedlMx/vGbfiMkWBcdTAwMDZzXHUwMDFjylVcdTAwMWRsP1x1MDAxOHpcdTAwMWY8n4opreqrl2rFWPHHXHUwMDFi06Bz2GNjXHUwMDE2Q+v+9pNcYlvM9Pg4P8KtjmvwXHUwMDE1tmCB3jlBIdhPi692zPG/vFxiXHUwMDA0hi6Vs1x1MDAwMKlSXHUwMDE3+INW45e0hSnNQzR1XHRcXM6von5s8itcdTAwMDfBx/9gvzC9XGZxPcpcdTAwMTVcdTAwMWFQ8saGR0B/64bEgr3zcFx1MDAxNUSvy3nhV+N7svyZPI/Vb+6UWkmojTrDoFXQRZx8Z/5xPsGR/JCJrp/+jCRcYpjJXHUwMDBmXHUwMDE0XHUwMDFmyVx1MDAxNVtwMopcdTAwMDH1UvlZOHv6rFx1MDAxOaqo3DKbz7x+aEZI+WiIvqWu351R4J1zjnQ5Zd3AXHUwMDBi4S1cdTAwMTlsWNu1J57+9/tcdTAwMWOvZDW1gq2PrVx1MDAwM/43V/rWXHUwMDE2gJClzlx1MDAxOLvnYd95obHCbFx1MDAwYlvKT/YoPM+gKOolOVx1MDAxOOxZpPdPilx1MDAxNmme2Ci6XHUwMDAxIPilhmqvuaieNoKIglx1MDAwMFx1MDAwNovhmeGl0eChn9FcdTAwMDLM01x01mbXkS7FXHUwMDExKil/RntcdTAwMWbyWVx1MDAwM9SzjVx0KEHYJjToXHUwMDA3PXbBNXAlw9lOXHUwMDA0Ys84zE2vOCNcdTAwMDf6mlqP//V7pbfrXHUwMDFisFx1MDAxYkylK1x1MDAwMvf75vdaU7Iulqm1ezrHy2FcdTAwMDAlPTJsmVx01CaEukmsZlx1MDAwZUxaUOQ21Gm9xE2l1PFHalqgXHUwMDAxNO6zVZOra1x1MDAxZfkp78pcdTAwMGJcdTAwMTTK623twlx1MDAwN82nycqQiIaSScxCXHUwMDE1pcG1XHUwMDBm5JmY6m3jdUCK6qhhXHUwMDA3XHLYXHUwMDBlnvQusLKzq3Sm5kPEXGbAXFyLXHUwMDE1XHUwMDBmXGb6RZdZXG5JPMLEXi5FXHUwMDFjPT/Dyl04fPxbI3/1Lem+JLtcdTAwMTUzU6ibhrPuXHUwMDAwosCSTo//b79/gLFXIe9cdTAwMTazgsxlXHUwMDAw2rlQmkyWXHUwMDE0+SZcdTAwMDdZeufT30dUpWKIjsxcdTAwMTZLJlx1MDAwNlx1MDAxNFx1MDAwNGtF0Fx1MDAxY6k89z1OXHUwMDEz2nuslFxywS4pXHUwMDEyXHUwMDFjuXOoNIEyqk/TIVbTJk9/XG7lwL5O+ehcdTAwMTRNXHUwMDE5nHxcdTAwMWY2fE+ZdMtcdTAwMTh/WLGs+PF1/2ZONnT8XHUwMDE13rJ2hnE19NTYiXfIp56crczx28NcdTAwMWJ+XHUwMDAxXHUwMDEzxo7ihVx1MDAxYrM2Kj78+Z9baluZWVlcblx1MDAxOb2iVoRcYlx1MDAwMesrkFx1MDAxZTPqXHUwMDE2IW+w5U38gFx1MDAxY9poPkdEiZjrRW5cdTAwMWaUjb430pO4gXVcdTAwMDL4K1pcdTAwMDeCyZ6XN3L2PVx1MDAxZutwXHUwMDE1qlx1MDAwNLJohohcdTAwMTJcdTAwMTThiFwi2ntcdTAwMTCJS38qqVx1MDAxNz3ZWm8zQ38/37ajwihcdTAwMTRk1VhTsJSO8U3au5c3m3qKhFx1MDAxYaEgs6p8lWPTQ9P+XGJcdTAwMThcdTAwMWSjWkJaXHUwMDE1Xq+gNDkqXHUwMDFkw1x1MDAxYkLjp2E3+qegI5ts712+7WJcdTAwMDCQl1x1MDAwZlx1MDAxOJiFdEZHcmPjI1+sop1QKa0/3HpcdTAwMTDF3yqLT4l87Lkna4ohXHUwMDFl9eyXv6+OIbxQXHUwMDE021pcdTAwMTPIqL9cdTAwMThpWY4xXHUwMDAwu9RcdTAwMTecWvsoXHUwMDAzwYBcdEwwxCeqrDzlOWv4NUi4Q4j8XHUwMDA0r5OBYbSqXHUwMDFlz1x1MDAxYcR4SfU+z1o1YGafM4Gxeo7/OPZ9fZuUgrJcdTAwMWKl8XlaXHQp5fKCIae0ZFx1MDAwNWs2KWckKJqofpNcdTAwMWUw0L+I8oDVk44/XHUwMDBmYqmPVW3+aLFcYr90vq369Z7X5Fx1MDAxOT7+V/773oJGNlSPRVx1MDAxZFxullx1MDAwNNXzZyTIXGa7XHUwMDEw1u/jkO+zRa1zlNu0knxHXHUwMDA0gSy9blx1MDAwNW2mNd1cbrVdtrVHW0LoyDiCrejsLbslgk33MIFcdTAwMDY5a4xcdTAwMTlcdTAwMWPnS86XgualXHUwMDEwY7O7TKeUXHUwMDE1++8ofkvA9Fx1MDAwN5OxXHUwMDFkcqVzdX5VXHUwMDFjg3JcdTAwMDPIoL8+SNr1++c7IGOJyHRcdTAwMTKx8Y3vlOvufkvQJ2BcdTAwMDLRXCJ/XHUwMDE3n/5sXHUwMDFm+lx1MDAwZcd457l++vnE+kS2utWEQlx1MDAxY7eOynRcckQ3oNrTWiGPJ2e5+97E4tp9jfJcdTAwMTdKjOBcdTAwMGaZbVn/XFwkXGK9VVxctsTXhGFcdTAwMDGwMFx1MDAxYeIxXHUwMDAxLjdcdTAwMTQr6MF7tkGJXVOMIFxc8lx1MDAxOYEyXHUwMDExSZHo4rJ0+1xi8LF9i1wi9N37rFx1MDAxMsm7wyp9XHUwMDEzvJRcdTAwMDH7aVx1MDAwMI3+XHUwMDE26fbVV4r+moPWTpdAXGJcbu9I9tZcblx1MDAxNt7gxynpwY0hKJO4o6vGWPjPibuaL+brVKyR2VRDP1j3Wy2SaVhoYL5zXHUwMDBmm1x1MDAxY1x1MDAxOJlcdTAwMGJKwvLj6CWkcHg3e0J8YIs2u6LNLZVJkq7hrCNcdTAwMDHVzTtgSlxcxWpQ5V6fT+g9XHUwMDEygFZpbKRcdTAwMGbuhvJNXHUwMDE5hbOdvp9cdTAwMDReOatcdTAwMTfb8Kp8VT1YcIZN6SAoXFzTbEKKXHUwMDA14F8vITj5+k7Yy2mKMlx1MDAwYpzZfiq/iuGkXHUwMDFm9bFrq/4si1NcdTAwMTZDiaerKS442pVbn3s7I3F1gp5JXG4tT7pcdTAwMWNcdTAwMTL8+U3noqZMXHUwMDAxXFz0JopOyVx1MDAwZV3XXHUwMDE4XHUwMDExqtJlREw5RFx1MDAxZjD4XCJi9rfmJ2mDXHUwMDE5y1x1MDAwMlx1MDAxMMuKspoq8uryhUw2Tlx1MDAwN1x08sB5kY9cdTAwMTCv2FFFYFx1MDAwZqNQLFx0olHkUP/2xlan1KtljGzJj1xihecjt4LNuGZmKZawXHUwMDA01IScXlM9qFx1MDAwN6xcdTAwMDTlxJPhU7CtXHUwMDAyg9w277xEyfRu+f3szckgjvOFeGvwV2FZXG53idjxXHUwMDAz49XyZp9OT1x1MDAwMi37VXSaXHUwMDFlXHUwMDFmKUA+08t9906YkrK/XFyyd+KPxEL+XHUwMDA0kM7Tk4fw7FhTXHUwMDE1krbhyzu4XZuplFxcwTVXJSSZ2Me6+nfunFx1MDAxMmH5fNV931x1MDAxMYlcdTAwMTGxhpK0xEGErIHimlN5JK3n/OLe0Wy8LL5cdTAwMTPe6KyqmURJXHUwMDEyXHUwMDFiXHKyVY40LCO8t1s0qFx1MDAxOJjItVx1MDAwNCpcdTAwMTF7tiSqXHUwMDBicDY9OZpcdTAwMTGbk2/mVdpDh5Zk5ksh4X5cdTAwMDL/lfD3+j1pVtRdRGE42k/Qer+ULPGHXHUwMDFlXHUwMDExxnFcdMNcdTAwMTX/tsHa0tojvTYwwqbpdfDlXHUwMDE5aFP/elx1MDAxZaKaX+GHOchcdTAwMTbLWf1DQ505foShjbFcdTAwMDNk9pp253dcdTAwMTL3XG4qdytcclxiSIfKXHUwMDExcTCUkHnc81x1MDAxOWpcdTAwMWNcdTAwMTF3XVx1MDAxN8FcdTAwMWQ48c9aRZ9oz4JPlFwi/m4wncnQRp1cdTAwMTTB6dJcdTAwMTjqyWnFzzfFyH8+SLn+XHUwMDE1KH6OXHUwMDA2h6jRqXRcdTAwMTdk65lcYktMmb2VsM74XHUwMDBi48v8a0eId4tcdTAwMWHKJlx1MDAwZWPblGeKx7QhpfxmjqSWNv3s7rzAL1x1MDAwMmt2zF3NXHUwMDEyPjjtyXjoz73IZqDPlDJcdTAwMTBahFxm5tqunHPfa/cxV1x1MDAxYULqIEVY4jreJJnyY2/xXpX7SclcdTAwMTdCJXxnXHJk7nnRXHUwMDEx9Vx1MDAwNLRXXG6lccfJk8Uho1x1MDAwMsx+0D1j14XZOSlt3GqbXGLWXGazYETie910xpJkbiYplpZJXHUwMDBiN1x1MDAwMKI5+TM+qdlcdTAwMTIvRJ2U0vytj7hcdTAwMWVcdTAwMDOIXHUwMDEzXHUwMDAxi/23sa2Pdlx1MDAwNIi+sseT5TNcdTAwMTNcdTAwMTRMjjwkXGaW1JJcdTAwMDBTrlxc4jm1f2uDzKSbSpLc2mUl41x1MDAxNkAypZHITfVPRMMhwpXIbzpWM0TKTkK7fjf8SvJcdTAwMWEj+U3KoXX17zbfO6/9TLFnOMx54v0tgyg3N1x1MDAwZto8zl7RgJDzU8eV5fvPzV9ChtR6jLxZa0FCblx1MDAwMlbellTprUVgtvOmTpQ/R9xcdTAwMDW66ZdyQeZ9kLRWZV4+/POBIFx1MDAxMlP8Oue//69cdTAwMWU8z+sw7JaZw7OXwD+pXHUwMDEyYeW8Ky9BO6L7OOtB5od5ZSfVdzX7yIQv4f6uZMc+XHUwMDE2vLxcdTAwMDPflc/cnO/ZXHUwMDAwWK72r08/WeKJyz0pWb9aXHUwMDA0L/ePPeHoJUFzbbdcdTAwMDZaXqtcdTAwMGWcblxmnDe2+aluRlx1MDAxMj0yMrecXHUwMDE0vIeAk1xcVm5cdTAwMTX7JYgpZmNcdNXsXHUwMDBlMK6xXHUwMDBmxTPuXHUwMDFh/sVLydlrJjFed/MkvTdCaM6iop5lkPZcXMKW+Vx1MDAxZMlURXu4pIfKz1x1MDAwZYCbYX337mT2PMLI/Vx1MDAxNj1X2lx1MDAwMFx1MDAxNd555Y3lh6lcdTAwMTZrbztzRT19bmO1LJQwyOeVPjPk3L8/YXqafdCYQlx1MDAwMFx1MDAxN9f67zv4kCVtlJj1d2XuWpiXej9XsXObx+CdkZHhOOiCrbjtXGK/qfE4SaDDWeJ75pvR+LDLXHUwMDFmOrEtTto3XHUwMDE2Vfm1Y69cdTAwMThcdTAwMTUkd1q0+Vx1MDAwMObqdLHq31x1MDAwMSrnYlx1MDAxZIc63F2pqVWvR5XQy0nRcWjQxTxcXGA/Ti9aXHUwMDE4Q1eEwLq31koqw1x1MDAxNXPH6JnP0Vx1MDAxOVxivTKFaPpcdTAwMTlcdTAwMTHYei5el3dqy9Z1qsL2XHUwMDE3XGbQ6vxFs82eXHUwMDE05HE1K0FLzSFtXHUwMDFlvNyIKMRcIvK/bGnAme0/3GVcdTAwMTHP805cZrJxo77QdS21Y58rXHUwMDFjdLM6XHUwMDAxgeZYu47f2aPF2rpPfd13bDNm844sp1x1MDAxMGnD/fzd3cJPsZSXXHUwMDEyqS56+5uRaey6q4mIUCB0yuDStuB8/F+/MzClXHI4fifrNFxipX9cdTAwMWZAW1xuM85cYudrc2pccpBJSJ3AoOnAgP25eIHx8Fx1MDAxOZBCoX8yasE1a6Ok6nFcZk1cdTAwMTDfXHUwMDA0wFx1MDAwZlDWrih2qn6/gVx0XHUwMDE4XHUwMDFhXHUwMDEwj5Nr+t19g4aK8a5++9jmjlx1MDAwMkwu5DWSmWsp6Is9yNXlXGL8cpmauICqfd9cdTAwMThRJaFcXOZjXHUwMDFhZOH1NFxclWAkVLZrlFiO4Jjo6+XBeCb2XHUwMDEw+rlcdTAwMTDr+efUzVx1MDAxMDBkpJfslpVcdTAwMTeYXHUwMDFhq2NVRLVcdTAwMDJEJuFcdTAwMTlcdTAwMDLKWp6HxJIxrojyqs2G7MvSyS8wjesyflx1MDAxN4NLlSBcdTAwMGJcbpbsQ5HLTlx1MDAxN1x1MDAxZLBSympFXHUwMDE2Z0z6co3NlU+7gVx1MDAxOU0qXHUwMDFjxXZ7LyE94bd5+Wc7OKSNjdapP772JPVNX1x1MDAwMuP+msJccsCVb3y16eYvckHMzossl1x1MDAwZprJ3LwvzPzsP1x1MDAxYv86pFx1MDAxNU+ZNMRcdTAwMWNO2iugiba2njFOVm6JS+7vg4kxXHTDwlx1MDAxN9JcdTAwMDa13H2a/nxcdTAwMThhOXRcdTAwMDBcdFlcdDD21n9cdTAwMTNC0bJIlq+oXHSxPHFg9lx1MDAxMVx1MDAxMfF1t0X9N16qL+JcdTAwMTmpJcSxJt70e9P/ulx1MDAxNLaoXHUwMDA1Q/aOuF4rh57VP8qE35xcYmXGMNGTXHUwMDBmvnnCP2pcdTAwMTaBjpRGK9nFjcH7/H6piVClI1xyZo2iwVx1MDAxZvaoa0GVvP3lZFx1MDAwMZLEt1x1MDAxZT9cIuVCXHUwMDBlNv34vqM0NON+iHbZwe94i2yASYYwjooy8J2z9FDnXHUwMDE2hlx1MDAxYqtcdTAwMDNiZ8ElQrOZxl451WtayFx1MDAxZpTh6zn+7Jh2dVx1MDAxOMaIiPE76ax5YsyJe1ebwvm3NmlcdFfMzn6SXHUwMDFkXHUwMDFmxzJcdTAwMDfEzGyyrP8rOZb/w5ZCsIToUZTj0Glfzsw4n8Hs+vacLvos2FRMo5VcdTAwMDFHOl+Y0YNm4ubp/+8p3n3nYlRmX61cdTAwMDHw6ZnfLbRcdTAwMTLwfa29iyVSXGZ9JDpccpEhcWCcwDss8MUsUfeEOurpwN5E2L41iCrmZ7fGSlCVXCIxjXTTXHRvPpnlK1P+XqAg0D79lWb2dPusXHUwMDBmvcL63zrzObNcdTAwMTGzfup6alRcIqI6IMb2OIxcdTAwMWWsrYxSJJFazXnlmVuEVFx1MDAwZvhDjkxaXHUwMDA39bUpYauWXGb8OelcdTAwMGIsUFx1MDAxNEw0OPaYNva49CmbXCJcdTAwMTE2Ti6UYivWXHUwMDAwXHUwMDFlf1x1MDAwMk1VsFxy8XqbsLxcdTAwMDV97Fx1MDAwMYSZ2+DAwoZ0Y+DRriiQm5jiU6dcXHuwRVx1MDAxZY24nTFoMFxugCN9UkboWG94XHUwMDFmxTHZn51ccva38b+zoMG/RFxmyWdyneVcdTAwMTcma22sonxcIkZHXHUwMDBl+OfzXHJez6wxUOBcdTAwMWRG24eqPNZcdTAwMGYwPK5iXHUwMDBius5gyNh/lzRcdTAwMDM+U75zv2JMotvGPlwieq2sI2NRXHUwMDEz/b6bW1x1MDAxNyFcdTAwMDMrXHUwMDBiqzq+WXo7OVFrszZcdTAwMTE3vTlcdTAwMDSuwn4/oqiwlCuj98ywXHUwMDFhlU6tXnjJaGM+fa5XJ1x1MDAwMKz1ilxmUp1NcSisznfkwIxcdTAwMTgnzj7eeounXHUwMDAx5Vx1MDAxNjDd/zJbUGpcdTAwMGXyhHPp1lx1MDAxNkC9unkvbDzsnFx1MDAwMM52jjCQXHUwMDAx2zn3nqGcRzVcdTAwMGaoei7y+5SIy8RlXHUwMDFmzSP1ucPyhrZjJ2262kjKY1xcp+bda0iv44npr8FkieGAzDKUZ5T/gJ+ie3SHhFx1MDAwZoLBXHUwMDE5Q1xmmdhcdTAwMWGeMUPjMCTtXGY18kS9LPWLsODWQVd4wWNg/7eHS/g0WSfGe7rPRoJccoq5t1x1MDAwMVwipSbod9fgPlxmXHUwMDAy7SrSJZlcdTAwMWNcdTAwMTfa1Vx1MDAxMHRGpVx1MDAxYvDZ8mL4rSo8ljtcdTAwMDZaKGNcdTAwMDW3+8Od5m5psueSUvZip1x1MDAxMomPcXVcdTAwMDNcdTAwMWWqRVK8iiH18EvZe9bnXHUwMDEzpuF+XHUwMDFhXHUwMDEyo+N/wbpvXCJj/fAmXHSsZ0VcdTAwMTjnXHUwMDE4XHUwMDEx3ff1XGL9V0xcZlx1MDAwMVx1MDAxNFiLMVx1MDAwN+VcdTAwMTNv2iera2fTbkf7c+dA385SyG27od7o7Fx1MDAxMFxiKD4k2c53fvTwNYs606m6XHUwMDBmy4XGnVx02s+8rFx1MDAxZoMwssJE3c42r4qOXHUwMDA3XHUwMDE4aMHXeSPiIzBn2MSgia5s3ZRlXHRAcJCUcFZM2r++TU1cdTAwMTZcdTAwMGU+Zf1cZnND3YVxtFx1MDAwN5hVkpl9uDdcImdB1XQ6I2hcdTAwMWJmXHUwMDBioY/wzNHVimd+Wyr0S/w1QlxiXHUwMDAwXHUwMDA0O4ErXHUwMDA2biDj7tri2nKYvD6F1mgoXHUwMDE5SpVVp/8+XHUwMDE0hjvCs66Aj5pYz5mNQ8WvXCJp4q1o9Fx1MDAxYjO/XHUwMDBmy1/GurpcYlx1MDAxYbS6n49cbokp1+bzyad1Ub0zPJ6a++OTkMHKZZNccsMw8JzEvupcdTAwMGaPJCXrscpcdTAwMTPERvpevWJcdTAwMGXmXHUwMDE0qt+IgccrmsiV5YdA7if81DqxM/lgOmrzUcprmVx1MDAwMyfavKO1sozWY97P41Jo6d6FwGCSxkcoTFx1MDAxMEVcdTAwMDbBvTGqspHEKFx1MDAwZlx1MDAwZtjsekqOn19b5sfeXHUwMDE4lFVcdTAwMTO4XGJeUbhcdTAwMDBcdTAwMWOQ7eJwXHUwMDA2n+vdnXGPpkW+SEA8xUtcdTAwMDFcIn5b2lx0ZzFudsjhjFx1MDAwMPX5XHUwMDFlz1ixtFx1MDAxOKK4XGLBkVBcdTAwMTTgg/531sdcdTAwMWOezOgotVx1MDAxOEB39v1Fxlx1MDAwN1x1MDAxM75u1PVfXGaEKKJCi4xIXHUwMDAxXFyhPrtbbHOIJC5aZ1x1MDAxOGO+ulx1MDAwYp2t0kxWjlx1MDAxNihccjSfJcV1qXhcdTAwMDC1wlx1MDAxNFx1MDAxOMzlq5J6/1x1MDAxOHYs6j64Sc1cdL2Tb1xmeYyJJ1x1MDAwMnQ3l1xc85Oyre98XG5cclx1MDAxN2zc2t9cdTAwMTHcLuBVwVxiP2+07cHyTPg+l+M0vNRZe6ckq+WtXHUwMDFhl5oj7MlcdTAwMTUr1JNwc9RHPkjizFx1MDAxMXHLJy9msVx1MDAxN7DMmlx1MDAxMnqyzV9ITj6BxVLvgJmzXCLZXHTpPlg3XHUwMDBlPHdcdTAwMDN2o1x1MDAwYm9pU0DmOqRcdTAwMTInoXDefSyzglxyeFx1MDAxOG6JQbCNbjpNlGf3TFx1MDAxNN3qO4aIylx1MDAxY+A0wi3EaZDyh3xcdTAwMTC2XHUwMDFmR6HiPj6Drll4sY5cdTAwMGXu+Pu4VnfR8I+dkJy6qFx1MDAwMITw9TNcdTAwMTQ21c9cdTAwMDNcdTAwMTW5O1x1MDAwNrvFQftcdTAwMWbRXCKOb1x1MDAxMlx1MDAxMZlcdTAwMGa4TFx1MDAxZcm28ILPnTo7dVx1MDAwYk/1xtYhyFx1MDAxNo5cbo5Wz9RcYtqm8X28XHUwMDFmXHUwMDAxPVBNaP6J7U+CzrFcdTAwMTNYZDJhjofx9+bGXHUwMDFkPIxYTXlsXHUwMDFiXHUwMDA3LuGHhcMgYuLkdfTRW41y3oBcdTAwMWbn7Wd/XHUwMDBiXHUwMDFl885cdTAwMWXx/Vx1MDAwZdk/PVnmtv79uUb4zDD4XHUwMDFiXHUwMDE49adcbp97QXbtSstPyNKT176gRGGOXHUwMDE5t6m1csCBMaDnWzWHQohcdTAwMDNed+BcdTAwMWTWWl3uXCKhTUSkRlxuI4adi9CnrzNTM6YoLl2AId85XHLA42uyUFx1MDAxY8wvg4SX9G3Xxui2eazP22fsXHUwMDA1ZCtErzr231qgX2qHWzD+JN6SLfydXHUwMDE2rFxiXCIunfbEnbva2XBb81k7jfeLkqCMMOZEKFxy4ZJljLL3ndBcdTAwMTHt51nQe1x1MDAxZfX6rb3JjFxmgUxZKeGW8Fmc4ayzYZqx2kz39+3dVj1GTLRjn/1ccuh5z5AjJpuKVs2t8G+Px9lcdTAwMDJcdTAwMTaXP2Gya1x1MDAxNPdhWKBbdy/ch8ZYf35cdTAwMWMzSVx1MDAwMYvVXGaiyZlcdTAwMDFcdTAwMDC3qd9kXHUwMDE1gXWtnUFccvpcdTAwMDFhPT/zqcB0da5NXHQ/oGP6UFx1MDAwNNZ0jnQ74O/N+rVsXCLM+DfKQZBhOS1cdTAwMTSc7Vx1MDAxMnmuN7nWXHUwMDA2dfjvm21cdTAwMTd9evOKKyZwq9o60i+cNe7aXHUwMDE1/dVQpSGj4/Vdu/VyXHUwMDBlTL0z/4PqhsWtMVXcja//RmjczynYNVxmXHUwMDFjj+lcdTAwMTjwwD2gNYVR38jdbHyJst90XGbktJ9cZkxcdTAwMWGQZlxifYZcdTAwMTRcdTAwMTKvIJFnXHUwMDE02Vx1MDAxM1x1MDAwMbQxPkcyXHUwMDFk19XMYFx1MDAwZbresUNYe1x1MDAwNOONJk3ehTl2wPeUkOpamGqAKyP2vtW6XHUwMDE5kNePpFx1MDAxOJ+ilJtwZntcdTAwMTVxa1Cdllx1MDAxMMulTKa6hZJcdTAwMTfBXGKwZdJ3np6uXHUwMDAw+Gz5O6m954o+TL1cXNzUhGqp3kxhYMyyfdt7M85vPKjovlx1MDAxMfrz/jRcdTAwMGJoS2mng9fN+CTGXHUwMDE0lvVoJoVQ/81cdTAwMWZLZpDDXHUwMDBlXHUwMDBlhINbeFwimj29pvn48Il3z1x1MDAxMsK/SVx1MDAxZWMt/TxBOWxEK1x1MDAxYc/fIVx1MDAwNFx1MDAxZL5cdTAwMWPZ38FC1pZBXHUwMDBihrBXSS8jXHUwMDFh9qd+IEJcdTAwMTah6ddzvvrf2VjDl+pcdTAwMDNcdTAwMTguSY3mXHUwMDFk4zYuXHUwMDA2g6b0W+HpXHUwMDE0sFiBXHUwMDA0SiBk8TdcdTAwMWR922FpU8pcdTAwMDSy/Fx1MDAwMd6D4kevXHUwMDAzVn7V0jtcdTAwMWXEcoyjXHUwMDA3XHUwMDE1sVx1MDAxZFx1MDAxNJfn8Y6qxFx1MDAxYatjraKfNlx1MDAxObeQ3VPVgdQnep9cclxmV+1wXHUwMDAyTMfS11x1MDAwZsZFLFx1MDAxNidJZP1cdTAwMWLAysduv1WK4fc3XHUwMDFj88Qymq42XHUwMDFhmd7FU1x1MDAxYp+Lef3l5auk8LS8MqRcblRmWFR3JuJIXHUwMDEyXHUwMDA1XHUwMDFljjLbe3q1l7mnqo4uznw92dhCIW5fzb5/wySLUmzme4BSXHUwMDBm8dlAsFx1MDAwMV8qXHUwMDFha4nd76CVWcbJ12w4o7LXmFx1MDAxOVx1MDAwN3uD/taDNzy/M4xV0zK8h2JJ1p6GlqFfsctdXHUwMDE5gn9cZlxcO6zuria1e0XoZNlcdTAwMTf6X/+bkDA4fUqKn6R/51aytVTL+X6d8ctcbj/E91RO8NxAQ2FcdTAwMWbGXHUwMDFh+VEq/7NUbMdcdTAwMWKGxMSSlLTFMjugvVgojVx1MDAwN5LE9FwipHpdxFx1MDAxMdHkr5eoMLZ56UInfVe2x8TtdbdP6HJtorE3lFqvxPBcbljOzm1By9L0+b45bEUxsUDyn2eky7Mnan11XHUwMDBmQsztSUjsy7/clsbYL+RKXHUwMDEy72TYXHUwMDAxXHUwMDE0iEaHglx1MDAxMZjWy5yha7/4XHUwMDEw4LP6ur39XHUwMDExT2TUicXf4ZmC0fBCdlx0xptGXGKpe8dcdTAwMDXh+nfmXGZcdMzyVjZcdTAwMWO8wq6PKOQtd1x06DNGXHUwMDA0/Y0lqKXNNsc4o7ODKkiq/07OrNOARCZH4UGlL/PhL3Vb56dcXPCG3lxc5yXRpVx1MDAxOJHmjUU1UKROtzBJbuWLf71NRGx3XHUwMDA1+Y5cdTAwMDfiXGbZby9cdTAwMTBdsFDA6G9cdTAwMTlcculcdTAwMTd3lUvjK2SrXHUwMDEwXFzGp6k8blx02LEwee536ea8z0duhlx1MDAwMH5hZ6umcEhcdTAwMDC9l1x1MDAxMiO8bsNFSE66uM1XVoeNYTiGcf1cdTAwMGZcdTAwMWK8XG75kW9cXFx1MDAwZl3I3zlcdTAwMWaEvVLs8ztcdTAwMTfrPVx1MDAxNn7VzUuXoHg0sSEp9vp5hPAtd9XxQLZcbl8yf/e9OnOTu4jcXHUwMDA19Zayo3a1xFk9N4247G1IKrXHXGJcdTAwMDNsZGBvgUeVP6Nkv1x1MDAwN1x1MDAxOFx1MDAxNW9Fz510yjVjiVx1MDAwNZbtaY+2oa5cdTAwMDHONH+fj1XZ10e2ttaxS+b4h1x1MDAwNKfHN+CRLciMfjFo+IqZXHUwMDE3MfUtjYZlwN9cdTAwMWFBpF+MxT/qXHSLLXCpUlxuPp8jmLiv8TJZMl42tcbEO3dcdTAwMTF+ZM14V6uxTOfaa+v/8Y+20JgoakyWIVjjI4nKXHUwMDBlr5EwnVxcxs46XHUwMDE4S/WqZiCF0s9MKn7htVtcdTAwMGVcZsRdRY1aYJVsPcp231x1MDAwMs/9/rptXHUwMDFj4/BcdTAwMDVnTtmg/1ONXHUwMDE1VCdcdTAwMTVAMzCc9lx1MDAxM1+18X3LXHUwMDBiXHUwMDFhh/iVXHUwMDE0s4tHXHUwMDEyXHUwMDFlLJRcdTAwMDbGXHUwMDE138TFblx1MDAxZDqMOnptMlx1MDAxNcJry0hcdTAwMTLdyG18d1x1MDAxMLuQ4Fx1MDAwYsRcdTAwMDS5xdF1eqWBgr9cdTAwMDS1hYf7mnxnIFVcdTAwMDawol7Befzti8a6XGJcdTAwMTiQ3W1G9vM5zVwilaLdalx1MDAwNUulgo1ZyMjtgFx1MDAxNJHim4xLSfuU0S9cdTAwMGKlXGI3/q1Hf2rN2CheVlx1MDAxN0RcdTAwMTd1slx1MDAwNU66d5qQ/q9cdTAwMWb9X1x1MDAxZmVcdTAwMTLiYcpcdTAwMWNdUEWv/mHp9JZlf8ZzZfq96lxc94K1XHUwMDBlpHft8To9b+L4QjOmVWai/qZcIsZcdTAwMDYvWSB37Fx1MDAxYlx1MDAxNJT4XHUwMDExk8MlXG5y0oaU5lwigqPbkJetvoluJ0XacTBa1ddcdTAwMDTTXuFIk7omdOlyPVv5cFx1MDAwN/rRMlBcdTAwMDJXgtEzYlx1MDAxZEPMUSVOsSmo41HRXHUwMDE27ITpw1xy21x1MDAxMVx1MDAxYWSz4lXMgV+cJVx1MDAxMVx1MDAwM8DO/W4/qfzXd659uSl41XnN8Ju/+MqAkzpccnr6XHUwMDFiZV20LVx1MDAwZp8+31x1MDAwYoFm5UjI/EN9tbVcdTAwMTauJVx0gHh1XynsqeVhr1xcd1x1MDAwN1xi5ParW5w6mc4yoySySneqkcKoTOpcdTAwMWXR5plVXHUwMDFi3VxmWpH0xPTvLFu3ZGEzjPfc0JC9mVx1MDAwN0VcdTAwMDLnc5ZlXHUwMDFl7uj6XHUwMDBl8sdDglx1MDAxMeFcXIXCZMw5b1x1MDAwN1x1MDAxYlx1MDAwMoan9GvhXHUwMDFjPKXBe1lacDFcdTAwMTe36qDbvHorPddcdTAwMTZEYTFzRJ7P9r3QjVx1MDAwMGZcdTAwMWJcdTAwMDGM7ItcdTAwMWXeQm48TNWJev5ccj5hXHUwMDE5qlRcdTAwMTg0n5esStKEj61cdTAwMWRcdTAwMDboiqkyguZcIlxuqF1kXHUwMDE23ZlbXHUwMDE0XHUwMDEy0K8xXHUwMDBmRZtemVlcdTAwMTA552h6PpMj4G/SSkFcdTAwMWUyazU1j1vtP8GHXHUwMDA2XHUwMDAz51x1MDAwNfFcdTAwMThlptdVbZ1fJYp8Zqu3v5ZByMvf4TSCSFx1MDAxMvH9JEWr5Fx1MDAwMs7+XHUwMDBlcO464N85Qlx1MDAxZrlaj1GUXHUwMDFi3nhBXHUwMDFiV0pI9Fx1MDAxOFx1MDAxNv23NpB3XHUwMDEyY0duXHUwMDA1KF5XYpRi/25cdTAwMDVw96By82ZLOO9cdTAwMTdh4m3ljKRCziOG8WM30uZ+wOHjXHUwMDE5Tt00Rol1irY1+PxcdTAwMTZcZsxfQ+U2f79cdTAwMTJKXHUwMDEyMrQ3WyAm0Fx1MDAxYznFLn3/XHUwMDAzKFjde8tcdTAwMWS+XHUwMDEz2unios2+6r7CXHJjT28xh7q8aL9cdTAwMDKSUZvYuq17WmNcdM550Wi2ozJcdTAwMDdhXHUwMDE0f32kLkzIUE86MDulqFx1MDAxOFx1MDAwM2LJed8z1VHLq1x1MDAxY+2QbChcdTAwMGartKrLqkR+X9EvTlx1MDAxYlx1MDAwN4XuWPFcdTAwMGJ+nX1b7CcksJJpr1x1MDAwNbA1ucyzXHUwMDE1XG7I09xcdTAwMTRFpo3DuZqSOFx1MDAxN8Bt4CRT6s9uXHUwMDE0XHUwMDFkXHUwMDA1nP0xXHUwMDFi+2jIXHUwMDFjdORPXHUwMDBliSrYOMMoXHUwMDEyIZUvrVx1MDAwN9dwXHUwMDAyh7yDXHTFJlx1MDAxNlx1MDAxNSFtbFwibmq3XHUwMDEwXGKMn4k3Q+RcdTAwMGXfbPYkXGa05jK5XHUwMDFju26WVeClt8BcdTAwMTWTfC0xXHUwMDEw9GvIUzy26t9cdTAwMTfATaJSfVx1MDAxNVx1MDAwN9Pgh5dCXHUwMDE1I4N6UJ+iXFxcdTAwMGayx7uEm+ggrWzht5iFXHUwMDExtnqSXHUwMDE1XXwo350vcFx0/nd+IEfDl3DFqq1FNVx1MDAwMFFjsDPhTVx1MDAxMMBcdTAwMTS4XGZcdFx1MDAxYjB8L/1cdTAwMDBwXzvOf0ktYFx1MDAxOSw65+pcdTAwMTZN+eNlcn1vvcL1XHUwMDA0XHUwMDAy3IdvNk3zK2SJWC+7gLBcdTAwMTLaZ6VThqWG4ySTX/BcdTAwMDJvfH6H2YQ4XHUwMDA2XHUwMDEznF+Q/TU/otNFMc5HP9pcdTAwMGa1xHItayTIXHUwMDBiplxiXHUwMDE1ZctcInFe0Vx1MDAxN5jqJI1MXHUwMDAwKFwiLXWX5kzJT61cdTAwMTdcIkZAko65csRccmh672x4P7//O0+TMEWZ4VuEerSG6i9uiY77xLdcdTAwMTn/XHUwMDE4sK5YXGJcdTAwMDHoMT1RrNUj3vVKVftkXHUwMDAxXHUwMDE43NVcdTAwMDQ/fVbtSJdjnL5MTtDbqnDrOJ9cIqGbdmEjXFyyu9dcdTAwMTa7sof+WjzC5Vxm9lx1MDAxMdujneB0+8BcdTAwMTBR2NVcdTAwMGZgjdiRkEx6+MuiirCWhodcdTAwMTcm49DOsciFX1xuycvsXG7il7VcdFsvwE68nypccnYuXGZcdTAwMTl0yfZcdTAwMDVhXG6LZU1cdTAwMDLkc3dnTraL9al5XHUwMDEyP5spIDWDc+0/1Ocw/o6kXZ1cIu+M8Cv0eyxnxFx1MDAxZLdcXEeFJoY5OyY1wjeT0Lm7z1BVl9aJ5FwiUl5cdTAwMGVDXHUwMDE4LUBYtLZrXHUwMDFlXGK/XHUwMDA2XCJYjkuYXHUwMDEwf8G33FNcdTAwMWT06oCuSTdcdTAwMDSnjy9YKGve6NI0XHUwMDBisZOQhqFz4J6fXHUwMDAxKvIzo9s8obVX0DztyKHz91x1MDAxNTBv10JsJP/2KFx1MDAwYvqnXHUwMDA1sVmI2L1md1x1MDAwNuL7UJxgvO5d+Km1N52ye0P8NLnB5uN9vbwxkFx1MDAwNTq+7HFJa1xyXHUwMDBi8ta1aLI3kK3vXHUwMDFmfkYkJa1cdTAwMTl4JYqztVtcdTAwMDA/53eOxVx1MDAxYcJMyozSlsdcdTAwMTAhytiSLVx1MDAxNX4r4Fx1MDAwMsS2ZF1LWGKEmbDhKKCn1+c6TW40XHUwMDEwg3zin3k49/a6RNKokE6mM2X//Z1mjE/Sq6rHRlx1MDAxYeasf2c1OPVP9naSpXhcdTAwMWRcdTAwMGY2ram2QDqkXCIywYgwXHUwMDFhlvipe1x1MDAxM0ayOFbL12hcdTAwMTjQY4KqXHUwMDFhzWBzp4mCN3PYMybdtUBcdTAwMTdQ7KVcdTAwMWFcdTAwMDVpJEhSq1ZcdTAwMTKYXFz6Nef86omS7slwXaVcdTAwMDG0JFxiwNJnVyVg/97M5aiba4aoeLJcdTAwMDakhPuzXHUwMDFhrFx1MDAwN3Z/Z3BWXFzjK1x1MDAxN5wpnv7WMjhZRKfUizdEvzkhecLtzV/hl13Bv95eUcdU0IFmRl6afG97WuBcdTAwMDRcdTAwMDD3R4yiYi+UYuaQXHUwMDFlZcnT+F9/YOHiXHUwMDE1mM1rjrh8nlx1MDAwNtl3q6ZcdTAwMWJmV6FcZvZcdTAwMTI1pMBcdTAwMDXkmz4x+l9fIC9cdTAwMWVX8peWmoGGXHUwMDBlzu7YXHUwMDE33+EkVlx1MDAxNPRHK0BmXHJcdTAwMWT3uXL7XHUwMDFk0bT7XHUwMDEwPfug8vxz6YvZVVxi2KhjJlx1MDAwYmdjqetcdTAwMTN3+UVOU2Z4Qlx1MDAxMXBccm5SrqlcXOT7vDBh5o1IXHUwMDEzzMe0LUHcKoKng/FvX6hKs+b0mffLbJzdVTJDXHIxJcZ3+1x1MDAwMp17XHUwMDE0uFx1MDAxNUmT9mMxz0qaXHUwMDAyvlpcdTAwMWJpQPt87zKE1UF8YXCTxDQz/p29Z4j+x3j++ltfkFx1MDAxY7FHrVxuf2coKnU8005l6bhcdTAwMDKWwlx1MDAxMZRcZpl0LmfkNsfw2mBmWdKdkYsy7/Q6a0S448+r/997LmtcbiFhKHKYaXvz0XNcdTAwMWVl3LnzWy/vXGZ8xcU7jVx1MDAwZWfd91x1MDAxMXa+jWKjKc1yLJniJKtcdTAwMDWQ9+/oXHUwMDFjXHUwMDFjLDeWJVxi9PJcdTAwMTU/8PKvn7aDV3HbgWf+r49cdTAwMGYwpFx1MDAwZuZcdTAwMTVcXK+XwlNaln2R+1gnl+ZgXHUwMDE1XHUwMDA3NtQjdOlcdTAwMWLJcU/wT3baSJWWrL50pb+bYctSf0LZtumuylx1MDAxYVx1MDAxNmNcdTAwMDeKQVx1MDAwMH1HXHUwMDE0Wlx1MDAwZrGg/39lnceOtFCQpff9XHUwMDE0rd4yXHUwMDEy3s1cdTAwMGVvXHUwMDEyn/hcdTAwMWTek3gn9btcdTAwMGb192g2k1ItSkVBKm5EnPNlcoNYXHUwMDA0bWHnnmq//s2le1Y7mq78o/cutkbOXHUwMDE2UvWl/aZr3lx1MDAxY1x1MDAwMEbY46HSv7lcdTAwMDDTKlx1MDAxMCmDc0u7opWvsa2ZrDWvXHUwMDEx4laEn1x1MDAxNSZcdTAwMWQyoFx1MDAwNGN9sNdhVUBcXErQv32joDmc38phm81xeLgw9c2VKzFE4ubyXHUwMDA1Xify1qpcdTAwMTJOXHUwMDAz9LP0v9o0Xsr9f2P3K2rAKFvpxG0l+Pa9+Oss5lx1MDAxNlx1MDAxMXbWTba/PmdLwlx1MDAwNlx1MDAwN28+pFxcV83qmFx1MDAxNiCdXHUwMDE3dGVAaTHeR5qpoFxmOtXVUGrQgtdkfTlmXHUwMDA14nndtFx1MDAxNSZcdTAwMWVccqJtbcHFlb2dS1iafWFqXHUwMDAxxq5cdTAwMTK4WIYzXHUwMDA0OTRpZVvEyLGM5VUgMbluUyqCtP32YfxtZH/rVlx1MDAxMYtcdTAwMWVcZrpbI3R3My6CJp6lS8CyfMBCJ6f8W0X0XHUwMDFlMrPD20WIhlwisCfVv/3MT0kpSWDwffZBmqrqS62b8NVOoI39coKkeZgsXHUwMDE5sL/MM5+27d8+U+OnXGZvXG5cIlOi4Vx1MDAwYvQ3a11ivEZrXHUwMDAwQVx1MDAwMLWjuilIXHUwMDE2Olx1MDAwZUqpI6b3TM3VLlx1MDAxMFxcZc+84y64v5hyUKBQdaUxWUCeMYiMcOU1SlLQ3J2udK3VkJFcYlxiQ9vWLdg5w2v/c29cdTAwMDKCXHSP3ST8vl5cInMnk8a9ufH58s57mcD7VUH/c9Qsy5V94r5PclomRXh/fYSdXHUwMDAws/xK3L95pSalUKl0ocCHizJ/cm9cdTAwMTdcdTAwMTDTdsubv++FXGJWmmhlXHUwMDE1YtN4q6BcIlx1MDAwZoAkwF8mWz2QbN3fU8zSXHUwMDA051x1MDAxMD3kXHUwMDEylPfl88VaJSSCnWbSzZ+zp79cdTAwMDRQjVx1MDAxNCSHkzhcdTAwMTNcZuf+mfNcdTAwMDL+XHUwMDEyN8VcdTAwMDNPuavE9XIjkmPGa6119cHcbbvdqU7GyfxS7jnXXHUwMDE2up9o7iaZqVOkgozT1Fx1MDAxY332/KP/5f4xavN6w+yJK19srCu5XHUwMDFllFXldN2a+Vx1MDAxZvBcdTAwMTRyzGGIjlk9MWHcKomrosboY1x1MDAwZVx1MDAxNdTCNDw/8auRm5pcdTAwMWHN+KpmsKiwrffj2mUnlfswr1xmXHJBb1x1MDAxM8WmbplcdTAwMDPa2Vx1MDAwZkv5ep3S8Vx1MDAxOYdMP2VnID3RXHUwMDA3KU7aXHUwMDBmayQ2sCkwJLlq9zdR6DqhYGWcYVx1MDAxNztXcMOk30Ij91x1MDAxN+qrJlx1MDAxOL6N52JcdTAwMGbpj1VBXHUwMDBl5Vx1MDAxNlx1MDAxY1x1MDAwNOvPXHUwMDAxaFx1MDAxM1x1MDAwYjPm6801N7qwxE5k7cjwfnWs9nZcdTAwMDTt2k8qzVxiaI9QQcyL6Ix/ho8s2Fx1MDAxM0N8Q35cblx1MDAxY+wlSIlj+V1j7FieJMdcdTAwMGZrsmiNtZZglalynz4kvnujR8uNZDGLiS/TtJdDyGy6aZZXrGVlNyz4XHUwMDE0uof8kXbqXHUwMDA3rXzc39N332BcdTAwMWH8nU5cdTAwMTXa6JumXHUwMDAwS8k34W39RkX5qrlcdTAwMDJ3S6FcdTAwMDBj/VlFsVx1MDAxNffhpzGHn732KTHu0//s219cdTAwMDDLXHLE+5JcdTAwMWKZZ810nVx1MDAxNO4sXHUwMDE2UouURTG1XHUwMDE1m2ZcdTAwMTjmXHUwMDE2Y2TPbd84plx1MDAwNlx1MDAxNjHl+jO96VlUXG6UPtKdYqhf7p1fIPHXM/lcdTAwMWEmdiuxpbLBdzIrfWpcdTAwMDNcdTAwMTnRXHUwMDBiq4u6XHUwMDEx+E6FRlxuXHUwMDFmhfc1hlx1MDAwZdj114pcdTAwMDcxLDHr/bNcZnFrRurj3jWRXvtA/buXLeXUr1x1MDAxMCsvJFXZ+O/ZXHUwMDEx+PrZlZEl2pBe3P5cdTAwMThcdTAwMDVeiE9cdTAwMDVaXmpcdTAwMTLsp89cdTAwMDY2XHUwMDA2vlx1MDAxZcpcXFx1MDAxMWlE6sByXGLHOo31wvxcdTAwMDehvaiMQVwinMKdXHUwMDA0afzSu/pcdTAwMTODKrmGXHUwMDAyXHUwMDBlXGZfM9Cxo2qwbee1XHUwMDEzLr3nbJNm69qLTFx1MDAwZjZoQiyrXGYyp/7NcEVrJLFcdTAwMDLzd//YNlx1MDAwNimT0jH1t+t0xVx1MDAwMbugQsdUXlx1MDAxNodK41x1MDAxZp+WlXzNtkNNilx1MDAwZpwv0ylCveErfodcdTAwMGbHbbU6p/lWLNi+vYTShFx1MDAxOUexXHUwMDEwn0dcdTAwMTko6FbEMTplY1x1MDAwNaVcdTAwMTCq7Fx1MDAxMaxguSpcdTAwMDWAKaLo6TffwVx1MDAxY1x1MDAxY7SII1RBYPuIXHUwMDA1ZOLMy4CjZiWNKaCw3FdcdTAwMThFu3G5iFx1MDAxONheZi62RpQnuiY6XHUwMDBiL1xm6fW343Tqo0/dxFxuW97nnfaTXHUwMDFmQXjMbMc8xoJcdTAwMWVmpDbBgLpcdL3wvbJGVHStXG4xVZOR1+714Vx1MDAxMl7LbWTzaFW2dbkn4XdcdTAwMGW/q+wrcFhcXFx1MDAwNk1TOpSzOlx1MDAxM5x5pWIqXG5/wdaGJDxkfj/YQ1u9TVx1MDAxNF2PNSM2L0+on1x1MDAxN0Z0aEdcdTAwMTJ8revsXHUwMDA2XHUwMDE4QiPUn1x1MDAxM71cdTAwMTX2msBk01xiqe9MmVx1MDAxZlViVOC6j0GHXG7Zn1x1MDAwMOs3SzAxo4FybVx1MDAxNVxuXHUwMDEwQJLTW3D1XHUwMDEwXHUwMDFiMzLWqfVIM/XscaNcdTAwMDT661x1MDAxNoy43HHjXHUwMDE1IVBDXYZT0FumoufOa1xyabY1gNfCYH60g2tuK+r1QsuYXCLw6Vx1MDAxNIRD83qjTa5qXHUwMDBih9rtNERl6Wr+TbgzXntcdTAwMDfqQGnYeIshJ4OkqdmvTFvN9yZcdTAwMWOvwzm2a1gjr3iqdFlIeihfPtQ7dqlcdTAwMDMyk5SbYcp5JtBcdTAwMWSUV9xcdM4lOY0gNEhKwCeDJdjBrFx1MDAxNVx1MDAxNyxOXlwiXHUwMDBi3ntFc1x1MDAwMzmbOja+4mHiPppcdTAwMWZUUbGtMqdcdTAwMGVcdTAwMGZlxP34xFx1MDAxNLcpeTb2Rvx7v1hfq9hcdTAwMWZcdTAwMDZIXFxKXHUwMDFhIH/yQISwMVxuXG6US4SWXHUwMDFlQFwib9beV/d1j4P0zOhcdTAwMWFgq/VPXGZsU1i+NbhcdTAwMTCUvnmA7TlWXHUwMDBma5iEZjhcZp3PrDiET/3Nglx1MDAxN1PnXHUwMDFhbUL+2yuq+/ZQRFx1MDAwMWfU1Vx1MDAxZNmxcFNcdTAwMTa4jeGeyWLgv5I27kPxlWJWXHUwMDE2Vsb4+jns37lcdTAwMTLoxlJcdTAwMDQ2XHUwMDFiRifl91W3NuvnV61LKTssLIRX5TTNT1e4z0NGPNjWa8RYvmr7gW/bguez/IeuYiXZiX59rVx1MDAwNcux3NdcdTAwMWG8XHUwMDBiXHUwMDFkMyRcdTAwMWaKm+OCL7FcdTAwMTPLvrwqXHUwMDAwXHUwMDAyaUGBTTH0XHUwMDAwMe9cdTAwMTjdX71cdTAwMDZGSUStXHUwMDAyOjtcdTAwMDXU5GaKe1x1MDAxZKhaOfz2okOjhZQpmCRcdTAwMDNE71x1MDAwMGTtXHUwMDAx0aGoXHUwMDA2ltieO1x1MDAwYp5r+Y6gqX75YVPpsOdCMlx1MDAxMlx1MDAxM1x1MDAwZoJcdTAwMTA4Ulx1MDAwNlx1MDAxOJdYzeixdFx1MDAwNiZ1up+sVC7aUlx1MDAwMqjsuUaVMrwkZsKPX0RTOGu4o0Q4qtqJa/mWhIQrOZ+ZXHUwMDEzy0BGL3xcclqkUZ9kMVxi19oqgcZI4WcuZYnZJEYtWZ4xXFxMTlx1MDAwN5SdnMI7/MpccvjrZFx1MDAxZIo0/WrIIzVAU4hgsXDQvFx1MDAxM/O09U5YyDaw8YeqryxcZlK5XHUwMDE3L9hQ+cX9bjnnXHUwMDE35KlcdTAwMWRJmDnt+PDA7OHRJCw2KmqToPJwXHUwMDE4QGRcdTAwMTfG3ypzx/ZD529cdTAwMDOkqo5g8jfkXHTPXHUwMDAyzOdtXHUwMDFkvlx1MDAxMtXw2mafNWxYc1g7p01ww33ZYJ/Dk2jMkDNcdTAwMGZTQUqoPFezdrxcdTAwMWSBO2AuaGtaYe5cImNdUcVcdTAwMTVcdTAwMGaAQbN63UFJuk5Nq0nbtJkg2ebe4imV8PWWXHUwMDFh3par3KA81UFcbiVoYy+yXHUwMDEzlJZ75kaQXHUwMDExe9SZXHUwMDExXWWLrcNspJ06uoTawYbxi7m97TI4w3axdi90XHUwMDFlXHUwMDA2PkTgJKmFIHtTdcFwayiW+Fx1MDAxOK5cdTAwMTRcdTAwMWOSI1xmTFxyXHUwMDBiKzijY+FZebD5XHUwMDAx9Fl8onVcdTAwMGJEO+Nay5GB+L5cbvNcdTAwMTOMiqWqOlx1MDAxM/KrNlx1MDAxNa3sQiZLyMtcdTAwMWaWwVas15fkRrNstjOr57mxXHUwMDAxipDGSJdZWJCYePr8oVx1MDAwZZqQXHUwMDBidKtgqkUpWtNH51x1MDAxMVx1MDAwZn7zQ1ZcIpTCXHUwMDFhzHvta0yWj2pcdTAwMWaT/pW06IvirFwiVVtSt4RcdTAwMWOf8NxlXHUwMDA3XHUwMDBmutXVfWa7Okx3TPjA9StcXJKrdz5PrzShyiG7obvaQ1x1MDAxN4lcdTAwMTaYcn1cdTAwMTZh7feP9lOl3l+BM0le9/xbdltteTZ18Hbzaqv6YPjzacVyTLyhycbS6zeiN6CnXHUwMDE5TPo6iV1cdTAwMWVPhFx1MDAxOFx1MDAxYkhov4/8XHJnaow78vT3IMpFwGnfLvJNXFxZyXG0Oo+qr/Ymqif3p6vbjax5R1FfyuJcdTAwMTRs/lx1MDAwNJCQllpcdTAwMDR8aal/XHRcYrpcdTAwMDL2x/SFyLisXHUwMDA3w/Gdtd08QEe0sShj3kVcdTAwMTc73qRcdTAwMGJMXGL8xPNbJkjwXHUwMDE06cwmnDF1NGZcdTAwMWRcdTAwMDNcdTAwMTZcdTAwMThkXHUwMDFjXHUwMDFk8CFYbZokNZXCXHUwMDE28qZllleHeO4kXHUwMDE0bWBcdTAwMWI5aM3xQHKnpSpF7rzCxPhcdF3iXHUwMDBls058wjDbh1x1MDAxOZGZ7NZcct9oXHUwMDBmXHUwMDE54trPTtVjXVx1MDAwMpf5mMVcdTAwMGKGjlx1MDAwMCRk/HHTUFx1MDAwMsV1XHUwMDE3XHUwMDA1XHUwMDEyKUP6nFuTkJLcg9hoXHJcZoZcXFx1MDAwN5I+bDuDXHUwMDA16Fx1MDAxYlx1MDAwZoTOMu1BKy7m/87CXHUwMDFi8oRs+mFcdTAwMWRwXHUwMDFkiMUzXHUwMDBijUMvzO9cdTAwMThcdTAwMTbxXHUwMDFluji1+23mXHUwMDFlaSpcdTAwMDLTT1x1MDAxZCxGXHUwMDE4/N1ZweNcdTAwMDXWXFxh8Le2et70k7skXHUwMDBitKNcdTAwMWX7XCKZ6Jq141x1MDAxNdmIXHUwMDEwxYkuXHUwMDE3OqehXGbIYb0v4vdcdTAwMWP7L0a8L1x1MDAwNWVsTVxcxe8nXHUwMDBmeFpcdTAwMDSgcvTUKlx1MDAwN41Yfvx9nZPBdHtcdTAwMWPX4lxueP1/rS2UnHxmxVWGyk9cdTAwMGVfXHUwMDBlm3XPVcrwVYdacUrfde64pSB3I5JcIi1Fi32LKWXRXGbg7fJcdTAwMWVMa55FIcnDgJ0gwJBcbsnebjjs6r2oKC6v0Ca1x2ylWe58WXyyXHUwMDEwRDIt+HFkY8TsSFx1MDAxZYArI5L62tSCcVx1MDAwMSXi+u3L2a378UOs05D9m8hjf9ZAR0/pXHUwMDFmmOdne2VKUSrU9kCPc+nZRVx1MDAwZlx1MDAxMyffSlx1MDAxMJPeuFx1MDAwZXxcdTAwMWKPb7lYTp3O8FxiTVx1MDAxZaSn5P6h4/W6dVx1MDAxOCh/4NuO5p/jWl9pf+D4S1x1MDAwNfZcdTAwMDPuUjVcdTAwMDFFOVx1MDAxND2v6Ld2QXvjd5lcdTAwMDIwXHUwMDExdnyeINHr0NmmvLGnXHUwMDA0XHUwMDBlXHUwMDA14FFcdTAwMWVtS3Tb9fhFKXeNcVbmYFKm3UZKzFx1MDAxNiubRZtcdTAwMGVRsFx1MDAwZZpcdTAwMTPPlM+exrQp8Fx1MDAwN1syXGJjXHUwMDE43/7w20g8n/rgJWe2rlEnLvWOf1x1MDAwMkCFTlx1MDAwYjE7UOkxM1+crVx1MDAwMuzB32K/81x1MDAxZok7w1x1MDAxOdREQkwtJdpQXHRBSTeF6Fxm0ir3RXPVjPnKf0M6lsbpgUiF1efySYRP5Dp25nc/oGU9fudRiKz4fDlcdTAwMDQ+ZIB2gHTNoMOFXm3867tKr3vi8/ZdyvUhTeu/37jMTTywbt5cdTAwMGJcdTAwMWLkTLifQVx1MDAxOHs0XCJfyZRcdTAwMTm5km2LXHUwMDEyok++k9yQXHUwMDAwQFHgfds3frDATXuP54BiXHUwMDAwmNjtj7uE7LnGXHUwMDAznPNzMaulsn78bkstfb+uTu6oXHUwMDE2XHUwMDE37L9H7bxcXFx1MDAxYnlV69JUhH0zXHUwMDBlwkBp3qCyzmU98CdcdTAwMTJPT1Y5n8avxqemLilwObZcZmurxkIrfVx1MDAxMjkvZt9WvZhcdTAwMDOxOrtcIp/iSDKcRsX6+y7ZYXZcdTAwMDNsMerCTpnZX1x1MDAxNdhcdTAwMWNSP9uFd1x1MDAxONfYsjVkxqvglUA9XHUwMDAx+8fAJVJ/YI3FXHUwMDEyyV/LOuJWZPY/syzo3r1cdTAwMTaYzz12b2bOKvj74eOg2YhS8a6eX5Smllx1MDAxYf1cdTAwMTNkTY23XHUwMDFhK61/RcFZzF5JNvfpXHUwMDAwejVA00GwJ7jHXHUwMDAyf8Sar3lPXHUwMDAwObFjJYfN9OOeMFpcdTAwMDdB9Fx1MDAxM8PpR49cdTAwMDcyqlx1MDAwYuhcdTAwMGXz8TxZXHUwMDA0UqlcdTAwMDK9/Fx1MDAwNO67XHUwMDBmXGZPsZ9vgFxmUdQw7GD766KQqOBaOuXoxnmbWbnV3pIrlFx1MDAwYve8ccNz24YuOIK7rMZcdTAwMDK/iteGeZiLK+rllVb+XHUwMDA0XHUwMDFkWC6L0WnHXHUwMDFk4110nNAy1eWchF+dQ+IjdzH9XCI8jtLjLtRpvlx1MDAwMOzH+zTh+Fx1MDAxYczsd1j1vTrQd4adXHUwMDAzXHUwMDE5PjS+xnHVXG7fhlxy7GT3Pr/sW6eAYkT63urbJlx1MDAwMYd8deSKz+6gvVx1MDAwNZtcdTAwMDRz74uTXHUwMDFl6+PQo+o2YGS4kFx1MDAxN3N/XHUwMDAwXHUwMDA0b1x1MDAxNaFnTcXPuXl7O1xy2+HfcfdcdTAwMDNm4E/XPaxh9JNuQVx1MDAxMnN/natv4JZcdTAwMTNy8ilFaDJcdTAwMTjmu0aF/HbKQ1x1MDAxM4ekuFx1MDAxNlx1MDAxN2BcdTAwMTHmu3nzuH4/sP2ynZv2XHUwMDAxXHUwMDE0KrjDYU62xS9cdTAwMTdG45PKhyVodfiQXGJcdTAwMGJK3sHpZFx1MDAwMKJcdTAwMTEqXHUwMDA0SW7LN1x1MDAxN2/rKFx1MDAxNO3yrqo3UYRXy006j7iBltzv+UCZLaZcdTAwMGL50rM6ei7S/Fx1MDAwZUG2XFyapVx1MDAwNYNcdTAwMWGSvfx9XHUwMDFiXHUwMDAxtGWzTC+VWbAywDlcdTAwMDYwjWk7XFzLYmXc/+J+01BMxkTzlquvv4H4xZZBpSSl7z5cdTAwMDS64lxiXtW3wOfOLWuk5dUp08cpWVx1MDAwMFxy8LypJspA4+xcIvuIbMjf1aWvTvRP2LPWXHJoXHUwMDEzYeiouHiVoFx1MDAwMNVr+MFTd29cdTAwMWazXHUwMDExXHUwMDExM16zYlVcdTAwMDX9XCLZe37q+NZKfuCmzeGQj4RcdPE2XHUwMDAxXHKGuL9cdTAwMWI9PerNrSZJ6K1cdTAwMWOQ2/9Vvq+OjyxCKmJQrW6UklOxpJNEULJcdTAwMTFcdTAwMGZcdTAwMGUuPFx1MDAxOEtRNUDO17mZwVx1MDAwZXWJ0Z+w1lx1MDAxM6324+eh5Fx1MDAxYfOD5GKNWDKCL4V2Q6JcdTAwMTnsyFxmI+BpimyTg159PUGpM8hM9cE12mCWsYXDjiVcdTAwMWVPzlx1MDAwN1x1MDAxNO1uaok0XFzEkeCFKFB2545ojGCntCjjSynP1DZcdTAwMTFv6YLSZLb55fxF3qKz6nhcYrfLWj4nSoOSjHwpjNPun6l+bD7cVjDelKeFpjdrkSGQwYKzzXxLXHUwMDA3dIiwZGw9vqvm2J1v9jW5Xoq1xvSBfiSVzftu7lx1MDAwM02Nhd9OXHUwMDEwU+Fprb7M8K75nUm6YX9cdTAwMWLl9Sk/o0eZxkk5Ylx1MDAwN4w6lYoxK0NcdTAwMWX6ySj1lGmPXHUwMDAw31x1MDAwZmNcdTAwMTE931xyruOlPlx1MDAwMX4z4pLU5mZcdTAwMDFWevtWl+95vnlcZp7AhaK+XHUwMDFhXCKUq1x1MDAxMrtcdTAwMWHuXCJrp1x1MDAwMlxumkuebLDykXD7/bXOnlGQ6lFcdTAwMDVFVNmA5LVqh2Xg9Vx1MDAxMlRKfNZX0rAt0uFi8j1ijJ5cdTAwMDNcdTAwMTLkj02EZ5xcdTAwMTN2XHTrcChH5TN2XHUwMDEw11V9tPdXniguMDPZz9AyRVeyr8IuQid0n1x1MDAxZZdvnTNnXHUwMDEwb1WA5ENcdTAwMDGKui6Nz4hcdTAwMTlp9u/aXHUwMDE5XHUwMDAyk5zHJIuejCM6vdxYooXysjqrpzBllaqZnr1cdTAwMDNcdTAwMTnFT45sTMfcN4Aqy8E/abhrhVx1MDAwMXE7ZFx1MDAxZHdYYkqC5bRcdTAwMDf9w49Zdqf/ht4nZqBcdTAwMWZQXHUwMDFmMqfqcPRcdTAwMWMy1sxcdTAwMTDLxU2NtbTlnM+7oSBcdTAwMGK9JOBH3P3qV8RcdTAwMTjayy5wTVQtfF5cdTAwMWZcdTAwMTQ8pFN96O8zXHUwMDA2o4WzfvHc/jm+ULHgXHUwMDE5tSVcdTAwMDRcdTAwMDOSXHUwMDFm2P1cdTAwMTeL9i9cdTAwMTZ7mrTjXHUwMDA1TuM8XfJb65pcdTAwMDZcdTAwMWXt9frLXCJcZlDNZHfhXHUwMDAze51cdTAwMWL5otFYm38hMoVjNDMpavBxX05dP87nbZWUYG+CvM+tIPkksbTHq2T3VMy6uMlcdTAwMDCDglrvZa1cdTAwMDFSbz/2IPEmQWFn4Fx1MDAxOGNcdTAwMWO5tVx1MDAwNUBjLDX1tlx1MDAwMuWZdErzXHUwMDAyXHUwMDE3TFxyXHUwMDFiLlx1MDAxOVja1cKeXHUwMDBiYL9MsEXvL1x1MDAwMslZ0e9CXHUwMDBiTIxcdTAwMTa+ktRcdTAwMDJbsntcdTAwMDNtOPlcdTAwMWRcZoRU0GtcdTAwMWZcdTAwMDAm/TZMNJHd8D8xQUf6vCm3gZ19gzRiLebWk1xmXHUwMDFhmadN4VVgglx1MDAxMlx1MDAxMlx1MDAwNI8+44/lXVx1MDAxYiNZWt1cIlx1MDAxZudmv3ZobMXpMyVcdTAwMDFFXHUwMDE4XHUwMDA1ULZ2qZl9fdDXgu1q+lJcdTAwMTDRlj/9y+nxtFS9oEmtmVU8OX/Dz1x1MDAwMVx1MDAwNlx1MDAxY8ZwsJ60lzWOn/2YQ+q1+IWgZYuScFQ8jcz7L8hMMZqo6IaWpynpxsWUPFfFfUi0bMHGe0OWQObJ/dCpoojKb/bn2o9kTOiFulxiXvPzp3L4mVKzXGKcTeVcdTAwMDFBVvp7XHUwMDFlK4R8e5tcdTAwMTWLO7PwYSeLlnjqsEokalwiwfiTszuePdjM/KVNs2Po6bRcZi2J/j3mdU21LCWAL1x1MDAwYoOaa775LoPNRPyAXHUwMDA1a1x1MDAxMHGhMan+5cGMPTzwWvbK62R3arJcdTAwMTBcdTAwMTCUP62xvKdcdTAwMGI1sbVNUt3/XHUwMDA2lHVcbph+ZjBwXHUwMDE3Y6BcdTAwMWK4PMZLj1x1MDAxZF7KXHUwMDFm7E3y6WU8k2Kw65i7XFyl0Z5cdTAwMDV9XHUwMDFlzt7I22G/XHUwMDAzLv83ndWlwOYzVsohKJiUxZWdddV7XSnFn0qu7fNF2sBy/aO0kJfW7yPE52Do41x1MDAxNzWZKkxU/rB8rOK3d2Vqg+PfdfpcZu1cdTAwMTNTQFx0XHUwMDE3S/xRV/2zXHUwMDAwXG5cdTAwMTE7yVx1MDAwZiVcXKpjvlxcx7lOXHUwMDA2V1x1MDAxMO9cdTAwMDOe/KLS0KVcdTAwMDaWMvf5XHUwMDE3r/a7XHUwMDBlK0lccsFJTSY1lIL7coZ5dyY9k1x0LWNW91x1MDAxYlJYXHUwMDA0TD7sXGbqXHUwMDFiQpX6U/5yv4CExXxcdTAwMDXRtr06gbmTeDFcdTAwMWXGkjP0p+K4LzMrUiFk9Vx1MDAxZllcdTAwMGVfXHUwMDFhb1x1MDAxMnBxTCXcmFxmR17vuHm8KaJcdTAwMDNbXHUwMDA2XHUwMDE2wYqaJcp/WjJei8N5Nme7X9hcdTAwMGbhM1wiaFxi5rGMnM94XHUwMDAzuWxM9IKnQiivePN89t/UXHUwMDBmOzzU6UFcdTAwMTdq5Y1BxuHN9VwiYSrnVUYxn3o3tlx1MDAwZlx1MDAwYkvpJ+5qwYJcdTAwMGXDKHMxQ1x1MDAwM/lkhXRZXaL7YjuXXG7Xs8czuGe3T4+GXHKbRT3JTsbB79ukXHUwMDFhgMxcXPmJ31x1MDAwNdZcYq1BqNNmwlxmXHUwMDFmZFx1MDAwNtqQZSuWk+6W6CZSOUxcdTAwMWXVUyew50I1g58mKWmWU5ycmfOjW1hcdTAwMWV35fOi+itcdTAwMTNcdTAwMWOgcl2wcFxcOVx1MDAxOUubY+BcdTAwMTSBXHUwMDEz7jrP9E1cdTAwMWKEXHUwMDE2XCJcbo5eXHUwMDE5SNSLc3/GKFx1MDAwYmYjk1HmYufDXHUwMDAxz1kvv8Wxkc/w9/k0moMhdG/WN6feNl6mWedEmD1cXJl48I9Gpcz42j8htNVcdTAwMDOs4Ip72aQ80/xXcF+I2EXisOhlsExE8lx1MDAxMXRcZqrYhL+/82yCQmBB99NErmtiysWpv25WXHUwMDE3XHUwMDEzVDVcdTAwMWOUXHUwMDEywYEyXGbkq3/cJMWX61x1MDAwZVkzIKXT8Fx1MDAxYnD4aa2YpfhcdTAwMWFcdTAwMWJmOjRBfIuYx9lSpy3fZlx1MDAxOFx1MDAxNplUR1x1MDAxMD1cYklaYD1i/eBcdTAwMTm60VOxXHUwMDA1XHUwMDEx2rCWXpRcdTAwMGZIlsVtozlFXHUwMDFl97hcdTAwMDNkdfjEV8fnPGYvPlx1MDAxZErYykSvdlx1MDAwZl+OQWx/x1x1MDAxMIRMl/goXlx1MDAxMmdA39TVVKxdrd5wvHtcXKh2XHUwMDFifJ/TL/Wxw3yGWPzXPFNfXHUwMDA0vVx1MDAxZbVFnzm2WuXVyz33tVx1MDAwMk7GUyqp/DooayxcYlx1MDAwMjRcYm08/jUjhzNgRPQz9zSlVMXqlFx1MDAwM7KEqdEv501cdTAwMWU/WCG/i5uHrS5W+1WCZla9jbFBXG6uyoJH06W1XHUwMDA2UG3yfDzuT53n8tzVKT1cdTAwMWV5autcXLqo8oHHfY36uIvMV1x1MDAwZthcdTAwMDClfHzZrFx1MDAwZvk3YnbrXHUwMDEy7GOj01i+IWvoetpcdTAwMDCpXG5m2MRI6fqeXHUwMDAyMWPwdNtUP5o/NVx1MDAwYtG7/cGyjbBcdTAwMWHzqmCwdjhzulx1MDAwNozS16s5XHUwMDAx6TrLtXrEIVx1MDAxNunf/qJ6fqG5uFx1MDAwZsBDyVxcOSqOXHUwMDEzJUNcdTAwMDHdWs1cXGZ5e/pqXHUwMDFmbZKu7CEnXCLP5Lw6mvOfgFx1MDAxM7PiJ2RJXHUwMDAw4GbFWZzt4GSw3rWZpnuapV/t7ENm51x1MDAxNZ1cYmu+SahccpXb4mhPnTLgqrfqSDXpgfrnmH0mNyTXbs/vL4dDg/NFXHUwMDBiOVx1MDAxMZfQ7fFk6zeZgFx1MDAxZCzZXHUwMDA0ylMt3LDCqi00X2+xutmEqTplaPzv4MvzXHUwMDE1XHUwMDEyvH4r6n5cdFx1MDAwYs+x6Vk6PjJxKFx1MDAxYspnXHUwMDE2vLG6kVO2P3+PoNb53Vk49bEn8KmOXHTv4u6p3/Nx/85X3c8rp+XrdETIs9fz587ve65cdTAwMDf/bUIhROdcYpjt4aeNIUlcdTAwMGZBczTg9Co+6elWzqlcblxmN6GJ17ZHnYvBiqjA+Fx1MDAxZNZKlmjf/qhcXD5zoVx1MDAxM69cdTAwMTY9g+A6eIewkVu+9ZZrXHUwMDAwid9jJmNLmlx1MDAxOY1D51h1IGP2bDmAZlHqN1x1MDAwYsVcdTAwMTSMUJKi9Zddaz/xZ85PPylk/nRcdTAwMWRK5sO7Ykoo859GTOB2/rg4ebnPbpjLji2HIH+W7iR34IZcdTAwMWbJWGzUalxiONnChaLnpklcdTAwMGWaVf90tiNvMsxcbkzGMFx1MDAxZVLWXHLFdVx1MDAwN4pellx1MDAwNNFcdTAwMDT4xO2af1x1MDAwM3v7cDXRVrJcdTAwMGXowOj8XFyi/2V8YVx1MDAxMsh5XGJcdTAwMDNcdTAwMDVccjlcdTAwMDMtXHUwMDExpCQqzmE/YVx1MDAxOJfdyJgsjacqmZSFYZdM5VK6ceOrie6Lt7tcdTAwMWbzteODsjlcdTAwMGV1jP6Nncim3sBQrnQoX+xKmJNcdTAwMWTfo/5cdTAwMWVcdTAwMDVcdTAwMWSrZCuz9o1buLqEXHUwMDEzSfjnWqcyjb6JjrVtgDWjfqetqTBiXzVx7NfPiFEuVjJcdFx1MDAxZTdDb10pXHUwMDBmL1x1MDAxOG9D5rLiX+/+XHUwMDA2Kavan2G8ZfxZzCVgslx1MDAxZUKoOaNmXlx1MDAxZEx/XHRQo1xmIZf5qFx1MDAwMsxsiVpRmpXV1INtVD5cdTAwMWTQLTj9XHUwMDE2XGK7xKVcZlx1MDAwNTE2xLjM+lx1MDAxM91Q+T03VMb9WKM241x1MDAxYoXYnFx1MDAxNVx1MDAwYuCVz41DmOgto1epbUOCZl9cdTAwMWIwXCJlqlx1MDAxYYbAu+pcdTAwMWVBvSZIppqZ+TTLQ4oka8zAb6Pp366A7XKCR1x1MDAxNJeqkXSJy506Uyn6XHUwMDEz9NXggicjXHUwMDFjqs6T5e32p1x1MDAwNtXXTfYwxTxM1iFcZv+GmVx1MDAxMdn1q14sTnZT/sQ3rJN2bFqjXHUwMDE4pruXkFx1MDAxZCU9PriDj1TxK1x1MDAxYXQoyMFWblx1MDAwZsDtnVJcdTAwMThrtpCzJ0iSJFxyPqBmLDhcdTAwMTP/UFx1MDAwZi9IPEGXQ0eZl8fF00FcdHaummy1XHUwMDA35sdqtr/pXHUwMDA3x/3za6Ms+axyRc9voOQzgkaJXHUwMDE4w8XP3HiIZkwluOu3tqyXx3c/4Fx1MDAwYqVRMNxcdTAwMTeqXHUwMDA2zqP9W4BcdTAwMDNcdTAwMDZ269pLLuAjoWvMaic4o0P5jeo7JkTEhO98XCJCK2/7XHUwMDExM2/DeOf/4Kt6XHUwMDFiiO18laD5upR/vTirJ6eo+1S1fFxiXHUwMDFjXGaddrFcdTAwMDL8pFx1MDAwYu5cdLxRwSVBaXnwO9k9XHUwMDBmpynKe1x1MDAxMvrql+nRV3J5M1b0XHUwMDEzXGKeXHUwMDA18Vx1MDAxYVx1MDAwNHFGL11XUuZ7Nt13YzvUMsaXsP3PQFBcXPRtXS5M33wval6nlVx1MDAwND/ehYtTpulcdTAwMWGBn1lcdPlqadfjqG2Df1tcdTAwMDWwXHSbz8FflU9cbq8jsGo059q8NN+SzStcdTAwMTLEbT9sXGY/+KFlPjV6XGbdQZJcdTAwMGbMVMvIXHUwMDEwSZtcYlx1MDAwMW+D3Iqu/6zuW2yC18A/fVx1MDAwM0BcdTAwMDabjW7UXHUwMDA3js2cVYRknlfwOlx1MDAxMmVBnEdcdTAwMDCygPQxX1hcdTAwMWQ/glF9qtzWkD3J8Mn/9DG3vrqy3uHQw1x1MDAwZl+XXCKgzFx1MDAxMLqM+FNybq9bj8ltf7OJfHVavTCI7WdcdTAwMWRTg0grt7aoksvEoYXCao/JIc1cdTAwMTmEzexPLJCuIZ8vqJSfSynFkTOqXHUwMDExI72CXHUwMDAx61RUUu3htLhcdTAwMTXLZNJyg+m7N3FcdTAwMTA1oP0vYH9cdTAwMTmL+lxiXGaZq1xu5PGSWMuYuX9O0+Ntn7W8olx1MDAxYXxBr4xKjUXSXHUwMDA1macs8OVgYky+/Ip3o0ZPXHUwMDBlRCpPI/NcdTAwMDZcblnGvoGTXHUwMDBlpcjfq1x1MDAwNjdDs7LSJuqmKXU51C3Skkhq7/TnQVx1MDAxNStcdTAwMTT2Slb8I1x1MDAwNGxcdTAwMTRMK7YuXHUwMDA27Fx1MDAxMoiu7tibRZkx+dJi8JlCXHUwMDFjNlx1MDAxNbcqXHUwMDE5rLJSN7UsMrv57PtcdTAwMTXp+LazXHUwMDFkhbFCrvlsKUQqsJVJNZilXG636es/YZiHUrVb0cE2XHUwMDAySzXmlfWhocFcZotcdIBIXHUwMDBlZ1x1MDAwN1L1QS8rcDaY/Ytyolx1MDAxYiPG3URv+Zk6vjQ3RHRcdTAwMWb0pL9swpmR+JrL7k1cdMe3oIlRdL2Y7kgm9dXSXHUwMDE2/lE7S/NcdTAwMDGg5E5cdTAwMGWhXHUwMDEyQYnZlOlSXHUwMDFiaS56959iyd4k6Vx1MDAxYXLVved0b3dI37pmhjpcIjirsuTXurJcdTAwMTg6qEBcdTAwMTe9Rluq6IDgg7mVmr1mm0lA0Hip6oip9Sr7XHUwMDFiMH5cdTAwMTHkZVx1MDAxZr+JOZi/l9CLbvfd7YHj/ut//cd//nv911x1MDAxYpFkK/L/+t//XHSTOIxSXGKOoFx1MDAxOIn8v7/3ybo5xbY0xfH/XHUwMDFm9e+g//6Pv5///j9uXmp6In0=KafkaClientOauthBearerValidationFilterKafka BrokerKafkaClientKroxyliciousKafka BrokerHandshake RequestHandshake ResponseAuthenticate RequestvalidateToken()Authenticate Response(invalid-token)if [validation fails]if [validation succeeds]Authenticate responseAuthenticate Request \ No newline at end of file diff --git a/documentation/0.20.0/html/images/operator-input-resource-topology.svg b/documentation/0.20.0/html/images/operator-input-resource-topology.svg new file mode 100644 index 0000000..6865d8d --- /dev/null +++ b/documentation/0.20.0/html/images/operator-input-resource-topology.svg @@ -0,0 +1,4 @@ + + +KafkaProxyVirtualKafkaClusterKafkaProxyIngressKafkaServiceKafkaProtocolFilterKafkaProtocolFilterKafkaProxyIngress \ No newline at end of file diff --git a/documentation/0.20.0/html/images/operator-output-resource-topology.svg b/documentation/0.20.0/html/images/operator-output-resource-topology.svg new file mode 100644 index 0000000..9e1d2b1 --- /dev/null +++ b/documentation/0.20.0/html/images/operator-output-resource-topology.svg @@ -0,0 +1,4 @@ + + +DeploymentPodConfigMapService \ No newline at end of file diff --git a/documentation/0.20.0/html/images/quickstart-record-encryption.svg b/documentation/0.20.0/html/images/quickstart-record-encryption.svg new file mode 100644 index 0000000..9541187 --- /dev/null +++ b/documentation/0.20.0/html/images/quickstart-record-encryption.svg @@ -0,0 +1,4 @@ + + +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nOy955JcdTAwMWJJki76f5+irffPvYYlXHUwMDEwWuw955hcdTAwMDFcdK21urPWlshEXHUwMDAyXHSt1dq++/FcdTAwMDDZVZBcdTAwMDVcdTAwMTRZ7CZnWLThsCGiXCIj3P373MPD/b//7bfffl/tZ93f//O337s7x1x1MDAxZfnuwt7+/lx1MDAxZub1TXex9KdcdTAwMTN4i1x1MDAxY/97OV0vnOMn+6vVbPmfodDrN4LOdPz5W91Rd9ydrJbwuf9cdTAwMWb++7ff/vv4N7zju+a7cTbin/auYKVG8lBWrcg+lkxcdTAwMWO/evzQn5NZdJ2VPemNuq9v7eB1xXhQYsUwo0hcYobEy7t7M0+NgkhLRTXlnFx0JfnL21vfXfXhI/BmUFxuRVx1MDAxOUaCMU70yyf6Xb/XX8FHXHUwMDA0xkGhXHUwMDE4QfBcdTAwMTnMXHUwMDA1eVx1MDAxZOTzhP7zN/TyynK1mFx1MDAwZbvWdDRdmFn/O+6aP69z7tjOsLeYrifuy2dWXHUwMDBie7Kc2Vx1MDAwYlik1895/mhUWe2Po8NCw6L+fvE7XHUwMDFhX1x1MDAxZYBcXLx+71vwS3v9SXdpNlx1MDAwMr+8Op3Zjr8ya4XR61OYXHUwMDE5zlLucc/+63VOXHUwMDBie9xNmU2brEejl5f9ids1W/F7R5GzXzdxv/y6P3f8dTvpl1f+53Xy3a5cdTAwMTlcdTAwMTlzqYXggsuXd07ETqnLV/PTyVFcdTAwMDSx0lhRLOTr9/xlXHUwMDE0ZG91XHUwMDFj1rNHy+7rJpi5xU7k8vVcdTAwMTnXM9f+/Fx1MDAxNSxBYoQmkmL+uuMjfzK8XFyA0dRcdTAwMTm+/pZ/O3mu/76UYvj6iTC8Plx1MDAxOVxilrj7aERoSVx1MDAxMcL0iUf7rFOL1m4rXHUwMDBiXHUwMDA3JKOJeFx1MDAxYmcjXHUwMDExr8Otr1x1MDAxMS78XHUwMDFkhOtaaXbHjWcsSDAnnFx1MDAwYiqlxOeaLIVcdTAwMGUyLUD9JEhcdTAwMDHF8q7GoePPm1x1MDAxYffvlFxip8tfP/OnMcBcdTAwMThcdTAwMDUllVgrpVx1MDAxMFx1MDAxMpq+/ppcdTAwMTdrgJFcblIjbVx1MDAwMlx1MDAwNI4xQsSlXGZzXHUwMDAy4zOu9U19etVcdTAwMDU8XHUwMDFiRdepUdFdXHUwMDBmMmOrXHUwMDE0T1x1MDAxNnil+fuX9//r5Fx1MDAwMe3FKlx1MDAwMlrmT3qXoteduHfemU39U6Nrfl7/9dvr4lx1MDAxZv/j5d//9Vx1MDAxZjc//clYWaQ4PFx1MDAxNEFcdTAwMTJppk+/TnBQXHSqMUWgLSCqXFw9XHUwMDFjj/Mgplx1MDAwNJaZSsWVXHUwMDA0VTtcdTAwMWRQqCDsNIN9YKBcdTAwMTfw98PxXGJccnIw00hgxoRcdTAwMDZcdDpcdTAwMWTuesdcdTAwMWWNR0DYOKaKXGKFXHUwMDE0jIfk5XggiFx1MDAxY55YUIBcdTAwMWSkXHUwMDFmjVx1MDAwN48rXHUwMDEwI1x1MDAxOHGEmcKCnD8uXHUwMDBmwliSwupcdTAwMDFSkUeDwV5cdTAwMTAqKfxcdTAwMGaQXHJskzibm1x1MDAwZXJ4QzB4Xkb546W7J1xiV2I4spcrazpcdTAwMWX7K7A7RSNdl1wid1x1MDAxNNTwYjHd9rv2XHUwMDE1TICo3n3vXHUwMDA0QuiJmbqNN6fIcvbGe8w6XHUwMDAzMX6XWT9RrNG+dzTaX2/uKaN3kYzA9FxieY+175VSvebcscKRVKUz6Ln18Jz8eNY+iFx1MDAwMORcYkfMKDZcdTAwMDXGdVx1MDAwMuafXHUwMDAxgIJcdTAwMWUoUCckJFx1MDAwNtm+XHUwMDAwXHUwMDAwLUCJgYZpXHUwMDA1ak7kJe15XHUwMDFmXHUwMDAwePBzbf6BXG7CwnP41Vx1MDAwNIGRe320XHUwMDE3469cYpg6+EM04WBP0KtcdTAwMDR9sf1ES6lcdTAwMDHKXoHjZ7f9PKgpwWD9XHUwMDE54VxuX1jqTzioXHUwMDAxXHUwMDE3pGRcZlx1MDAwYo5cdTAwMTDFj4ZcdTAwMTNBMIBcZiw+rDPTkqmz4VhQc2W4XHUwMDBlXHUwMDE2XHUwMDAw9PKxYVx1MDAwNVhCXGZRXHJ7XCJcdMzkfHI0KCjYcWRcdTAwMTRewD9cdTAwMWVccqeDXHUwMDAyPFx0XGaiqFximGR2OZpcdTAwMTaIXHUwMDAyJWRcdTAwMTI8XHUwMDAxqlx1MDAxZsJcYqBcYuCiXHUwMDA0Wy0wXHUwMDAwz+WjXHUwMDFlXVxuoTEgXHUwMDAze1x1MDAwMkSAm2hcboZdUFx1MDAwNT6NxPhcZpQ+kSBcIkfZhcUgXGZ+40PTj2WQMiPLsDbGRdLnq4eCQlx1MDAwM2hcdTAwMTKwVbB+8Fx1MDAxMflcdTAwMTA2RVx1MDAxMCBMXHUwMDEyeFYuhYAtOaNcdLBXXGZwTmNttIQ9XHUwMDA0OkqAXHUwMDA2YCaYXHUwMDA2OeFcdTAwMDCcZ/OT4NlcdTAwMDFFU1x1MDAwMvhcYifqseSBeUGwr1pcdTAwMDLOXG4geGfbIYKcw1x1MDAwMlx1MDAxOPbJMFx1MDAxMJ2He8tQUFx1MDAwMeFcdTAwMDBJxUZcdTAwMDEoPn9URGFcdTAwMWI4/FwibFjOY1Fh8KxcdTAwMTRcZiO4P1xuwebKM9lcdTAwMDM5hq1cdTAwMTdcYoZcdTAwMDOjXHUwMDAz4z18Vlx1MDAxMVRcdTAwMWGB4HGKQVx1MDAxOPTZs1x1MDAwMlx1MDAxYsLAkYxcdTAwMTJcdTAwMTKF6WO1gJXTMFxifFxcXHUwMDEzkDEqzjbCcGZ15Fx1MDAxYdRcZlx1MDAwN974w/G0IYxGsODDMO45W1x1MDAwM3JcdTAwMDWcXHUwMDEwcdhcdTAwMDWiYDeeWDqjX1x1MDAxY/ZcdTAwMTT2gWh9tnQgk1x1MDAwMqyMQXzCgWw+JqcwXHUwMDFlbJwhnthIP9JnXHUwMDA0y0iRXHRcdTAwMDKAp1x1MDAwMlx1MDAxYVxySP1wOFx1MDAxNqRAICmSWiNcdTAwMDb87j/O91x0NFx1MDAwNSipXHUwMDA0e1x1MDAwMzbg4WhcdTAwMWNcdTAwMDelgG9cdTAwMTglXHUwMDAyXHUwMDE2Ic7nXHUwMDA2XG5cclx1MDAxYlx1MDAwYqZTc7B25OGjwmjUqD7oXHUwMDA1M8b9XFzqQMQpXHUwMDE4Y2DBoGZEo8c7XHUwMDAxXHUwMDE2XHUwMDEy7Cfwdo1BXHUwMDE09JmXQFVQK3hcdTAwMGbwkVx1MDAwMDtcdTAwMDVb8HA4XHUwMDFjXHUwMDE0RFx1MDAwM85KXHUwMDAyNlx1MDAwZpMza0JcctGF3Vx1MDAwNEdcclx1MDAwNJk9oWIwXHUwMDAx2FCOXHUwMDE04DNcYr46N+9cZoBcdJxLpSRcIuB8PtYwXHUwMDFhXHUwMDA0XHUwMDFlXHUwMDAyXHUwMDBlXGZcdTAwMDcxXHUwMDA1u0vOdoJcdTAwMTNcdTAwMDNziEuuQauB0D1hOpFcdTAwMDEqXHUwMDE4S1x1MDAwYsn52dJx429cdTAwMDAnZOZcdTAwMGYsxVx1MDAxM4PBllLjaFx1MDAwMGCZtTkzdVxifCWwxFx1MDAwMDxg4MnjuVFcdTAwMWPkXHUwMDAw7/BAmFx1MDAwMcTzs31cdTAwMTBcdTAwMTK8dlxuhkab55T84dxUXHUwMDEw2JExcURpLVx1MDAwNL70/IBPgElcdTAwMTJcdTAwMTJ+wMd6OFx1MDAxY6ijUW1cdTAwMDFcdTAwMGZcdEKKxblVh5mDi1x1MDAwNkjE5JFcdTAwMDU89vzAmICVM9pccj68XHUwMDAy4TvbXGJcdTAwMTA6XHUwMDA0glxyXG7LOFDZx1x1MDAxMMuMtVx1MDAwMHOLJUawrZJfTFx1MDAwZrw+TYD0XHUwMDFlQfGxlFx1MDAwNOFcdTAwMTFcdTAwMDFrQIdcdTAwMTQ4gFx1MDAxNyphnpYgbWbPXHUwMDEwoNlDvFx1MDAwNlx1MDAwZVx1MDAwMlx1MDAwZotcdTAwMDBWXHUwMDE0XCLIRFYupFx1MDAwZag6XHUwMDE4QnzULyRcdTAwMWa74UDRwcVcdTAwMDanVFx1MDAwM+0ydupC7jD43mDq4Fx1MDAxZID1hyr2XHSQXHUwMDA1Ns242EBcdTAwMTfBJNNcdTAwMGLBXHUwMDAz+Fx1MDAwNWolXHUwMDA1mDz0XHUwMDE4dT5hg7HwcZgjjGWsx4VcdTAwMTdOXHUwMDE5PCrohFx0Mj2xelxuVlx1MDAwZnZcdTAwMTW8XHUwMDAwZFwilkxcXKxcdTAwMWWgXHUwMDE4QITZXrA5XHUwMDBm9/aThC9cdTAwMTjDiE0oXHUwMDAw0O/cXHUwMDA0wNKCVSeaSoNcdTAwMTVPsDvDV4GsYlx1MDAxM3WAR4VH4lx1MDAxN1x1MDAxNlxuXHUwMDAzioAga7PCj2H2XHUwMDEzXHUwMDAwM6Ow5Fx1MDAwMqBcZpw4dmE/eVx1MDAxMGScXHUwMDExIO9cdTAwMTLQXHUwMDA0gPPhgFx1MDAwNFx1MDAxOXpcdTAwMGWWQymBQVx1MDAwMM/pokFcdTAwMWagO5qDoFx1MDAxM1Dwh6bgXHUwMDE4XHUwMDA04mD3MDVcdTAwMTZcdTAwMDGwVlxcjFx1MDAwN9tcdTAwMDSLXHUwMDA31odR+nh7KfBtgFx1MDAwM9hcdTAwMTFQdvB/zoNAwFx1MDAxMoyqXHUwMDE511x1MDAwNzafiock6lx1MDAxM5hR+L2aXHUwMDAx7Vx1MDAwN9NcdTAwMDZzOMczkFx1MDAxNzBcdTAwMDGIa1x1MDAwZaZCqadiXmA/jYKaIJX53lx1MDAwNVx1MDAxNzC8nkpDJ1x1MDAwMXifXHUwMDE4XHUwMDBmXHUwMDA3XHL4XHUwMDAxaCiD0zDXXHUwMDBipmJcdTAwMDRcdTAwMTM2jMEkwW4/NVx1MDAxZTXs3MTx8EXIXHUwMDEwPFx1MDAwNdBcXC1gXHUwMDAxwa18zFQ+YeCM4DBcdTAwMWGzbNaOXXJGs7XYgCewZICQx+NcdTAwMTlbRUBcdTAwMDHAxIE/Rc6mh1xypVx1MDAwNJ34/C5QysfDwXJrXG7UXHUwMDAx6JShVGcsT1x1MDAwM0FcdTAwMDbmaVxcS2os2WNZXHUwMDAxWINdXHUwMDA1sm/iyIqJc4pcZnRcXFx1MDAxOENcdTAwMDVcdTAwMTOTJuz5lKxQw/iB9ytgj1KdqVx1MDAwNlx1MDAwMa9cdTAwMWLMXHUwMDA0XHUwMDA1tqUpeC34sa7B8sHjXHUwMDAyc1x1MDAwNMpcdTAwMDRfOmdcdTAwMTgqaFx1MDAwNNJ4yISCXHUwMDE3/ZSpXHUwMDAySlxynlx1MDAwZlx1MDAwMz5cdTAwMDfrc+6Jgr9cdTAwMDLkXHUwMDEztEOAp1x1MDAwZsLyWHXBlMLnQXFBIEyM9JwlXHUwMDA3gXxcdTAwMThWXHUwMDA2nlx1MDAwMkjKY1fvR1x1MDAwYpGyd4VIr1x1MDAwZt/+hKLXw7efJ3Jcbu7A5asv52QgXHUwMDFkhuudXHUwMDA05Vx1MDAxZUVOO1M0yE92tD5eRdvdflx1MDAxMsjyaPbDRU5fXvlcdTAwMWMmNa5cdTAwMDJcdTAwMTg7cMiZXHTKvbxrvlx1MDAwZkhcdTAwMTAk4NyA12G4sFx1MDAxNlx1MDAxN/P6oGMyUH5cdTAwMTOXweBcdTAwMTFcdTAwMDBcXMAve/nI6zHZ/c/8edRrXCIn8NZroPvnXHUwMDBmlYJ9XCLgXHUwMDEyMlx1MDAwNoh3cTJcdTAwMDNkXHUwMDFi3C6g2YhcdTAwMDEqc/bYjVx1MDAwM/pcdTAwMGJsn1x1MDAxMFx1MDAwMyngrPHzUyMwckBMTNpcdTAwMDOQLaU0MKWHXHUwMDAzmvhcdTAwMWNAXHUwMDFlXHUwMDAyXHUwMDEwXHUwMDAw51x1MDAwNZ1cdTAwMDckTdxcdTAwMDXwxMSvXHUwMDAxXFyIemhcdTAwMTfvb/FxtYLmXHUwMDE4XHUwMDE0+IKkXHUwMDEyqFx1MDAxOHhcdTAwMDWPvSVcdTAwMWVcdTAwMDTsNmFmcIg4ufBcdTAwMWaUeV6gJsahMsD4cP1kXHUwMDEw/F9i8j7AYVx1MDAwM7Nwzt/gV8Ezalx1MDAwMb5cdTAwMTlcdTAwMDZG83C0XHUwMDFmXHJcdTAwMDX4vzBcboDXhS5ffoFcdTAwMDFj9oA2odfj90cwsP3D2YVcdTAwMDVcdTAwMWIs8eaPTS8xK8XC9v6Hg1x1MDAwMeONYHDAgHubIJZ4Nahf8ifAXHUwMDFm0Mb3XHUwMDAypVx1MDAwNPL4+vifgVx1MDAwMXRcdTAwMWZcdTAwMWNcdTAwMGZcdTAwMTMyg/1cdTAwMTPfdnx2XHUwMDE3XHUwMDE4wCdcdTAwMDe/xvBqXHJ8XHUwMDE3/M5cdTAwMWLAIIPM+N9AXHUwMDBmiVx0n59cdTAwMWNcdTAwMDN+XHUwMDAxXHUwMDA2XHUwMDEz9Fx1MDAwNcf5n1xiXHUwMDE4XHUwMDE4+GJKUkqMYTXnXHUwMDBiXHUwMDE3wMCAroKpN4xUsCfsOLiyXGZcdTAwMDOQmHhcdTAwMDUypy1cdTAwMTfAwDVcdTAwMTbgWJnsXG5cdTAwMDFcdTAwMTT98YDchFxuJKFA2sGF5ueRXHUwMDExQFx1MDAwNlx1MDAxM3U0ZlRSXHJcdTAwMDDy0Pe7L1x1MDAwN8fxwLOnJjwkzZEwuLvgsj2BNezIeSiGlVx1MDAwNCA9c4h0XHUwMDEwXHUwMDExik3yXHUwMDA3g3fI4ygkyCAwSWFcdTAwMWNdgKhcdTAwMGJ3XHKgXHUwMDAxgydcdTAwMDLDcdAyULaHw/1o2CD+tbGBX778mkpnwq0wzWeyXHUwMDA0P2PDoEVcdTAwMGJWtrtsjFx1MDAxM8tNh0+nOD7M/2jYgIPKxIAoUpyaXGanV9v/XHUwMDE5XHUwMDFhuNFHYiw/aIdcdTAwMTJcdTAwMTc+XHUwMDAz1kFcZspAuZAmXHUwMDAwqS4m+mE+XHUwMDAzTFx1MDAwZZnMXHUwMDBmTFxi0q9cdTAwMTGIM2iAd1x1MDAxOSgwXHUwMDAxzniaXHUwMDAy82dmXHUwMDFk6CNcdTAwMDOz9s+TWWdOXHUwMDEzTZ4h10qC13DlMZhzVVxmfq1cdTAwMDQ2/Dgsc1xmmFx1MDAxYlx1MDAwM8ikSVVg4jxFXHUwMDAwlpdLXHKGXHUwMDE5XGYp+MmPY3jGYcDmQNoklJkz+PP5mWMpk1wiXHUwMDAwU8TmlPCZ8e5cYsFxscBjXHUwMDAwX4JcdTAwMWYxS5rEhGeAXHUwMDBiPCqGNDVZRVx1MDAwMDRnLohcdTAwMGWaWJaJulx1MDAxMVBcdTAwMDH2XHUwMDEwZFx1MDAwMDixiYdcdTAwMGJwuNhFglx1MDAwMCAkRSaWXHUwMDA0ns7xXHUwMDE042fDXHUwMDA0+a+MXHSE38VcdTAwMDTCXHRcdTAwMDVGgZ+HhGp5r9K6XHUwMDE53bP8ob87lOW+ma7+aJBAgmDtNVJcdTAwMDQ8XHUwMDAxRky481x1MDAxMlx1MDAxM4B2SnBcdTAwMTZMPp1Er87EXHUwMDExXHUwMDEyqDlcXFx1MDAwM8+YmaRcdTAwMDXE6cVEP1xmXHUwMDEyXHUwMDAwlYhcdTAwMDKuqk2wXHUwMDE23YJcdTAwMDRcdTAwMTWkxqFcdTAwMDHpwdpcdTAwMWNcdTAwMTdcXGXcmUxcXKG4+OfJuKNBTI1dZVx1MDAxNEyvSeg4M7o0yKmxuOAjKZNMSVx1MDAxZVx1MDAxYUlcdTAwMDV81qTUmPNxbo5wLr1cdTAwMDWGNYVNXHUwMDE2xJi+J4wu4JIyuCQ1yIi4clx1MDAxNqimysS/TMZcdTAwMDIlj/Pa7orBcbWCXGbEW1wi+MDnmyHq4emJ8WaAP2BsUkfgu+fullx1MDAwZYJLcoyR6mMq2sOolDSW31xmQ5BcdTAwMDKIRmdcdTAwMTBzzI5E8Fx1MDAwN6RcdTAwMTPcMfzTwYL6V4ZcdTAwMDWq3rh1Q1xy4UH0eVxcSKC908OF/LZcdTAwMTIvf1LpsT1Oi82Phlx1MDAwYub0XHUwMDBiuJw5q1dSXHUwMDAxqbyAXHUwMDA1ao5Stck/15jik1x1MDAxOMxcdTAwMTFcdTAwMTeYXGJcdTAwMWGmJZn+jCvfXHUwMDBiXHUwMDE3ODH+N1x1MDAwNjXWhNDbuHA0Z8DJYKMwXHUwMDE217hw9GdcdTAwMDT5J0rFZkEsYd/MmSVcdTAwMDPtOU8gXHUwMDAwb1x1MDAwMVx1MDAwMZhTwMNjXHUwMDBlXHUwMDFiWOhH4+kglZSZ5Fx1MDAxMG5cdTAwMGXBz1PYXHUwMDAwXHUwMDE4tJF/w480XHUwMDEz5HGCLdhdZFx1MDAxMudh71x1MDAwMKcx0edAo4OMMS7A32HCJCg9Pv8wXHUwMDA3XSCETJpEUZN/ejZcdTAwMWX4Osg4XHUwMDBi2KTfYFx1MDAwMv+vXHUwMDFm57Ldl63PXHUwMDBiYo5mTFx1MDAxYYZJwcWPw1LgXHUwMDAxXHST/EPMiVx1MDAwZZbnibHc5Fx1MDAxYsJrXHUwMDAwXHUwMDFjnOknXHUwMDEynn40bND/ytjAXjNWro9cdTAwMThMtpLJxHtcdTAwMWFcdTAwMWJq/XE7u4hnZ9FNy1x1MDAxZE9b8UxLej9cdTAwMWE2sKA0XHUwMDExXHUwMDE2XHUwMDAxllx1MDAxYlx1MDAxY+dT4//l5Fx1MDAxOVx1MDAwN01cZpaY9Fx0dpLv9sVn0EFiNEFcdTAwMGLJTpKbPlx1MDAxYVx1MDAxYahAXHUwMDEyMIhcdTAwMGJqsnduIINcYlx1MDAxZe/siWNcdTAwMGUyRerqfibWSFx1MDAxOC/+NWf/p0dcdTAwMDZcbktvUlx1MDAxZkysg4JVRJfQXHUwMDAwdlx1MDAxMiGhsMlcdTAwMGJmj1x1MDAwM/jmwqRZQ2aIstDiMu7DOLBdc99cdTAwMDa0RKnHlpxcdTAwMDSBUpi7XHUwMDE10iRpsPPsLVx1MDAxOE9yc32HgKXEgFxcz1x1MDAwMFx1MDAwM0zLXFzM5lxucOtsMJBRqsDb4eZcdTAwMGUkuLfP+Fx1MDAxZrdlyvxcdTAwMDD5h1nB0oIgIUTRw0Pxy1x1MDAxONLZvZDLINJPl3pcdTAwMTT+V0ZcdTAwMDQur4pcdTAwMTK8IFx1MDAwMnBcdTAwMDZmUtieXHUwMDA2hPS2tIiz6MqeXHUwMDFkhpu471fXyU/2j1x1MDAwNlxiPCjAXHUwMDA30kiDLGtO5OW5wpFNXHUwMDExXHUwMDEzfVx1MDAwNSdcdTAwMWJdXHUwMDFjK1x1MDAxMFx1MDAxMmRAzj9foUH0O1x1MDAxZCuApTK3oiiQQKq5vnFnXHUwMDEzy6A06itcdTAwMTlF5paLPvFaPlx1MDAwM1x1MDAwMrj2XHUwMDA0/1NcdTAwMDWQLtDg3EJeosFD0nyJXHUwMDA253lIXHUwMDE3aPDY3lIwkVx1MDAxYTbEJHVcbnqJVcDBhSBcblx1MDAwNM6kXHUwMDAy0acoPSMmT1x1MDAxY1x1MDAxOLs53DvPlf1kroBIqYHxa21yqVx1MDAxZbsx90Tq81JgLUxUjppzKvU4uqVMXrDJXHUwMDEwVyBh8EBcdTAwMTfRI0SweUpAXGbgVPyn81x1MDAxMFwi/1x1MDAwMnjQXHUwMDFkjfzZ8vY9fn03flx1MDAwNFx1MDAwMkTM1YHnk1FcdTAwMGIl1YpZidT6j25kOfSnK1Zb/HhZSFx1MDAxN1xiwIhJ2UMmu13xkyshL1x1MDAxMGBcdTAwMTJcdTAwMTjNfURibix/XHUwMDE3XGKQQYZAh4iprFx1MDAwMUaD3/BcdO5/5OXaPmg7Qlx1MDAxZlx1MDAwNFx1MDAwMSdcbmK9S0H+unJcdTAwMTY3Jf7L8VbHn1x1MDAxNbWgkXVrKmu2+INnpifS/6darLq7k3pVn6VcdTAwMDHRoFx1MDAxMYXj3T50WijrWMGBXHUwMDEyc1x1MDAwMeZLoS164ru97KRcdTAwMGVcIm5cdTAwMTI0XGI4oUyxXHUwMDFiacW/im/dtcXR28W3zo3+XHUwMDE3XHUwMDBmWJiQmlwir0dBp1W23ihFRU3BXHUwMDAwk1v+hFV7n/wqdcJcdTAwMTDfYcmPYlxiz5/zJ/5w3TnZbW86WVX8w1x1MDAxMWbQ2atxe+yPzLLzs2HCI783OXpcdTAwMDBdb3Vm7le+Y49e3l5NT+5cYjgwnlxyXHUwMDFlw+J6b6ZcdTAwMGK/50/sUfXuXHUwMDE07fVqWu4uP09ytVh3T1egm3xhsMEvh3y3XHUwMDE1llhcdTAwMTW+argpZzjPXHUwMDE2OmXdPUxF+Fph71XQUyxcYlx1MDAwZTmW4I7qM7U0K1x1MDAwNLzFXFwqXHUwMDA1WTGXdtFJyORPpaXauO9cdTAwMDRcdTAwMWOgs/p6r1x1MDAxYUtFUCuTkIuPw5/E439p8LlcdTAwMDYnv7l8XHUwMDFlXHUwMDEzWmtz/f6GXsvX+1x1MDAwM9fV85gpoMLVR+s1sHF+kj3wTbjU3yZLKr7YSj86q3ei4020sNNPizmYLuN3mJuDRICncJJ2bLZcdTAwMGZgKci0yVx1MDAxM1x1MDAxMpibXHUwMDAyJldyToS5syi5ufNGTFxc6Vx1MDAxNjpcdHNL0txcdTAwMGJcdTAwMDWFOqtG+UvUz0U9/c2iroWp0nRcdTAwMWGTOFxy3ov7XHUwMDE4JiSQQXSSNP1cdTAwMDPKemlX+rSKz1ubdD+DMlVcdTAwMWTZrofeM1x1MDAxY0xrXHUwMDE5JIhQczNZ4Vx1MDAwYlx1MDAwNiZM6bg/JZzeKIaKzVx1MDAxZIJjnVx1MDAxMixNdsmN8of8LZ/gX1umM+8gYMe6QZzpq7Q0I/LovvCao18lsf7oMqfvXHUwMDE23itcdTAwMDI2tL2h/Y/J//pfXHUwMDEzWCfYUaf7f/7PR5AxXHUwMDA3Zt9dfFx1MDAwNzr29oQ/hpqVk7tkM+mmXHUwMDEyPltcYlXLNlx1MDAxZJ5ePuVLUaWDpnqUMFx1MDAwN9zgQ79u+Ge4oqZcdTAwMWWE8bjOXHUwMDFkrV+a/Fx1MDAxMZqcfYcmm1x1MDAxYp036Vx1MDAxNr9/fsyVqVx1MDAxZkifXG5cdTAwMGX9xVo8Xv5UOvzGdD9GgzeDXHUwMDFk8nUrlVxit+UoMiODSWu5epp1KqWCwlx1MDAwNHivwyGUmtuumlx1MDAwMlFcdTAwMTSf1fhKiVx1MDAxOcJB8cpY5Y3IXHUwMDE2kSaNl5rKTKZoXHUwMDEyfs25+aXUv50rdf6bKSeR0kRNbqr7XHKf67UwgTl9ouypVMK/i3FcdTAwMTbr3iDRKVx1MDAxMV31e2l/Pt8myv3BO7yr41x1MDAxNSOlXHUwMDEwleD/nHJLs32wXHUwMDAwQaKlKWlcIi946Yt7XHUwMDA1si5N+SDNTZiB3Mr5M0VcdTAwMTKRuWdiatt9fCTh323uKu+rsnJ+JDkvfLtrxbBJeLhcdTAwMTlcdTAwMWTESJH7gq4wXCJcdTAwMDTTr1xuI7zM73WmL9JZn1x1MDAxZcKHXGKrV1x1MDAwNplFnY2a1iF3eF3WM1x0tc2x1e8v7/zPf7w17kaM8lsnvSz6ODmYXHLCRVDj9HPjfvnXXHUwMDFi6snJWTjtm9TT1op+QqWaVS+lUVx1MDAxYs3j432MPUUkXHUwMDE50UFz1YpQgVx1MDAxNNWKXWimwT98XGa33/JcYlx1MDAwNVxyXCJzrFxuQHVcZmiQXHUwMDFiXHUwMDExPvaLSN7TxdLzRFx1MDAxMkCcgGFcdTAwMTRXOSZmKpi+cdBImalcdTAwMDX6TOrJ38IlZ1P3XHUwMDBlizw5aPhcdTAwMTFY5MVEv5U//qmT/tju3Tw9JuKNKlx1MDAxNuZOI1x1MDAwMKbQt8Sq/vtcdTAwMTOb/dlwKFwikv2aV531hSMnyGqiJEU/ilrdOVVmQCbM9Vx1MDAwYoYkkYqT80RTk4YqqWDC5HqYmlx1MDAxNvdszU078qy9ealcdM+DplY9NmeW6kbI11RcdTAwMWaWSCjghlozKa/rXHUwMDFjmeQjLZm+nW360Jp8yPnw1yvzcmWv1mb437tcdTAwMDCAizPJ+Tzb3ymn0uHC9jyiTFx1MDAwM1x1MDAxMEVdXHUwMDA0VqnDXHUwMDA1sTXnrs20XHUwMDE0XHUwMDFlPilKsFx1MDAwNK3tnmH+SZLNn1x0Oq+P4yxAsT9P91xyiIzlStOKM1UlXHUwMDE2dZa7yTpcdTAwMWLJZMgzXHUwMDEwqWFcdTAwMGa10TeglVxi64u7kJTqIPB+g+ecSVNcdTAwMWbvSkZ+XHUwMDA1W94t1SfGrP08RrJj81x1MDAxOXEr5H+ajn51as1NXHUwMDExylx1MDAxZlx1MDAxMCHH+9liutv/TFx1MDAxMZdHU/6YqEt9NOhcZtt+nVx1MDAwZWLcXHUwMDBiO6PsPFOl17p8z1x1MDAxYoVcclxumrxTcFaY0vq8XHUwMDE0XHUwMDEyQEeQ4GORIWlcbrhfq7NcdLuYXHUwMDEy8NqUZKen1UJe9FnjICVSaPnlQPBVOX65oq+qbd9W7XdcdTAwMWRom45cdTAwMWL8+vr+cZvx3ZhcdTAwMGK4O1xcXHUwMDAxXHUwMDE0fZXOv0zvhseYbXXovFVcdTAwMDN3XHUwMDEx53OD3Fx1MDAxZpNpb/3Kp86k812e6I7KenVbXHUwMDFlo31f+G5phVwitvVcdTAwMTFcdTAwMWUuLYU53e2r1dmwOq9cdTAwMTVcdTAwMGYp27Oe9HDfXHUwMDFj143tXHUwMDFhw2V9t9jkrO7oXHUwMDBmXHUwMDFliX1cdTAwMWFNPmDcb/D0r3jDd1xumD0k9qY/xF0wXCJcdTAwMTRcdTAwMDHRUCfTOFGY7vPE/tBYT6u7cGxvy2YuaZdKf/jLr6pd+lx1MDAxN1x1MDAxMnuCcdB0zsHKXHUwMDE0w1x1MDAxN/hcIkpcYu+allxuXGJhiVx1MDAxMFF300U/hNhTXHUwMDExNOXTzD2hYzbi6368XHUwMDE4+ftcdTAwMWb5MyBMucR3qlx1MDAxMX0gsf9OevhcdTAwMWT05T1uXHUwMDAzVy6lLpe6Q1x1MDAxMPGA1THmKkRdVyOHuFS70sM2zOM7u1xyNfrHYpnodN3op/4nf1pviETpKbdcdTAwMDFjXHLyYW5cYlxiLFx1MDAwNZCJi/NcdTAwMWTT1o+bs1x1MDAxOS6O95OvJPBXbO346teSXHUwMDBi7za5uHlIe2z7JKm8XHUwMDE50T6px3hprcFtl/KHXGauLf3xbNT9OeJrd+f6Mc7CNFefXHUwMDBl65uDiuSb0m/NxdbpRK41+K6zwE1cdTAwMDFcdTAwMWHFTIdcdTAwMTHGhDxPXGaUiFx1MDAwNIHnm6YvxtbLazXGmFx1MDAwNLEyXHUwMDFkXHUwMDE4TOMlwK9bR1dUXHUwMDA3teT6eFx1MDAwNeEs0P7LXXjV6N43u1x1MDAwYqaa6LH69s0outD3M2DB+ppGXHUwMDFhT7XdfFx1MDAxN0CvR0PcbttDZ9SaNMetdjm9nfo/XHUwMDE2of0y0U1ausvistGitf5cdTAwMWO3XHUwMDA3pUlePa1GmlDT3lx1MDAwNyPBQcjJxSlcdTAwMTNcdTAwMTJBgVx1MDAxMLBeJSi91YZcdTAwMWTEx2ShvzRZpzdyXHUwMDFkuClsy02LXHJ5cb3kY5TI82zN3J9difxvV1wiXHSbaDq03tIhSu+7Nlx1MDAxNFx1MDAxMWGaZ324XHUwMDBlfYPT/dfqUEn/4ca3+cQn2tqM+lGc75dqN45p7+lcdTAwMTAyV1lNxUp+bI5woUSYXHUwMDA3TcEjU53p2PzrOkf9l1x1MDAxNn2UXHUwMDE2jb89iULCXHUwMDE2wmbcjFxc0TdKXHRcdTAwMTDYfHArfuRkoZXPl9Om4tHaeFx1MDAxOf7U2m1mjS16WsyVpqZPLD02JzQ95c/FnLAghzkjZM7Df4n4d1x1MDAxM/HJt1x1MDAwM1x1MDAwNeC6yV9EN5GCk6uXX2RcdTAwMWPelKbS81dcdPltpLjpqJ/IbKEnXG6WXHUwMDFmrkb+KMjYoZPAlJA//jaguD2bK1xyuo46KK1NkOxLYVemzq/rMUqDXHUwMDE0XHUwMDAwhJo+6lx1MDAwMOLX1/WUMr13QStcdTAwMTRsXHUwMDFiP2mN9f1iXHUwMDBl/97VXaf703sn03fEXHUwMDFizP0yxdjNZFx1MDAxZUnvZn1cdTAwMWPbYppcIqh/t+1/XHUwMDE1xD9TZMyh38h3/On6mCvjLNzlX1x1MDAxNHVcdTAwMTj7rntcbiHngYdHWHSV6/PgQT4mJJGR9XB8VC+n4/lZaueV1MbTz2fTXHUwMDFhgDRcZlBy00TqtMjE54hcdTAwMDRcdTAwMGKaLGTTn1b9cqa+q87Pvlx1MDAxOSNcdDO1h+h1McGjpqj7NFCAXHUwMDE0IM3RXHUwMDA35tI+gsjIbrZaXHUwMDE2JuGFlVJ5PHJn+/Fy8+zB3U9cdTAwMTPnuP2UT0CvRjooXGLSpolcYlx1MDAwN3p/fiVLmrpGpkQ1Y8Bt2I3rXHUwMDFjwjRcZqbaNHs3nUyxvtbKX9B7U1xy5+9Io1x1MDAwNVNm7szdUDeN7lx1MDAwMq9pbW5cdTAwMWGk/IBx/tXCXHUwMDFmXHUwMDFm/Fx1MDAxZlx1MDAwYnNcdTAwMWbA21X8//4zfFxm3M7kXHUwMDFlt8WkXCI9iorpbGOw6HSqT8OtxiZ0yTlh3DShpuf+KEeGcFx1MDAxYodUXHUwMDAw4Va3wi6KXHUwMDA3XHUwMDAxRiVcdTAwMDK8Ppa4uFx1MDAwMbf6o1x1MDAxNdvzuo7WX6PY36M81Ncq9uKb8dWUmSbGXHUwMDFh31B4QvT9O5hcdTAwMTKZ2nNIf2CG0CN8zW1zo3XNXu2L/WpVN1x1MDAxNun5atf5u1x1MDAxM4TW0UM4N4vUe/FcdTAwMTL3XHUwMDBm4zbSXHQ7/GG4rU157o/B7dur91xmblx1MDAxM1x1MDAxMlx1MDAxNFKbyrOImz5cdTAwMTfn+o3ZuX5f47ZcYpo+KKZwXHUwMDE4Pq9cdTAwMWPyot7q49X7n4E+L5/HbVPQXHUwMDFl/OWbeiyvi3y8XHUwMDE2RIB5mmjG11xcpT6bx3fA7i/n3f+YXHUwMDFjU2Y/XHUwMDFk/99dO93FPyY/XHUwMDAyij9AzUtcdTAwMTS/eJpbz/IxaP72ac+FNTrTdIyo6S1JTfVOzeTpUfzn0DJcdJpcXF3wrCiS7FZOXHUwMDBlpipIjZFQhFx1MDAxM/Dc6I3cX1x1MDAxOEWZ+DS8by5cdTAwMDawj3edv1x1MDAxNtp/JN1fPa/7XHUwMDE4WFx1MDAxN1LmmvxccuWn7G52XHUwMDBlXHUwMDA1rmZq+v6FLvKu9sdcdTAwMDJcdTAwMWT4YdrIXGaLfcL7ijcy73VlT92Td1x1MDAxNS39wFx1MDAxYcH3XHUwMDA13fx8upLx1/GuXHUwMDFl8clas6+Vj0/oXffzjqSeyEA4WkXnmFT4XHRcdTAwMDVN9Vx1MDAxY4nAkSZMmlx1MDAwZbInzfp+79km709cdTAwMDSlUMi00VwiXHUwMDFjKfzSz/yVQp6VY743qbevXCKcTFxuLFx1MDAwZqyYcVx1MDAwM4RpmXLSXHUwMDFk52VKMoipVpxcdTAwMTHT9lbrl8a8/3O+Us9W5b00gd1RZ7p9ikvdXHUwMDE24ye4XHUwMDE0KGqQU3CVXHUwMDE5XHUwMDE4UKTFeVxmxNwmNkX3TfMvya5cdTAwMDOT3FxcyzBcdTAwMTmTRvJcdTAwMTS/WULtx3GUfiRrun6HNVx1MDAwNbKKgKzepFJ3iVx1MDAxNDVnSYqirzl6eJNHKSxcdTAwMDTh77lcdTAwMDZ/xaPcrlx1MDAwN/Rh+SNwplx1MDAwN9zkkjNdzfxjXHUwMDE40tux1rdcdTAwMTiS1ipo8lnpseAyvvCFJFFBjbSpwauVOi3n/HrVUVx1MDAwNIFva2SsnCaI3Yh1XGJTUYBioZHpisRPRvml0a9cdTAwMWG9eV6jtenKzvjNpMbTTbpcZmpK02aLq7/wkN12J+3ZqFaotEty6M+KLfmpNvkp6dFdOTc/V1x1MDAxMv5XsKO3g67n7OjYXFzG9G02zcDJa5XBXHUwMDE3JsKCRH3uxMNMP3R9XHUwMDFkX3uKXHUwMDFjvZ16fUaOXHUwMDAwlVxikHVgXHUwMDA3ppCw0PJqTlx1MDAxOMjDsUODuWRNTbLo30WPbovxM/SIyyAzacRE4GN7i1x1MDAwYnpcdTAwMDTvXG5MpWltfXbB6Vx1MDAxN0H6VnO6fVx1MDAwN0Gixisgmt5cIkj4ftJcdTAwMTLD4Gfw0+vnXHUwMDFmckhcdTAwMDTyLuRcdFx1MDAxMP/cXHUwMDA06Vx1MDAwMTX5i1xiXHUwMDEysmvZySZTYS29XHUwMDEw+2E2uTlsptdcbnzvSlxiwtI0djTdgZVcdTAwMTZcdTAwMTfJ7OBMXHUwMDA2wXaC64xcZsnm10EkLU3nI8COz2X/0K374z+OXHUwMDE2/0jnQbtvP1x1MDAwZqLmgo3At+tCc31XvVxyMoFR/lx1MDAwYslS0ueN6uGw+TTM4lT/XHUwMDBmXHUwMDE0XHUwMDE5NMjo777XvVO1zNqPzHONXHUwMDBlrvWG6VSnXHUwMDE0ps+N+5jcmW5gJz3Svuk46PbqPYHRXHUwMDE4mZpnlFxiiSWVp1x1MDAxZJA/XHUwMDFmXHUwMDA30Vx1MDAwN9ottCn9oFx1MDAwMeb18VbwjVubv46Dbmr3/nmMJsqE0jC66fLcj1xim4v1WnH89zcyuMLoq8MgXHUwMDAwzuV6/KNcdTAwMWNcdTAwMDY9QMxcdTAwMDeHQbee5WOQfFx1MDAxNW/GXHUwMDFho7ivdl60rubJYYT1nHdkUuqgNFxya0z7XHUwMDEypMnF3U6tgqbMpalcdTAwMTGj8K1saXgxSKVcdTAwMDRcbnA8+tXoRpVcdTAwMDDBYVx1MDAxMGXi0eJcdTAwMTgy/+hSMP9cdTAwMWPIfvhmZJewUUjSm1FcdTAwMTBcdTAwMDJ7eJ+3XHUwMDBizFx1MDAxOULqw6+lkWK9S/y4dFwiXHUwMDE5Nv9jam+LMdn6XHUwMDAwXGbG+2TkU90ttPuLXHUwMDEybs7FoDz3ilx1MDAxZoXBpvHiSeriN9ZAeaM5XHUwMDFl4fhuvlx1MDAxZKhcbtF3qlx1MDAxYmqU+P2JnfpS3rDoN1JcdTAwMTWe7rdG0eVoX4q1Klx1MDAwYvxX4SR6oCsv+lx1MDAwZjaIUzAxglItXHUwMDAxvl5N+5da/1wiyJQ5VjFccvXQRaFwptSxxKCBRKGVOlx0XG58VFx1MDAwMYiT9tpaXGKYjlx1MDAxMuDmXHUwMDAyRbp1lf3+Z17KZFx1MDAwYnhcdTAwMTZ2QrVvd9NrtVx1MDAxOU7YZZn9wyWHzDBcdTAwMTXr+cnVdTe979VY8i1ccvyudYFcdTAwMTngXHUwMDEw/mZcdTAwMTb8qF0xeaNmrFx1MDAxNIhxfk/93lFdNOFnXHUwMDA3vZnaXHUwMDBlW0yEW0I0aktR/enUz/TMXHUwMDExzJSuVvAuOj/T5JhcdTAwMDRcdTAwMTkjXHUwMDAyOFx1MDAwMkdayUtQfS+Ym59rzSNcIoiJZopKXHUwMDAyJoCfRMBfXHUwMDE0XHUwMDBmXepcdTAwMTk4J1iAUbhdf+iH0bO3/EFTl+Wr2v59XZfl79lcdTAwMTX3Q49cdTAwMWbuisPFt6828SNcdTAwMWGdXHUwMDEzdlx1MDAxZrgxpVx1MDAwMixcdTAwMDf8dct04OctXHUwMDA39Wb1VnHv6+SnTVx1MDAwMif666qHXHUwMDBmP5vlYFhcdTAwMDZNZVjJqfmYuCxUjIKwh4SaXHUwMDAzXHUwMDBm8DDoxUw/xnK8zvr1bldcdTAwMTAhyoVCXHUwMDAwwsjQimvLwaTJQDnhgb9Mx2//XHUwMDFjpuPs01eS8L1NXHUwMDA3v+5o9nrpmzBt7iXfNlx1MDAxZO9gXHUwMDFkSEWjlaxdKOVcdTAwMDaLXHUwMDAxT0munNrw57NcdTAwMWRcIoikaUlcdTAwMGasXpzElj6TXHUwMDBlXHUwMDFkNNeR9PFcdTAwMDPirzNcdTAwMWQ0iLCpjFx1MDAwYlx1MDAwZTOjJu3gityb3iCc01x1MDAxZpzc/7JcdTAwMWPm51x1MDAxYizHlSB8d8uB79+FNXnd2nChW5aDPG84ep0/utn1cDWXKG7R9jy2Ur2/LKr+cYaDXHUwMDA2icnx08BcZrkkl5ZDXHUwMDA0OSFcYpZMKcXZN1x1MDAwNVx1MDAwYt5jOVjw2JBVmy7CQlJ8VSxcdTAwMTWYXHUwMDEwluJHj1xu/DJcdTAwMWPm51x1MDAxYlxmx5VcdTAwMWN8o+F45vbbm1x1MDAxOY9SXHUwMDA0XHUwMDE1aFx1MDAwNcxcdTAwMDdhfnHYh+A9qilhXGZzjk5U6SVcIqaPhpCbXHUwMDE2fVhqxm9cXP7SOEhcdTAwMTRcdTAwMDU7STD8MiF/5TveMtPi95tKejuDmSht8sBu1c7i13XpXlx1MDAxMlx1MDAxZc1cdTAwMDEzp+JcdTAwMDNcdTAwMDP9XHUwMDBmXHUwMDEzXHUwMDFlW7lcdTAwMTRcdTAwMWS721Q9mfD4Zuk3vITzMyY8glx1MDAxMFx1MDAwYqxcdTAwMTinXHUwMDA0gypgdn5cdTAwMWSEmfw9qigxrTRM6tSj4e7rzXG8K5V5w0h8WFx1MDAwMuXb991+O0ug5MeLJYRShZVG9PoqXHUwMDA3XHRcdTAwMTJCmEnzo6bNXHUwMDAwk1fQ8uG3S1xiMpFcdTAwMTlKJfxccl7UdVInXHUwMDBmaiBcdTAwMDRcdTAwMTKZmi8w/+sp/VXpkzeV4spY30ifXHUwMDE0OqiIUKbZKdZXxa2EXGZyjDRcdTAwMDI5ZPRGXHUwMDBmSVx1MDAwZd9WUpvgXHUwMDA21vi0XHUwMDA0x6/sybeNs3zeOFx1MDAwM1x1MDAwZuJHcnqLxN9Pnlx1MDAwNN9cdTAwMWZcZsvp6e3HJE8yYVKFv8Z8/pmY8eVcIuuPkITxgOVcXCZhXFzN/GNSLt5OLXvz/i1cdTAwMThLU+OGcFxuVpNduCZcdTAwMDBcdTAwMDJBeqyTLYVpR/m6a38qsCRBXHUwMDA2Tlx1MDAwYlx1MDAxOFRcdTAwMDNcbqexpNdsXHUwMDBiXHUwMDA1Nlx1MDAwMLZcXEpcdTAwMDb4cdqT4Zc+v+qzel6fTSVGxdXNu7eYvKHRYFx1MDAwNWCzTmvcff9cdTAwMDJcdTAwMWGzXHUwMDE4ymWTk1aD0+Yh1uorXHUwMDEylz8j2/qkg6bIr+liyITJXHUwMDE05qdfp+b0XHUwMDA3fHil9fGWXHR/ONxdxTE/VyrzV5Ctd1x1MDAxMFx1MDAxYoZMhTRcIk15XHUwMDBlSsSryL1cdTAwMTBcdTAwMWJcdTAwMWHU1JybU2wyucw1kq9jW28nuZ0zQFgojVx1MDAwNYJFI1x1MDAwMDFcXJ6ewb1wQJguXHUwMDE3XHUwMDEySXAwXHKV/btcYtdtvXiCcGkuwVx1MDAwMVZcdTAwMDJ8Jq0o5lx1MDAxN1x1MDAxNaclXHUwMDAy11lpYSp7K3ZyMP6SXHUwMDBiS4KSXHUwMDAyVzYhYdhA9uu+ypc5PbTQ+nlcdTAwMGJtujNL2CF1675cbr17o1dcdTAwMWLBlfqjU2FcdTAwMTVHjH+dXHT9k3F9yVx1MDAxNv1cdTAwMTFcdTAwMTjXXHUwMDAzrnPJuK5m/t2bXHUwMDA0gyd0P7NRYDA6XG6dXHUwMDE0XHUwMDEzP5Gw11wiTlx1MDAwZuPiXHUwMDE1VqzEd3udQJOVP4/XM5N0tPWjaNidXmLg4YGvXGI+XHUwMDA1XHUwMDAwJFx1MDAwNmN9kdpcdTAwMGJcXFNqTalcdTAwMDaWQk+vzn6PXmJMXHUwMDA0jYrCXkhcdTAwMDXOp75R2VHyoCSaK3NcdTAwMWFLzFx1MDAwNchLLSdcYswnZ/+8XYKJ28WOQrYrXHUwMDE1cFx1MDAxMWFT3WGqq0WXd2hHIEU8z/HQSZfP79Lua93qZ4pcdTAwMTE1bPX0suap9iRcXEo8XHUwMDA1lVx1MDAxOLQtqFx1MDAwMCqVMlx1MDAxY1KJ8yxNabozXHUwMDEwQU21XULlSX7fy62wo0RqXHUwMDAy/Eyqm9dGPrz65z9cdTAwMDdURp6HSlxyOFx0qKduXf5cIvd7LlCTIIFOXHUwMDFkg1x1MDAwZspcdTAwMTD/Xl0yvyHz/Epvvke1cNtcdTAwMWLanzpGcFx1MDAxNj9Hi7JcdTAwMDcz/pjAytvS8GZghZhcdTAwMWXlWlx1MDAxMKUlwYpdlN1cdTAwMDFcdTAwMWGONNXiXHUwMDE4tFx1MDAwNmflum5cdTAwMDdcdHKCXHUwMDA0MUF3qcjppbdXos6QuXwuXGJcdTAwMDYoOjbp/GWNblij+DuskVx1MDAwNm+V36he+LspznG/j5LGmFx1MDAwMnP5mpKGXHUwMDBm4P2HiH3clUXzcy2Fr+Ndma5cdTAwMGaLVrzdTPe3s8CAXHUwMDE0XHUwMDA0UFx1MDAxZTMgMVxu1vU6LIBZUCBzWiaAl2rTQfbLJ95cdTAwMTmteJuq/HZcdTAwMWFC4Vxuc2XCcVx1MDAxMjaayuvjKkyCpraxMFx1MDAwN0Mm8ZNdp0JcXMUqruJcdTAwMTFcdTAwMWZcdTAwMTWueLvH89t2UOogXHUwMDAyX1x1MDAxOHFTr5uIc9Zvcuo4MuTMXHUwMDFjLpr4zZUhlFx1MDAxNFx1MDAxNktcdTAwMDCXXHUwMDEzUlx1MDAxY5tcdTAwMTBfXHUwMDFiQiqDpvNcdTAwMDJRXG5cXFx1MDAwYqX5r/qOt+xg8lx1MDAxZFx1MDAwMVxm8FJNLWB0K4BcdTAwMDFcdTAwMGJ9vysjXHUwMDA2uZZgXHUwMDA3Pvo6L8dKiNdf+3eZwrvCaH6uxPCvMIRPh21NkSFwZDnMXHUwMDBiXFxcdTAwMWFi7rCdzP4lQFxuklx1MDAwNmxcdTAwMTLoXHUwMDBiI2A3r1x1MDAwYvo8ZVxii3VvkOiUiK76vbQ/n29cdTAwMTPl/r3KR6YsJGBcdTAwMDdcdTAwMTfSZM9cInxdZohcdTAwMDdcdTAwMTVSTFx1MDAwYsRcdTAwMDCDXHUwMDE1RU9UXHUwMDE5+m6W0J7hZXmQp1x0suva+o+ZP0Usf21cdC+iQ5/TXHUwMDAwOVxijynlxiim5DJcclx1MDAxMJDVlLpV0nSdNefpN6qUiKDg4IgzaVxuY986LKemhCZmgCkm+5Kj91Ry+6a4ys9pXHUwMDExM89bRFx1MDAwMsJcdTAwMDc0Qlxcu6RGQMn9ctfm6qBcdTAwMDKC/zU1iL5XuevX4M/S3nTP82m/XHUwMDA0f1x1MDAwNFOecCVyPKK7XHUwMDBlk1x1MDAxZfW0srtcdTAwMGXyOlx1MDAwMFxyQJZcdTAwMDRDdpecXHUwMDFjW36X4M/bbvPbJ9ugbpgpXHUwMDA0WqBcdTAwMDXs0Lm6SWF6SCOlOFxi0lmlvlx1MDAxN20zXSTAR9PSXFycReSGXHUwMDAzxnlcdTAwMTCDOVKAelx1MDAwNJ1GkH7Rjlcly7+DdkiNXHUwMDEwrCW/WVxuSPK74SAweOCCIf5cdTAwMTe2htDNwoioZW2ejLJuMv4ps/TkV5xsf1WZ1Y/17ig198NNsVx1MDAwNi6AZtGzxD/CgphcdTAwMWJLo4+tNzQlXHUwMDBmx7urOObnUmX+XG6K9Fx1MDAwZbdcZlx1MDAxYobBXHUwMDAxfskx5qtPPvTiKlwik01lPFx1MDAxOUpcdMN/WrZ3MiSe2XY2h45tzdO1YnGVWYuBtb49J0lNk3RCTFFcdTAwMTTwT6/rZmNzXCLPkeFccoiYfupPuIrf51j7tlJcXJnrXHUwMDFix9rSlH1h2lSHl5xcXHYj1zKowTc0xSZcdTAwMTFGJyGRX8fa32qeXHUwMDBi7znWXHUwMDA2n1x1MDAwMYzz7Vx1MDAxYU/3844kOPiMnV0j/Fx1MDAxMJ9cdTAwMTB8hdOd/rnPtVx1MDAxZjCd736u7T9hlt5SYFx1MDAxM0Mzt4VcdTAwMDBIXGJSXHUwMDE3R21cdTAwMDBcdGAtlTRZa4LcOGrDXHUwMDA0QMNUPlx1MDAwNszgpi7TjVtcdTAwMWJcdTAwMWZ92PZP5MhcdTAwMTTfocSwviY9St+syiTuViDBpiumyUX7Ki2+zbF+5qJM4GWjb8qpeSnI5ozWSzBcdTAwMWQvJdl+6GO3J2b9MZaoTzo14iZyPTVxh1tv2vC6y1x1MDAxYlx1MDAwNWGvLZFcdTAwMDBjQ1x1MDAxMTG+sal7cW6JwNtcdTAwMGJcdTAwMTKAXCImPvdJudFu+3jBTFNuxqCM3jBE8j3xZVx1MDAwZilcdTAwMDehf1x1MDAxNUNUfochXHUwMDEynFEs2U1nj9zv/CmPxybq44vDfde+elQw/G0lo7/cXHUwMDFkWP5jMlx1MDAxYoGympf/MVl0nenCvV1H+oTw/q0m47mJf1CfjTf38K14kdQsyJVJXGaWXHUwMDFjg6t1fk7FXHUwMDE5+H2KMIqAdCqpbtw7xWA4TO1cdTAwMWZzw8wkXHUwMDE03UgpXHUwMDAzX44oJbiUXHUwMDEymcMw9Z6I0b+WIam849BcdTAwMWWWUpLrXHUwMDEys79cdTAwMWaPqu57JUyCp/k1VuTtsKy5YoG/6n7Tx/bDuCuPx69fSeLreFfG7MNcdTAwMDIxb2P6b5ftwrjAXFxcblxuLlx1MDAwNTlp4vvbn2FcdTAwMGZcdTAwMTVcdTAwMDR0Nlxy1zWRR6T+8oF3RmKevmRcbnPSimBlXHUwMDE4tOlcdTAwMDaOb3XEXGJKXGbc0PRQpab0qf7brnRcdTAwMTY640ZzluyXvMMnJsI9kpifXHUwMDE2a7/Pn0AgjLNcdTAwMDaSLIRJTjovkSWOuVx1MDAxMlRpTlx1MDAwMYZvZU3+XCJQv32D3as+b/fMXHUwMDA1XHUwMDEwjU+96ZNLXHUwMDA292PlXHUwMDE4TIE0kZxcdTAwMGZcZpb/XHUwMDA1legpwO5cdJn/XG5cdTAwMDLV665+PvL0eNJcdTAwMWZDnN7eu7eJk1xmXCJzzkaEXHUwMDEyRJ7zJmF4XHUwMDEzJ1pxXHUwMDAxNkPy61x1MDAxYqQgv0GtTFujY1x1MDAxZVx1MDAwML5xzMbA0mvTntC0XaH85Mzkl/U4t1x1MDAxZbV3XHUwMDFjaIPloPCDbplcdTAwMGZ2fXPpT/NcdTAwMDHfMkmrX9d38K1oLlWA5l+l4Fx1MDAxZsybVJDCI1KQRm5cdTAwMGVcXM5uZn5cIuaMXGKZ0IJcdTAwMTDCtItRj1x1MDAwNrwr4MfxrmT7r+Bhb3ODM8qDkEDYZEZcIlx1MDAwNW5cdTAwMTHR+vpIjFx1MDAwN6lkXGbYNCyWUFxiXV+q/PCrnkdzXHUwMDAznFx1MDAxMMFeIEzkNTnkQaWION70XHUwMDE0XHUwMDE0/LpcdTAwMWJF6v9cdTAwMWFcdTAwMWW2ktlS1+58Ksp9i4r6XHUwMDFmeLvs3kidvMXDNFx1MDAxMFxc0DVcdTAwMDXLzsSFYYWHXHUwMDBikuNcdTAwMDGIZIieVs54cUhcdTAwMTGY/Levr/ziYXctaf1cdTAwMWQ8TJqOU1LdXG6oU/nWsVx1MDAxOEVcdTAwMTR8s1x1MDAwZlx1MDAwZmR918A3o+D4fFNzWFi25W/TyWj/2z8mjj/rXHUwMDAzVfpp6NjTc/9cdTAwMThW9vZOvsXKwFFccoLiY6U0XHUwMDE2Jsf83HpcYoBcdTAwMWRcdTAwMDRcdTAwMTZbmz5cdTAwMWP8xoG6lEFBuIlkgJ9HNb3RRlx1MDAwNaBcdTAwMTCZy1x1MDAxMsQ0VzKJVK+/45c1ObcmjXfwMmJapKubeYbyupXKSa1eQ8Ll1/WO/S76/qG0jOogMlx1MDAxN9nRsXxcdTAwMTfG59XOsOlxjqlcdTAwMDDKho28v1xc4LifyH1Pvo/jXYv2X0HL3qZcbme0jGHwrICeXHUwMDEyk18qxY08JVx1MDAxNNTAeyhVhjyY9IuvY2VP5ymZ9HJTe1x1MDAxNlx0bJKVXHUwMDE41tfZ5Vx1MDAxOKhcIlx1MDAxNoY4XHUwMDAzUdTmZtzfxcpsP7ntOqg9aJTFcGi18umu91TBMyw4PIRcdTAwMDZvXHUwMDA1iJXJdrg4JzD5baZcZlx1MDAxZHAyYJ36xr0+roOmXHUwMDA2XHUwMDAwXHUwMDAzXkpu07K379L/a1vS5vOWVFx1MDAxMFP/kF33hzXvibtcdTAwMGUuXHUwMDE4XHUwMDE4+dmSfDQv+649ajjDp73dv+ZcdTAwMGVwd/+pO3FcdTAwMTb72VxuluPTPybwwm//TyaW+X9/W4Mh+m01/e3L2/+YrPrd375wnjvd8H5cdTAwMTTG9lx1MDAwMU/1MVxc7u3dfzOV3UTRwF3gXHUwMDA0eJspaXx+mVx1MDAxOFxmblx1MDAxMIwppeBcZmuhbpRZJJRcdTAwMDZcdTAwMDVcdTAwMDJv2NRcdTAwMGI19cGvbY7SQWpao1x1MDAxYl9cdTAwMTFGIb9OJu9ZoNZtXHUwMDBi9Ezt6j8zXHUwMDFmNONcdTAwMWHYXHUwMDFhv3W7TvD7KVhMmVqhjH5sP2vT7Fx1MDAwNGTnq26SfGwmOmZcIkg5oSaUxIhWZyRcdTAwMGb8mWPSXHUwMDE18Dz425z4Plx1MDAxY++u3Fx1MDAxZt9VMiiRqVx1MDAxN0ZMSTcu/5LQ29vE44JPmXvlyFxcXHUwMDE1w+aOLL8us4bB5phzXFxYXHUwMDBlXHUwMDA1+4joV15cXH76vlx1MDAxZTkyT9PGXG5cdTAwMTGwSOzGlK4rvX08p/u3L3vzuz2bVVYgzC/P9vvG724j91x1MDAwYuP/25eJXHUwMDFkrzq96u3vlFPpcGF7XHUwMDFlUcD5paIuMFna4YLYmnPXZlpcblx1MDAwZouTRfx97I+71dNcdTAwMGJ/oVx1MDAxOazyq25cdTAwMWVcdTAwMWbn6YFfvlx1MDAwN8pp18pZ82Xzz/98XHUwMDE5+v/r2MuuYP/h1yOF8lx1MDAxNmVcdTAwMTK9aVx1MDAxOH7ylVo/VuvBvypb+MuqWeGWeX023FXb5lx1MDAxZuFmvlJGqfBiyVx1MDAxY1FcbodcdTAwMTOJfLpcdTAwMWOL17pxuZqUmig/XHUwMDE44Z2v4v5i2cjELTTr9DbxSGvR72ZHbnyUcZoubeBcdTAwMDMtxVctf7zOrlrLZWO1bbj7dWCdLle2bcqXzrBfIJXKIEs37YLNOT1MXHUwMDAyNFx1MDAxNMryfHqyLms6W3cyytn75XApPMz0Yr1Koe5cZlm+tu2nwpVYLzXersLjWC9iTSO9WLk+qGdnrVjGvLVdpbqxcFx1MDAxYd6YxspxeCNdS2R68Ea4n+2icMpKxeexSKRf7+RriXmvXHUwMDE0XHUwMDBip/xsXHUwMDAxRVKVcGw+jIf78Wa+Nlx1MDAxZfdKQ/OGhVwiXGbeyPRcdTAwMTLhcryRr61HvdJcdTAwMTQ+XHUwMDFitVCfXHUwMDFk55bolWPwxnJUas3NIFZsJUvhXqrXmJZiiXh9iUv2PFx1MDAwMs/hp5ayXHUwMDE0M/Ofl2pWrO7gim1HrONcdTAwMWLZUlx1MDAxMt4ozcOtSKzewlx1MDAxNdGIWD34bC5bSfbDXHUwMDE2vGFHYmV4Y1+P+FMzSKpCV2Er7EfsfrjUqjdcdTAwMGX1yHxcdTAwMWGLhK2Uf1iZdYhkZpFSqlxcP9TTs2ksbd6ANet+85pcdTAwMTV2k6lwXHUwMDBly4Pedzbj+HhiqrnXd2O316FcdTAwMDFcdTAwMTRok6Y7TqzGo0Nhb7U37VXusKlcdTAwMWOyot11XHUwMDAy7UNh6yx6dNDe7PuTfDO3XHUwMDE48/HskDlM+KJdV3S5J1x1MDAxZJKv5qQ9b/F5fp2OlSP9amk35S7Vm/bQnPr07Vx1MDAxMk7T6HQ/XHUwMDExXHUwMDBlTYbSnXU+XHUwMDE0mrTH2sm0OFVeLrluis1i3C5WNofJYt0h3bw7PqxbpF10XHUwMDBmyqFL1LVJXHUwMDFkVVx1MDAwZjrkrdqjWWY9I1x1MDAxObOH8Vxcf93igc4qMs1U9LZcdTAwMTaaTMqLNe80ynaVXHUwMDEwNMJrTnHIO8TBbdXVTadhXHUwMDE33Vx09Vx1MDAwZbl9d9KcXHUwMDE0KaxJLe+N9bhNxsVccl812mTk7Fx1MDAwZpFD1+at1WQ87YpJOVx1MDAxY4m5dqyVXHUwMDExvTmf4kXeL6tYKC/zxch6cehcdTAwMWXicuBN3ErusI5cdTAwMDdCuYp72Dnbcmbd3U79RbKx6ehQe1RcdTAwMGU3yqreSVx1MDAwZkpLv1DMXHUwMDFkyslFVKFlO1Dwk11cdTAwMWNqJzoh6cltbpetLrORRauWk5v2SO9yu+6IXHUwMDBme+N+zY5v0jx3WE1AXFyd1D5US8bGRa6nh9VUNYu9ZTo01Ely0PN8rnFcdTAwMTjnx7RcdTAwMWR1XHUwMDE25WyxXk2VcDTbxcVR3WpEY1x1MDAxZLyZ5GReSatcdTAwMTBz28t2ObYv0NG+2yYtYqf0Lt1cdTAwMThGXHUwMDAz8HtcdTAwMGIxK7HkfNCOlPfpfirk5GSks2vsWon8uOiEXHUwMDAzivQnrkNWyeJW7Za7XHUwMDAyTmzEJFx1MDAxMSrKnlx1MDAwZYXIhqpatCjnVnFcdTAwMWZcIlxurVx1MDAwYkte2OlWruIl/Fx1MDAxMl11colD8mBcdTAwMWY2u/iOtzuDcVFttut5XHUwMDEy61knum8sh3zSXHUwMDBl7Tth1u5s0FqGcq1BqIbcTiWX9GrTll1cdTAwMWZ5TUpcdTAwMGLU2+xCg6y1bjXsjVx1MDAxYlx1MDAwZYT2y1x1MDAwM3PRwiqOsytvXHUwMDE1bclof+yt8KzJI+WG5qv22LfsTHxcbpLY99Pzw0JgfVxiNezJ1l/E8X7R2W0r9eVouMVcdTAwMWLLl8tcdTAwMDFtOp1ON1x1MDAxYlx1MDAxYY/WgMC9dmNZajdr3Um+U1xmOcvOYVxmW99087NStmdcdTAwMDOJc1MhWp4j3MpcdTAwMTKckls8jlxmR5FIxkVeM5pj01x1MDAxZY40Yrvi0o40ozXmXGZk9Vx1MDAxMI2qXHUwMDE0U9vltssmkiR4J2mVu5lIe9pO7GNonui3rU3I3TLlaHag+ZpXq8hNoFWghUrcXG73tv40bNfy+V0/0ohm2pN8zI00I5lSWG+TujlcdTAwMWG7w1wiLVx1MDAxY0rdfDrQ6qeqcac7T5cqOTTcr6VHXG7N7YDh0VwiumXe3Fx1MDAxMTw/kIlGVIdw2tlcdTAwMWTUdLOhRFx1MDAxZJaOTy3W77PsoTiIrOrZeVwi6eblYMeLoXIuXHUwMDFmQ7FquZiPR9LhUspfhDOl/Ko0dFx1MDAxM1x1MDAxYtZLj/qaXGaz7jyRXHUwMDA1zSC0PGWJSWa4JX6eZprl5Vxcjrx1O3qYOi7dcye92PVcdTAwMDKBJE3kLd1rXHUwMDFmQpXQqI88e9NcZjstVknYy1ZcdTAwMTl3XHUwMDA2xUEltShcdTAwMTV380Z8e5g1e1x1MDAxYjGILlx1MDAxYq1ZlJZVupiPtpRM+v1ZeLBI8kVArkt2U01ydFHpXHUwMDE3q+353M8sa561kutEP+9vc7zql7qTTCbcKiZ6a9tyclx1MDAxNUtm91x1MDAxMdrxknRdlSQ8608roz1O12opK2plepFZXHSRRGzUZl4hz/o+Slx1MDAwNpr5yT6QnehVLJlt7Vx1MDAwNmzdcNPr9iaaXHUwMDFkpVx1MDAwMzpcdTAwMWRLrDr1nl+ceNuy3Wjs0sitlib9MNp0VCExXHUwMDA1vZ5wl5NhmzrutFx1MDAxMVx1MDAxObiFbjpjXHUwMDE5fCg3wqtMbFxc2lx1MDAwZbOyNNs4pUryUFxiyFx0XHUwMDBlNVx1MDAwMrGVS0J0XHQjg6JcdTAwMTY33Zpe1ki/RfO23ktSSu3orp/kS9mMbzO1qJOaZrRY71wiYdVB1Y1cdTAwMGI2SdnOvqwqk3zZiWyadNfMSVx1MDAwYnXIuDCY+Vx1MDAwYivRa3qiz7qVkd/v8Fx1MDAxNp0lXG7TXc/JZEubfrxcdTAwMWbz0j0/R1ByWVx1MDAxZPhccmeeZ5VioV90Lbwmg4G3iUb8amm5XldcdTAwMWLD2ZJF8lx1MDAxOSuZ7NHqfFlK5Cqx6q5nJ2LV+DpcdTAwMTJPJXKpXHUwMDExSi9L6cbOsYqJvN5vSstsf8nyqci2s+xcdTAwMGWXqVx1MDAxNVtX18BcdTAwMDFDsdZBN/HArc5ms9Jw2c9mRT17OFSTea8kXHUwMDFkl7jFmlx1MDAxZWUj1iCUWm+iqFx1MDAxY2uX1ZrxRDddXHI53eIotM6lrcpaVVxu8PtZNVYuRZPbfD/eo6pQXHUwMDFhrEJsO1x1MDAxMNtt1spsktHufCljc91cdTAwMWZcdTAwMDT4MGp+Vy7FlkmybVSayXIqXFzMdWNcdTAwMGKwZfF5JzZP2fs1iuxSVtGJTlx1MDAwMql4XHUwMDA0zdahw8BO2ZVcZqt1toMlT/olXHUwMDFkyGQq0V79wGJWYZZcbsRcdTAwMDeTXFw7UVB2Llx1MDAxNfC8yLCSslRp0VvKsihag/Xw0NuoeiAlUS65XHUwMDE5hFrj9sYtIL7up1GyM8Us5sY3VjJQXHUwMDE3iehcIlx1MDAxYcqUXHUwMDFhVXAyXG6h/KZcdTAwMWFlfcxcdTAwMGWTjZdzRb6w9XSpKSqlXqVRXHUwMDFh9XJ5XFzpW6xcdTAwMWLyXHUwMDFi7WGqObDSY1sshuMxjSxcdTAwMWF5N+dcdTAwMWXG7XQ/XHRcdTAwMTbwXHUwMDEwXlx1MDAwZrKenSpXsl6knmhlq4XJXu/dyKxcdTAwMDZcdTAwMWOnjHtcdTAwMDfZQuPYzqtue7lWtTFJofBKkNTgMC8hK5Z3XG52tkW2obm1KzdcdTAwMGaVLlx1MDAwMFEuT+brZaXp19fLJm5hu0dcdTAwMWKpfdRcdTAwMWGPY5tsimzHhXRkv5GM8Nq4VPR5Tuz5erXNh6dVwrL1Yi7aLcyjrOFU3U0zMOqMhv1WKYVorjFUK3+27EzTwpP1ejha3qTKkWgrXHUwMDAz86t61f2hq9pWJcx2MzdcdTAwMDX8qJSKhmu9cTbVTlmj/b7a4LmtXHUwMDBm9JfPJbemsWF4uFx1MDAxYy9cItmNqNbWXHUwMDBipOcrZXO7JqupXHUwMDE46JGc9Fx1MDAwM7XcqlJcdTAwMGZVOulFN65cdTAwMGbZYW+YJXnW6UZLm0Suk+5cdTAwMGbtZbJcdTAwMWGnMT/Zi1WsUFwiXHUwMDEyi03mVqpXOlRV38qKbq5SZyFcdTAwMWLBXHUwMDFjVHhgXHUwMDE1ZMv3duOYn9iNXHUwMDBls9kkMU0u8sVEtr/v2n423FhNi6ndsJdcdTAwMTks6tnCnm6KazvrTt3GeJfZJ9LRrNeY9me8WpSR6FwiQVx1MDAxNepcdTAwMDFcdTAwMTdPdKxcdTAwMTmVoVpoWG5tnemy6eT9uVVdpMkk1MjFXHUwMDE3NOOFdVx1MDAxM5XnXHUwMDA1YFx1MDAxYu0w3ZedppXX8ViGXHUwMDE3d2qZXHUwMDFjgThO21YhXHUwMDFkXHUwMDA3S96oLnmC+a2k720nklVHVipVbTU2q3jazjvrbTRcdTAwMDLyU5mr2CS03kz7XHUwMDE54Vx1MDAxNdlBjpudms6ozHyQXHK3OsMxV+4usUmUY11cdTAwMTFp8ann9FCVXHUwMDA2SPnQqus+apVb0k9cdTAwMDNcdTAwMGIpXHUwMDA22q09cphfXHUwMDE0jc1yyaObarXgVuOI9Vx1MDAxYWXCU6uMVZ2U1mpcdTAwMWVcdTAwMWS06WE4XHUwMDBieGNpTVx1MDAwYpOKU1/R1K6bLvdYK97N9igrtLblaauCeyuH9IvdYtnt5zqB3SzqJMahSFx1MDAxYjz8SjxaXHUwMDFitezxXCLj8mx24zqHmoVy8WypXHUwMDEzI+OUdajUuoVUtVxmVLyfXHUwMDE0RSAkrVBrMN5GZUA74Y5FYpF2i1xy53YmWahuk8NZq+UtvELJzy7SdmlcdTAwMTfPXHUwMDBl+4l2glTm+zYtpXXJnlRcdTAwMTb9VHZcdTAwMDDkMFTsZv1EQGd3sMODJOO+tcxcdTAwMGKnUi5Nt7NZv+aNXHUwMDEzqUR5Mlx1MDAwZm9Hi0hXXHUwMDA2Yp1uYev2nVx1MDAwNnVXc5SfdPO1XHUwMDAzj63HkU12VFx1MDAxY1jzRNHz62heZ5VIP4lcdTAwMDKxbrSldZNswr1FI5uw89Y+kWxMpVf1urVcZnA0VrTG9VxchzojVHE6uVlpQlLjxWTWqsR8nHfys7Crc6Lt8thcZke6kUZk1nCYTvbjtV2rnXRcdTAwMDbblDXLJGbNjj/eMXu7s1x1MDAwNoFlPr2LK1x1MDAxOeKrVGWASfIgZ2EpeIAv/Hoyulx1MDAxOTerbLOdz1vLSF90XHUwMDEza7pn6KA7m1J1NePbjFx1MDAxYtjxQWCeXHUwMDE4RJ1OPatSntWKLsfNneuVsuNMrr5cdTAwMTOBfJa0XHUwMDAy7aqQOX+Rm6b9nVx1MDAxNZ9cdTAwMDJIXHUwMDE0V9smXHUwMDE5NGfV/r7WtL1WWIlsx4mT8mLbKG0mxF3Fwlu/XHUwMDAygJ8rtYbxXW/eXHUwMDA0r1x1MDAwM/yCQe5QiOuAt+45lanoNpR2Uk5mPlx1MDAwMXn1Rr3kXCJUjeZW1Wm1n9Ji1epcdTAwMDfie1xcaVx1MDAxMVUv71x1MDAxNoHeIDKfeFOlwl0ys2PlWnxeT6JuZuN7XdtzXHUwMDFhXHUwMDExPe3oUo3HfVYvx/uLlrXN5HbheaWy3sVWo0xcIqaLXHUwMDA3K7fb9rJcdTAwMTPeXG6s6L4m9lm8tNW+XHUwMDE5XVx1MDAwNJpcdTAwMWQvuiglVopU0nHlZlbpbmEo61GGyCrlerv6/jBcdTAwMWRcdTAwMTbTbTuXmDjN0CG3TUZiXHUwMDExXHUwMDFhr+3H40BcdTAwMWbgvJpcdTAwMWRb8eV2lFx1MDAxYnf8bKRRivdzrFx1MDAwNnxws+xcdTAwMTKSm7Y8slx1MDAxONeBPlfcRKPg7rrdfrZcdTAwMWbKst4837Dr+rDabiZ0U1vbfrtcdTAwMTKX1qaZx/X+kGm857vIZFiZ1Fwi+ZJuWXR/mCe7qVajkq4lVWbi7+axQLHmNspcdTAwMTG/nK5PkomG5Em09jKHYahT5Vxyt+g55UK+YpNcdTAwMWNfj0dZXHUwMDEy3yWaWVx1MDAxNy1cdTAwMTPMnUX5aJcttjKB4b5w6M6qNu33rS06rEuVg7eo5dKi1i2G+mVcdTAwMTT3wfVL7lx1MDAxNnt35qS0r5dcdTAwMGWwt3ypv05m+91ZodqoVkfUn2/Al8s7dTtac3aD0XarKvllJauTuDxcdTAwMWTQmVx1MDAxN5ZcdTAwMDWarzbKo34sUzus/Ngh0qixeJd3bau02UbHRC03w0Z2luj3Y415az7NuLtYg4batbwlyv1DnZO+rqFJuN9xI1NcdTAwMTVLXHUwMDE3ZbuwTuRcdTAwMGVOPNwn6dV+XFw5sOq+u/RIP39cYrW9QIhcdTAwMDXcyY7YtSFcZpSws3s33yiQhLtcdTAwMWVcZlx1MDAxYrWhrcqpTjc2yVx1MDAwZbdcdTAwMDfb2iVYOlOLXHUwMDA3UCtcdTAwMTVRuXhyTVx1MDAxNl490lLrlTOeZSn3VSnVXHUwMDA3x3xcdTAwMTTZXHUwMDBmWsibXHUwMDA05JytxDDCan521t83pp63iSVcdTAwMTLtTWfRXHUwMDBl7Fx1MDAwZX29XHUwMDE3OLZrhWM9L15cdTAwMWVcdLEsxryVV46Ul51ktmtccnKB4npMXHUwMDA32+S4Q9axvZdrd9OF1rrqppohP1x1MDAxYs1NRoXStpGbNOgy3881dv2GTuXTZGRcclqLQb7oxPKtcTrfyFx1MDAwNuxuXHUwMDFjXFx+ayBy/Fx1MDAxMGhYTmfibmGlPDtHd6nGMJ5QqFx1MDAxOdj7slSJpPz9Ydlli1ljXep0nMR2nKmAg+RcdTAwMGVneLVcdTAwMWXG0+FFoL+Q/WypceiiLKeqvPOshJvaWP1xJzCbN2ep/NRfLzKVeDtcdTAwMTaer2OpXHUwMDEyYi1aTEpW2kej/Vx1MDAxMFx1MDAxZEya/VR+OKpZmPWi1tTyVWwoY9kl2U7mqXGZtsb+ZubjNDf+ZD+msdPZxmM52WmDfe83O/H+fjHK8XJ06VdcIk0hiqRcdTAwMThcdTAwMWF0WNNLxL35qjRPK5opLObNdbTS5KuxXHUwMDA0uz/xa/1YNVx1MDAxZuVKJaVcdTAwMWRDe1x1MDAwNb5BrTZMXHUwMDE3MrFtbuqWXHUwMDEzjWyS82rZnrW92bo9XHUwMDFl2zEphtVcdTAwMTiZ+tKy+kVcdTAwMTYtXHUwMDBmJ6Ra5f35rK1iraLXyvtcdTAwMGVLlirLWb5YyVVLh/HEPaztSFxcdZu11Dzlbp1yvJelNl6gjlx1MDAxNY5TtVxcLOc7r7QvZ5epudOWy24/NNhcdTAwMDJxyq9Dcz3ZZYbrvd4t9+t6L6xcbt2iXjTWy4C7XHUwMDFjlPnc6kzXNs/5lZ7vNmPjWL3VXHUwMDE5N8vjJdCRaCy93XhcdTAwMGIrWSnX/T4jXHUwMDAzz1x1MDAxYmu/velcdTAwMTVcdTAwMTa1ZGpcdTAwMTBZZLvd0KTf82ilvZ242lWqNp00yChTyC76aGAla4lSrCl760AjXG52s57cXHUwMDBlRo3W2PLsfW65srZqKicrUVm5/UhNXGY2nVlM5LYrPFx1MDAwZolNsdRbrStWz8mnK41YXHUwMDA3h7ez2CpcdTAwMTPKXGbGh1xcRJRcdTAwMGZFuVNV1po5ydR8XHUwMDFi7zhzXHUwMDFjK3dKsZFOTVxuiUC7gWe12txxczG3tvYrk0hu3jzYMXC/R1x1MDAwNSfli20nXCIzidSy0LZcdTAwMDelpF7MXHUwMDEy22XW3fq8tF/0RHi+clx1MDAwNvVcXLSfmYxWpWk/sZ+vvTGerS2Sr8TAj12Pq5nlUsFYmUp/UGuqflx1MDAxMa/NZsxmnUi4XkmzzLx+8JrZXFw/hjKbaL9cbjSm6VxmWCXmhbJ2z2mkitXwJFBcdTAwMWJcdTAwMWRcInqXSFxyrUByuKi221HWs1x1MDAxYlZzaNmwkPV6YmR7uO1zWVx1MDAwN1xmxLvCvOhcdTAwMWWSfkCMxi3wrFJcdTAwMDdcdTAwMTlB+3Q5Ulx1MDAxY5dTKFx1MDAxZK2MVuuSNVxubWLpTDo+PLTao10ykc/XXHUwMDAyu96wXlx1MDAxNLpcdTAwMDRyc+jAlJs1gVGs6Fx1MDAxNVx1MDAwM+6hk1x1MDAxOOw3XHUwMDAxbVx1MDAwN8DDlM2ZXHUwMDAyMpFcXEYnZGGJ9KhdnkxcdTAwMDLx8JimJyyZjc5C8fSgnEzW9lx1MDAwYuFGkN6pXbFcdTAwMWatJTZlpNakY7FpP9xvY9dcdTAwMWVccluj2nC1SXTSM9tLbFqJ0jhcdTAwMWFcdTAwMWVLks6HXHUwMDE3/lpbgJ86XVx1MDAxYWqE0213zztyTFx1MDAxNo6/SDU3NDtseP6kWpz7u0rX0lx1MDAxYmvdT4SN7NSym9GAtTON2FwiPK9NQt3KklJNZnEnM3FkXHUwMDEzRYaWqifyMy+WXHUwMDE5XHUwMDFlXHUwMDE24IE1Sa8omtVcdTAwMTV42JP6dO05PMJJaeSmOnJFUk2/TeNi1izsY6lx3FObbLeaqPXDS10tdLxpmjvzbnjhtGRXgozNhmkyXHUwMDFk7FFcdM+2fJRLj1jGzkQ7Kr6vN6Tlos4yvupv0GKVL+8yzmFMnXFcZicnXnfg5teHRKKJxtOa30WVmNux3IBqWKnlKJBcdTAwMWLkvFHMXHUwMDE52p3CVNLholbo5XZDp7bOXHUwMDFlKHdcdTAwMWRvXHUwMDE2XVxyXHUwMDAz+VZlkl5cdTAwMDSi7eZgisJ8L9PtxraHq81+ScRTW7xcdTAwMDBetc1cdTAwMDBXm2RcIrV9XHUwMDBl/LqA1ZlkXHUwMDE2u+LcVjuJN9YyUE3sR83Muu1lM8PZek5biX4yXFygajB0N+5qw4fpdSVDvTlr7fPo4LSm/sJqgl0ptVbDdKuUtlx1MDAwZdPtzs0sUnyY1TNcdTAwMWKlXHUwMDFhaNEp1qaDSEPRpbWU3ZFcdTAwMDO0bG43nHVcdTAwMDd57VR5XHUwMDE0W7jNVjqfbbuHbMRxXHUwMDA2u3Yy0YmXnE2imGtnsoN2TPfG7UyuXalccix6iHdXnUAnPFx1MDAwZiUrjXo0u1x1MDAwNv+nspttXHUwMDE3tb097/BcdTAwMDBeWVx1MDAxZU1EJ6naNF1MTHg701x1MDAxOe1L5XV3hlwiMX/Tz1iFTSFZXHUwMDEzK2+yXHUwMDFiXHUwMDBl/UjUrvT4wt4uVtW0jqXKoVx1MDAwMnVcIkMvXHUwMDFksXSARlXWWjCyXFyn1s1sY9TKxjrrsehselx1MDAwM1rtl5LYa7C8rIRWXiZdcVx1MDAwMolU3yeLXG6VvdoqU2Ox+KqYOozh2cb9VKeWrvpyOJ+AeW7kV3ZhX1ts1sxGmdgg4nf88ChcboSCXHUwMDFmwod5L+2251HXXHJLq+Cnq7rSTmCrvlhucqRcdTAwMDH2XHUwMDEwPHuWXHUwMDE4sn4yqrdcdTAwMTW/nqY7O75p5eWW+1xipzw6j6dzrYFOTWOrXHUwMDE0ULv8Mlx1MDAxN5pUXHUwMDA3q1xmXHUwMDFlXHUwMDE3S7v9sD5cdTAwMWTO6s1MW2cjocZiLNqhzlx1MDAwMfyarV9cXFxmVCU8Lkc2g2yrtVx1MDAxZSUjJJ1cdTAwMGWNKltcdTAwMTC6tUq6xJNeYlx1MDAxY4tk84FEopBMVnxR369cdTAwMDZcdTAwMDFgZIFOcTFcdTAwMWRcdTAwMWZaXjQ2S41KfTY8TKfpjmiFl27UT81jvVx0XHUwMDFhlke9WCmQi2z263ZPRlN1L7TtlXPTlVx1MDAxYsvLrPRaeDnMXHUwMDE292BcdTAwMGW6yVivNMOqRmNFXHUwMDFlb+za65DsxZNWmq14gORq5dAqXHUwMDE06Vx1MDAxN5f+sNXmVauwXHUwMDFkXHUwMDBmLL+WqVbTxXGh25PhlO2kuMv8LUZqy3MxPllccv1WKznYa7prVfxxPJxcdTAwMWORiVxcbCdcdTAwMDA8o02rs1lkuttZtlx1MDAxM1x1MDAxYVx1MDAwNYi9imU7paos1nVHzHRd2Plmxk5nXHUwMDFjZ1x1MDAxYiGJSLLm6OzUT1jZTnSx5dwpzGD4WatfmG9cdTAwMDMtJ5XvZ1x1MDAwYoHkrpRu2Cwrq1x1MDAwYpZu9kpcdTAwMTOJy7yEovl5KVx1MDAxYljni+3QXGbxbVjWVrHkwJeV7aI9XHUwMDEzutVgYjmMXHUwMDA0hjhdSzklabX8bVxyq4FLkp18XHUwMDA3+d3lXCLeKrdDXlx1MDAwNvYhMkyWIzGPxlvTVjEz2JT2q3VcdTAwMTOnSXHQ0VM7nouSfUVXMVxup0UpUm7MXHUwMDA3gZzTXHUwMDE4591Ztlx1MDAxMpjaY7qvL1wi3MlcdTAwMWNcdTAwMTIkXHUwMDFkqpBii/uDXFxonuzZNZBcdTAwMDf/XHUwMDAwerpmpFdbOFx1MDAwN71cZlx1MDAxN+xqUaZH23UmMVxilVx1MDAwZen2cF70XCLD2KE/XHUwMDEw+/ZcXFxyXHUwMDFis0Uu1yfj+cyly2Y8MlhcdTAwMDRcdTAwMWOrOcvFXHUwMDEzQ2RXU3o58yaFmbPxNvlBcVmsUyvChT/dXHUwMDBmk/VNaDlsoc5ukbPjW3dNQ9G61WtOaq7Atsr6nltpzZJs2Fx1MDAxOFx1MDAxN9KsmFxyy0piXHUwMDFka4I+lnNccpZ2XHUwMDFkzexsOX5oj1x1MDAxM5lVXHUwMDE3h7bjUnu7bkvdXHUwMDFhXHUwMDBmkjUqclNrWN7QyaA8Lvhq4DWl9FvDXFzAY1x0L5SntVx1MDAxMtEp3FxciJIzbqa6XHUwMDExr94r8W1x1C2lXG6haJVt/cSwyzeh2K6CJs1EeFx1MDAxMFx1MDAwZY3kNlXkXHUwMDAzmuzDXG6rTKhcdTAwMTD3XHUwMDBmWHZnrWKiuKzFY+tQpFB2m3Fn6y7Ciorpcu819u5cdTAwMTJcdTAwMWPuSqbutGAmzOnv9zZJl835Ylx1MDAxNfWWyaZcdTAwMTXepMHwkFA2Tvh+0912kvNRLN9cdTAwMWKH/cxyXHUwMDFhQL1kRFes7mS7XHUwMDEyaVx1MDAxN2hcdTAwMTNcdTAwMTnLVWq5a1lcdTAwMDWUXHUwMDBl95M1hKLDjb1IT4bDetXEtLZcdTAwMTFWjiVibrTKy7rcz2WaTS/e2/OEVdsthqCTkWgrtU35i3wg4lx0vz2sXHUwMDA0Zll3Z0k775CIoP06W0XSdrpcdTAwMTdcdTAwMWUs3MBqXHUwMDBm2LlKjmftfrRQmlmikaT7dkbMylYrVjcxu8K647N+OdVcdTAwMWZcdTAwMGU33VxcJuTmmouFXHUwMDE4pnu2OT+NuY5cdTAwMWOmuF9vXHUwMDE2XHUwMDFjXHUwMDExWZam83qFrCP+Moandlx1MDAxOGwyrYdKpTibbVx1MDAwN5V2WNfri1x1MDAwNo3my1x1MDAwMOaDVDglQm4zXHUwMDFhIFx1MDAxOVx1MDAxZC3CIE4qXFxJbFNhcPiKyfi2aK2BgMY79VK+XFzyw+asM/DrfPhcdTAwMDc8U6+GO9tId1uUZV9Ex1x1MDAxYpO2XHUwMDEwjqTLNVx1MDAxZVuAmPR6//t/n+T6Lbov2UqIMNP0TumTRsMmNafcXS387ublU5ogJpBE+DRcdTAwMWbvd65cXEpdLnWHIOIxoVx1MDAxOXNcdTAwMTWirquRQ1xcql3pYVty9u5cdTAwMWOPp1x1MDAwN/6AXHUwMDFjj5z5K5r6nONhrVx1MDAxYVx1MDAxOdG9leORMuv5Ocdj2Sy5KJlv1kPjtqS6nmlsXHUwMDFh9XZurXslMk5Mc9mD69di4FmmmyVrWisyqzRcdTAwMWON0pFSmJUq4Fx1MDAwYsWiPdvK2C07mmuR1SC5XHUwMDFlLSqL1YLS3CbAU2jTqFir2Zgv2l3GXG7lyVx1MDAwMlx1MDAxZlY7LmVnk/P7pV4pXHUwMDE3j26q2bDdXHQnWGTUqFxmw41quFW3KtV9q5yZlaaWXHUwMDE1TeWG+8OWXHUwMDBiL99r4m4p7jfalUy5XHUwMDEyy7H4jNV9ZY/BbKVb+0x5XHUwMDFlm1x1MDAwZdm6sStnMrmwV1x1MDAwMlGOVIYtt1x1MDAwZia/lU2wslVryJmVTXdcdTAwMTfx3GrIXHUwMDA2I6EnXHSrs0eUY68/lzTgxPrhqpXYTt1cdTAwMDQwo8GWxbfIizGdiIZcdTAwMTP9StHh20J4X9yxfDiVirSyqXZcdFx1MDAxNGbXyFx1MDAxZHQmUsrM46W5XHUwMDFkLdlWuGLRXHUwMDE1XHUwMDFhpObJqS3/L0nnsdysXHUwMDEyXHUwMDA14Vx1MDAwN2JBTktyzplcdTAwMWSIKEDk+PRcdTAwMTf/12W5yi4hMTPndH9NkEOOynFtjCdencxcckRcdTAwMDZK/1x1MDAwMnRcXGJcdTAwMGazKypbgzeAwr+G0tlcdTAwMDBuo6VsiF4mQJne0ZwqLdk/XHUwMDFj1LyN74hZiFx1MDAwNSOWXG5bfstIXG4hOq2pe0HvhmEke5Pw+zykO0EwXHUwMDFihKZfhN5ryps0h1x1MDAwMjhv1fKTkiStTJ5VW5SqXG73TIxTb7mqtj7kRPdQ8YU+sVx1MDAwMFeTKrZg9UVcdTAwMDCwSnNyoTqRe3R8Qlx1MDAxYozKzJOQZHlcdTAwMWO/3+f06CqGUbvm6oj9veg3wq1m4nUkJZVcdTAwMDJmXHUwMDA1jlx1MDAwNm5zXHUwMDFhXGZhRI58XHUwMDAx8akvXHUwMDEyKdufvqNqPsNcdTAwMTlcblx1MDAwNFx1MDAxNVx1MDAxZUXfXfmhIGDFRS91RFx1MDAxYlx1MDAwMHHXQaBU14HucKXlcV/s6tmgnHvvL1x1MDAwMKPPlPR9SDKjyGObfP5EZrWn0LyGraXi5lKmLuDOiFx1MDAxYoS6W39cIvGFW8jzrnAxc1x1MDAwNY/W9PVcdTAwMWNcdTAwMDMnMe1zil+/Y7hcXHs1qFx1MDAxNFx0ldXMX6fYXHUwMDFm21x1MDAxZZ74u+9liVx0iNVlpS60+Xd9v86qmiDyy/taXHUwMDFmoX2TxehcdTAwMDbDw8KsXHUwMDEx4EJcdTAwMTZcdTAwMDXC7Fx1MDAwMf0uwFKdU1KMvn2iO/VcdTAwMGbNdO9cdTAwMGJcZrW3J1xmoIkzdeRZKjNqnVk10sFzXHUwMDFkfFjGjushhlx1MDAwYlFZY/LtTzrbbvQhtVx1MDAxN1s3916jXHUwMDFhXHUwMDFiJ6Gep4jtk9brlGX8XHUwMDE1XHQoq6riuJJZ119BqTjh5NtcdTAwMTdlLkDhwbP5PcUhr1x1MDAxOEk+Z/JcclJFVVV74vV0XHUwMDAwRYXUWUeVXHUwMDFkjlx1MDAxMYJTMvxsi/YrK4yhU8hcdTAwMDDZZo0+UuRcdTAwMTlcdTAwMTjnS31wXHUwMDA1XHUwMDEzy1x1MDAwNaig36Hfn8aJRcTeUX1IjCHQJCVjPc5cdTAwMDec2XRcdTAwMGVNjomKLlct7cGjflxiX1x1MDAxOF6B31x1MDAxNVxu3vRcYpSwRVx1MDAxMGlWLypcdTAwMTCkXHUwMDAxW9f1sypUamXqn7J1fdBz4ic+w2hww/tgW+9NlVxy6admx+RrjEeJrOrrmrzRolZ+sOi2qa8keb7ULFx1MDAwNVQ2eeH1iSVmacdhSIrD405WSM3BvS7ax5ymXHSR1a6NPlx1MDAwMvNiqEJ63ZuFzVg3RXywwqit5LqQjoQ7dW69XCJ6KtvAaW8yXZFEzXNcdTAwMTJcdFdIh71LcVx1MDAxMaFcdTAwMGI5XHUwMDAx2etcdTAwMDUtX53tiVhoXHUwMDExOLss5sqRm63Wy1qRT5c370Y9jFx1MDAxM1rsXHUwMDEwckWSKEi3MIFcdTAwMTfIh+RcYqjkPpsoiqggvVx1MDAwMKJu4XVl5NCAXG5B8VwiljQ2ZbiPXHUwMDAxXHUwMDEy4tRvi0dcdTAwMGJJL/Q/8rrcXHUwMDEyI1xiglx1MDAxNFx1MDAxNFhcbm5cIp1cdTAwMGKmsfVcdTAwMGbbXHUwMDBmv7DmW1m4XHUwMDE1udlbdFx1MDAxMzQ4qe1aXHQqXG4y7aZ5XHUwMDBi8m87fphhqddUUlx1MDAxZDJqXFxcdTAwMWVunKjq6IC5o5xcdTAwMGZU6Vx1MDAwMiAqNKfdgVxi03RcdTAwMTEqam9cbtXQ9JyBVOx2XHUwMDAwvyyPhKxcdTAwMThlPqjyWn/iJPs1wSi5LSRqV8S3XHUwMDFmn9k7k9HsWFx1MDAxZa1Pqb2Tvzu07Fx1MDAwN5CZivrE0WHfR5/QN+5CViZB6S2q2sFpjL7QKNRvja/IXHUwMDFjXHRJXHUwMDFkrq04bUKydkRcdTAwMWZqSLLwXHUwMDBikdXhW+H5J5F9XGZcdTAwMWPkK9JcdTAwMWJdMPZcdTAwMWU7UHIygTowhpO/wGjAiMtl1dDo7LT9lsCMg02OK3Xpd97vu9xcdTAwMDC3wbV9i6awoy2rXHLD5eRDJ+6EwXuaY/GZsaCMYdtcdTAwMDaTsqmrwSFcdTAwMTKqSV7xtIRcXKt3YjGL/Vxm9Htwn1x1MDAwZj9RhmO+y/rqXGYzXHUwMDBmwYO8dmE37lx1MDAwNPv0kbcjYFLGXHQ6ONCVfa34PFaJg0fvUsZ7M2jBR4XthYVWd1x1MDAxM1x1MDAxOFtcclpBfXGjdqEhXHUwMDBmPVGuVE3jXHUwMDAxbKZeuXpvdS39wlx1MDAwZoud/ChlwsirtY1cdTAwMDKCNEW5U1x1MDAwMqgzvMZcdTAwMTTRt8ScmCnK8lx1MDAxZC8hwVxyi6xZPpfn5jy/hVxcXFy6ccw1JdeA5NxzxIm58Fx1MDAxOK249cbUTVxibDtYrH1w0CXAOmWQ4pu0clWWSfFIL+1tXHUwMDFj93rt2zyjaMXJLI3cMTvOp7jETpKSdNLDfKn6LVxibVfySbynXHUwMDE0T/rSsLlkif3KXHUwMDE0Nq6fqrru47BcdTAwMTUtR3RpXHUwMDE08meoXGbmXHUwMDFi6a9/+7yvz4VcdTAwMWNy4K5M5Fxcdlx1MDAxYVx1MDAxYz+90PGJSiZcdTAwMGLp9tBOoM5hY6Zg1bn29Fx1MDAwYtw+n1x1MDAxMlx1MDAwMOhOaUSUdkPYxYhottwoTUNERJGbvNlT/6mprGbtXG6TU6Rf6jOH9ET/+WBR2EWzhdtB1T5V4FpcdEwgXGIy5XFUSZY+SdVK05KhsiRFRVxyZapcdTAwMTi/NevNXGI1XHUwMDA2akVv5W7PpuWI51x1MDAwZUM9slx1MDAwMKu59k3x+bzD12E+XHUwMDEwI2H6XHUwMDFhto9ChVetoVx1MDAwNFx1MDAxMlx1MDAxMlx1MDAxZW2Ic+gljaMoNkdPkna0vlx1MDAxNOLOWGNcdTAwMTV1YaTs6PPUcfyrXHUwMDFimuJ0U1x1MDAxZFx1MDAxN1x1MDAwZps0QliJbGz6KJd14llcbqySP1xmnm2qtHdwtPTYbivm7f2tzU9xXCJcdTAwMTVcdTAwMWE3fVx1MDAxYS5JM1x1MDAxYm8x41x1MDAxN3Hs17VcdTAwMTeFkcRcdTAwMDfR8JcxIFx1MDAxYpFOXHUwMDA0lfM8z3hUvazMjldcdTAwMDTc3/GP4GNf8VJIhVx1MDAxYrMoLMNcdTAwMDHn9NlcdTAwMTKX2fB7NWjcSYqiXHUwMDAw+Y78XHUwMDE5bc10TiewKj0lyuo7ibN5WzP0OO3IPEWRm1x1MDAxYaCEr1x1MDAwMSa2gKHy1uBJWip4XHKmoFx1MDAxMTi+OI6/cmK5zJ6L0E+d3FxiNYvyIYnuXHUwMDA2lrmIqeJ7ujauUtFcdTAwMGKmsd7faU5fn8WzfyBI4fCpfOFzV4FqXHUwMDA00CiEs7Lj6nxcdTAwMDPm1vuoXHUwMDFjQPxcdTAwMThs7ae7iFx1MDAwM/j3+7bcp3k5gIPHSLtjXHUwMDBlP+Q+4LBfRvpkiP80mqK3/rfbKIKAxVx1MDAxZbRcdTAwMWFHXHUwMDE0qlhcdTAwMGJEXGJ/UtnNXG6H5UOwvGjDUnKEuj61O074K2zqaX9cdTAwMTNcdTAwMTfiXHUwMDA0XHUwMDEy9bovtVx1MDAxZVx1MDAxNfjTg8w61/tcXDLkvKqUVdQ93VC9dUsyo79cdTAwMWVJr4nSclx1MDAxMYHjbupIXG6daDZe5WFcZnMhXHUwMDFjL+9+oyynNVFCxFx1MDAxNlx1MDAwMaqprWpfXHUwMDE1r0CaxqFfMVxcLc/O11x1MDAxYu+SwC302Y2BZpLKsvSSmM0kR1x1MDAwM/GXiVvw0ztqq1xyNJ7DiimPnyH21K6AoPS6XGaVeiw6XHUwMDBlMqpcIsL4NazMXG6HSyE+9S+7jz1i761a61e0q+7smlJ7oUzTO6Hu4UNcdTAwMGWLXCIwTsTft1x1MDAxNeSRZZZcZrmEwMf4cCks34dqmjRcdTAwMWG8XHUwMDAyu1x1MDAxY/dvYjlhQVx1MDAxM0dcdTAwMTWAuotcdTAwMWORkcdDnnZaLXaLXGIyfo5BMFv8ZZU/U/LVk369XHUwMDA0NLMrQG9cdTAwMWFcdTAwMTaIkkdcdTAwMTXpg4Uv6rzCgoRxXHUwMDAwiEJlXHUwMDEy9Vx1MDAxZiuZNJC9QVFXXHUwMDA3knfgYnlcdTAwMTMvdtjWvq9HurvtIFx1MDAxMVhf7+mwXHUwMDE4XHUwMDFkZejYbVSMXHUwMDFj9YaKkObp9Fx1MDAxM1xu9d3DXHUwMDAwe62eVGslRLaRXHUwMDE3K8qjdo+p1ksj2v2mp79cdOuBrOnzt1x1MDAwZaj3XHUwMDAxsL952Iv2yZXG6n4gQOE0XHUwMDA0llx1MDAxMtFRxF2UW9Rpkaa8glxyXHUwMDFl01LqMPVcdTAwMGJeX4FeWTsp3jWRKD7I4Gg5o4JcdTAwMGb3NXJcdTAwMWJyx8CHi11TITCrfYGIpVx1MDAxMos5Mr7fTei3XHUwMDE3j2r/fvyfXHUwMDBmyXlX/XCkVVwiXHUwMDE2sKH6hiOaXHUwMDAyoFxcxUv2XHUwMDA3zyAoXFxdh4GPTpHGiz/MU26AnMiXXHLmp7RcdOdL7spk62Dff2f9rHPc7FxylpnwfMuH5fPq+e+CYZzUvTpaXHUwMDFjKtRcXK56U2ewYMkojFaHOvCaXHUwMDA3x6TyaF0zXHUwMDA29mawXHUwMDFlUNk3/HDuj7pcdTAwMTCw04RcdTAwMTlMhm1cdTAwMGXfNUUtq/5G5J7TWTG8Pfu973ZvwmHb5W/AQYM8leZcdTAwMTnzPW70o79DctQwWrr0u9/TJr9mSoXQflifvcioif3F9U758mb3XHUwMDA2pVx1MDAwN6L9k3RIXHUwMDA1XFw+7LRvXHUwMDE2o3qvSlhcdTAwMWbNdcUnR/Wywtx9yiigzPKU6W7z+i5f/2dDkcH0QyBWR6uroahmvpPpQVdcdTAwMDfpZKhcZqK670/whH7JXHUwMDEwqv2MqFx1MDAxN6KHzFx1MDAwYka+0lx1MDAwMvdcdTAwMDJN+ytFf5e9XHUwMDFjXHUwMDAwKGvNJJP+sZxcdTAwMTKZZYSvXHUwMDE2NrrynG1M1Fls7J5ifmxTp1mpXHUwMDEwUD5s5771Ot2EKTlyllxy9Cug2I/2n2WadFSmdCdcdTAwMWJcdTAwMDSi723lXHUwMDFkwy1SuWAzJVjmYlx1MDAxM+mKj0NryEA+s4BcdTAwMWJWf1x1MDAxOYBiQVPkKDHi7Vx1MDAwYr5cdTAwMTE/3j40wP9cdTAwMTJcdTAwMTQkXHUwMDBlgjJcZjtcdTAwMDGWYM7qWfc/s8hMz1x1MDAwM4pvRlxuxFx1MDAxYZJeXHUwMDE1/1x1MDAwNuorRUVym5lcdTAwMTOqtZNwmaJds5qaa/v2NNC2XdZGbq5cYrrsu65w26y4XHUwMDFh7OKfjmOXmqSluvBcdTAwMWGkZVTAmc7+fDNEcvFcdTAwMDBZXHLsR/n8wFmXm9YwXHUwMDAxKNY7bjVqmPd4hsNgIKaw1NemXHUwMDEwXHUwMDAzXHUwMDAwXHUwMDA0VVxcRYMx6I3K8kN2uJ9QbLtcdTAwMDZfXHUwMDE12FRcdTAwMTHdXGa7jre3ujlKsv0jTEGQs4SfXHKmm0lcdTAwMWHRNFx1MDAxObasu+DRXHUwMDFjgX0kLGlUa09//MV+dD1lqUNcdTAwMWRQ2FiPXHUwMDAzP5/uUYxcdTAwMTXf+ih5l/ElwHKl7dfqbyB+PnFcdTAwMDFuxc/GNdA91u7rgrTx91x1MDAxNsBtuVperd+LXHUwMDAwbGdlXHUwMDEz22KyoP7RibJccl7vKvBcdTAwMTSzh+SDZzohII1iOFlcdTAwMTFcdTAwMTGjq8xccvg3vclN8oYvQFDT7sjpLVpCwEZcdTAwMGaa8t3O11x1MDAwMFx1MDAwN9ZLpzeyXHUwMDEywELKzlx1MDAwMLzk/3KzLdpjXHUwMDAzXHUwMDBlUpqwwc9CnaiKXHUwMDE2cKj9+lx1MDAxYvRcdTAwMWaBnK8pV7LpLn++b1x1MDAxNvtcdTAwMTeg7v74KYEuXHUwMDAyenyAXHUwMDE4zL5cdTAwMDZrn67nXHUwMDA09T5ZvHegXHUwMDA30NNaUIKk00KUZlaw01xuaZnFo+nzVFx1MDAwZUqpc8SKz4pA16ptU1x1MDAxYrhnukroJm2clVx1MDAwMpKxzFx1MDAwZSFB0cFcdTAwMTVJMPNZLNhcdTAwMTng6excdTAwMDahmIuO0prV8ouKXHUwMDBi8WnwTTTox/z7Zy+yXU+9893TSp5I8lx1MDAwM0pioj8gXHUwMDFhk/JakbOnuK9Ca5WKXHUwMDE5bsFcdTAwMDPImzhcdTAwMDO8XHUwMDBmXHUwMDE5jFx1MDAwMdlSXHUwMDA0XyG96jKwS1iWXHUwMDExIVx1MDAxYYrfsmxkwe1IXHUwMDEydq2rXFyHkzfJN/5M3sT8XG7qXHUwMDFj6fFnn6p+jULpvtIjclx1MDAwMlx1MDAxZNVuN3zC/uVpr51wiur6fah+t+jzm745XHUwMDE0XHUwMDEwSyD/oFx1MDAxOIWZzVx1MDAwZppcdJznvPPcTfNUj8oleD3somvbKolKzZRcdTAwMWbCYJum0lx1MDAxYXQzzfta71FcdHx54Vx1MDAxMN9qXHUwMDE3YUvEMWBcdTAwMWZ+1Od8XHUwMDFllCGfrdRv+PuZ5Vx1MDAxZjWiXHUwMDA0PnBcdTAwMTStXHUwMDEytuzK3VZoPlqI+Jui+Pn6huiRXG436H9sXHUwMDA3+SCNUCtue/xcdTAwMTYlWMHs27fa9mrBqERYRyxUpj5sXHUwMDE27Uc0ilx1MDAxN1x1MDAxN8NoVKJlTKRcdTAwMTDFZvmGKaXelzl/u5Je9zpcdTAwMGJoJlx1MDAxOE26U0lKtFx1MDAwNmDzTnyPIcSGy1x1MDAxYfxoasqdUdhcdTAwMWHMdKU4N/rMXHUwMDE1OVx1MDAxZVx1MDAwMLDCgIuiwFx1MDAxZCqrY2GhXHRirr5qf5/E4+P5MiFdVbHI8bNcdTAwMWVWblx1MDAxY5xLPlx1MDAxNNJcdTAwMDBQ5r9KZH8k/jh4jsNvtFdcdTAwMWFcdTAwMWZcdTAwMTKNXohiln/LdS0yoMsoXHUwMDAxXHUwMDFkmFb1XHUwMDExmbKNtf+aXVx1MDAxY017dVwiRmR8+5/zXHUwMDE1mIVtXHUwMDA1x+WYsHVcdTAwMDXtXG5YIemYaUB3t0iUTvW0zn1cdTAwMWapp3TaXHUwMDA3wKFESbvkXHJqiYNcdTAwMGWsz+tDfKTroFx1MDAxZVpr22+0pfmZXHUwMDBlXGLqWNVcdTAwMWJh4TeJkDiaXHUwMDFkxENEaXQouv31vJu+XGZcdTAwMWXv8lJaPVx1MDAxNMRcIif78sVccn22N/3zJDFGwLfyfElDXHUwMDAwXHUwMDAzXHUwMDE4OyvVny/tk0BfU1x1MDAwMMCw3JtR45XZXHUwMDE045WsbVx1MDAxOVx1MDAwYp9y27U0VOHwef5cdTAwMDE7UTbLQis+0NH3z1WI2MtcdTAwMTiUI9couyduTytvmsHcRjuoNdLOb0tbXHUwMDAya+HyUeJcdTAwMDfiOTwzcp3QdvFJ54zKffzuQ4lcdTAwMDdT3Vx1MDAxMINcdTAwMDZvbnpHjf5annu+i1x1MDAwM4+iL36KXHUwMDFmXfy0aIPPise/XHUwMDEwJ0vQXHUwMDA1XHUwMDFi3i37kIJ9cXI9OFx1MDAwMjHM9vxcdTAwMDR8gFx1MDAwNXkvoOf3Ob5cdTAwMTdGXHUwMDBl9tY5bVx1MDAxOYdcdMs5XHUwMDBlJ7pZXFylMYb9XHUwMDA0JXa9Tlx1MDAwM/ixXHUwMDA1SYVIk6bM9e9cdTAwMDUhalx1MDAxM1xmwN7fjlx1MDAwZWx8NsfHrlxcmMry/CpcdTAwMTRcdTAwMDV9sluw0KfK6JwkT9s0bCgsaapcdTAwMTc9qPz7/cJnqitCXHUwMDE5v0zqV7jdqeCuwXxcdTAwMDJcdTAwMDTMa1QtzSA6Z+xcdTAwMWIrqjif+Fx1MDAxM/GtsllxXHUwMDAz5z6aec1T8NbVVU6iSzhcdTAwMWLeXHUwMDFiziWarpKrgFZ67Vx1MDAxMWn5XHUwMDA0qnV/XHUwMDBiVt0nc6b25J9jhyRxi8n5NihAvVx1MDAxOXu0qlx1MDAxN95/vbA92PRSXHUwMDAz53hDNCObXHUwMDA2d1GeXHUwMDE5YzepRDnY3ViYjrG7XHUwMDEwOZw4hFGzXHUwMDFmnGCK8flNO7Vj8nctfz84xe9/V1x1MDAwZsq+blXfukaEdcFHRGVcdTAwMTSPXHUwMDFi4zlcdTAwMWGgXCImlTWCYiRV5s2H+ox1XHUwMDFmnd95XHUwMDE5L0/VfvKiMLWEjepcdTAwMDRqi0zi70PmXHUwMDE5XHUwMDAwXHUwMDEwseqdXHUwMDBiXHKf23lcdTAwMWVHVLL2sHQ/Tj+E8Fx1MDAwZe9ZeJf+XHUwMDFk9N1cdTAwMTQvXVx1MDAxN1x1MDAxNF6ONK1cdTAwMTWcPzn9elL4JVx1MDAxNzxcdTAwMWPt32+nrGLG1Vx1MDAxOG4+omQ7heeKnVx1MDAwM5tcdTAwMWNJkri+l1x1MDAxNClhXHUwMDE3LIDKrKjuXHUwMDA0b35ELTRmyzmk4jR1tr9u/syVmlx1MDAxMMlXTLVcdTAwMTF46SxnWzpOsVx1MDAxYtskO9bbWaZYrl4/XHUwMDFkY00vVJG+fnlz1ZhcdPoz77hcdTAwMGI7XHUwMDA2Xy5cdTAwMThcdTAwMDFcdTAwMDKbXHUwMDA3Z54x4E8+1pSzXHUwMDBinng/xsPWhcElboNEiFR0RWFAXHUwMDFmfVx0dob5nmbbnVBcYoKEQZOH2F7V92q2o3n56FhcdTAwMTBot73oYFx1MDAwNuVcdTAwMDQgXGYuf9dh6lx1MDAxMbxmTVxiMzc/Up2yeFVcdTAwMTX4RCmyllxm8WJeT1x1MDAwMWYwzidhd21XQrvkeoZlXCJTXHUwMDBi6YKQWVxcXGKZ2c5L/Wf4Y1hcdTAwMDZxXHUwMDFjh2H4XHUwMDE0p4pcdTAwMGJrXHUwMDE4W1x1MDAwNlD2vec8rn6OvHjUXHUwMDBlS1mSXGKS7NGyPTHbXHUwMDA3iG75dZ9FXHUwMDE4TmVcdTAwMDL/aYPaYlx1MDAxY1x1MDAxNH3Xklx1MDAxYjMuxJmph27i8HpcdTAwMDK0ydGSWVxuc4XQ4rnZXHUwMDEyeVx1MDAxMnqTRFx1MDAxMX5cdTAwMTFBXHUwMDEx44DiVp/LXHUwMDFlf66LXHUwMDEwysCn71x1MDAxOc1uT7jIrlx1MDAxYjhgb33RXHQ4gVNiXHUwMDA0oGgoopC+7VdcdTAwMTIv18FqXHUwMDFlXHUwMDFkjS+EXHUwMDA3YVx1MDAxMV9EmHtcXOSBV7fMS1+f6ileXHUwMDE2XHUwMDAxxUB+ly79XHUwMDAyvizvjFx1MDAxNlx1MDAxZVx1MDAxOVx1MDAxZOnuZ5XkIE2VOFx1MDAxZSmGPe/ETzXw8bBPVVx1MDAwMve12+SrqaI3R8DxpmFajT6sktv7MuWD7Fx1MDAxMb/P9bB0yLzNQmvyV3H1oLJ1/jaZupBkp5jRXHUwMDFlkvHvXG6MrT490Fx1MDAxZetjyIbozYXz0Vx1MDAwYjx7W51ExTulilNBl1x1MDAxZjpAXCLcXG5cdTAwMDRMTsrJXHUwMDBi+5nlmjNJ3Uvpo5j4oiDFXHUwMDAwtvRccix+zYkgcdu9l1WLXHUwMDE59DmTIVpi3ubQXG6ZpHWjzaxhPFwiZc4sQ0/iXuRrplx1MDAxNpmcXHUwMDA04m/prVx1MDAwMbc8MNyvzturuYQ9cEcuWK9HTKDg8kDDLbpcXPiKMfOfk45cIjRiWVx1MDAwN4ZcdTAwMTbKXHUwMDA193QmjINcdTAwMDd2Slx1MDAwYoRcdTAwMWIkeiDLcZ4kb81cYmP4XHUwMDAxojZcdTAwMWPL5/4x8Yv4aUnaXHUwMDExJlx1MDAxM8XsXHUwMDFlIFx1MDAwMZM0QbiYmfE9cVxcb0NG8sy8gohDvDkgXHUwMDA3k0vfwcy/XdftWNvnorVBXHUwMDA3LS6093R6q1x1MDAwZl+6XG5PVVbun0vQcmJcdTAwMGZcdTAwMWOGcdFcdTAwMTOc5LA0jJtghqh8XGJcdTAwMGJcdTAwMDVHOXTuXHUwMDA0Vrs7c2uSzcaQg/DWqXVjvS1cYjG3gTkj4dpLXHUwMDE3R2YoL8tcdTAwMWPVJsO/PFmaXHKLtt9cdTAwMWXcbey0j1x1MDAwZlx1MDAxOHOqq+k9rWqse1x0+ZtG8TbkXHUwMDFixfq7n0SP0Fx1MDAxY57h/KJcdTAwMDezvJRcdTAwMTdS04FcdTAwMWKMI1BcdTAwMDR+xFx1MDAxOX6uXHUwMDFj21x1MDAxYon2lq00ttPgm8n3Of3VXCL8gPQzXHUwMDE0Om5EYtpJ+6aWXv/YzJhG8Nc7VolFtpdcXEMraTB18Z9jM01cdTAwMDV8tnShP2Cvc8xcdTAwMWZ/RNtLnFx1MDAwNP7mY+ljwcT420JcdTAwMDDjdFFDc5J9PspOfztLYmmsh1x1MDAwYqX1UyVi+kDRX8fvRPBcdTAwMDZmLS3xsXpcdTAwMGK9TS91/FxiILjWhy+aSl+gP3Tu6Vx1MDAxNDJcdTAwMGI3dElS+c6ra9WtUHfId1x1MDAwNqZcdTAwMDHXSFxuXHUwMDFlXlx1MDAwM1x1MDAxOYrD/nVRs8rTTyxZXHUwMDA2cE5cdTAwMWXbdor6fVTLncZ3XHUwMDBlXHUwMDE08Pslicx+9oJcdTAwMDR4r83AhdBWbJkpzmgtfEPzKM1cbsfsYzs05yFcdTAwMWHpYaUrw1QpzbgqTGA1vmnfrKUnaSnT33L8PVx1MDAxM1x1MDAwNcpATEB1OG/V7FevXHUwMDFlXiWISq9XdSGoXHIq7PA/XHUwMDAzmDsllH9cdTAwMWPLgL/B4TR2+L2MsYX2WJ22s8HuTEdcdTAwMDA7XHUwMDE4tOghJt5tzMFcdTAwMTCyXHUwMDAzIVn19rI/b9JNdDKObktTXHSabLQpQ6qDdd509v1GMF1956wslfop8TxcYmHv50KL7TlxXHUwMDAykVx1MDAxMDYpQvtYkm3tN2S87cok7K2oXHUwMDA0u35cdTAwMDI9xkZuhJ1cdTAwMDG5XHUwMDFjXHUwMDE5XHUwMDAzyi6JKzF2o6XIoVx1MDAwNVx1MDAwMtbC48PO6Vxm4f37O3FWwXRjrJBdeFxy5+6F7UfIXHUwMDAzrLOeq56VJWZkf9uKqlx1MDAwNSzLdsmoXHUwMDE5+2Tv8V2Ku79bUsSXXHUwMDBipO+PkEQxwTd+qXlN6lx1MDAxZqdcdTAwMTBX9pk+sVx1MDAxMmbqlOJzNM7SsJ5cdTAwMTKfWVx1MDAwYjHksEvz63dit2915PUq1ldcdTAwMTRUn+hLRa/R+uGR81x1MDAxNrjai3ueUsSGXHUwMDE34DdNJ7uEgvSXUiwtXHUwMDFisHRh7Vx1MDAwNlx1MDAxY2D9TzuitX/pUOdfb8HhmCn6JjtO91x1MDAwNVx1MDAwMfHRT2qzX8aZ6j1Sv1dSr0W1K59R2537pFOLIUTkpHD1vDvzadmMv1x1MDAxNrx/XHUwMDEzmMIxkjhl0cAgXHUwMDE0INKcjlx1MDAxNIF5mtcnlrM+zsTXf1x1MDAwNdEkb6J0M9lcdTAwMDGiXFz48GtVrt7g0cDYR1x1MDAxMTBCtvA7XHUwMDE1sVx1MDAxM8bHRNBu3vSuIWSmySqxK4JQuzJkXG6IqoVcdTAwMDTDZt2YVUqhLlx1MDAwNMprNpxpfse50Fx1MDAxN1x0XHJcdTAwMDfZf7R16duBnpJYoeVRSt1uXHUwMDFkbPm74/BnXHLQObrY37rmOPhkqqqNoJz8xn5cdTAwMTRJ0Vo+XHUwMDE3sVx1MDAxYlx1MDAwMpe9byu/mnk6klx0O/SzM0W0plxiXFwqKm58MN5cdTAwMTguMVx1MDAwMSZnKm9TXG5nuvxcdTAwMTZ/x8RKqv47n1x1MDAxNuI47sZKmqvHl41DXHUwMDA2XHUwMDFj+7XRnGKstnhcdTAwMDGr4oZxJSy3aI1yVPbDl1x1MDAwM6I3XHUwMDBmWs1cXMtwxi3VXHUwMDAxvWHHUF8xxYd2XHUwMDAzY41pMIX5cSoqMkRcdTAwMWPy3itQ4ljYXCKHXHUwMDFjXHUwMDA2MoZcdDdBnFiOiXXCTrjmwMdcdTAwMDSTrVx1MDAwMpnXQGWWpVx1MDAwMXDf93Wv7Oe6yFx1MDAxM/HwZD39lypcdTAwMThLdH74XHUwMDExRp1ow8BcdTAwMTeGtEeYOHbVuVx1MDAxNb9u9qNDTVx1MDAwZT5K6vF9Xu/aK0ZwgVHbyFx1MDAxZsO5dmX15lx1MDAwYnKcglx1MDAxN1x1MDAwMbnb0ljImlhoV0ThwpNPkS+0e7WcXHUwMDE1OHS49Yv98drLZUpX8Hp/XHUwMDE07vGol41hvb5HZ9iH2fxgUKJ242xcdTAwMWTjL/PhXHUwMDBmU1x1MDAwMtd3XGajgn+ArF50v1x1MDAwYlx1MDAxNJiDUOB6pPtb+jDwPGLUXHUwMDAwNv1qLiCdXHUwMDE0TbPsQfXyo/R6h0/GsuNcdTAwMTFFqTqd+EjNyEC2Ta3DfrpcdTAwMDJcdTAwMTMwsfmgOudYq7ywiH19ieih31x1MDAwMHSEcFx1MDAxMSW23N3qxUPOXHUwMDFkiIQ4+lx1MDAxY+OdufibqY0w/Fx1MDAxNVNcdTAwMTlcdTAwMWMy0I9W9zVAoWL9uVx1MDAxNmplXHUwMDAxlVx1MDAxMoB3l1x1MDAxZUK/10k7bFx1MDAxMFx1MDAwMMDvXHUwMDEyg6AmYYbQV1rivsZcdTAwMDWBbbb/XHUwMDA04zyfUTd+M8tcZqJzXHUwMDA0XHUwMDFifORFqHr+j4Po1odr27h0ulx1MDAwM0nLuVRcdTAwMDdPRTKnQCY6yui+g3Y0XHUwMDA2XHUwMDExumRcdTAwMDKRfG7/MUfalZxg/qhA3WlIXelYXHUwMDAz2LBRwuubbFx1MDAxMNe8ZsNBdlhcdTAwMDGjqk+FXHUwMDE2fNE431x1MDAwNuSDJ62ihUJjXHKfXHUwMDBmM1x1MDAwNERpbHDNnySoe1lcdTAwMGZnLPLJwPRcdTAwMTeHkv6Q5LKx+CcloXn4/cZJ10ko8OZ4XtbRY2BcbvdyeV5cdTAwMTi38yGCeFx1MDAwMFx1MDAxONGonoNUK1x1MDAxOVx1MDAwNlx1MDAwNfqhVdDpXHUwMDBmSjjEjNCY9SRcdTAwMWKFZu2i06bz3Vx1MDAxM1x1MDAxZj+52clxi1xiMKTfZlHp+ewwWajkXHUwMDFiVjBryjMnSqrWkFx1MDAxMLx6R2HVXHUwMDBiemm/i6K2R1d1XkEwM3HPzL2f8aOxn+2FX/hRR7iF9kb1tiVcdTAwMDfW8FxucZdcdTAwMTfTNPr03Te4nzxnzJRcdTAwMGJqU2q+XHUwMDFlaMYvhL/LO8SiszXHIXVCXHUwMDFldm97L/hX5PROXHUwMDFlXHUwMDA3dTif7CloXGLz91x1MDAwM8eYjU/BlMErlU8qiV/jhbFinE4mQyy/XHUwMDA3XHQ8X8aQf9+a+dyJ4VlfJVx1MDAxZduPlW93syojkFx1MDAwMa+dx/YsOq1uW1a9QjFcdTAwMDS0a512aFx1MDAxM2hNXGJYM4Gb92s0W8ImuZqBpWKxXHUwMDA0XGJC01x1MDAwMzZcdTAwMTBEgbiHXG7lhnGNdECSL9qpXHUwMDFkMVx1MDAwNpTkXHUwMDFi+4NcdNpOiFG+jFx1MDAxOMs+OsVrc6Q80258v7/vVZOK7FxmjH56pnJyXCJ0ltf7YJWTwVx1MDAwZaEmXHUwMDE4zJZeXHUwMDFm52I1bfaeXHUwMDE2plBXMVdcbvpYXGaZTWsjhMDZkFx1MDAwNlx1MDAwMC+OzcVd+eEhYaJcblx1MDAxN5qWbs/7qXREr9OsXHUwMDFm7mzsk/9Ag05cdTAwMWL+XHUwMDFjkqP98pNdrVfibG/HXHUwMDBlK/pcdTAwMDU5MO3u4bfdlfjFXHR164xh+ppgcW1Xe0HhjFZcXC9Z2GFJZJxy9P5cdTAwMTDfPZM8xcdR21xcXHUwMDA2s2a9T5TSXHKhwHbcXHUwMDFjXHUwMDFjO73eq8aMpKHyqVx1MDAxMkBcblx1MDAwMyuDg/5G9pta5Fx1MDAxM8N+X51sXHUwMDAyzszmMTZHRsxcdTAwMTchLziYapHo+21maXl0XHUwMDE0RevNe0yroaiXaSDY9MPLp5/fg2XQ4WeffDWKetRcdTAwMGJCyVx1MDAwYlxc0XWC4cfQXHUwMDBiaW2yXG5/jNaQy11HM09iWSaEXHUwMDE4eK0sKm5tMifgmi7XJcREwM/OinFMQXZcdTAwMWFcdENI6Dgt2D6CXrFcdTAwMDZTiulcdTAwMDBcdTAwMTRcdTAwMDfa/Vx1MDAwNbhBOcMrXHUwMDFh4cqb1L7Pg/qt5iasIWb2NKHkXHUwMDE5e3TKpZFcIte4sCRzTGjKXHUwMDEy3UPxk4LFs66PjDk9S55cdTAwMTNL1DiLMVxyi71LTzlcdTAwMWZ+YqBcdTAwMDOUW8czy1x1MDAwZlxcMEjd1VKfta5uKnVmMm2c7cJcdTAwMDaDOThWjPTGp6RBeM6IXGJB7zznLFJ+6lx1MDAxMe2noKJ17OnSd9ykq55cdTAwMWJZTuQ/TsTfzpZ39SrPzlx1MDAwYqFcdTAwMGa9uH7UXCI9/JL93lx1MDAxZFphjz+2346nVjlcdTAwMDY4ITNcdTAwMWTyoZmX5zlcdTAwMGXbxqnGulx1MDAwMLDQXHLy+KxcdTAwMWNgXHUwMDE2+ak8X57ZXHUwMDA23N6BY3/9S0rQM1x1MDAxNENdg/nPXHUwMDE4XHUwMDEytIkkTK/BQVx1MDAxM1x1MDAxMI2AZizvzVx1MDAxN1x1MDAxZmlcclx1MDAxYnlcZqeWXHUwMDFhYLlcdTAwMWV1XHUwMDAzTtp+nPb78Vx1MDAxYc5IvpzhfPkgaXnBeX/3eYBSiUpQdYjaaXzP9SplXHUwMDEz2nNZLZRYVXgtllLLUfC+YTpcdTAwMDS0dlxmgJDMqNWEX23ajFlxu8udXHUwMDE16ztcdTAwMTJcdTAwMWYrS1NUNS1cdTAwMWWFQYhsXHUwMDBiLqT386PN18qt05SiXG7zdEY8sDveXHUwMDFh7PdEZdvuolx1MDAwMU3Qy4x9lDfkR75cdTAwMTm+WFx1MDAxZpzNhPuZSlx1MDAxNE94XHUwMDFlu3HTtpfeTrNcdTAwMDFpr0/j71x1MDAxOclrX4RyKMxcIo/p3k2vglFPNo7XpSum70jI40iqeUmPYIKmXUP3zWtcYqeDXHUwMDE5XHUwMDEzOMSB5CQ3XHTTcPde/Vx1MDAxNd+x0a5cdTAwMTJcdTAwMTJrnVx1MDAxNUlcdTAwMTNzk7rQvWYpKsyTsFx1MDAxMTbE7IiWJTSKJ36J8U39XHUwMDAwhvEuwCqa1Vx1MDAxYZnR8KGEXHUwMDExXHUwMDBmhu9cdTAwMTZXvoaiabA65lx1MDAxZej0NOH7XHUwMDEzsZl+rbcv9O2FPFI+kWjWp5d4oJvnqaZyVs3EIVx1MDAxY5RS3KzGY6n0Z9dcdTAwMGVmv1VcdTAwMTZcdTAwMWE2Rbl5Y1x1MDAxYYo+m/7aRLqRczbzPL76clFcdTAwMGLBn5o9nHmNx0iIx3BcXN1pP1xc9TqiJfkyUHD2Nlx1MDAwZVx1MDAxYtMulzxcdTAwMDRBoOy6RVx1MDAwMXNcdTAwMTRcdLxJZXBcdTAwMGXwVifJrVx1MDAxNS32XG45lVx1MDAwMMNs5lxcVpJcdTAwMDBuMa8lnjddXHUwMDFkknE+31x1MDAwN/GtXHUwMDFm43QyQ9gmfGTFnH9AueZ96VN0nz5cdTAwMGL0XHUwMDFl5deNZ1x1MDAxOKZmhF5wQnfWIKdcdTAwMDI/LFx1MDAxZFx1MDAwN1cs42BcdTAwMWXeVISfSoDcacx8XHUwMDAyvlct653gOznXgLh2Vp3x4V5bP2BYaTq5Jbi16X004a1cclx1MDAwMaW6k+VcdTAwMDR4IXg+nOOXmynhL41MLYvpiiRJqjKGrKely1x1MDAxNVx1MDAwMCPJc8Q3XHUwMDExQG+TXHUwMDE2I3rc3YCB3nJcdTAwMGb9jSV9e41GPE3/+5nSz1+hXG48XHUwMDE4WZb/Lrdnl00sY/FcbsDB6rhPozjDcP/mWIrvyMlo4mWyZFx1MDAwNDeoZiAw/kOY5N7gSORfVvEry2P9OklPoJfoo0G8WMye1Ijd2FCD4C2xl5XRepnUa0lv3WTwSWTqYH7moyZcZlx1MDAxM+T3sja/c52TPFx1MDAxZlxmXHUwMDBih/2dUy46ku2Rt4qez+q6RrqUhWWZJqKbwzfij4lqO6eRxksweVx1MDAwN0ksWWhcdTAwMGJcdTAwMTT6jlx1MDAxZXdUXHUwMDEx3dZxNrm6XHUwMDAyXHUwMDBmwVfDsFx1MDAxZnaW/nfkXHUwMDE0LFx1MDAwZVxcgD9nMak97lx1MDAxYbNsbzvjRFxcKvw0qcPPq+yAmLNKiyeKR77ncWxzVdlwXHUwMDFmXGJ540QwoTXyx300cm3ZadQ/o78xzpSR9FdcdTAwMTGMlbtdlDRrvLdvTdat4XOqyniAobyzrjbjwa72Vyc+Xq5cdTAwMDJt4ire3stfvVx0eEMqxedsXHUwMDEylXU8VlxmbpaPbn6qqmXmv3Cqqa28fzRcdTAwMGKDne5cdTAwMWFC8/tq2UquXHUwMDA0c/HOmp2O4OfEhc5pXHUwMDA1LEueq+iQZFo7topFTqbFuMoqtKPHsoolTEqJs5x+pYegXHUwMDFjgv2Z+27Aard5XHUwMDFkynFt3lD30GuDOFx1MDAwMfRcdTAwMDfIUtiSIDBgXHUwMDA367dGXHUwMDFmjcGX14jT++VvXHUwMDFlJVxyL12oXHUwMDA37lx1MDAxOVAmwfGXyXRgXHUwMDEzn+XBsPGgsqyIT9B7XHUwMDFliWO+XHUwMDA2TbH7fa33x5ZcdTAwMTUgwqBcdTAwMGa2tJvpjqSaflGGX91Nr795XHUwMDFj8Srmp1xub6Z1SaLnWe84XHUwMDAxYXFcdTAwMTMojd/99rEtq0pV/K9IXHUwMDA0Kftl87lPNkFcdTAwMTi6iFxi7pdcIlx1MDAxYpbbXzBccvPENl1cdTAwMTSs0ojMeqHupt7CrLNvTUQjQ1v9+PFcdTAwMGZGysHossl8at2bklxu6t+QbsxdMu2bzSg+t5lFXGbuQeTx5H6YldfjycLykzdB32y+sC+fwywhbkWgLmvCtb1cdTAwMTnsZ02JiEcn66flXHUwMDE2OEVcYvmOwyBWXG4h/tWaM31cdTAwMTTWge7s9W0kbFx0J3Nd/f1cdTAwMGWL41x1MDAxMT2WXFxcdTAwMDaLXHUwMDFmK9h/XtJDcq9IkyOmyNBcIoB9OdK4T1Ob7DsnJTmYXHUwMDA2cfKptdtFJ/Sy7ItcdTAwMWRnuiCP4uB/n5RC+Fx1MDAwMn1cYsxp76L5XHUwMDE4PpgqXHUwMDFmc1x1MDAwMPk57VnEI1x1MDAxNkgnXHUwMDAzxiGEMUFUvEgu3SHParyPUUdvqCScXzxxPzdcdTAwMWP31dXKX0feXGZBzK9v2rZpojZcYu6e/9qULMfFXHTeXHUwMDE5jS2vdKyHhvOL45yQwPzsjFTzQzNcdTAwMDGhYOE70ZZw/lx1MDAxZW9cdTAwMTDLLTdy1dKVnKI7yKPCT0KcXHRcblx1MDAxNoyqo7WnXHUwMDE55L4xh5T0qF9cdTAwMWLdmk388FJcdTAwMTNcdTAwMTNjvSmi70xLTF7V686iplxm3SNcdTAwMTQ+IE+1WVx1MDAxM9tcdTAwMWU/nEG3qEJ5svDWPeulqX8oqb35IdaKvVx1MDAxYbBRPFx1MDAxN6VcdTAwMDBcdTAwMDcvlf27btvu0lRcdTAwMWH7aGlOJVwiXGLCy1x1MDAwMuJcYmKC9lxiXHUwMDE1tFVgQoZrT1x1MDAxM13KOlv2xFdidi3bP+pkq2xNVJLksG+WdXKqIXcjnEFAX1x1MDAxNlx1MDAxMtzBYYKezz6nPlutYFx1MDAwNVxmXHUwMDBlzs9f8sNZYvxiXHUwMDFm8lx1MDAwYmtcdTAwMGK6KcsnqsUnLFM/3WK/9ln8rkLzLuOcffBRXHUwMDA2obRZcL5tj1x1MDAwMfPY4/hC6OVFWrZcdTAwMDVK3y3dZ4k8Kua2iLDpZ9bINqfrg1x1MDAxYlrRmcWoXG7HXHTYXHUwMDBm5XqzKFx1MDAxNOP49fCzpP40OMzin5i9hF5yaPStXHUwMDBifiy50Fx1MDAxNFxiXHUwMDAycFx0/km7mInENFxceFx1MDAxZDWdqFxyfC1oRWWQ8KTvRaUmnpD9mH5J0CnOwMdcdTAwMWUxLKLM7VllXHUwMDBmXHRcIsV6T3hQXFxzgzveadzIJpg9NIhSXHUwMDE2dZP6jtG+XHUwMDFkI5Xk2fOeuldcdTAwMWGBXHUwMDAwXHUwMDFjj/Dny9XTUkmj/fXPbkdnhEsqno9SXHUwMDFkIadE1zKA1HV9lbZ3XHUwMDFj9O/BSTN1VW9tXHUwMDFj9+fiUNs0WnuCkbb41aTbUmFcdTAwMWVYpVx1MDAxM19rupHeefhNIY453T8tRPpmVLwhx5GM17d/dSufV+XGqb3/eGgqLYVdLTruXHUwMDAxXGbY41xm/pKk3aTw2yWuUSM5h5pLnP1cdTAwMWTe3rj0XHUwMDE3clx1MDAxMMJcdFx1MDAxN/KRkN3gpXUtJWLtIatcdTAwMGVcdTAwMTXBaFOX/nTAt+xHO2tHoVx1MDAxZUEhabpcdTAwMTha+uBcdTAwMWLfg3NcdTAwMDPdb1x1MDAxOTa9KfpnpNC2zKVrxVx1MDAxOeFHs3dFM0C2UWJcdTAwMTJT5/mYRPBgT/ndPDNKk5D0XHUwMDFkeJuqsZ2xXHRqXHUwMDEy+u+mu/WkUfJBcFx1MDAwNCjKRDZcYptIsVxuW0hcdTAwMWNcdTAwMTai+IjvXHUwMDFjTVx1MDAxOerApL+DvfBHglxuPnPSX1x1MDAwM9tNXHJNkilgXGLzsYeGTryvadaNya84a8VcXERbzKJ8Ke7NoY6j8qVjj1x1MDAxY+f49DJcdTAwMTag8maGdkn0JnmzXG7rgsvF6jA2XHTjXHUwMDEyzH006ufDpVx1MDAxOPrdozRPoSPVLPZlgVg5wvmpMVJy9c6IdCX8JOnmmFxirnQ8vPLbLqrV7E20YqZcdTAwMTdgXGZoR75cdTAwMTXYylkuoUmPXHUwMDFkKnHz8pavjyYx2PhL5Oc8XiFcYlx1MDAwNj+MvtOPloeMXHUwMDA1XGZcYvShwFxyhq9cdTAwMThrXHUwMDBmc2o+XHUwMDFm/Li2XHUwMDE5XHUwMDE55u9cdTAwMDM1ssGMOVKujmO7zo4rXHUwMDEzSrU1OI5/rZekbfHuPfVccpQ2bi3/5vF3bF4uKbn60HKQXHUwMDEwwitAXHUwMDEzsvne8Vxyom9A9Fx1MDAwMlxu5luJxip1qLdtg1x1MDAxNFx1MDAwNbt7XCKFm1tFSW3xxoy9ddJeIOckPFxmXHUwMDFiXHUwMDA0/j2OwzBfSpe+KaV5iauGcPlcdTAwMDGdo1aPM2lNoP18fMY1XGZ35KhqXHUwMDA0g5RkvlxcXCKrXFwmS2xGSozqxGx92lwi9KpSvMzzzK1vQoVcdTAwMWWUvGvBubOwanf3XHJ0o6qrRy8sfXE+PGWhR/RBglf9XHUwMDE4RWfBgUbu563DT0XYnub7h/wwjFPVv9+x1+E8lJpGLfrjXHUwMDFivq5pXHUwMDE5xVx0dS3wQ/tEdLbGJFXCMFx1MDAxYc/0lZtLS790bPAgdqTBXHUwMDE5XHUwMDE4hPB5vMp+gi8u0+rPyYRJ/Fx1MDAxNtqwI07AXnF7oeekwohh854mz+jSeG5ZWytcdTAwMWNPgVxyJq5kjFx1MDAwNClcYp3COSNcdTAwMTExNO91XHUwMDE1XT8lapJ39nUyMPzZjpn5L72phbaMoTkt3rjr8tVaRelcdTAwMTAujImTtWd9cHZE+6OGsKo7UldubisnY1x1MDAxYZ8wrPIxPrGL9mhaVoTwpFx1MDAwNDCd4I9cdFx1MDAwZZ3bXHUwMDA2er5rXHUwMDA172Gd75HsXHUwMDE52Fx1MDAxY7p9Q2t3RWjCdsPIWLq62lx1MDAwMKc9///z7MRNoTCM42nwwXtXXHJcbll107k1aavMsDpb2yv3LaG6I++uayXUXFywo9b1YIHA6t0o1M1wNO1zuVx1MDAxYW5T6KKhbqyWXHUwMDAzcolfY1x1MDAwMEGqrI6mgczyq1JB5ENcdTAwMTU5psZcdTAwMTM99qT86IrJW+4lmy/PLpjY3fJKiFTGKGz0mt7U7S/7Ie6ivZJksTfV9Vx1MDAwNJvqX1xy4LJohFx1MDAxOb+SXHUwMDE4gPhiWXNcYjJCtk9B9rVpjL1MTdqN5lx1MDAxZD5cdTAwMDTPXHUwMDE5XHUwMDBl9pT8MP5nZb+SSskqt7L1TfeYbdssXHUwMDAzq27ov4E/5aFPnFx1MDAwZbZcdTAwMWSeNNVidVxcVbafrlxils3Lsutb/bDhcNNZb8tlIW756Fx0XG70XHUwMDExXHUwMDE1vVx1MDAxNsjV0ZqPkyczXHUwMDE4XHUwMDE1XHUwMDEzXHUwMDFjXHJlN6789Fx1MDAwYllcdTAwMWNccnmnb1x1MDAxZXFcdTAwMWVcdTAwMWRl/S1cdTAwMTiG5c3WLTO2OHHDWdnZIfbIfvqUIMNtKFb9XFzwiEJx7Tcg7K5KuuqSUVxiJ6uc0OFcdOaoXGJcdTAwMWQ5XHUwMDFh8M3bdXLVcdE2zkqLXHUwMDBl3NqfgFhHzEhPLspkokh+lXdcdTAwMDKormssQmk3Ut9cdTAwMWVcYrkvRkqVNZtAnOeuUDRmRrOLdFx1MDAxNIv7TIg1XHUwMDE4s9c4XHUwMDFkpVHYXHUwMDA0Yt/e6lx1MDAxYy/hvrDZ1CzHy4JETXWz3pkxjG/Stlx1MDAxNiG9XHUwMDFjJipcbs7jLaGryV/Hm2hcdTAwMDTe51xuqo297DtAcyOcbWaYXHUwMDA3X3WpzTTtxb9rYbfPr4M6XHUwMDBiXHUwMDFm02awIPM6JnWIxVx1MDAxZFx1MDAxN0e7TTjIum9cdTAwMTQ4XHUwMDEwNrpcdTAwMWJcdTAwMWJ440q825u+TKf0XHUwMDFkLfTc7Fx1MDAxZphHoCckd76XOlx1MDAxNaBk0j/Z3Y5ap1LO97fyZaCEwPjYtExcZu/UXHUwMDE2R0bgjbQ+VXNh5Fx1MDAwN4bN9FcqoJknXHUwMDAwT1eJUJ9FmrtwJVx1MDAxOFx1MDAxOe9yKj6RWbv3xbSuoiTpL2tiXHUwMDAzwyo2S/Tv01Dz+ZBWzVx1MDAwM6raOdqgYaSdr1x1MDAxNcspV3B/q4pcdTAwMDbBNdwsVISRPOtWJ7tcdTAwMWLehUxcXFx1MDAwNlx1MDAwMlwipm3H4lx1MDAxMVbLXHUwMDE36ajiKHrEXHUwMDAzXZ6xMafLwdy4tyHrx5K/yCFQXHUwMDAwXHUwMDFl4OhcdTAwMTeie4GfXHUwMDAxmHz5XGK0lZfRkE79eqA1l5x6ZVx1MDAwMnCuXHUwMDFhsf2dl2X4d6xDytc+P8f9LapMPH5cdTAwMWSlXHJlXHI5mlx1MDAwN6CS1FIo4WQ+dHiAXHUwMDFmmpU2hPp+nfTTz4b57lCSpLLzzOtHXHUwMDFm6CmLzWDpSyjKxpV00K/IOHdSv/HtXHJcdTAwMGJV/EHpl56TvWo9a1CeaCTSl2f+jiPHR3WCLLLm60W1iFxuRL5cdTAwMDSt7txcdTAwMDJinp5szuRakb99vU8xUPZDy5P5eax+lExcbkmsSGj6Klx1MDAxZatcdTAwMDD4M1x1MDAwMJWi77crezonlOVxildcdTAwMDHW6eXT7Vx1MDAxNvxOZF7NLNo8XHUwMDAyutkgy1x1MDAwZs9cdTAwMTisi3tb9nlzqK0zx1x1MDAxYoye1b3HUuv/Pl7lXHUwMDEzKdK4Ne9ayD+eXHUwMDFijCUy+I+caVx1MDAwYljymyBLaPdccq5cdTAwMWFvUstWfXtcdTAwMTZ0Zlggw1x1MDAxYVx1MDAxMt7RfmU2bNmdyyryQ2ZcZuc9iupcdTAwMWKmx3++YcVWd59GXHUwMDA0j83LzPIrZc/Cd91cdTAwMGL5XHUwMDEzjCrhN1PCsm+XXHUwMDE241raQF7vXHUwMDAycvdTcrXks1x1MDAxYndcdTAwMTO8NjBcYnsjNrnQx3aM+fHwPHpcdTAwMWSl7WNgwV6JYETeRdQtZcnUXHUwMDA2RZ44f2K1O+FcdTAwMDbinFx1MDAwNfV8IeRcZm5MJVx1MDAwNXqzK6I5N9NhfEhcdTAwMGVZ7ouPoPljXHUwMDAxXHKqMp8ze9azz++fJ/t7z4LvTK5EhHWdMFO80rpxNlx1MDAwNH/9XHUwMDFlzlx1MDAwNsi58Y6Snlx1MDAxOfxh7MNW+Vx1MDAxZcOjMamhIE3r7K1aXHUwMDBmQVx1MDAxZHNcdTAwMGag0CFyqLBEflxyZp6vqD488/Ipz25cdTAwMTJcZpvekZzwkUc2XHUwMDE2XGZ41390pcGx94MkXGJUXtdP4Vx1MDAxOZOySjhcdTAwMDclXHUwMDA1yVxyarPfTNQ9RVx1MDAwZVx1MDAxNChVl1xc15Tw231ccu7LVmW5XHUwMDA0sz/u6CaYVpxkpSDDXHUwMDA3ZMk9l0lW8YL5wanr8uezXGKfi9LoXHUwMDAxTa/pZmJcdTAwMTGPvSqLM1xmJcnjsJdcdTAwMDdFfyuVt5n9U+ZcYlxibTR/PVx1MDAwMCrxWUZPWzdcdTAwMDOfXGIkQVx1MDAxZbTViIhxefLdhHz/zYeSXHUwMDFjK6xSXHUwMDFjqN9b35pWXHUwMDBlwllR5bcox5EmyiMkIHnGNZ4hLsJuorL3nbFJofdEkVTQb1x1MDAxZefW+cTekn3XKXEvxLl+WO5a8vikQfWQnetcdTAwMDe4xVx1MDAxY9ZIQetU7+34eFx1MDAxYXc9XHUwMDA3Sy1cIlx1MDAxOOVKyTpcdTAwMDNOXGKKQFx1MDAwNfdcdTAwMWSFrz4hcPOimVx1MDAwMuDtm/mjyDw7plx1MDAwZazOfFx1MDAxZNJiXHUwMDE5U0dcIs+LLYXWiFJgXHUwMDE5nS3mPtk7bO9jZOqMXHUwMDBlyJcwtcdFTk5Y79tn0lc5vOLTXHUwMDBm35ViNYGbPlxiu85cdTAwMDDqVCNrX4Bwj5tbuzPs/Uy5jGVVppVyMdnTYfCuUFSnij39XHUwMDA2XHUwMDA18keBpEsp2qhcbmo2aUFcdTAwMGXpvkIwzNn3WuBcdTAwMDP5p6P7kNPZnM9cdTAwMWZx8FxiUmrrkEo/WNqZj1wi/ztPh35cdTAwMTJ2QD8+XmBrnM/BekRR5ntcdTAwMTnuXHUwMDA0JT5+eMlcdTAwMTmUPbNhXHUwMDE5XHUwMDEwXHUwMDE1nFHm5yDnmaBv71fYnr3vqiu1clx1MDAxYstcdTAwMDFcdTAwMWJcdTAwMDd7bP8+a0O5fPX5MHa07EFcXOVcdTAwMTWQfUluc0I93GbboIZcdTAwMTaf6YMm+sczP8s+JLBkbbqU5Kr+5m/y04Nljfpiw5FcdTAwMTDY5T1cdTAwMDXS2ev/0v2V979L4860tjo/8ZU10lx1MDAxZJXtXHUwMDEwMjmNkqAm+pLU29c2JZ02TlwiXHUwMDE3ZfN7n+pw2pzNcN7zM69DXHUwMDFlSyDTfFx1MDAwYpFcdTAwMWJBXa5zR2ikOFx1MDAxZP/y+oayicjKbVXSXHUwMDFjXHUwMDEwd2vzXHUwMDFjQ2XXeVdXoI/Ee5WJR1x1MDAxM1V5kmNcdTAwMDGKXHUwMDA1+ilcblx1MDAwMUmg0Yxjq3m9Slx1MDAwZaqHR6/WuNJcdTAwMWS/OEmJYMesreNUTaZus1CjODu1XHUwMDAxzedYquTvY2D/7ptcdTAwMDWtXFxJ2WgofN4vXHUwMDBm7mreeo8o6lx1MDAxYiUyOPxoXHUwMDFjXHUwMDE3tNRJvZF0bj5cbvaq9FXYJFx1MDAxMcRyM7vl2MGie0lI7C712O1SPYjNdFxyXHUwMDA1+TH4XHUwMDFlhHrvtXs9tzWrPtG3636ko9pwXHUwMDEyXGasXHUwMDFham3CQn3aKMuf81x1MDAwMuhn5fmM8Fx1MDAxZtdUe/mBgYBcdTAwMDJcdTAwMTPzLcFcdTAwMGWbupe1LNC1Qc3qv9+olKo9k6FRVvqPU647jJfRXFyEc7U2LNts2rtcdTAwMGaGXFwmqDLJiZf9ZkFcdTAwMWRcdTAwMGaLnI5s70pBj26yhFx1MDAxY7D4evlVXHUwMDEzXHUwMDAxYcpcdTAwMTTa6Ub/3X1ym7SDkses8GM3m0J7qlx1MDAxMvQ15GX62bBcdTAwMThtr7qT9S6edFx1MDAwMeU50KI8q6thXGZcdTAwMDPz/HrhXHKxb2SDXHUwMDBlXHTTr5tcdTAwMWFcdTAwMTS9mVx1MDAxNfVV9bG0zrVg0fC10fGLR5jubVx0oixD3yeFKD3bIG6jLS/NXHUwMDAx9EdKw1u0bKdcdTAwMDC5ZZE6XHUwMDFlQfAlXGI4yIhcdTAwMGKeuuztp+Kk7Fx1MDAwYodWMUi3XHUwMDEw8c110SCvTVjYz6tccs8/6IckZEp6QsPJXGIqsVx1MDAxMGDj17m+2Y1cdTAwMGar3XLDWrZ6XFywXHUwMDFhXHUwMDA1XCJrdVx1MDAwZVx1MDAwN0pcXI1RmF18OCxcdTAwMTd3PiVcdTAwMTEwc8wypeXLpyZARcRrWoTvy0ggXHUwMDExt+rgOlxyaElmjed9xIsk86BcdTAwMWWtmyRJXCLnXrdcdTAwMWLhcFpvQuzUjFx1MDAwMWxcdTAwMTRYf5lcZkc3ilDh71x1MDAxN4eRjPyd61x0Mrw3bO97pJ7U36PUkFx1MDAxMjxGb/b6bl5ccmF+7XCG+c4jsK2E1jKDg1x0Tvd3XHUwMDFmalxmI2Hk/+oqmY8wP97ITLFgT1dcdTAwMGLuc432QfJKXHUwMDAy3jiLYSG3wO/Txakqhp1GoL9jJyZcdTAwMTmhtouozUrj2Nj9qL975MGyyImzXoZKn115XHUwMDBmQY2XkiVcdTAwMDaYKL1l05J/Xuj9evJ9qXQhlFUhnzpJZ+BEXHUwMDA2XHUwMDFhXHUwMDAyqlx1MDAwN4V8zvFcdTAwMTbmmZDC46jgXHSkXHUwMDFlXHUwMDEznZmOofDKXCK6M30/hp+MWVx1MDAxNLmRxMdiryhgYrefsshe3spApib+Zr+O8UL7XHUwMDAw/bxcdTAwMWaeikOSojqFOVwin3z4qZg7i2lcdTAwMWZnNVx1MDAwMH35fG2t5yz5q+whL/hsPHKTvchGeW9Yv1x1MDAwYoYmuCTPzupRXGJcdTAwMTc/ZWP93EKNaZKa1ilcXFXoXHUwMDFhRP4/1t5jSUJl6dZ8IFx1MDAwNmg1RGuVaGaIRGuZ8PRNndv/2fuatVlcdTAwMGLrQdak0sggcF/+LSA8uHlB2ucpWz35fEH6jup+5Fx1MDAwNlx1MDAxYSRcYlx1MDAwNL3luc88PuyB7zr1qtT8lvp3uFg2TPD5+bt5+IqBXHUwMDEx/+d5y1rhTUao6Ts5PZ5QqUYs9j2mc5pQVfSxoJA/XHUwMDBmXlx0OZNcdTAwMTZUZ2CM093V/Fx1MDAwYnXKyMJcXFqEXHR5XHUwMDFjzlxufGX51UT5XHUwMDE2XCKKMIjq506pVlx1MDAwZWOHXG5Tb7yUipxQXHUwMDEwn/dcdTAwMWWtx+duJe1cdTAwMTdcdTAwMWErWr+m5TdR5Y70lFeiRiZcdTAwMDJTy4RCZFd7v2bjNcuKjlx1MDAxZumwVk6KaahcdTAwMDdcdTAwMDV5W37aZElGLJ9cdTAwMTH2XHUwMDAx2HKISlx1MDAxM5JcdPj1iGOC0/Q+VITUXHUwMDE04VjMS0CCgFx1MDAwMDB8xOJRfm56/VxyoF11p6BaJH5z7NJzXHUwMDFjvFx1MDAwMmJynqtRzLMso+6gZlJO+7vdNbj0+XR++9bKVVe68NNrrj+LJVx1MDAwNyon17tnxkJcdTAwMWXtXHUwMDFmXVx1MDAxOVx1MDAxOIvhvr9GQPu4mNFSNpOBe/pKWL1Owkf2RKpssC6lJL3BNW3eXHUwMDA0l1X9pEJcdTAwMWbt4dFFe2GRqMhqLKh014Gabys4XHJcdTAwMGWLnU5DPHDBzcsgjo1eXHIyXHUwMDExcdjzXHUwMDE1i1x1MDAxZYtW4l9cdTAwMDCs5FOqXHUwMDA0bVxmXHUwMDE4YCrcJfJ2Lc0pVvXtXHJuJ0F2akX+q/FcdGWrXHUwMDE4Vs2fXHUwMDFmNSBbmFx1MDAxOcOajFPNj10nmJSArDLl79BcXITkXHUwMDA2yyGzK/CHPPl8PUtcdTAwMTmseY31uOqigEahXHUwMDAwoGlhWvGW8ux/XHUwMDE1x4+aZ8doSzomm8hPXHUwMDAxn5SrOMRxrlZy/Vx1MDAxNt+7bcRcdTAwMTSLJHGA1CrNm4iIn0s+IGRv2lx1MDAwM/zp3k9cdTAwMDVft1nEa4lcYkHcXHSOepXdU/31Nooz2Y7XMVwiy6jwjk2RZfRm/tazi1gnnPRcdTAwMDch1SZJeSBeXGLhNjqHyVx1MDAwN0MwM2GsqGZcdTAwMGXP5/TQirJcdTAwMDBcdTAwMDLDnkZcdTAwMWWEpT9cdTAwMTekOWwv7EJ5glxmVNuWe0JDiVQ//IXiP0Nte5DtkfW70l7kXHUwMDFlb+xVWpf7emalpHxcdTAwMTBcdTAwMTRcdTAwMDVheWnzrIJcdTAwMWVcXMGhLj6yOWYnJNiJ8OaMdVx1MDAwYuWu8PeM9Vx1MDAwMlx1MDAxNVWwZThcdTAwMTalovpWXHUwMDE5XHUwMDFhcVZcblx1MDAwZomV2XGRalx1MDAxOVpwoFx1MDAwZZ5f13znPE/daYlSNUjtOXH50TLrXHUwMDA1XHUwMDAzRlx1MDAwNCCe70lcdTAwMTW39ndr2OJoXHI+T+B7guBRvFFIqTikmLe3ICyVf8JrTFx1MDAwMMlcdTAwMTNZ729ccmFEXHUwMDFmXHUwMDAyMopcdTAwMDHyxfbs1Ub8TMOC0D9cdTAwMDSru5/sZfnm/H5cdTAwMGb9UVx1MDAxN3G/nEbsXHUwMDAzXHUwMDFl348v6Nimyl76sn1KNCjfmalcdTAwMWFcdTAwMDCH83tiXHUwMDE5jVuiuKfV1SEkXHUwMDA3+towal06S9GqOpsutMpcdTAwMTMstD1cbrBQXHUwMDA1TcXQUTjHtVx1MDAwN8vmKNT0K1bZSy7/lkFn6dexYKtwXHUwMDAwuFx1MDAxZvzned0jp3LhXHUwMDE4M1x1MDAxMUGL20vxPfojI8zJ3mm5T1x1MDAwMneRbTVaKFx1MDAxYYSPT17P48xP2VxiVlx1MDAwZWFW2SRU33jTQGE6Rc9BJeBcXD5h/335OopcdTAwMTeGiDBkXHUwMDA21Vx1MDAxZqd0/SXTlj+OqVx1MDAwMcZcdTAwMTVcdTAwMTWzoPHbnkmfvkSNdEVU6dFzI5wzp8cwXHUwMDFm2YpM6+KQZpHBmPAzvVx1MDAwZrDQL1x1MDAwNahr3t80dWHgxOHl7nM3MjBQu88yOJWOXHUwMDEwmLVcdTAwMWSyVNBZRsp9w7qUXHUwMDBlXHUwMDEzk7FoRI51IayGaEKX8/T0PpZcdTAwMWVDJ2DUcpS1L1mi0ePAbXW2vL92XHUwMDFmXHQ500RcdTAwMWFGglx1MDAwMozP2TdcdKtj/Yaw3U+HvrUgz0IphvLm1MkyXHUwMDA1yoS2X1x1MDAxZlaRL1x0q5dYS0FyQbhcdTAwMTeTtozh4qdw7TRcdTAwMTVcdTAwMDBNn1x1MDAwZr49YVx1MDAxOe/MaIsm8sf99WX+P9/5dFx1MDAxMfuzXHUwMDEwpXrxbVx1MDAwNYLt49EgOD5cdTAwMTRcdTAwMTXTYC2m87FcdTAwMTVOvNY/nE0jMH/YWOc1cvTpl9uEg/3+6blP6SE9pjRPqzcrhVx1MDAwNUNhnZyzoVx1MDAwZcBcZsZcdTAwMWRcdTAwMDadgSawXHUwMDE29mxxjL6/Zs/Vh1x1MDAxYdTLZG2Tkfn214tcdTAwMWXQ1/vZQkNuJUh6XHUwMDBi6OZ+tb5cdTAwMDMsn3ZTN1x1MDAxMZ9/J+K4v1x1MDAxNaD5q3HCQnZ81pXGXHUwMDBmcj0tO9hSXGJYd42GsEyR1peKnU5cdTAwMTg14vddUKRcdTAwMWHUN8PAbpTvU9HBdnN/WaZcdTAwMDdZXHUwMDA2Mlx1MDAxMoPnvM87iDkqNVHQ9Fx1MDAwZqNcXILvVu1cdTAwMTfX+1hcdTAwMTHWUUmQQlx1MDAwNf6eLZUlzOdcdTAwMTKcxO7OX7uta0L0lpRadZegdfoocM6prpC75j1cbrdCPHZgU4LdO2nQXHUwMDBlXHUwMDA1b7+5fVx1MDAxZNvr0tpcdTAwMTAnrefTIUk9v4W9O8Lx96HNqVx1MDAwMkgzw6U4muzwXHUwMDE3XGYySThw8CymZcNvZFx1MDAwMPxG7E5CXHUwMDBlQKHj6fpNdO9Z+LZjMmH6ITWApI7B2lx1MDAxMarAWLp8mJNcdTAwMWNcdTAwMDZcdTAwMDTgXHUwMDFlvaWFqFhGnsk0dsGEflh89Tpmo8+r8nNcdTAwMGIzL8FzbGOnPMWTlodcdTAwMTlMmFx1MDAxMVAqgzzCYSr09qtaJMVu1GBcdTAwMTQ2dFx1MDAwMlx1MDAxZDRoJlx1MDAxZF/P2Mk6XHUwMDA1cJXc3mLuuGI4dVx1MDAxOPN4bVuzolx1MDAxYvT1XHUwMDE2cJVfzqNcIkQnwc5/XfuCkilgv8J0gFx1MDAxMW32spRcdTAwMWJFUVwig1x1MDAxZVvRaOxsXHUwMDFjV5GfLsjiwnK3XHUwMDFkXHIys2HwNrDQlvf9VUrTb/E5/fRH7d3772RrkpXJJOxFI9L+krJWPNgwXHUwMDFjRFx1MDAwZbgkTFx0X1uTPahl3J+uTYBz1CXk1WBcdTAwMWXUuUDljNpYSSDDRFx1MDAxOCs2XHUwMDAwbK94+1x1MDAwYs1SiCfOdtLUaL/CXGJNs5tOqCaFmiZcclx1MDAxOFx1MDAxM4ZcdTAwMTHaSowuQ5bSc/pcdTAwMWM0P6VcYlxuJlx1MDAxZO30/mLSVNjT7lx1MDAxOFYrKlx1MDAwNtdStlx1MDAxNEFcdTAwMDVG/1x1MDAwNmfsXHJcdTAwMTZcIjXCXq4sXHUwMDAyw2pcZknL3dv5XHRcdTAwMDBcdTAwMDBcdTAwMDBPsmRDXHLU1Y9faZdUd9Kf4Fx1MDAxY2jls4zn51x1MDAwMOpcdTAwMDb4XHUwMDFmc1x1MDAxNKbUxOmWoOeBN96aL/LdXHUwMDE4gCeWhviJtZOwXHUwMDFjlFJcbpfafqSxr9mhpMr4XGKZPMrifFYzj1x1MDAxMFx1MDAwZlK7f7df2srztfCauydcdTAwMDGyXHUwMDBlZOdccnZcdTAwMWY9XHUwMDFkrJ/Ei+ym5buEwVJ4+ZxcdTAwMTNcdTAwMWKjKFZ5XHUwMDEze+NcdTAwMGbRflr6kX3rWv6Wolx0W29cckFD2TWjyv788zEv8JjeXHUwMDE4UZLQ/t5cdTAwMTmgidMmzFX3b1iecdy/MmDQgvTLeSHgyVtcdTAwMWX4XHUwMDFlN0V/K5tWKPr5XHUwMDAxXHUwMDEy5LZZXHUwMDAzLDiTv//ce/k1XHUwMDA1dHo01XVcdTAwMTYmNjFWsTarqFCU1czmmEj/hH1gl+NYunS1RcqrVeRjfOeLXHUwMDAzj3mxUThcYljTxjkoXHUwMDEzXHRf0NdcdTAwMTG9XHUwMDE1kt+znUxHdFx1MDAxY6TCSdMnXHUwMDBiXHUwMDAzuuzpqFx1MDAxZcIgq+i1t2km5nDo20K+z8w2RLOmXHUwMDAya18g86qUdVx1MDAxNK6ZXHUwMDFh/TYh5uhRM3xcZlxuXHUwMDA08UfvfSAoinn0JOO3KvugiD+v2/1cdTAwMDdcdTAwMDbRmNmgXHUwMDE1tHY6IHCjXHUwMDBi5ifGXHUwMDA2XHUwMDAwV4mN3UlPXHUwMDBiXHI2zUTEZiuNTanuclx1MDAxOZbwkc+ElEzetWG77Tm968VcdTAwMGWsuv5hgVNcdTAwMWTJXHUwMDEyXHUwMDAwkpqyXHUwMDBi38AyXHUwMDE45Fx1MDAwYr1rQfpBYtzEqpDRfsTTgq9R53q1XHUwMDEwXHUwMDEzT1Ko8KV8XHUwMDE3XHUwMDA3RLe7o0RR/TtccuyeLoKxq6+HqW1gO9urbKBfXHUwMDEzamFcdTAwMTCrjftx+UxPdN3CrYtcdTAwMTaZRUwnu8ZcZoqbvsynXHUwMDBiasqaub+XdLhcdTAwMDF2tshcdTAwMDU81ywwZidLld/1MOKSad6Q7KtwXGbQdYrhXHUwMDAxRGGN8d+txeDyqW9mXHUwMDBl5FjSt6tcdTAwMTlcXGwkx7pSXHUwMDE3/N1xkopxTDRcdTAwMWVcdTAwMDU0ovW3vd8zQ1x1MDAwNqFeXHUwMDEzqVx0gERccpHWdDswXHUwMDA34jxuXHUwMDA0R1x1MDAxN3Bh1IrTUzQ8m+hcZrxcdTAwMTlVyLqY22tXsY1cdTAwMWV7K/pWI1x1MDAxYtHQt1x1MDAxY33/3lEj4tqUPSFb/eL3sD9VXHI0MGZcZimNXCJcdTAwMTg3V0iaZ6rome2kaDL6WnTmKPxcdGpK1JfauVx1MDAxMMtbxXfzVYpmrb8kfilcdTAwMDKzXHRH6+t0gfU5uEQyXHUwMDAxNqDLfSSvi467+7Al7ooqbv+m36mgwsLIyoeG+42h1lx1MDAxNFeqgKshRMoygEC5zVJx5ULPwpJ/XHUwMDFmm1p6p4jFXFyMvDSnJ+5atS2dv3jq2Pp22IqfXHUwMDA1S+BcdTAwMDJcdTAwMDajq2mULdNGZ1x1MDAxOKeawPZcdTAwMWKWXHUwMDAwzKuKa3pDpXHrpWlx9tezKrOrL4dDXHUwMDBiw1x1MDAxNHm9UlwitHNrw7+bbNFcdTAwMTA89FAuJlxcdJfc23eatqro9SjQXHUwMDEzyeVcdTAwMWZZxz5cdTAwMWNWtXzxNGSHY0NV6lx1MDAwNyf7jFx1MDAwNOl+N8xb/2lcdTAwMTh1x4Zj6eJcckr1j1x1MDAwNlx1MDAxMDN3h1x1MDAxY1x1MDAxY0Ncclx1MDAxN3GVUzfhPu9gtzopkVnUOUujz9RcdTAwMDRGXHUwMDAyOclcdTAwMTVWPdK0OW6yY5J94qBBnb/35fM9zbX284wgmL+V/YeBXHRcdTAwMGbQt1TqXG5cdTAwMDSQMudcdTAwMTdeXHUwMDBl3kSMWKwkL1x0V1x1MDAwM0kpV8T0aZLwLXamdNDY6J2wX8tcdTAwMDV99Z+uVE9/XHUwMDEyx0BMQmxTdFx1MDAxZHCESlC9Rcg6hydkUlx1MDAxZItcdTAwMTKiOPb3MZaJXbPKoug4pTxYJu9huWxQ5VGlXHUwMDFiaz6dg+U89P21i9tcZkOrI/wsXHUwMDE41UnltVx1MDAwM7RLjt1S3/ziXHUwMDBlXGaRgMTkh4SqJeG6dzpcdTAwMDTlXFyyWJehUE/XsEuvfjljJ5GUXHUwMDAw7X7t5a6kqtX1P9VM59WUJCyuXHUwMDAwTFx1MDAxYeX1i3d/u7O9Z6Z0/DAzXGLwXHUwMDEwsCbUQFBcdTAwMTm/dCxcdTAwMDA/LXmqaduH0O7EXHUwMDE4J0KPXHLh6O+a8HbkUKtrUm5SX1wiXHUwMDE3Nlx1MDAwN7rqQvx0XHUwMDE1v8HllU5se27GvFx1MDAwMancXHUwMDBmub/nOr0tXHUwMDFk0d6PtSeU/DMyPuCUXHUwMDBiXHUwMDFlO1x1MDAwZnS2LjDpUEhcdTAwMWS7TahcdTAwMDRLkFx1MDAxYXI8wzjf44rYOttbJ3ZXteRnSC9G3FwilZHed0pcdTAwMWVcdTAwMTV+odFiLVx1MDAwNjc3Olx1MDAxY1x1MDAxZlx1MDAxYjox6Fxy8GZCXHUwMDFlXGLaWXzXfHy54J144bizjmFYf3nngVxyXHUwMDE4f/6mvi2kSlPGgayBXHUwMDAzp5nn56Wes1Y+PrNcdTAwMWW/r/hJlir2O9b5LGdfXHUwMDE58LgprPi0u1x1MDAwM1x1MDAwNJrL0F+XXHUwMDE3UrJcdTAwMWWoRIef13edmGRcdFx1MDAxOCi+XCJccmTUkWTTidFWyXQwZapoXHSeKWpZQ9fBXFxcdTAwMDdcdTAwMDW/j997d64l7TxM4KQwXHUwMDAyM8lJXHUwMDE2ZToxQ2SBrXO05ySeSLlFIaC6nEE0+JeMbUtrympVLDJaRSt/yomfelNcZs79zqxCQue1r1xy8s9cdTAwMWH4llureVeL1lxiLl29rUpcdTAwMTbsWyn1XHUwMDE2n0e7sp7kwo5cdTAwMDfQMbA8wJdk3F1cbr9CXHUwMDE421x1MDAwNVThKlxy6CH3XHUwMDFjkkh7XHUwMDAxtV1cdTAwMWWzzlx1MDAwZviYRF8wmir2b/18hqGCrFx1MDAxN0xE+eSsUfdeXHUwMDBisHRTwORFylxiyXDSTVx1MDAxOSp42Fx1MDAxYfJYXHUwMDAxXHUwMDEy9pj54UjRpiFcdTAwMTVRPvr5WrLfVlx1MDAxZu+sv8Q4c9codrguXHUwMDE1p2DJ0PU6UU81kmhSgipGbVx1MDAxNUFLwteHXnTVO6syTuBcdTAwMTlOVWZ/M5DjQzaLxtO2jvdcdTAwMDJcdTAwMTlcdTAwMWHln+diXHUwMDEw4zy+jrvuN1x1MDAxYiwjUVx1MDAxMbJg8Gz1XHUwMDFlbSWCglnlbH1cdTAwMTKCXHUwMDAxIbpcdTAwMTPvkiF2XGaS6puTvr/H41x1MDAxM/PFTtc6OuY2XHUwMDA2O1x1MDAwNkv2S80s6K3pMVpQ7eiY9+BcdTAwMTcm/yiPYL0hx0NLUD+wyrdFYqie0mmQN7ZcdTAwMTAv/YTlZ3VlmX3KIVx1MDAxZFx1MDAxM476UfRHpcr5b+2Fd8WqjFx1MDAwNIlRPfxDoib2XHUwMDFkRpFlT4Q/1XhcdTAwMTVB+bqkJHRhorL+00gmYIeFsSSPXHUwMDAxNpmE14dsp1x1MDAwYlx1MDAwNVx1MDAwNd7PTZ2evqgzXHUwMDAxV8gwhmiQLZ/rXHUwMDE4IJTXiFbMqFx1MDAxYVx1MDAwYotT2/OJfVx1MDAxY85cdTAwMDDneUc7XHUwMDE04/yi6lx1MDAwZv9bQ4KBh+1K38C+9dor3GuXfNu+mpYgXHUwMDA0TFx1MDAxMkZ5XZaAWYKoePm7XHUwMDA2RiBcdKFhXHI/XHUwMDEwo4SrO6/f8PnyXHUwMDE3QuKiLFx1MDAxZvKCvlx1MDAxOaBcdHz2cXbZNONlTdCdwVx1MDAxMMJoVDzEx4wxzV/6mSfmkKn5s2PMjIw/PfPDXGLku3JvS8vMYs1Sf1x1MDAxN7b0goWrXHUwMDFmTa2lXHQyXHUwMDBm76E1Tlx1MDAwNapGeb5cdTAwMDP1t6bZhlx1MDAxMpWC/1r/hWWn2MJfXHUwMDAzRLdqVPYz3/xQI2HKkmtffpBegT2dwpOtXHUwMDFkybZj91x1MDAwYtM469FcdTAwMDA3XHUwMDA2b0aGR10rRWWrNnR0jHRHXFxJKl5Xb6Yx5MO+ON92p3jCI1x1MDAwNirBsIzG3m1KJv62ibvlQJ2hXGJcdTAwMGaiMlxih+WifFx1MDAxOJ7HXHUwMDAzYytTkltzylx1MDAwZlxmXHUwMDBifGRcdTAwMTAk0mtcIlx1MDAxNegr+thjaHZtilxuzN1EjSq1UsDbKlxuXHUwMDAzXHUwMDAw3OwyXGbMLn79dvcjftffQ1x0XHUwMDE4YJBvddZcdTAwMDZmXHUwMDEyqlx1MDAxOW2X4Vx1MDAxOI3r4VnIUy7CXHUwMDFlOb9+vtRcdTAwMGVOtDyl6XjfVN9Ao/xlNlx1MDAwZrFcdTAwMTTwNuSibnhcdTAwMDfz7XNcdTAwMDJQ6K9ZXCKvLnpP8PfA2ju/2Dhm/PLA/VxyXHUwMDAx+FFFT2Rjr11hzbTj8CWgkE1hXHUwMDFkxcTiXHLk5YfQ8+/jXHUwMDFhuMN8d4jDTo3wVo2MJHpDsynozThpS928laGdXHUwMDE3XHUwMDE55ozlo1x1MDAxNeyVL/yCYZBTrkNhXHUwMDEzgcDalsjRyunXrv665NuxXrSSMWldpqbmerlcdTAwMWVkXHUwMDA2z5BcdTAwMTNlLoE9SSxvxTX5Uez9ar6c2Vx1MDAwYvilalCJoyNcdTAwMDd/1fy5/Vxy741zaM3QXHUwMDBmWEb5qYajcnZHXHUwMDE185Dtzde7vfnmWJXSLHpcdFx1MDAwMkTAe8qOdb9JXHUwMDEyJlx1MDAwZVAmxk+oboojX+xWvluyzdto0EpiZ9E6XHUwMDFkofQjaVx1MDAwYoiY62xi472l8bQnVV9cdTAwMDMyXHUwMDEx7UOlXG5KYK18/1x0+VQ2kYnas6fdLmJx++z1p5BfsfnKRlx1MDAwMVizuspcdTAwMDPWSlx1MDAxMIX9+URcdTAwMGKBwfn1t2ZktHJ0okHiY2zmflx1MDAxY1x1MDAxOILKqHIjLp5XMiuCXHUwMDE49vVSI/h8aZCnwGaIXHUwMDEwtyPV3lvkMqqwWIY3NrS3QfnIXHUwMDBi+0DlvvuiWseyT3yY/HVcZo9S2PVWeVx1MDAxZjNcdTAwMDBcdTAwMDPMhOlcdTAwMWI24Zo+w0xwpo85XFxcdTAwMTDhfNCdUtalXHUwMDEwl1x1MDAxYS2cizwnXHUwMDBl+8XjXVx1MDAxMpBcdTAwMDBcdTAwMDGnNMPabGlVtZzsm6hPXHUwMDFjXHUwMDExgUs7dj7gXHUwMDE02rCWXHUwMDEzhYk2+ailNK6C1vhDT/zP4MCkpPlkaUmAyZVzxzSX7Lfo+VSpXHUwMDFh6U7wvTPeeUoy9ja09EpcdTAwMDZbXHUwMDA2PFP6L1x1MDAwZaVcZqrKquKRqzxe8JBGwDxHz3hwhk2SPsXzXHUwMDBmkXarXHUwMDEwadUzQpBg1Fx1MDAxZNR813SY7OZ7UkRcdTAwMWO3tkyCnp3KRWqGZLJd3zCiSVTbXHUwMDEzoJxcdTAwMDfVciRIyPekw0l8eaxcdTAwMWYxKEQ6tNTrmDFsKs6UO5A0SmCUyESBclxcgycp+yufYvJccn48YUiroZT1KSXPxWboz35G2baubFx1MDAxY8fqqH29mc9txlxmw7hKZtSUXHUwMDA3IFa4RmbwZblcdTAwMTlEXHUwMDFmjKLpuv7+NZ5cdTAwMDQ7kX/JuXrTXFxpXHUwMDA1mj75b+w1Klx1MDAxN+9Yt7NcdTAwMThildtVt783KFx1MDAxY1n4uWfp7JJcbpVP75+3aa1cdTAwMTdcdTAwMWZYL5iOt0lb66p+3th+buis7tc4a4boXGaT9r3aJKHGSlx1MDAxMjDi5bhK68OH4arMlnxZdEj8Iadoclt9oPFcIrhMe3q2qoWCjaST353mScXF4LdcdTAwMDFmoKQ2g12mubLDLNy4XHUwMDFkR/27rfT7ZYmAXHUwMDEzQlZcdTAwMTP9e5Q91Vx1MDAwN9mbyN2eJbTw/PL+XyfudPv20kf3tdv6fTkzhufsI1x1MDAxOUkgXHUwMDFhKkxhXCKxXHUwMDA2j/uSXHUwMDExhTBcdTAwMDW4YVx1MDAwN4ktMbPXXHUwMDAz1oLxz5g8uVx1MDAxM1x1MDAwNfiX16zGXHUwMDE1fiYqp1xiXHUwMDA1XHUwMDFhXHK2TVx1MDAxMe5llLaiwCGJQbpo+dH0z+F+v19JKVx0kfdat1x1MDAxOPo031xyev9cdTAwMDDHXHUwMDFkjZauTCC6xOJcdTAwMDSVUXNGhVx1MDAxMLdcdTAwMDKwk1JCJVa/hVJq8/u9tio9q0xsqVx1MDAwNuR9XHUwMDBlL1x1MDAwZTPOocn5b1x1MDAxYadqn6PzXHUwMDEydc7HyUaFU9Yz2ZVIr2JcdTAwMTdcdTAwMWbt3Fx1MDAxN1x1MDAwYl/nXG5cdTAwMTf3SdKlXHUwMDAxaj/XV1x1MDAxNMnIWv168lx1MDAxN1x1MDAwNtN636pAu2vab5Z3i+Iuo0Jmhlx1MDAwM+2t+3Jw7m54fkT5Wsu230FgoDN+XGJSQsXrvYYjmNowXHUwMDFkplAlNK/Czd2GOm+ifoM9XHUwMDFijcLUXb7kgHubXHUwMDFlQaxBaaFcdTAwMDXweKRF8707xuu+qqZII41cdTAwMTWhNM0w+lx1MDAxNXOHyo2hmDKuXHUwMDA1PN2+Wu/guVx1MDAxMFx1MDAwNlx1MDAxN0ClXVNcdTAwMTAvJeyWXHUwMDE28j1fOlx1MDAxMFx1MDAxM/cjkb9I1EC4XHUwMDE0gc9v26Wte1x1MDAwM1x1MDAwNMEplpxcdTAwMWFj/uXZ+Vx1MDAwN3JJQvdcdTAwMGX+WV+GgHBiXGJcXML3r9RcdTAwMWMvj2iTrfrGti9Lt4x9XHUwMDE32q5xuOBB27WKfkvCXHUwMDA3npJmjqWPXHUwMDAzWflcdTAwMDdccpy7SSbbXHUwMDA0I1x1MDAxNrbgVLhGXHUwMDE5LMvSu2b8XHUwMDE03dOGrVx1MDAxMV4hSjj2/pg9aMZpQJq8XHUwMDE0xs9cdFx1MDAxY+bSZi32aH66XHUwMDE3bPR/+sOBOC9cdTAwMTlpdPmuai3jYlx1MDAxZlx1MDAxZdNcdTAwMDUuW1x1MDAxZakuTkpxqYB3oa64zv2lqDhDhmdZmVxiIYJcdTAwMWGcoLnLN+tcdTAwMGJB2vzpXHUwMDFkLFx1MDAxNVBjrFx1MDAxNclcIuHvijlcdTAwMGVRzlwiWsRr9/mVbV/3L3r1aeVA1Eas7lx1MDAwMZB6MZZu+VVeUVx1MDAxNOKZk+KHfanajrfjm3bY8pHagftcdTAwMDFoOXzvkic0Tpto+uZcdTAwMGZcdTAwMWMxp9fujeTSMe1dXHRHhUtCdSmNT7N1/UOkXHUwMDAxIYgm0Upn+GuuWcwmO1x1MDAwM3em1lGLjpp0o7tcdI489j3CbEf07IuB3VxczcGUsZ5wfzE9QsS6wSRcdTAwMGW9vFx1MDAxON2S50F0XHUwMDA1rzag18ZcdTAwMGJPj4eqQLGSQZx8JXW4uS7bWEpWXHUwMDA3MfU/Lu5wnEKQUepCyd/2XHUwMDEzR8j9kpg4Z1xucpp3tlhcdTAwMGbX0G1cdTAwMDWXqbNcdTAwMDFQed1Zb81FQXar6mE93/msXHUwMDAwQ3gktuHTlflcdTAwMTbbmOOyhnL5xlx1MDAwZdq6r2ziaOFcdTAwMWYqL8vn2q+hdMSS5v76p1iYs7rjOZFD/e2HUJf63dSgWuG0l9XtWNYmJKCrJzHnjy7we2Psk51cdFx1MDAxNVxiYlx1MDAwZfXULopbn1xm+/3dxM3Wq0Wx01x1MDAxY46ZZk7tr4H93FUhKdUoUtdOY+F4kmSGXHUwMDE0aVwiz1x1MDAxOFx1MDAxMOxcdTAwMWX6XHUwMDAz/WSMPUNcdTAwMTdCPm7xtasmMIdcdTAwMDYu2ivlplx1MDAwMviEyFxc8XvA3CorvXiGUVwi4i9cdTAwMWbma4lGqFx1MDAxNVx1MDAwMU/Hbp+AXHUwMDAwY4rjXHUwMDE4XHUwMDA317H017d6tJ1cdTAwMTCnS+wuwlvgm9ZP6nVRXHUwMDA1y1x1MDAwMjT5Sn56XHUwMDA2TnO5JfzLwlxikq6/2NGOOlx1MDAxNC8pJmIhK3nMzss4et2+qpqq3lx1MDAxY7Jof03pKe5xTFx1MDAxZsS5s8dJo5tcborrqvpR+rvJxiRX8HOpj06skFZj6kXSmlx1MDAxZFx1MDAxMU83XGL2JMCJVoHEt8RcdTAwMGW14UcuYayRuJhcdTAwMTVGu1x1MDAwZi+90DKfxVmnmrYpNHVxR+JcdPZcdTAwMDWZ0Fx1MDAxM1x1MDAwYnedJnHucsnnXFzjj9BOr8FcdTAwMTCCeX7LueyFYVh+vrjl379cdTAwMDBcXJtpXHUwMDA3bps3XHUwMDE0i9fCL75KN8k7Vf5cdTAwMDY9XU/VSjV7achsY6tcdTAwMDLGXGJcdTAwMWOwXHJR/vq+wp/lWJh6iSeSRo8+qe89cayo3MZrgEKUrJWFKf5QP/uEXHUwMDEySPJailx1MDAxMFx1MDAxNaYw+1x1MDAxZpGAn/xcYlx1MDAxYixcdTAwMDBGSy32aFwia+1A+F8tetJwwzCMyvmq3UfdXHUwMDFly9IgMjdEXHUwMDFjOYpgXHUwMDE1f8rrRftcdTAwMDVKXHRou6GJr3LOf9WllJRtWGrTmDrXqfk09ITJo2I3R6ZXjScuXHUwMDE2XFyPqV7SLZmBvTTDaWhoXHUwMDBilUNcdTAwMTG87vX7oqnOJmwwjzdcdTAwMDZXzk/5uPPb5sFyondKqYJcdTAwMWbMWYbKR2ZG20vOw1SOdvLZtfXvuWdcZsX1z1x1MDAwN/JxXHUwMDFjlqHTtsBerjixXHUwMDAw92psXHUwMDAzc+PLXHUwMDEyjlx1MDAxYjySXHUwMDFjXHUwMDAzn/w8m/fU8l5cdTAwMWG4+3pcdTAwMDfsX2+1Km674sxTOZqdjfjgOlmSslLapVPqW1x1MDAxZkCJa2FKuj6QfkCFRcOC/Zu3rlx1MDAxNask+5l9WpOOXHUwMDFiS0ZQi52tQrdQXHUwMDBlXHUwMDEwYZBoXHUwMDAyz5thXHRTXG7mL+I/r7ODkUWK87v/nrBcdTAwMTjOXHUwMDExXHUwMDAyumJcdTAwMTn/sEFifVx1MDAwZTos39+rfFx1MDAxZjaKKUGY4T/+PVx1MDAxZELNTPdcdTAwMGJAndM/91x1MDAwMza3p08+smR8XHUwMDE1Vrn43Vx1MDAxMVx1MDAwN/pcdTAwMDVVdIpIXHUwMDE5XHUwMDFkXlx1MDAxMyWcnobTKKpy4CliXHUwMDA0nDqHtD5iX9KAzqvkx8h0Lcy3qzUu2vn9NKuYXHUwMDA3hV21X1x1MDAxZTFcdTAwMTQ5Kd+fhsPmmr9cdTAwMDbqxb05tMFcdTAwMGZcYv7ekMJUuFxyeVx1MDAwZdTV63S+XHLWXHUwMDEyfimXXHUwMDEw5Fx1MDAxN0+Q4oJzyFG9aO6NXHUwMDA3XHUwMDFhnq2GWqM4vJiuo6+xM/ljXHUwMDE2klx1MDAxMZmIXHUwMDEzIFxcjFNpXHUwMDBmQH9BcIpggs5fsz1Wz1x1MDAwNUhj4mHMXHUwMDExSZXvuMBcdTAwMDHvvlx1MDAwNr/Gmc2Rx1et8lx1MDAwZfXgkFwikLx7/Fx1MDAxMbtcdTAwMDX3fsFakKifopGFw9xqZ1x1MDAxZlx1MDAwYqc/5F//XG7YzMDSps4j96BvQ5VcbrZFeFx1MDAwMtXOYs5Lhui+337KPXWZTdX5LyVcdTAwMDev4ytZ6UL4a5I/pulEude27WYl+O/H9vlHhFh/gb3X+M85cLDXbETDZlx1MDAwNuyBYSrzXHUwMDFk07qwVzuX+7wgXHUwMDEzPFx1MDAwMepObW37PIydXHUwMDFhMZDrJ1x1MDAwYtXTid1O02pFJsvLPjhTxSZZWKKqOFx1MDAwNL5dXHUwMDE4atRUW9bX971KkFx1MDAwNbXUZoNKdiNAb8m9RS1cdTAwMTR+PzL64S4jyJtcdTAwMWHJR3SkXHUwMDFkLk9gNMokQSRcdTAwMGa/TceUz1pcdTAwMTIv5C3zXHUwMDEzSNevlDQnwoqvZlxcdmO2uUD6xEUmXHUwMDE4ZI0+olx1MDAwNJREfHL/62/We5E+UDr6XHUwMDFl8bLZXFyiYi5P8WvwXHUwMDA0nK1cZrFcctJjn1x1MDAxNOejbDNcdTAwMGapcpoz3/RX941LXHUwMDBmR1x1MDAxMlMmxtTLI1x1MDAwMNPAUZ8snEWjKzdcdTAwMWFiLl/IXsB8MeNHsGkluIajs9/1XHUwMDFliFx1MDAxM3qxL+7rQSRx2Fx1MDAxYo5cdTAwMDL/QDJqvD46IHq4z+m1VDxIXHUwMDBi11x1MDAwNHtt1sWTcWHdNb1291x1MDAwNT1egjXvPHjzXHUwMDAw5nHRqlwipagpdNzilFx1MDAwYmq7j76PsVdLu7rf5Ue7nyBcYlhWXHUwMDFhv6xxou3Pgm+uObT+XHUwMDFkXHUwMDAwjuzBSlx1MDAwM1x1MDAxMbslrjdKssHFo4Gt74TaZU5cdTAwMDNcdTAwMTbHhzqRt+hzWHJcdTAwMDHQ82DbQq9P9kOqXVx1MDAxZGbXN1x1MDAxZvNGmO27Xav7szSKcGNntVx1MDAxNpzZnvqH5bOd89WR9tV5/lx1MDAxZa5cdTAwMDTdelx1MDAwZfMj6jMnmv2tt2AxKlRcdTAwMWPYwL7zZ9sw0dPEnJ5xY1x1MDAxYeFwht/0VVxcnVx1MDAxNJ2nRVx1MDAwN9ZwXHUwMDE2XHUwMDFhJVx1MDAxMlxiZMDnWDhSXFxgd/qm0C+Sk1wis74zI6lvQrxcdTAwMGUheNWeiazhrVBsVEXhJIRNoMDK9pnq05lYa0D87bxcdTAwMDBjWy1aXHQrOo7rotzqooqrgoneXHUwMDEyXHUwMDA3MfB3ad2OwoVcdTAwMWXJXFztW3WY5nzsxPE47bOavFx1MDAxNuT0slx1MDAxN1x1MDAwYlrXXG5vUmXPwyNquHlFOmR2Rlx1MDAwNEjSs29cdTAwMTa7XHTfXHUwMDE3XHUwMDBii784lLKO0sTlcTHlLVx1MDAwNfeppN0oVFx1MDAxM8H/flx1MDAxYVx1MDAxNyaduHfCyrhCojaK4zRKovpHh22MundKfPWHK77AYFmqy1Svq1x1MDAxNa73z6h9U9ovXHUwMDFmpeJoXHUwMDE4XHUwMDFhozlcdTAwMTieZJBcdTAwMGZU77C/a2elT6bXilZcdTAwMDfUXHUwMDEyfNeRN5dcdTAwMDb+XHKS5DqT3pphS0ZhXGbhjDU/iIVeXHUwMDAwXHRQKn9knveAPVWcxFx1MDAwMnZcbkzEql5L6lx1MDAxNP50XHLxSlx1MDAxM1x1MDAxM3e592dOsG9+XHUwMDE2XHUwMDAwJ8j/c1x1MDAxYVqamFx1MDAwM5QwmVxiP7844LBw6d0zXGaDJaFysnY4rOgmtPtcdTAwMTbGpbps7oLRX8tp2mE+/leIvUGKS5hHs5FPVaq/oiZcdTAwMGLhSlOFXHUwMDExPUdYnqopUDRgX+TXXHUwMDBmyFxyv6ZSZlx1MDAxM1x1MDAwN1x1MDAxNFZXWiid3pv/eWdcdTAwMDJl6GRaXHUwMDE3JU7qcFxiPKTzlSFcbqROK6dcbiUjeuvHJ7WuXHUwMDA3r/56W+C20Z9pud9EkVx1MDAxZdWOXHUwMDBmUUyyLjcmrvpR+nRlOSZ2a42tI0ZRw1x1MDAwZk5rnmPQgjFHk3Khy1xum7X7QlZtj1dcdTAwMDEg2edcculr+WZSP2NcdTAwMWZd+kzTZMRo+Glcbtb1OzVBiZ5cdTAwMTFcdTAwMDSX62eQv1x1MDAxNuWTqnsr8M6UsJqN+3PyXHUwMDA1pvk77VxuXHUwMDE5XHUwMDFkm+edf/FcdTAwMWVcdTAwMGZ4m1KbTEU1ZITCuFx1MDAwNndcdTAwMTLhbSh55oDpnudtxsv+XHUwMDBmh7vQ1Vx1MDAxYcwhTlx1MDAxYtBQUbPBXHUwMDE1glx1MDAxNPyDubHLZS66v7pcdTAwMDLRa9qsKWL21Sa2Vc6vbZE1mGfAXHUwMDFiq1R5PjqKXHUwMDBmQc7LXHUwMDBlsGrDv6LlIZC2XHUwMDAx6Ndjvlx1MDAxOC+C9PNcdTAwMWJcIlp+gZ1cdTAwMTZcdTAwMDHnXHUwMDExwdL7Wb3u38+3XHLCVppcdTAwMTVcdTAwMTarNlx0XHUwMDBm+lNcdTAwMGVQXHUwMDAyjNC274NcdTAwMTLRvDTVMntWXYtV5JbOqu29XHUwMDAy7lx1MDAwMn8n+Vx1MDAxZT1cdTAwMTFcdTAwMDRuTb1cdTAwMTVjiyrK/utaQ72VOFeeaZcxT81oXHUwMDEwTI9kXHJ2hWnte1+CM1FcdTAwMWRcYmLsXCJiLn3EuFxiPdfdXHUwMDAxXHUwMDFk81x1MDAxYXC2p3WUkORxnHRabdYpL111+kJnW3WLIcd9XHUwMDEzga4p+Vx1MDAwZu1VXHJhIXvzVp2anULPS4di/LRDgiRnXHUwMDE1s/dcdTAwMTidXHUwMDFmg+R9zZtSvZabIVx1MDAxMEzAPntN80wzt5W1YGRkcj6MVXP4uFx1MDAxYtX1k/NcdTAwMTnOXHUwMDAyl9qmJUxKzdTpZc2AnV0+PeO+0kqUTFRNim/rJ1iYtSVh7cRMlvN6JHCAecZvY1x1MDAwMFx1MDAxMJSQmDpLnWlMbk/bXHUwMDAwSYAryjdLj1x1MDAxNihcdTAwMWbxuTPzq8lcdTAwMDcrjZF6mjNFiVBmYK5DeqaMcIialVx1MDAwMVx1MDAxZPs45UCqILGmXHUwMDE0lZoolp0teu5cdTAwMTE+k3jssFx1MDAwMl2JWShcdTAwMTBBtq+mJ5ey/lx1MDAxZXd4jZXCwVx1MDAxNkiAXee0XHUwMDA25ZDFOVx1MDAxN2xqOcines9cdTAwMDfje3BNVlNdg2T102D6XHUwMDE1JFx1MDAxOFx1MDAwYj1eXHUwMDFlXHUwMDE1nVx1MDAxNVx1MDAwN1x1MDAwMn5p0eJ1jFx0ZS5iXGZtXHUwMDE1Vd/f7lx1MDAxY1lTelWFUIllXHUwMDE2b65dkW6PXHUwMDE5t13hWEFS4r2kWXC4vZ9cdTAwMGK69dEwqlx0YvKm70xcdTAwMTCJRU+sgbZH63tK6YbckpJcdTAwMTGYWH7fylx1MDAxZZBrXHUwMDE0nFx1MDAwM+bssVx1MDAxNfLv8U5F2JBWSFuYslXAgCFjhMVqj3FcdTAwMDed+1x1MDAxYpzzLX29XG6gUtrx0EDQXG5cdTAwMDflNOal3e7iTM2Eue6wvlx1MDAxN1xcfJRcdTAwMTeRU1xyXHUwMDA2RT1cdTAwMDNcIpfoS0O35pjvOthcdTAwMTeDXHUwMDEz4JmVYprYTnBO2ubhP5thMq5cdTAwMWZYXHUwMDFmXHLnYkX5v95cdTAwMGKToGmEpGFcdTAwMDTDKPj/w16YKFJ84ZyC0oKkUJQkUpTOMOpLXHUwMDEzXzxDM1x1MDAwMqKQssxLXGL9f71cdTAwMTfm/+NcdTAwMDP//7BcdTAwMTcmmr9/wup/7YXJ04i+kP93e2GeTo/pYpi8+PL16UBVcVx1MDAxNOpGZ1x1MDAxY4unU2c0r/0oXHUwMDE3f4zDsr7/+3RSwH4uXHUwMDE0JV5utW+YXHUwMDE2XHUwMDEyOcpcdTAwMTOpKJKPUfS5JPhcdTAwMWb/ddKs6/zC4Fx1MDAxMq+U/VwiILJ756yqSN+hXmCV4DhqmHVcdTAwMDTlcVx1MDAwNlx1MDAxZIFcdTAwMTZRgKLL17pcdTAwMWF02fBsXHUwMDA0XHUwMDBi6CnHXHUwMDEwwF93XHUwMDEzOzwrsNVyuXGOyPWIRaTLqW6J4VxiwE6ptClvXHUwMDFk27N6l5U6rIyX5sWLXHUwMDEyq0xcdTAwMWR+Yof5Xfep1e4jXGKCj+FcdTAwMThs3O2sriquwLPZ0bk79VMldKXzMUqgZaBBb6RQbd6p/fjeUt7UrWWmUFxu/XX4tfu0Wlx1MDAxM/pcdTAwMDK0gFx1MDAxNGrQ6qZ6289uN1L7NZmJ/Ei0TVxyj0+zMZBfbDbw/VxcqVx1MDAxMFxiTVx1MDAwMmJcdTAwMThW+NeHTy+LMV5DyrHYz3TiLqP9XFxVweBVJMLSXHUwMDBlqYKQJlx1MDAxNVxiK82LR8yKs+OLXHUwMDBmwlwi+zJcdLqWNJJmLGLn1nE1aZrf0WmxsYgtXGZFstyQXHUwMDAzfSjP/ciaZnj47j5cdTAwMWT8t1r2ijtTmFxyvjptNuAm2Fx1MDAxNdz1R/JRwTbqyVT0vFc7gphtzL6x8vmfXHUwMDBmf1x0k9AqXHUwMDE3/v22McVd9VZT3Md3R5hcdTAwMDSTXHUwMDE25fmNXHUwMDA2j2x4MTHLQvaozV3tyOGFOITPSNk07krR5tEz41l3XHUwMDFiXHUwMDAxklx1MDAwMb9uZ+5cdTAwMDeNXHUwMDEyd5aWdv9kiVxyJVx1MDAwYlTRY1x1MDAxZUsykbS8RMBcdTAwMTU8S3/o9Vx1MDAxNzNcdTAwMDP5hoshv1ZjXGI/sdvs80Tlglx1MDAwYqtOfKxHXHUwMDEyfNxSYZ9z4J1tXHUwMDA1JYhcdTAwMWFcdTAwMDBcdTAwMTRcdTAwMDJQ6mmwQ4NcdTAwMTT0ibDnPSTclbB7t8OOWrDBwVxuw3D//Visxcx7ourrw4VMwLGu7Vxicq6Z8i9cdTAwMTR0q1x1MDAxMZxGfYTaXHUwMDFibvNcdTAwMDeWyUK+mD1Nnlx1MDAxNFx1MDAxYaMrXGYsXHUwMDFkxtSn+ViGXHUwMDE2t6GC52FtXlx1MDAxZmjfdVx1MDAxM/eyL259sOpUfSvxR0w09/mrllV8XHUwMDAzJ3NtQuwj+qUwI6mktlx1MDAwNNJ8/lhXXHUwMDFihmdcdTAwMWa7ssDgvaGeUJwsNalcdTAwMTXS+Os+UIaawLV3b5Yr//1QUi4oXHUwMDE2dmnpUjicbPqjXHUwMDE460BcdTAwMWRb7GXVjsZcblhgPrjTeaf9Yv43q2spUjUrTJLXJFx1MDAwMZtVfF+IILlcIlWPrIw0/1apMFVcdTAwMDIoSOAmrVx1MDAxYileP8xHtfSb7lnhUKPWNkv9dU/gk1x1MDAxNt5yTuiufHhi5apcdTAwMWZLZGdcZmSM8U+oy1xmzMRcdTAwMTVcdTAwMTmQm/yrw8SRZHu013GEQu1cdTAwMWFxsFx1MDAwN3hqXHUwMDE2m42OpFx1MDAxY5FGXHUwMDAx11x1MDAwNmPLUo53l1x1MDAxZdq7SP31rTiLPpVcdTAwMWXcZIin5lx1MDAwMMslXHUwMDA2ilqmXHUwMDFkbFxyMXuUeK7Sblx1MDAwNuvDrDq2YZDHmFxmJYh2yFx1MDAwMKJcdTAwMWV26FxymFx1MDAxMzBcdTAwMDHD31g5pmhcdTAwMTZBTq+Kfy4+x5hXXznf2TxcdTAwMDFt5pvCcbluXHUwMDEz7XxcdTAwMDI19CPFQ35IOjbWuWWqJO/xy6e27l+dXHUwMDE4NPCt6Hb5XHUwMDAx4YdT/95LYKpcdTAwMDD5nuf3aEHC3TDcSHRcdTAwMGblPdBU6Vx1MDAwNFx1MDAxMG1LXHUwMDFjv6lcdTAwMDYk+1x1MDAwNFqttmooeDI4dlx1MDAwMD9oXGLt7Ioshlx1MDAxMZz/flx1MDAxNGF59flcdTAwMTdcXIG1bqpsiyq1vqd80mBcdH9cdTAwMTTNLohtjVx1MDAxMNajdTxR55/7daKrwXwrkpp8OMVPyWRI8kq3OWGcNnLf8HwtVSQtpXEnN5pcdTAwMDHrWIH2+bfdWuRCu85itTJHedhu6nBcdTAwMDJcdTAwMTY8mtX7NTH6t2S913Jm3F9cdTAwMWV9p3jQ/Z6ZfGVcZl83KWdCtVxudGJOUc1cdTAwMWX8jKrHyKVcdTAwMWQhqpp31EzXTKqWwC/FNj+U1WEyXHUwMDAwoH6M59n7QNsnXHUwMDE5gVtvUUk3XHUwMDAwK8iTg4j2XHUwMDE5IY3Hf3J6+/RepVx1MDAwN17zOdb+RWTG+nfeij7GYFx1MDAwYsnJTvvw0Fx0a4S3bcVcdTAwMGLeM1x1MDAxOYbWlb+jcJF5Tf1f0y5cdTAwMTKyXHUwMDEy6q2JmchRXHUwMDFm62/ln2CBhlx1MDAwMPdcbj6ny1x1MDAxMLqt5czOw+smmEfjO212VEr7XHUwMDFizyuIv/JcdTAwMTZoNnwtkiB3zjephX+ST+BcdTAwMDNh4rBcdTAwMDV+KVx0dHnxnnOxmVZiytXa11RpMzD1d2kjRLvn1Cjp/vc8OHBgXHUwMDFlvFenhlxui7ykXHUwMDEzXHUwMDBi2lxcf37DVi6/7FSFXHUwMDBlRajzhG7rtqLjiiN5/s1jTyqAjFx1MDAxZlx08O1cXFx1MDAxOFx1MDAwMv1dbC+bcyiFaV6d/p/PNDE/XHUwMDE2XHUwMDFknFx1MDAxN1x1MDAxZCzuXCJcdTAwMDTsXHUwMDE0pWE2qeexWuNcXInzZ/edXG5Zg2pxzzpiXHUwMDAxw8yFRoFmi8jrKLfNKb5eQ2pmVH+jJFx1MDAwZkHke0spaHhcdTAwMThpke2RN77S3neHXVD6ZSbn3zFrKcr728hQm5sqKt5btk/yt2XSe1x1MDAxZWb3LX24niNDUmhtR10hXG5cdTAwMTFcYqWP9ftNkVx1MDAxZuXQXHUwMDAzkjg6NjX3x1x1MDAwM4KfSGuur91e/2RcdTAwMTl74qI2f4l0xIHS6vRqulq9f4fq1P+qU1n+Rkr9XHUwMDFj2HdBSKylYT7YyVx1MDAxMFx1MDAwMoOAL1x1MDAwYrRcdTAwMWZ1c+RcdTAwMTAp8/eAv+NvxYHn1MlqUkbW0KkkuWhsXHUwMDA0gJ931rdIrLNTeek4iT5cdTAwMTDN0PLHtv1SXHUwMDFjy+51PIslqY7zz0nbQs5gXHUwMDFi/uhcdTAwMGKKseDyuFwi1Fx0bdejLEfVrERDR/5cdTAwMTTwgVx1MDAxMDVwfF/T8Fx1MDAxMS7VMZ62XHUwMDE5XHUwMDBi0v/QjFxiXHUwMDA3b4xcdTAwMTeBaVBXy1x1MDAwNVnDb1GAx+BJulBhgFx1MDAxYmndm4FPboW1nfjxX09cdTAwMTf/I13iW7f6yu9xXHUwMDAz+PW4jVx1MDAxOWAqXHUwMDE5bjpsmG16yfdpXHUwMDA30Fx1MDAxNdZ7oT291Fx1MDAwM73hZ2N80Vx1MDAwMDJcdTAwMDOPXHUwMDAyoGCwiPpHjjiBjy+PXHUwMDE3u5ZRuO1BNLHfva8xMl8oaM36Y+X8U2xcdTAwMGXVZ34qnNmBQVx1MDAxN0uHL5p6XHUwMDFlbVH4sOlcdTAwMTkso0TSJ6Y6XHUwMDE0OPZpXGazpMBcYtbhXHUwMDEwcJuI4/tccmRDRVx1MDAxMWiPNb9cdTAwMWWGKTl6qjAjq1xmdyD99s9cdTAwMTJ4y8RcdTAwMWKxNlxcYfesXHUwMDA36/yTZr6scG9J7j9cdTAwMTjGyo4mnpFETEPAO5Cpr/qIq1x1MDAxZX6citTZQnBOtcL53mz0iOJtdiBZd9F3WHNXq7lCj/FEOPBWiDE5NtkxXGIwxmVcdTAwMDH8R+c4VnZzJs/KtuHl91wiO1ZDe1wis4pYmbWDXHUwMDFl/fXR07PtzEmc0EQmzUyvNqaHl1x1MDAwZX+ETVxibo2wiPebOvXxN+tqtTUryYNcdTAwMWLKXHUwMDFm3n5cYlx1MDAwMGb8XHUwMDBiPHhmr2pcdTAwMDaVIF2+ye9r2nlxm+uTpFZhOuhr+MbZXHUwMDFkSdia7FwioUIp/9dxp8L2TyXMWlx1MDAwNI0hYT1dXHUwMDAzXHUwMDA3az0nY1x1MDAwNkCw9fhoTlx1MDAxNFx1MDAwZrXd/W1cYtFcdTAwMWKe/9Zvs1KZmkUtSFxiaPhnYzqrRP5WQeJcdTAwMTRl8py9XHUwMDA0vs9JsqvJ5cGE8iZ3ziWu6qTat4JaWcXUa1NKbNxIXHUwMDBmW1x1MDAwMmcpvEKI5oGqXHUwMDA2kf0nXHUwMDExX1x1MDAxN+vwTdZb2GveXHUwMDA3Lm2U+pdcdTAwMWNtjJhQ0GCEs/KJmN/YgK7KXHUwMDE4TEnGqlx1MDAwYl/Tv2tQSi1/KfHKbjKFMura9Fx1MDAxMdt6f6WfuktcdTAwMDBQRFDGj/9cdTAwMDWmTMxtL/dcdTAwMTCIU6GRrIBcZrBcdTAwMDWn51x1MDAwM1x1MDAxNFx1MDAxOFx1MDAwNcOb86BcdTAwMDBpuactXHUwMDA1k0i7uOFcdTAwMTadny3q7CB/6b3CceoswlxufH8kKzhuXHUwMDFkKUf8wVx1MDAxZbtFaVx1MDAxNWuofK2EXHUwMDE4U/65VuxtM4ZXUE5bk0/BxzJcdTAwMDJcdTAwMWFmnGZcdTAwMTFcXKumd0X7XHUwMDE2etRcdTAwMWWdw2dKSCZcdTAwMTnaNuJcdTAwMWRHyz5cdTAwMWV0tqdnqFx1MDAxYd5cdTAwMTf+KddTXHUwMDAxVs5n/kA8fOt+1jKxOf27qDknXHUwMDEzNyRxXHUwMDA2tJGA1MZljvcm14P8jsz+ZfH5a4J4eIHUnVx1MDAxY8I9XHUwMDA24/NbYcVcdTAwMGKVs1vibFx1MDAxYW2LfVVbXFyo1LtdyvNzXCJBkcWaSHVYPISn/H9cdTAwMDWEXHUwMDE5K475q43hjiphZVx1MDAwM0szw79F0PW+pPRrT4lcdTAwMWQvcuIm4Ki/ovDTflx1MDAxMatcdTAwMDJ29mIgXHUwMDAxblR8WZdBsN2nL6KtxjL5h9Bwy1vqLWv8lDHsP4HHVcBfnIth+WAn/LP2TFx1MDAwMisy3LeDv7xcdTAwMDVFcv2AXGYt9FtcdTAwMTZWfTmPOYa9+qlzXHUwMDBiNd+Nq/7bf4WIXHUwMDA39cGgnXzyXHUwMDEzIHh2eZFrdCi56v6rxahwvVpMmugondnLO02ZhvSQS8zql3GiW+K6SpNCNotcdTAwMDcrg3hcdTAwMWX0h9q0XHUwMDFmxobQPC/ix4SejyTWeWQ/XHUwMDEwZZRCoqLLWFZf0Vx1MDAxNcHfZ3OL/73YMVx1MDAxM6szzI/2Yl6R4FSEJlF505ZcdTAwMTbRXHUwMDBl98CH1DdGWfqMidvnfF25i96Btrwz/UM9ijZP70i8k8p977K/9WKz/5bYiv3hiD5cdTAwMWVGXHUwMDAzXdcyXHUwMDE08lx1MDAwN4pE71xc0Fx1MDAwMdws2Fx1MDAwYsSWXHUwMDEzokS5XCL3cyGsXHUwMDE2Os1kXG53sFxm/fWbQp80rVx1MDAxOfl29kOh5pP+Vlx1MDAwMFx1MDAxM/0n0zB2srj/XHUwMDAxXHUwMDA1R/adSm9WvqVP/Fx1MDAxZaNXrX8hd31cdTAwMTdbXHUwMDA030Ig0chcXCPQXHUwMDFhKE7wWMhcdTAwMWJjQa5yXFzXY/j1U74t0Fx1MDAxN49mQaX0XvOfPKY7o4qR/CPt/02zeezV7LKPYUpVXGJcdTAwMTAmsVx0/bmYWsdqxLlcIsFcbqNKjYdaWNQpvyNjRlpybFxiXGJUzzKYm1x1MDAwZub0XHUwMDE5cVRLeILadM7JR1xmRZRDdlx1MDAxZOPfNVx1MDAxMPrTtI9fLi8lXHUwMDFlcyhIzCSHz1x1MDAxYsblL3XPv4dcdTAwMTFdyYpcdTAwMDKIiVx1MDAxN/2xKlx1MDAxZD+jxui+wiPjTTGgZ/ThZnh7XGZqXHUwMDFhm566TImp/ofBpf/F4L/gQPdcdTAwMGa/dtF6tFx1MDAxMzFcdTAwMWXUUyZU57qFojlcdTAwMWZPdcRcdTAwMGZcdTAwMWK99U9cdTAwMTZujq/eaFx1MDAwZqJMXHUwMDFhnpaiXHUwMDA341x1MDAwN2TDvKRcdTAwMDWhYojylVNH+dfYXHUwMDE5/z9jz+WpSY7pSJmGXHUwMDBiYkhcdTAwMWGQbSVQcjLB8Utue/2d50qH4XFkfvKiXHUwMDFirOmdt8mVLueRn2iq39G8VdtcdTAwMDLzlohcdTAwMTeb0rqgXHUwMDE4WETE/pt+Wv2fOeq/JIvtXHJcdTAwMTi07pvlUU/lSH3zUUhcdTAwMWPz7NdcdTAwMTFw0Vx1MDAwNIHVvFx1MDAxNPl85TtcdTAwMWGyLPUsrYSRXHUwMDA042l7XHUwMDBlRGngWlx1MDAwZbnzVav531x1MDAxY1x1MDAxZd7xWy+LvlBcdDyX0NKD95VcdTAwMDBcdTAwMGW+ytM1X8dA3Yjkk3s+ikjW18iCL8tEQsHOQ5WNuzRnKE6Uw7lmRPhD3sz8XHUwMDEyeKzpq1x1MDAxMsz/uy4qjPvkXHUwMDFh9flYiDsshXIpuKgsnJ+CiaeEKVx1MDAxNVpcdTAwMTXiLbnfa4N8XGKyl4uVkzPt/KZ4g8XJJOO/ckBcdTAwMWaHsKKOfHOlKf99fOlcdTAwMGX+9D3Y+oBcdTAwMWWDNU3aOrdcdTAwMWJ1TaRcdTAwMDEkP1x1MDAxYkD0wiMlRvOsRkOtiE7cp8bobjerxqtcdTAwMWJcdTAwMTH+y95jW1x1MDAxZk8mOSNcdTAwMDL2Q1x1MDAxNEXbIVxm1vlHMjR2Y3VL1+tcdTAwMTXfXHUwMDE4gtol+SBcdTAwMGaYnvPDXFz+XHUwMDE2v3udefdxqjLXh5lsR8jeXHUwMDEyZVx1MDAxOOlcXO9i9KH1eX8p/ckhLE2WRWA263+r7Xx1/NVccuzWb5jpxPhbruSXXHUwMDA0XGauRLw9JNtW6uJo1W60id3Gr9xEcZYm/MbljzDemnfsY4J4lNP5S1x1MDAxOVSKXHKAzFx1MDAwMmfWJV3/rbfah+GbtXOryONcZrRcdTAwMDejXHUwMDE3+XwpnVeAL71cdTAwMDS+JvVcdTAwMWTqsTGnwVxiQtu8bth7SVx1MDAxOLXCh7s20P5bXHUwMDFhXHUwMDEyXHUwMDE2RTq6gtzE+v0vz9LlPSO/+pGYfEB9tlxmocFk5Vx1MDAwZbA5wuRcdTAwMGI/SiXHXHUwMDExnFx1MDAxN+BWeEGNsUpcdTAwMWF18/CKzsqD2JdnLp5cIluCI3Ex+mJcdTAwMTTb/Jvl/JpjXHUwMDBlblx1MDAxM/FSM6fczcg+RC2SXFy7dSbAX77d1/R82un2eeIxeEWpXGZG4rS2slx1MDAwZcvoQlx1MDAwZsJjg2dcdTAwMTCqnbpou+iNsZKL+++4+0BjLN06MLxcdTAwMDQovUSKXGYp0FxiOJZ9Q8D499u9r/yGK5WSJVx1MDAxNXpfZWGEceBcZim+XHUwMDFmXHUwMDA0K+VcdTAwMWZcZjynflG49fBcdTAwMWL5wItcXKX/XHUwMDFlO/nRmMPcXHUwMDBlJyq+63WMf3VcdTAwMDA2I7xUqcFcdClnts9ocatvaeHWSFx0y1x1MDAxYlx1MDAwM1x1MDAxMlx1MDAxM3a/X4e41Fx0hFt3nJJcdTAwMDBcckEqXHUwMDA0Y4iZXHUwMDE59685b16lVjjxPMuh6snL9F5A274tXHUwMDE07urNnN2E7lx1MDAxMCaBJ/DZ7YCHhML0XG5DudVVXHLJeKgnwnh1wIzakr/mf+WQwLBcdTAwMTkpXHUwMDExom99y6lcdTAwMTHhP3SRdfbBM+pAnoFcdTAwMTPAKFxmsFx1MDAwN4+5Sn/dXHUwMDE3c+6SXHUwMDEyL/TrbaVD/m1fkKwqqvKV9YeEsvDfe6Y8Q11ORa5PXHUwMDFi7+iisJo6sppu2lxiulmI15RKXHUwMDBmZ+jTyJX793XaXHUwMDExZe75XHUwMDFkjfUsxE5Z7VuA+qlccpvm+1x1MDAxZe5cdTAwMWaz7Ni+W+ntU1x1MDAxZpR+XHUwMDFkhFx1MDAxMWre/N2PXHUwMDFi6Vx1MDAxOez3OaxfYDGXKCiaXCLK81x1MDAxYkLFXHUwMDEw9aBvtvGPvp7OWlnhSv6lsc3/0liaOvPvsaTjfErVRPVRtvdTRXJruURcdTAwMTX3MjjDpCNcdTAwMDL9lpyiw1x1MDAwMM/f8SlcYn3dwzXt5Kp1kMde/1x1MDAxYaPqf/7qdKbkUW1C/Vx1MDAxNvFdQyY7i8Pi6K+f6y03isX+XHUwMDFmZH3HlqtI0+1cdTAwMDMxwLsh3oPwZia8XHUwMDAw4f3TX9Rfn+7+153UWlUlkZBcdTAwMTmxY++IyIRm5jGopulaxjFcdTAwMDUj9X5cdTAwMDNbWu5Wilx1MDAwMm5mXG6Q8rJAUob+kytcdTAwMTiyv657M99cdTAwMWHU3kKf+79zTMLGc2gkVVx1MDAxNjgzLb2If/ftjSTzZvXEsJ9cdTAwMWY9L/NcdTAwMDFgka/ZgmhtctpEWFiTXGKzQuX+M1x1MDAxN/H/5qIlXCLHv9HHpJyUXHUwMDAzMGeoXHUwMDFkXHUwMDA3+uRjNLpiZTKt/1x1MDAxOeQx5j7fNnaab1x1MDAwZVx1MDAxNFx1MDAxN1x1MDAwN+eG12KbvTHBx8U35viHT1x1MDAwNHb1w1x1MDAxZiXDk1x1MDAwZi7OXHUwMDAyXHUwMDE551x1MDAwMFx1MDAwMFNblsdwN1x1MDAxZCDyMeugq9dat5uFUyTq4Mzxa9zUkU1cZpgrrNRVX6V2XHUwMDEyxJGzjWv/JVxcXG71aFqULGVl+YB2saFcYr2/qcgqlrdrO3VcdTAwMDD3QEX6lc8oXHUwMDFj4MRDo1x1MDAwYmlyZlE04tpoXHUwMDBmzsv0XHUwMDA12c7+JT5cbidzPp9cdTAwMDUxfufpxjtCKSePJ6xcdTAwMDGApMbaXHUwMDAyg0mBO1j9j2OIMKu6v5RAg57+t1x1MDAwNHu2OvJIMGRcdTAwMWX8XHUwMDBmvpOnxVx1MDAxOFplyMD202y/o61cdTAwMDfpNbmtrknGO3FcdTAwMTeLXHUwMDAzr50pZ8ZljZqzxba9wlx1MDAxMDVz9Fx1MDAxMZXdXHUwMDAx2Lo3SYowfb/RwVx1MDAwZbHwR0ZVXHUwMDBmw6v4amCLaG3eQpPP4lx1MDAxM+gj806kPZzTZ+WUjlx1MDAxNJkgQ9fsXHThylx1MDAxMyTZ8Ga/rFiEOziTVClHs7WCI43V/ycg8af0w0bUJlx1MDAwMyFdY59+4XchXHUwMDFmOaqFss9cdTAwMGL3XG5ZXHUwMDE16leYoHDrxj+KpUuAXHUwMDE4dJZcXEJnYX/VXHUwMDA2e1x1MDAwZqlZXHTVXHUwMDFmg62X+uBcdTAwMDU0Slx1MDAwN7K44HCtfjVcclB3XHUwMDA2o6SpMFx1MDAxZndcIidcbvCRv1ajb/zzeexcdTAwMTMz7UjLOLXNmnM86Fx0gmxcdTAwMTFcdTAwMDNcdTAwMDMtXHUwMDFjyoujcWmhuD9YSNtcdTAwMGa+rFx1MDAwN85GdrlBVZu1j3Z/Kc1FquiQI6x1QuJcdTAwMDRxlV3VykP7kE2StkQsNlk9YtC2XHUwMDFk4mHz3CyUyaD8l1MwP07BPqxcdTAwMGVg7XyJV2lAUCe2mrCXwvyoa/7USMFb2OPxYZbplLz+ylx1MDAwN56HQXAgZtORs/PibWWR+HuJmz95mIDL2Fx1MDAwZr+iQFx1MDAwMKFcdTAwMTKGXHUwMDBiyiSHrvkyrXxcdTAwMDXU1pjGeaFYaWVcdTAwMDZd+Yuzf+P3uat1XG6+t8dfxVQwpFx1MDAwN09Krvgnf8bG3sF/7uZhR+WXy51XXHUwMDAwW2RcdTAwMGVcXDCZlFx1MDAwMWcvnvXKicdM+Uq2NaKx576U43FF5+IyXHUwMDFhpfRJOEpcdTAwMWSFUohcdTAwMTfl2n+7gVx1MDAxYbiPv941Ylx1MDAwNShuXHUwMDAzwL2olJeCXGJaROBcdTAwMWVFzCeVRGP8Nv+7ieFZ6pSTWj94NcS5lW5cdTAwMDOj6Zd49KG2I0p9vs5/ZP9DjSRlo5W7JFx1MDAwZYf2XGIyKmXMXHUwMDAyT5guQa6WIOdcdTAwMWRcbjJINvyLfIKofiq2XHUwMDA1dl2gZ0X4xC1B+YRdXHUwMDEzqYuk39ja/8P1XHUwMDE5+SVgLKbpgJ5nIXHvKVwi0iVcdTAwMGXmmX7db8VwXCKxQkCNPNf4ebZCRZj7rO7fq1x1MDAxZWVcdTAwMDDc9ozFQlwiedD/nlxu/m/OdOjGY928RsBzTn1ZdLWg8cEqeIVXrmY/Tth9Rlx1MDAxMMP4v/xFfmeV6rnYcKXt0r7k+ohcdTAwMDEu80OzO3G2+tev5Lfxs6lmXHUwMDEyaHJA4EVYXHUwMDA0ZkJhKP/k4VvxrNjLs7dcXD/WxFTP7z5cdTAwMTOEKvf6mEtcdTAwMTfRXGZkRUNcdTAwMTZyftA37PavXHUwMDE2XHUwMDE0WsU2r4B9WSX/VuaYXHUwMDE4xOBVbuRcdTAwMTdIXHUwMDFiXHUwMDExN/xJY9y+o6rgl+dxlc5gmnOtqeyT0qT+xbdcdTAwMWP4XHUwMDFjzPRl7X981ZerZ41AXHUwMDFk89jcJlxudFx1MDAwMoaGXHUwMDA1XHUwMDFlWi5qXHUwMDEz81lHsj6Mvyb+alx1MDAwM2bE7LTuZTDkRvzeb1xufEhzNHdZXHUwMDE1/ZtXiqX/5XrOL0RcdTAwMDZIV8N0X4CzToQ7XHJcIpBaNTSMvC31/eNN8Vx1MDAxM1x1MDAwMUTPMStcdTAwMTTch5RcdTAwMDBcXPxIJ7Twm+2u/yvhM/7xI313gTbTN5TBQMVcdTAwMTm019m4jtNcdTAwMDG+73HTx4crKuZth8GsSqBqXHUwMDFmelx1MDAxOGSPPZTwJHmQ71xm8Z914SaZMZyciK4uzPLP4nPtUFxuvT3UvabJva6eWnJcdTAwMDT/05aK2FxiOOu6i5BcXFx1MDAxNLLrXCJcdTAwMDVcdTAwMTmefCpHRXls+8/9Tczx6Oeie1xiooWMXGKVglTU4cU9I6GhnMidW8f5w8fDilx1MDAxNU7VXFyJiHFjXHUwMDA2sldcdTAwMDQvqXQoXHUwMDAwQCHsyfbV8adWweCcwGePxiDE/k1ioDBcdTAwMTP7XHLD8MytnfdcdTAwMTbOKehcdTAwMWWzcyrhlyt0mVx1MDAxMmI/bYdgmFSDw+pcdTAwMTNn0pMniqDPhKtcdTAwMTfG/Vx1MDAxM0NcdTAwMTKoZ2RcdKWwXHUwMDEzfpH7XHUwMDEzPFO6SaMnmt9p0+hcdTAwMTLMqY+4WbK/a61vZtTa22nRVJLBMlx1MDAwN22IXHUwMDA3miPt5siO+H9cdTAwMWVeYLyHm6VA/K1OXHUwMDE12U1cXMaM9NV9M1x1MDAwZoJcdTAwMTHK981cdTAwMGUn64r99Vx1MDAwNVx1MDAwMIfng806fr/JZjQ9vZtfXHUwMDExSTennzt60iv+XHUwMDFmPLZcdTAwMGX/p5F6V0t3gn4g/YTynlx1MDAxNHArIVnmm7Y+KZ+M8NdHO19lXFxcdTAwMTNcdTAwMDWbhsIsXHUwMDBmps/1zlDh6iRcdTAwMDYj/8n/a/z7N59kcsu5N3+5aEd6XHTtZ3NcdTAwMTHaQmac1dlwvGnun0s0K6/oINjUa2mZLEgoyNDP7d3K/6mxmf/TcKSjUqS1wPBcdTAwMTOHhOFcdTAwMTKVhor88W5FzmJcdTAwMTZzSdC5mn+547tWbST5XCJvp4LW+7mmb0+0XHUwMDAzKbtcbonN/IuB//PHQ/wrz7fW+XzOtDx+uXIhZ+x7XHUwMDAyXHUwMDFmU1x1MDAxN+mOX/RccjDPg31sqZJcdTAwMTeVeFx1MDAxNXHsVFxyhH/xXHUwMDA0Olx1MDAxZmlcdTAwMDDhXHUwMDAwmTiv3KJfg9n9mc7Aj3/1N4xfS25u/Pfu8Zn0urYk31x1MDAwNUl8cfx06fc5ouxvqjiEXHUwMDA1lWzSUvrMpOYwaifSXFyYaph/61x1MDAxOedlMEckPMJmJ4tcdTAwMTPJ38i5NLojxjfl2dtcdTAwMTnZXHUwMDE1vfJ3LFx1MDAwYmHxezasw1jtvl3sXGLSXHUwMDE15Vx1MDAxNqlcdTAwMWVcbvBTxlxuufuB/qdcdTAwMDatVcCPi55liOuT5lx1MDAxMtZM5NgrXHUwMDA2KVx1MDAwM9hcdTAwMDCdO3P4Z8SZ7bOKm1x1MDAxZFDzXCLqTyr2SfpKsiybxDzimf/mtIT4l9NcdTAwMTIrXHUwMDAy9Ix0IS1cbryz0vgqdsBb3/TELPWvXHUwMDFh5fxR7UtosGuR2SrPqlduXHUwMDA2+yCc/87d8cxcdTAwMWSG3Ws5fjXR1kw7fJMtvZI6oVx1MDAxYXFcdTAwMDI1kn6cXHT6gLOdcVx1MDAwMovmd2Zwn9t4XHUwMDAxXHUwMDFjXHUwMDE1eJP46CTxXHUwMDFlVHVcdTAwMTD+5Efyv/T/XFxnXHUwMDBlXHUwMDAwXHUwMDEz1vnaVVx1MDAxN1x1MDAwMy6medamjrPnXHUwMDExXHUwMDFmk41cdTAwMDSYXHUwMDFmv/nZU6/Ne1x1MDAxNHw/Km0oi4+vbE8wolx1MDAwNOiPLaZcdTAwMGbf3MxccihBXHUwMDFm+PEhaq9/2HhrYUhn0HagXHUwMDFlnqKPzrdccj5npVv66tK1v7SHWn5P+jJcdFx1MDAxY8H7w/tTXHUwMDFmlHdcdTAwMDFjXHUwMDE4JCFeokd15HDTe7RcdTAwMDKxlV/4KfKwhJOuLMCcwjKsI9nT0uVN2H2hY79v/JP18sEwXHUwMDEzwO1M7v3xvb/qbl+c1Ndo/LLIOrvAPlx1MDAxMTs41Vxm9ypcdTAwMTDkPM3oh3tcdTAwMDGLsWi5Wq4seijN259cdTAwMTO9u1wi4TPwpVGXv7B/x/9cdTAwMDe9n3XN04fm/IKyQF85XHUwMDAxrllcdTAwMTjX9FtGjlxcnbCHM3NDyGjTOlxmR+lcdTAwMTFF335BVVxyrJIqR/L91dxN+G95YlB+PIVAebjfV7p3oFx1MDAxMjtcZqBfnr8h/Kn6f1E5XHUwMDBmYiNcdTAwMTaJpVx1MDAxMmW+7d3B7++oiUH+UFVKPFx1MDAwM39C51x1MDAwMGP+7sep/OHzw1kzpMc4z9xfXG7Pv2vIo/BcIlxyXHUwMDFkYzi811xcykKQZb0v1KdcdTAwMDVq5UlOl8FcdTAwMDIv0CpPhzJcdTAwMTJFZ3FmmnCVLNpCXHUwMDAyQczi5KXMN+p4XCLFv/F76Vx1MDAxZa59WbEqXHUwMDBl01x1MDAwMJnkNk+Udlx1MDAwNaT1MXkv3Y3HNcKGZXH90d+twm9vm7taaTFQRWdcdTAwMDKm09yOe1x1MDAwNLlPtD5cdTAwMDTkX3xJ7ZezaWd98v9cdTAwMTmjt1x1MDAxZj5fpFx08dvRwFx1MDAwZfRGSidcdTAwMTXE48hN07BjaShcdTAwMTFF4lx1MDAwNaVcdTAwMTJ/WohcdTAwMWL1tmuZIaUySVx1MDAxYbU5MIFiaVx1MDAxN1x1MDAwMztcdTAwMDbd+XZj6IxOr7JGN3btXHUwMDE2Ks9DOqvSYlx0rL2r2SDUyu/PSmk1/1x1MDAxNG7fvT5xw/XsOsdAKKuzJipcdTAwMWH5sHVgdNd9ZupvXGbTPvVKS4rk4zPp6pCsXHUwMDE2XrnMPX+lxVR+XHUwMDA17DOmzjDo/8RcdTAwMDKJb1iOVcyFnJZXgKZoifbBdVx1MDAxOVekXHUwMDFlrYpRaMmJecBhRq2EXHUwMDFlzo3NyEjYe1qEocVcdTAwMWSvP2d7PfPazbcvo7Jz1TBQ3LyCflm/Ts5PufpWMiHorVx1MDAxN1x1MDAxY0KA2JDf3P7l8SajyL3y/PXAnYpqKp+gK8hvKLSj6uWm79JVMr1PbVx1MDAxZT+oMn6JsFxyuz0uPtG2s7dvWVvzkes+MLZcdTAwMDXNx3valFx0+lx1MDAxNu9cdHh5PlJaT8SjpSVcYtYqdlx1MDAwM0z4p2ZcdTAwMTlUdTWkMf6eZ9hcdTAwMGVW/UJcIrZe3nuYvDtcdTAwMWGvXHUwMDE3so6xXHJcdTAwMWFcdTAwMTSXXHLMXHUwMDE2VnRcdTAwMDUyVEvKy2QmNVYzZYs3wS/+SN1cdTAwMTK+9L54rIFcZmA6KyV2SUN6+MiPyNP9XFy2J9E+Pt6UJPfO+f5HPT+u99FcXFx1MDAwZtfcYVx1MDAxOVxuMc/mk21cdTAwMTNcdTAwMWbplWLFn0lcdTAwMDGd0HmAWeX8nu0l/lx1MDAwMCGaRG3A+1x1MDAxY3jaj1mQYK9/e9tcdTAwMDbtx1ExtFx0mDVB8kegs/WY6pfnlklcdTAwMGJccmsmO0/oslx1MDAxNfFcdTAwMTHJTnJccmdyVkR8Z33t1OndtWDi30XXdVx1MDAxOShcdTAwMTlbXHUwMDA3LZvOXHUwMDFkrXyYaexcdTAwMTFrdFx1MDAxY+VcdTAwMWKRqVCm0d1cdTAwMDRhYKb2gLcpqsGBX1x1MDAwZlx1MDAwZlK/ddLN2Vx1MDAxYtCyXHUwMDFlyO7SQ9yPXHUwMDFi16r1ONk0XGbDhLW17rT3XHUwMDBi5DmtWlwi6lXp+naVJvkow3rVNILj/lNLXHUwMDE4XfHYhaB6v6+hXHUwMDExZSiad7pcdTAwMDDfVLC5i049yO74y/uz8/m9rokrwr5fXFyd1jRcckepQ79+XHLSXHUwMDAy41XDTLyz0DZcdTAwMTAujK4/wpRcdTAwMDSGNi1cdTAwMWMwRqxkXHUwMDFk3Vx1MDAxZFLwKU5cblx1MDAwMJlcdTAwMGVh5fD+vfov+13im1x1MDAwMEZqPNY0Z7bEhItcdTAwMGWb0HTCSvRqyZf1KktcdTAwMTRPXFxpONL8xDJCXljhXHJcdTAwMTFcdTAwMTR5Zlx1MDAxNL3Tp8TU/9ZZ3SdcYiS1hFmD5Ydcclx1MDAxNCfKYIlo9bVfXG7xnk5T+Pz7Lkw71PxaR85cbpxxvMOP7TNxjKheX/FaX3SUXHUwMDEx195IgbdcdTAwMDL0qntcdTAwMTBwma5cdTAwMWFcdTAwMDOLM7WPZFk/NP5BgFx1MDAxZFx1MDAwNeaOqSjDe/hDrI+aXHUwMDBimszRvNdcdTAwMTV/XHUwMDE1tUCLtiBsVDRTJNV4SDTnhMdcdTAwMTG7rp9QKYPURq/4yrOz9W/NSF5cdTAwMDWD/7yRXHUwMDE3RItcdTAwMDTp6Pfs/nZ4wINcIopyXCLxyavvfDtcdTAwMTHnWINleXvJ1bXrblx1MDAwM7wv5FxytFx1MDAxMPCVm6EmpqzJYijltJG1XHUwMDA2/6Prs5os/KNF+Fx1MDAxOGYrJYLpKNhzu8qncUXAyELPIFx1MDAxZbKAY72J5Lh0jjvLWFx1MDAwMqqQrPpcdTAwMTG/huHKlKVlXHUwMDFhndnLf3rMZPlX38rBc1x1MDAxY5zy1GMpXGZlUydMPCiIMDLeWKjn9ZyjJ1x1MDAxMjVDg5Ij0y5fvK81zlx1MDAwMExcdTAwMTJcIl+eSZwx/EVcdTAwMWbR9vKIk0BaS1x1MDAxZnBHP1x1MDAxYfBrtFkqXHUwMDE5l+ZcXMpqXHUwMDFjz1q76/e7XHUwMDBmxlx1MDAxMcRQh8JcdTAwMTi7n+1cdTAwMGW6XG5Cfy43o4iwm43oYUwvXHUwMDE04+j83Ph6Nv+t9Wt/6T/Lg3CZfDyLLi9z0n3wftub0ovxTPJccnqofcBz7NFjmH2M7Lh902hcdTAwMGVuk4C/XHUwMDBiTlx1MDAxNd47XHUwMDAyXHUwMDE2XHUwMDBl04biLXy+SVx1MDAxMMNcdTAwMGaCim53KFx1MDAwZn7W42eJeGx8olx1MDAwZVxiQbiN48Y6wddDkF9rrIKcuEBR3Fx1MDAxMWfdkHQsseBq5YRcYsFg+0Y+XGZcdTAwMTD90yNj8N+fJpCTLZpHJuGHnNdcdTAwMTNZSTHXfvmEJpfpO1xyiVwiKPTkTehcdTAwMTaQSFx1MDAwNkx7+IzDljpTwKNBQJRcdTAwMWNkf1ItPeRecGRtwkiD0/2em0uclVx1MDAwMVDe+3PBXHUwMDBmdUqttUeAvISuK4TbqHdbIbomXHUwMDFlakFp54Gqxc5HXG7F+r1/zyXbztTbaFx1MDAxMX5Tzv/NL1x1MDAwYqptXHUwMDFleURfKjqQQkh2alx1MDAwZoe6yDqOVipGbpUrNUZAYFx1MDAwNvr9zYQro9ZEf+iEJ5xGwcVcdTAwMTPkqHZ21Nwux6/PvSy0lYXdmjKEaFx1MDAxM0roXySif3hYnSxlXHUwMDA2gljT9PtzrzRjvFFXXHUwMDBmXHJcZkczXHUwMDEwWmlcdTAwMTScp2kpm1VUjYus/H/gYJJcdTAwMTJcdTAwMTTleyaeXHUwMDFmXHUwMDExYyoxqMBrXHUwMDE4LYmNRVx1MDAwNvZcdTAwMDQ2kjVcdTAwMWZq0Fx1MDAxM8eBXHUwMDAwmuZRM9hD0Cf74tcj1LOc6yTyXHUwMDA2P5BcdTAwMWa7nfDu675cdTAwMDC3R/PCcImgKT1aOULAJ1xu3mvmh6LAcoaR4GlnUKXLoFk1w6hYKPCXaf/Umk+W5XCLnHVY0ItPXHUwMDEzw/tcdTAwMWLDxdeXSoJ1wo7GNdx1+3xBJVZhaZInS0NQWc1cdTAwMWYm69Ug/IsxXHUwMDFhkE/HXG44XHUwMDBm6tQ9XHUwMDAz4O1Xdn7dtFx1MDAxMYdtb7l+XHUwMDAwui+uwpvNNlxct+n5VvxcdIFypj8r3ClYXG4quPww3Vx1MDAwMkNPwS48i1xmXGL+udm/KVUgM5a+LVx1MDAwMVx1MDAxY2Kihs7kjubd/lx1MDAxZW/N1TTHzXKTtI9Y19wg0m34svdzK7yebEux9btcYvahrFx1MDAwNlx1MDAxZE2HXHUwMDE4pEZfrFxuLI+YaZaM71x1MDAwYpGod2BJn/CMzKn4XHUwMDE5XHUwMDAysVxyXCJzuM6HvfhlQapcdDgtSHYvhWN6Plp8SFx1MDAxOFx1MDAxNlx1MDAwMVx1MDAxYpSq6u+cJfM7xXGX89HVYKVcdN8vR1x1MDAxY7K04pGjZoVcdTAwMTdPVVNcdTAwMDLVXHUwMDBi4l9cdTAwMTBcdTAwMTK8p1ioXX1cdTAwMWSZkjyXN8DYju6NXHUwMDBl6/ky3E94Wn42S5ZcdTAwMWH29/qhJmpcbv5cdTAwMDZAkaUx5cWtIzA9KIopjzxcbu5EW27d8q/Aa4JjoymUhXIpskjqdlxmYz7Q4lx1MDAxMKq/yYCgKD8/OGCR3E5cdTAwMGJ1XHUwMDFmQ+WUwNe+NpHSjVHqnmUo1V3uZVx1MDAxY7x0zePS+7eUenE8zK7INlx1MDAxMeJcYtqAK6y37lx1MDAxZNjPrrxzMllh5zVqLCagfaw+aoqwd2cre/VcdTAwMDKV61dCIIVcdTAwMTS+XHUwMDFi1Ky4v3lxxWfPfdz05oAwNmOr1MPTwstcdTAwMThcdTAwMDftsbpcdTAwMWGw2bNYpfBFeFx1MDAxNVxuz4L9XHUwMDA3fCWjXHJcdTAwMTief1NcdTAwMWbYXCLk61x1MDAxYuNRdITT+DVcdTAwMWZOrZ3nXHUwMDAwsqWEi2b3+lxiYVx1MDAxMM46ga+fZsRcIlJUszxiXHUwMDA3woSG+XG8Va+if3Ml9sxcdTAwMDBcbtYrbJFYuKrquGLPZOhmME9r/JVAXaE27MfMXHUwMDFj0FwiN4gy32fy0vu6mOKP+caPRZx971xmMs1cdTAwMWaF/XsoxVx1MDAwM0pcdTAwMDCHXHUwMDFmTSlcdTAwMWGtqrXDcSt4YHo4dDwxpfWDq1x1MDAwYqX6lP/J83LMxq9cdTAwMTf/qZzkyOc3WEA56lx1MDAxNY9cdTAwMTDtwk5m79NcdTAwMDBcdTAwMDVcdTAwMWFBvSmo57VcdPfjgfCVvFx1MDAxNVPg/EXNXGJ4py3YXHUwMDBi1yz56Fx1MDAwN4SyPD1y6Z6/o8v6zOGW57vEq6ZcdTAwMDBttlx1MDAxNMKfrKTywdg7XHUwMDE1ZFx1MDAxZc+q4H97XHUwMDFlXHJW4jj2yu/q8aQmg3NcdTAwMWTJXHUwMDFm4VxmtrSiXHUwMDA1TJ1d1n2ZUY9rW5YtZFx1MDAxZmBcdTAwMWVNP5r/cClcdTAwMTKfMJVcdTAwMTOLNFwiUUnMcXNpoDf6iLDaw/dcdTAwMTBMXHUwMDEye1x1MDAwZZdMXHUwMDFlnOBcdTAwMDO8Pz199ckw1q9cdTAwMWFGQd5cdTAwMGV93MvOIHHg6PlftsrVPzmnjOX4Td5DJp6EUFx1MDAwNEn6k+Al4mtcdTAwMTn5Okilirp+XG5SmabDvdjakafWeVwiqCw6KZDFPv73i757Sa1cdTAwMGIv3JL0cj8ot2E9VZrF5p1cdTAwMDNshlS4tuxrXHUwMDE3VWJ41VxykSnTr9ZOJD1Uv7/J16HwnVq5XHUwMDAx3D9cclaRf/y7XHUwMDEyuEBQOKygPWdcdTAwMWJZLbhcdTAwMWafNCdiXHUwMDFiN/EwJ7DqKd6qplxugfNcdTAwMDNcXF7OXHUwMDE195F+/Y7fedFcdTAwMTOi0FuXLEmUyye8zmVKzHVcdTAwMThFxvIoo9T8RMUowOyXpMdf3M0wXHUwMDE53lx1MDAwZmiC45JSjz/5ivV87EXefeFcdTAwMWW5TFYocIeXqET0QiRzJZz77lE/mbdCgcKeZ/1J+ns5slx1MDAxN786uq3FXHUwMDBmK604jM5cYvRcdFx1MDAxM797XHUwMDAwXHUwMDAz+DWBqbiGrWa5Y7vnqyfdgVx1MDAwMqp1XHUwMDEydS1VyueRO6FcdTAwMTQ0t8yE/+lcdTAwMTHUfzngfsDCvIVM3i3gh3dcdTAwMTZf0lo4yTDwR6+QZNGIeu/mrqPuO1hcdTAwMWRcdTAwMDYj937OkOSsUUDk6Gbi7Kz5XHUwMDBlW+xcdTAwMDbloFxmkTfV4U9o0qhcdTAwMGJ098DEm1x1MDAwZU5cdTAwMDKUj1x1MDAxMbN0zlVwZ++TMu8/dfLoV8fadVx1MDAwMGJ2XHRNV3QntpB6Ly1cdTAwMWVYXHUwMDEyavlTKFx1MDAxYlx1MDAxOTNcdTAwMGbn5oMrRvXG7vq4XHUwMDE5haZCT4ErXHUwMDE0REdcdTAwMTbfXHUwMDA2xGKBmFYyRpA1QlI3XHUwMDFhXFzMy9OPQ1olxDYkQ8ksOJXLhOVcXETsXVGbXGJz/L2XhtF++TYgXHUwMDFiyXcjOvtccpw4hKehQMvpvUa3gZqSJnzy9YBcdTAwMWErSm7znFWi+M6t8ca/6Vx1MDAxMVx1MDAxNC5cdTAwMGVcZqZcdTAwMTFcdTAwMDVwnkBcdTAwMTn1xO5cdTAwMTGXelxmXHLemYz62vo7h1x1MDAxNoKt0cWNm0LzelEmsch56d/xr7/Gj2DYeDRW71xilmlenVjvXHUwMDE2Wlx1MDAwMdFmz19ZXHSZZv0kYyOgxr2TyIPxpW188s6/XHUwMDAz1Fx1MDAxNmbikVx1MDAwMm9/XHUwMDE157Xg+jZU+k+A7yvVLe4jiKjb5Gcq2U9Eo2BwYbP/+aXBrj+/pDbVouVcdTAwMDSJXHUwMDE2w6AwqFVcdTAwMWa+t4VIKK9QofntXHUwMDA13dxcct3m3T0/vFx1MDAxN2TPNjadaCcuna3vz0MgrLO/91x0aWXbUvpaVLrtjVx1MDAxY9XnslFeZlx1MDAxZrvl6zWLxJPp992tjGLA/rY9+ePZeqhbIEq9fIdcdTAwMDVcdTAwMDEypy/qRod+Kk7/huxAjYek1lxyvE0mWvFaXHUwMDFh5K8uXHUwMDE3XHUwMDBii4zrbWJcdTAwMDOsXHUwMDEylGb/LMEmqNrD7MQoNezHWoFU8Fxm4Vx1MDAxMy9cdTAwMTZvk0BzvbZAXHUwMDE1Mvm/vSTj0vpcdTAwMTb68TYw/fjvRkdcdTAwMTaNnek6JONcdJ3Sy5i2/LrevZ91L1x1MDAxOF3hi/dE0LyX6ddtXHUwMDBl079cdTAwMWFo++r5h1xmXGbcI2xKlMRmeVx1MDAwNpxavlx1MDAxZY36+Vx1MDAxMF7cy5lfXHUwMDFjTt1Y+U7cXHUwMDBif1DCblx1MDAwYpPI7Ux8/8nBRMK3QtrQXHUwMDAwNmWn+1x1MDAwNzn9zdU/uTSp+nh9O+Irilr5+MXntYTiSkLYQ1VEmKHOXHUwMDEytjRcXFx1MDAxMq1Bj0JxI+fbL8BLcFx1MDAxMMxQoqFXUoSK6VSSvu9cdTAwMTj/4uSrV2ttXGacKZlkXHUwMDFiLtOt0dZ/6lSDMSiBbmGPMiDAiFx1MDAwNMmJROh+WS9cdTAwMDBcdTAwMTfSe49uXHUwMDE0W0nl4/jhK/i9e6T1S4B7f+N5z5PJRn1mXHUwMDAy1rlAVTtcdTAwMDVBs9uVZMreaVx1MDAxM4JcdTAwMDQ0r1x1MDAxNYS8RtrNf/n+XHUwMDE27jFcdTAwMDJwIKp/YdHj4YqL/Zt79JHqW2dcdTAwMTTwy6u9xFxiV8tSbbuhtm5AxlwiRFxiX9/uoFxmWb7W5c5lziOhM9JAXHUwMDEyXHUwMDFhx8H/NVx1MDAxZXbobvBcdTAwMTCAXHUwMDEwx/g+z6j3purArOBUj2JYNXpHeFx1MDAxYoRcIst9T1hcdTAwMTdj/+2LNVup+i5hfq4uuVx1MDAwMdvc6LLeplx1MDAwNPxcdDqv78z1XHUwMDFjXHUwMDFi1nrtjoLC9PuBKGKoXGJO3y/AeK1cdTAwMDMwKNGkNVx1MDAxOOpcdTAwMDPR41vI/F7pPmBRvY/e5NR9MlxuOqlcXPIpUJulxz9W9L1nXHUwMDA0l/zhv1x1MDAxYtb52l922L+lceKaXHUwMDE4rStaXHUwMDE1OqlN51x1MDAwZW230fe4XHUwMDE2XHUwMDE3onVIuVx1MDAxMSdX3YXqRlx1MDAxYtP9XHUwMDFkIdjpVVx1MDAxYkV2SN6DOt7oue5YZY6NRYO8hYZcImO/XHUwMDAzn4hcdTAwMTFB+ZR0W36WXHUwMDBic/xdR+Qs9l1cdTAwMDdosUqodlx1MDAxMqAqslFJQivMx5ssYd3AkyOMf4Axuylo75opXHUwMDE1ScqPyjnBrz5Ap4RAPnmJP3Gc3Fx1MDAxMUpcdTAwMDG6U+SBOZpR3fn6hoDCJ5TJemVcdTAwMTB5uuWO/Z9xXHUwMDAx9r36UNHSVlx1MDAwMe16efuC1OEjh1xit/KJsEz/6Fx1MDAxNUdUR9PewVx1MDAxNyVcdTAwMWLb5G1iuMZcdTAwMGYhYFx1MDAxN3bHMaJzRYND6y/31eomXHJ3YdpcbsiIYDC8Tafdoo3sbOpcbpFcdTAwMDa/kFx1MDAxZmJK/k9tRWb6Klx1MDAxY/xcdTAwMWOdTvEg5ONC67Ff1zhcdTAwMDFcckknv1x1MDAxYmpcdTAwMTLtXHUwMDAyxdJ7m7GGkk8sLTDBWzqd51/NXHUwMDE2WcvVJVtflsLqXaDJXHUwMDFkXHUwMDE581x1MDAxYVVcdTAwMWJwbsfHwP31YDxcdTAwMDFzt2W5f9VIMZNPXHUwMDEw5X6ua+K5wTJ/cLdjtfHM3laTT1wig/H9XHTv1UvP9st4x2fAXHUwMDE5elx1MDAwN6HyQVx1MDAxZI5f1UVcYu8kJNRcdTAwMTe1O8YjSlx1MDAwMWwyrnFcXGj8S6a0RVx1MDAwMylcdTAwMDLuNVx1MDAxMXTgXHUwMDAzXHUwMDBltvBVX/u9oYWPXHUwMDFlXtc/XHUwMDFjPNEx2Gxmqlx1MDAwMFx1MDAwMDLDnTP+05+EPVx1MDAxNFx1MDAxZE4/XHUwMDA3XHUwMDE0gKdcdTAwMDDDOYhUNnAyXHUwMDBlXHUwMDFl10qZ9TLmYFxcuNhJPUvvb0ZR6X1cdTAwMDVblZeUiTY9M8Hji9soXHUwMDAw1mlcdTAwMTPbalx1MDAxOZFamtC5cd6yqTb9emylV1aSXHUwMDE2TbK12LXJPOpVyUp/+jeizJv45Fx1MDAxY4m1XHUwMDE1OtlEt0dWXHUwMDA0uraQPJPRkFx1MDAxMJSIUYdC7HyTXHUwMDEziyDvetsuxs9cdTAwMTPWjHpcdTAwMWNwnZAzZf7R2MMyXHUwMDFi/Vxyo5wrcndl+lxiutt3hHs7XG5+XHJcbl1cdTAwMWNZf5bpK9bp6thGb5KDuv6hPunHtNN4eetcdTAwMDX5RuhcdTAwMTU1aS98fTRhlsPURphcdTAwMTdcdTAwMTHhXHUwMDExu5Xoy9PtXHUwMDEyiFx0P84+2lhlp8vZKVx1MDAwNlx1MDAxY1x1MDAwNVimfIhcdTAwMDOftk+Vr/5oacGCT85cdTAwMTY/5nfuZqSLrebA6cP4rH5d+dZ/+ySxk1x1MDAxYsxe6nf6RNc+L8KubDZcYleGt4rBWcrAXHUwMDFlpbmuY1x1MDAxZST/XHUwMDE1gfQlP4KjxHDIXHUwMDEzXHUwMDBicjo1XHUwMDEzXHUwMDAyICduXHUwMDFkOHVcdTAwMTAyhbFcdTAwMDNQWypCoYBIvlx1MDAxYvVO/WpcXG+M3l40S1x1MDAxM1tpsSPOwpgzzLFd/adpX2RWu03BPFx1MDAwNFxmXHUwMDFhR9JcdTAwMDQtSyy0hWEhclxu1ez61UzgJtcrpsaPXFzE0Ub57qfcf1x1MDAxYmjyQvNId3X9rsk+je6aQi+0XHUwMDE4XTCXTOOOgW87XHUwMDAw7yfmZ46+M3NBcP2b/Tv4Yo3PwXqY+lx1MDAxNJ0uXulRUTWezJ6mWzhcdTAwMTBTq2j9ozpZKvdapHzdXHUwMDE00MvFZjdbO/02SfyOIKT7XGIthVOjysyFvFxytYL4OPfaTfcog3LZsS7++WNcXCCM8WevdMisfkv2nj83bVxcXG4xJM27uUzHXHUwMDEzc75k0k2TUs0uplx1MDAxZev8xjOzUZC8RjRNbyRcdTAwMTPGYEdpSSRvYoQ993QnOtF0eI/NU7ufvo+S2s5cdTAwMDdMrm2Sn3uWUSB/bPdcdTAwMTGFJ1x1MDAwMlSO/+9Ud6yJtY/KlS7VWSk/rU7gnpN1j+pjXHSB6fLsWrJesL/e+GHx1Vx1MDAxNjRKkLzmXHUwMDBinJaHW77e1418e5anhC1MXHUwMDBiKffFXHUwMDA0lfk3Rlx1MDAwZkFcdTAwMTdGJdpcdTAwMWPXPC0xXHUwMDAxbUNBIYz6XHUwMDBmv9dcdTAwMWaOxYfqhlx1MDAxZe/gq+84XHUwMDE20kCVfPhcdTAwMTe6ovyvhZJcIu++Q95fXHUwMDEysYpcdTAwMGVcdTAwMDLGPL70njeC4FNHw/6VN0LoM/vKLWfaoPdcZlx1MDAxNDO+z8ZcdTAwMTVcdTAwMDdcdTAwMGLdi78tUlx1MDAxZSGXvbSCjPBPneLxbTY5XHUwMDAz4lx1MDAwM4nrXHUwMDFjdeVHVV6dT2dR4ZbwvUTbdKRcdTAwMGWVeCdLXG4rXYHI47SP9i+bLMiA4Vx1MDAwNc6/0/F7XHUwMDEznGey48fD/SxYNYOEjKOPrvu2zWv8IMkj7MhcdTAwMDeAnulcdTAwMWVcdTAwMDTn38fNbb1QLf3HUPD19WZcYqn8bFx1MDAwMsWvwJSkfVx1MDAwZSxcdTAwMTAsrWOP9JZHXHUwMDExrffbV1x1MDAxN7WM/9jRtkx3XodT8lK87XyVYVx1MDAxMl2nfZRld9cp9+1OXHUwMDFi3pIuXHUwMDBmX1xyc5l7XHUwMDAy0Pp618FasX+TyspY1EDZsIc1byuxz/rdNyhcdTAwMWW4ynfum+E70nRcdTAwMTQ/XHUwMDBiju+PS5mQXHUwMDFjb5kxXHUwMDA24UdEXHUwMDA3Kn1kdinbl5TO8TpcdTAwMWTvVVxijpNDVddcdTAwMWSB/dyLvD6wYpec3Fx1MDAxMVx1MDAwMzFApf9cdTAwMTDZimJcdTAwMDdxXHUwMDEyoozQU4tcdTAwMWNcdTAwMDBj6oGO7KBfjqOkJM5rSlncskJSr9C97lvQuLtAXHUwMDBirSBIk1x1MDAxN4Po0bsoyKgppLzzbct0Yv1cdTAwMDDVXHUwMDFiVOQzsKasjkNR5DFmy5TdYJS/41x1MDAxNy8+8UtEpTZS+YEgb9Wk4D5cdTAwMGVcdTAwMDBLe1wiRTPiupNcdTAwMWOUyb9cdTAwMGVT/Fwiz1x1MDAxMrWwREhcclx1MDAwMECr/s5Qlp23JVx1MDAwZWw5Q2ZiR1x1MDAwN3sr54BcZkZJ23mFsnq9XGKunbJcdTAwMDDrzFx0zv1cdTAwMTc3Pi1cdTAwMDPrXCJcdTAwMGXBXHUwMDFj9m5+vd92/ELSOLdRgFxcXHUwMDE2kFx1MDAwNUWM7Fx1MDAxMbp+f0aYXr1cZpWA881tpIewTLTcaplD9Ep37kst6iVtdXxwIckyv2lcdTAwMWZ10CCdS1xifl6FwHVcdTAwMTQj/MHq4LRcdTAwMDb2h9PUXHUwMDA3fahXJlctXHUwMDA0Lu6le6BcdTAwMTDlfT9cdTAwMWGIwoubJoGTVH9wXHTWyFx1MDAwNVx1MDAxY1x1MDAxOLawXHUwMDE1wkwteiv8XVx1MDAxYVx1MDAxNNOkP4hXfMSwfI+xZz6fjVq4hPlcblx1MDAwMIWN0P/6zn9tmC+UXHIlXHUwMDFmydDDnsreRC9cdTAwMDUp9PmGmKxHhZlRbqJcdTAwMWHp0Py06P1o0Z5E7fDhh6ZwZEqnmlxmXHUwMDE2wfF6XHUwMDE3j47Fxqyl+vjzXHUwMDAxXHUwMDAygXhcdFaYfvM99MBJrnE6jTrjsP7pV/1gv6PNPvxSXG6FT2C7XGLOZVx1MDAxOe2UXHUwMDFmrlx1MDAwZifyYXDIXHUwMDEyV7Zl4lS3s6RcdTAwMTnKfKVcdTAwMDalfllf4KuJcVx1MDAxMPqNwVx1MDAxMnjHXHUwMDE5L6Pu8jnoiJLmlPGg867q03DrIVx1MDAxMzelXHUwMDFixu/lx9K/+y+nSuGjM0BrIG9cbnQl0jFcZsv6XHUwMDFhsSRcdTAwMDFcdTAwMDJrgSc4VVx1MDAwYvOuLupcdTAwMTO24S/pcvNVxqhcdTAwMDRcbsPzXHUwMDFiWfVJJ1x1MDAwMTuU9OSrXHUwMDE4TYbqJrT6XHUwMDAx2n0zXHUwMDFkI1bSwzqjV93S43SV2v/aM/G/3jJReHHEZr5I0tZYWz9cdTAwMWF5/knMtjeGXHUwMDE4mm7dcq+HnfI+gII8g1jV/YDewlx1MDAxOU4upVxiO8S0ZDNcdTAwMWLVPy6kn5uxn9PqU1x1MDAwM+kn7mU231x1MDAxZSh7Q6Pe33F6rvBgXHRQWc2fvrZN3Vx1MDAxOJhcbnNvlqaZoMHsW1CkS+pLPdqeXHUwMDE2ZsJjroBLkMt+iW0pnyaiOUGLl7F1NoLIlHVoLzKP3bJCUlx1MDAwZlwiIFGeM1x1MDAxMsBqnvBjQjFcbrzuzzGUUrv0qPZGerqTXCKEOVxm9r+96Vx1MDAxOT9jLbYzg85izP5cdTAwMWVmoVxmx7dcYkZp98XfXHUwMDEzaMs3XHUwMDEwXfOV9NCH1kdaguNRjV6S0+BfxnnYXG6hMJ9cdTAwMTKizatYKPuWOMNcdTAwMGY+vTeqQqvHRopvj1aZc1m98qLac+nrXFxs7Fx1MDAwYn96XHUwMDBmucosxT4mM9qN3Vx1MDAxNFx1MDAxMTnwszmr8omF/sDclmZIeHP9XHUwMDA2p95Sc3C+XHUwMDBiXHUwMDExn6tyXHUwMDExSnUq9+FPL1vG3lx1MDAwNELvJUlsI+hmI5tj+YlcdTAwMTSIjeSKe2rJuMkkkpk0S9HI0MdcIpPifFxmaMi/e9m4hNWPRzw70U97g3bmXHUwMDE0t6VNiVx1MDAwM7fbNFXEXHUwMDFhktvMto5cZk3XNGs3j7FVM/CQ+StcdTAwMTi8UqZF0eR9Z5XU5lx1MDAxMsAgXHUwMDBikVxyezl9hzQxb/vM+1x1MDAxOPmeqFx1MDAxNK1IzsTIP3nHgCdcdTAwMWXtxaKlXHUwMDAxbmS3KW0xOap6inZcdTAwMTGQ865cdTAwMTW26kNcdTAwMWTeL1DzXHUwMDE47VU+sLbdV29WXfCl6C+ZQTRKv3FcdTAwMWRK9Fx1MDAwM7yamKc23TLZVFx1MDAxZYnUukP7XCJ2pD6jMtFccp35z3kxLtNhYY6FkFx1MDAxY4E7OWGyJFm0V09Vh4PJmFx1MDAxYotOXGY4TtLgqIO7x6nvjFx1MDAxOX1CXHUwMDE4XHUwMDAyS+CZ0XahymxydFx1MDAxN9hcdTAwMTJCTVx1MDAwMLP9t9LZaluMnyn8vkvt/Fx1MDAxNK74iMXbRPQyStqsXG7/6YXNPIrX7bbQNzBF6G/Nz1x1MDAxMS0gcrxcdTAwMWEuXHUwMDA1ztPeh1x1MDAwM1x1MDAxNj9cdTAwMGaH0HFcdTAwMGZghTBTeZTDKcFlMeVCXHUwMDFh7GNcdTAwMGJqelx1MDAwN4WwO1x1MDAxZNUxbZupuUCXKTs8yVx1MDAxMlx1MDAwNkwzxyv69Vx1MDAwM9829Vx1MDAwZq5cdTAwMWOWL+za+aBDM3+Moow6Olx1MDAwMqE15YRcdTAwMGZpPCFcdCc2slx1MDAxN2pr/55bXFxcYmSofoLLXHUwMDEx4nw2XHUwMDA0bpXBs4FzNKVcdTAwMWGl9UBcdTAwMTPajrdV9lx1MDAxZkQ8nS6jjYY/0smBxVx1MDAwM1rSyv6Txzv/mmNwmlx1MDAxZlx1MDAxMJtcdGp5XHUwMDEz1Vx1MDAwYtRjT+NccsdhK5XYsfuFn79zkIHy1Vx1MDAxOLeBuWLofKmKk1C35UBcdTAwMDUsUbonrXU70GHTXHUwMDFmXHUwMDFhKG5cdTAwMGZRzD+tclx1MDAwMeu7rmIpsqKcP7NzjSnf/JPD2IWUuVx1MDAwMNVcIvF8bKiyhINHz+O+jXC0Ny7dLCCGxFx1MDAxNXtYQS9cdTAwMWWHXnGXtbokv2dWdvRaIaxm2SfeXHUwMDA0I1XooY1epquAc/z0+LihyEdigfJjXHUwMDBm50zmpC2L8J/cxfqgh1x1MDAxNJzjmXePglpBerRl9KPrsVM53PSuXHRcdTAwMGJiOa/vrUdcdKxcdTAwMTT6ano8Li5Uu2Cq0ZOV2YfGd1x1MDAxOfuhJvJcdTAwMWL8vYJT+TS86KM5hMAtWio6WLa5XFxcdTAwMWSxwMJufvNcdTAwMGZoQsd5Mn/XnWzWtyn9wlx1MDAxMFx1MDAxYXUoXHUwMDBmgMdcclx1MDAxNP1Ne+RcXP9dTlx1MDAxNf1cdTAwMTDLjGOX1ayEeolcYr4r7LlCNbNfr8dcYve56iOYXHUwMDA2nGtzs/usOVx1MDAxYbl0I1xyQOktXHUwMDA3n/c03nEo1FxcJKFpMmF/xqyYTC3EKJuK3C0pRy3ANNtI7SqauZGZ7YLah86mYW5ko+FcdCB6XHUwMDFi4MtDTDboXHUwMDFmXHUwMDA0MpxVoNmEUVx1MDAxZpWSg8eXJFwi7mpcdTAwMTenvWnzPDp1Ylx1MDAwMJFDu6CmQKNRr1x1MDAxN411avx+YT7zL2aqXHUwMDBmZoZXXHUwMDA3t8wglFx1MDAxZjHNt1x1MDAxZZNWMiyS5tXD5tUsj3qAgFx1MDAxYmmJhlOUJFx1MDAxMkR2haSqvFx1MDAwMTRoljmGzCZcdTAwMDHgWmVcdTAwMTZcdTAwMTBcdTAwMTRcdTAwMTRcdTAwMDdp1Yl19nV08u3LtvGmflx1MDAxM0byxVx1MDAwNpf+5Gx+Pd1Rh1SEMCVeXHUwMDE0mH0qIZSIhIlbXHUwMDFjXHUwMDFlXHUwMDEx/1x1MDAxNav27rjAXeRcdTAwMTlcdTAwMTTdj7FEsr1i4vPNVjJRrvxcdTAwMWJ9fVxmn3+dXHUwMDA2Z27M+lk4OENLe9hI0piv929cdTAwMWb+jHFZmuOVXnF/6lx1MDAwMsDhUtpGQlx1MDAxZJgoisxqLrJTKp50q89nXehfXHUwMDA0kHYvvXw0Yy45XHUwMDA0LZbkdlx1MDAwMVxmx4tDz/RcckxWw9s+ns+zTte8pbpQNVwi3Vx1MDAwNFxiyObiXHUwMDAyLcJZUmlWLFxmsW2i/7fmXHUwMDBisSm2kedcdTAwMTLf4VdZV/hcdTAwMWJcdTAwMDZxKYZG36+q47bf75vempiQjbBcdTAwMWLLvZqrebOpI5ZcdTAwMDWVUsk8KvPzXHUwMDFjcc5hWfRcZkOyTVx1MDAxN/Vu+pf+zcBcdTAwMDfAXHUwMDAwsC+GXV+chK/kP+dcZiBVjVx1MDAwNfk9MtXHecaN1sx571/6kaVcdTAwMGZKv20xXHUwMDE4t9dcdTAwMDWG1NZ/8V+Pc4u8vIRcdTAwMDLWm0W5Z26uzdZcdTAwMWJxkFx1MDAxOPSzvyGyJ7Uj7WdcXFx1MDAxNTST9Vntk+6KXHUwMDFm5tSuIyFlNDFdPnxcdTAwMTZ1o1x1MDAwMZPtv/O/3KBcdTAwMTTinLHxi1xySEeMYVx1MDAwMNWF5ThXvplnx0PGxJWmlH1cItFRglx1MDAwMO6ontjPu2tVXFwjJiGD9kXkcu5mKiElbdo2SVx1MDAwN1o0xkqO71D8Uun3XHUwMDExXHUwMDAzPKBuXHUwMDAzXVx1MDAxZvLfXFzT5n2H0iaMOkVHXz2bUlx1MDAxMsxcdTAwMDX2Xs92zchSv6RMx6h0V1x1MDAxOLWkXFxwgLJYXHUwMDA2xLZT4JakYC7IODzotWK92ZTgXHUwMDE5nVxyJa9cdTAwMDan+lYlx4pFvYi3XFxcdTAwMDZQoLJUXHUwMDBmkmyVv05v69ZcdTAwMTdzSn/Gl1x1MDAxZex4xoeQb7LHvdD5tzLhka1cXJqynVx1MDAwZu9zv13ifCQrXHUwMDA1MOrVn8lLNflcdTAwMWXs2POofKVcdTAwMTWoNnw/tMNqqCgl52Bcci892Fx1MDAwMGeDtb7Y1+n9ulx1MDAxZuZtMF7LdHa2Y/9sXlx1MDAxYlx1MDAxOOWvuSZ9XHUwMDE0Kjv+TfebaudXUHxwTYtcdTAwMWZcciSfSFxcYqXaWWNDaLE7PYDykn68Tt/w6SGThrvd87aGXHUwMDA3WX1U03FcdTAwMTNcbjTXMVx1MDAwYos3vlj6dK0vqW5cdTAwMTP7PaNU0tf8nz5cXHdoMPHBarCUSbPPqav7YFx1MDAxYixcdTAwMDBcdTAwMTE+XHUwMDA3RZouXHKxzaMzSqqn6uJcdTAwMDG8RpSyOm24tsHidZxm9in3O/pcdE6pg/RvUjDfqsOcYpCmr9wz0cxwc8hcdTAwMDPenkpcdTAwMTC/c1x1MDAwZlx1MDAxY1X63lx1MDAwNc9v/8SKgDm0/eN1XHUwMDA1guCmUiqSUPLoI1u//fKd+IO5vUvyr29pPHw53U5OW3CefDS131xyJjU6oovORNlcdTAwMDfrdt2IbWBcdTAwMTOBfVx1MDAxNJpcXCG9TXv7ekUoQVr3opjYb1x1MDAxZq70zz5cXG0yKrZcdTAwMTSjUHCcfSOEjvJUXHUwMDBl4Ddux2cz/dyNZ5LGzYFaryYv7YWwtJfVdHVYilx1MDAxYsprRLY7hEpNilW61LKiXHUwMDFkXHUwMDE5nrw/K73/jlx1MDAwMnvg8EqtL75lZT1XpN5Y2T8999LDPbj79zZcdTAwMTRcdTAwMDHrh1x1MDAxMTeCacYuT+zqjvygKVx1MDAwNo1qW/fZJdzm7WFb72Mvm374i5PFXHUwMDFiX1x0sL66oCP0tHXTJH7BQKNLnNVcdTAwMTdnKJFQurdcblpIv8YyXHUwMDAzRbffc8tcdTAwMTe/mcNg4dg/vfU641x1MDAwMrqFmq9hW0nVrHSlwLXXiOSXXG7tr1x1MDAxNKBgvkXMOVx1MDAxNrIgv2SEZ7D6ZetBTORcdTAwMWJKlDqy41x1MDAxNYJcYtLn9PtbOsmxUVxcs0q/w0Q/WOVZSYRcdTAwMThrXHUwMDFhVnll/sn7lFx1MDAwZs3TNWyi0Vx1MDAxNI5CT33F2UffXFxcdTAwMGZyXHUwMDAydSSToyY36ZzfUak7hssoJHOwekF82lwiXHUwMDAx04FcdTAwMTBQpEu6JbJcdFx1MDAwNO9dXHUwMDFlRFwiXHUwMDA3PpPr+CbIu3jdxp1cdTAwMWSP5nb7M76Ov3tcdTAwMDFF7eG1XVaU5Vx1MDAxN2oyZfApXHUwMDBl0DZcXDSdz73r6076r/uk/KWTT4ypXHUwMDE23lx1MDAxMKhcdTAwMWY+XHUwMDE13/K7WFx1MDAwZVxyb2HivaRAWVx1MDAwNFnz60V/R/mt0GUmL1x1MDAwZohOsOakgep8XHUwMDBi5T/75zes/3GegC7TPv1cdTAwMDRu9P1cIp+yIVxy+NihgopcdTAwMWbOi76Qs0Tr2HR2ibHVQtH491x1MDAxNHxOfEtRU4k4XHUwMDE5kzCN7HTuwcQkXHUwMDFjXHRiiLxcZjXAKv1fLFH+k08qxD6DXHUwMDBiWlUlrFF8QP7Zrc5dylx1MDAwNoMwf1DgXrhNXGYxNsK2XFy4XrAphHujOHzwPJvq1M20U3mzKramfEg49yBY2d1cZrXQXHUwMDFm5rDNKTF/n/UwsU+Mr1x1MDAxM5SPNlJogEePUGxcdTAwMTamgcE8jsT9zrB12EAsL+7dRnuSrOD7XHUwMDA0iyeot1x1MDAwM2AxvlglP1js8/19TOLraybm4uV3z1x1MDAwMEiHwNvLSsbGx7t0PNTxhVx1MDAwYo449rhcdTAwMTfyyiH9Z147TOrOlaDILN1sv1xyrVZNXHUwMDEypPnGXCJahHT+XHUwMDAy2mcyOjRcdTAwMTl++28sKK5k8qubOoVcdTAwMGJVXHUwMDBm1kiQWK1Gx8SrPtvM1ZSKLFBlXHUwMDAyXHUwMDBiLbmN46VcdTAwMTTY4f5zjtBfuYNcIlIr/ztWMv3J3Fx1MDAxN/lcdTAwMTZfT1x1MDAwNJ03z0OHPkPKXHUwMDEy4Vx1MDAwZmB8xVx1MDAxNGZcdTAwMWKMzpqJSC5a+ddcdTAwMWH5j6UkX1x1MDAxY1x1MDAxNr3p6O1vduyu0e5cdTAwMWJz/Fm65/rVb+lyuCA3MsUlt1x1MDAxZoLp64ZlXXYhp6fwdJPL5i54yVxcWHy4XHUwMDA3jpAyJJHDOURcblrqXHUwMDE4bdo6XHUwMDBlpN90KDDkfEIsY//p51x1MDAxM1x1MDAxZs26kN9cdTAwMTlV+1x1MDAxMdBcdTAwMTRcdTAwMWZcdTAwMTN/Ns9bhGKRXHUwMDAwouS/ceTmXHUwMDEw0UZg6mwvt7HjsYH4hFtoZVxymjarh6Mt0ENcdTAwMWOS9Fx0XHUwMDAwSFx1MDAxYvd8/WaqP2dLXsdPxNw43ScoelVdb+dnXHUwMDAwqslkPCxlXHUwMDE5aJNnruyrq1x1MDAwZVUwis7crJnCm72BKKkutP6ww4yUhaj8ltzw0DyceO3w/duz+ONcdTAwMGJ/epQ2XHUwMDE1YDoqzLe0mHF0c09mqcnHmFx1MDAwNDdcdTAwMWPt2kTSrakooY4uv5QrjjuMw4U2abNcdTAwMWON0JxxLpLgXHUwMDFink7tQd6Rja5oI7KBmndcdTAwMThcdTAwMTQrXHUwMDBlqb1RnlwiPFx1MDAxZZLh/6m3XFxcdTAwMWa5SlwiWabBXHUwMDA0KqHyTavZ41x1MDAwMmHZiopteECTS0k1SJagXHSrUPtcbqp6mcRgKtPa9ZDlZb6Vy7tHJMr3p0S5dFx1MDAxOEU5v25cdTAwMWaSZ8DGOJWvPkFy0IGcySP4qVx1MDAxZS7+v+f8hSVLer79vtRPhJaf4iN3qsOialSc0WAn9fhN7uUqTFx1MDAxZaJf9nhcdTAwMDaoUsZcdTAwMDb/XHUwMDExbt7fXHUwMDEwp0xcdTAwMDFcdTAwMWFWvnnutjdcdTAwMWNAr3beP3GDjvL/zlx1MDAxNOksNSxdnHpcdTAwMDDSPF5cdTAwMGaWc0BdaX+4pfJwSytS5eK01Fx1MDAxOVrqXGJcdTAwMTLaxa5mMnL99mPfWypAXHUwMDE2uWLE5lx1MDAxOaM4XHRKpEbhXHUwMDEz/9Yn/lx1MDAxNS+38d86qn6khVx1MDAwM3VzueTtM+z4V87mZz1/XHUwMDA39C5I/vIgXHUwMDE04DZuqUv7XHUwMDEw/+xNXHUwMDE37Ie7W5hf6JCN4KtSiphcdTAwMDbYb2XD9ddcdTAwMTndRCfJT9xM+75ZTjPyI/ErdPQhSDpHsNXc3CRcdTAwMDRC6FdP6a5cdTAwMTcuOUVKNkBV817fjK1hX1x1MDAxYzJcdTAwMWGYPrd7IVx1MDAxOb7Q8Gr5J88hM1x1MDAxOPNcdTAwMDY0i3xELkJ9XHUwMDFlKulT7fSMq75cdTAwMDBIV7NxNlx1MDAxM47Ie3Um1GooO/OQn0Ex9mWTXHUwMDBmoVFWi9DWXHUwMDFj20ZcdTAwMTm6hNjCtItsMFx1MDAxYVp1XHUwMDAwM1x1MDAxNoSmrD2EPO7tOW3KUFx0X5OQ8IdnmJX4aLNcdTAwMDJ/WEO5oz3ga8RSKktiXHUwMDAzXHUwMDFhL1x1MDAxOPCqaf7NY7yVbFHWjURcdTAwMDZ6rfdWL1x1MDAxZmFcdTAwMWVya+uCQrxgpPF8WCW9nXjkpNC/fSExXG40zTNdSsV9eFx1MDAxY+YmPVx1MDAxYWD50i5KTD9frYXnqTFh8vFnX7Tv/cVr4WilNzBcdTAwMDfuZE5K/542/z2tU5CPXHUwMDBmz1xmXHUwMDExPkPMMS+i0qFSXHTd9CNASeaZ2sD98UxyXCK21UROelx1MDAwNdL1i/g6lP24XHUwMDAz0Vx1MDAwZblcdTAwMTaGXHUwMDE5WODMo1x1MDAwM7w2UVx1MDAxM3+PY575t1x1MDAxZvXHbc08RvcpptFd6WjNmE7k8ruabeGqnPa9ZOyDznHB22BLNVx1MDAxY2/9XHUwMDFkXHUwMDA30lx0Of/57ccsXHUwMDAz6TDKin/nS/g4Xj5F8JBRhHlcdTAwMTa3u79cdTAwMWZJjWRcdTAwMWY43X2AXHUwMDE3iv8tOMuoXHUwMDBlf0xz42kxV9crqyPd9EGpMVx1MDAxMWfi6lBcZkE6VTtuzuhv1EXRbFx1MDAxM97PnUD32MeM83niyI5cdTAwMDHoXHUwMDA2rvuoOa/4pHcorTe8fXPPuDfy9tP6h3aDiyHHQfTM8udcdTAwMWOsleWPlfwndyqlurG6UuDFMvx6h1x1MDAwMTKkfHZcdTAwMTheQtzrfWVccuhOwjwzylx1MDAxOVx1MDAwNoxKpHD+yeks8oyk0I9vYFxmq5YjXHUwMDA2ej3aXHUwMDEzf2Ch/lx1MDAxZFJxPPHwXHUwMDE2XHUwMDA3i1n+7qPkXGJOrlx1MDAwM9Rq/al/RidfXHUwMDFm/Y2g+OfWeVSMqKFfXHUwMDAz44DmVPSptf/tb0DjRlxm//DZWEfyyKP7XkWnkc1JuoSTSJrFXHJfwlx1MDAxY3r0YVx1MDAwNlx1MDAxOI1cdTAwMDKAclx1MDAwMXjYIIv9n3ipn/yhbXpLXlx1MDAxOHe4XHUwMDA1ZFx1MDAwZW9cdTAwMTDrujCQpa/MfFx1MDAxY5o8+20rn7Dutl2X4iS4XHUwMDFjcVaCVTwl81xcxFx1MDAxZX8gjP0u5o2oz9phrediotW1aorvm6R+bKpcdTAwMTZcYmZ5LVx1MDAwZl79U1x1MDAwMymrIJJ6mip9OI9WpIb3nd6u2SGUXHLVXHJHalx1MDAxZCMwNHpcdTAwMTX5XHUwMDAzRMHKXGJiK7pcdTAwMTgjXlx1MDAxOVunX8g6v/v1XHUwMDFlZnJ/iYt+XHUwMDEww3Zz2olQ9fu3b+NC3kH0wK1cdTAwMDGyZaHemyrt2d9pQ25cYn7c4G34RVxyXHUwMDA25Fx1MDAwNibUMzdXgziGZ2f6YrRwLrpuqYU2ZvFcIlGJWd0th/rwS1x1MDAxMeKs2qpUZ6RjsjpcdTAwMGJcdTAwMDVaa8lcdTAwMTGiXHUwMDFlRtOxXGa8jtjPXHUwMDFjvaBdvesrlctKPVfcXHUwMDFhspD6h8+qXHUwMDA137HxWLSvXHUwMDAwyk1S5EszcURcdTAwMWR1tdF34PBC4+vMpVx1MDAxMVx1MDAxOftcdTAwMWPJ+4dtesaMJGbwJrdtX/dcdTAwMWMp2+CJU4Db1qNBns99K4llWdCij9SxNjFimFiHe1wi61T+nzxcdTAwMGL+YLX+XHUwMDAwZjVd9FpGRL3PjOorykdfLs9P/+plXHSlzGhslOZFML1cdTAwMDBb4PVH0FxyXHUwMDAxmlx1MDAxOCiAzihcdTAwMWHqfTBeglx1MDAxZWvLsKJBPuTzXHQtXHUwMDFlXHUwMDE0vEruaJVcdTAwMWZmpy9ZOP9wXGbnf1x1MDAxY2O8TGSD1+TFXHUwMDE2XHUwMDAzn545N2isVrjv053CT52F3X7SutdcdTAwMWZcdTAwMTk2YZS3cEN4vSuaXmCTt6m0y3VcdTAwMDKHhnt2umbd6IXjN76GMlmuLiH0K3J+66JZ/L2nvMbamO/PXHUwMDAwouSellx1MDAxN41cdTAwMDSi3/tcdTAwMThlM+qf9TOo2FxisU9cblxmsVx1MDAxNGHehVx1MDAxN8HJtGluVFLOpEzfRpUqgGpKSFx1MDAwMJrEZLp7XHUwMDFjWD6OWlx1MDAxY5hJ84D8XHUwMDEx4/r/XHUwMDFmj4vOXHUwMDA0XHUwMDA1sJUskH5cdTAwMWNtXHUwMDE0rbb+rvg2SzjLTb/lblTRw1x1MDAxZuFh6pKZXHUwMDE5psOIXHUwMDE2zlx1MDAwZa+wQi+jp19cdHDO+rKecqdR7EaHbyxdXHUwMDE2gfr2cDvjcCY1XHUwMDE11IerZjqydVx1MDAxZf89X936S/vB0JnBpT6vXHUwMDA2V+VTyblcdTAwMTJcdTAwMDVq19avrOtuwu15kuN2XHUwMDE4Zd0gWJYumZEhXHUwMDE5m1fDMmOQXHUwMDFmv1xytPOuXHUwMDEwmtcr0+7ufP3bXHUwMDBmv+tNXHUwMDAzqoZcZjzKoyq97TEs+f2nr3JcZvjD2DjnXHUwMDAyXHKpXtLfuTGI/sB9R+HpLmWj10m4bj1cdTAwMTYkXHUwMDAxWCGjXG7/6J7/R9V3K8iqLNl+XHUwMDEwXHUwMDA2WpmF1lp7aE1cdTAwMDGF/vpHnzvnzjxnXHUwMDFivbtcdTAwMWGSjFiCioxcdTAwMDBJmKituYBcdTAwMWHNpY7uXHUwMDA0Q1x1MDAwNj33uYacslx1MDAxYUtcdTAwMDKJKdzfXHUwMDAxe5IuXHKku/pcdTAwMDB0rk+2gim2/1x1MDAxMVee6uacxuIhXHUwMDFjTSW9k8eRYFx1MDAwZrL2x6C61ZM2V1ahPmpah3CCMHFQr1xy6Mw1d2ZcdTAwMWblrHXQn1wiXHUwMDBi0eNccnzCXCLWu301zr1cdTAwMWKcXHUwMDAyrpZzV6KGX1W4fp2/+Kve+PtcdTAwMTefyFx1MDAxN5+SSIi+Ov334mTHdVv1Mtfxh7As3T7WM6FfPXwrJFx1MDAwZqKhdlW/lKeby8iateVIO7GjNNP3uODu6Ygw0YNbN1x1MDAxMFx1MDAxNZb8d0Rp4kx0s+zMsVx1MDAwMK11KvTfc3pcdTAwMTQjMyv2I1x1MDAwZq9bkVxmJX38ef3SXHUwMDExsmLTR2s2q1fTWWKVSNdcdTAwMTmL1Xd6vfc/qZph9ydbfPfNnlx1MDAxMmlSXHUwMDAzTSRccne+SYx1eVx1MDAxNl/FL6fvS0Hx2+L4N2qiYc5EysK+xqjl/+1cdTAwMGLD/viDJXf6o24zaT1PcmfgqyV9c9wrTkdRpLChXHUwMDAzkpozLV+Dx/zzc4v83Ho+foVfXWghfORFRICU7GYneXdFM7Oh8jBzmVx1MDAwM0BcdTAwMDXUQE6+P1x1MDAxZrhcdTAwMDGrcM9SnTr5XHUwMDE3n+Y/fNpJ6POSNas8XHUwMDE13KxgXHUwMDFmXHUwMDA2yb6X6UvoTZGZ/aBoeKWRXHUwMDAzUXlQXHUwMDBl649cdTAwMGXm7Zavq7aAMX5cdTAwMWY/XHUwMDE4fLW+2eKGW/2SR2hba4meXHUwMDA0dfntJXU8XHUwMDBmV5Su80NcdTAwMWRcdTAwMTCRjoy+qP+dJ1Hb31x1MDAxYZOC61x1MDAwNSqUrlwi2Fx1MDAwM0Z9o+EtXGZiOr7Pys5f9VEraaSCfdD91VkvXHUwMDBiNLpwRc1ccqvHfFx1MDAxZOq2b1JcdTAwMTJS/DV+8sZrZ2m7/8JcdTAwMWUomaph+r3rXG63XHJcdTAwMDH7w4F9PvhEQzXkb+3Zz6n9Xy2t7Ti0ZdtHfqVcdTAwMWZcXCjIfLE4fzbVq0pxvYhKsYyfKi5Fhaqsv7Kr4INcdTAwMWFbXGaqqeOJzJfvWLOTo5COsNXMoWBcdTAwMGJmP/3rdWPw/uhyXCJuK6t13t9pxoXq8tOGOn6c/H9jvXi5eOqpXHUwMDAztuKB3s6fY+LUkCbKJbiE8iVf5P8kemgkIftcbpeGXHUwMDA05l2v2r9cdTAwMWHZj9qBXc+APvkjd8yEI63z8GS4XHUwMDAyQZ6zx3OksNY/V1e8N42VY3eXdkXx4vd4Y4dg//tuYPxnXHUwMDBmgI5s2S5Ct1x1MDAxNVx1MDAxOeP0zbsqOX8p8K7DdFx1MDAwYt+ti8k9XHUwMDE240j5XHUwMDBlPnSd+YxY+7Wqeevdv1x1MDAxN3hQs1x1MDAxMFfG74u60Lu+cmqmiHr76WflxXAuij3IX1x1MDAwMsujSuG//SNtxEk/6aXA5cqH2TiQkfRZwVx1MDAxOYmydFx1MDAxNUIuXHUwMDA36CVcdTAwMWXsczbg2HmlnPokr1x1MDAwN0t62vLoWyBcdTAwMDJII0RzfkNpccB5odtcdTAwMDKr3OJHjFfdgmFY6utcIrRj8PcyxeLUQ2f/P1xm16RXY1x1MDAxYXJfXHUwMDFkRLxKXHUwMDE4RGmwXfi+44PQ8qjgvNmQt+1cYphFXHUwMDAwlIraLy/HVSM/Z9azZc1af7U2Ob0uXHUwMDFmME/4Q1x0I9xKuZBSaIhgUDvdbu56k5eriSVmj+y7b4H3+1dn6p+AUedcdTAwMTEqtFx1MDAxMlx1MDAxZMjKXHUwMDE3rCyBjuQ+NLpP11x1MDAxMVx0oFx1MDAwYjox9FX38eVx3p2Nye+vPkC2zG+NXHUwMDA0Oox+V/Z7u+UrQIujqGLTL1x1MDAxNMG7nfCvPoL4pJ7QKkOCkDOWiF7PTKesLr9H5+r/rctQ66UurFx1MDAwMqpcdTAwMDZvQsZyrmRWLknV8vZBXHUwMDFiXHUwMDFmbq66WIZcZo6k+FxiiDTyXHUwMDBirFx1MDAxMnyJXHI5dL82XHUwMDBimeb4/dRcYlx1MDAwZehIgZbqXGJ2+lx1MDAwYnVG1PSl5Fxyk4qjkJTvhePo/7tm+F3zXHUwMDAwpip4s1x1MDAwNUJWXHUwMDBiT6RcdTAwMDdu4jZSUCglU1lC66+kZofXoZmLXHUwMDE2y8RgceLrmVx1MDAwNmVhPP0ooFx1MDAwMlx1MDAwNThFQ/M0XHUwMDA3XHUwMDE4u11cdTAwMDb6pzVcdTAwMTg9uO7PmMSaMj2IKH9ki5nyaNlmXHUwMDAws3ws/U8vs9PC/mq4KmJcdTAwMDGfPcp+x3r4yd/58+WwwVnYg1xuxdWn6V5cdTAwMDVcdTAwMWZPwLeUVspj1+o0l0DWNu1v4lx1MDAxZFx1MDAwZThcdTAwMTP0rZRtXHUwMDBibdiE0mApPYCAS1xiV9PwuPaKXHUwMDA0Z8qUXHUwMDAyZ/59fctcdTAwMDLrXHUwMDBmLqTW6WL/9lxyvnmiXHKv+PVcdTAwMDJcdTAwMThidNVcdTAwMWJcdTAwMTSkVCG95pulu+LVpFmbaMZfzuy5wMifLz14323I+9zeXHUwMDAz/a9ccuRcdTAwMGZNNzqXqa97XFyb8yjBw6nzeZH091UruvhidNKIZsJcdTAwMTb7wMWX7pH3XHUwMDBlbWlvU1xiP/63XlFxXHUwMDA1W1x1MDAwYmVcdTAwMTFHQtd3XHLgkmnrSljrY1x0/O97o1x1MDAxN776yt5cdTAwMWKqM1dmYkc0mP3SSjRcImJcdTAwMTZ6XHUwMDBianDQLK1rriaw0OCwkYBHKuJopW7Y816eslx1MDAxMlx1MDAxM0jFecTblFx1MDAxMuGnXHUwMDExrn/L9/7e2WmBvFx1MDAxM75cYtptNoLWdFx1MDAwMHawk8YldCbgvFx1MDAxOdZcdTAwMTQ42l1cdTAwMDHqx2knRiM+ppXh9U/+gK7+oEdO5lx1MDAxNCasfvZcdTAwMDN3sqGcL2ieMIVta8s3SiRWqf+YSltYY9DELje24j0m68Q73If/tza9q8OvW0DYQ1x1MDAwMd06Qlx1MDAxNqPBLbImR7dv/F+toCfzae5WI/15vUc6UkY5XGZcdTAwMDHm2t/zttYjyq7QvF1ftM7yt9+KaFx1MDAxMUPQXHUwMDE4JOXfsVx1MDAwMdq9/N5zVMHdeVddVLHN3DXKf2s22e/Sh6/+bFx1MDAwNJtcdTAwMTAnR9m7XHLIfyrmjPhrSZm0Vufv7WxsXHUwMDA03iDRgM3u1Ltfomjn9z9VmqrlRT1cdTAwMDTklVx1MDAwNJNEk7f7Y3/FRVjcW0jWXHUwMDA2J996dVxueE4/tTh8/2vyMltcdTAwMGLob5BZKUBcdTAwMWXoYUgukJix7vJcdTAwMTRcdTAwMTTFaEAs3L791NhxQrhAo0emweSel3RcdTAwMTBwUlxmOpR9vVx1MDAxZa9cdTAwMTBmc5bPXHUwMDAzPF9cdTAwMTYkZ9CRligutYK2bnTPf0eSnLTuWaffZ9tGUfZ/ayaWr/PZ4p6UMnTNxFx1MDAxZFxcXHUwMDE3XHUwMDAyoVx1MDAwN7lRcrfY75Qgx0NwNXJ62cG+LpbO8eKxRNdcdTAwMTCm7K+n8XT9VCeCWzxS2L/65JEmZrqIb9mLIYPuaKBccutcdTAwMWP74Vx1MDAwNvnl/0/NeWJnpWZcdTAwMTJRiVx1MDAxMqhcbq5Autpb1FxcIJZcdTAwMWFcdTAwMTRsRe7N8MGe33/vXHUwMDAzu79GoOxfXHUwMDFksmIlxOlk6Fx1MDAwM0v7hy6fXHUwMDEy9ICcsjf7NcFb9UPQ78jmKOq++pg62rxjS4rZrK9M/+91g/e6irlBzjdcdTAwMWTXpfskXFx31jNcdTAwMTjisMdE2ezZqPGa5mxcdTAwMDKxU5Ym89xcdTAwMGUhXHUwMDE0hCE7l6lxhEqyi6NcdTAwMDS392lcdTAwMDRcbriog9FMXHUwMDAx5FwiTrZcdTAwMDRcdTAwMWLXdfiqXHUwMDA2JVjZt95cdTAwMDTqXHUwMDFjlXzUXGJ7R/+fXqhaqVx1MDAwNGyA9Vx1MDAwNGxcdTAwMWJt5Fx1MDAxYeevkU5cdTAwMTPYXHUwMDEwPENcdTAwMTVNXHJRc8/EOKqW7JdPynPLNIRCwDKwWmHagPTB0c232+Ny2GtGLGaLXHUwMDEwaXJcdTAwMWZcdTAwMDD0JClcdTAwMDGt7XGTibvAZFwiXHUwMDAx6XhcdTAwMDC0PHfk3z5d5lx1MDAwN/lsIbZcdTAwMThCRU5cdTAwMWJSgFx1MDAxNJ1cdTAwMTBcdTAwMWVSpFI1XHUwMDE12zg75qCfXGJgcFx1MDAxNFhRyVc9XHUwMDAyktSGa8L1l2lVXHUwMDE43+3Xi2XAqa+JcH269//g6bJcdTAwMWVcdTAwMDDBjOpcdTAwMDBcdTAwMTnwICa+XHUwMDEwl3frW1x1MDAxYSBcdTAwMWbBPdl/cV2OhUWQcuJKy+ZbinnkXCKbXHUwMDAx7698tMqgJfKxtH+HXHUwMDFhYiTAvfm5nMu+JOlXlJxcdTAwMDRb0TIgvqB3WFx1MDAxYuZcdTAwMWWPXHUwMDFjL1x1MDAxYZhuI5pcdTAwMTGRkXQl/TGel+J1Mjk3rVx1MDAxNah8VGjgM/Anup9cdTAwMGLyv+/ZX1x1MDAxMeHiLz1cdTAwMTNk/kJcXPY9RHJcdTAwMTiKKILy+HzoNTgx845cdTAwMDaaJuPzwLG/flM7flx1MDAwYtMhXHUwMDA3jIJp4HuXPWpcdTAwMTPJeuLg4dg/XHUwMDBiM0OsJmaIkYyMXHUwMDA0I/NcdTAwMWVcdTAwMGZxzHN4jsOIvP5GsXFcdTAwMTd7XHUwMDE1JELG7L+9ZV9/Jngr1ifgVbz+mVx1MDAwMmB6XFx39luTXHUwMDAzhapcdTAwMGWFOnKP03dWRMNAI6n4/EK4++1FXHUwMDEyZV2gs+RW60ZcdTAwMGIt91x1MDAwMLw5XHUwMDE2m0l/0VpcdTAwMDEtpPmixGMohuWVj5p4zFx1MDAxY+hcdTAwMDO6vd5B+lx1MDAxN9PtXHUwMDE30/9qSOqFgv88+MJcdOfkwr8gXCKrpiRcdTAwMTg3n63+W2edmIg+MT5/s1x1MDAxNEis+pzkXHUwMDEzy7LAXCKnVcKFcE05XHUwMDA1aXfiX/RZ76uaz4t2R1xmS35D4Fx1MDAwNO/QZOLOXHUwMDFkKD9cdTAwMTD/bZ6uMi5cdTAwMWK463dcdTAwMTi0J75cdTAwMDS5Llx1MDAwNS15PVx1MDAxN9DgOI2/bn+rctmqjNepVFxitlxmwfI5JfM1Klc/ukQ5mN1cdTAwMGbky4qodpvXsn1cdTAwMDLiXHUwMDE2QDhcdTAwMTWznZ/zu8+83Vx1MDAwZuKiMuBSl0RUiP9cbse/Xlx1MDAxZe91d+HXXHJlt1x1MDAxZlvqXHUwMDE3st/T2pGClj3jf23ff69CyUj81lnmpuMgoMRcYlxmVOJcdTAwMWJpXCK0TJFcdTAwMTVAtHBccnrUXHUwMDAyQqy4xyR4MPnc0d5xXHUwMDE1SsuQf/61fy5/q3pSn0ma/Fx1MDAxZWS0f3kkyL3FTIXuWP7CXHUwMDE12lx1MDAwNlJ+hTrogEGYX7G3Tkk8ONvk4qqYXHUwMDE2XHRcdTAwMDWaXHUwMDAyx8BMPeff6Xz4MoKqn7ctKFx0XatRXHUwMDE1XFyIzaKzNVx1MDAxM1x1MDAwZZCz3ELz7dk6eMBcdTAwMTJw/I68d7Gyrbr/21x1MDAxZlx1MDAxM/m4TNokaLnRxWvX6Fx1MDAxMilWgETCyd9rSJfHpMdxb1x1MDAwZVxcd+TjZlx1MDAxNU/dXHUwMDAyw1/gLSjIwMdzm7klfsOtXHUwMDE17EUqS9XDg/6Ij6opdrrJunFaXHUwMDFhXHUwMDA0SZnRv0ev/OcgqNRCNmpST/jv12d/c/k2/0fOjkTz2nlcdTAwMTlcYlx0XCK7QFx1MDAwNcV9L1x1MDAxNbBcdTAwMTdG8FOXk1x1MDAxYux5tLNJJc3k8n/TfJdgh/k1/k04W1x1MDAwMk7Wttm1RC64odXYXHUwMDAzXHUwMDA0yEx7vk0ldFx1MDAwN3UzXHUwMDAxsih44lx0OkflPpjUqP+3R/aI/XuuVUtjWNROSLL/6nnkvflmfTZcdTAwMDNjhaQ2QHOWZ5jFJOzx4bqpt90qXHUwMDFiXFxcdTAwMDKAQH23Zazmp2fTj1x1MDAxZLU2XFy7x65leIey41x1MDAxZCrsq5DCR0iDs9hcdTAwMWPAMnKVePz3e9V/apn8ney8wNO73q+/wohcdTAwMTP+pyUjXHUwMDE3sid/0WEvjtRcdTAwMWTG6VxuI6WnnGYkfypcXEzdXHUwMDAyeTGCXHUwMDE49oz50lx1MDAwYqbs6KdcdTAwMDV4aCbfh+kwOJnKh1hcdTAwMTDFkXCWyPFHrFx1MDAwMdB74Vx1MDAwNaFAUqjWvZi/JPlvbXWpKC+v/0g8cGndfFxu9HUwzzGtcILtrbarY7mzrqSZT/n3tbuqKbTpXHUwMDFkkKs18npFXHUwMDE5r8NcdTAwMTldKeWDXHUwMDE2VVEqhEOzroJcXL6S9cfviz6SXGJcdTAwMTidjFvtjIRcdTAwMTfCaGDTT5wk/+tVXHUwMDFibPhIYiSg+VJcdTAwMWWVnrJcctXhLvHrXGIs0Fx0fiPCvzlScVxmjMLDb57qoFxmhP5mXHUwMDE1yJ3Y7EO2tP/6Wcc22Vx1MDAwMpS7u5fu28Xw68Ms02bWXHUwMDE3xlxuJ0C8XHUwMDAySECUorNogieR4teF/Cf+RYt/bdJt//C57Fx1MDAxNlx1MDAxYYxcdTAwMTC0xX5cdTAwMDDs9oVcdTAwMTDlpFx1MDAxMTuWrp84koz4TSvzrIPOd1x1MDAxZa9qOH9nssZ/o1x1MDAxMVvTWc8tO1x1MDAxOFx1MDAxNkQoqNWsXHUwMDAzT3fgR0x0rbn4pF1nXCKRlPD3Llx1MDAxZTht8b/F5Nxfr5Sd+qBBM7xCaSrBc1x1MDAwNFLQ5TXr5aNcdTAwMWNcdTAwMDZ7eVx1MDAxYcelnfbjZXc/8Fx1MDAxY1iDXGbpXHUwMDEwqlqmpP57vfxXjH+H2MMoXHUwMDEzw5VcdTAwMWVYS1x1MDAwNuS89/pcdTAwMGYpqvLrsTBmcqST0rnuXHUwMDEx+DInXG5blv5JOutcdTAwMDFJXHUwMDA1UirVeZ9cdTAwMGawXHUwMDEyXHUwMDEzQppoXrlumaB6r+s3e0pT+2vbVmpVra7jrm3Tbi13dEExI7BcZiZcYjb4NYt55thcdTAwMDFkXHUwMDA1vO04XHUwMDBlzOTCK5OFeOCG21M0XHUwMDEz9vtcdC37XHUwMDBlLek3QmifrraxXHUwMDFj47tcdTAwMDdehlx1MDAwNtA9Ql9cdTAwMTL2p3JfcavIUDjgoP/cn3nrXHUwMDFmxSUtroTD8DqyXHUwMDE3OFBDwDNcboOQmc9S5MXMnzp4vChfnbNcdTAwMTlOYVx1MDAxZJJPmVx1MDAwN5B8XHUwMDFhI3tTYtWUszVcXCrYhWtNgX22SunU0kyRMD/bb9XRXCJcbp5cdTAwMDRJ1bdcdTAwMTHeLsB0OEzvqedd+Wf7t7ZcdTAwMTFmMEaVXG4pUb/+wb3AlH1huGAwtTRytbZcXPqzV0Qr14ebzl47OayGXHUwMDAyZyU5xZXwtuKjTNX4yiniwW86vs/06k3AfFb74CFVZFxmuVxi1Fx1MDAxY1wiXHUwMDAz3Ou/567hXHUwMDAw8DcnXCJ2UFx1MDAxZWPYcW9DXHUwMDE1/f7PXHUwMDFjMcGN/56HfCr2MeWvb0Ct9OBhVI/xV7CqXHUwMDBmXHUwMDA0TY9/XHUwMDE4f4cwKlx1MDAwNmdfzacp8N8gkTJqOMDiXHQ70MJNuljv/Sx0pJZHWD9EYE1NXFxcdTAwMTf5zotcdTAwMTbTTTvhRFx1MDAwYsJcdTAwMGa4i2/gUX9mS+Cfpf3+7yyzQdu6gdtY17JKLJGqPCfRcKXYL7BS06/OPtqQwJwjVlx1MDAwZvHsVreU3Fx1MDAwNZyCdiasY6BcZuM38LVdPpaRJlxydlx1MDAxMOihSK8+bdu4wuBKlZYtSn738lxm9WyoudhcdTAwMWW9/1x1MDAxYyi2cFx1MDAwM/BccpTpa/6rUbRasSOZXGJcdTAwMWJ6lukpQY4lnJdq7OyWPdt1XHUwMDFmXHRcZie+uJLoVDwybHhYz4dcdTAwMDAmZFx1MDAxNVx1MDAxNkdDXHUwMDE4yfw1wetcdTAwMWSsXHUwMDFjpj1cdTAwMDc7UcKa0Vx1MDAxYmixZtKPc1x1MDAxYuTroufAXHUwMDE4eP9wRY+lXHUwMDA0ajzSXHQpo9jMhFhcdTAwMTNcdLj+mNF3McTGZWz/tFVcdTAwMTiEPDCDz5MtXGJcdTAwMGa/vqs7UUA8XHUwMDAx0WB89KRLXHUwMDE1+WNAm3BcdTAwMDfOXHUwMDA2VJDF3SpZotP2mKmZ+fVa7cBLdPApn04zmLH10Fx1MDAxOG540yPv6+D5gbpWaFxyXHUwMDFimFx1MDAwMuvUvdNH9oBcdTAwMTZpK1x1MDAxMFKauK9cdTAwMTaOvsL3/Vx1MDAwYml/y3ssiakkpUe469PRkll6KOyfd9glIzevt1x1MDAwNjt2K3AzdKPqU/pcYoon201cIlxyaud4pPWHZl1e8nG/XFzt5nz+XHUwMDE5iahcdTAwMDHcn5RZXoeZ/vpdXHUwMDAwLsKQm93TXHUwMDA2ekGKmHO7x1x1MDAxNpzXj4loYl9I02Q+IE5cdTAwMDVz5eSdNSrEiN5G0po66Fx1MDAwNVx1MDAxOVx1MDAwMjSTwzxkypZdo1dcdTAwMWJqg0Hbl4r++vg8XHUwMDBm2a32tJfgQb+eXHUwMDFmeN7f+sttbP71993PkFx1MDAxYVRKjluzX3+AzsOciOfzSVx1MDAxYudjSF9Qup9cdGVZkdqbTyl6Yca/2Pb9O9tCo67vf1xyu75M1uNccnc1fai5Ok2pNLz0Kp1cXPZcdTAwMTkuooA2ed5cdTAwMWGk8KB/dDclWqpujIiHXGaKWZ/e797t3kvFW+CF7b6A+fPFI1x1MDAwM9+1lsuTmeRnQVZ3XHL5XGKRfz9o7qP2LrwsXHUwMDAxkilbXHUwMDEzQr58XHQwlcDjPLxg3Vx1MDAxYkjScNhcZrTxXHUwMDBlcEqOkVx05OR6k1x1MDAwNI9cdTAwMWS3ntNgzGxcdTAwMWJrTYnrXHUwMDAxiovngrXbzm2YkzmFrE9cZlI9XHUwMDA2XHUwMDE0eFx1MDAxOZpkmIDFXHUwMDAydn9un65ntqzbYUo8l/spOMJQctPWUearcrBojtIq8lx1MDAwZpw519WbWZZG7lx1MDAxNOjG4Da8O1xm3lVvR/vAtlx1MDAxZoa8XCL2jWrzs9+3jqI4Y39cdTAwMWZrXG730N7HcXiVXCKrqKNSo2zcQyzHv6FoQ7/TXHUwMDE3fE61yacmhfrjW1OlQ8m6MY5cdTAwMWL2WIM8NCdzRG1cdTAwMGJn336BX6f5slHZOybrs96fnZlhk1x1MDAxONBcdTAwMDT8h33dsFNt32BglpjH8pGAOikxOoRp/NNBXHUwMDFlt3W+IJjfQnxl7edWXCJcdTAwMWajRTcnzcfDzqFH/0qhXHUwMDEyXHUwMDA3SOWbV2v/XHUwMDEz/Y6w6qouJKjqr9QpXHUwMDE3cq2pfpxcdTAwMWNcdTAwMTKjSlRn3SXy2SXnWWeUXHUwMDE3YeY6KeLdXHUwMDBmVqvwXHUwMDFmQrjRO6TXj395nlx1MDAwMb6mx1x1MDAwMlxyNyRlu1x1MDAwMvB88lx01jSqnkL27lx1MDAxZT8u3nF8XHUwMDBiXHUwMDAyXjZXXG44Mawjx87gifjI6WYuwK7ut7yZ/2JzS1x1MDAxM5fBs5YqRuy6XGZNmfXL/nUps1wi8OCh+ELJQFx1MDAwMC1iqr2PmmdxXHUwMDA0bmOiSVx1MDAxYpnurkdhQTqKd4bVXHUwMDFluGD7XHJLW1Cr/IZm5u8moaRHQ4RlhSTwUM28XHUwMDE3+lx1MDAxNpdDpVx1MDAxYYvAzjK6sd+M3lJcdTAwMTHHK3j1NIJbXGJcIjHLMkJ5XHUwMDA1TOWQcd9cYoYzK86a2/JcdTAwMDK4I5VXuKV9XHSI/PTKci7KwKniwXErMeslwNGnSCRdd0phbOVv1nhhf5vG3UaZN1VcZkxcdTAwMGLdXHUwMDBloi9cImQ1TGWPMDjImF3K9UhcdTAwMDB8XHUwMDFkW0Lmni/6XHUwMDFjXHUwMDA1M1lL2Pcpgs1oVGvg7TJdYr73YVTGMfpB0O+7rYs3pd2YXHUwMDE4empm6kyifsLxW2XXIet9aPeL9s/1pd0xObuY8u9cclx1MDAxNT9rilx1MDAxYlxuQFx1MDAwMLhb4d/nXHUwMDE3322DiE+Iz1x1MDAxNcOuXHTLOlx1MDAxNeXQQ05cdTAwMGWIpz9cdTAwMTZcdTAwMTifUPA63aGvXHUwMDA24lRcXGRbXHUwMDEzXHUwMDFiejmqpd5cdTAwMDDKoPN5t/aDvEg1XHUwMDFhm1qjpLv5i1x1MDAwMVU8XHUwMDA2SudcdTAwMWN0lFhcdTAwMTlcdTAwMWGFVlxyvODut2dJWft0nzVcdTAwMGUuP1aj6mWAXHUwMDE4aYaQO33/lq9HPWhYNKRcdTAwMWSw00o27X6UXHUwMDBli789y4iV/LWsxSb7mU5cdTAwMTJGhp588lfXUlx1MDAxZeOAhGKJ078xszDoKn0/XHUwMDEyYkeEXHUwMDFmdc5dklx1MDAwN19PXHUwMDBiol/4qOaPxiSZXCJ7cqXdglx1MDAwNO5cdTAwMWboySZUkWpf7Vx1MDAwMFbr4Fx1MDAxNtBFN+2ynVx1MDAxMJk6KMjFSub7sb18XHUwMDFk6fRVxPKHUVx1MDAxY17wjXPYe/65Xlx1MDAwZl1JfUuylLVSKEwoyUQ9wDRcdTAwMTNcdTAwMTVcdTAwMWP6ZKfkXHUwMDE0SS3Kj9gzXHUwMDAxdKSDdF8zUEf59UyVxsNcdTAwMWKbx1xcK2nGmlLdkd8tXHJcdTAwMDJcdTAwMWOGMEaOQFx1MDAxYvRXXHUwMDA3ZTPqXHQjXHUwMDA3XoDDK1SWhKpcdTAwMGXazklcXCz/ylx1MDAxM1x1MDAwYky8XHUwMDBlXHUwMDBiXHUwMDFi7vxya7qH2YXuWzanVMuYUT3Miqyx53YtKZAljNntXGZTrZ2EO7+jkMFcdTAwMTQqXHUwMDE2KsPkolxcaqCnruDaQlx1MDAwZUDDvbLqoJa73N98099PgDamL5Wr0COHOVx1MDAwMWKUw9vh/2q6xm1Jx1x0m3aFUZ5SIPErU1x1MDAwNjWu7uNcbqdMcTJvKW70pIZ8oJJxmO+c5Jpkp6ZIjDTwgVx1MDAwNVhATeuBrm86bo9ogY2zLD8jm7kuXHUwMDE2i2JRf/6s5JdMQYeI12SVbah5tu4ztq58bDH3yYbQXHUwMDA1/KagrvqIXqKKKcjMxlx1MDAxYSpcdTAwMGJ808HIXHUwMDE05ZdcdTAwMGWKXHUwMDEzXT55mqJGn4TcJnxcdTAwMWPLXHUwMDE4t4hDT0tKdVx1MDAxMZzC1/CBfI7FkNtcdTAwMDevJOHmhlx1MDAwMb3UXHQrXHUwMDAwanCTQPZsqiy0pdQ016XWiqBcdTAwMTTmafWS0Mkn8eFcdTAwMGKaXHUwMDExv4SiXHUwMDBmbOuGXHUwMDEyXFyk21x1MDAwZtVh0jFccmJcdTAwMTlcZko5pYJcdTAwMTMpjct6iHsjXHUwMDExYCiOUnmu7ULjxVZcdTAwMTPrbWTfk05cdTAwMTXug0FcdTAwMTZQJfnwnIVcdTAwMWKuq9lcdTAwMWXnXHUwMDA0WYdTTIRyjuDwZHhUI7PM+v4pXHUwMDEw6TC8dD6dXHUwMDEyyjqeXHUwMDA2Lp822Fx01Fx1MDAxOFx1MDAxYvgvwGv811x1MDAxMp/L4HJ0ur5m41x1MDAxM1PAbZFcZiiUV+jiXHUwMDFiXHUwMDA0/ZKfs4ttVMZY+Lp6689cdTAwMDC0wFNeM1x1MDAxMXlWzVx1MDAwNmsrL9hSUmTijZPi2lx1MDAxMlx1MDAxN1x1MDAxYYBzNjSBJdeX7qCyOfpt/NHGb1xydGVcdTAwMDO/XHUwMDFkT3irM6w0h1xibjFpU8ufi1x1MDAxMHZcdTAwMDdVXHUwMDE39P3s0SbF6jpIQFx1MDAxOSyKsOecelx1MDAwNeG2MnPH3a57u8D7x8bjXHUwMDEy1Wuw5cGjMGfk87xPXHUwMDE46sxrkIBIXHUwMDA0XHUwMDBiOEye6IxAfi9cdTAwMWVcdTAwMDDheGpcdTAwMWF3ikCRhDFcXFx1MDAwNodcdTAwMGauKeuj3iW+cizR5DdLXCJWXHUwMDEwR9fN1XPgXHUwMDAw6b3uy3/H51CLJNi8ld0g71x1MDAxNnhcdTAwMTA1pFx1MDAwYtepQSGnXGb0wb/KkJJcdTAwMTVe4nIjn17YQ1x1MDAxNTxcdTAwMDN6f5uxXHSHk3c0uy+B816VIY7rXHUwMDFjM1x0TDZf3N31L1pcdTAwMWN/7V/2jTen15YxXHUwMDBiTeM1XGZHmCWTsEeEXk/MS4OK0C6tviM637hULVx1MDAxM9Eo7+vEiFwiWOUk7JvF8l2hTG4wkJ5hjeJI1fHugqZDXHUwMDE41TPaN0/HdUfuwzJHTIbyOX10Q4WgXHUwMDBmb1x1MDAwMfvzw7SxWVJ095wtz5NmXHUwMDFmg7X2z6zAWqiY8Y7Rk8Qno2qiz8JyLqbSuVxyTWFcdTAwMTkx9cuCeFJDStRyj1x1MDAxMWThTXP5v2EmXHUwMDBm8cEx8N3tKWng3ZpcdTAwMDe3l1x1MDAxM2NhXHUwMDBlXHUwMDE5yH+jPHeMNoOzXHUwMDE0ZjWlXHSvlFM3WEf3a1x1MDAwZb/Jk9Pfs+P2pzmkjSimxLpcZlaovydcIi9cdTAwMTTISCFaLIVcdTAwMDSVXHUwMDA2p69cdTAwMDX+VcOWXHUwMDEwvtlI7qRcdP5293Uw33yeK1x1MDAxNXq9RmCMReRCQKw37n3oo/eyPePG10Um2eBYN1x1MDAwMqRcdTAwMTEuXdTjq1x1MDAxM1x1MDAwNaPfXHUwMDE4O2GrerY0XHUwMDA0c2Q7w1x1MDAxMi6555Cbh3I7XFzdJVx1MDAxNVx1MDAxONSEJO7KNjL30pnY61/txNK6uW7IXHUwMDE12v1cdTAwMGJWXHUwMDE4MopIzTNcdFt05KuChXUxuy/sx9gyMFx1MDAxNb3jncJqXGZcdTAwMWKQiVxm9mya6lx1MDAwMM9/9UrObOKJkuRccp9m9lx1MDAxYVxuV8PLcp2UqiVbXHUwMDFmmKeeipvYL4ncqajbw6GJQ1x1MDAwZVx1MDAxNqHkhUEtcuipidDCsMk1XHUwMDFl9cbHc4KdyFx1MDAwYjKsXHUwMDFmIO3GvcnLhMO/LkBcdTAwMDdr3SDQffV1RL9SVVx1MDAwNzE0QTxQRaA4guk4VNpccotDXGLSilx1MDAxNk3vvcWZMUNB8K+8JqInXHUwMDFmkVokrZii9PWStlx1MDAxNWfHnI5qpFx1MDAwMF2e10rG7ddIlC7TKsuzXHUwMDAx4OeyXHUwMDA3j2FWnlCfWHL5rlx0l/D4cZJcdTAwMGZ8XHUwMDE3ZCPcoOxcdTAwMDBqbmaefKo0U+F2+lx1MDAwNWlcdTAwMTS06bBcdTAwMWNwLD3HUN751rltw92JtyT0k20nZXkgXGKcXG6Y0HsvfIXYbcOA3XJcclx1MDAwZvH1M3ToXHUwMDExXHUwMDFlKIBSx860YllM4WlEp48qjJF63Vx1MDAwZkAhTXbl/Nb2UN/Gg1x1MDAwNFxc1zr33q+pQn+wrDLDs+GUrFx1MDAwZvxUnPHXXHUwMDE3XHUwMDE3OdflZzeAmcpupHcut6Unc7RtXHUwMDBleqzDj0CAqFpcdTAwMDGDPaBGsXMoXHUwMDAxXGZaS7akMFx1MDAxZFepnIAgoVqRyCgwYt6K6pdw8E4n/77jTP2L1NNcYsJcItV4fuVcdTAwMTXvK51E0MTb7fBSpdnO2Nwon9BcdTAwMTE8j9plmLFgzr1nOEde67lcdTAwMDEvWzpcdTAwMDeLJfmLcsPmRnTdWPDYXFwxa6eDPOYmXdMlXlixQHb3XHUwMDExmIxMfOrhZFx1MDAxMCFcYmZcdTAwMTVZ11xytlxcXHUwMDFiXHUwMDEz3pzzxs7aQn9/k8jPjnHeM5GGa0/LjnmEWj/vs85Xhqcm5HxwwL9cdTAwMTlcdTAwMDPjq+XMtFJwdFtqukI3XCJpLCuNIz5cdTAwMTZcdTAwMDBbXV1Z+6Z/h8Z1RJinXHUwMDFmRT+vnjY/wrtcdTAwMWV4/KjBp7NcdTAwMTbmw1x1MDAwN1+1s7mUmWFcdTAwMDIvXHUwMDFlZJsz6TadvfU4ZZBBuV2F9JyJsWJcdTAwMDWD/Ko2bPnsfNBCbEBgk5hzRMxdXGa+QD/bmyy4XGb3W/psZC7XW+3NrbyBVVxm25XEjmTTqH9RrNOn59h+xCnNXHUwMDE4XHUwMDE0XHUwMDA05zWmt+8vmlZ8XHUwMDE2f92Te88o+Z7Iz1x1MDAwYmSox1KHR1x1MDAxMNvqQ449aNKHm1x1MDAxY7acRXejQyFcdTAwMTeNY9czsLxfx2W9flxiLvaFRJvqXHUwMDAxXHUwMDFjmG+mRZiBRk9iXHUwMDAwzVxyZfCJtlx1MDAxZIY38SrOWt4kO1x1MDAxMuy647HVoagmikr6keZp5eKOStGMXHS1jShcdTAwMTGXZ/n+937CXHUwMDFimz3TrjwtyXFPfVPsszJv7kiY22fFbTFxXHUwMDA1RFxc4ITkMXhWt9CLk6bqdD88rk1TXHUwMDBlOs7Nsfvuff3hXHUwMDBm2Kuhb0Hv3lSpNItV3IBcdTAwMTVpeICazkNJbOsjV2xdyNLWglx1MDAwNT7LXHUwMDA0WEPNuVGlkt8sXWfBV+aiT4PWXHUwMDBibVx1MDAxN+wt0M9eXFxcdTAwMWNcdTAwMTNN0PZTv5BcZm6ISV9xqvmruzDT8PluSnFcdTAwMWY/sKNcdTAwMTNyz1x1MDAxMIiM7Fx1MDAwNlB2qY+T11x1MDAwMX1cdTAwMTYhS0PpZ6JQXHUwMDFlmbTgT1x1MDAwMfpYKlxmYWf5++uRI0zhXHUwMDE2XHUwMDFiIY5ItJ9r8vlaO0fH4KFUizVFLaLctirAO03RXHUwMDEyc2FlYIfYUVx1MDAxNiiwfbdcdTAwMTiJXHUwMDE0PFJcdTAwMGXN/fX8UnZao6g55LgrUIU8muud/oJcYsTyei7galx1MDAxZrmGXHUwMDBmeG2DXCJ4WSODd4jOQ6hvbt5+8zsm5FNcdTAwMDRcdTAwMWSLbl36LjCtPkJcdTAwMTbH59Bcclx1MDAwMUtYWlx1MDAxYU6LyYLKJOdccmCXI+ZcdTAwMWSRg+RRMvrn+IrRcVx1MDAxNoZcZj6WR3KLr1x1MDAxOVx1MDAwMDQ906LdrGlcckMvN9aZ/LUt/Z7FnWUm42gpXHUwMDFid5aPr/D+m0uWI6shjpZ3RFSeMv5sXFxobzavvyqxWdlSttRjTlxmalx1MDAwMWj6tVx1MDAxZt7+OzOPcDxjPsu1f8k123vTIGPEXHUwMDFhju+1UXAp3ZYh3zmqSlpEXHRFopcyQao1XHUwMDE4XHUwMDExXHUwMDExjDY89Fx1MDAwNE1+iJ89ychAcmA821x1MDAxNYdVXHUwMDE2P5HG8dcmXHUwMDAxXHUwMDE0eMzLu/Q3XHUwMDFjKlx1MDAxM3yFy2GxZISTlz1cdTAwMGXQuOexeVUxXHRHulL6ZjSPkUJcZt1HfVx1MDAxM8U8XHUwMDE1QTl/tS5HnjNLbsK+MXXJp3LPXHUwMDFhj1x1MDAwYlx1MDAwM+PEmNMvXCI7fm0ndatElj39pJqXXvhcbnNcdTAwMWRZtHtXttU3X0escFxmdsRcYkGDzVx1MDAwMelcbohJxZOMRqNI1TJcdTAwMDFcdTAwMGXkXHUwMDFh8deDXHUwMDA3P2M6Okf0XGL19zvEMqZcdTAwMTHElGdI+igjN6mCLjWy8Ik57kuToH+T7to4XHUwMDFmjugjtlx1MDAwZr9cIkT5V11cdTAwMDXUMSUp42eJw6mvrZLvX6VtIafhXG7xXHUwMDEzzLvOuf2Xyze9MUVcdTAwMGJlXHR4lDurWL7BRX9f5ylvpqQyg5Iv7ECuXCLj5C7i4za4i3DKPYKAXHRRSz6jo/rEmO42XHUwMDE1XHUwMDFmyMp4f4roXHUwMDE3N6Q4u+BcXDIra08s1bdjnvh2XHUwMDFmv0wjskS3mYwhQ7tcdTAwMWKoKLBfyKf1XHUwMDE1S1xmX87fc3DmhS9fTyuo05LOLdx3r7PSf1NeQW7Lez92N55DalxuYYcu2uGMTJZcdTAwMTlcdTAwMDNl4jqrWHlf0ZXYv4ROd2nZU/uI7F50KvyznYmneOnAc03dblx1MDAxNlwi41x1MDAwZWOGQlRcblJ0ZMlcdTAwMDQ+fCNMw/x9rlrSWf3wmVx1MDAxMLDGXHUwMDE3gSyJxEQ239/V+UbhV5/ih4ftsNfmez36VdB/Q1wiNOI1RfzpbahcdTAwMDNcdTAwMWK3vlx1MDAxOFx1MDAwMNtlh1x1MDAxZSdOv1x1MDAxMzxywaWf/X0/XiFcdTAwMDZMXHUwMDEwXHUwMDFkXHUwMDFlruP+3d/E9FlcdTAwMWNcdTAwMDHH3P+sZW6BdeEsXHUwMDFkXGbPgGu3+28yS/VvXHUwMDE2gcDSjGDbQr7GdTF9z1332tx1XHLH5v1lKMdUm3DXOGFcdTAwMWUudKamXvy46Fx1MDAxODG6gtS43Pj+yIVcdDhr6M9cIjV77TNOJevalHttbXrm8DFcdTAwMGZJZD3Eu7nddGOmi5Ny8lx1MDAwMYJcdTAwMWQ/1csrk5RcdTAwMDbQssroeVRcdTAwMGLmfFx1MDAxN+8p9j+zsdJau+GeXHUwMDEwo+m46kJwXHUwMDE09j7SQWwpxO9zxbZ8ZFtcdGJqYovbxM0/ZNiFcFx1MDAwYp1V41x1MDAwNO62tlxyKXA/S1xcOy9SVE6j4f5cdTAwMDN0xZVcdTAwMDJcdTAwMDM14UBcdTAwMDZkik/cfe5r7CZ99KXQwXhhh8tcbuhcXFx1MDAwYpslyzrpYVx1MDAxZpFdnqZrt3/qZFx1MDAwMsdnk/haWPTpXHUwMDExPVx1MDAxMlx1MDAxNDuwX2MyXHUwMDA3w/U4XGIoOya/zFx1MDAxNHjQMiGF21ZcdTAwMTCHRqxcZldw9lJ/rrihQlx1MDAwZv+T5Vx1MDAxYlx1MDAwZtcojNvOcY6NmFx1MDAxMo9Ia1x1MDAwZoVcdTAwMDP6a/9f9lbRXCJhh4rR1MkzXHS6VlxmXHUwMDFhI940SFxmcLJ7Y8pFQVxy/mZnLl3NToP6XGJcdTAwMTAwSU+OXHUwMDFhd9os9+jSRJ8y3Nf4lHb7q1x1MDAxZTpccuEjszHp84ZcdTAwMDCFXHUwMDBl+WuHXHTXj3/KnJfj1L7Cl/6orHhbNVx1MDAwM2m1PoJcdTAwMDDbJvgzPc0+YdRKXHUwMDA1uPlcYjvCkJ58IIZik/hdXHUwMDBm9sXLXGaDlVxc7YBX/OpId4eOylxcfFv/n/qW5aM3Q7dcdTAwMWYkXHUwMDAzvkx7NKY6pdvQ5HgwfLmcML5cdTAwMTn2+0/fnJJpSPFcdTAwMTYgg5aTQIjP1ICcurpcZmlcdTAwMTGJR1x1MDAwYr/+o1x1MDAxMuNvoFx1MDAxMmlcdTAwMWXxPl4tXHUwMDAy3M6vzVlQXHUwMDE5b3BcdTAwMWXfXHUwMDFiipRcbvpN3Vx1MDAxZHP/3npt4e6EXHUwMDBij/WMoP31OViwMf4sXHLU6a8n3FJg2zCLwTmiNqL73IvlvJnvpdr0m19RsdqQxFx1MDAxYd42dZ7OK0rWzlx1MDAwYnbFkLg4bPpULyf67NdcdTAwMDPMXHUwMDE5N6u/foNomcE2SVHxV1x1MDAwN0UvsLN+5cZnSK5cXGaEhUQoXHUwMDFkvMvwTihe2bum9u2fXFzLXHUwMDFmkrXrZlfxNePCYJ8uojjSbNeCZ8ZcdTAwMWZ7wb5uyFx1MDAxNdo/JHKjNjItm7PXQaQ2kFGx80I0X0hqXHUwMDE1Vu2o4l6HJY1cdTAwMTVcdTAwMWbkwPG7iVx1MDAxNslcdTAwMTL7sdSwg+uG/+OPlUnVf2ZcZt7sXHUwMDAyelxiPZNcdTAwMTluSeXtTVx1MDAxMS/cQykxXHUwMDBlf7afWv3JISNRXHUwMDA0XHUwMDBiSVxulZScXHUwMDFlmUGmMMk9W6+q5H/E69XIsPq9+JuFM/C92DZ6n1x1MDAxY5Rd1rKdXHUwMDBm9tHZzV8/XG7vfPM1W/cm01x1MDAxMiNcdTAwMDf6nFx1MDAxY6zuRFxyvITQ5lx1MDAwNVuOXHUwMDBiNEV6xdZcdTAwMTlcYsRJ9E6diFZcdTAwMWR/gbPqmaXZ3/tcdTAwMTH/7of9yTkrv7x7l23+2vXM8ojKhlx1MDAxZU4oZKeAzlx1MDAwNuJhXjxIfrY8XG5cdTAwMTC4gDyOi1x1MDAxZK1YTpvvPa6VwuyLmVx1MDAxMVx1MDAxZl9cdTAwMWXk8KOG4JWwXGbeQXFcdTAwMTVcdFdSllx1MDAxNYXtXG66Jll03NtA+P3rXHUwMDEytWFdOzZYXG649rlcdTAwMGZ6XHK/XHUwMDAzo5+h+plmuKj31cJ/9VuBwn54Xak7Tfz10TFfhudrRWw0xqpjtc5cdTAwMTYvPYJZvPOfWlx1MDAwN4YtXefA0cXwXHUwMDE0WJVXPZ9UpVx1MDAwNLa4YymBXHUwMDA29yGYNXhcdTAwMTjgnJYuw6TBbFNxTLlhz0034lx1MDAxZmVcdTAwMTFcXC444/copJnYXHUwMDFiLPnrXHUwMDA29aCc/vF0XHUwMDFk+1miXHUwMDE3sn8zclx1MDAxYpklSofNK8CycZNfX1x1MDAxOVx1MDAxZfHOWPtV7vxEqiYs7nNcdTAwMWF+OVx1MDAwZtTamnVkL6c0Rkw10HzHszVZ59pxXCLnuIPZviRjol1JXu+s/ePrto6USFE4KVD1XHUwMDEwmKBOxqnLq7B0XHUwMDE0y5DplOWvtEplf8xcdTAwMTDRWkzPedxGXGKidy7UOlx1MDAxNJmvqoQheEdxRFx1MDAxNiCYlp2TKJKkzEk4XHUwMDA1oWZcdTAwMTI4WE11r3n9p2dmbkPsl8RSdflNrzPuO5rMuOakOoz/Ovg5+vutsZraqHlcdTAwMTWRYCyZ9PFcbmh9sGZwooydKcSN+FxutvP5ajaPsz5cdTAwMGY/gdFSRVx1MDAxND3LY0qU98aPxl43vOPEJzBOXHUwMDFkyTdaRrfSvVv8+nVcdTAwMDPQXCKgeVxmXHUwMDFkYKR49PW+8Ss4cdmcXHUwMDE3ySZcbpYodFx1MDAxYUNNXHUwMDBmxdP0XHUwMDA3UnrwqEz9XHUwMDE1T4yZXHUwMDE2XHUwMDE3m6pjd1x1MDAxZNxcdTAwMDBJSWn8XCJBRYvRLviC/+ZcdFxin+XTplx1MDAwMVQhX3DzuVfJXHUwMDFmm1x1MDAxMV9cYuWOgYi0UcOcMibBs35NXHUwMDA2lyF/Y+qkx09eopTlXHUwMDAyXTDROpzv2HjIi2XGXHUwMDAylPrdoVeajOimWVxmXHUwMDA2tlKp67jA7JElZqTlXHUwMDEyh9P8NFx1MDAxMFxma9BbL5NcdTAwMWRxx204sOyYXHUwMDE54E65xtiYvfdXTlx1MDAxZqtNilx1MDAxYUS+5prPwlx1MDAxZm96XHUwMDE2ZYtM2apnNVx1MDAxY1x1MDAxMUpHT71kY1NcdTAwMDOJ0lA7a44mQr7Ws4bilOTlW/ys+sHaneFcdTAwMDdtSo1o9426iFxmlumhTbj8XfvSSK9/mJNXqptPgi6is5NdjVNcdTAwMWG4XHUwMDFl3lx1MDAwN7JlueY5h2Vr0ISWuXdcIip1dI9/XHUwMDAwzlxmM1x1MDAwN1HVlmjVmlx1MDAxYnfuTD8gbKyIn2cx7MmuMpLr0u8y8Zp2NmJcdTAwMTjGMr5ix+vlz2Ldw9nU+7fqvixcdTAwMGLaq0ZqVEW9lCFL5kpcdTAwMTIyQYpcdTAwMTE3aS6n+m2nevwlXFyq8I5cdTAwMDb5MIbwn1nSxWf2kDrgSqy0qlx1MDAxONc9ck3Kn8Gh3Fx1MDAxYaD4JbOh2m+1XHUwMDE1Nmpwd9CGXHRcdTAwMWZKMXNcbspcdTAwMWJ+TIYm1sJcdTAwMTSPP1x1MDAwMiSLY1r4XG7oWUjxpCmUd320b6/kXHUwMDFkziZcdTAwMTO4Pdhb4pNbS2KC0sqhLr1mI0n0v8E4n3drJUCKXHUwMDA1Pv+r4Uo+f+22XHUwMDAxXHUwMDE50MemjUdtLT9cdTAwMGWl6atcdTAwMTji/rtcdTAwMTUsgfGFt4NcdTAwMWLoVzuVYahcbtnZU5bH4GzGoVx1MDAxYoXKOdDixvJiepNnlC7hP+O+XGbyy1x1MDAxNDalxXtwX3qI/EHCXHUwMDA0v0sjLetKnl+4xlx0OVx1MDAwYmyl/tVxXHIv9j3ao7+YVbUqNErd32lmSk5tWnWZ7Vx1MDAxNXavR2p92XhcbnRDXHUwMDAzXHUwMDA0rPOGluT28T6KXHUwMDFm52W2nydQ26zhp1x1MDAxZvehqNFTXHUwMDE5YvuiMShh4pWHwlx1MDAxODuZ+OaVb+JcYn45v1x1MDAwNLdXbZODN61cdTAwMTbT37XfOVx0rLNrQpwtn//My5hcdTAwMTjFTm0qTlxc9fWx9FmMXHUwMDEyXHUwMDEyguyTY19cdTAwMWZPd7mWrshcdTAwMDVcIsPSwoc6XHUwMDA3wlx1MDAwNnQjzVx1MDAxM/OLKVx1MDAwZlx1MDAxMb3RQ36XvnWJsP7xVNt7uMh3XHUwMDEwXGLc/dDhXHUwMDAwPXxps7ApXHUwMDFl28M3jvFcdTAwMDQliNY95zRcdTAwMWHid4lY9lP4XHUwMDAywU53Pz7GJ/2baTnXju7OY6hjz3pcdTAwMTG5XHUwMDE5nZaQXHJGWapcZsKqXHUwMDBmSX9cdTAwMWWYXklcdTAwMTGiOSwjksbQREp0X9QsSnPiRJd4XHUwMDAx+viaPrSGeVx1MDAxYZzPX38+PfzJlG5ltpLY5O9cdTAwMGKeSYAnPVx1MDAxZMF3uD0uWuk+klj9mpC+XHUwMDFl4kkuhLXN8Fxcm9bSwlx1MDAxMN+noIrygspcIobrKLzdwa595t3Cj1x1MDAwM1QrXHUwMDAxNEuieqRcdTAwMGaZXGbZI2PayklcdTAwMDLdmoSpi25cdTAwMGIk08O8XCJWXHUwMDA39eJFY9zUr1x1MDAxN/zcZrDDcWt/SKbE/fGZ2DRYh1x1MDAxNzNcdISsiDk2XHUwMDEwalxmc/6nh6zjczg/jlx1MDAwND2Xf1x1MDAxM1x1MDAxMVx1MDAxZWFWXHUwMDE0hMyZe0BcdTAwMDZFVpBcdTAwMWLya1x0tF/TOK9cXOxcdTAwMDKppD1LIUOiXVx1MDAxZXiuWkXP1Pfp8rKsePbub2hcdTAwMDc/LrZFoT9ZvUs0XHUwMDFmVnx5XHUwMDAxtWZCXHUwMDA2UuOAXGLKosFcdTAwMDK0RylWZFtWo+FcdTAwMTUlj/x3jnvjXHUwMDE5XHUwMDBlJz/xb3ecrDJn17KwdZKTvb6wclxyYnbbfJ08b2FqOIgh8e8ondVcdTAwMWO9bpfYPlBJXHUwMDEzsvvR5aUzXHUwMDBiKbVZSVxuwFW8SoCVXG7IQ3xcdTAwMTNb6Fx1MDAwN7FJPohcdTAwMDK4nFx1MDAwZVwigmck3otnXHUwMDE5XHUwMDA0QcTUNre2l1x1MDAwYmh//qRTkM9j7qSAXHUwMDEzMEglZl+mXHJcYtr7pqR4pGTc5FZzQ+aWJdTjXHUwMDE5xjF746eC4cKzfX3rv8ooy7bn6v3UmX+t0Fxyr4BzzFR8mFx1MDAxY+JvcVx1MDAwNcWrk1x1MDAxZJorn1x1MDAxZiFtj42iXGJcdTAwMTJcdTAwMWZcbuyyv2q7f19+jY1P5fD2ubA6kWY1+MSEXvGhS4pcdTAwMWVcdTAwMDPBMFx1MDAxOKm/XHUwMDE1XHUwMDFh7IIwXG5cdTAwMGa6gHRcdTAwMDCrXHUwMDFkQlx1MDAwYoAkKMHNXFzpvaKns59cdTAwMDWHPlx1MDAwMmafTtNfj3HDMW560v1g0lZu7vnuXHUwMDBiNVsp4k+oXHUwMDAx4Fx1MDAwNDJcdTAwMTiaj6Djks01XHUwMDBlg3hcdTAwMWOy0pf5TM7nZFI/5UuZbO5MjLCGxyO/patvOTdw8ZBcdTAwMDVaWvlkckX111x1MDAwMlbVjlx1MDAxZehTXHUwMDBletdcdTAwMTA4Wm3X7aL7yTNcdTAwMWai8HdGwbhcdTAwMThcdTAwMTY6gl/96rmnQVx1MDAxZpOhmVx1MDAxZnmQJL5T7ydd0ESKSlx1MDAxZj7WTthcdTAwMWP63sBcdTAwMWHItlx1MDAwMmPGxF1cdTAwMDQ1KW1Y8Www3nDz5IhcdTAwMTG2XHUwMDFix4+u/5mLRbBcdTAwMTdcdTAwMTXqeKu900qZIPJcdTAwMDZ39JQwXHUwMDE00UxbZmF/++BhXHUwMDE1iIauZ1x1MDAwN17nYTRcXO5vVVx1MDAxZok0YYA+6Tl5SDEm4yv7+fumQFx1MDAxMI3RrlR5buGumIDPk/BcdTAwMDYq8YdpbN3GjWRcdTAwMWGlXHUwMDA2e/EoXHUwMDAxKG9dgC5cdTAwMTDWXHUwMDFl8Y9aa5/9a2+p2MRcdTAwMTFbL2Axer/74fP2p+2uaVx1MDAxN3FQR+ep8KhXrbvfavT3r//VsVx1MDAxZIs2y+PAXHUwMDFkqCet2Vx1MDAxZVx1MDAxY5n5eDeXk0ZcdTAwMDL/0FLifsVcdTAwMTfQIUa3X2XwWpRcdTAwMGWmv/uRdHrk+bSFwsAx4zss87dcdTAwMWW/3lx1MDAwMjbjXHUwMDFkMjzo1omdXFzo6zmKxHSeq3rZ7dX8/GdcYoSTeW2TNkvWX62ggqHWXHUwMDAzglxy+iVcdTAwMGbZuXGCxJdW+TK1ythieYJe6o1cdTAwMTDN4iyOsnZLf2J+UW6G5jF3TP146VGy+TtCvFZcdTAwMDG2XGbToPdcdTAwMWW6QcVcdTAwMDctavrXRVx1MDAxMGBEyLZQml3N11/74lqqU0ZdrJpjeVlbdlx1MDAwMjdcdTAwMTU4t4O+mnBcdTAwMDCYlTM2bpx8JTV6suEwp+eENmtcdTAwMDNcdTAwMGWeaTq6IUBcdTAwMTPO2fLFfu1acV9cckXMq1x1MDAwNIV7YjS36XR05d1cdTAwMDSm4rG/m3dZZ/uFcCdcdTAwMDZM4VKu5/vgMFx0XVwi87t8eH75ulx1MDAxZrdwknmNfZfAS92jQFx1MDAxMDBcYjO/+XyvTDH9+odMhvCKNLmZXHUwMDE38yj9bFx1MDAxYqOK86tcdTAwMWW2yqjtK8JZJofwMXSXqLS8nlx1MDAwNFDsW1xmfmtGzjOfnt9cdTAwMTVIie6StshcdTAwMDXlRFxc6SqMViz5z7cxfpnDzyYkzb5cdTAwMTDHNeSehu/JXHUwMDA00qaVemRcdTAwMWRpXHUwMDEzuo9L1N+MbXJNlEqISTbzX61X/7Gso1LYXHUwMDA34j6r7fhcdTAwMDIniGOSKclB0/mYXHUwMDExXHUwMDEycDR4mYRxylSJK77P4Fx1MDAxNpkz3ilkTYdcdTAwMTPxXGZA/GwvXHJDdi3vyqtcdTAwMGJ+QrevKdH317uGXHUwMDFjpcEgteh/noGYRi/xQq9ZXHUwMDA1K/I5XHUwMDAxqEBvaVx1MDAxNOPMSZSggH76YetcZnzxNrNcdTAwMTR69mS4XHUwMDAwUpDpXG5P+Vx1MDAxYi1PKj/Dp9z7yyeCj826K5+RzEb1QdFFV8pcdTAwMTJke6mnXHUwMDEyXHUwMDA0b1rBPlRLUKPD2Fx1MDAxZDiWtiBxlGh0dctu6ZtgYVx1MDAwNUtUk6/r0VpcdMCMXFyX56XGtKFKzbphtXcj2F6G/rpf7Vx1MDAxNkO9UMXzb4TmS+GSi/xi+Ktn6++AZVxyVopcdTAwMTEhK5Rtd01f0WJ+qC3lXHUwMDA3gixwXHUwMDA2I56e55qOq2HEr2PImICW8lWCy2imalx1MDAxZFx1MDAxZLRgWFXIj0OFuUruaKpcdTAwMTJO5MxURV5bh+0ybMPJOLg3+5FytLGmSfBcdTAwMWHQa1ifhM2i6Pp8jVh2eX83aFx1MDAxYizkIErg169cdTAwMDXmXHUwMDA0VGVcdTAwMWa8ifmf3nKCYrMzXHUwMDE2XHUwMDE4XHUwMDE1hOrzQm2+YKCdS6bDaFxyXHUwMDFmc+lL/968njZcZnO/1czdQLlcdNtcdTAwMGZcdTAwMDdJMPuhaCbmb55kKI47wa7FjihLoY1x0XdcdTAwMTlxPCdcdC+2u/bx/E/auCTT0q2jv+Ipxz4spJWdzb7YINnW0vgwXHUwMDFh/aiXmYJKf3KY3oqEolQuXHUwMDBmijJcdTAwMGZY4PQhXG7H/Vx1MDAxMM9MQlx1MDAxYphP5fHE67S41961/tR/gNefSzR9wj+yOa/Xa7r1pdz9Zkku7Hfyh1x1MDAwMJhnXHUwMDE20bHEW1x1MDAxZc1cdTAwMGLTZ3BcdTAwMDD7pXtsXHUwMDFhL1x1MDAxMVx1MDAwYrZQV6cxLcSEXHUwMDExuzLAjWNcdTAwMThB6jchjVx1MDAxMq7nm8TiYe+z2dHsXHUwMDA30KqOl3hvd22dXHUwMDE5XHUwMDE4bfeOZadcZt9IdV13Y1xcYCQ2XHUwMDFlyv1ig/v5okXrt124XHUwMDE2Nv8pSpnQO+H+jaWWTdKnUlwiJsllo4Y++Yuzr26fkFl/kKfvm9Jo9uJIjTA72Fx1MDAxYVx1MDAxNVwihjT2ulx1MDAwNWNcdTAwMDOtd2OyXHUwMDA0Qe5drtKFpCdlwsGc8k+Tmy9Sc4yvd4pcXD0q8Hs/XHUwMDFhtlx1MDAwNOrf30OVndpfIYhcdTAwMDXSNrY82ErF61x1MDAwYlxuZHhL/nk3XHUwMDFmavaSofs7XHUwMDFkpfby+Cosr6igq2pcdTAwMTai61x1MDAxZvZ5IZ9/Vcv959+++5xSaIZ9b1NqXHUwMDA3Z68jhj8hXHUwMDE3onItZj/p2cv12bZcdTAwMDQ5XHUwMDAzXHUwMDA0Mr/ybpmXtIc8TijU+4JcdTAwMWWuZ4qcS+DNg0adMJ/tJ7+6+a8/ryl44cdWINdcdTAwMTd4yMpcdTAwMTaA54F+el1aa91cdTAwMDCyXHUwMDAx1d8+lHe6XG7wfa4l2j5Hdlx1MDAwZVx1MDAxMLxvuy6u5FdoN4I7uVhBrL/BL+RVsXvprqSu/1x1MDAwMl8uRTR08pLBhEVWubJEXHSwQotosWBTzu1Stu1fQMxMvtfdm99Rra1cZlx1MDAwNazEN3RuOte4XHUwMDFjNTs4fPDPXHUwMDFlmYdjbMtcdTAwMDN7XHUwMDFhOX9kiTFcdTAwMTOSo5NNh4B2XHUwMDFjSkPYXHUwMDA2hyg/73WU9sPPuH15+1x1MDAxOHm6UplcdTAwMGZcdTAwMDZcdTAwMWPfXHUwMDA0Ymj/51tcdTAwMGXNn9pcdTAwMDKp6ss44aPQXHUwMDE3zlx1MDAwMFx1MDAxNVx1MDAwNXmdfSkn80+7rlrweFXAxyqTXHUwMDAyVlx1MDAwMSDfhszB/KvmtcnvXHUwMDE3ku857zzN4V6s64BabzJ8XHUwMDE297hUpTpcdTAwMTjqNmUwyeVnZlR4LzL+XHUwMDFmW++x7aiyrI0+XHUwMDEwXHK8a2KFd8L38CC8XHUwMDE18PQ/mnudtfdcdTAwMWTjVlNVNZUzifhMJFx1MDAxManEenxjlOFs+E5cdTAwMDdZaJhcdTAwMGU5c1x1MDAxMCmKZGzX8umRZpqDj8lcdTAwMTVT08lCIdYs3G/iX1n/N5/v1bwrrS1cIoxcdTAwMDfTXHUwMDEy/Hyn6G37wa77pV/UofJYess1Oi8me/xcdTAwMDAxvKaE3G7qvCSjKpS/Lza3NdWC+GdcdTAwMWRKccHno8VUXHUwMDFjXeatXHUwMDA1VtzlhdNcdTAwMGJmp1LuNFx1MDAxOchDeiRB41hAtN1cdTAwMTGcqJH+juyZf6RhkVx1MDAxYeqjqSDyfHBg+V5cdTAwMDTMK/kqjoeco4Jsjca5Mb7sW4mi+9uSXCLowZdcdTAwMDdcdTAwMWTymU7VMFx1MDAxN6+YoZ42cC2Nwo7zWmVPzlxyLM++XGbjXCLSUE+u6NM667bir7k4xMe/cl/e1i70XHUwMDFkllFcdTAwMTbFzFcvXdFA+CwwUDf9Yr7wXHUwMDFmL1FzXHUwMDFjJ5pcdTAwMWZXXHUwMDA34vNcdTAwMDNYrkdcdTAwMDAzvVAkydcokVxuM8CfXHUwMDBmffqRwZdSVdNd9Vx1MDAwMZhG2zZQ6zVRw7/fx7+qXGbBvVx1MDAxYimFULfrnsXMgO5wWllcdTAwMDdKOESKsJC5aGuou69aPYO3scRcdTAwMTRav9txLJW8PlBt+/BN9JuHXHUwMDEyQLYgaYfLXHUwMDA3xitcdTAwMWTW+Xe/RU+MSuVZXHKgI4pcYotcdTAwMWZ6dqjDdXdyKVx1MDAwZTrNqFxub3pL8VXWoy7tUlm536uRXHUwMDE1batlXHUwMDEzZUSGtWnDU1VcdTAwMWOTgMOP++Y1cy5cdTAwMTmh8lx1MDAxYz5iK1x01vZtTkmqwlx1MDAxOJpCb8dcdTAwMTjusKRcdTAwMWMyZVub+k04XFw5nVx1MDAwYlxyRNWVyO3Ld8dcInlfdvbG1VhwsaiyX6O62HlAmOhe9rBcdTAwMTbRhsTnxmrPnD9PTG5WLWdUQm2d0+c2+V6Ds7uPS+OmqFJcdTAwMWVcdTAwMWSM41x1MDAwNDxi1CdGXHUwMDEz+yClhahHxdBCXHUwMDAw5dlbr2Wondxw1ZnTeJyobL8m7NEvSOlmt/XGqTSAXHUwMDE52rNtx1JcdTAwMDd7XHUwMDFivPpFbiYhoNuRl6GoeaBp1P1LSHLM4k/p1VRcdTAwMWbGXGKMv1wiJSN0gu3biVx1MDAxZolcZvfk0I6CnKqaXFxcdTAwMGKvplQ/9vJcdTAwMTJav4GG+lxuq+q9LDXGJz3mcGOefFFcdTAwMTRcdTAwMTiucvhw3ktcdTAwMWTA0bGgSGVmrGm1XCKLSlx1MDAxN1x1MDAwMIqwm6i8WdNP6n3xXz3PXHUwMDA3uS6O4fdcXItcYpl/XHUwMDEwYkmlyemJJP7WXHUwMDFj/nqLKKQprWo0gsRcbrZcdTAwMTBcbjBv965AXHUwMDE2XHUwMDE5UjekXHUwMDA1XHUwMDA3qVebZFUtXFyXsUzaXHUwMDFlXvmQ5dfkXHJg9o7VIUKqT61/LktcdTAwMWVcdTAwMTlZWMzP7VqH+k1FXlx1MDAxZtV+bc7vXGavQqetqvtcdTAwMWJfnrSepVxm1ObqXHUwMDFlML33JFx1MDAwMz9Kk1x0cfNkRlUkjzZwXHUwMDFmL1x1MDAwMjpcXPNRkb1cdTAwMDeyX1xyl1x1MDAwNtmkNXXxmGuZ21x1MDAxMGXgy1x1MDAxMD7gMLTqe1x1MDAxONg5+Fx1MDAxYWrrXHUwMDAygVx1MDAxOckm2zNN8vF5XHUwMDEzXHUwMDA3yvjv/1wiOlx1MDAxY1x1MDAxOI+4QPnLaDZcblx1MDAwNWinRGhcYixcdTAwMTlcdTAwMTRerUyFaGe0Plkg920w3PnMytLj9TmBXHUwMDEzrU7ZXG5cdTAwMTjE1l3TTkKNX1x1MDAxOI+J7jbq9v24VaZcZkxiRzcrXHUwMDA1RVx1MDAxOOWGyGl0b/GNb7lPV1x1MDAxNWjkaDC8w9rWwb/ZXHUwMDEw645DXYEk6Hb6nstv2S1V3CN3XCKtLzLIg5hcdTAwMDRcYv+V0Ie0QrLuKfWU1vpHqlxudqxcdTAwMTXbOGA97e3HU6EyanxTv8tDnIYpvft4UKJfgl4tmXbVYyBWo3aQXHUwMDBm39l22Vx1MDAxZKqURK9/rlpcdTAwMWFcdTAwMTl1LXhcdTAwMWIxXHUwMDE2gCp18lxybar3Oj1KlbK9/4hcdTAwMWSpz1x1MDAwNOFtaUCvXHUwMDEzWkB5eHKZhbXaN1x1MDAxOICede9xvDlbNGBcdTAwMTfiu4U2YDT6XHUwMDBl2FaaXHUwMDFhd8rZXHUwMDE3TFx1MDAxNTje00NgK39cdTAwMWNcIo1GN1x1MDAxZea/ZObIb+I6Kuu7XHUwMDEyXHUwMDFifFx1MDAwNVx1MDAwNiWLj6lW3+KniDtaz3NcZrEsQFx1MDAxYVx1MDAwMEGffFx1MDAxMplWbN6OR0fdJzVa2vk1N7BOg5lcdTAwMWVcdTAwMWPtXHUwMDBlXGathSr4hXK6v3JSwP7q/lx1MDAwZcT1XHUwMDEwK1x1MDAwNerD1KVcdTAwMTTCRizhRTD0UVx1MDAwMmqXXGJIb18/WNH5Vlx1MDAxYsJXdO7YM9WdzFR4XHUwMDFj8Dnv+j/noVx1MDAxMatweaCnVsRHXHUwMDBmL8HkYlxcVaqGqW9MgIbmNKyv95pcdTAwMWTbXVwiR3qgvIPK8dRT3uvj1Mwoq+xOXHUwMDAwjrgnyYnA+Xt2XHUwMDFm6l5cdDNcdTAwMDCi/L23vPak8I+7pdQ+xMdpbVZ36ICLMlx1MDAxZlx1MDAxY8nfXG7Bs/rjtVx1MDAxMibXwE+/JnqqJ1gunT3Ueco9S5lfIJTaL1x1MDAxMkxB0Fx1MDAxN5C+6vtxz1x1MDAwZYgmxiQqn0xp1yjoXFx9Zr6PNrdah4jn4n69b/JcdTAwMDRK8zid/iU20WZPTFx1MDAxMkZ56ECkpaJAQdXT0qZMSs45XHUwMDE3V1xix9rlY1x1MDAxZeVImdxHWFxmyoZHzew3XVx1MDAxM1x1MDAxOKdcdTAwMDdcdTAwMGWyf/ko4s6xTW+Hgay6VID9RoUrQJpuQfuHXHUwMDEy4bq9POzjhTYl+CZG4P4pXHUwMDEwXHTwoeJcdTAwMDA9e/UsiIuVUTq3si/z0V72XHUwMDEzXHUwMDE28yVcdTAwMTUmwm/Q9Smwi8fDvVx1MDAxYWSD41x1MDAxOfavxVHx7ZXxXHUwMDFjcUzXXHUwMDE3VVx1MDAwZWxNXHUwMDFl3f7uIVx1MDAxM59xLfaoeF+Og6StXHUwMDE0XHUwMDE5tmIsbpzlwj5CXHUwMDE1//3e/YlcdTAwMTWUd1x1MDAwN1x1MDAwYlGiTj1n1Kx3V1x1MDAxZG086ylC1JktpzaOlX7tL6OK37z9q5FTxFx1MDAwZYMpYrjPXHUwMDFlK57ASVjRXHUwMDE1PG6w0k/T2JWGb972We5cdTAwMTUzj3EyyDtcdTAwMWPzs656XFxcdTAwMTh5LonnZpHBc7+OoewhXHUwMDA1a3n5kbqRsLU+0/fs297dmONcdTAwMTEv7DZcdTAwMTKhXf2WivW1XynVw34j5+zIRPKstSU3elx1MDAwNVxcezpcdTAwMWFcdTAwMWZcdTAwMDb+WExY/PKPXHUwMDAytFx1MDAxZs5cdTAwMDe4rMq2SD7LoKuLoqdcdTAwMDLuRiZoXHUwMDFlXHUwMDFjjL18nHKzZP+En8z/O1x1MDAwMyZBXlx1MDAwMr8jXHUwMDBlRJ+dZa9cclsoXHUwMDFi3rvGLOdOZr7x40Gvpq6f3KD69UN5iD3pY1+poUdILrv2XHUwMDE4u2E7lVx1MDAxMsVOXHUwMDBlQV9Q38rZtZBcdTAwMDd/reFq3TPTV/5+3jlaWjZhVmKtsJlim1x1MDAxZjvtXHUwMDE3fO684XdcdTAwMWJcdTAwMWOgwLn0XHUwMDA07LFRJOhcdTAwMTNlQrnT3n46cUaFtdH8XHUwMDEzd0bFm+WYXHUwMDAxXHUwMDAxluNcblx0LVx1MDAxOKqDgFx1MDAxZPrNZUKxJdnf81tKpySp+Fx1MDAxMUL59ZvJqE0zlPrkRtTFI0ZUf8dcdTAwMWM4835cdHPQ6W9cdTAwMDLZjiCbhaXf2z2JPVx1MDAxM1e1nUiSgM9r9UI3sMziXHQ8ik3/Stf2yMc+w17b66pcdTAwMWJZ+MpXfFwiQ/1qdD0g+49FZ1fiXHUwMDAyijNcdTAwMWJI/YJwaVnm9j24VaKtj95jvoq65oeLS4CH1j2hXFybIN/7XHUwMDFiRlx1MDAwNVx0Tn7d239zcV6VMFvja3tCXHUwMDExV4Y7u3VQXHUwMDA3O1ezaklcdTAwMWL6T+eIXHUwMDBlXHUwMDFjXHUwMDFmlPepeffRs1x1MDAwM16ei4tOvFx1MDAxMW/71jHtLLxY/8O884efXHUwMDFhoWNY76w/jmFCIIzI2nJuv5phut2B6DzLnbeZXHUwMDE5oq/WwyNcclx1MDAxMCWBpTjLr9tbXGYs7vey1t/9XHUwMDExuuBLo3AuXHUwMDBlSWOAMUyAxaj3XHUwMDA1T1x1MDAxMWzZMoJNzdu8Xt9yPEIkXHUwMDFmcFx1MDAwMyT67sjs71x1MDAwNGp7yt/Y2lx1MDAxMoLv31xu4jjTNspcImd/YDxx58KVslajXGL6zkJNq0yMT/d+dtVjSrlKm49S+mbWZ7viJCCIQXE9YfL2y6s+7u/91UfCvdnjtb6UkoYy6aZs3PvemHP50HD6aJnWaY5N/JGVfjtCUpxcdTAwMWLTSrtZw6i4y31cYpXAo6NcdTAwMTjwi7HkwFXQdzLtQ6bLyDGhJk5DXtNGxVx1MDAxYa11Wp+twLSZPJtcdTAwMDD/kbGYXHUwMDFiXHUwMDFkwH5Q6CpHn264SPm9/7H4L1uZXHUwMDA2blx1MDAwNKVcdTAwMTaus1x1MDAwZo93UTjgVaimMaLUS+pNfkmel1Ig+/BE2D7N6eFi6L7cRU63r1x1MDAwN16JcfKogSFcdTAwMDKUwEc9fFx1MDAwYlwih2a8XHUwMDFjP2E5UVx1MDAwYoguRPKW8D5cdTAwMWXIjJ/WSrglzexoT1x1MDAxOG+Hd1x1MDAxMqjyWJt7flJlfL5cdTAwMTjAIzkk7216zauJLZw4XHUwMDA1f+TeYlx1MDAxY4G9OFx1MDAwZl06sDSvmE2SOM7b9FfGxon3uHVkfFxm8Yydq8yyZIHWKcZC6XTdXHUwMDE1qlx1MDAwNv5cdTAwMTOIp5lw73FxU2VcXCiRVW+Pney3m1vD81dcbk9h2y0hhaCoVylAjs6EN2u/zYe5dL3cSKBcdTAwMDNcdTAwMWTCMqiv61x1MDAxOC0szyWW0ixcdTAwMTJpv1nOmmNVnaj2SiFcdTAwMWYgcDTYVGpFuEtnXHUwMDFhXHUwMDA0XHUwMDEzXHUwMDFj4ieaQHNcdTAwMTBLJ9nmUiEu+jToXHUwMDFlXHUwMDFlTPgkylXJSypJr5CpmZzRmJDomFFEhyG8aPGLVmJRLps2+ejwX/dccqCT0eiXq1x1MDAwMLPEZ01f54SC4TLs+Fx1MDAxNWW2o4ZIXHUwMDFkYc6vd15llIxcdTAwMTNeXHUwMDEzfFx1MDAxYXHY4YDL28mQeubmLXv9XHUwMDA1O/5jfkXGbeOtXHUwMDAwlrfFYyXboXP6mDhhvqdYXHJX6chcdTAwMTQj5I55XFzhSoBcdTAwMWKj8vpeeWfvUMST0FwiXHTqsG6Smf29jLFwhiWP+cqwI/A4MqJcdTAwMTCPnlx0RL7BXHUwMDE27atIXHUwMDE3XHUwMDFkm9bEv8H2fPSJeIXbostcdTAwMDGzuyaKIVxmllx1MDAxY1VcIqDgXG5/10mpoiFMXqzjI3hqUlx1MDAxZlx1MDAwYlx1MDAxOVx1MDAwMryzSfn7XHUwMDFhknTqh+HEXGb8U1ucKq4q81Hs5nNWLYrDQaZ/Sehaz1x1MDAxOXjk80xI0JSrIfe567FcdTAwMWLZN5lxLOWufJnVWYg+YsxJ5+xVe0hdeZysMTXzJlBcdTAwMDGfeyo7XHUwMDEzYG3dNqvpRyA86/LMlZQ81rSz9js/XHUwMDFlyWer9VVcdTAwMWREUGNxaLhcdTAwMWV06N/7Tlx1MDAwMdeKRbtWIapIXHUwMDBmRdVs1HuojVOPuVx1MDAwYmXTv13ebV5tkl95IJx0XHUwMDFliDNcdTAwMDFdXHUwMDEz1Fx1MDAxOe3pyTLDKdejXHUwMDE34JyKXHUwMDExXHUwMDAyx20y24bVO1n2leriXHUwMDBm/N2qk9mIclx1MDAxZeg8M+nM8IVwxVx1MDAwZtVcdTAwMTlcdTAwMTlcImRdMehcdTAwMDTEPUAyXHUwMDEzwvS7X1LS2ZpapnxcdTAwMDKparRcXFx1MDAxZmyJ8q3QTVpVXHUwMDEzJHhooEbiI7e2V6Nccq8zXHUwMDA0yehaS1x1MDAwMNJcdTAwMWK6N7iLXS44XHUwMDBmp0XnvsOj8Tc0pdFcdTAwMWM5KKtNXHUwMDBliJNbdo0lXHUwMDAzw+Vovn7w73tcdTAwMWIj6FwiPC2ioFx1MDAwZVx1MDAwNlx1MDAxY3PkVfuy5GPi5ZO+O1x1MDAwNSNZbo9cdTAwMGZur1x1MDAxMntJKzElPT5lcX2Iclx1MDAwMruL/f7aXlx1MDAwMs94cSOfbVx1MDAxZuL2YSSzIe7FxDd3XHUwMDBiWqqzbo7a3kloglxyXHUwMDFiNdvaNSWBP8GU+ORcdTAwMWLZxvg3KJxcdTAwMWFcdTAwMDbLSSFfO1x1MDAwN5JPY3VGXHUwMDBmzFx1MDAwM5o7XHUwMDFlXHUwMDBiT8OfLcfhqVx1MDAwZazpQ2CCkpWhyT9yN9Qm0tNcdTAwMTOIyj7cY21cdTAwMDNcdTAwMWYuPpN97evmXHUwMDFkXHUwMDE1u7GjXHUwMDA3+m7Gmb3aXCJIrmRcdTAwMTBccr6p+jqWdpcgqlR3bs9cdTAwMWWb1/lpoaN5Te5cdTAwMTl7ydHHfCnmnttJjU1pRFx1MDAxZGo4rodmkVx1MDAxOZFqoPdcdTAwMDZIiFx1MDAxNGKGYHXZ5N5cdTAwMTXfulxiuZH0fZ9cdTAwMDPImrXIXHUwMDBmm8SoXHUwMDFiXHUwMDA1aIHZnEdJXGbQQ1xuN1x1MDAwMX2ENO5cdTAwMTNnmS51KM0hpNuVL3CcqlKeQJeSV73j/WRDLkv7xXd3hqX22lx1MDAxMcrMv7+qfSXAo3tHhNrxN5pTXHUwMDA0wJfeKo9cdTAwMTfdM7aaQtlv3jl501x1MDAxOVxmhoFxjPHNXHUwMDFixrjV8+XDKO5Sd1x1MDAxYW3qXHUwMDAxptOqZKi6vVx1MDAxYtmhs0/v3ztLdFx1MDAwMvZcdTAwMDH7aFx1MDAxMUCJsLwut4PjiM9cdTAwMDeOYFdgxXePXHUwMDFm6VxywN9cdTAwMTPE9kCIpLKN1CpIKXd+VYR4vFc+mKvpgC1VXHUwMDFkxDdgyOjY6aNhy5gsNIWwsFx1MDAwZlx0zJ1uNlx1MDAwMlx1MDAxNiRvXWPGWqy6XHUwMDBmtVx1MDAwMC+BU3jV9Ub53dXCQ5lQW+ujK776yvmYzye2/Fx1MDAxOWX5LeRcdTAwMWWkXHUwMDAx6V34jVwivC5Jd696kjFcdTAwMDdzOVx1MDAxY95cdItcYstcdTAwMWF4/HKDKMaqdiNcdTAwMTUpVJIoM7JOZ2ZcdTAwMDXbnvakPnZcdTAwMWH0MEnUKvWRNuI31Dg14lksX5guk31pgvNLtpU5i0vlnCv9XHUwMDFl5XZ/Yc4gXHUwMDFm5Fx1MDAxYeKaclx1MDAxN1x1MDAxMVFcdTAwMDF1eTMykD9cXGqJKXWtS/1diLJzXHS+LizOh3jGzVxcj3296S+5g9N3+qir4+ihMVx1MDAwZYqBXHUwMDEyJ1x1MDAxY2yE3oRfSkU6f1xyycbZXHKhseBcZlx1MDAwMlx1MDAxM3TRU/RGkrsmzcy568+KxbUjxqF/XHUwMDE2qlx1MDAxOatBN8VmmOeonlx1MDAxMaRcdTAwMTnodJUkXGJcdTAwMTPTIUqtilx1MDAxOXnvbFx1MDAxZatx83eXJlx1MDAxMaToc1XxWP1JQunQMLHTq80vwrW3bcc4f1NcXJvpkTlHZDzeaXUnepL812dYWlJcdTAwMDYlXHUwMDEyzNRqo1x1MDAwNLk59Y1cdTAwMGVXqvje3KhPii24TY2LXHUwMDAx+Vx1MDAxNVx1MDAwZVx1MDAxYlx1MDAwNM++8tk8XHUwMDEzMEpqQVWXUVx1MDAxMlqGTLlM55Io1+6VoIf58V0xpZ9HXHUwMDFi4/hC7D/ukTDSfjpcdTAwMGVcdTAwMTFuUlx1MDAwMo2a9CVV6mc+S1x1MDAwMZPHWphcdTAwMWI9glx1MDAwMFx1MDAwZrcuf0dJcel5TLVcdTAwMGLwkyBcdTAwMDN6N5njKZPpJL9cdTAwMGWtYobBskKpXHRMXHUwMDE37pDIUbS6pfR+c+WE17ml5vngKU5Xq2QoaE+jY3af26xcYlx1MDAwMtTj0OKsX1xm6mRMVX9cdTAwMDLBKDuS8Cc9XHUwMDE36KH9rtvwXHUwMDA2ukCdXGKNpD2TnLNcdTAwMWX374TvapFcdTAwMDY5r3KbXHUwMDAy/z7K1Lgz1IKSXHUwMDBlXHUwMDExnIyaXHUwMDA10mxcdTAwMTRcdTAwMDbVh6R13Zr1MVx1MDAxOGvo2CkwYnXgxdhcdTAwMTHum0VgSFPWSG1KiD+RWXah3XeE6emO+DqhmVx1MDAxOaVZVjlvp1HapunPa+mEV7dU4qxcdTAwMTOsWPRhs4jvctGDJCFqUei1UOj7nFx1MDAwNXuoWcHPk3p/s2FLkFxcXHUwMDA1SaKuYlx1MDAxNOiLjNPleEFJXHUwMDEw1FeInTVirVKB0CtcdTAwMGVM/lx1MDAxY39cdTAwMTFAqn49anfN8lx1MDAwMyvO3Fx1MDAwN9FcdCvabqvhUUWYTiucjqre6ahtRmNcdTAwMWa/fj5254LT0euGmk5bXHUwMDFkgs/gLFx1MDAxNubSdyTWp1x1MDAxY5tAzmKjXHUwMDAzIcNKVdopn1x1MDAxNFVcdTAwMWV+NOR8XHUwMDBmqvDQx3K+1sFJUDhQdb/sXHUwMDA1t4CYvnaldpSDvcd46nYts9+DXHUwMDBm1OGdXHUwMDFlr1x1MDAxYVx1MDAxN+lUzVxu/Vx1MDAwNIY9K8RJWfFcdTAwMTNO/oLo4kdcdTAwMWXEvjHwKFx1MDAwNPdGXmZcdTAwMTDW+ZZ0THF48+FOmpn65leH8KvpJFx1MDAxOFV+xV3IJsDH9rZnS0+bJUmbsuPyXHUwMDE23oO44+KGotrejolY7+r+wW7bot0r18sxu9rmQJWyRb3BY1KXkjlfNt/hgC5cdTAwMTE20u/f7ZKFWe/Ge1xcm9ytg4dcdTAwMDJcdTAwMWLsXHJcdTAwMDXv3HG1SpPQPZ2sh+5wYCbK3ndtwCqzRkLw2Psh+mPZVujR6KqSSO/NtzC9Q0JcdTAwMDVcdLxEW1x1MDAwMIT0dbwtlNya+4R/XHUwMDEzXHUwMDA3wWi76i2De9r6t5aZI1x1MDAwMuxcdTAwMGbdJWZlylntTokqucGZu1x1MDAxOPaZg2T9vbBcdTAwMDCMYqtcdTAwMGZBqWbn4Vx1MDAwME/sPdv9dlwie1x1MDAxZFD/PZHZbjvvtVxcd1x1MDAxY7yIJKgsXCJom7BwqFx1MDAwNc7JcLRC+us8dimXlVxm/F1JObBcdTAwMTLMdVx1MDAwNTZ8mbb7MNNJY7/7NfZt903oy002uX1BJuf5j91mM/B2fvH+rGJcdTAwMWZOXc39U96tNnO6nlxmX3unpTeFrc1cdTAwMTjkyYtcdTAwMDGih3yCZWLYblx1MDAxY17WZoq1PzDet+wjy0KMcyqP37tccu20i3ZnXHUwMDE2XHUwMDE4XHUwMDEwS7lccsWHXHUwMDFksPNjZ93pXCK/wGvYyFx1MDAwMEJXXHUwMDAx787VWzTRl0mieezw6PNcdTAwMDZ+XHUwMDE2pJlzJEmH9pp3XHUwMDE51EWjt72SXHUwMDE0csp009SRoadXXHUwMDFjef3glTg5eJBRhuOdQeG2XHUwMDA0SNhcdTAwMTBYoY06+Vx1MDAwZVElfs82zsI5pmzbwyNcdMYxmyhcdTAwMDV5XGatJ5xcdTAwMWR9dJhlXHUwMDBlJlx1MDAwMz2ih4y/ODM0XHUwMDA1XHUwMDE38/KqZVx1MDAwMcBZ0TdcdTAwMDHUMft1INAq4stVzz191bTImS3s+jqRUqtcYrtcdTAwMThsP566+zbfkT2kPqdkeaqpVzAncaexXHUwMDBlbMWkTuv2gS95uFx1MDAxMFXsfb6+2Ip2Y2NcdTAwMWZcdTAwMWNcdTAwMWbbXHUwMDEytiN+//W5vf763Fx1MDAxNHlFqzFcdTAwMDe9mj58R13owY7sXHUwMDFlhEG0mPNcdTAwMWJJw2OZia1cZnGgPHBW7vRcdTAwMTDnQThuu5M0cIFcdTAwMDSOtWQ//pHQe2oxQI/yTlx1MDAwZpdXp7c9s/BcdTAwMWVcdTAwMTJnfVxuXGKVIcyPM76il4RcdTAwMTDx80c0MkeVStjAu7nI7LRvM6GiXHUwMDA0VlnfeOXxI+Xgr6F3Lspl0mq7pEupVsDRoS5mXHUwMDE0XHUwMDBlufH4QVM95lx1MDAwMZycaFx1MDAxM8nR6pRcYlsm1IFKglx1MDAwZVx1MDAwNVx1MDAwM0k+csvz5X3mtFx1MDAxNzVToGAwzcXa3de9jiHKpYzSN6tcdTAwMDeVS48viM7b+WPZ3q5xc1wiaJOp6OBYQSmE3lA5pDCeXHUwMDA007jaonK8N+RcXIFcdTAwMTfGXHUwMDAwta1cdTAwMWFuSVgmvWv9SXjTk1x1MDAwZqXGbKoymCm97Fxc6F9lqVxcL3lcdTAwMGU671SKUMN741xm8WgxVlLTXHUwMDE1WH/wPVNcdTAwMWFRqbVcdTAwMDWmv5v2djN4S+5ccpJCXHJwOMswl1x1MDAwMszfdjfpXHUwMDEwXFyhXHUwMDBmn12EIDkqgLTrW8neqy7M61x1MDAxMfZzPF1bX3CspL22XHUwMDE25HRcdTAwMTFIWFx1MDAxZaDAj1x1MDAwN+tcdTAwMGaReof0Q4BcdTAwMWTkXCJaU3+TXHUwMDAyZvYr2KagVFaiVeQo1Vx1MDAxMvx4xrE4wlx1MDAxY9Y/YJCaXHUwMDFk6jbBcFx1MDAxZMijN0GAsNhcdTAwMDJM42DFceTW3sO6pdOOKeeDXHUwMDFhvvPIbWDSgmfpOi1ITeDQVuk0Le37YyTH+Vx1MDAxMXqQj8e0/kpR8ms0XHUwMDExLWZ7s1F5p+1E31x1MDAxYbBcdH9IWDiBJFwirvhLiPack7OUXHUwMDE0KFxyXHUwMDEygbBMX6yqYrzJXG48pJVcdTAwMGYpyv0j6Fxy11dcdTAwMTVcdTAwMGJUxcdJ6snlvnTrNE2FRbVcZmS8XHUwMDAxV0snkdy+19PuXHUwMDExzDlV8ZxcdTAwMWHHrcdQMqlcXMy+hFx1MDAwYi97O2/NfH42/Vx1MDAxOODf1thcdTAwMTZcdTAwMWPilvHlXHUwMDAwWpo90mxSwcemueFcdTAwMTdYXHUwMDE3/vs8QWGctVwiXHUwMDA1ekRdk096mC/u1X6LYSrg/I5KzZ9wi3zN1fO93d5cdTAwMDU5anFZXHUwMDE0hV7bXHL3iFx1MDAxYWDhRq1r1pJcdTAwMTKijs5cdTAwMWQ5XHUwMDA1VJ5cIoGExd3HQoMzL8dHidSP+8JcdTAwMDf3QOJfv3rTXHUwMDE1hFx1MDAxYl9lktp2n1ZKXHUwMDE4+Yk3tyz4qlx1MDAwM0HVs0jZY8qm1l3E01x1MDAxNiSG5VNBTyiBXHUwMDAyl4xBeqpaNFxuevPzd87be/yu0ZA0/83J1u5cdTAwMWVfssz1ivpNbOiip75xaGrAV1x1MDAwYlxu1lx0m5NGIPuy4umQ+vd3l75cdTAwMGZcdTAwMTS8V5qGk1x1MDAwZtWkoMppmbCUXHUwMDExSlx1MDAwNGRX0+tcXP76v3QjzKQtn4tt9lwi21x1MDAxYpVcdTAwMDfKM+lDRe2OZ6R7/Hot3EKRQmhjbVx0k0ghvFx1MDAxMeHd8ZlBl2/QyTP62U2kylx1MDAxZmgkqTuYXHUwMDEyZiecj/uAXHUwMDAySj9fXHUwMDAxXHUwMDFmpK6mXGKqxVx1MDAwMZFcInBcdTAwMTdcdTAwMDdJ1urf0y9EJN23lXrbsq+oXGay1uiGZuD+mzfgXHUwMDE3WXZejO/LyVx1MDAxNEDkQbVe/eqJYb279VNsk1wil4F4ZoOWJF1xIE2sUFx1MDAxZFx1MDAxOVx1MDAwZptfkuZ6vM41LbDoxeb4XHUwMDEwo8JqpJ/YsefwqvHjRCZcdTAwMTOXlFx1MDAxN8UnXHUwMDA1scx+s+bBcGdlX1wirSjRy0l/x1x1MDAxNM7nTH0w8q6q7Fx1MDAwNd1cIi/7nIh5z0NYjS/NTFOWJ6JJrF05jkqMTrVcdTAwMWFP6cuDqWzG68g7hp6Ptl6hffMzXHUwMDAyLSd4kcLAjmIrU/upMKOEvlxybe/vR+jy7FxmT+cwfz7fhlx1MDAxM66hKGFcdTAwMTNcdTAwMDc2rbmoXHUwMDAzj1x1MDAxZeWEXHUwMDBlh/K5yG1s4nzhN9Bke/ewcVu7XHUwMDEy8rs0XHUwMDA1vLku2F693nyd0sVcdTAwMTIzIK98fVxch1rs5LRcYofkVPmRTW9cXMpcdTAwMWYjUHb3XHUwMDFhNM6Wze+WwSv0h+H0ymNcdPDrgURIxb4mZH9cdTAwMTTgle9RPPvu7GC2veCBRi41xNL7Ltn+P+9Qc9snRtn7Yz77koJGdfPpXHRTv1x1MDAxYX0nvFWUIFx1MDAxM1+YQ1ZIJ68lv1x1MDAwNFx1MDAxNVlP4kBb+LCad59FQHvjiXrue8LRUSrQh8dcdTAwMDF2KU5cYrmv71x1MDAxY3/gnaLWplx1MDAxZVRULvU7znlcdTAwMDXFN5eDZYFjXHUwMDAzMC0j9tpcdTAwMTC4VUVmeLBF2dQwQ+2lS7ftXHUwMDFkwuUuL/rdXVx1MDAwZsHne9bX3bp/s/Hvvl1m5NR+wNFJoCXAeZH1xE1eX3ykRnMxyFx1MDAwZaxio9CJRmFcXF20c8iHXHUwMDE0XHUwMDAxieucy7z5RNdcdTAwMWSMyXl/7lxmXpLBcD5UK5Bx7H5LWoDFYL6CKuHK/tSqj6j+piTgiO7qt7LnrJiw2ZJNyX3a0/ddoXzrlqp45VDbdOmYX1x1MDAxM3SPXFz1kFx1MDAxZVaN0mVcdTAwMDVQtzhgXlx1MDAwMYzIXHUwMDE2MugrwLdcdTAwMGI5JsNhVO6xeOrr2JpcXO3olSvvllx1MDAxY6ZGKzX3/Dvkjl3Im1RXmbTQ0Vx1MDAwNJwlW0SfViBY/lx1MDAxYlx1MDAxYVx1MDAxY3w/OVgonTP9blx1MDAwN4dAXHUwMDAwrz314y9ojm9cYmjHXHUwMDFjqZC1PFx1MDAxN7u8Mlx1MDAxZL9cctTIXjj2Ld+jyby+XHUwMDBm7JI7MExkaDx7NJws9zVK8+NrSTmBnlx1MDAxMbN6nFx0OFxi+Kp6tFx1MDAxNvR4gFx1MDAxMmDDXHJFbOVNnNIkQC/mKqDceyzhXHUwMDEzfXupznBcdTAwMTLLTlxmLFfQh+DyXHUwMDEw/9q7gbn05TudkLy3ltS1UWHMXHQvXHUwMDE0u3l0K8Ump1vhsznXUWzkbWVXOFx1MDAxZX14oVx1MDAxOFx1MDAxM6lcdTAwMTQ8ydykXHUwMDEzxF7H4LTddnjg/Gjvfv68cEBv6iaVUOFBzl1FU3NlLlx1MDAwYu5cdTAwMWVlUkZcdTAwMWJyhDu+pq+Nrn/9KLvuLet1qlD8vVx1MDAxYTBcdTAwMWTRXHJcdTAwMDTy0n3k7ds+XHUwMDA1UtdcdCnrPFx1MDAxOZo1PfjNrMuuWHz0kVx0qFx1MDAwMsRpjVExi4tulk8nXHUwMDBmJu5xyufmY/JcdTAwMGa/jsDUXHUwMDFjXHUwMDE3IFV6Zlx1MDAxZvquU4l16cNC5/U7w1xy39tQO13awFx1MDAxMiuF2dfrtX/2I73OsVx1MDAxMF32UyZ44S3pwcxyRDTb2k5ycFx1MDAxYVx1MDAxNLNa0o2vylx1MDAxZJbdTC3iXHUwMDFlNFdl+rDDsL811czQ3XVcdTAwMGJ2TMRup2hcdTAwMWKoS9L7hV/Zp1x1MDAwZtvHOOj+Rm3d/lx1MDAwM6aVXHUwMDBlR+SghfHaj1x1MDAwMPtcdTAwMWXgXHUwMDFjRVdsosi3pUjsw1x1MDAxNJX26HKyqMlcdTAwMDIypJs1dORcdTAwMTZeXHUwMDFmUfB1VOSjaYqn+rVRj+W+qJLL8upJYFx1MDAwMVx1MDAxOUfvS1x0o/HF218nXHJSUlx1MDAxZTtcbqjgMKijQtuS7lxiXHUwMDFkXHUwMDE2VLC5XHUwMDBmMCdcdTAwMDfJ89KqXHUwMDE43jYl4deuq2n3XHUwMDEyXHUwMDFmz1x1MDAwZlx1MDAwNEaikuz++qiyVc/gXHUwMDFkZeBt4VvAr1wiPlnAXHUwMDBmXHL2nGSBdXzun7sumMuUScpMiYdcdTAwMDFYpo13XHUwMDFiuIrZIyNiJ1x1MDAxZv+rXHUwMDA0fudZqVx1MDAxYq3M6OSxPDd7XFzVzFx1MDAxZer9u6nR+2jqX0I2XHUwMDEx+ybbh1Bm0umtmJVtu6G1TjG742iw++VgfVx1MDAwZuWxXHUwMDBlLCY44Fx1MDAxZFx1MDAxZUHSbjY1XHUwMDEyXHUwMDAw5Xg2hY+4dn1qXHUwMDA2mZjN52MwKDVcXJXo3NwuiklcdTAwMGY6XG477+/Pwk+pldItLk05QqErM3v7NXrmMmXiX8yfdT1ow4el1Vxu41PObFx1MDAwNp5cdTAwMDHBIOROl4j5r4wwXGL1vpOQbuPPe9ah6J3gXHUwMDAz6rxVh4bHq7M2XHUwMDA2MPKtmalZ6lx1MDAxYWtauuHxm7ljMFx1MDAxNu75XHUwMDFhXHUwMDE1XCJcdTAwMWJ3XGJ+3smRXfM5XHUwMDA2SlTZ41x1MDAxM5WfkcYmaDmvXHKCkEhcdTAwMTWq6OstUUeHKb9zIGVox/yJjNG15V1cdTAwMGWYoNrJL41alJYhJU19ebY9JXxcdTAwMTM3qFx1MDAxZVx1MDAxMlx1MDAxMLa7uyGmPnD70l0mJO7TprbvpYCC/Ex09KOytlx1MDAxYoxIb/JcZkLbc7muRDxcdTAwMTU1O5528EZ8LMRZQiWU6SV2STCQL2iT3CFvr2HMz42/k2KpKc4ziexyXHUwMDE2dXBcckBlIC59fCW8ajW6XHUwMDEwaS6Dw+nySi5v0bZ9rTmvzjA371x1MDAxOVx1MDAxZjw4t/BG+SzGfaZL5Vl+vbJ0XG7lJLtT0Hy4N6rvr1mq/HiV3zlJXHJBi0rsl6TVZVx1MDAwM1xmmN2TlVxiXHUwMDEyi39kIINnWJxw/42hJz6v7TeQU74h+nnO8nRodKDyXHUwMDA0k5yp1lp2zbLGI2daoIc7XGK13Fx1MDAwMXSpXHJxeijNkFx1MDAxN1x1MDAxNEe0XHUwMDA3zNb9pXc0zvD2eyubftfHXHUwMDE3/Fx1MDAxZHO9R42LXHUwMDFmV8FcdTAwMDU+ymegdVx1MDAwM6hve9bVwf7l9Ln21v9wIFx1MDAxMkw8e3h48iSGt13P3Cqf70BcdTAwMWbe7ovN72T3hDZcdTAwMDBwXHUwMDFlrVx1MDAxZFx1MDAxN4bVybU09cGIjMa5qNSPNdk7dipcdTAwMTg6NVx1MDAwMOCNmvGtI1x1MDAxOfRKXHUwMDEyXHUwMDFmOP2kNqhQoFx1MDAxOV2PR33qgLt0qdsskGRcdTAwMWGVR0jCWetJKmQzP56jRH5cdTAwMWYskU9cdTAwMWNuNJhcdTAwMTduwcxwXHUwMDEymf6hv7spXHUwMDAxLzGs+WVEsV3ZXHUwMDFm3S+5hlx1MDAwZrUt0IYuXHUwMDA1i8ey+G7y0DZcdTAwMTZcdTAwMTZkzDHewbzYb17iqrXGXHUwMDEzZo1VXHUwMDBmXCJcdTAwMGXKaZJ+XHUwMDE22WFyqlx1MDAwZZpuheTzq+teVMIwg1x1MDAxYcZ9V5vJXFxXT6ggRVP9X15BXFzHJZUxakBcdTAwMWS5n1xmLqFKTt41VMNcdTAwMWNcdTAwMDCvjWzoOSeg7m04XHS+U72MXHUwMDBiXHUwMDBmc9db4++bRdjeoTzRkKxRXHUwMDFj067qSpdZclx1MDAxNUvWKbVOXHUwMDAzvFuw9pvH+sHwbVlcYpyAXHUwMDFmXHUwMDE4XHUwMDEwvfy7Pl58zZj3XHUwMDEzK1vN//plecJnR0NcdTAwMTaoSoiLYVx1MDAwMVx1MDAwNlxuXGYpVjJNjyTUXHUwMDBicbTUO/ZcdTAwMTeTXFyIXHUwMDFioJ8vrYPQ2b+UnfNn2lKfdfDQXHUwMDAzXHI005fR2XurwXVcdTAwMTjciKQs6P6TOk/gXHUwMDAyb1xiaMnUtGFcdTAwMGKRnvylvcpcdTAwMDffp1D9dEn/eVx1MDAxNmG+XFzggWhRXHUwMDE1cFx1MDAwNjBDtyQ/XGKoSyquwKzaplxyXHUwMDA11TJelNtcdTAwMWIoXHUwMDEywVuR8F2CKUih5tFcdTAwMDeL0t27VMeEXHUwMDBm2Vx1MDAxY4G077yizHJ0XHUwMDFj4KAw8Uo6UU1cdTAwMDMncrJqXjxkXSOAXHUwMDFhgDV/adxbim9bXWytXSrHsWNcdTAwMGayK0lcdTAwMWJcXPn8cf5pI609cza7lZjIjKKUj2VS4tHN8/SFwP5bXHUwMDEytyk4a2Faw6tYiFx1MDAwN1x1MDAxYW5srFxuhZv1PUVcIltcZvVcdTAwMDUwl+GVr15cdTAwMGJAhWR91Vx1MDAxMbhETnE8MZPDzlBh5LU0Qi6OtCpcdTAwMTl8T1SoXHUwMDE4iK4hKVxc/YivPdPNySZj8LRflT2/PS5cdTAwMDbdLyVK0y3XPOVT0JdcdTAwMTdeXHUwMDEzyLZcdTAwMDDZ2FVcdTAwMWEkcY1cZuhcdKuLiyNpXHUwMDBmbft2dDd+8/Z8y87KmPMmo1x1MDAxME/f7IvfUmmPI2U5O6JSXHUwMDEz5Fx1MDAxZLFu03VmZlBcdTAwMTD48TCPjlxmNFx1MDAxYnj1y+GPlcotXHUwMDExQ53fmnJcdTAwMWT+n3xcdTAwMTJcdTAwMTmRxIDyQTTnUs9H5zdcdTAwMTFSTsH73NPtqqBcIoKutGnQ11xy77J23tF75cQ7OUTh9k3bhM/ffbju1vr8XHUwMDAxoK1rILJdXHUwMDE08+XtnbvNvZ7Qv346/Fx1MDAxMVx1MDAxY1x1MDAxMFx1MDAxZFxc9p5nLsM/OGvVPy44K6CzXHUwMDEz9s2KbpNNoLWh+3dcdTAwMDJza7CMVy0gR8dVSOpcdTAwMTfbXG71JZRhj8NlmLfnsL4y99TjXHUwMDE2QG1wXHUwMDEyy0FUKUn1VeedbzOS6FTmYOn2+J6kd2544Fx1MDAxMDNcdTAwMTOzcFlzmEc4XHUwMDBlUzh+XHUwMDFmjzRiw1xiTlZ+t6a8THZt7lx1MDAxZfdcYth9YFr2hzll82jryWvkh9qiuVx1MDAwMUHEK9xcdTAwMTR0mrmRar3w2zVVXHUwMDEwOOiD7v7mJ5L01mM9pHRcdTAwMTdcdTAwMTVNK1xiX1+tnShoMkBMnlx1MDAxNK9cdTAwMTf2tlx1MDAxYrHdM2DMWrpLr2bC+5UqXHUwMDE35TLtgXtcdTAwMGKF3db7SODck0olY1xin/z8z7Piu//Ps+q6z8M7YJ5/XHUwMDAwXHUwMDAyd0xojFklL43zJb+o+VxyXGZcdTAwMWJLlZK2oTpL5dvg5WAoWMxn5qbhXHUwMDE2XHUwMDFlf4R4iUtosqvuXHTm3LlQXGKy7Tqvc6JCcFx1MDAwN8FyK2NcdTAwMTXVslx1MDAwMVx1MDAwMrS+ekz7XHUwMDFlNlx1MDAwZrfPn+qPXHUwMDBmXHUwMDFjhv9HXHUwMDE3Plx1MDAwZq3mZeVcIlFcdTAwMDAzfmn1yKj0XHUwMDE4O2eTNDac5d9cdTAwMTWCV+++Tt3wkXSI4NeNXHJcdTAwMTKGXHUwMDE1XHUwMDE1qnXak1jBXHUwMDBiXGZo/pvwXGaO1JCFvKIytVx1MDAwZl1lSFx1MDAxMiFZvVx1MDAxNVx1MDAwNe9cdTAwMWFI61FqXHUwMDBmXHUwMDAyepftm7E4KZU7aOurNlx1MDAwMKxmzNDs39eDP8Onpn8+reWyXHL9YD4/XHUwMDE2ichQr/1cdTAwMTVcdTAwMTWNXHUwMDE3TZvNea9sXHUwMDEyXHUwMDEwfFx1MDAxYlx1MDAxNFx1MDAwM4JrQist7vI+LXHzUq70wrzo5HVQu8SMtFx1MDAwNdhcdTAwMTaolOyeuyup2Vxu7PbNa79gV9xr3UM0xbGsQKwjwHwpx/FogmCzXHUwMDAxtn579k9cdTAwMDeaL+Ffn6H6sspTKZju6Fx1MDAwMSnDxyjcqzo5QVBrYZSxx1XPe1x1MDAxM1WTZknOWJZf+C0ttW5uYS6l4YG4Jlx1MDAwNaCm11x1MDAxM9S7UbTF6Vx1MDAwN3WyLFx1MDAxZLOuT4RlXHUwMDAzOiTNrHS/uvtoXHUwMDFlrsLbf1jsMv/izUMpXHUwMDE5+yg2XHUwMDBlS1x1MDAxMdf6fKFcdTAwMGZcctnqY4qvXHUwMDBi4W56epdSYqwlXHUwMDE3PPHzm77z5W5eQG0sLVPMZKCqT35cdTAwMTe05UMgkJcp8PqRWtYnS0ejXCJcdTAwMWNcdTAwMDC+X6EofZ/k5s9LRilcdTAwMTKxvT/PxYr/f57rXHUwMDExvzNcdTAwMWZcdTAwMWO/XHUwMDE5iWOJPlx1MDAxZZmGPlx1MDAwZa6D93Y1XGLXkklcdTAwMTjCOvx5+0FcdTAwMGLngvio6s/ezlTu6DFtXHUwMDEzkJYvMKqnh4ZcdTAwMWY22d2Df/rvyslhungjqXdPRNLHXCKuXHUwMDAxXGL7eFx1MDAxZuP5J9/h8SyyYv/HN7PK/+yJx21FupFcdTAwMDVMq1aOXHUwMDFkXHUwMDAyJdZt1+1cXHxRlkdcYpFwu1x1MDAwN9mBpMF3up5DXHUwMDFkys4znyO0cFx1MDAwMsSOu+k6dGtcdTAwMDNcbnxKkFx1MDAxM7fyL3NPnF5VgMc/jrT0mGpcdTAwMDdlgfChQIVP6ZP/m81cdTAwMDR3zH95+ivA5nC8LZD5RNf5m+Z8bDfmoviioMCipyNkklx1MDAxNtQroX4tXHUwMDFmmJaEXHUwMDFhXHUwMDEyUT9B331Q9WOo5DSWkvknQ1x1MDAwYuCuUIRAmXfbKFhFKP1k25pXXG4wXHUwMDE1XHJK76is5pda8U1cdTAwMWVfjnLMTGcs9ZfHMaP9b1x1MDAxZX9Jts1Abq1z3b3wjClGR3mbXHUwMDFhbrQw1+Ch1m+O5bYnzeTCiXJq+CpcYlx0sWWTLDZwSkCWriTdfIQrylx1MDAxOV/P7lx1MDAxYmL5IN/1N1x1MDAxMup3jF025zR10W5AXHUwMDFmzXKF8J84ZfH/PpO392xwXHUwMDA1QzlcdTAwMGVcdTAwMTa/flxclta/RuIwKlc+siPpjEEp7tJcZoksxFfAOlx1MDAwMU2DN+NcXLGvzk1vh9nJSfbg40OZgCBY21x1MDAxN1x1MDAxM1x1MDAxZmI29lx1MDAxOVx1MDAwMVVcdTAwMTLC5Vu/reHMrVx0PU9cdTAwMTJjrC7tVopcbp9fJ2IvXHUwMDFjuqOf/qc8Y1x1MDAxMrhqYNKwyNNcdTAwMWNcdTAwMDVcdTAwMDc4XHKodXAzQuxcbnNcdTAwMWUkmFx0ztVcdTAwMTXk79l/Qqx59vgkqVd4b3p7y2/PPDhK55nYmTv04oT3x6j6V1x1MDAxMng2M6TtXHUwMDE4dVwin0/me4ZK6Xx921pcdTAwMWRcdTAwMTFcdTAwMDN0L8+EM5mL4a9sXHUwMDBijy9cIlx1MDAwNOa/WupcdTAwMTI6Jq2wVzFM61x1MDAxM/vY4r5fnlx1MDAwYmW4iXGI0bhMbV/NOFx1MDAxY4flslx1MDAwNMbeXHUwMDBiV37iKFW9XHUwMDA2Y/JQXHUwMDBmyVWDSVx1MDAxMq61mFwiuo/aQZJcdTAwMTnOjDHigi3UXGaMT/7LLC2XIYBujuJA7Sud/6tNIOc8XGJcdTAwMDRGqf2FLoslk/q3a3x3pnvD6qbT/9B/70SL8syYRbhcdTAwMTFFPaUvfFx1MDAwM6LCueJLIMJJklx1MDAxZqXyXHUwMDEy2DZwaSO+XHUwMDAw7X3aoFx1MDAxMN1cdTAwMDCz4L+6VUPLX2XWaLeEUGOqqFx1MDAxMpXeXHUwMDE4tnlcdTAwMTeSuT0k46eoXCJut1+6JSnfqLy/tVwimiMmXGKYU5h6088688vprybe8T9cXL17TWRcdTAwMTaoSZrHXGbuQ92LkCeMjqWKXHUwMDE5LYDZp5qbb4ueLS0pTbQqsjssXn5nvo8hdFx1MDAxZfF4bJIxwo/puoyFJ8tcdTAwMGJD7b398trt9lx1MDAxZVx1MDAxNb7n/EhzRWgqnsJcdTAwMWHwafxn5pr437xcdTAwMTa/Qid0/aiG3Z4jeZiD5iuKqH7MSzdcdTAwMWTGlL7MkFx1MDAwN5SlP15ecyOk7EXpXHUwMDBlzSpGXHUwMDEwKYzsLHnnJFx0VJbTXHUwMDEwbyjFxpKjM8psPYvAiDTMpth0rnxVwd8lzED2cyZW2tiPbyRiX+UzszAlqGFtrdLwken5ii7nWsRcdTAwMDbqk1x1MDAwYsMgw58hQlx1MDAxNJVdUerKqOxwiKxcdTAwMWSkYrNcdTAwMTgkqrxXxG0zUVxy5CNcdTAwMTNO5NerOulcdTAwMDa0r19cdTAwMWJJR+w+t3pWXHUwMDA3mI5fZN+36p0+3mOZXHUwMDE4y9zF/9NM4r+aafeqUb82XFyNq5v6yFx1MDAxYvZRXHUwMDA2XGZt8VwiZI6+Te1mQoO3haJyP83+6sih4YZDU9GM6/Eh/ZhYSnuRXGLQQ9d+1/T3XHUwMDBi01x1MDAwNNnkyzd5e0mTXHUwMDBlOUY9XHUwMDE2p2JcdTAwMWWv2tWRXHUwMDE0zJj+V3fMRuWfuqPBmPaDrFx1MDAxM1xuduqrXHUwMDA2z4CTpVx1MDAwZTeTpjxcdTAwMTjI//jsXHUwMDAw7FR4wqlcdTAwMTm8XHUwMDE57V1sJ2BMfvhJYbQy8fCozZdD4ovLXHUwMDFi+remsmulJdiGwlxiXGaziyNcdTAwMGXpXGZcZnYyXHUwMDEwraR2rV+218c+uvU/tY36v7WNTjZcdTAwMTlvJ6nyXHUwMDAw97vnv1x1MDAxNctcYlx1MDAwNaZcXJ5B63tiPJGeXHUwMDFhxkmYkoVcdGN1hmHDj193ZPFwRWHjIINcdTAwMTmUgKs3v9zsXHUwMDBm9aTuuVx1MDAwMZdhh+jhwl7ropLAmZbN3XZOZCBDtvz5wcbmf3VcdTAwMDRcdTAwMGJ/YDWUbU/Z4W9KXHUwMDAwOFhDN1q27ipcdTAwMTDAXHUwMDFillx1MDAxMOTzKVx1MDAxOFxyv+NJ+lxct3nz3+e5TmKkqEpSyFxys4/f+cFuJb9z9Fx1MDAxMFx1MDAwNrttXHUwMDA22C1HYfKctvax97u818hbXCJSwmDg5mWmafVKYWdcdTAwMDBcdTAwMWL+dFn0v7pcZuPey7CQQI8vm7TsZzRQhc+Um4zEMiP0LTFcdTAwMWNcdTAwMWZcdTAwMWI30dWntuc5sOT4tVx1MDAwNFx1MDAwMVbmk8ZcdTAwMWTX6ok9zmlGjSVlUz1Q+lx1MDAxML5cdTAwMWMzbjVU0Fx1MDAwMpJcdTAwMDVoZ9ZRgWpcdTAwMThcdTAwMDRCJSZL/f3z6Nd/PTqDc6btilKJlipwfsNM6bTtknlcdTAwMWF/Yd+zXa/9XHUwMDExdERxTCE8Wd8t2anA4Hj563iRXHUwMDEyXHUwMDE25Ibf/bnROd70RGpe/W5eM6/eipBcdJTP5WioVLnlitvuibUoxFHC+vRp/ml351/tzozs91x1MDAwNbN3/VDJXHUwMDEz/Lxr2ZZ2ZVxyXHUwMDAzRs4666nzQkLI+kRcdTAwMTRwelOSVlx1MDAwNTVcdTAwMDdcdTAwMWZcdOIrWWS5L23H21xy8vKN+ZNVi5PwXHUwMDFlXHRcdTAwMGK2XHUwMDE5pU3jsjwkXHUwMDA3p1+c2PtcXE14O7aorIyQPfPbh5L7zUf4p1Yxce+PKDu2SkdcdTAwMDH/9anUTHTp6pCpjYG17EX7OpxWP8LXpatcdTAwMTmvvlx1MDAxYrR9+SQrJewouILI3utVZmCZXHUwMDA03ZwuboZ33mCNXHUwMDAyXHUwMDFlxNo+2Vxy/1x1MDAxODaUfkS20Fx1MDAwZTHhgVj0VVx1MDAxYl3fzFx0+MNcYr2V/8WI2etbXHUwMDEx/DCj8OSz+3hy5v5wsara6twpXHUwMDBicVx1MDAxZaFmc4uHPe5F6fP+bqH+d29N1mWxnfC+5og2XHUwMDBiXHUwMDE5eehDXHUwMDFmcE579lx1MDAxZVx1MDAwNqvZSmV4q1ohLECrX8SbTd1cdTAwMTlcdTAwMDOyXqyxXHUwMDFmt0JcdTAwMGbKfKel+Wdffv1cdTAwMGX/sy9l77FcdTAwMGJx7cR3gkuDOXllJYI0UHm/X66TLo7HMlx0XHUwMDAyT+G5VHN99+z7kH6363fTPd9cdTAwMTjVZyXrXHUwMDFk65FltdiuPaNl3Uf0XWiOzD7bSt3+fuz8XHUwMDE3y6yykpRQUedxaqL/YMZv3M3/YYYyM1x1MDAwZTjBfOnCR1ZcZkWOLZxQejssu1x1MDAxNiTR2VwieUaM7Fx1MDAwZlx1MDAwM1x1MDAxZEOMlOBV/+pcdTAwMTiy8KpcdTAwMTHziVdYv3NcdTAwMWIyj2lUqK7mWDrQSVpeyEWbcVx1MDAxZNVeW/DTcVx1MDAwMJN1ebarzbb9U7t2r3/rjl4/slx0XHUwMDA2plx1MDAxYnrA+Pfm9ml0e45cdTAwMTPfWPaIVsZp8/Y16/FcdTAwMTR/XHUwMDFhJNdT4MrWhrCyYFx1MDAwYsOhq4xcdTAwMDRxIG6TLmjTglx1MDAxMqq1XHJIQvXzcdQoXHUwMDBmKCvKX4W/znmf/T53XGKg9uRZlKFlbka26v7W4v+3XHUwMDA26rUjk9f+I1hvhzLPspGbXHKr4Vx1MDAxYqW49mCC1nxD6MOooDNng9Rp+bQxXHUwMDExZ15xtVxcL1x1MDAwM0DTXHUwMDAzSF7OdUOxWdDIbSiTXVx1MDAxZT055Vx1MDAxZlxiN4afj2hqq0vw9o8/oNH/lz9Uu1x1MDAxZFtiXG6gbXEs51x1MDAwNvqC71+RY1x1MDAwM/rltUejXHUwMDEwdzQp8Vjh2sxjgHWs5Vx1MDAxNUzc/WXsXHUwMDE3KsAssN9QPjj0nlx1MDAwNDA+I33Czr6ciFx1MDAxODs+Jl+nWk0/XHUwMDA2XHUwMDFiK4V6T1P+MVSc13Ku71x0f7VO3Xv9U3N9PTvy9rK9vIEwssh9oTUno1x1MDAxYZmRp8yhoWXER9x96cBwx0g+lFg09k7gMudSWJW4XGa0c2bhYYMwyuuSI6BcdTAwMDZcdTAwMDScnOq11vr4zr14oHyl4pdcdTAwMTOY32+nrY0neL7htX9rWD31f9bgesCenlx1MDAwNYtcdTAwMDGoUYKMmWWqw6rv8lx1MDAxMFx1MDAxZZHZ+DIx27D1XHUwMDE5IVpcdTAwMTVcXJXvyUPlXHUwMDE4dSOnk3GgXFxKiFx1MDAwNibf4t4vq1xmzcMqma75hlx1MDAxN3WIXHUwMDFmRTBcdTAwMTK5QVx1MDAxNlx1MDAxMM2tY37vUlx1MDAxM6uwa//Vh3B7+b/6XHUwMDEw57GGa6Aha91YQMCPlJMjWz19UGU7XHStK+eyq+YxXHUwMDA1XHUwMDA1TSeUxH8uVGYgsZq76tvZXHUwMDFhU/ikQbtuTpRcdTAwMTKB9onAaD1aXHUwMDA04aCiWZN/VKpcdTAwMGbvXHUwMDA2O8rfe1x1MDAwYmXzqs5irP44LP5cdTAwMWZcdTAwMGVcdTAwMTNGriiCPVx1MDAwNTl/X/H9l8PvzVx1MDAxZZZulaOg0YlsWJFjXHUwMDFmZFxcRFx1MDAwM1pU49x5l4+ZXGKqR/94tk6DXHUwMDA16NEl9JCvJoHDfjWPIPdwXHUwMDExXHUwMDA2hvd1yKlYRyF4WmpYdl3FJkv1x2H5/3LYXHUwMDBmo7p0dlx1MDAwZUxDkmWBpFx0QDpHQrl9R918MPakXHUwMDE08Ys6NFx1MDAxNDPB0Fx1MDAwYttKSHLBZ5d3QKM02Vx1MDAxOXxcdTAwMDSBp780vFx1MDAxOZtvauXNXHUwMDBlXHK3JFx1MDAxNCeb2lx1MDAxNt1cdTAwMDW4bMndtm9CXHUwMDE1cv9qqLryb1xyVeVcdTAwMDL24DpcdTAwMWal2MFKXHUwMDE3JOlcdTAwMWbDM1x1MDAwZUQt+bdsuzdhLVx1MDAxNChpjyp5/N57aDdilyWDXHUwMDFi9Z/GXHUwMDBm2nbSnlx1MDAxZFx1MDAxMFxcgsTS9vhu+kdB/c+mpPLvXHUwMDFkXHUwMDA2XnpZSreS1e62Sb/8zmU4Zy3mVv87l+FcdTAwMWP033OZ6f2ujN7lj4fKXHUwMDFmQUMoPr//1nE+Wtzlz/WlJ+U5Rz34fUiYXHUwMDFiXHUwMDFi5nbnQeZy8rHqnSrV0nes7/ZcdTAwMTeBub3BXHUwMDAwr8t2tbdleFx1MDAxY2H4hOqDXHRDarUvb2b+70xo+N/vtn2AJICB6FxinJR+c3KVYnZVtIhJY1xuf+9Bq4SU+Z79SlxmXHUwMDFiZ9I+uHiaQlx1MDAxZlxyzCdxfUyKXHUwMDFkrVxylFDE4lRwqlxcvzlstWmUy4dBjI+L5deG+lehqcA/58PHv+fDyjv7SmxcdFx1MDAxMs1OUEYgMO7KQpNcdKrVa9cuPLitXHUwMDAwXHUwMDFkREw95MMzSZU7gU2MXHUwMDAzpj65N/ElJFx1MDAxNMCPJEVcdTAwMGKb1+5x1fKo93rBUz/78ymQhWJDclGKXHUwMDBiiTSv5Fx1MDAxZlfLbfYvVzdeXHUwMDA3XHUwMDE5llx1MDAwYtFuk+B3NW0vXHUwMDE2XHUwMDE17c5cdJHmmvzr/KInLVx1MDAxOC6G5tye7DJvsGNmf+TgXniUVq4gzFx1MDAxZueQXHUwMDE5X4Lz1MPjzDY+gVx1MDAxN9GJLSFHsjNcdTAwMDG/i2AujFx1MDAwMVSo+t5cdTAwMTb8/qtcdTAwMGb/qub/1oc9VnGUuKk8ojrI6jEwO/uqak5m7LlcdTAwMWJT+Dqu3pDUXCLU3sQ+aJlcdTAwMWTyLYerXHUwMDA09aDA5HBJI/chXHUwMDAxgsS90yNRvuTIaSU9VZ2XelxyzX19KqdcdTAwMTZFo6FO08UxXHUwMDBiXHUwMDBmsDu0avpw1D9cckf9j4ZcdTAwMTPtXHUwMDE3LFx1MDAxNKuZx+DO3y54fThdbOdcdTAwMWFVPJWuhtnPRihCnVx1MDAxZaQ/0fit6lx1MDAxNWu8IIiUUetcdTAwMWGhe3KxM9yTIIH0oOm6XHUwMDE39L9cdTAwMTjasFxyfns3LypGdG1uRlqDvVxmqfDRKV/O/s7AhXv+91xm/N36TJrZhI0jXHUwMDE2XHUwMDBmTmmJzJFTmY9GUGurf9FEl/DeMadcZmB8xJPlhGf9V4PxhlhRzFx1MDAxMu1jXGYhh7WhXHSRnsb3i+ZU8NnJIPFcclxcd3NTf+RWrEAmjpwjZIk+yP68ZazjP4587G7CXG6TaKvwNiSSOX1Deskp1Fx1MDAxNUzp0WYzzFx1MDAxNSuM28pFXGav9Fx1MDAwM33NYY59LXn2x8/ZvvnuXHUwMDBml+xcdTAwMWYtQ0vdPVKpLvVcdTAwMTfe75aYPj9wiC7m81x1MDAwNGDizI9bXHUwMDFlXHUwMDE4/Iu7rO2Y9i9cdTAwMWVSc2KKf+tcIu9cdTAwMWauXHUwMDA1d5WVXHUwMDAzMU5cdTAwMDW61HPPSVx1MDAxNP/g8Vx1MDAxYjKIM1xmVKk5w8cnKjXGnG9yXVx1MDAxNSlcIrx6NFx1MDAxMv/oXHUwMDEwMv1diiR9O/z8XHUwMDAyOVx1MDAxMT7rUJLa4V7n1Fx1MDAwMCur0iyfo4+Qt/B5fv3VXHUwMDE5XGKVy/ZCl/5cdTAwMWZX57HkLLBs61x1MDAwN2KAXHUwMDA3MURcYu+9meG99zz9pf9zXCL22XfaipagKnPlt6CqXHUwMDEymn9/51xmIeqS3ZC6JU5cdTAwMWFPNfvLcXtWMptUQz5lVbnJQVx1MDAwYjVQ51x1MDAxZEBqIJ+HluRDPlx1MDAwNJBZYnIn9nlf9mU2JKineSmseO/lKFGWZ3mciX1cdTAwMGa78lrZyeS+LMticjnSpneSskw4+jYjP6aRb2xcdTAwMTa3kubzkNyHSf1cIstOjoSnNMOgf/BcdFh8+PfWO7mCZmAqnkclXHUwMDE3wTiYXHUwMDA0RFHhMHKKhERXXHUwMDE2bydcdTAwMTR95muepqPmhD/sb0g3r1LehO/qP3renZ9TQZH86Yqy8fBcdTAwMWLQ69P848V0M1xc7rd/dl3YIb70aVtcdTAwMTU3IUeGaV+VoXPJ+OxcIlx1MDAxZD24Mlx1MDAxYjeoYey6c7f7Nlx1MDAwNN3aXHUwMDBiY+CqaFx1MDAxN0c71HvhtcSi56g/9vN3XHUwMDAzy0J7XHUwMDE0eDL231x1MDAxOaXf1l96ZzCg5M+rfdi86Fxc+s/zXHUwMDAz7uvzu+tcdTAwMDOiryZftlR2yq67RrMpoUBTSXw6XHRcdTAwMDKHg89nXHUwMDE19TWVTzKl+Xvtjkrpq1x1MDAxZi7scVx1MDAwZbLgea+t+j5cdTAwMWS5+Vx1MDAwMDCGx19cdTAwMWXWkPmkITknb025V7FcdTAwMTi8kP7z1IDZSn+/XHUwMDBiXG40ynxtxeRmPEZ2clODguK5hHl59b1cdTAwMGWKXHUwMDEyXCLNa1x1MDAwZWVdXHUwMDFi9zFshUPkXHUwMDBixKLbg8fvqOQ1KzDuXHUwMDBlXHUwMDE0XHUwMDA0UW1AT1x1MDAxM/hJgOxXvO5cdKtcdF6dsjrtm1x1MDAxZFx1MDAxYiv6TWVcdTAwMDPmvnu6XHUwMDFiXHUwMDAygL1cdTAwMDMsWur7efQ0n9P9OpggheQ4c3lcdTAwMDYjQu7uutOiOVx1MDAxNEL8XHUwMDAxRe9Y2PdJZ9yE0/7ruVGDNY4xJkDs78yEhu6Rl8SFzG6L7LtnK6t4l93+rS3T3SGr33sthFx1MDAxZmq/w0bLOp5cdTAwMTMzN4BPjlxcXHUwMDE1XHUwMDAzjZM7hUFccoZccvJcdTAwMDTykFx1MDAxNvX9d5DhXHUwMDA3yJpPsD+zrcLX+oAv87hlN1x1MDAxNq5cdTAwMDSTeoVcdTAwMTXqz1x1MDAwMV6/tZOyXGIlQlqYjVx1MDAxY3hcdTAwMDM2Uqos0r9OaT6VmVxmSnOB+5vXNev8JP1ZYqQhbaynXHUwMDAwXHK3ybBcdTAwMTdySFx1MDAxMINcdTAwMWXvo6LFWm5ZX8+KSlFI61xmXHUwMDA00rKQ/7CCuYa/M57/nTVOnlK3qG/thOT3nnriNS/IbP/1hVx1MDAwNlVTx21cZiyWMvmKXHUwMDEzd75zN+TCaZ2aVlx1MDAwNm/9sldcdTAwMWZcdTAwMWaCpHPHKepcdTAwMDZcdTAwMWbUXznW/94xOui/vfulXHUwMDA2+ULJWP+eZ3xcbuonXHUwMDAyX93fP1wijUK+SIzm2MFcdTAwMTCDI6e5XHUwMDA1nOz8aSduZ8h7LfgnNTKRo1e6XHUwMDFmlMCpPoW7OZhcdTAwMGWb/+bSNbpkiOZ4JyPmsyrUq78y2apcdTAwMTD/mk2reVPgKdDLa1x1MDAwYlasRnepXHUwMDE4XHUwMDFmTMdex/dXXHUwMDE40DQ+U9bb2PF7d/j79+zprpNCX197Mb/m/TxL+mk8NtGjXHUwMDFmXHUwMDBluewvQFx1MDAwNWl2a49KaUW//p3XY0D8Wy+ht15uXHUwMDE28226ZULMpv2Bp+zondly412nLzxbXHUwMDE5K3rm/Fx1MDAxMVx1MDAwMFxcfiws9czyJ1x1MDAwN1x1MDAwMcGUg1x1MDAxY1xiXHUwMDBmmP5MhVx1MDAxM0tcdTAwMDZ9eNl6UYbkX81m8V5+fjhcdTAwMTn6QmX8zcepXHUwMDBiM/yWnnfsd0iugu11lkztpYdXzqh1xumaSdlcdTAwMWZLbDbja3Fu6XQ6vaHzX/Ep6ebkLz74aN2H3la4XHUwMDBlYVx1MDAwNFxy5NA1X1+c6Vx1MDAwMbynXHUwMDA1l8tvVepOllB+53ekbpjM6ktcdTAwMDfqXHTB8vCdtFx1MDAxZtraXG5cdTAwMTGVpFx1MDAxNVx1MDAxM3y6pJK/1K3050NfjSP/S+NcdTAwMWNcdTAwMWZe+p+PxP8zfm6O+5+pvcFT65TDZkqG4kKfdnOM0J/dSFx1MDAxMPJcdTAwMDTN4I11Nkwoa0RcdTAwMDZx4NyxSlhTXHUwMDA2YeL537gg/isu2lx1MDAxOI9PQFjOXHUwMDEy+T54iZBx2+kjc1x1MDAxObVXjUyDyvBcdTAwMWKNXHUwMDFmKkG4XHTzMpNsx5+wQG5cdTAwMTd+LXJY4rzFx8Rwclx09/V91Y+LttNEaovyjc+XbKwgdc1SkIOBqN98XHUwMDBm3oHM3+liRZ1cclRcdTAwMDVBL1xyXHUwMDA1Q+5lhbr0iCFcYlx1MDAxZis9N91xyVx1MDAxNEg+2C5cdTAwMWGMzfFS7eZfcvyVrmhDdMauS75cdTAwMTBAq1EmXHUwMDAylru/t3yJolFkkVVddW9MIY/5XHUwMDA0XFzV/O/9nv91vyOe4MvKOClcdTAwMWEgrUK//LBCbXZo4LZcdTAwMGbSnVx1MDAxNK77p2nEf48vjmSCT11cXFF8eGiaUmKkK6SR5SZIMlvag/VN/tQ3hHlcdTAwMTH+XG73ITtcXPTmvdFUSfXy28hDeEzA5OvX8T1MXHUwMDEynl3sekDo1a+LyEI6T0ZcIm/wccNxe0JTbPzTVVLZareb0sv4ipvopK+OpOhcdTAwMDP/XCLgl3bZeEjbrFxc8DNcdTAwMDF28nGVgmOo1Fx1MDAxM9WX255OQs0xXHUwMDAzhzdcdTAwMWSh0mVOXHUwMDA231BcdTAwMWbeXHUwMDEyXHUwMDA0mFx1MDAxOJDwooShlWzp6lx1MDAxMUYg1LJcdTAwMDdYXHUwMDEyX56aXHUwMDA0XHUwMDBiXG6p76tFeIFaYU5L03vNJHDJxVx1MDAwNuLzq3fcl7yu+jP2XHUwMDE1t7AhXHTxf718N+HLJX/MOuVcdTAwMDX6XHUwMDA2Pp6+XHUwMDAzjWn0apbY+7liXHUwMDFlRJ8g9mtcdTAwMGYqk1x1MDAwYlx1MDAwZlx1MDAwNMpcdTAwMGXPa2bDSlx1MDAwN+93QVjKXGap2q6KQEJeXHUwMDE1fvFcdTAwMDV83ftArGvKoa17XG6ozVkuzJlcdTAwMGKVj2vdVfA8iYflyIE7fEfy1fPyT8+p/0/P6YHkkWrbc55eXHUwMDExXHUwMDE0+ciILHuv5k1cdTAwMWNANNvUgqHsZ1x1MDAwNfJLIcqYU4Sx3KImJkH7RrTZh0am69SMXHUwMDFmQDUmQbl0y/h9g6133XY6n2PALqN5/s7OY6txn5/29WzkzT69u4NcdTAwMGaG+Zgpf8N/eb+RecFcdTAwMWUmXG6mN0JcdTAwMDbjmH085vBcdFJqYv5lZacwcz6AaNH2Tdd4dUmyUu5cdTAwMGZ36ELL8+BcbmBcdTAwMDRcYo7CM8J27lr0KL17fEmX4nQ9a7Htx/5b22uOJDC30J9/+kxq+MbtXHUwMDA30Ln97zFcdTAwMDDt6cbfRtdCuFx1MDAxNFx1MDAxYqRzXHUwMDFmq/i/nibmXHUwMDAy7/vn7/xKXHUwMDAxgUlIqCacZ8RXf+xcdTAwMWR/fVSFmXWYQVx1MDAxM5qR+XHnXHUwMDA1WeKwKrjpVHlbj1x1MDAxNdU+1Z5cdTAwMTOO3nM0I6JcdTAwMTXtW/PyxFxmoyWeWPrv9yea/JtcdTAwMTNg/65s3brlkp2cXkaJeZBkwreCLHJJtHDlQul7XHUwMDFhal2nRvzvPItcdTAwMDNaXjZcZlx1MDAwMSbyi1x1MDAxNyjEjEtNeo1mmHrSQ9mXJYeDbF32apBcdTAwMDJWxpPYNefJaoaCj+romIu/OflayL7Y7r85aZ/4/5uTZ/uNfry431JmPE++XfbFKW5cXGBgJ0K28rOKWG1QmZ/0XHUwMDBi+DtFS3Rzuk1oRIpiQ9uExrw/XHUwMDAwZjlv6Jl+99Hmp5qX008kSHXB/fPxdNOlfve/eYhg/8lDwWR2dFwirbtGgbHU4fb3xWLlXHQ2/StbXHUwMDA0KK7ecp2f/KBROYiHayQ/XGbbfGG+1b/nr9uWXFwwkCTaXsPyfZPob4mLWTGNzlx1MDAwYlRZXGLLrL/8qJUxLyOz84859P9iXHUwMDBlPVx1MDAxNH5CM6zbjepvVbXfwMkgtM1cdTAwMWNyklx1MDAxMKJXm1x1MDAxMDGO8lx1MDAxZNf4eMZcdTAwMDWj2UfAJ/zz05uH7lBcdTAwMDLyXHUwMDBl99muUkLKOEREhlx1MDAxMd3pikAtIyssNlx1MDAxNctQ/tbDiuabi1x1MDAwYtDRL1x1MDAxZlx1MDAxYSiB8act2ymDvaVcdTAwMGV6XHUwMDFkiXFcdTAwMTJQIMu+XHTKTLiJYL4t3D5xivSOUCg8n+zlq+lcdTAwMWLSOVx1MDAwMyn0wW5QtJ5cdTAwMTT97OBcdTAwMThZn9pLoJbpXHUwMDFmkb9RSKzvLlx1MDAxNn1cZrT1XCI1flxu5nRJeYwp32l/79Y7XHUwMDFjwP7DI/TFRKXmXHUwMDE3gC5EwLY+1/G3T8rRnGWrXHUwMDExyVx1MDAxZM9bW57jNOir+jKkXCJr9HQzpnBywm6umUr+XHUwMDFlZVx1MDAxZdrwXHUwMDA1XHUwMDBizjLP51x1MDAwNGd4XHUwMDA3/btCrtdBZt6FxciRvfqYJVx1MDAxMlaS8aj+y1x1MDAwMZx+/k9cdTAwMGVcZnSkpMnLdFSr+1x1MDAxN1pcdTAwMWUv6/zpL5pMXGaBKsyKbE9FXHUwMDEy+7VSNHCik/dSQFx0XHUwMDE5p9JcdTAwMDd/7YyOOXQ5oyxmv/1axVx1MDAwMYrf/Vx1MDAwM2CulNpOpyt9m1x01udl0CRS62TeiH9aUKnX/9GCnk7Uilx1MDAwMMD8k8SEvlLaK1x1MDAwZkL9XHUwMDE5XGIoMcnb6Vx1MDAwNoZcdTAwMTQ4XHJcdTAwMDKNZyB8Vlx1MDAxNtFr+ZWd68aEYCdf9SYjPlx1MDAwM0GSuu/l5S5C2tz1ebRcdTAwMTXN1vpE9Fx1MDAwYsBcdTAwMTNcdTAwMWVcdTAwMDfA+tU4tGWuXHUwMDFj9uzzXHUwMDFmo9VV8Fx1MDAxZkaTeFx1MDAxYYmUVfjCXHUwMDE0zVx1MDAxNW3+XHUwMDAyZj1cdTAwMGWku3WabI9gXHUwMDAwo41cdTAwMTKAIIIp3V+vhv6L2p/C/DdcdTAwMDZcdTAwMDFcdTAwMWPoXG5cZlx1MDAxZmj011PxzKNcdTAwMDeHiVx1MDAxM/FcIm6EWVx1MDAwZcZA9UXV759vyn7skXkq/XqXYpO5P4YzqPMtSG5cdTAwMWL+ovYvj1x1MDAxZOQ0qlx1MDAwMzfssVxye1+xg4XaWpJI1YFcZo6dr/CLY7xG3Fx1MDAxM2f6flx1MDAwM+xvjVx1MDAxN+uoT7YmXHUwMDFigtqUTVWqOFx1MDAwNXXQcfjcjDtqJJ9cdTAwMTNcdTAwMDSfydYt/dXCjjslYqHP/9GgS/+PXHUwMDA2Mf80yIOp4vjrLVxmLshcdTAwMTZ9XHUwMDE57lx1MDAxMXcpp1x1MDAxMCTzRO9uasNZr/dSZGgz3lwi+mdiylxm2lx1MDAxYujlf2FhwtyIzVx1MDAxOVx1MDAwMlx1MDAxOcKzXHUwMDFiz7E7zo+Cdf2Q7bJk1yW/PphcdTAwMTVcdTAwMDZcdTAwMTk2nnd2X/5cdFWHgsPnn6d02+D/eEqn1HpXi/g+fedcdTAwMTa5P+9cdTAwMDBRP+CQauxvTkq3q+iDXHRcdTAwMWFcdTAwMTdSXHUwMDBmXHUwMDFiblx1MDAwNHlwP0PzPaVdQr61xe2/M3hzL+ZcZuSd27/2XHUwMDE2q2LdOCiojopqwqKfq0LTeIyrbcugS53Sf3rEujx+Y5+3qMTfsJJOaCpcdTAwMDLSXHUwMDFhwjzMbKyxXHUwMDE4mZ9edjIwoIdcdTAwMTX7ddnIoShcIqJcblx1MDAwZlx1MDAxNiXR0LMl91x1MDAxYVx1MDAwMvubXHUwMDFkylx1MDAwNX7YPZ25dOFcdTAwMTiw4FaTQXlrjrZcdCFmoVpcdTAwMTNBeMuj2Ckr47Ku47lcdTAwMTltXFxcdTAwMDVhsTOyLXbKm1x1MDAwNFxcrDvyXHUwMDE2pf3b7XZK4DeFKeG9LujLnDCf73S2XHUwMDFkXCKY6F01sNffWU5o6UA6RIJtWqyo0Vx1MDAxN+7aXHUwMDA0bCyt5lxcXHUwMDAxJMBcdTAwMDV+KcsuO0tupVx1MDAxYc31hI5ZRYqPolx1MDAwNFxysVtcdTAwMWLQwpeGtSZCSL2ZgdnPnC8syCYhbq17g/iuplOmTn87XHUwMDAyLYqk//hR5OsqXHUwMDFmq5HXTErdZJCAjVXwTJXu0U16Yr6fKfazZF3pUb7SJ32AX8o3IUlCh7xfcb7DT4v0V7JYzm05v1Y/c1x1MDAxZYava33vxTYrjGH4iYWnZHlN9K97+MotJ/tcYsCqXHUwMDAzJMau61p1N87bZcPP6vyYh2aXMqznS/36hUzJNVt+TETQ+1x1MDAwZqyhXHUwMDEzLPZf/JdcdTAwMWLvOOSlxO/u3rpNmlxuX4B01fXbLS9PnyzVTTmdXCLS5szQY69uY82WMeKWjaZvXFyee8KDSMDcLKa8espNp7RwXHUwMDExa9j0XHUwMDA02tDw11x1MDAwMGyPXHUwMDA2yrZcdTAwMDWesVnnb39NRUVcdTAwMTNcdTAwMTTx1udVus5cdTAwMDdcdTAwMTX6Q2t/e1KJSzzvXHUwMDBlXHUwMDFhWaF6/dOBfchYy6XuXiyP63jG/Vx1MDAwNOVccuSD9dbtlzh7Nn2DXHUwMDE09IlvqVxiKZljxSFiJmWSLMlcdTAwMTPf101cdTAwMWWOd+ztPDxWnfDJXHUwMDE4/XuuXHUwMDExa1x1MDAxY/X9Xssg6GaamMyaXHUwMDExe6pljeT22c1UYKH+ireO2YibS8Skyd/IYr19YurIfaZcdTAwMWRp1DhcdTAwMTh5PlgxdZk/q4aoQ1x1MDAwZrpbQt2dXHUwMDA09q8t91x1MDAxYlxcXHUwMDBlwFx1MDAxMXKlj1x1MDAxZPfeJ1xi/Y/La6x+f03xdNQ72Fx1MDAxNPuzT0Is+Fx1MDAwMlUjQfj5LYokXHUwMDA1dd3tcqF/qPd389f429j+rFx1MDAxYeE9UTTqusY45bVTZEafXHUwMDFhKGJcdTAwMGJcdTAwMTS9fj50fnHPQdfr8l13IWy7wcniLcpcdTAwMTH8erPx9ZNRnJzcvDzwXHUwMDE0XHUwMDE4MPDA1OqQe4t3W4Pcnm1Jl8BcdTAwMGb991x1MDAxMmpLhv1cdTAwMTV22irL65L6hXOshL45XHUwMDEx4cQ4rDRcdTAwMDRcdTAwMGWfJcik/YCNlF6XXGaJtidPobuNhrouh1x1MDAxZrZD0eyoauQnXGa8sCtcdTAwMWVcXLSlqrhcdTAwMTXwSfGfMWRcdTAwMDOzk8ZcdTAwMTFcdTAwMGbFXlx1MDAxMMXRY17sO1XQi1t3gzFcdTAwMTT3NNBYOpt5dNu3dnC9o6toi1OYXHUwMDAyretLXGaDJELIXHUwMDA1op9cdTAwMGWDRCNcdTAwMTJcdTAwMDQsxbQraVx1MDAxZbnjXHUwMDExTfWL282Pe+ud8lx1MDAwMVizXl9aXHSsvi1cdTAwMTlCMd9cdTAwMTCJ1Yu/wt67gb5bXHUwMDFhyNXbdsx8udSLb/hcdTAwMDN0w3XtbJStNS1EiVxiqfnqqFx1MDAxNL1cdTAwMTN7XHUwMDFmI0nbrVx1MDAxMFxmx5v4Truma/1cdTAwMWM7/VwiWfL1XHUwMDFjcyewuFx1MDAxZeFq+lx1MDAwYruCSOS8pmP/jbFt0sFcdTAwMTk08KJJLzVmXHUwMDE1ME+ATbqhc6ossUK9Q1xmpfBcdTAwMDXK9e/lQ4WigEZcdTAwMDBcdTAwMDCeRvl9KVx1MDAwN6RaXHUwMDFhqeJZ6f81ZVx1MDAxYU+EXHUwMDAyct5cdTAwMDHzaDhcdTAwMWFcdTAwMDD7feGUk0a0/9RRuVx1MDAxONhPR1x1MDAxN3DEyFx1MDAwN/5cdTAwMWNQfmtkLG0ogVSl/Maajq/XPmQvZ1fTW0Jfy9152yhcdTAwMWEwOWulrGG6tVx1MDAxMVx1MDAxMfpoi/uKQYp8X+LnPDnDjYhwdL3Y6onuxdCysMXuZF0tllx1MDAwM9S3wqlcYrn7uFx1MDAxZL6UmVEh3lx1MDAxZJiw57IpgXXbKov+OL9cIvLxLeG+XHTbPZ5cdFwiNPpcdTAwMTRt+462soeQTrdW8n7MkSoxhmSiSkP674BcdTAwMDOwX6R69Hf2LHdXaGTJkVx1MDAwYl44sPNcdTAwMTb9zNlcdTAwMWVcdTAwMTCHnuNHZI32Xvpf66JPb3lcdTAwMGL/XHUwMDE45+BM5DusIXP18UFS3tvBlF7LXHUwMDBmUlx1MDAwNvPFrGLW+ZdxXHUwMDEw3/s+SyGW7NBcdTAwMDOvP5iJuJ9m/YP2lHOe0DdcdTAwMDLWSFx1MDAxZt+rXHUwMDExXHUwMDA3nZtcdTAwMTODvz3o5Fx1MDAwN6DmzkW4TFxcXHTH8ielw1x1MDAxMpx4Mj3qjsqEX+1186i8gXrQutxGelxcwFx1MDAxN2igvFx1MDAwMYXcb5GnsyzlyvnQXHUwMDE2lVx1MDAwZdZOofz81ZFjW1x1MDAwNsrD6jG7PVx1MDAxZq5k4cNcdTAwMWaLfFx1MDAwM6n/zJCePnBFu1x1MDAxYVx1MDAwM6Ce9lx1MDAwNZXyRVxyzbHgI+ZLXHUwMDA1nD6QKFx1MDAxZUlcdTAwMTbzJ/amqdu0jCTnUdNcdTAwMDG5k49hUXTb0Mj9ddp3SlOKXHUwMDA100u3t0lb7MacU0c4+JOdI/k96XdQLc7uM5rbZfGThklcdTAwMGWgXFxJXHUwMDFlQo08XHUwMDFioWXEo/VT780ggaRqMlSJWVx1MDAwNFx1MDAxZP5qeepcdTAwMTDovqjDYJD6tSp8WjfH0UPZhaJOVTQvd9Ut+veslUJcdTAwMTPkiOXmKVikX6GsXG7g70rsO5rc99DJNUlhiGqoaDSrLLyiJ2OmlMBcbj/dc1CB1Fx1MDAxZZy+h3bF2W4lz8Vi2k7X089emWSBTD1eR0yt9kzzlrc891x1MDAxOXT8tK28s0LCW1x1MDAwYlx1MDAwMVx1MDAxYySYotrvXHUwMDA0WPpcdTAwMDR6qqlcdTAwMWTxeFx1MDAwNmcqbaREbaRjNsze6flo7J3zPc5Q7Gbb+dUr8Nsw7Y7017rwJtmZn6Gs0zxjXHUwMDE0ISn+jlJcYqh0zFeS/Fx1MDAxMa5cdTAwMWa/Slx1MDAxMCrSMpTq305cdTAwMDLjV/SJsNn53z6Me1x1MDAxOYGMprExilx1MDAwNslhXHUwMDFmKrt/a9ZktnzZ3tCXXHUwMDFmqNght1x1MDAwMjPwI2VBXHUwMDAwgZR8MOAj2+q3nVx1MDAwYi30+onI9phr04BcdTAwMTOe4WD+clwiMuV9xV57ds75pOeFXHUwMDA3sfTIlaeekivRTilcdTAwMWLOfXDak2+ZMVx1MDAxYuzpKyPXXHUwMDA30mtcdTAwMTc4+5/5XS9cdTAwMDKqWkBcZltcdTAwMTJZxofR7p1cdTAwMDWzg5tir1BcdFx1MDAxZjCuXlx1MDAwMnlXU1x1MDAwNzTubDj/4WfpMio7SFx1MDAwNvbi8bcsdldcdTAwMWNfxTsryUtniGYqa5t/atyOnYFcdTAwMWUgYNRJmEBLe/9MMmPFiUGpIUNQbbPI4Pyg5FwiXHUwMDFl7Nw6UNf7moPhXHUwMDFhuEPxz57Ti1x1MDAwZfmXMWVyW+MhpJvJ00FcdTAwMWOGd/N878+oQuMriZNHTL6HXHUwMDBm61x1MDAxOcaktiFw1XQq3vZp0l1cdTAwMWHoKb9LLTj1ZYLxnGSYXHUwMDE4XHUwMDA0jenC8dLBgK47pVx1MDAxOKRcdTAwMTeHXHUwMDFhPXJ0UvNDQ5+qxD9YqLpa13PWr0VcdTAwMWV1XobcIbNeTjf58pIxVKQ/XHTIlfAyaulcdTAwMTNUXHUwMDFmmUmTTGuF6lx1MDAxNFxcheZcdTAwMWRb9qc5XHUwMDFmwmX4YUnNtfIlT51cdTAwMDBt01cr3WBcdTAwMDHPM+dcdTAwMDe8fPjVSTtcdTAwMGZ6TYxPj5/ErFKtXHUwMDFh0uGuXlx1MDAxYZz27HxWyqxcdTAwMTdrVlhCottZ+lx1MDAwNYWCdONoRfW2LPpwpDikVXF/XHUwMDA0uca12dR20lx1MDAxZCFWhflcdTAwMTkzR6//+3zAVjNQ10ZlyyqTvrS/aSWejCUhv/P+NHdzg+2NaD4qXTP1+Vxuts30oVx1MDAwMlx1MDAxMEtcdTAwMDVlgjJqt+dcXL9Rd4/XPWR/XHKu9vigkYPNxNCchlx1MDAxMqJcIsZteJ7bMr9AZ0KzK1x1MDAwZnD78FW1Zb7uOVx1MDAxZfRcdTAwMTTYTVwibN9cdHcgQ2wvIJt5YIxcdTAwMWNe9snMXHUwMDE21IdcdTAwMDXBLzS+lca5Zb1r08+6q5z2lP7WNVx1MDAxZmSTdFx1MDAxOZwwJ+XGjiPhyzE4JPCehkmSulx1MDAxNaFoXHUwMDEwuZdcdTAwMTKHaUNcYo7GOPC1U3Cx4Vx1MDAwMrVcZnWrUcBdx0HVsJT+sFx1MDAxOFx1MDAxOP5cdTAwMWRcdTAwMDLlRI9MyKm2fkzvivWXXHUwMDExY81cdJHssJDMwJAo26hOn1x1MDAxOMuuXHUwMDEzt2lYXHUwMDA0maSISjtcdTAwMTlcdTAwMWKwr//Xk3OO6s44eK+/ttF1NFx1MDAwNOFLXu/0W6Fcbn5biE+/PSky2HGXX3VJmjFFs1A+XHUwMDFjiOUmOKnZXHUwMDE2rVx1MDAwYk7047XULcevdPNcdTAwMTLiiFMoVa0yueas+9BcdTAwMDSsaIdcdTAwMTjKNuIv6FxcXHUwMDEywzZ9tjjIKKsmXHUwMDA20aHYiTutvyhcclxi55BcdTAwMDVcdTAwMTFcdTAwMDJmNkJGiXqV6IFcdTAwMDWSJOlcYi42w5D8/GjnJagwrp8sbqb18n5MqNBPf8I0XHUwMDFjhE93b+pj17HSktxcdTAwMTjkK9VcXHCkXHUwMDBif507jOhN1U/d+m1xMVxcjrhM45KGh4FrsMzBNlx1MDAxNVx1MDAxMYredkvC0TlJXHUwMDEylsCYdX8zn1x1MDAxMOtpXGJWnND4zVx1MDAwMlx1MDAxZuAtXHUwMDExqPKyxlx1MDAxNFx1MDAxNZ0gT/2Hyn7M2TZ6xv+0+XqicHZcdTAwMTb2+V7Z9UZcXFxif1x1MDAwN1x1MDAwMFxmZJsvermVmClfPjNcdTAwMTaHkdjlv6v53lx1MDAwNT+QN7E3s4Ukd0V2MI570nJE20/oXHUwMDExmEBeZ1x1MDAwMn1mOGK/papcdTAwMTfv/7IuXHUwMDE582wjPkaglFxiU1afa/gxnJh3cLp7WU62WFn7MKhPXHUwMDEwwJxcdTAwMDBcdTAwMWb44U1VnZJLkdu67bTxbtc5XHUwMDAzYrYxOnet4DlqOa3pXHUwMDBmXHUwMDA2YHXJ3XmK3GAkXHUwMDEzw1x1MDAwMrK97Vx1MDAxNECzZoOI4tfiqJKt+fKBhG1cYn/OjPTggnJcXOTgJHGOtODvfTGIimfa1lx1MDAxZG6suvN9Plwir1x1MDAxY3dccph8dX/X/EEzIVx1MDAwMyFcdTAwMWTYXHUwMDBl6vRrxXtua1x1MDAxMiVYrXAxfT3phY1cdTAwMDFcdTAwMGX+W4Po23P0rZYgM+N8W+Jgx5d4XHUwMDE4K1x1MDAxN7BUOVx1MDAwZYSe1SDSwmUqbFx1MDAxYrWD/Tr/LtF37DFcInq1b7TqR5gmc+9BhIO1gs98XsG3tmzfW12CXHUwMDExWat9zqaBJ4n+WnJkf1x1MDAwZaDrxTjQtzF2gEJRXHUwMDEw3LRD3OLFTneKJ0ff+cl3jF1AkD7Lelx1MDAxY0Je2f6A7M0xmMquXHUwMDA1IVr90mbc2pXY1uXK4pArQSx2R+BcdTAwMDFcdTAwMDNQiDGEO1x1MDAxYpFU7rHSgpu/xVx1MDAwZWROournXFz422n9XHJ778Y8IGJcdTAwMTZZpkM521xuf0VjMoQ3XHUwMDEx9sGphYarhkRia1ZcdTAwMWM7Olx1MDAxNMdcdTAwMDCDjzhoXHUwMDEwlubWx07oelx1MDAxNXepptNcdTAwMTRdiXzAdVx1MDAxMlxmgDOtKiVcbne0xjZHhaywcd9RwFxmQVBO12hwQlx1MDAxZfNcdTAwMWNcdTAwMTXR0n20XHUwMDFj4E5cdTAwMGKhNNTQUWyMe4YwbWFcdTAwMTTzXHUwMDEyqFx1MDAxNfFwiKiPuFx1MDAwZimEQ75cdTAwMTY2WJI5XHUwMDE0+17AmtLZyl5fgOhXuVx1MDAxZi2mVz5wZym37Wp7XCLzMFx1MDAwNdmtK3r4Tq1AXHUwMDE3qkqwduJcYjvVg+Un34tcdTAwMTfVpS2kXGZcdTAwMDf9TNanXCKrZbqEgSy9f++h5Vx1MDAwZcWp9lGVKrCbnp6YhTNcdTAwMTe0y1x1MDAwZVx1MDAxN3BcdTAwMDaF91xiebmJzHBcXJTi1pf319PUkDsrXHUwMDE1ls3C4Cf9bVEpXHUwMDAwo1XEXHUwMDFkOlx1MDAxZKiakUcxzHfea/xcIlx1MDAxNV7qo8F5kyZcdTAwMTAujHxcdTAwMGKjWY/Qa1e3XHUwMDA3rLKIiFx1MDAwMphcdTAwMTKsT2CDMLpXXHUwMDE3qHxaXHUwMDA0TX52vKqvgKZa6MJdXHUwMDAyL2Wgkj/mm3BiXHUwMDE5uJrRwWZpN9hft1x1MDAwMlCtXHUwMDAwXHUwMDA1jSbHKVx1MDAwNckjv7M8KrTJg8dcdTAwMWL1Kkhs8lx1MDAwMXysXGZI9TlcdTAwMWEwfk1wXG5MdTIrLi3qXHUwMDFmKUCA6vtcdTAwMTE56aZb4KuTVVx1MDAxYoJcdTAwMTJnXHUwMDEzTVx1MDAxZoFcdTAwMTaYf09POFwiiO985M7h48Ohu1C1uDI82lx1MDAwMOIlv5pC8duKeM9TcYbUk6dcdTAwMWaILWTGZ77n0lx1MDAwNqOcTXKEyVx1MDAxNlR2NqWHXHUwMDFlQXRcYlxcRj3wOkmz4rZNTlTfUEfB2zInuJAwXHUwMDE4rp7kQlLmU/cluIE3nd/Jtv965/36XHR93PPDxPPNp6KbzeiLXHUwMDA0wSdQXHUwMDA1+oWUyD2ki1l7qY6B375nOmbZU6yeXHUwMDE12GZYQS8+Pv5cdTAwMDKS23yKg+rBWD/eWaY8Km1PNUC531x1MDAxMXc8TFx1MDAxNIVrXFy2MepcdTAwMGKBg1Kx0nV/m4X87cNOXHUwMDFl0WV25Fx1MDAxMYM/qr/Rvz1ZweRsXHUwMDFme6RcdTAwMDV0dJlL+slWzaBcdTAwMDedPreXYj1pbcCzKXVqXHUwMDBl0p2+4yVGfHbC91x1MDAxZNaZcup0olfMmTLSXHUwMDE5/0aPUmZrvIW1XGIlsmpup85VM/17/FHsr5FJ6/JRuOZAXHUwMDE5voirnrNjxUayNvo1JoTWe8uzzDokXHUwMDFiO2NP1KzH6O6Per+59IbcVt/4Kz2E7Sed0D5cdTAwMDFHYDxb5MKOXHUwMDBmXHToR1HNXZycle00iHfg7Fe2p7lcdTAwMDK+afSYjv3NRG/NxEjbenvJrSCs12XAX0JcdTAwMWJefflcZopnNpnxXHUwMDA11CVcdTAwMTklXVx1MDAxYvz+VfQ3XHUwMDE2XHUwMDA22TlwSbPJXHUwMDE0R2nKzUJcdTAwMWSlwGxcdTAwMDe+mFP88j0lXHUwMDAwz/mVmuiDXG5cdTAwMDH4d9XlI4TLRb6EPumpdOagXHUwMDE4bulvevy9LX9Wkm+m6Mt9pkxcdTAwMGJLXHUwMDAyfNo0jLtcdTAwMDVyqOKDXHUwMDFmXHUwMDBi8cDHKlx1MDAwNuGbVVKszP2KklwiXHUwMDE26JmBXHUwMDAwkMut7Fq1yFx1MDAxNilcdTAwMDLPQZ12oHPxe5C/semLrbzjfbvy341ErzcgkVxmdV6PIzSFPNqQXHUwMDFjess0bu3Urlxyod9R2MTER5RESVx1MDAxMFx1MDAwN+53XHUwMDA2dlxc3Fx1MDAxNVwir9SpU0dcbl6pviFy4lx1MDAwZSpcdTAwMWLg8lBInj9cdTAwMDZIZJrb9Vx0jaDx81b/pXu6j5HXaFrHyu9PPTFn2p9tMbSTXHUwMDE47lx1MDAxMpdlX58onWPjXHUwMDFl+PZ7J2jS9zW2/CndXGa/pHJSo+F54D6qhKDeYMDRpI9rW/nsxJJHRZ9GXHUwMDEwg19cdTAwMTlcdTAwMTWINaqEVyZH+Dmlj+9pITJcdTAwMGIz1NpccpfjaDemfdJ3fFx06SNY4527kbCkPaMpaz9cdTAwMTeugiXWUcKyZze37p6DY9ylfkXR3L+YtctcdF0mNDwsh3hQMue5Q+hLOFxiOtZcdTAwMGV1vVx1MDAxOUle2lx1MDAxNozf4lLpbFmQNcjhXHUwMDEwXHUwMDAy+zWpQmxcdTAwMTIx1Yp/Vi3quFHkWta6y1x1MDAxNjFcdTAwMTiPje1Fj10sK1x1MDAxOVx1MDAwM1dcdTAwMGZcdTAwMWXeNKpOXHUwMDAy5Fsxx1x1MDAwNVx1MDAwMbGV/G5cdTAwMTNSXlQ57n5JyXLKjtinc4kttuqERaMmwoBp14DfXHUwMDFhvGnMVL2SqkGBUiigs8Kor71OuMMsXHUwMDEzjM1cdTAwMGZq4SH631x1MDAxMbhEt71hktRcdEnKv+tcdTAwMWPiXHUwMDBlXHUwMDE0R0L+qmtcdTAwMGZ2XHJVvFx1MDAxZVLewbNcdTAwMDCRiJlcdTAwMDBzj064XHUwMDFj4lx1MDAxN17HuWpMna7aXHUwMDAx0ntcdTAwMDFqdCAya1xc3IVpToFtsSFNMqqUMlx1MDAwM42qv+aX/WtrQmV80m79b6Q+MpJ9XoNwOjbg5NEyoILu9ZJcdTAwMDR/yKxvVlx1MDAxOf1cdTAwMTnPl5p/yVtijJBEtq1As2Z89WOrhIRKcVx0gFx1MDAxZNqHITi7wO/zXHUwMDAzXG7U+NlcdTAwMWZcdTAwMTC1mFtTLGxHoVn5O09cdTAwMGZd6yYuRVJ5NtP/RaTJ+jVu2VxyrHWPI37fiuJ2KVx1MDAwNPJl+NXCLmWdmnOXXGJgxzr14FUvXHUwMDEy7nq9sq3HO8qq0UjbX7PSznbuzZQ9lNlGvphcYrN3bsCvfyMrVm6Urlwi7SnLV/vlnVx1MDAxYYuLbFlJ+ULIlJRXn6FGmZsl/Ke31apcdTAwMGKXtjLHxTDL+oBZnWyhXcxnOfaw1EueIVx1MDAxMVDBX/eH8MuWjcjqb195t8uiio/Vy1x1MDAwMmj10T6o1kT5tVxmsFhzqlx1MDAxMyhCPabC/lx1MDAxNkbILsVEmmlcdTAwMTfcdddcdTAwMTUlXGa0XHL7Xlx1MDAxN1xyu1xmZ8Aq6yM4INbGebTxdbmiZsqkSKUxxt97uY1U5PdqXHUwMDE4rjNmo0VCXHUwMDExOJnw21x1MDAxZK+Fsdi+IyuM0Fxy5fOwLbDugO/atFx1MDAwNy9cdTAwMWV+NCuhXHUwMDBm51x1MDAwNs5hwVBcdTAwMWLALFKzdzGDdJOh6MSFX0lcdTAwMGZcdTAwMGVcdTAwMWRSXHUwMDFjJGKRho99gs1vWj/if5FLXqas2M2UXGKTXHUwMDEwuDnxQVx1MDAxMPZHUHaj7Fr3m5lRjJvwS5/ma3aC3r/CzsRcdTAwMDbQrYeAXHUwMDAz54EyPiA0slTsmIleXHUwMDFlvlj1s2UqXHTk+NmAg7yGjmHC24Hx+ty5vCBbfmm8butcdTAwMDJvN8YgXHLw1L6JWq3A8f3M1oB3PFE9XHUwMDFmXHUwMDA2JDLQoqaVrFx1MDAxM8q+XHUwMDA2tVx1MDAxNoMmwlx1MDAxM82+vN/8XHUwMDBlhdq0cVx1MDAxMGJUupQ5XHLRu7eL+O1cdTAwMDE5gPckSCwjoaf4RoFLqkjB7N3hS2ez+15cdTAwMWXcvUa9eZ0yYy6gSpmGwtvGXHUwMDE16bNiXHUwMDEzh1x1MDAwMkNh3SZcdTAwMTTzanNmeUzbO4uvb4qDXHUwMDA0+v5cdTAwMTJcYjlF9N2xfV3y1K+N6WD1+q11dGPVQFx1MDAwMpNcdTAwMWJpXHUwMDE0s1x1MDAxMLVcdTAwMTVm+es9d+HZyy9cdTAwMTT+hFx1MDAxMCxAcuRSqVx1MDAwMntcdTAwMGVdc9NcdTAwMDTiT8Q/68/a8X9nLZHQZ3tcdTAwMWWaZHPyII0nj0hcdTAwMDKoVzyyX74paVxcjV9bKlx1MDAwYqHaKSlNS53kMznyxtVcdTAwMTM7K07DyqcoNfVRXHUwMDFmp2FgobrXnHc9N/WgoUXicYHwvFqTXHUwMDA1XHUwMDA2rkVKo1x1MDAxOEZcdOD8XHUwMDFhzThauMX+4Fx1MDAxNMPmXHUwMDExt197WVx1MDAxNIVcdTAwMTBix2mM+teb6q+i8XNcdTAwMDNcblx1MDAxOZrhYE890ceBljeQhFd9cFMsuXW8dlx1MDAwN+dD+Fx1MDAxOFx1MDAxNlx1MDAxZdGd9kdcYmlcdTAwMTJqZZVcdTAwMTG2XHUwMDExt1xuUCBGYmKsQszLh7zygrRgr4bYm4tH7/dcdTAwMTZItbRdJbp2P1dlVixq5mKXv4c5RrXjXHUwMDEzYKX0K1xutsogPsXmyLHUmKGV+WbbJXZH3vVJ81x1MDAxYWVcdTAwMWRcdTAwMTRcdTAwMDXJza1+P1x1MDAxOSiatNBtXHUwMDE1KFx1MDAwNvxL/Mrdo8bIqqvcXHUwMDA0V0JrLkCN+b3ZNsmZrpVTedm/N1x1MDAxYjXOqyxcdTAwMTPkWW+KfXWMud2dgL6Lai/r++16zVx1MDAwMMs7K2JcdTAwMDf8raCuSFx1MDAxYct2ScWhNJtcdTAwMTLGk7le5Us3tVVcdTAwMTWAsq2A8t/Ztu5cdTAwMDSIZFsrXHUwMDE1UDzW6/Ke1fdWOKa7NlA4o1x1MDAxZZlcdTAwMDBcdTAwMGLd13Wc6yQzXHUwMDAxb3nAwVx1MDAxN/dcXGJ0aXeZh5mgrtREqjVvoSZJS1poYlx1MDAxYeEokWT6TrWzXHUwMDEwYGqgUCcnMlFcbimu0KH+jlx1MDAwMnSdnFx1MDAxY71cdTAwMGY5457tQHL+M9dcdTAwMTLsM4xcdTAwMTKD9GeHXu+DwiqkV1x1MDAxMJu7XHUwMDFlS8nfj7OQfObuSFN/T7F0XHUwMDA1iM1cdTAwMDRcdTAwMWGewsuu4cG6XCK/+1x1MDAxMWkvPVx1MDAxZqol/vpDbjmVdm9tNOSi1omd3Fx1MDAwYmw+XHUwMDFltL1FveUkSXNiZaPl/a/NxKAoXHUwMDE4OHhcdTAwMTnv7Isx4IBdrvnXLbdcXDSgoFxyvlwiuVx1MDAxMOCeO1njMI7n59dcdTAwMDNwOEVcdTAwMTlcclx1MDAxNHbIoay75UY62THnqoCgN0pcdTAwMTaTNvPf+3T9U1x1MDAxOFlcdTAwMWZTMbwlXHUwMDFlrG2BXHUwMDE3XHUwMDAw/DQ/m2DrgmRHuv4lo8+nXHUwMDE1XGaRo2V6m2Xp8qyB43he5sE6jVx1MDAwMmXa08G4uunQVpCHpu+oXHUwMDAyXHUwMDAxW9BtXHUwMDAyeihlkMlcZna7a9qYnU3xhdjTUulcdTAwMDHtZq1cIoj+9FCRXHUwMDEwXZ/o8/SFZ9JcdTAwMDRQ1sw+r/FVb8SOgsjurkBqRWq8cjQrj5UzdIuH5lxyef/+XHUwMDFl72FrpKFTSNZcdTAwMTP391RcIqKSbZ6BXHUwMDAxJ3ztl1x1MDAxMMbEyVPgTlx1MDAwMmbTZTGpYmq1ovf1v5skXHUwMDBmnJGFw1Kb2KI5bdJcdTAwMWFcdTAwMTE9lyNyMV7YXHUwMDExLq7igS6WsNB/XHUwMDE2clx1MDAwMNgrrCasg6beTmH+81wipZd2ilD6XHUwMDE5SFwiIEkpt8/GWrpcdTAwMWZObFx1MDAxNnI7X8ox2U4tXHUwMDBmib8sXHUwMDAwqDRcdTAwMDZcdTAwMWbIt1x1MDAwZkd4XHUwMDAxaOuPXpFejZLNVNdkJPZljqBw+OFcYunb6+fLrUjuIzhG3MsrPOX6U01mgGm5UGbhm6mGXFwl1jgmpszMjNRog4GnKbDg7Vx1MDAwNVx1MDAxYoEjQnosP/jeXHUwMDE24cHP9uYsTlx1MDAxZC44gZ/Xtb96c1x1MDAwNYw9MLLAmfxHKlRoc1x1MDAxNFhcdTAwMTeih1FcblTrQJBcZpqKv+sh+zoxxOEoaq7KXHUwMDA2YobuQlx1MDAwMuVFLVQ+S2x7JT808rkuXHUwMDBmTmV6YqLRfiF7j/+dQ/uju8GgaupIkCNcdTAwMDGY/Fx1MDAwN7VdXHUwMDBlMIxvXHLMeVffUTTZtVx1MDAwYj/RXHUwMDBiQc66XHUwMDE49bemQP5cdTAwMDdhv1vm8cxk5uCQu6M+9eLJXHUwMDAyXHUwMDFmzmBSmIO5M8X+/aqDKVx1MDAxY6RXgjotglx1MDAxNe+ciUz4S5XR6oRcdTAwMDK7XHUwMDE46JFcdTAwMTLbgqeSg/guJM1cdTAwMGJcYt5pcs8pbciUXGJR67BkVqbXXHUwMDE48JVcdTAwMGJccmZ7+3W0Oi5cdTAwMTOSy2xfXGLullx1MDAwMNrEm6Ux1ljNsCBdky47hynpwHnrNmfppl1cdLzM8H7kvFx1MDAwNc7GU+PnkjmU9cfWhF5UlCuWgSVcblPKK25cdTAwMDeES5udOXSZvtV/UuBtT5tE9MYo4ZBcYnbasNLvhaZcdTAwMTlcbkNcXC/hk1x1MDAxNCNFp1x0NZApuFlcdTAwMWJcIu+8Wt8+1N1cdTAwMGX42L853/dcdTAwMTWS+0DRR3c8XHUwMDAw7PzUvyeY/EYoXHUwMDE10iBELSRDgFxcXHUwMDFlZVx1MDAwN1wiyu6YXHUwMDAw37z1uVbU6ZneelbGz9e2VvBcdTAwMDd0alT3LZs1hYhR/Vx1MDAwN/br11xclWvt6lxmI1x1MDAwMENcdTAwMDD9PFTiXHUwMDFmXFyz1dXxk3BcdTAwMWK27NN2LHGf81VYc2hcdTAwMWOB1OdBd6vwgM5cdTAwMTUscylpSJwyU2BP2NxBeuTtXHUwMDBl9dwuw8a0rj2to721iGk/XHJiXHUwMDAxRvOdLkqVjo+Mx8T9VSpk07pcdTAwMTLgYKAgV49Rrlx1MDAwMlx1MDAxNlx1MDAwNsN7S2yFT2xnw3Hzxdi7fXX1ib47IDjA3Xc48EmEXHUwMDA1e53MXHUwMDBmXHUwMDFlkSST112E8o7/KlL+V2rRuMCIfdolcU4jkVx1MDAwNFpccv+IaFxigzooe+NcdTAwMTRye1x1MDAwNlx1MDAwZWK7XHUwMDFmzGjXTplYXHUwMDA3pJuy7N1cdTAwMWRcdTAwMTb5WbGexa9cXENcYlx1MDAwMDbPk1qgtWd29dpA9rLeddn1tXwgaZ3EJ5dXYV1eW+hcdTAwMWWjXHUwMDFm5NMz/DDeRbUy2r1OXHUwMDA0XHUwMDFkKdysRruycpVed/ZjXHUwMDE43mo+TtW8Vm4yXHUwMDA2pcRUflFcdTAwMWbyI0ud6adcdTAwMTKEs1x1MDAxZZpcdFGO6s1cdTAwMTPYXHUwMDA0m7CO3amjXHUwMDFkXHUwMDFlXHUwMDFk31Pkqn5wXHUwMDAx36NcdTAwMWVEoJ0/UNxrclx1MDAxZLdWMu9cYsHk4otcdTAwMDCO14hNv1wi1Vx1MDAwMlx1MDAxN1IgtZVNQ3bf27ovpGt9j+JCUvJcdTAwMWT1MVxuRFxcPKf9RP/iSFx1MDAwN7AwXHUwMDE4+eywMmJcdTAwMTGwy51kXHUwMDAx4+GngeyzrejRXHUwMDEwpZhZ81x1MDAxMDstObVcZlx1MDAwZi62XHJCVec4tZ7cZZZ//Pk2Uliw1Fx1MDAxOD2EnyeLODR2rlx1MDAxOVx1MDAwZuLqXGZzy1x1MDAxMv2Ld5I+b+atNttHtsl7wVx1MDAxM949/VijXHUwMDFkpFx1MDAxOGLwgY9cdTAwMTZM3KMp+1x1MDAwNfIqmSC9ekO7XHUwMDFmXHUwMDBmXHUwMDE0XHUwMDE08Fx1MDAxZHNVXHUwMDEy035rqp+MerHEXHUwMDE1JEHSRUKCKTjNOVx1MDAwNTrjXHUwMDA0XHUwMDE3r151mJ2q6mrwXHUwMDA0xNBcIux8vuEnsZjrhoAjuSHKiK857o9orstIXHUwMDE0yVx1MDAwZcp8ZaSoh9fyXHUwMDE2e4RcdTAwMDWO7MzeuO+bR7aO623SXHUwMDAxXHUwMDFlm3xD3LTHzVx1MDAxMShcZktz+lNJXCL7klShKEFOP8NeXHUwMDFkc95cdTAwMTDnXHUwMDA0jsCH2nqkXHUwMDE5eo+rXHUwMDBiZiwp92q7S0zzzkRWrb9Bd/p7z51dbGpcZsJEXHUwMDA0XXTkPt5ais1cdTAwMTR5/ClH7lxiNbqx6FPORDy8Z8veiLttr9z4qc+KOdpcdTAwMTDvr3dFYuwoSOSZXHUwMDE4MkttscOH1/lJzCSTdid7ulVtosek7lx1MDAxNNdcdTAwMTRT+LjMo6R4XGJcdTAwMTXykzJcdTAwMTI6V4RcYv/WnWyE3uGOjngq4Lh1v81cdTAwMWZ1ecDgzknza09cdTAwMDHSw0TYSyhwweW6XHIpObl7iUre8fMtI1x1MDAxMFx1MDAxMpjqqMnPXCLO3OefRttg135a4tuy8UjQSHZeT1U5uESK53El0Vx1MDAxNfrkun1cdTAwMWPpXG5RfP5hkyhFXHUwMDA0XGaDXHUwMDExkkWU42noxbCJL8i8XHUwMDA2W2H76856sse4qnH00duZ7yZZYk5Kd7RTt0l8kaJcdTAwMTV+U/h35jn68lx1MDAwN4okYShJdvj93rvguPzWtow9bblcdTAwMTLxbnD1uW40M1x1MDAxOVx1MDAxMMrfPml2SL/KZ6VSp1x1MDAwN5A8XHUwMDA3b9+4XG5cXLLfMj6h7TN9r1x1MDAxNPxr58cypVf6982FoNB3hrtcdTAwMWbf41x1MDAwN4LbjVx1MDAwZrpr6YfHiVx1MDAxOMqCvr9cdTAwMTVcdTAwMTmao00jIOX53slo/Zi7t1SrXVx1MDAxZWjdW26YVFx1MDAxZlx1MDAxNHGP2KXL8Oayw1x1MDAwMKt9viluaWlYQCm0XHUwMDE3mv5Ee2FQnsShNsNu5sRil1x1MDAwNdX3sLrSxMtcdTAwMTegSc5KqcPlRYHxXFxZXHUwMDAzT39rtJVw3bSAxorAXHUwMDEzLrjTwDlKJoUmszfI8NInpjQ6VfNf+3K3XHUwMDE1v9LWytpzvSy+81x1MDAxNlakljnFKHZJ9vlcdTAwMTM8vzOiXHUwMDA0spZcdTAwMThYwY32XHUwMDE57Vx1MDAxY6dhtlv4p1hcXLOm4Fx1MDAxNsR13WzF17PqNzll5lx1MDAxZPzXTeNcdTAwMWJ2aU+BXHUwMDFlTzPKMWT+7VGnpr+jkY5lYuODguL5ZoaJb7Kex1x1MDAwMKrQOs6T6K8tSfokKFx1MDAwNlpqP+fzXG6bXGbZklea30hcdTAwMTCmarpcdTAwMDL+XHUwMDFhXHUwMDEzuFxiplx1MDAwNONRcNtcdTAwMTAyXHUwMDFjpbj6rnX32emSNWWa/YqPMoCYJFx1MDAwNlx1MDAwNLUr0/3sz0tcdTAwMThcdFx1MDAwZVx1MDAwM1x1MDAxOHD1wOfL6yNsXHUwMDEzN4qVQ7VcdTAwMWFH/XPhgODZWIzhpYtcdTAwMDOTXHUwMDFh+iFJXpXysy3S/SAoNpJv2r7qamzgn5dmZG1ZYmIr8Ud68d5CtGDHcVx1MDAwZjOCXHUwMDE50jBQbTRXclx1MDAxNTOf6lx1MDAwZsi12OQ37GWAXG5cdTAwMGX8PLtCJ68t8NnIYM10yZJAXHUwMDBib7QoT6wwMYr4w1x1MDAxOb+mRYfiyq5bXHUwMDBiKen6bMtNgGJi1WFLbsBBXHUwMDFlXHUwMDFmXHUwMDFmiEHhXuRcckhR4yFX3CToOFlcdTAwMWI9hHjOXFy1xMNG6byjXHUwMDFiLvtUz8eyplxilPVuIO+lhYj9aNX1czom5qbclPS7vVx1MDAxMPxTXG5qndW/fOdgo3G0J9WLmndt/S/Hclx1MDAxZZxYk902vWuv4W8/V11cdTAwMWZcdTAwMWPJdIH8tYiE25RcdTAwMWLPOcWlTJizc/hcdTAwMWOLXHUwMDE3OVx1MDAwMlx1MDAwM1x1MDAxZVx1MDAwNdr6ve6V62SiXZOul/Lfdd0p98NwUNRE72ayrVx1MDAwN8Yy+d2ZhmRcdTAwMDIoz4BQwJaMuP7fkWP2pYVe02gxUlx1MDAxMd9cdTAwMTPxXHUwMDFjnSmuXFyXntZrIKArV6r76Tv0PexesNCLLLYgzUKr1b60TFwirV7VRFsnuGVD7ZOF5Fx1MDAxOTCrXHUwMDExJzFcdTAwMTJ+ynyZQVa5iFBHk5837p7gQ9XeI1xm3DBcdTAwMDX5Olx1MDAwMZhablxi7bbXijmyXHUwMDFj6KVcdTAwMDE0WGnSYin+XHUwMDEyJioxQ8Vw+1x1MDAwNfzhytXhXHLWrkXuUYOgT7bmpXctgV26XGb3JifadZbBcn9cdEezXHUwMDFka3pOroiOT3i/XCJcdTAwMTM2MfVSi4md1+r6XHUwMDEyjeSCt+vL8ObtXHUwMDE0k0rHklx1MDAxNurHm8O6qUm66JDuZ+hcdTAwMTfoSVx1MDAwN3m+XHUwMDAyuFx1MDAxY1x0r8kuv6ygJYd90LZcdTAwMWZCaoNRVOx0eFx1MDAxZUyNwVx0N3olXHUwMDA2XFzr2+htJ77f51x1MDAxYjxUkVx1MDAxNfPSwGGBWs9RiSYpJOz3TSGaNdMv+1x1MDAxZFJOUftQlo5rTVx1MDAxYYHotyFCwu7jXFxRpimU/btcdTAwMDOy8KsjeT5cdTAwMWLOXHUwMDAzXHUwMDAwZCVIXHUwMDFhjmZXtCVGbmk89uVcdTAwMDFBf89cIt45lFx1MDAwNcOdpy/izrlcdTAwMGK3Ue6D+F9bRrzl17L/altXLlx1MDAxZYBoY2K9LtxcdTAwMDdcdTAwMTK5tzaQq9em6TwrXHUwMDFloSiv6qmQ3u+fXHUwMDFkYL/vQ/Ew3HA8OK/5z2tcdTAwMWVkLnhcdTAwMWOdeGFBXHL1n1x1MDAwNlVcdTAwMWM6f823pJydxtZ/a4Nns1x1MDAwZlx1MDAxN4VIP2+FhEL/wYGkJ2uUtYjGbe+qKV7oR02c4beR3DeCJPhcdTAwMWSr2aaSUiskgO/uuUk16pvGUl+uXHUwMDFiPLV2XHUwMDA3XHUwMDA0K7iQuolt0c5bb4Srslx1MDAxZdRRIFx1MDAwM+piIfHWXFxrkPheLnOlNJBUnzP3s1x1MDAwNKG6l19U3JP7gVx1MDAxMFx1MDAxY0zPb1NM0jtKnsi1tkqFxuBcdTAwMDWSQVjye1x1MDAxZMQxRbR8efObbOLXm1x1MDAxOUFflNLfmdQv1eZg6clcdTAwMDTfyXaAzuVRXHUwMDEzT/Gi1l+P41x1MDAxZOtD7Vx1MDAxMlx1MDAxNHV9XGbyY+a5XHUwMDA2SYa0wapcdTAwMTB3KnNLoP019Vx1MDAxZvt0b1x1MDAxYVaW5Xyw1kmHtXNcbu9XY8zfoVxit5ZcYrBcdTAwMTR+5LVcdTAwMDGlcKDqqFx1MDAxM3E1U2zoiFx1MDAxN/dcdTAwMDGH74RcdTAwMDNcdTAwMGL4IPNNRJmEN+pbJ5Cte1x1MDAwMm5KXHUwMDAwdFwihevlq1x1MDAwMqBLcJCIaFxykk/8fWBcXJVJ1j/drlKLXHLW/Fx1MDAwNlx1MDAwM/RcdTAwMDCfNFZcborb1TF5u2w1XFxy8lx1MDAwMFx1MDAwManbXHUwMDAzvO3RpMHcJNqFcqxfXHUwMDFmRvMoy/14JyyteNvYY9jGSLeIia1AT+vaXHUwMDEw6ZBfeaXhV0DouGvffHNQRc7VXHUwMDEw+zBm1XW/iuNlnk1cdTAwMTP80Fx1MDAxMpwgXHUwMDAwRb631OeqiE+3XHQxO2lWvFx1MDAwNGVcdTAwMGJV/45cdTAwMWFFxsIp46a5wFx1MDAxZSvEny0rRlx1MDAwM+vRJ1x1MDAxMHsvI9fJ86tcYl5cdTAwMWbxMkrw2o2LXHUwMDA2XHUwMDA3XHUwMDFlaVpx1E4vatjwioljXHUwMDA0XG61XHUwMDFh3lxulES26dxtZfKK174wwV2SqVx1MDAxNlx1MDAxNZu+nFx1MDAxMl1UooFcdTAwMDCYg3LzXHUwMDEzXHUwMDEz501cdTAwMDI3ylx1MDAxMJd7zWjwKVW+5MqJKlx1MDAxYuVcdTAwMDXPuUVTt9ZdbopGpajZgVnTfSByyZmyj1x1MDAxMdrDXHUwMDAzT5+zXHUwMDFmrj1cdTAwMWGO8ifatvXBSPNccnw4ojooUJgskTWC2EjE1cu2gFxmR/eIXHUwMDAzp9pJp/yFXHUwMDA2pjeqg1x0/MT5oTRcdTAwMGLM+ZtM+OxlI8ChLJ81XHUwMDExJLuANMUr+7i+W5C1MzAoXHLKsIFlJvW99UQ89qb2We1cdHBcdTAwMDRuyH9/Pa177Jfvelx0Nj+F6Fx1MDAwMvR3XCKfqtIr5jpcdTAwMDPSVDpcdTAwMTJcdTAwMTg/xF7fP/JNQe9cdFFteNxullx1MDAwNVnRqyzBXHUwMDEyzjmp31x1MDAxN2Lh2i1cdTAwMTmPfeOYl381QUrkfIO633WRT3ZT7IPL0zt14W+S7Fx1MDAxOX6q7+mc9nFSkCiV/vVcYvZcdTAwMWJcdTAwMDRcclpVhIpAsY2Zvu7XxvjKsUrX3GA0zspcdTAwMWP7pLBquVRef9dlQ43xTZBXxYrEwktqfMOTSFx1MDAwNtGHM3CxXHUwMDE4ZDmySWuOJLlcIvSvXHUwMDE3dcl+OdZhXHUwMDA0P3KsXHUwMDAxgzVnwfcs8OBFjJxcdTAwMTHJnak0mdL/0SRIiX/rh1x1MDAxY7u6XFxOWPhQ3X40O/ThiD/8z935R5c4Q0Lf2t2SL5rGXHUwMDE3oF+z9pvR6V47XHUwMDAzYyopXHUwMDE5USc98XFQkLy9XHUwMDFhzpFcdTAwMGJcdTAwMDelOp6gfFx1MDAwNTRInns43sEjZtM99dL5l/ylXG7u+m6rxWmy79zuMFxcb4hdRUxcdTAwMWbWV+7eUKRcdTAwMWLd5stShfNcdTAwMDFg6r1u7pwz1tE21yxcdTAwMWPync7gT2MmT1x1MDAxMVlXouxKXHUwMDA2XHUwMDExkICMcuEqXSpcdTAwMWNvPNNcclx1MDAxOLj1V/o5/Gbn4XJcIuDty3xSXHUwMDBlXHUwMDE2XHUwMDAwQuIqw8LfhtFAP7+f0+JcdTAwMWIhtGXOeMRu148w2mZcZjo82FZcdTAwMDTFMH5E9Vx1MDAwNej6xZTdXHUwMDE5OD1cdTAwMWZcdTAwMTSUwiNcdTAwMDNj2YSI5jZphSps0dAtXGaS4cVyXdNcdTAwMWNcdTAwMWNsXHUwMDA1+/WpttRLU6h7ylx1MDAwMnYu6qFcdTAwMDR2P7BqvJLTQLg6KPdnc6rEiU1LiNBhvMgmJLP9XHUwMDFhQ1aitoXMXHUwMDAxZKy+PzJHXHUwMDEwXdqhN1/lmS9cdTAwMTXRi7yY8oxj62IvXHUwMDAweVx1MDAxOKGOXHUwMDE0XHUwMDBlV8HhXHUwMDFmkFxuMmagKIw6knVcdTAwMWbhm/LvKeouzaA//lx1MDAxZW8hLk2iQLuFhIFcdTAwMGJ94lx1MDAxNz59dYlVXHUwMDE3TLhcdTAwMTRcdP9cdTAwMDJ+dyXgwjyLg3pwVmS6w/696NKD8OZcblx1MDAxZi5cZrdofHkgdZBcdTAwMDRcdTAwMTE9cFx1MDAwMJC6QSHLMeu131s2/XHS0f/q6a8/Uk4o4v3WXVx1MDAxNvfdaXNIzDQnV19un9m8XHUwMDFjWVx0eCRcdTAwMWY88z378/+4eo8kx6Fly3ZAaECrJlxirbXsQWstXGJw9IXIW/e9/6tByzDLXGKS8OO+fW3giNfSXHUwMDEx1HL3/Py3vDv8XHUwMDEx6Vx1MDAwMGwzITZ7XHUwMDE2bri7L+bEhsHL2KpcdTAwMTQ+hrxiXCLjsHNQK0RJ6TNOXHUwMDFibLvklSlx9Vx1MDAwMIcnJkbdNl0pXHUwMDAyXHUwMDAyJ3qWZOtoj/GB78+notNcdTAwMDFtR6H8sK9In0/qO2Fu/LTmJM4kYtPIa6OurdaJl26voVx0alxmbiCfXHUwMDEyNHi7szCZ9j7eg7q9kEdE+o9cdTAwMDaGjaj7xvubNZlK4bBkksuK5Zep6ScwXCL614khuzeKyGZUXHUwMDFkicGpYn230XFcdTAwMDTQYb7CRYIqvd4nXHUwMDEyvupvo+SwU22jQ1x1MDAxN1oy+PmidmdcdTAwMTHuiPFR/C00T5CzXHUwMDAzgX1RXHUwMDEzoGTjLkhT8ma+vP3HS+5Ht1x1MDAxZHYyTZnqXHUwMDE3qTNcdTAwMWW9k2nihISBQG5eXHUwMDAwXHUwMDBisMqIXHKFg9c7MSRcdTAwMTdiXHUwMDFlz9Qu5OVcdTAwMWa7uyopKJ/XJ+5T3Fx1MDAwN0QyKLLj5Fx1MDAxZNcv3F22g4RcdTAwMTe//Ga8xsdcXLnMNXxenMe3396H3Huno/pPbLTykuemcOBcdTAwMTknkKPLLOpSXHUwMDFlXHUwMDFlKKnRk0KHaVx1MDAxNmWWec1+00pcdTAwMGKhgj2Esu1cdTAwMDcrcFx1MDAxZDRebfD4JmZcdTAwMTLjVdFYalx1MDAxMdGmPDi7WpX72WxknSmiaG5tVb/mI1x1MDAxZrNcdTAwMTaGtlx1MDAxN+LO92OU29AgXHUwMDA30unOl2qaVtnopeS0ulx1MDAxZJ/b4a5r0+aF3WKuZ9kwRNOgjISAXmj5giaDrnvLXHUwMDBlXHUwMDEwks7nXHUwMDExfJyNllxi8FdcboTrJitLQsqxiaC+bzXfjUljPspcdFdNkvfYs1x1MDAwMCfx0+V1XHUwMDBlXUHVlFx1MDAxNVxc9lx1MDAxOXR/afBcdTAwMTGb1kq/0Fx1MDAxNTvpXHUwMDFhbFQ3gCmjNzefy1BEoT6vUuEkeXukbNV5XHUwMDFhN+mk0ceZr3iWR1x1MDAxM3hcdTAwMDNd09xcdTAwMTeyrMfqnlx1MDAxNZhcdTAwMDKQw3z3p3ZBaexFK9irVFx1MDAxZW9fIelcdTAwMTExXHUwMDE5/k1wpMHs+XVcdTAwMDJiqiBcZpDI34f3wVx1MDAwNEST9/o+x2ib95Yt4mlcdTAwMGa9MVx1MDAwZWqJXFxki5mf5TxfIDFVV1x1MDAxMZRcdTAwMTTDr3U5+yZcdTAwMTN8XHUwMDExXHUwMDEz9cZcdTAwMDeX6uNcdTAwMTLUVpVCeNHkIJYn9Vx1MDAwNceUTbmqsoFaLejjXHUwMDFi4/5L/tVsS1x1MDAxNFxyXHUwMDFmKdJDOy1tcKGYn+pcdTAwMGUsdd8z8ZZuv4NrXCI8KUiB21x1MDAwNsFcIlx1MDAwZVx1MDAxYo1sXHUwMDFjTkpFfoTpXHUwMDFi7lx1MDAxN7m/RMT47N+6MuVcdTAwMDNXX6Ff0+K4zL89rFx1MDAxN1BcdTAwMDBVJuijKlxm10KTJFx1MDAxNzpcdTAwMDZcXFGsXHUwMDAxTeMvXHUwMDA3sLHfe2f6mUWD/XyPNl/FcHhGKPOVIGRcdTAwMTVcdTAwMDSrXHUwMDExcILJj2K7fSeViVpcdTAwMDJVXHUwMDA1xlxiuz/wtrZwlPFp7lx1MDAxMXEnT4cpfFx1MDAwMaNcdTAwMGLxJVx1MDAwM49cdTAwMTP188RxXHUwMDA1tqrQTVx1MDAxM//1mS3QbHPwcj7G3bjz31xmXHUwMDE2nVx1MDAxZlx1MDAxZMSegCHxTV0vUXtcdTAwMDQ9wTWirlx1MDAxZtP399aNtDeFOv31nm9cdTAwMGWmkFxymZE7jOZNcLTptFxu+Fx1MDAwNC1noLu8J1x1MDAwMfDT/vZQIMxcdTAwMWbjqVx1MDAwNVx1MDAxOVwiVlx1MDAxYtupNZTu3Fx1MDAxNVx1MDAwM9tmvLz1anCU8VZ/Pn83gF6zn/M+XHUwMDE2/+wm46tPiF9cIipcIvHfMZ5qJNVi2W0n6ZpUVchr9k24L4Gl5GDETW39XHUwMDBittZatcryuXLOL1x1MDAwMFmdcDtcdTAwMWJrr2dhivlVyU7CwohcdTAwMWNmXGZa9pm0o4vjvK5cZidfXFxoeYb9PK1aXHUwMDBi3k8w03wx0aikzG5WYHSfl/7IXHUwMDBiLoCrMP7MIPrZyTlcclx1MDAxNDVKdFxyxSw1nPJY+3fPp/Vb7GO7XHUwMDFiT3RgZFx1MDAxM4bn63hcdTAwMWFcdTAwMGVn/DDowMNcdTAwMGLOcn/3VFx1MDAxM1x1MDAxZfLiuyjRi9zGT1x1MDAwN4HFkTq05oVCXHUwMDFhml/1LDtbqFvG1iFXZ3vDXHUwMDE0fWjMtKpcdTAwMTI5XG5cdTAwMTNcdTAwMGItj1fcKbbRJLiLKLfZVEt8L/tULr/2izt778rn37mqjMynXG7BaMNgqaPirYFvdlx1MDAxZlx1MDAxMlx1MDAwZtfaeHmrlFx1MDAwNFx1MDAxYW9e2alzuThcdTAwMTByV772cHRcdTAwMWVcdTAwMTCNXHUwMDFj9nJcdTAwMTbXsF5cdTAwMWRayiArXHUwMDA29cquhEhcdTAwMGa29DhcdTAwMGLDfzcznVx1MDAxNz9cbk5aWLicNimUXHUwMDBigqDMndFimfnzhIajf6NcdTAwMDZX+1x1MDAxMjwttKuVNPxcIlxc/52LZ3CT1kMmuzjpuFrOn0/5benvqCVcdTAwMDKxyLRcdTAwMWY7qeVx+I3ToDtcdTAwMWW2hYleXHUwMDBmSfta23uJjzzi9G2ALrlXXHUwMDAwu92CjrCXJGH4s7Y//1x1MDAxOcOi7tcgnljQvJ3EmpYxQYJC1W5/LoA+VTb17Tj+hH5+2LVwXHUwMDBm+W3dXHUwMDA19oBcdTAwMTjzk5ph5PNcdTAwMTVcdTAwMWRtMZi/8zZcdTAwMWN+XHUwMDA10tHZcePk+b/70ELE1mU+epV0XHUwMDExzYn1g/BcXP03OlxyLTRbx1BT/lx1MDAwYn38v03n5YDhP2RcdTAwMDK1Wo7jmTQtkWN50E1tg7ePmlQszJq4iX/8LS+PVitcIt1iXHUwMDA3Pk5KqlO768zrxWRBlV1W8ef7nvpGplx1MDAxMtXpXHUwMDEzvlx1MDAxYSymXHUwMDFitSiks1x1MDAxMLay8PxGOZeUN1x1MDAwZlx1MDAwNpJZfY4vIPTL+u26XHUwMDBm89c/JZRXPuqJXHUwMDE4XHUwMDBmvdGc/cqwXCLbvX5cdTAwMDD+3CbOk8CAXHUwMDE2XHUwMDAxlPfZTpt9/7vpzYo+TCQt3Pa0XHUwMDE3cupcdTAwMTH9I//LIznhTOvto69RvKYuoFxi41M4QfZ9Wz1cdTAwMWOMdFx1MDAwNJNcdTAwMDfNZSTKttLae+7gXGZxvtQ9+5/zXtWaJVx1MDAwZkKUL+0sholcdTAwMWPg/NJKn1xcWjjb+p/QXVx1MDAwNzdd+zag1SFYSIuwt0rLq0Pqf6Gsd47/5LS2yOFcdTAwMTLqV0ZducVcdTAwMDGzXHUwMDExd5+awqGPd2QpXCJcdTAwMWR5yVx1MDAxOXiNXHUwMDAwXG40cF1cdTAwMWPyLMbUr0i9Qlx1MDAxNbOvMVx1MDAxZlI+POQw+Fx1MDAxMlZcdTAwMDfjJbdcdTAwMDdmRzKhXHUwMDE2XHUwMDE1Jsf4XHUwMDE5akhkXHUwMDFh08Pl829tm75JN/NdapVtv4H8W4gvP+x9vz7KZJu2sDqqar61XHUwMDEzUpumYHHbQcBcdTAwMWWGXHUwMDE4XHUwMDE38cex+0u2MZqobW07JFx1MDAwN1x1MDAwM/2LXHUwMDAx7NOMy1x1MDAwZXhcdTAwMTWh9OXoP4iik1BoZVwi+ZZiaLhuWFTp37zN45VcdTAwMTlcYrxcdTAwMWFcdTAwMTKGp/5cdTAwMTR4WXHbmibdJC/MWv+X4/OtyMN917SVv3imX5EwJGbgMj1cdTAwMDTS6FFdpSmhXHUwMDAwvVx1MDAxM8hvPX3ILbzUVyro88nbm/93n/19j4pcdTAwMTl697rjNo14YtMnpU1cdTAwMDBcdTAwMWb7XFwwmUmBeKmTN+JkXHQuV95kODjGsIZhRExcdTAwMDHVP5n7d1x1MDAxZqSW2baJhFdcdTAwMTWwv001gJjX1PSGqud1cz55YlHJISXxXHUwMDFkm1x1MDAxM1xymjBWOCsqZJHQmX+9I58nWVx1MDAwYpuU9Z1cblx1MDAwMLHZ16vfaWaBw7hH6uVhbNslwZJcdTAwMDBcdTAwMTDA6DVf7MPHi7dlhY9cdTAwMTBLk/RUyjj/95mBy7xjhr32f1x1MDAwMyAyN7lg9HBo0txFylxcJfoliztcdTAwMTXoQYFcdTAwMWPCVG+p+Vx1MDAxMVx1MDAxMrzNs63VfqRYmcU+zL804WKBXHUwMDExXHUwMDFi1uTLXHUwMDE2XHUwMDA017lCyVx031x1MDAxN1x1MDAxY9bDXHUwMDAyuqdDXHUwMDBiW1SZPFx1MDAwNCfKabDooiAvXHUwMDA0llx1MDAxMV/rukzcXHUwMDA0rJX/8arKUJ8kVFx1MDAxYiWMXCKyo760SFx1MDAxNFxme3q/SO7eJO7tI1x1MDAwMc1eLsC72amCmlx1MDAxYu5OYPipiYoq0ObviNmG+Nh/2i2sMsLlujN0LGk5TViZP+r9YsX9tlxiXHUwMDA0XHUwMDEzXHUwMDE2m8SwddFcdPPvXHUwMDEwoVxumdK1gWW1oO61JL9f6X5jXHUwMDFjzt388W+y3NhXXHUwMDA1XHRKpLv4V+y9yFxmXCJ8Tu9cdTAwMDVYnFxcVddR+1x1MDAwMMNcdTAwMDTHQtsxXHUwMDAxc5lcdTAwMTTCm8Ppn+9fYDzVpVgsJsh09Uqji2F62z/KV4vpXHUwMDFkWVwicv5cdL/zb1x1MDAxZcHrRyvE5q+V/+njXHUwMDE1XFzd979cZp9z+cd52aPhZPxcIj1MQ41fTtNcdFx1MDAwZZjJXHUwMDBi6P/Wwlx1MDAxMiH+XHUwMDBln/P2i/xeI5+QzFx1MDAxNFx1MDAwZik7lv711eZcdTAwMTVVYfCpXHUwMDE1cqg+om/obVx1MDAxY3AmaMd60F+cilx1MDAxY1xuXHUwMDA2uLrA6/b3Kz60OaVu1X7+k6iN/6mlzs/7w+r2v7OvKSR83TGyXHUwMDAz89G7XHUwMDFmzORqXHUwMDAyuFx1MDAwNWuc/XV9XHUwMDEzdFBcdTAwMTO/jubvf/uJUdPMOMBcdTAwMDI14UhcdTAwMDamr30uvfnXxCj76edcdTAwMDdCVlx1MDAxOFx1MDAxNVx1MDAwM006f4tEvohcdTAwMWX5pW+7auSPocDN/3KrjmVPN+nrd3RcdTAwMTU+qtpCkeavm1x1MDAwN/5yyWhz/86HhsrzvKigXHUwMDBiUyyyW499m0lU8z3L/WnH32ucOVdcXFx1MDAxZYlCa+i42tz+6b9cdTAwMGJNuElAzlRdgtMzXHUwMDEzvcp1klsrVVx1MDAxMjl5n8fGfK3uXHUwMDFmZN5cdTAwMTj6r1bUXHUwMDA2YXp5uT2oJIhSW4lj8vxb38xa+Vs8ZGUl/kRl14uy5afJKWVyXHUwMDFkgIf6te5/OvpCXHUwMDE1X1iY/7f/S+t766WIXG7kXHUwMDAzxOOgnlx1MDAxZKjGM+M3ZPfIm+d7+oVcdTAwMDH32ZZvXlx1MDAwMlx1MDAxNk8xZe3/i6fdvLV3jLpcdTAwMWXu8HVtXG5haVx1MDAwZoAvNDhflHVQZFx1MDAxNlxupMr62M3ufabZwr8hbD/fXHUwMDBmI/24VNPdo0Neqn21XHUwMDFia2aYnn+3XHUwMDEynaJcdTAwMTGub3Hya1x1MDAwYlx1MDAxZFtcZijNPVx1MDAwM9lwIDgqd3I/8f/y2F2bmVny9KNccpwmNkvgnpj3XG6jOINcdTAwMDewUVx1MDAxOfuktSu1MfOPX1x1MDAxYceyg+5Yw1x1MDAwNFx1MDAwM3+vbk6NqDif+IfecKRG6YvYXHUwMDAxzfHoMVx1MDAwZsyMi/TGVqQvnEo/TplcdTAwMDSzRFxuyPx/XHUwMDA2TrBcdTAwMWQmMXhcdTAwMWRGw89IxK81jLxXsP5cbiPiO6ZcdTAwMTJ3XGb/6Vx1MDAxYYVcdTAwMGKTl6NcdTAwMTZIXHUwMDBmL+Ok+E9djDMxuSqCq/3TgFuVKk4mpMJcdTAwMGYrxY/8jzFwXHUwMDFlZEKL+3Y7VSnCzPxHxz5YwMjj71x1MDAxZItlVDSXeD2+MuFDc3WkujinZ9wv7Vx1MDAxNVNJ769cdTAwMTfEVsVxXHRdRUP1+6/X/r+vnYfYepDEXHUwMDFllcjKzkdcdTAwMGUlbTJei2nU4dAk9Pio/uabrlx1MDAxNyFcdTAwMDElmULi85qiPvyJZ4r8olBGoH9ccuf//9JcdTAwMTJL/qDl7XY4cmDc562HQ9W9VeuIXHUwMDAw6NWeXHUwMDFma75eheKtjcbE1bawa+Y8iqvAvuaH+b/X+d/X52t+XHUwMDA1L8L9u5ryXujgrphiXHUwMDA0P2JeXHUwMDFkj0+wKc9ClefgncBOgKCJ/VxcnbRcdTAwMDVcctHPojrZb9X8v2/4p3m5XHUwMDAzMX97hb3a3o2QKkxa7nVcdTAwMWb6yW01TFx1MDAwN+7qum38ZVx1MDAwMEdPhoSq7vD3/DiBUNT6QDHP/LdH1n43v5lkt+Vpg43wTdpW/tf7dN7Te65DXHUwMDAyYUHKcbpL5S6JRdFcdTAwMDPTI1xm92VcdTAwMTJxL6+VmJbTR1FOer2G/02b+iy55jv/R1T/XibnsOnPqGeUaIb6/ku3xnXr1sh2UTOHflx1MDAwNWPrpz2Sr8raOoxvZXnxVlx1MDAwNK+nLNrM+lx1MDAwMdGvsEqoKKB9+cDifFx1MDAxOZ32MVx1MDAxMY75v1x1MDAxN2BcdTAwMWK9nLKBqbY9jqG36Uq+t1x1MDAwMN/cKW1cdTAwMTPMgE7hs1x1MDAwNJdV0065lOVcdTAwMWJR9Vx1MDAwZpVOYu7zpamlkZ/4xlxyRlx0R5RcdTAwMWLu4vRiNDtBbbBcdTAwMTDruXgkiLJcdTAwMWGL8P9JNPnDyepJwV6FVVx1MDAxZFx1MDAwZlx1MDAxYaBpUsmYWGQq2Wv+15FcdTAwMDCXbp8+YOZSqM+/ay1cdTAwMWTJ3paWzVx1MDAxMWLIJEl4/ZrcPEuwXHUwMDE3uq/2XGKuXHUwMDAzROx9XHUwMDFiNNK6lkaR3GV7xVxifYti9P9NR7UumT1JXHUwMDFkrGsnS+Ld7n7psG2gcJdl93WpfFx1MDAwNaJcdTAwMGVmXs9mo9ZT+X1bXCL5XVswQ1PvXHUwMDA3vWz4XG7bTWd/M0m+gNUtRETZf5tkcfRcdTAwMDIowPCyjFx1MDAxOFX63zrtW85GfDvjXsN00l9Tm/JcdTAwMGae+cb/+2VcdTAwMTbdVoBWpeLZhza69ELHlGgqv+RotI1cdTAwMDXM0Uh8cFx1MDAxYVx1MDAxMa8rXHUwMDFkd/JcdTAwMDfKMDrWnuKOXHJwXHUwMDAwX+Vp7/21Lq/mfJk0lPnl+6hPxGf56/tgoJrpT7CI6pRcdTAwMDT8okGCN3DfmLNm8nuK1fJRlf5cdTAwMTlcdTAwMDZVOuyvT3lNjbH/7T3d49VcdTAwMDKDjFxy21x1MDAxMWs5zLimXG5NXHUwMDFjXG5cdTAwMWSnTpHn/Fxm+DdCVnGfaFJcYlv10uiEmU+DhUL8XHUwMDBlrZrJ64c7n7qJ+Fx0Ryvk/S60wFxuk0LwXHUwMDE5XHUwMDExXHUwMDA15n1Bi0POXzJcdTAwMTlAtFx1MDAxYk9KOo/WKeTrVaehm8X/yUeG6Xp+r0cv46npkJJXt4S/pUEgXHUwMDFl4l+2uVx1MDAxZEpcdTAwMWPoXHUwMDFmJ9ZbSW5cdTAwMDC1usdA7lx1MDAxY8jMb3LxRt0zqVRcXM3UWfROWpbT2nN9+lx1MDAxYlmeSOp52dbt/Vx1MDAwYlX1byZP8kx+VWCAt8yqcC9iR6e84CRcdTAwMDWaqP7PWHHMZbu8PNs/d56kXHUwMDEwrI72JZniwXaNa4T6l3s0oiFsXiE0TG2shERW/TMzQ/16KHv9OP75d45bKvrYXHUwMDE0lud2eo71XHUwMDBl6YWSXHUwMDBicVxie2HYaEW2OvDWKVxiXHUwMDFmUoo2J1G39yO/pnesPpVt/H915tXM1O7+9jZ8w19NLvSqvodcdTAwMTSpcWPkXGL8lCd9O+eB0Fx1MDAwMJI6r+HVWDlkXHUwMDBmaMDOXHUwMDE30tL5ZPbFb4c9PMq/SdRcdTAwMDNcdTAwMDZcdTAwMTleOFxi2XlcXFwinXfUdTxcdTAwMGLyqYJcdTAwMWaI6Vx1MDAxMKKE1ODuclx1MDAwMYGBxtY6/1/ZrG1IeST3Vd5UXHUwMDEwpEpcYob8XHUwMDFhlTFcdTAwMDFCvVxmyzVcdTAwMDfjX/pcdTAwMDLKxkOuyt6u8Fx0aU4tXHUwMDE59q3Bg1lTiFx1MDAxZK1cdTAwMWS9xlx1MDAwMVx1MDAxMfqXbkxcdTAwMGZcdTAwMGXdO4e8JTkjU5WS41syr1vK6uJcdFx1MDAxZGVcdTAwMWTUT1BnKbDf3/D+/Fe7Y0vn9yMmnLW33YGgK8ThXHUwMDE1yFA2RYeSSj8kXHUwMDFh61ZcdTAwMGWl3/GZ58lRc1x1MDAxMkm+NN6ot3NrduMrsVxi3TH+q04wjy97+MsvjFx1MDAwZcY9Msl8zVx1MDAwM9Px5Y+wXHUwMDEy4XFcdTAwMDDjrS7x2++A2aqTMYTUhlx1MDAxMjzmf/WZ7T3m1sFFrat8v7DH8FxusursXHUwMDE0jMaR9OVBn1x1MDAxON+MpvxrMoaaauZCLTFluVx1MDAxZj3C/upcdTAwMDZ2fUa2ty5cblEwwlx1MDAwZa21IFr39DucqX9fptiLXHIuTlx1MDAwMFtcdTAwMGJyK5Pdh1x1MDAxYTvadFx1MDAxNG6F8X81XFz3PZ1cdTAwMWY8U1xy+fxKk7acllx1MDAwN1HvXHUwMDE3ospsaa1P623zNOwoTlisslx1MDAxMFx1MDAwNYQpXHUwMDFm5+tcdTAwMDbg7b5cdTAwMDaXiZmdXHUwMDFmPqqal7imRFx1MDAwNFx1MDAxZVx1MDAxZvuFvuD+Sl9CXHUwMDAz0HFcYoozkNuthIVJfmPCxOlcdTAwMDSmOUx+hKO9tfVcdTAwMTSdUFx1MDAxML66UP9Pf10nnlx1MDAwYrnCakGDa6lDXHUwMDExeNjwXCJq/6ph7DJPpbRHS+fAh/ZcZlx1MDAwZX1QV7Gk+lx1MDAwM/+ttrCc7d9cdDyWymslIXdcckSVXHUwMDE4b0ee+fNcdTAwMDWM3eroXHUwMDA1nNfXXHUwMDEzXHUwMDAz8KM4JiPsVqFZ6Fwiv+FH+oupXCJcdFx1MDAxN1doXGaFWmeZSd75l/72KnxZc+xVXGZ/vEDfXHUwMDAwsp93KiZcdTAwMTbCcGwm1Laj1/jMdFx0++S1XHUwMDExPtONNFx1MDAwNUhLuK38NFx1MDAxMclcdTAwMDftVodcdTAwMWZ21WopXHUwMDAzheX+PWTiRTeUSlx1MDAxZVwi8ZqSsu9cYlx0i5VcdTAwMTlcdTAwMTM6XG5cIjh9dY40U+mCMPUzofdg+VCcXHUwMDA1XHUwMDE4P0mLiU9N0lx1MDAxMKlNs1x0/yGm+aLj8Vx1MDAwNaFcdTAwMTnIXHUwMDExKP7isqBGy3E5rzFcdTAwMDfG0/M7XHUwMDAzmbdccvv7o7f+krnNuWZhV1NTXak00d/3rddkhft7i1x1MDAwMqnGXHUwMDFmXHUwMDE400Lpi1CqUVx1MDAxN+choplL9MtcdTAwMTB/vlx1MDAxZL6kw9LsnfORM7yelyy2j+9jSNv3qyCSl+znXHUwMDE2cPZqIOj8Y3ZQYjqqcjtcdTAwMWbo9KZRgPRyXHUwMDBiXHUwMDEzflx1MDAxNqJ53z799lx1MDAxOLtUzt5pIGE99H2hMZRcdTAwMDfQzGxcdTAwMTYhqm9Y7Fx1MDAwNySWKrBWXHUwMDBiQ9ZcdTAwMWWhOaufXHUwMDA2XCLvTs9uWPjqS5eiNK1yy52mXHUwMDAxW63/5fLuQNzqP4NaiHVxhfnDd/0lzigw++1dJGdgXHUwMDBm2YdcdTAwMDCa2UrPQa+YQfZtT3bc0k72oTWP17/IciqfXHUwMDA1Nn9vuXRcdTAwMDLgb1x1MDAwM5J910tcdTAwMDBcdFdOXHUwMDE5d1xuds6XXHUwMDFiZur1UdtSuNeJj7bam0KULePnXHUwMDFln11OeOKi00tcZvVcdTAwMTFcdTAwMDcyesQhy5iA24pcdTAwMTBcdTAwMTaxQdf2R5f1m8Bp+HiRXHUwMDAzSSF0ra3euGXcuYrC2Fx1MDAwZWy6yFrSqn2v7Gnos75mKK/zvNtnXGY0XHUwMDE4aUJVL5PAXHUwMDFkVs93vrXy+axcdTAwMTnTXHUwMDEwm7ayslx1MDAxNLL88eFUpndcdTAwMWSvV5RcdTAwMDNW19iFbjVcbj0kXHUwMDAx+kDYmZ2OgZNz8XhcdTAwMWVcdTAwMWGe5WqxVlVeXHK9ZWj1PNjdXCJHXHUwMDAxrOStXHUwMDA0flx1MDAxYVqr8vLD+mXmjW9m01dcdTAwMDW9fi1cdTAwMWS377LQROipXHUwMDAzW0RcZlx1MDAwZv7HXHUwMDA3x3Un4NIrc1x1MDAxZVBlTe9Ix1tcdTAwMDLGNFxciU9fKWEgLapcdTAwMDY0dlxc2Vx1MDAwZoxRwyDGVldcdTAwMTbkyPpWvVxu+2E3yOxccptKXHUwMDBivylCtzxcdTAwMDR395dcdTAwMTg6l0Dc/OHUrEl7saLYO84jq7dcdTAwMDHlqPlbifNPpPDqJz5yYSBTfKFvQr9GXHUwMDE11GHWXHUwMDE1U+Bt1lxmMfT7QDtmX/tcdTAwMTLy8SWzusuZXHUwMDFh+s725maDMdn3u+mcq4FS3Vx1MDAxOc1Uc7GE/mDTT86rc8nk7lx1MDAxND05heFfWlx1MDAxMFpt8qC8taheR1x1MDAxMVRhqVx1MDAxYjNnuei+u1xiXHUwMDA2tIZUWYepSmLauyG/svJaXHUwMDEz2W5cXHRcdTAwMTTzIS2uiZOhXHUwMDEy4sdcZpXUOZDU5vRFXFxHrC9cdTAwMDCijeQgxVx1MDAwNZ2Df0FQXHUwMDE2h0yScv3zWupsXHUwMDExXHUwMDE5XHUwMDFlLttcZj66JEj4XHTGPbeh+sEkrLtJpUFQwCDL6J6lbEA/P8y3gO41M0DL+fXm+SqZ65FkXHUwMDA0XCL0NplXXHUwMDA1wlx1MDAxNFx1MDAxOCY9aG85buOkyLZ6Yc9ccrllyJb6SHXbbiTs8WbDXVx1MDAxOFpcdTAwMWVcdTAwMTQtMCp9wvlHUTr8x3uDjzKTkmwwKPDq1Vdr2lJcdKuMad/iZWhcZtDKosf7boeWQpXAK6/RXHUwMDFmfqr4hnB52632IXixPuo2XHUwMDA2hEF4clx1MDAwMcusXGLGUMM7p2RcZpKcQPiWwoPs3Cfya6JcdTAwMDdpUVx1MDAwNF64oruK316/bnK0//RcdTAwMDM1mTO/w68k/lxcXFxUk8D3T1x1MDAwMv1U43FQ0s/6mc4jvJ9cXHo2dKjutlx1MDAwZc9h0ISIjd1d+kF+zNldqEdnRzqZXVx1MDAxZlx1MDAxMqyuve1cbsSJVVx1MDAxMId9rFx1MDAxZP190ZP4XHUwMDEx6L9dXHUwMDBm3HDIPctfxi3bx6pcdTAwMDXtXHUwMDFhK7PXyrFay9pcXLK0c2U/ZdBcdTAwMTNcdTAwMDMkcVx1MDAxOEybnvn47ZuRNmYn2ItoJ1ZI4N9DXHUwMDEw8m0ybVx1MDAxM+hcbpKacvkynsakwVx1MDAwNlx1MDAwN6O+R7v1y4lSii+BXHUwMDFlY3NcdTAwMThfvc5cdTAwMTfi0U+a8LSTj1x1MDAwNVx1MDAwNjNcdTAwMDEy3P9WXFx5X2Ktu4zJNGp2a1xi9Fx1MDAxNVPod9qJxHn5hUTUumxcdTAwMTZEd1JdXHUwMDExou1cdTAwMGV13YCA/ijQ8Mb01s9cdTAwMTTCXVx1MDAxZstcdTAwMWY4OUuEnK4jO/JcdTAwMTF1vHvWP8tBW1x1MDAwN624c/27pFx1MDAwMF7Qmi7yQpaDt1MshUOgKkeDXHUwMDFm6oTRVvxQcsbfXGa/+nFcdTAwMTJ/eyGbOP033FhuKrdERCFwhSbC/Fx1MDAxYXj6W49cdTAwMTSV7uuBMduWXGacXHUwMDEzXHUwMDFminn1g03crCZVPcYrL/NJ45fBS1x1MDAxZck3s/uHdjuRimY8WYDki1x1MDAxNtFSqmJcYlx1MDAwNMKHJnvek2RGXG7PMYrxh185XkhNcFx1MDAxN1Fyu4aZlvKyXHUwMDAzqlx1MDAxMimmXHUwMDA0XHUwMDExJNtcZok0peYs4O7+ptdcdTAwMTNEk9ySgTjgXHUwMDBm7flcdTAwMGXlXHUwMDA2lr0tWl3/N1/jNthcdTAwMTL0ha7Zp8VNP3VpnOElMPqLbSvLs+5cdTAwMWFV7Vx1MDAxZHeFPrp041vdjFx1MDAwM3P/XHUwMDFkuHp9O1x1MDAwMaD9pIOYpavGo6BcdTAwMDT6flx0wn1kf6J7/on38Vx1MDAwMkouO7pIxJ2gtqJ2ICjNXHUwMDAx9K2w/sDtXFytn1x1MDAwYqpMXHUwMDExq1x1MDAxMCdcdTAwMTAkjvGaXHSWYVxc3/lcdTAwMDTaUZHreYEogGiRXWzTq1Qop3EtXHUwMDFj6LO4r7hgNm9cdTAwMGKCSOFHPaNcdTAwMDPMh7yOwLG1zjlhi9mFSanoXHUwMDE4dYQ0mjV3dnpcdTAwMTY7JCtcdTAwMThj8E/QyFx1MDAxZLReXHUwMDEzXGKfs1x1MDAxOdnsXFwqlUj+Slx1MDAxZutbMIu/5qZcdTAwMDPh67lcYuMm3Vx1MDAxZnzSTM7K2lx1MDAwN2f2ONyQQ1xu419l3khhIfSZnWSp7oM4fCGHKK/NpFx1MDAwNo1IXHUwMDExfm/zWamCjyD8NIOkxZz1ZUE5XHUwMDE57u1F0n6k43DGXHUwMDE3woz81sM3/Fx0UvS8imCMXFy8f7ZcdTAwMTH5/D2Dgp1cdTAwMTUwkSi7XHUwMDFmI1x1MDAwYjKx+pBcdTAwMWWoMp6rZk/A5lxmrNh9XHUwMDFjeylcZiio9pBCtTSqXCJBb1KB9Fx1MDAwYu0oXHUwMDEx9rlzM9fwMHp345G3ZvRcdTAwMDR2fs51xet7KI+tPfOFqFJbo1WviJTwZqdbVcnhXHUwMDE3LOAlJvo7Z1xiwtXHQ0IlyT2qvNqndCW9wbSsJ9K9QVSlXHUwMDFlOVx1MDAxNKAvXHUwMDEyeVFcZvJcdTAwMWQgVLz7myjolnH8VTI2yyuJXHUwMDAxfbWcXHUwMDA0xWGUJ08vxoyYmFx1MDAwMf2w1MRcdTAwMGYvu5PmdV6re/6mXHUwMDFk9ovNiFx1MDAxMVx1MDAwNPkmmi7hqG/UkkRcdTAwMTfyXFxcdTAwMTSL6tx19ibd6pKWQ2h/cymz81x1MDAwN3c9zYGT2iCBwFx1MDAxOZFX92RcdTAwMDNVJkpP8Vx0blx1MDAwNDCLpq/nXHUwMDBinTxUXHUwMDFibNTjq4t5XCJcYptUxut6tCq2XHUwMDE4+dv0XHUwMDA2bJdcdTAwMWRSVFx1MDAxOTsg3+ItXHKG+lx1MDAwNeR43LzY3Galr1x1MDAwMFx1MDAxOX9zXHTl961K6X0hg5av/LVhVb14/XRa+1+xKtF7JomfKND0Q3v+wOP+gIZcdTAwMGI6LD84omHTvdFlXHUwMDA3xGaOiytBXG5cdTAwMWFcdTAwMWFcdTAwMTfvb1x1MDAxMTDlvT1ccoB035Rq1eh1XHUwMDExJmP8e7i+XHUwMDAynFlcdTAwMWSDcTbQXHUwMDExTsaj0ip2XHUwMDE5KLdB5r4jZH9n59RcdTAwMTJNKlx1MDAxNz8347gsYumbnVx1MDAxMvRWh9gojFx1MDAxZYa7XHUwMDE23tlJf7OwXHUwMDA2nlmSY85cdTAwMTNDVlx1MDAxOJQpLeD+1N2xfa5cdTAwMThccmCSXsGKXHUwMDA0S19cYrOjxOfZcshcdTAwMWJtelrK0GvvttjLXHUwMDE3e0rseJ8hLEF8mlZY5mG/qa0mfrvvfVxcT9aveVLrWX9cblx1MDAxMvSKgEK4vtNyNPgmodtSXHUwMDA2k9VcdTAwMTea30JVhaZMXHUwMDE1sb38vHm9urH+mm7i61x1MDAwNd+aXHUwMDAxdZZcIrrIXHUwMDExN72eRLUz/5HlbjBB9vvbL5fdoearNlHK15Q0PYlDa6dFtXGlqUvNa3pKtFxy9fe83mHdpuj7VoJcdTAwMDeBXVZP0GhcdTAwMDKsQPpcdTAwMThcdTAwMDPi7T8rOs3KhM1d9nZQ5P2T44CawYJ2lVxmRSbcbiHConk2YiWx9ErnV4lHs3VzjS6ml+1rjFx1MDAxNZZztFx1MDAxZiTymvjkTLfCXHUwMDE34L1cdTAwMTDfWYsshS00vrTF2Fx0bG1cdTAwMWQq3DhCl/y+YFGn0NK2X71/XHUwMDAzWVx1MDAxNDevXHUwMDExVp99bSb+lbj5XHUwMDBiR845nKJcdTAwMTJcdTAwMWaoP+VE4iWr2CyE1YVVVFx1MDAwMvW+P6Dhh4S3etVcdTAwMWFcdTAwMTSGnE7KXHUwMDFhuX43XHUwMDFmbSy7vO9juO28b2HdYzpqcJOG0/q9XHUwMDBmpJKY82NcdTAwMTRdVWGDXHUwMDAwROcgXGLYXFxy0W2JrIu7Qn0xmVx1MDAxYuabwkHxpNBU2FGllJLQ95Vk3lx1MDAwZrfh1zopwplcdTAwMTiFXHUwMDFk6jPkXHJcXH1CR1x1MDAwZbZcdTAwMDNcdTAwMTKYXHUwMDExNOBNdnA34tiqMbI2gm81kbDk9fZTXHUwMDBlQFx1MDAwM4W4x4xcIrl/NGxpj3HHXHUwMDFmXHUwMDA16Vwi4GDWa9XD7cL+ilx1MDAwMDrSRM5Efi/1o1x1MDAwZYZcdTAwMGVOV1x1MDAwNGL/bs9cYltcdTAwMTHG/aVJ+Fx1MDAxM4/VXHUwMDFk/7r8leXjqyWaes5cdTAwMWNcXEw+vVx1MDAxMNKnIHU/vnLiVVx1MDAxN/hhit9nXHUwMDE2WJ5jh6CtXHUwMDFiYVxy9iaYqFx1MDAxYaVJwFx1MDAxNK1kwX6nKJx1xCyDd3W/403OKoTKXHUwMDExpDXQXHUwMDFkxTslNb9WXHUwMDA3hFx1MDAxMGxcdTAwMWRcdTAwMTfvrKnAbkzcXHUwMDAxovVOui1fk/01bcK5zlx1MDAxMHv+XHUwMDE5MJKlOPTbmuKlp49ibSCIOvhpXHUwMDE1tLlEd/qlTopcdTAwMTIluMCtXldcdTAwMTJVUVikXHUwMDE1d9DTcdBcIinfROg1PVd0jCe/b67R2TRNqj2i0shzOzKkg1xyXHUwMDE17H0nMayc/fxcdTAwMDDJtlx1MDAxMdv/kFxc8Fx1MDAxMVx1MDAwYlx1MDAxZn6qXHUwMDAz9L/HjVOg9Vx1MDAwM786+uNcdTAwMTHbpOZBXHSqs6gpXHUwMDFk5XvftKFsXHUwMDA3IIWTclqdhT3pXG5aqIq4gu8yzFx1MDAwNjhcdTAwMTO1dsdcXNsxXHUwMDEzU8pcdTAwMGXYkVx1MDAxN0CXfLh2TZ+y/pZcdTAwMTOYaVx1MDAxNUORzr9Yslx1MDAwNo8+RsvPXHUwMDFkVS470u7T5u63l+fGmSb14OVp+mHn9uCV9aNoUX8tYdlDeTS2YzRb4Fx1MDAwMoimXHUwMDA1ekWD3MDjozE6XHUwMDA3zmhcZjaWS9pcdTAwMTLv5Tfi+zpcblx1MDAxN+Gl/Fh5WVx1MDAwZXaOiL8kTcYlOZ6hPnvWv73i31x1MDAwZTL80uFcctA9NsuZZVlxIMRcdTAwMTJG61x1MDAwNbRf3uy2Vqn1dk3EKfQ713WpcO/2ootiUoojXHUwMDFkU4yP2p/80o83qctcdTAwMGaM/5tGgvygiJjnKiZcXL+uXrhBZoxOcVwiTm7Z7nyVXHUwMDExXHUwMDBig49W+7VDj0X0g0iBpcXVpDddbmtvpeVcbr2PrryIqdKtq1x1MDAxZlx1MDAwNKtcdTAwMWRcdTAwMGWPXHUwMDE2xTxm0WE7XHUwMDBm90crXHLZ1OmIu+6kVUNe6zCiv/6t+GenXHUwMDE5umTgSyyrVvTbJvJcdTAwMWFcdTAwMWEuv7FYPe5QtumQtKbYgzH1kYts/7qP68Uvi17690eRxdnZx988mp+ZqMgre1x1MDAwNCnkvVOMNHpEr4jA6FVcdTAwMWT5NmNE/4z56Vx1MDAxNGpI4DKaXGJcbsEovFx1MDAxYpkm+3qcLHhcdTAwMGJBKZD4XHKYXHUwMDEwVOW573BKgVx1MDAwYllcdTAwMTYvXHUwMDFiT1OhKcWinK+33yGpKNdcdTAwMTNjvu46Qlxm8SSwe+lkm1x1MDAxZmE4XHUwMDExZzah14VcdTAwMGXNLlx1MDAxYynxrVtA0NdcdTAwMDLKiP/sTWR4M4infrhSP8YzXHUwMDA3Qtu/g8Gq4nfoIcBNO37VwaNoXHJpM3Djl1/J9IlXq3XWPkj62yTlQ6FcdTAwMWFG/rxgXHUwMDE2W6xRJO5rgHpcdTAwMTdcdTAwMWUofVxccedTlfP3+ogqXHUwMDFkvL9yNtjxpC2Udlx1MDAwM3RcdTAwMGLJXHUwMDBiy1x1MDAxNInzy8lcdTAwMWSP99KIKnYzYNxMXHUwMDAyvmNcdTAwMThcdTAwMDWhNylcdTAwMTPMiUl05HlQwHzHiZJcdTAwMWYvfmzT5lx1MDAwNzBcIu5LWiglob0pXGJRvFxi7NM9JrpI4GPI56K0mr9tzGc7tGDPXHUwMDAzpME/lJdX10Ol0y1cdTAwMDFOXHUwMDFmqFx1MDAxYvxcdTAwMTNcdPhgv2ZGfNk6QVx1MDAwMHznSE0nrWFQVlx1MDAxOFx1MDAwMbD0yFxcd//kXHUwMDEyhjBqJDEqa+bhXHUwMDBmKKZcdTAwMDUg5Y+qgFokuvfXL3dcdTAwMWYjXHUwMDFmXHUwMDE12ElcdTAwMTD8XHUwMDA1hIVjS69cdTAwMWahoyYjw1x1MDAwMDBcdTAwMGJBXHQ5+HHt44pcbt/jqKKJi36UJNy+T0/2eVx1MDAwM/LC8JqkV1x1MDAwN3/7eewpeixfXHUwMDAzhLxgV5N0XHSxl32Rx6xTOlj6h+5cdTAwMDY2XHUwMDFkXHUwMDA0I6erN+fh2LVFXHUwMDFlp4+6hNxcdTAwMTMjXi/2+lxiiIyO30xneIWYsvIsf+eB3vqQ11x0RNdEnT5cdTAwMTJcdTAwMDPk1JnJ7oUqUD48oI5cdTAwMDYs/8pPhqOTM1x1MDAxNT2HXylybMhHQoDXr1xmyfdMujzghos1WFOrVlxmZo6d+KJcdTAwMTf8I65cdTAwMDE2Pin5di7ktdzxcVx1MDAwN1x1MDAxNqxcdTAwMDf+oTzIVqB0TVK121x1MDAxMUKsXHUwMDE4gcVcdTAwMGZhRZ1SXHUwMDBi7K9mVpB9ekXv1zzxtvZcYsCzMeSRx1x1MDAxN/6meW8hyVx1MDAxZNdLmWC220VcdTAwMDOv6YhcdDJBXHUwMDFjfC1cdTAwMTNpPJvbaKhrdYT+Pv2UtzWRO6lzea+27dVvilx1MDAxY3FzWUlcYr6cwVx1MDAxNtOnOdyi4OWZ2Fx1MDAxNUnu9NpcZmyp6sNcdTAwMWZcdTAwMWQ+kS1cdTAwMGK+iNFcdTAwMDHXjuenvLnnucjra4vGKESPjcBO9lx1MDAxN1x1MDAwYlx1MDAxN1x1MDAwMmkzj7qY0jjRdERxeWX96PHEcS9W1Fx1MDAwNURqfb1cXFx1MDAxN3dn4KPXQiZcbpPTkoNaVOdDkVxu+ab3d0KvjFx1MDAwYvb3J07yXUfOO7BcdTAwMDbPR5FHWlx1MDAxY/tqNT9w7Zsy1tK8xFx1MDAwZVx1MDAxZd7fUeAzXj1FZ0NGXHUwMDA2IVx1MDAwM8llXVx1MDAxZGtcdTAwMWN5KFxu0yHB2DPI7LBTwNryXHUwMDA1wWY3wLj+wap6XHUwMDBiT0OV52FSo6OYi1x1MDAxZLWmXHUwMDBlXHUwMDBi7YVWoHVS+od9jEg9h1x1MDAwMXXTSILGr9lcdTAwMTRU4K2XJt5vtL/U8D2wXHUwMDE2XS1NXHQvkfmKZi1cdTAwMWZcdTAwMWJusdZ1uJJiXHUwMDA3ZjJf1pc/2PJZeC/aNkPEzzhCO1x1MDAwMtWtvLi49y+Xbi+h1vqaICrRYIJMsYJcdTAwMDP3jpBx8bGBc1x1MDAxY32P+82nzlxiQvtRVN7fK01cdTAwMTDUqoGLyPox8Ks5P1Qr/443XGJCbnaQ81xmX/0yM2klXzlcdTAwMTlcdTAwMGUwXHUwMDAyPuZSOeKLtjqPrc+qzXeLg0L8hFx1MDAwZVx1MDAxYnFcdTAwMTRUnFx1MDAxYz36Wlx1MDAxZqaHXHUwMDFl5FDYP31YXHUwMDE3t160lFx1MDAwZSTHtZvom32a0oiv9X+NvIx/XGaD91x1MDAxN4BK9sJcIt7cbHrBSFx0qn6NNVLSMK1d8mBRl1x1MDAwNkzgK7W3R/SqhKjbYbxcdTAwMTewYievqKLuIKxXqyM12D9vqs77rq5w2ONTXHJ/ylxmzrPnXHUwMDE03fWpkn3y2d/gbeVWXFy+XHUwMDA1KoxLXHJ3/1x1MDAxOFx1MDAwZmVLzOA6VbQktudehSis1uQ8qiMhJZZwb/m9ri58WDuloi1F8Pkytm2rLpBUIGViXHUwMDFkYaioTt7M9SQu4iWY958zXHUwMDE17fjjZ/fHt+OrMKKCzlx1MDAxOS5AhaEoeFx1MDAwMWzXjUBcdTAwMTHtnLd9W1tsf1x1MDAxZHlpPoTUNo/8sFx1MDAxOFtrqp7/oCpIKrhcYoIqXGJcdTAwMDbH+oJ8XHUwMDEyXHUwMDA1sOXkaIBcdTAwMDZBMiRcdTAwMTd4U1x1MDAwMMP8Roe/rpZcIt6uQlx0XHUwMDAwQPdpwd1BhLH8PGZcZj9Gk5/X5dOr9nW/Lcjy/NuI4lx1MDAxZYZQgfBrZchQhd5KKaSemavjc8DUfFx1MDAxZIjTh17sWKfyq3SDWzmflcFcdTAwMDTOkkK+7yNcdTAwMTMoI49cdTAwMDKNSHk9eJrenzvZL1x1MDAxM5FywoaxXHUwMDE4sbrx/dJGXHUwMDA23JvgJMA6XHUwMDE3xDFcdTAwMDdcdTAwMWWFnETQJ8W5+c39wjyX31Y03pfP1dPcbIHZzHZReq7kolx1MDAwNYz7WFVcdTAwMTTDqVLMPoSSXG79WKnYmW3dZcTU2VY4Q/jqXHUwMDA0jFx1MDAxNu6L0Pm6NKdflrAhspr0lYGkpNNcdTAwMDKqq1wiclx1MDAwN2Jm0JxcdTAwMWbSOW6SXHUwMDA2n3PfnDVcdTAwMTeCoVx1MDAwZm+peMTn9yTOWFS5btrQpO9cIsxcdTAwMTf8JertunAkPiWbpWUl8lAwcSQ86dfesVx1MDAxYoHPwZagt4bvXHUwMDFi7Vx1MDAwZfvs9aKq9sB0xckukH5cdTAwMGZdl79SiuFcdTAwMDM2otUkl1uNXHUwMDE0QvosoFSIXHUwMDBm37vjM0ZrJvV3XHUwMDBlq4ZcdTAwMWW6r0WMuPirV3Fs972rMHSld77BXHUwMDFhf3NBuplLrp5U231D91RgxTLIc7GwjHKGLZPdVop8K6P4Oo2yXHUwMDA1U6S5aXh1dTaSXHUwMDEw+Fx1MDAxMJ12mVx1MDAwNS7zWFx1MDAxMWuEYaJQXHUwMDFhXHUwMDA0dFx1MDAwNVx1MDAxMq5ILFx1MDAxYrkozkDv3Fx1MDAwZo1pr/TVk3Sk2q47XHUwMDBlXHUwMDA3XHUwMDBiQ9Ntl8R+ujNcdTAwMTGOkKTuk63QlWS3YNf5XHUwMDE4s6bO1DzTolx1MDAwN1YxqOnkl1x1MDAwMlxmL7l50Fx1MDAxZN+3WfPFly+V/KiTXG4nzN+AQLvG1mlcdTAwMWZcdTAwMTf99uOI2GQqc+e5Q8hcdTAwMDLU+HWw4FA+NS4h5dlH2qO0KuHiZnzfbOSJXCL+aK2/1izeNY2Zt1x1MDAwM3B1XGZcYlx1MDAwMlx1MDAxMV5af8fRXHUwMDFiJlmUflx1MDAxY5fTw3jPXHUwMDE1fF7mI8irgjbrMNA9m8mm6G55vGKkgDeYJNUmXHUwMDFjQyBcdTAwMDJQXlx1MDAwNsAqUlx1MDAxZWqQSGzrVZfiOaY7XHUwMDE02dRcdTAwMDOjXHUwMDA3d8tcdTAwMTR/KN+Uz+BcdTAwMTfr5D5C8dpbf3pS6SQ/Wt1DXHUwMDAzM+G9pm5cdTAwMTTMzzeg3qHiKDyaaD0uVUmJp0TpbWvdXHUwMDEyQvh5+kN3XHUwMDA3UmvCXHUwMDE22l6bv+BccjqYtn2vb1x1MDAxY5bhWkZxXGaOKlx1MDAwNKdcdTAwMDI3I0koOIc4fvAssTPuW1x1MDAxN26YOFx1MDAxNGJcdTAwMDIjXHUwMDFiv5fcXWZQ7dtcdTAwMDV5U+JcdTAwMTZe7eRPla1cdTAwMWQ5r7tSlG9t3GU15tA5XHUwMDEwXHUwMDEyXHUwMDFiJ0WfXHUwMDA0b1xcIdCPz3WvhONcYqJcdTAwMDBE8CSoXHUwMDE5eOWX+bM13SpcZopPPXfI/Vx1MDAxMHRcdTAwMWST0Vx1MDAwMZN51evTO6BT6Fx1MDAxN/1baOVoXHUwMDE1ok1UwpuM1WisWVx0XHUwMDE1zdhDLCv6KeZl46/0XHUwMDA3et6D7EFcdTAwMDVbfVx1MDAwMbtfP/i0ym/O96fCglx1MDAxMjOaXHUwMDE3XGKX3Fx1MDAwM0Bpw6WxefQsap9gXHUwMDBmkZe9lNKOgVx1MDAxNl47XHUwMDE187TwkSe/XHUwMDFmz3xViYc/XG4jeK2gpaEnwUQp/SCZbl/DNPu9z41efVxc60qDblxiXHUwMDFmaFx1MDAxNrI56mNcdTAwMWabLvkkZLcjV4iPLH06Q+7XXG5IKORBO1x1MDAxZDe9UV/Y8U1cdTAwMWFRQvXBk0vXMKLoermK/Fx1MDAxMSFPbupcdTAwMGZMV1x1MDAwZZJ/k6KApJmD3G0z1tu3jkVcZlSxf84lkcE31ilwVThQXHLSfiVcdTAwMGLR0XeSZ5/+aapcdTAwMTbjXHUwMDAxMCWWNe1ccuPnlX9nNq/J3574I0dcdTAwMDe4/nd4XHUwMDBl21x1MDAxZlx0qi19LNlQT8rZQoFcdTAwMDLMbERQe1x1MDAxMFx1MDAxM1x1MDAwNL+o0pdcIos+JOHzXHUwMDE2XHUwMDE2refgyKxcdTAwMWMtvmOzaVxiXHUwMDE0XG5cdTAwMTP/XHUwMDEwXl5vj3pMLqMkMu5dzlx0XHUwMDA0xfeXwIBdjShn9e9cdTAwMDQs9VZcdTAwMDZcdTAwMGVcdTAwMWbfXHUwMDFmsM/JYzqtXHI3P6pcdTAwMWIghOthOys/q5NcdTAwMDIvWFx1MDAxOer059fa5C8xZ3LPQ4GkSFx1MDAxMcPAbKb2vD6VcrIvf3LBzmvziVx1MDAxMOGl9PxNXHUwMDA1gdvt71x1MDAxYf1cbl/GVuWQZ1jiyG39++2OJclNlMYy85lO9nBta5vTTudpYVx1MDAwZdk5SO0lhFFcYlBg5tp5XHUwMDFl6ZWC0q3s8bSvSmjMd2j4lUODXHUwMDFlsVwi1JGhQ+OoTzY8XHUwMDAwtY33ZOVcdTAwMWEzdKSNXHUwMDE0XHUwMDAzXuxcdTAwMWNcdTAwMTT59lxceSlaqqHN9GmpwkEmqFx1MDAxMlxcx8KbjUpxq5niI5fywTpl69+wXGJf0PKgYk9cdTAwMDNWTdd2ZUvUu4xcdTAwMDFVhblcZnHivZLrXGZYhfm3bklcdTAwMDW3ie5cdTAwMWQ9ODDQxVx1MDAwNc67rtfVlsWQXHUwMDA1cNWlyI9cdTAwMWG2MFx1MDAwNMU3PpFa8Vx1MDAwM7Tm0cY5cdPw4uJcXOCEg3ZuVsps7/PK6UqxXHUwMDFhXHUwMDE23Uq4gjmeX2Vjgy0rQIFcZvKhLuV36oE1y87bj4FC4jdDXHJcdTAwMWXnyahcdTAwMTI12pbelqXGcFx1MDAxN09cdTAwMDWvtCk30ttKe+zwb1n0XHUwMDE0hMnTWZbs4J3xJZBBjMxcdTAwMDZcdTAwMTUn+6dtxLmYbFx1MDAxMEVoW8qGZTkp2293bHRcdTAwMDGYs9yHampa3itcdTAwMDDuwFx1MDAxOCxcdTAwMWHsiaXDfVx1MDAwZSztv299s+k4s1lR7vDigNPcNvzS1jziXHUwMDFloLcvXHUwMDA2Pyc4srL7V3dcdTAwMWEgieBcdTAwMTZLpFx1MDAwNVx1MDAwMNsks2X3MKHB+y3McFwij3ZdlM8yTvrFXHUwMDEwQyNcdTAwMDI2XHUwMDEy2fQ6TIy3iL2cplVI7+p3fIo5jeo02c/JZYV1fEi7e9JIXHUwMDBiz9E/+Fxmqnt+XHUwMDAy7k++6arrKGrmitRxV9b5/Up55sNcdTAwMDVcdEgo6dFcdTAwMGbhW1T7a45fNVx07MBccqpPJ5fnXHUwMDEzXHUwMDE0fWo/SkG7XHUwMDFkVUGfb4ZP0luGeVxc6TVkjVx1MDAwNu5Si5qByszN2PpcdTAwMGZjz5gnwNzTMXrfz8NcdTAwMDbjSWi10eo77ecgXGJm3Fx1MDAxODSAXHUwMDBm2sycY89EXHUwMDFmRD/Y63CXa2izS6TTsbgsfDRMZCHO4ZpuXFxcdTAwMDPyXHUwMDBm7FxyuWdcdTAwMWHk21sld+JNlWj9rjeIpYyKrOmT2XpcdTAwMDTv7L3RWd/xu6L0Y7Ndjlx1MDAwNNrvhD2VWFNf3s3ceVx1MDAxMkma08aKUv/1XHUwMDE0krIn1ZWlXGJcXFx1MDAwM1bkXHUwMDEw8zxcdTAwMGYsv7f80jRcdTAwMDVZXCLRXHUwMDAwTlx1MDAxNFx0qCxcdTAwMGJcdTAwMDfMuXzYmVx1MDAwNS1+b/bv+1x1MDAwYmJjbupzRlxcT+uVQZWbh2F0+ZP1jC1eXHUwMDE1lUU7XG5sj4kz9dU1o4mCYMJcdTAwMDP8Z1x1MDAwN7+PuuJus0DzyvPrTrOx/SlcdTAwMTTUfrE+O1xm81xcLFx1MDAwNDL6ZiDWun6l6UzGa09AU9vBkp+vN7LYTiHeyP7+nlx1MDAxMGWhN5XR3zWTRJqfYmUhuLmlNM1naVtcdTAwMDRLuSFHKUqhtdd5199cdTAwMDYoXHUwMDA2Qy7FRYu7XHUwMDEzZdN1z1x1MDAwMj1xXHUwMDAzXHUwMDA3cFx1MDAxZVt8XHLVpKG7jlx1MDAxZq9EaeR4zuUnP2tcdTAwMDfCR05cdTAwMTQ1XHUwMDExXHUwMDAz5aCmTq3BQlx1MDAxMfZWMorauzA+XHIu1XXu98vnXGJcbscvpDBcdTAwMTJAMMA1+1VVf8CpvVx1MDAxMbs6YovG92kktIODKoPPp3Pv/Wubalx1MDAwMNRcdTAwMWK3wlPT6a1a8nTQvP1cdTAwMTKZvptcdTAwMDLoXfyb6Th47kQgizPgv+nASUloQMFhOVx1MDAxNHhZZPEyZ+Q+SpWylNma/bn2c1x1MDAwMXljNHxWva9Np43HSEuJQ3r1bmktiGlFxEO4wqerXHUwMDAwvfDrmfWpXHUwMDEx2EyOnTlb6GWNXuI74oUkwI8oIE9jdfPX4r4vmsWUkVx1MDAwNsT6i8+Ir4b5I7y241x1MDAwNYSir2mF5rJcdTAwMTBOoEaJWnXYXHUwMDA0XHUwMDA13DrlXFxXfX9hkVV6Y7KuVDV/XHUwMDE1XHUwMDBijT2O/I6JVyDPSSNcdTAwMGIqZ+cnftCtxVx1MDAwZdRRLGVcdTAwMDTKXHRcdTAwMDfA5KuH78BccjpEP+YyOTQspeOymJydsvS3X/a8X+Z4+HWquMZcZlx1MDAxZGqnx1x1MDAwNJJ3XHUwMDBllancuvVFROFVLod5S4Mzhy3brjTDh2vnXHUwMDEyjljiXvq8P9h6oavpafqlWY7ZtLTA28RAisloeIRMsXgtX1x1MDAwZq+gftE5bSDBkETQwfnw5LdJRVZmYCWwy2/y7lx1MDAxMpVcdTAwMWPQXHRcdTAwMWbUXHUwMDEwjVx1MDAxYZbm21NcdTAwMDZcdTAwMTg/5NeOb+tZXFx3XalcdTAwMWO7XHUwMDFku3UyV1iXz91cdTAwMDbgT6+6v+dcbn4ssaykXHUwMDE1XHKYPIHkS1x1MDAwNFxcnccjclbHJ7bzmDHq3Fx1MDAwMzyF9DXgXHUwMDFlXHQqrlIgX1x1MDAxMvWFL8JU8q4tXHUwMDA1K4pcdFx1MDAwZaQ2yEegMD359Fx1MDAxYT994C5ZR2wogG129Fwir1x1MDAwMmVFQfEpiaalSOxbipU8UCf7LHRlM0pf739cXDjgJeioSbxQsYzom6tsbWFcdTAwMDR40Fx1MDAxMXBcdTAwMDRbW9AuZCNcdTAwMDVw4Vx1MDAwNcBcdTAwMTdtgFwiRFx1MDAwZpfo61x1MDAxZvFxJ3blKVx1MDAwZXG6PiTpXCLV1tYg5Fx1MDAxNPzJtzGuhVal5mXQ+7Z4S31GIfOW0YNcdTAwMDBcdTAwMDenXHUwMDEy+3aNYVx1MDAwNKiNqq1cbqeRfHWcgU2eKpBcdTAwMDV0iK2kdIhTRZz4mo7HJp7bRrasTVx1MDAxN9f37LhcdTAwMDMlPKCC+rX1cFcnUnuIulx1MDAxZTIuhyzN39M6xWHGLXM1VoBcdTAwMTj1q0XtebX4XHUwMDEwusDU6Fx1MDAxYZPjb+TZRC1cdTAwMDdaZ70w2T0gXGY1XHUwMDFjy6fFTdLF46g/f5bufGNPyH2grqhcdTAwMWHIsaXhJlwiRa/QMWAun1GYfEgzXHUwMDEzJtmCzcAtd9LOsbA8UNE/RoHQeDy0XHUwMDAyWFSJwd7h7NnTb1li2U6ObmpcdTAwMDJF1HJcdTAwMDF07pHMPSw8KeDZLPQupS/C0o5DXHUwMDA3papz0mjI0lx1MDAwMdafNYNubTVfWCvCT/qgXHUwMDFhtPt2jtRcdTAwMTYwMSiT+PH7K+KepJA/UbTBravRkl9EXHUwMDFislx1MDAwNedcdTAwMDCEcaBb0VJQ8/wmXCI8XFxcdTAwMWQmedC/y/51WNXRJI7lXqaHtzLwiVx1MDAwNZiWNbGx+uPdec/vJ5gkifJNTNv425N/4lPe1CydROnwzIDd+26JTLjzw67wbGC0f2VCXHUwMDE3io03prZH94+3XHUwMDAzRpxcYomzXGZqI6pzXHUwMDE1uarfzfvitLL2gJVLhFT8XHUwMDFik4ul0i6PXHUwMDExVnFxdmVMwVx1MDAxMd5cdTAwMWVOXHUwMDFmZepcdTAwMWWk06DEbT23itEo9LKEV9hTXHUwMDFjSthBKC/sXGIvhTXfuvyb1KuxXHUwMDE3XHUwMDE5zonoZMCLzvPOU9mSsWF7uchBV35cdTAwMDFnXHUwMDA1dKj5lb7y+lx1MDAwMmIwoGdcdTAwMTBcdTAwMTbAyT9rp6pcbqyyXHUwMDE1adWP3sH0Sn+FMyroe87lXFxOmC9ccld3XHUwMDEzR+RbXHUwMDA0XHUwMDEx7MmtV/98WPlm2lx1MDAwM1x1MDAwMeFw+b59jsurp8XEXHUwMDA3tCY3r0F1glx1MDAxOKNcXG/uTYL6IdRcYk9cdTAwMWG5cDZFLEhcdTAwMTV+3cGHLFx1MDAxM61cdTAwMDdxuTb9rV030U50XCKt0XDdi7dnIKNzUlx1MDAxNFx1MDAxYeLp6aSxloYoooAoTVn2xYBM5IzH2fi0Lv+ozVx1MDAxZm1cdTAwMDMrXnjRK1x1MDAxNaixPVx1MDAwMIArvoGIXHUwMDA3elx1MDAxY2ZQ7OvfYq7gm+dGjVx1MDAwZptcdTAwMGJcXNxcdTAwMTcwm1x00/iNy4NueL02Lc3xXHUwMDFmXzo9bJAhtbd08YKlocuQS99sqbjTwqhcdTAwMTZcbsPm6/njU2ufpduNLVqz8dODsTvd+ylN5JhzwFx1MDAwZqWPmVx1MDAxMnyemaW0ed1NXHUwMDE0298h6YZAo51i3ppcdTAwMTiDXXfzkVdXuO57lt2VuFxuZfjhj0xI56d94XKvytSpxtiiqHaJ+GHVjeW7Y5c4XHUwMDEy6Vx1MDAwMo7lW2Tbb0tR465cdTAwMDM8/Hxui7Ag8Hw7SP6GaYjD13Mq3Fx1MDAwYr3x11x1MDAxOMX4ZcT/Q9V3rEnKxMo+XHUwMDEwXHUwMDBivKkl3rvCXHUwMDE0xVx1MDAwZe+95+kvNTP/OecuetVfd0KmpIhcdTAwMTApqfbsPaP5dTe5oU7uPENX4ebcXHUwMDE0XHUwMDBmXCKUNUNbl2B8KMw2w8IvXHUwMDE0qZ9cdTAwMTf1XHUwMDE1S/T1Rleuolx1MDAxME0mbU62R9mWk8LAUnYmqnWaXHSThUVRoXVhNIEnojlifcrXTjpcdTAwMTSwfH5cdTAwMTfjdkT/JrtcdTAwMTSYUGk2l1xyMLFcdMaep/NcdTAwMWZijexr765cdTAwMTbr8IhQqV3bvipLXHUwMDA0OeNcdLc/KPinXHS8IYT0yCadXlx1MDAxNlx1MDAxYSj43CB1uSFcdTAwMDHVr/v9ulxyaW8tXGImYFx1MDAxYlx1MDAwN1x1MDAxNotqkFx1MDAwN1x1MDAwZmc/TDJTUO9piZIjjFx1MDAxNEU0naZcdTAwMTdU5F2UqVRcIvFcdTAwMTQ9rjDsXFxkgGlcdTAwMWYjXHUwMDBlg+FcdTAwMTnVflNgKplcdTAwMTZcdTAwMDbwLlRWUk4xXGLjXGKkn3fDgsRPPuw6ho1cdTAwMGUpOKGLuC1zQZRYXHUwMDBlfuLYa7iwXFzla0tcdTAwMTB6xlj72zYg81x1MDAxOc9f1Fx1MDAxMGD/47cksyXeXHUwMDE4eNT2/Fx1MDAxZXK6XHUwMDFkXG5cdTAwMThl7PRcdTAwMTOLLLA4OP2x6JbXcffDsPVcdL1Jg0C/XHJLQItI35/RV8ft0aTXY0dcdTAwMGZcdTAwMGZAli6EeWgkWOWTllx1MDAwNn2MrrtQeMvYQ5k7o7+UyuRcdTAwMTGzXHUwMDEyl2BcdTAwMDf63teJ7TqSXHUwMDE2XHUwMDExklx1MDAwNlx1MDAwMpG8TnP8QJ4kPOdr0z10XHUwMDE36IhzXHUwMDFmXHUwMDFkXHUwMDFiejSY91x1MDAwMkRH2LK5aFf3rSlve3O+o+Twnlx1MDAxYrJgXHUwMDEyy4RZP/tcdTAwMDD21YWtWtSQSTW45Fx1MDAxMvZfyJWgjKzbvICOnbmVmPExXGInyfDxXHUwMDBlXGLYuN+Fllhd9IfHPGTfT3vVXHUwMDE3X1TQXHUwMDFlTFx1MDAwMFx1MDAwM4dcdTAwMWVcdTAwMTa3eT6W0StALlH7hZR+oO+2SS9PtDRy6dGfL/RkWHAwXu/j2axh6mtEg2ZcdTAwMTkjx0RcdTAwMWN6XHUwMDAxkPeeQb5cdTAwMTlvZlxizH92pYpo42VcdTAwMGU+nY6PKVx1MDAwYlx1MDAxZsqN4smHXHUwMDFlXHUwMDExMsVhr6pQ5bWhenbzXHUwMDAwzLm6PKGamVlHoWXeuebJoiXQwq7JkXvF+oyUVCtcdTAwMGbKq639YknY9JcoQ2ZZkSdcdTAwMWJPK5Hz9OH9xXC7XHUwMDEzzsSNsFv2PWmQK69SqjZcdTAwMWRkly9cdTAwMTn6vNJK50VcdTAwMTlcdTAwMTHpU3w3oegzdVx1MDAxYlx1MDAxNsSpXHUwMDEzXqe3uPjmPDx0o0/BnLGRjFx1MDAxMCBcYm6elfVcdTAwMTPUfIlMMP/MxSTOXHUwMDFh5sFtuGT9XHUwMDA1/l7vNq+qxNVGJOzh7CvIXtZcdTAwMWF2ciCV7l7qJYQx9NpcdTAwMWa8UFx1MDAxM6BhhWU/4qZcIu13/dJ0qTxcdTAwMTKwlM2dXHUwMDFmXHUwMDBmVnzYJyu+21xuOnOP1EGzVbs7QaCUeKOwgTfYIcb6LCNhIaXxvkviYFwiypzHuoZxhX/Isf7BLvA+gDyFXq+bL93LhZZjX/yTP7RkkynG1+OtwUwqk8pHWVx1MDAxNVx1MDAwN9lcIo2FbVx1MDAxOERnyCtcIpBcdGnXXHUwMDAwRTmNrcRVk2C19syjd+K9f8imIW92soP0ZdGjiK28XHSlukPL7PxcdTAwMTBcIilcdTAwMWLxUeOsW3mtL4VpReyUROBRXHUwMDFlgFwiXHUwMDE2wCkzVaJcdTAwMWJtqncv+ZNU+0OpYpOhVSZEXHUwMDFk/iDTUCiAYm1RxX3jjyZ5wChcdTAwMDIz666xtCxcdTAwMTElSkFOKm/GekebuyR53SiMhE2bz4E9irJcdTAwMWLZfiglnNmoTntK/NZs+ulrXG7X0T7I2lx1MDAxMIMxTC5cdTAwMDaTjo5yXHR9SiPxcYbpRy9BSqHeXHUwMDE0XHUwMDBmNFx1MDAwZfHIqZc3glx1MDAxNkjLJWWMK1x1MDAxM9tcdTAwMTLafoSrbOtcdTAwMTf90q7M1pRHzMBiULrmRTFYJMlfhlx1MDAwZYp2oFx0gFxcQLMuO1x1MDAwMSiKyfxMXGZ+ZvtyVnZ5dKyuOchcdTAwMWVw/MPxXHUwMDBmnkEkXHUwMDEzLrPmX+35zqeVmkS5XHUwMDE4Z/dEzoTmWI9Sxr/fwVx1MDAwYrOuQCVR3i5SurotVqmmv1x1MDAwMcJ0XHUwMDA3XHRcdTAwMTWtkbe9XHUwMDFhXHUwMDExtlx1MDAxNqPNXHUwMDE30nQjdyfoTtzvxEDXqlx1MDAxMVrcro5kRKp4ns2LaFxy6Vx1MDAxMklKxN/mhf9mmzhkjLFme7UnVv7rXHKD1Vx1MDAwYtPV7pJur9uGNFx1MDAxNt1cdTAwMWZg+WZcdTAwMDGTpLAsXHUwMDA39MZwVVxy84VcdTAwMDPkv/tyXHUwMDExQC/6JuAutlx1MDAwZbZMiJW0TtNkhb5xx2Ddrn4hYeOartAq+04mXHUwMDEy08Z3djTWXHUwMDFlbOWfXHUwMDBiMTTndipcdTAwMDXjmvRcdTAwMGLRf0osMb5gu1x1MDAxN9yMis6Xulx1MDAwNVx1MDAwNkLzXHUwMDA2tMOmN8+S1N6U3oIqXHUwMDEwfW/v55JIbmPkcSew7Ss9bFjcvYJ+I1x1MDAxOZLGX8BcYulcdTAwMTle1/PZYZlmlDcveIslP2DqdVsydjCMWXLVhXLkybKLK4SYk437uUPFMYt//WFcdTAwMTa7XcLBfDu2XWT1Rsbdx+uHh7gm/udDSYRcdTAwMGZ/KVxu37vTcClUMisoK+Rd+lxuX1xmeJyZLzyATUhg3oB35FPbq9lmzD1q8zWkr7pOZFx1MDAwNDfbnCswa5pcdTAwMTb9XHUwMDAyv6/w++6yXHUwMDE2REWW/1NvKshcdTAwMGalXHUwMDFlXHUwMDBlkvzNj1BcdTAwMGZqiSFcdTAwMWM0Vk8tP1XLqnD6XHUwMDEyPH9lTcb5eNpcdTAwMDSsu4RT0TZKunmo18PRsm9GXHUwMDA3jVx1MDAxZVx1MDAxN5RwuFx1MDAxZsslscJGv+40zINcdTAwMWOD2YMgXHUwMDE0wS/f78ebNivwqdw6XHUwMDE4UUraQaJ13v5Tj666XHUwMDBm8J0jtFx1MDAwNVx1MDAwNplBvcK8fzmUt1wiZN9tWVx1MDAwNlx1MDAwNZ5JSCu7XHUwMDFlSCRcdTAwMTA83DxcdTAwMTJfXHUwMDAyJeTYgrCczdtcdTAwMDVWyjRCSTOLpTmhXHUwMDFlMog1WlHoR1mtbanbTt2yj5pcdPAjl7QruYtcdTAwMDJBXHUwMDFltcNgf+vTeLZfavCzgCSaoSNcdTAwMDLieXHFVO3Lnud9glx1MDAwM8v57dFcdTAwMWPJI1x1MDAxYkW52J8wmZtcdTAwMWGLZW923MlriOVr+dIh8p2m7KbuiVt6/Y222EEuweIomU2FO4DeXHUwMDE4kZhcdTAwMWOum4Q62TPE2b+tf+Dl8+e9VVx0edhD6r/2y2k8XHUwMDFjXHUwMDAyZPyWKdzgdD3+XstcdTAwMWOVkeFiMMB9s1x1MDAxNM8/Jl06YrFL2Vx1MDAxZoqwXHUwMDExn5NIcU9fW5lcdTAwMGbxULQ0gYC8OL2JPL5cdTAwMDfCXHUwMDA0zcRhXHUwMDFmXHJNm3umj/R9/ekjYLOFY4ave/RU5VAtl5qWaUJQf8NRt4zqO1NcItZIL0mpbb22L+Cug6ahLXbba/E6SkVuoV86cu3LXHUwMDE0XHUwMDA0XHKva1x1MDAwNq18xEJhXGJagbaO5Fx1MDAxYjx0mTeIrnMnlFx1MDAxZmDmXHUwMDFlROVcdTAwMTVf4Vx1MDAwZup/iupxXHUwMDA1pSn7gPe3NMZcdTAwMWRcYj5cXOMhfcMjW1xutpFcdTAwMTLYVEMmTUY9j8I9e2RXlsTso2g4U/SRWsSKSkrkiFx1MDAwNrN+I7dcdTAwMGXzXHUwMDFh4KRccuyNXG5S5zWqo7b1OXe+nYjA6zXORD+5tZ79T9mqXpBFpocpOJmO8OphXHUwMDEw8aAprfjnocBcdTAwMDGfPFx1MDAwNTomlNNxYb4uynQxXHUwMDAwXHUwMDEwvlkyvDz6S56cXVwiofEw71x1MDAxZTaCXHUwMDBmmlS4ylx1MDAxYV5IYVx1MDAxNNrPi2SrrfGWUy7h9ddS1/Rh9HyjdYtcdTAwMTZ94MKlI57/07CloVx1MDAxZHNccntbxNlfnHtccuFcdTAwMWNlj96dZmkvXHUwMDExmvOaZz8jbCfDXHUwMDAydkWj+vYzMX1b/rvGm1iJYZnqTFZccik9zWaf1i6UXHUwMDBixvG9wDcq+/e1Zlx1MDAxZT+PSTXiwF5jgFx1MDAwNlx1MDAxZGR97fHxp6FcdTAwMDfNyFx1MDAwZrRcbpXYVVx1MDAwNMOr07hcdTAwMTNsOWRY3Hbe29mD+Wer44SlpF+u1lpG1fyqQ+lu1O5cdTAwMDDS8YmDRcLkQfn5wI9cYv5gMuiKvlN7xfadeuX49C0zfNZcdTAwMWKjTG4mxOja+/VcdTAwMGIzRfKvXHUwMDBmkn9ovGH0zn3vXHUwMDEzscW3wqJcdTAwMTfpXG5cdTAwMTTnv1x1MDAwM5pCK4uuXHUwMDFjW/xmTlZAXHUwMDA2XHUwMDE3nlx1MDAwNut3UFx1MDAxZFxmnovZ/K+GOaTXmSaQc89JMDdYqubHTk6P6Jbh2S+RZFTBXHUwMDBmOfxcdTAwMDa2wJyOMjxRvP+L/Vxy+76t7SUg5C/HgfTM67ig8bonw5sm7dNvjt01ljP4tbPq0Fx1MDAxOZxcdTAwMTDlezdcdTAwMTS2+ZC/mcij5FrDXHUwMDBixrCJXHQkRktcdTAwMTVcdTAwMWWR+CxcYmFdqVx1MDAwZUfEOqs6XHUwMDE2KrtGb6f2XHI3XHSrXHUwMDA0lFx1MDAwNP5XoHGl5W+wteVcdTAwMGXsnzrhUK5cdTAwMTLOrd1+X1x1MDAxZu1IR2/UwIJluXtIvnJ32VxyNlx1MDAwMN3ubVx1MDAxY4fJXHUwMDExu8Mgo3mIVv9cdPz6S2P1oD9cYnfuXHUwMDFjXHUwMDBlpz5cdTAwMTNcdTAwMTGnppJ7WElcdTAwMTT6XHUwMDExomvQMaIh7igsK6tcZl9cdTAwMDd1U6D8OirlK01iwf6r3S50WpF0XHUwMDAwhzaBXHTeVFx1MDAxZYP6RX1KpZw8Q6IsvaFcdTAwMTNeXHUwMDE2Uqk9td+k3UdcdTAwMDO8c765Z3FQTk1cdTAwMTYtuc3QjZxbydnbRnA9hsThW4jD9IpcdTAwMWPvXHUwMDAxXHUwMDE5cYmdK1l8LLRkx1x1MDAxZVxuhNTy31x1MDAxY1x1MDAxNe5/aqVcdTAwMWT9bYrh1ZqEOXcrxdRrPia1XHUwMDE0LqbLQ5WEtJpcYu47jeks/pq+TlCv1lROXFxS00xcdTAwMWXWXHUwMDFmKL2pclx1MDAxOGnKWlx1MDAxZlx0XHUwMDFjJHIg+sX5QaxUbFx1MDAxZVA9p1x1MDAwNKBAj1x1MDAwMcG741x1MDAxYs7nne6yXHUwMDE0XHJj/62PmYNQt402kNlJ3VwiJ8bzipnuN0bHUflM0K+T0qdKiJfKTFx1MDAwNjp4h/yhRlE1Tu4r6cg2/4rayfJcbvDlqEpTYO46XHUwMDFmXHUwMDEwLapcdTAwMWXSpLmGmIgnXHUwMDE0Wy5cdTAwMWK5NVwiXHUwMDE5qGuTO1387SegMVxu3SRcdTAwMTdcItlXm0ZcIjzDPpx5VrKQr9JcdTAwMWM1sOY2o+h9JVx1MDAwMsc7Mm3ssVx1MDAxNPky97dbdVx1MDAwZWmLelxmq7bxurk6XHUwMDEzXHUwMDAzWE8nq2BcdTAwMTRYSXfeKFx1MDAxM+Q1fq5s14uLO9+P62InP5BcdTAwMDCdZMn6mFx1MDAxZvRnfZPm/6xv2d1wN942sci0XHUwMDBmsVBmvPdw4UfzfvbOL2q9XHUwMDE3zrS6R+CJ0Fx1MDAwM3dcZtLtvoOlWFiP7eJcdTAwMTXdZ+hlXHUwMDA1WbNJxUcv33tcdTAwMTW+tGCMXHSwnmpcXDEt7oBfXHUwMDFj09xBJCNcdTAwMTXd/GtPqFx1MDAxY4ppmFx1MDAwMahtsYi+wrlcdTAwMDNJXHUwMDEzTlhcdTAwMDGmYM+vi6mWXHUwMDE0gtuQWlJcdPVcdCE0XHRcYu73e1x1MDAxZZloQOzjxy50+COZgLpweNyhXHUwMDBli4bHOHfyNnMw2VGhb+RbtdsjesIsXHUwMDE2XjfZ0Wikz//F/vm0vpskyaD2wu1cdTAwMTXcPlx1MDAwNOxRc4NZeZxcYlx1MDAwMl0+UOrDysNcdTAwMWPjo/rV1fKTwPSrfjLbO6O7weC2eyP7VnbWtuZcdTAwMGVd7Pv9OTpXUaNcdTAwMDeLs5Jyr+NTXHUwMDAxynF/LPVcZv42alx1MDAxOfSCNzosSo1cYulcdTAwMWXg3n9xXHUwMDA3gD44gHhYp4BN8PFIgMBcdTAwMDVdXHUwMDFlpqtcdTAwMDJfuCRJKFXKXHUwMDFmNyRcdTAwMWI6fGLtXHUwMDFmruRcXGxqunqSt4/KTbyAXHR5YkDg8+1pO+DEtMha2pS9wy9i1CtgXHUwMDAyXHRJjkNccv3tySVCrIhBpFx1MDAxNMoh9/xLZOWTvcbbTzRlWkNcdTAwMTi7a0ipXHUwMDFj6u+qL1vhwHTOhdLH4XbVSGrddlx1MDAxZoZ7KtcyqetA/vqQ3KSC6Vx1MDAxMNSvglx1MDAwMtZLXHUwMDEyM/S7rln/065cdTAwMTSou1x1MDAwMcxEN4O29PQu+D/n7lbiXHUwMDAxXHUwMDA1nPtwXHUwMDEzXHUwMDAyqedcZlx1MDAwM/UwuFRnpIvSmlx1MDAxMpm920uZWN1Ehu/ZM0uWdY3DOlcrmVr0e1x1MDAwMZbLXHUwMDE5yyZ2ba1hIHBcdTAwMWNcdTAwMDFmR3aE3DRgxFx1MDAxM995k9X1j9HGeSBccqfuzpB+JlxiNVxi0d9ea3SU2KYoj6Xwa3tMdaX2XG5jl7b5zfb8zFx1MDAxN7hcdTAwMTFKTkD7jEcovW9A3U78UUij+Gdd6T2EU9G9rLdtXHUwMDAz8O7B0XTscSZ/h1xuJVx1MDAxY1xyOrF+qtTH068jR7jCXGa+Z3J5ir2Z2nCAj9X+4XyZPLKvT8rBpF2UQvxcdTAwMTCXXHLwS+5cdTAwMGXB/rWo2lUmU+dFMEtcdTAwMTg1T1KP38o7XHUwMDFmoFZwlJ18slxy5UB0mKXoTkpROFrDS97db21cdTAwMTh6PC2Yp+NAWi9XLvmIalxyru2Kz7tP/97ded5dvzD2sNn5XHUwMDAzXHUwMDFirm04TS337INCVOPTn8ecIdAl8zlcdTAwMDYxXVxuXHUwMDEwXHUwMDAxXHUwMDBmeybu2Vx1MDAwYozor0TxKydcdTAwMDbeS7vx3dB3OVUj31x1MDAxY0Iw11Ymaux62ChcboCIt1x1MDAwYuFCoF22XHUwMDAzYpZ9s8pIr1xi++u/UNCJXHUwMDEyMiua1dZcdTAwMWJJZ+LY1YtcdTAwMWE3njenRlx1MDAxNDAyvso0dqImelx1MDAxN9BcdTAwMTLPV7tLyvXZzi5nXHUwMDFmoc2r96nZzfvt+/6nbJdYZFx1MDAwZTuY81BenJC0XHUwMDAxb3Smdlx1MDAwZlx1MDAxZpsrYnFcXJJXbT0ywXv+7o/PSzRbJKa+geFBXHUwMDEwXHUwMDFmptrl/dDKu+jnS1x1MDAxOXSTvmXdKNmwR1+ExoTxXCLsovRcdTAwMDUo2Vx1MDAwYjlZYVC6XHUwMDFl77B5xeeZXHUwMDE4PdhmcuE5XHUwMDEzYKdJzEetMFx1MDAwNUr9XHUwMDAxqVdtXHUwMDFmcdo5X1x1MDAxZd78YrJj6i/feIhcdTAwMWWSROm9clx1MDAxZnS9L9BjXHUwMDBirIBZVraZX8y4KktTXHUwMDFm0j7F3nwusaRR0ovbnnOrrNOgxZeyplx1MDAxZn8mii3q8WzZLl+UfePDYOTr2tN6XHLFXHUwMDFjrY9MYvKvY5uMkmw+8Kui/sOvTVmivyFBXHUwMDA2LvTKL4a1XHUwMDFl0qqPyPPat1wiM21raNH1Mk9ZsVx1MDAxNJAy5rZ2lohcdTAwMWXEVFGYsKcgN9v3bXXu2eCHUS/rXbF4doWgMXh3mmvC4cdvQlx1MDAxYlNnennixlx1MDAxZl3BXHUwMDE1nq2G99dcdTAwMDTQXHUwMDE373FcXFx1MDAxY5SUhY6t8jFcYs/rf6FEQOfmrV2YLJVy6CPZ4fWngdtcdTAwMWFcdTAwMWa+XHUwMDFmyVx1MDAwZr1cYmLdss/9xHVhv9jqaHWixd/ONk9ItsVcdTAwMDNuOqluYtToLzpT/NWP74qpUbMx3sKDoe/WqD1cYv0ooV/Fo/pOXHLlWddEXHUwMDAxqGgl9MJcZo4+SZa5OCMz6IQ1oaXIc+5cdTAwMDNL7ymOucuFZLlcdTAwMTTdTTNf7Fphw/g5XHUwMDFmit+XxE+CkTRcIpzyXHUwMDBi+PXReeyKPJUvXHUwMDA3LmUp1L/vJFx1MDAwZsW1o5n0XHUwMDE2XHUwMDA3RFx1MDAxZC9cdTAwMDCk+uuQaVx1MDAwNDihoLm6Yr67pNKEU1VMnPXvXHUwMDE0Usvcbt9cdTAwMTfj5i93IYCLKOFHXHUwMDFlbtH7SotcdTAwMTi6XHUwMDFlZ2GDYK9cdTAwMDdCz4VNlPLMY5+j/aNcdTAwMWQ14fGsXHUwMDEz7S++XHUwMDEx3tLntUpXj1x1MDAwMi40jFx1MDAxZWbbT4DBUFx1MDAxZaGdqzF6RFx1MDAwMr6BeICH51x1MDAxMiGjv1x1MDAxY7ruyFx1MDAxZGa3VqswevNeVozmMKAsbVtcdTAwMWF1XHUwMDA2XHUwMDE4SoXpwTva9K3z5kx3XHUwMDBmXHUwMDAwLOTv71x1MDAwZaqe/OvpNXh9Y1wiaXPlXHUwMDEwOU9cdTAwMTH1cuOWSa1cdTAwMTLUyuThgE5kXHUwMDFmnS5+/DFcdTAwMDKNX5G4i2Okf61uUea/e1x1MDAwNoh0+n7q359GNVZUMy+chqHTdG2vqDpPNI7kMehcdTAwMDZrSvUurdnuX/LI/HEmnnmzXHUwMDFmRzeBQFHTPYVQ8yVYylx1MDAxMurDMjXkXHUwMDA1z60zLeI3XHUwMDEwxixbXHUwMDA1TJHUeVx1MDAwZlx1MDAwNJv14z9N3TY5o1/rJdiTOJXjw/2J0yO6Xu62JsPfMFx1MDAwNzX3XHUwMDE3NO5cdTAwMDVblD+zW6TBQu/SIE7nXHUwMDFmhqtcdTAwMDXfSmJvXHUwMDFjJPPVWHx+fFKrJF7bXHUwMDAz8DVSge+WUF/qTO68JL7WfOu+vfdRhvfUwDl9sLLA6HQ1OUc3zvGOi1x1MDAwYqtcdTAwMWRcdTAwMWN8yG7V+lJcclFk9bGNXHLX9ftz81x1MDAxMtr+xo5yUck8XHUwMDBl0Nr9376aXHQ9MWlmbrN6Lo/RzVxiXGbwvITHJvt2k+/0WatMMlZWaFxmKlx1MDAxN1x1MDAxOVx1MDAxOIDAKDqE5G84iGjdTIVEuCf0eYIuw89Y3Vx1MDAxMlx1MDAxZu4qSVx1MDAxNbP4W9V1PT78Msu7cKVwXHUwMDExW180Id3I5Sj3f/3rjK8yP6apPVx1MDAwNOMmXHUwMDE23d/xjzM01Vx1MDAxNlx1MDAxMl/ZkKv21z0rOGdcdTAwMTCssfWUNuzo2m/Jtlx1MDAwZcT0t31JXHUwMDA3XHUwMDA2wUXGXHUwMDAwXHUwMDE3qU2eSoosbjCf0T5cdTAwMTJcYv7251x1MDAxMkr5XHUwMDEzn5JSV1xcl6OP/1JcdTAwMDVaLM/Mhlo+kiqvXbTsSHV8Vp8zXHUwMDAxavmcXGLo/Li5ir8td7xcdTAwMTKnemIvqqdvYOCPh2ev9IykkptEt3S84W1cXOWHiJcvzWnCXHUwMDA2wF7zXHUwMDBizGGwhHSMIVx1MDAxYXFcdTAwMTh+5Jiln0NaRDRPyVxmyl94XHUwMDA3PPydw1x1MDAwNMWQKlx1MDAxNUFq2oZuTjdPKiclSnHClL5cZlejXHUwMDE2mdbtr63yXHUwMDFlS/RcdTAwMDREmv2Qya+xs1x1MDAwMFWlV8ul+VRNdD1d95o+XHUwMDFlXHUwMDE0xZzlO6FIKWAn+8/ExEGCY6VL4zeaq7tcdTAwMTnGmHD69zvFNatOXHUwMDE1mHVmXHUwMDFjScR6sNe7fqhgtNLeo6fNwrm0J8h/UrfuwFx1MDAwZSqavZpcImXXguVLeN/kxFLpJKJcdTAwMTV0oFX2dinHXHUwMDBibPv8a9TqsdGDXFyvX44sx0DR74+5vMH7beth10WhipdZQYZb3u9HX987RJx2ScuaNc5ENVx1MDAxMGahr+BtYpOaPrpcdTAwMDHTRiosmprt9K76tYG7f6V16JKcI6pcdTAwMTn2fP7tI8zJjFx1MDAxMd1zho7EXHUwMDFi8uzemVx1MDAxN4ZcIjXVfcivRMZvTVx1MDAxZY3UvPUk6O/k1kGdNoo9VuTesnUmZDi1hLMoI1dcYuRvdTz2YrGnYmowTlx1MDAxYW27kVx1MDAxM6WoZVxcXHUwMDE4R1x1MDAwMt61m2Jel5VOTSW733+46NCPn0VcdTAwMTM8cvBcdTAwMTdh3rBOXHSRSlx1MDAxOMpcdTAwMDT0WCD19kOFqqqlXHUwMDFmvcHsiWOPXGZ+hzBRXHUwMDFhdpGwNruteFx1MDAxYVwiO/lcdTAwMDAggIJb25qNXHUwMDFkc8emVPTqjFx1MDAxZN42XHUwMDEz8O3eXHUwMDE0qCRcdTAwMDfZXoszXHUwMDE05t/+ZFgxyFxi9mBcdTAwMTnR4L++hq/+4399qFvI57/ilUNcdTAwMGajc/muhVx1MDAwZpGoUYFUr8lgKjP04PjzTImfXHUwMDA2QZ5cdTAwMTNjy71e16nB5OrKm0LfnahcIoOMbVx1MDAxNfs6k1x1MDAwZslAmbRjXHUwMDAznFx1MDAxZHtDscNfJ9KZkrFcdTAwMWNxUMXy61x1MDAwM8O4f8WLVCjdxFx1MDAxM1x1MDAwYtqdc4VcIlx1MDAxMH1xzWXkh1x1MDAxNzOv/JFLPF10XHUwMDE4p3ZsXHUwMDEzieWMlNM4k6SKwV9cdTAwMWFGQM99P3FA/eCvuCpT4iDC2kd2rzjof/klyX5+P8SzLZ7rXHUwMDE0kXifeLtAnb4l7k7CXHUwMDFkWrRcdGvoxj/KNi9cXFmigMeqRsPRnu168obGyMNGb6L1olx1MDAwMmhcdTAwMDXNV6Tok2n2VsPIpVFcYmU90EhcdEmctntf0ud/+YSDRUZlnidcdTAwMDBcdTAwMWO1XGIhe01bdntcdTAwMTffzKXZwlx1MDAwYqWIXCKVWizatebBbN9+l+i8ei1DZ8xwSjY679tr/8a5XHUwMDFh70pSXHUwMDFlpDUpTVx1MDAxZG+aRNaYUclTs6l/+1x1MDAwMf/hXHUwMDFliOvRcYrBMFx1MDAxN1x1MDAwMvNM7K9C9EOzPlx1MDAxYoRAy1x1MDAwM5FdiM2x1lAlrjiMfXi0xuKNiSb4xY4zsvnQaklcbkRcdTAwMWJcdTAwMDf3+aKwXHUwMDExXHUwMDEwWotLXHUwMDFlLDrt9+ZcdTAwMTGb0lS7KZVQKLlcdTAwMTU+3ECh/9dzLzlcdTAwMWV7SPNcdTAwMTDpR7+LwYXu3llCrsDoXHUwMDExWlxc1otcdTAwMDIuXHUwMDEy09qXXHUwMDEwXHUwMDA34yM/jJVYfGqw6MF2nbOFSVx1MDAwMO3bcXtFsuNdkraSZfdcdTAwMDRnnUpEZlxcbCys02t56IT+3zeKXHUwMDAxQ3DrJsiZ4YHUucpJKf1Ydnukv1RcdTAwMGaYjl7bvrN23dbiwVx1MDAxNPdonUdosMhcXM5RN1x1MDAxMslcdTAwMTOQXHUwMDAw9qfrkjE8dydcdTAwMTQn95xMXHUwMDA1MMmRyFx1MDAxYZnbPoj9XHUwMDE28//ywlx1MDAxMa2pm2qSXHUwMDFiuoKq81x1MDAwNkXPZ1x1MDAwMi61WNJneDVcdTAwMWPFUVxmifiVV3q2L9maXHUwMDBmXHSRdqSnXCKeVCS0XHUwMDFjxuhd/3pcdTAwMTe+XHSv4X79s00wMWHLOUe4nFx1MDAxZnXLQkDejS+QkbJcdTAwMTaNVt2h//Z4PJ2QXHUwMDE2f+Bs7itwXHUwMDA3Pdzr45DMWnGv6JnG6mufXHUwMDFmJuXkUVx1MDAxNHUhkmZ6XGZgXHUwMDAws3jHXHUwMDBiylx1MDAxY+lcdTAwMTBcdTAwMWX/7lx1MDAxYk7a1D6F01x1MDAxNFx1MDAxNllcdCGkr2qEQmH6r/N9XHUwMDFhxrxcIvyD0kWV77F+69fDZclk8kr57zdcdTAwMDHFlHmWOz4sNrs9JVwiQuheX+98JG6rKYaY3W6AXHUwMDFhW9ZcdEBw21Fu11wi6oZcbvaI84SLmFqSpLTPUbB5q5SbXCJcdTAwMDDnmfh4retcdTAwMTPZXHUwMDFlMfWGRUesWVJcdTAwMDT7Z/s2XHUwMDFj/KZcdTAwMTfu4aItXHUwMDE2/1x1MDAwNKLMflo8R1PtXHUwMDAzoeJ5Qt+VcDzcvuKw9YR07/ReXHUwMDA3dyl8XGbFqVx1MDAxMlsnO3jpLlx1MDAwZmBosedftPhE86zvKdfeMVfO2sZpsEB8tGL35dTqo0eP5JBPi1x1MDAwMvTarO1tPINzclx1MDAxOftfv0Jh4SM1yEHC/ax7XHUwMDE4m1lu6CaBnCk9Sig/jtlDiG70IHRJcqnFcVZUOGz9l8da6WWyl9dcdTAwMTh/LmCllPRFh52JRnBcIlx1MDAwNGEpXHUwMDE2kXGWeW7cXHUwMDEwXHRcXN43XHUwMDA1yI9C2H/ndnxkZ5BcdTAwMDVcdTAwMWHTXHUwMDFjM7FcbuRcdTAwMDI0v1x1MDAxNZTkqoDO6LVHJjNs51x1MDAwNFj8y1x1MDAwN8CEenvCpls8zHJVUvBAe6uUySyvObLxPIK7z9tpqPQgXHUwMDAzxJdcdTAwMDSI6lx1MDAwZU62XHUwMDA0bGgtV4fNXHUwMDFjP+xhgNFcdTAwMTXDpOSPXz1cdTAwMDbHOFx1MDAxNq1cItPEVS8jPa+S+uDsw+0yeZZtXG5g9ST6tGNcdTAwMDToLpZmTqZv92G/33qBXHRcdTAwMDeb7UbuwdaN9VxmR1xi2Sd8t99cdTAwMWRH5tl8znpcbpqx479LUFdcdTAwMTds3lx1MDAxMFx1MDAwMFxiSZBQ370k/+t7P5xi0WZBXHUwMDFiklx1MDAxZng18ClxXHUwMDFlrZNUXGK+XHUwMDEyuFxctnUqti1cdTAwMTBZtfc8+jH41OtcdTAwMWGc5olcdTAwMWZcdTAwMGayXHUwMDBlJtzAhutbXHUwMDEx0sho6FxcMzfx8Fx1MDAwN2C7xshcdTAwMWJficZO/FagJID4lfQxRIefI5mqSmb+2PhDw3l2pjExKMOdg1HL5NO4fjRFakPvXHUwMDA3UJBF015zKs6T82BcdTAwMDLZfrvxic3Y75tLcj3IuT57aEcxqS/TgYp9sPeuXHUwMDFlYdVF7eDjV3zdXHUwMDA0j5+Tqd0r/7jGl1x1MDAxMcvdf2WzXHUwMDE48aBcdTAwMWRH8HdaKlx1MDAxY8Tufl7vk8i6vHBrrcuyX46p58/HkLOp5WHSXHUwMDAzXHUwMDBi04FLUlUlXHUwMDE2nFt0WS+b/Fx1MDAxNvzIe41cdTAwMWX1XHUwMDE2aHVcZrjjgexcdTAwMWMudNh/vyeKLMmY1XYv5M2KQXDMdaw1Wp8/4kmGds1BMut9qeiPY9UtVrB2vdC0kLKT6Dc847tcdTAwMDCYXG5balxyUeluhfllX59mVZ3nPLsrXHUwMDAwXHUwMDFlTi9V4Vx1MDAxZVx1MDAxMDMj5nLaXHUwMDFlg1x1MDAxMNH5nzO1aJmOp35cdTAwMDF11k5b/1x1MDAxN1dmWHg0JNT2tVxmWDlUROuFXHUwMDA3OPWlXHUwMDFmXHUwMDFhU2D0Ra52/Vx1MDAwMuN1czf/Uy/pOVwiMY6tK8r0S7sjXHUwMDFjfVx1MDAwMVx1MDAxMIxcdTAwMDBrcGdcdTAwMTY7q9x/TVb7gltcdTAwMWa9XG5UgnKV8ZTESPrVtMMjOFx1MDAwMaVb2Vx0y7JR4/7z2C1gXHUwMDE1ca31WVx1MDAxM9GPTOFxOqTuJd5cdTAwMTBcZspcdTAwMTI0uJxmYVx1MDAwYrVz1yT0XHUwMDEy330lo2E/wftZXHUwMDFizFfvYtFPomVcdTAwMTPf/13bln4tTEmT3JPbqVxi7uFDyTtzxlx1MDAxN/75jVZaS4XBY/q+3oxrPFx1MDAxMv1mP3U9T8hJODlzLWOQXFw8pnjvXHUwMDE2StzaKtTEXHUwMDExm2/ZP+e4SMByXHUwMDE0ZVx1MDAwNNdcdTAwMWNcdTAwMWGlvPPTan/ylWxRa5ulN1x1MDAwM0Bnlslm83ctToRcbprQclx1MDAwYlxu5Vx1MDAxM7n6KPVcIlwinydcYvIor/xsZ3VcdTAwMTM0n+1DRFx1MDAwZre+K3gyXHQ1+XNcdTAwMDfMcKj4wt4mslwiaVx1MDAxZJlGej9MzD3+5ONcdTAwMDVcdTAwMWGiZ2efgM1tXHLWOrRi7lxu8oLi51xmXHUwMDE1SX6oaMk/z6h/XHUwMDBlnVx1MDAxYXg//rL0cHSNXHUwMDE1PKEtTXiaku5veuCfNpd4iJDCfNApXGJ4l3l3XHUwMDBmqzh8XHUwMDE2XHUwMDAzfq9unT+eyfybR0DLwvJbc1x1MDAwNJLb11x1MDAwYutnk6/kLT/v4NRcZpaI7lx1MDAxNPKaLGNcdTAwMTT59zk1OqS7vp6rnlo/9EHx2FaqzFhcdTAwMWOsXHUwMDA1XHUwMDFj5YBR2FHbSZ2gRn9+5FNcYiBcdTAwMDaj8Fc2uPzfd2Qgun9cdTAwMDchmLaloqFcdTAwMDdZzFuFX/yPQ8GOXHUwMDAzXHUwMDE2em1DVFmy71x1MDAwMjU/LP9cdTAwMDLYgl3kUdevXHUwMDBl3raJPr2Afva09FxiXHUwMDEzn+y1XHUwMDE3erBvr3Cflow7XHUwMDAwXHUwMDA2sEw4n3iK/fuN26DlSbN0rTVcdTAwMTjt2Vx1MDAxYt+1c5zgyse+pVx1MDAwYpGlcohcdTAwMTLXXHUwMDFlw2ctj1Nfj/DzXHUwMDEyd3m4Qlx1MDAxOb++on1RXHUwMDFjXHUwMDE1pVx1MDAwM+rDlik9RO83/Vx1MDAwN6whXFx4Vb9cdTAwMWGXJU6pkCtJiP/Hd3G+sELkXHUwMDE1XFxcbp83mShlW19xU1BEdcnh0FeqXHUwMDBm5OvYwlx1MDAxZr75fVxia8bcb8buXFxcdTAwMDF3XHUwMDEw61x1MDAxZYllKk6ATeIkXGZl/KWgaH/XdiZ+Yf5VQavm+Vx1MDAwNcq1XHUwMDFm//zXtJs5jcIkJ2JvnOKRLFx1MDAxMes/3vx7N4F5lsLM3U6eZ4hlOVxmbJ17MYb2RKM/67CHTSlyqs00g6G/OpjQxS5p7NgkS0XOU7p/OVOZ/r5/0uZtfqf3XHUwMDE1xjihXHUwMDBi0Mf8XpaU4PxcdTAwMTL0sslQ9DphXHUwMDExXHUwMDAyT0CjtIulOJlJJDPJ1I5SIORY45TpJi96r6i8WKxnT+Aq4//OZFx1MDAxMivep1x1MDAxNd/FJdVq6KNWtXEwqFS5xuROj0SqMZ99e5edOivNs3WVXHUwMDE2XG78XHUwMDFl90m+eP7NXG5JNlx1MDAxM3jBhlx1MDAxYplYrn3qJGSxfpDM3ilzx79cdTAwMWOZSlMpXHUwMDBllKUqe1x1MDAwZlWCXHUwMDFiac+7z1x1MDAxNVx1MDAwZUcqllxyVpUqTT88SIdsWTZcdTAwMTWYViZJbcOAOTiQTYBcdTAwMTRKPyi7cabOXHUwMDEwcYeDUSnI6vzgSvlvXHUwMDE2zvDgSu5TQK8+J15u2TZJs7xcdTAwMDa6pyeAL2uYROfJ+5LqR+61PFx1MDAxZlholL3syjWzXHLc+lx1MDAwMbRIktW6lmEruP9S//VcdTAwMTiXNWZ8fFx1MDAxMl1Ao6411TrIOjY4vd/H4iSnx2ixlGBcdTAwMWRe2ySrf3M+o5ScrFx1MDAxZVwiWUn9vSZCQT06lFEzfpJWLDNOSVx1MDAxNixcdTAwMWWUwbv6XSPo0p5cdTAwMGbQ0iph9lv+nVx1MDAxOcDQQotqSO5cdTAwMDXfsOZWiWBccknOXFz1yKQybTTZki9SXHUwMDEypCo5mcMqnlikeZCRI43a1nj04PPd5l/deetcdTAwMTmA6elcdTAwMDJcdTAwMDJHXCK8njjsz6b4/591xJLmvezN+E7ph+NE3Cw7VK6mn9R2xriuXHUwMDAw+IlcdTAwMWJWjTB1w/zy0PZcdTAwMDPFL+5cdEVEhpabwLNA9Vx1MDAxNibes/z+33v15JxZnH0lb7t8h1x1MDAwZWS3W1x1MDAwM1ieUv2bh0PQ6Vx1MDAxY6B5Y/masvPioVdcdTAwMTOhXHUwMDA3tF/UitjixuieSy5JlCvKQlx1MDAxNlx1MDAwMVxm9uBcdTAwMTNMx/nty2COvJ5cdTAwMTC9TLerRn7S5zz26Vx1MDAwNjk9bVx1MDAxNlx1MDAxYVWn40h3t7qzyLFcdTAwMDDJNlx1MDAxNK5cdTAwMDD7z8zuvzr7w1x1MDAxYWx2L1x1MDAxOCri71x1MDAxN0PFqT/TOFx1MDAwNcM/LH7IXG6UVemlik1vwozY0Fx1MDAwM0/xKZP1afyBXHUwMDFips3yPkVNxSpcdTAwMDIxUEhFiJzwYbpiXHUwMDBlZNuDidC+vNI9TGtmYzfVWunx31x1MDAwN9WA5n5frI1sOUdcdTAwMGJUSqd4SNNcdTAwMGJcdTAwMTjfPUhf51Y71zrP55SL+XHXj5xRS+shXHUwMDAxzMG6crAxX4vB96ijXHUwMDE06LOioeu03tCD422pWD3IXHUwMDA3XHUwMDE5Pb6v9iTgWCDgv5rsY36U88e9/9ns51JohNLK9shVXHUwMDE1xcZSo4czQFxmLVx1MDAxNW542f/o/E+MXHUwMDFmP05cdTAwMTfd3NarXuLQOps5UVHHv1x1MDAxYiBzqkWSiFxct1x1MDAxNlxyxtlcIjnLfE7T6ZqwVmalTVx1MDAxZKustFx1MDAxYT9cdTAwMTU2l1x1MDAxZNunXHUwMDA1wf6b0/z9ZLLHaVx1MDAwZv2zyO5cdTAwMWP3sL21qmpNy4dnRHP7effb70OhIVx1MDAxY1x1MDAxMKtcZiRbr1Ge2Os+sTdcdTAwMDVWzI24blXiXHUwMDBl0qExXlx1MDAwM2YzXHUwMDE23vhmwDBcdTAwMWPkL8dcdTAwMDfkdVx1MDAwNbuP5VwigPTER/vt8cu/+MjQ/uh7gUA4ZN2u8HlcdTAwMTSnXHUwMDFhTWHe0StfYsX3IVx1MDAwZtLDoqPPfF5511x1MDAwZkHN7Tp3cochi1DyTvR9Zlszv+dW/IStqL3SaVx1MDAxN8fQTVxm+qzlkMAsTibBN85WOsFcdTAwMTNrfNpcIvZcdTAwMGa3pZ8/MbbJQq8tPuLwvqPuMKspk61HbYhcdTAwMWZLRNZ54lx1MDAxMt3lgZze9IXzXFz7XHUwMDEx8lg76Fx1MDAxNkJM04y+bC/ary30u8RcdTAwMWJGvUtIXHUwMDFmvvm2gWVcdTAwMTW6ma+mkNhpuMtLT0tUezbtTcf/cIcuhJhcdTAwMDC911x1MDAxNH82sFxm9OzdVlx1MDAxNn07V/6WnDRUKLCmXnBcdTAwMGZcdTAwMTZR8L2vh/HmIYnxhZO4PEOm/XPcK97z+yh0MZGP9lx1MDAwMVgs1siCh1xiiVlAz35nRNqHJKVjXHUwMDE0ITiDK/+7r2DT22xcdTAwMDZcdTAwMTFAJFfGXHUwMDEzXHUwMDFhr42AlvWe6S2Qd5aK43TJvfR4XHUwMDE15088lcaX4I3eyi/u/PxtRs+Dd2zkRk4v2fn10X3vqGri8q9tKUPxx8XLXHUwMDE1uMfyrd9+pZ3HemOPi/zlu81BXHUwMDFizGCV7Vx1MDAxNHdcItZcdTAwMTfjybLyXFxcdTAwMGI+XHUwMDFmmXmUXHUwMDE55stM+i9p9idivMtcdTAwMDfDw6T2gsN89rtcdTAwMTloiPSzipjJnVRcdTAwMWWOs8NcdTAwMDFKwlx1MDAxY40qvYpcZqe39nwvnGGdn2bYgUtYa7vh6Tr5n2+9XHUwMDFm3/qXk1x1MDAxOPcvr+VF9EDfXHUwMDAzY5H87FM5dlM3bmlcdTAwMTeciHp2J1x1MDAxN2FIXGLb/fcxjYmpJSHYoo3Ez2+Fu8bvXHUwMDFjibUpXHUwMDE1hft8m+9FTpyh/l6Q5lve9u1cdTAwMGXrcut5/6T86rj/K3f6l//x7G5wbS2FXiu6x1x1MDAxY2Z+36rAyftUj1x1MDAxN9FcdTAwMWVh+pJcdTAwMGaOiVxmLT7X8IlcdTAwMTNcdTAwMGZ9T/DEdiXMpL2j/fWfUFx1MDAxYoHFNiB5q1x1MDAxZr9+QlTvy3z52JtcdTAwMTLSZNeWaf3LyfTKSvpcdTAwMTacrb2npuy/mVx1MDAwZVx1MDAxNXsotjZcdEdcdTAwMWTCqYFKb/GjjoeKIbhcdTAwMDYwN5pcZqNMuJZ66+BivTjw+/CretWt353vnOFsXHUwMDExpFxcXHUwMDE1WFx1MDAxZrooRdaxPUDQ44Uw88aqif2H37Tq6NMmqZpP802hwGPmQfyT2lx1MDAwYlx1MDAxM1x1MDAxN9LjtFxudjRcdTAwMTj95DN3tD5MekTgn8iY72uqz4HKJKBcdTAwMDXyNJwsNFx1MDAwNOaXPZd29thpNY/tp1xcyaDkxlx1MDAxNKT2eVxconPhXHUwMDBl823S42Ooc2Mvh15cdTAwMWZcdTAwMTcyxEBqKp4y/YspKv1BXHUwMDEzw02gXFwlkOfAubbzw1ZQ/W+5WebRXHUwMDBmIz3pUJFk0jkn76NSsML99t9Hf7NcdTAwMGZtobVoXHUwMDEz1z3K4WRQ74WGXHUwMDE09ZuCb7p+o3xTxOlcdTAwMTmCocgsOPtGuUJwioP+l1x1MDAwZv/88uHsK/9cdTAwMDSG4XrBXHUwMDA3P1x1MDAxZJhRPXtm1HRcdTAwMGW38iZcdTAwMThcdTAwMDP4//Om/q2j98jnXHUwMDBmN+Oq7Injm9nOYe6HLn5jwomjzCr5XHUwMDE0XHUwMDA1XHUwMDA2e4DtV/dcdTAwMDT/t3CCYFx1MDAxYT+U4795XHUwMDFkTdI3VpzA3yD7XGJrTN2I9sHeTlXSeUpR391cdTAwMTe+eFx1MDAxYd+/ZlT5sf8vbtE2XHUwMDFirXD3+3wgXHUwMDAxUdJD9FhmuYmmXHUwMDA2P7+a8Z4p2ODGy5rk5y9g3aGpf/m9yGaThdrIqHu12SfM21x1MDAxMmX8WHH7h2xjgjvFQFx1MDAxNDBcdTAwMTXJvVx1MDAxZU1cdTAwMTDo/IHQhaLLhGhPg89ccqXAwHdcYo1cdTAwMTcy8UmWNK/PqVx0XHI2XHUwMDFhvpZcdTAwMDDrbVx1MDAxM2YhfdNzrS5cdTAwMWWgi79cdTAwMWFroftvP29Eg+zzf/n+XHUwMDA3XHUwMDA3gvv48YGPe2WbqFBxXshcYkuAXHUwMDFmhf4ytFFcYrDymqYpavE4LsqXbkHGp+U/ZElV3UNcdTAwMGKXXvi12f6VVtB3XHUwMDE3RKdV/TlLnn3/NK9WXHUwMDFlpvFImGJcdTAwMDBcdTAwMWGN3fjaU99GqJCv57xcdTAwMWOofls3fSWTmmY2XHUwMDFh6r3VV2VIXHUwMDFmdPMnXHUwMDE3XHKl99V9R/q0XHUwMDEzXHUwMDFjv1p1SiilaESRfKu2MFx1MDAwNXrAWFTr6LX8u09cdTAwMTanab1cdTAwMTfm35z0I4BTRrhcclx1MDAxZnxpIcxxbI54iO2v+6pfRqpTbX+WiVO5evW4W7747bFBQ2k9upHup9Uv2/NcdTAwMDXGXHUwMDFiMFKeS1wi7FBHI0Jk4tTpJZfEX/9cdTAwMTGj3XfXrlx1MDAwN7iA6sNP+i3972VeprhcdTAwMGX7Okd0ibqNhFx1MDAwMPC24KSa8+gju/NCI0HCpzpE5GfyMqF7ybvZS+7k+55Yk2VcdTAwMGbLllx0XHUwMDA3XHSFt+eT71x1MDAwN8tTTNW4RlaaqV1qwnf3Vlx1MDAxMyXXXHUwMDBiP2dcdTAwMTWJXHUwMDEy+PndXHUwMDFixe5KT7Bxkunkb1JLsWieXG7TXGZcXFFQjffb5TZU7WXO1+bv/k4udpHeWJ6POVx1MDAxMfOqXHUwMDA2cDT1m/VEsp/Kelx1MDAwNL9cdTAwMGJcdTAwMDFcclxcZFxc+lH3dKKK5Vxu+ij5JIBZY680jVx1MDAxZKiV+XOE/s+3cO7NmpWHbFx1MDAwM7Rp21x1MDAwYnzrXHUwMDAwXHUwMDA0pu+YqdRxWKi0OlY8vm8guFDrXHUwMDE1glx1MDAxNHOyXHUwMDE3O/zurbw1fGCLTLZcdTAwMWRcdTAwMTX0+1x1MDAxMFxuXHUwMDAwvD5cdTAwMDWna9lcdTAwMTV2mZLKXqdmm50tblx1MDAwMHpcdTAwMTa2XGL706ucg2jXK1x1MDAxZf/jSNxvXHUwMDEwnSVcdTAwMDZeLlx1MDAwMS7J7XQs9m/La2ZdV2vVXHUwMDE1i0jjvojVh7iulCBjfYmki+RffOOLjEBe26/vOqil1lxy82B+SCxcdTAwMWaXRnFcdTAwMTVv51xyddl338BdumtMKUvkXHUwMDAzRFx1MDAxMvfft2fua3+4fDPrgbirXHUwMDAzvbn1XHUwMDEwtys0XHUwMDEzOVSSOOr636xi9/t68Cd72I3IlyO/cjCZPr5UTixcdTAwMTfxXFwgXHUwMDE3RMiFXGJcYjm2N331XHUwMDAz5IQ//UVr/Vx1MDAwNjHZzvZ8XHUwMDE22H+zOVx1MDAxZuv5rfdrXHUwMDE2k/ZcdTAwMTm81tBSXG7suNZGiHyHVVx1MDAwMuf80URm6jV80qHgZTBxwqpUXHUwMDFlclx1MDAwZt+xXHUwMDEzm+fyXHUwMDE1WZdYOo3c/8BTXHUwMDA3Sl/jwG12wauJrkLvdkPJelx1MDAwM1x1MDAwMfBcdTAwMTCGXGLkNn17XHUwMDEzXHUwMDFjJv27nGoz61x0lLik8zX7q1x1MDAxMEihVlx1MDAwMVZcdTAwMTdEUOpBkofL8Saiqp6rwuFcdTAwMDS/6i9CP+zOSiZcdTAwMWVXXHUwMDAzi1x1MDAxNlJcdTAwMTTBXHUwMDAzXHUwMDE3eFx1MDAwNVVGXHUwMDA3fKOcKEW+vEtJ1+VcdTAwMGI1t65Bfm7cXHUwMDE0mFx1MDAxN3Shva7Fl4+/ueFvaXxvPFRYts/hXHUwMDE0Jq1QqHpcdTAwMTiumTOHK1x1MDAwMkkla1xyXGZU1lx1MDAwYqpcdTAwMTeeMHr/6lx1MDAxMMiG/qzlxWC9bqs0xkihXHUwMDE2usrEveJtiiGoayigXHUwMDEx9DBNfOdccsOk+/tcdTAwMTZzLyg/dL95nsC8vSRi4T77XHUwMDFl0ed/OeqmUm02XHUwMDA2vVx1MDAwZUvcrU/Tg/DhfYSQgFxirFx1MDAxMzAqepTt4TvXWlx1MDAxNVc9XHUwMDBlRF3e0MSK4Fx1MDAxZqWx99BWXGKF022WO2pcdTAwMTk/Llx1MDAwMPmEvm9PY7qVOkBm8FeWq+dcdTAwMDBEY3C/hVtikehcdTAwMGJhbf0v77B5TNLxhlx1MDAwYux0d5F9ODFcdTAwMDckTUVwYKjXpo9PkVx1MDAwZlx1MDAwZVx1MDAwNfzo21j/XHUwMDAyXHUwMDE3zsaUNlxcM9y72O+f0JSenH22cPCmUlx1MDAxMkxuzH+2YczGbINcZsiRXHUwMDFhnVx1MDAxZVx1MDAxNOdqlVx1MDAwZrFcdTAwMTDl4oqwtVx1MDAxOHNcdDTsf+vrmMA9fDBcIrZcdIxcdTAwMGVcZs7X7dLUZouAIDHLYTBcbrE8epx6fElcdTAwMDUkt1x1MDAxOXNcdTAwMDFcdTAwMDN5XHUwMDFjI7Fp5XfbotelOqRcdTAwMTB+padRSdenmjW6z8pVXHUwMDBm3Oj9mjDnilxc/8CtWqO0J3a6MG3gf0BLZ1OGk8Wew8J52qZcZsFcdTAwMWangox2+XCX7nbu4GXa/IFU0e+a9lx1MDAxMdFv7GFcdTAwMTk2wlx1MDAwYlx1MDAwZkpQ4VsuXFznXHUwMDA1oFx1MDAxM9FcdTAwMTDjPLUvm5/GnVuxnVx1MDAxN3750fmKfbT2cD2QO1x1MDAxOHmv6un8nT34vFx1MDAxMK8vUcpcdTAwMTWJwtjyymXiJ3s0ITGpntxcdTAwMTnd8muDXHUwMDAyXHUwMDEysFR1bX5cdTAwMGaHIVx1MDAxNYTsuSnxouNzP6BcdTAwMWFcdTAwMGV//1x1MDAwN2lkzmzW/oNa1/hlOezr8Dy8eWkpoMU4+2dcYktcdTAwMTeoS8yRguzGLkdcdTAwMWXY0t9cdTAwMTGpWNswMDHZXHUwMDA3lXlaPtevaErf46XHnfqFtTBFjTeQ5fp709DPg37UY1lV439vOlM0OjPmX33esjlJczd6/9XhXHRxXlx1MDAxZrtN228sUpD4sI0hXFz7VN7+z30mO07vXHUwMDAxWi4ryVpYeOdcdTAwMWRusvw2teSFXHUwMDA2PVFcbpWqXHUwMDFklMmRVKBQLn5cdTAwMGU7YouMxIrVXHUwMDFlfIxcdTAwMWFDrXlcIkZvk1x1MDAwZfrjKmgp6afYwJLPccQhXHUwMDBiTJ9cdTAwMWRcdTAwMTO3mZsojnT/747eg3exXHUwMDE1ZNVcdTAwMWX3OI1cdDQlXHUwMDE5LCshXHUwMDE3oUFlXHUwMDBiOPLvjmG4zzqNi/j2STaNvfmYXHUwMDFl5Nu5XHUwMDE14sswXHUwMDFixtBjXHUwMDExjaYkoaz/kudcdM6cqmXa5lxiVFx1MDAxMb/l6Xv3tcrleX5cdTAwMTZfXHUwMDExtPGawqe61P6785/p7u8uKoHcay5cYnhcdTAwMTc0XHUwMDBmadnrXHUwMDAztd5cIjE+XHUwMDFlbVx1MDAxYlx1MDAwNXWsmvLLoaDP6Srd1pQkr3lcdTAwMWWbleSSfpptJs5cdMRcdTAwMDCnKYKle1x1MDAxM1E5XHUwMDBmSWOyTfG7L1x1MDAwZb+4bXtM2tGOf3NMPbttRDQl9JNXS3+eVWJcdTAwMTHL0Fx1MDAwNYZmXHUwMDEy793QbVx1MDAwNfL4l1HsO5hZaH28nEc/7bDV7yuT/Patb4pBMZI0XGKRfVwidNFcdTAwMDU8r1LfTklcdTAwMTTm5CmjXHUwMDA3uobZe6npwIvnVjuAXHUwMDEwyzJcdTAwMTfH8b95XHUwMDEy881jt1bUpeAuxEZcdTAwMDJWKDWCtN/1y41NR0BuPSFcdTAwMThFv9Zl6M5cdTAwMTEgclx1MDAwNF6tJ1SZ3lx1MDAxN+VpmzdKzS5cdTAwMTE4jT9cYlxuSCiw4G4vxcFqcYZcdTAwMDJ10lXWTdCFOIklmnNcdTAwMTQmz0toj7p6ffL/XHJcdTAwMGJ11PfGyGeJpnDq35ojXW5S637tvEjBlXpBmVhcdTAwMTF/rVxmXHUwMDA1k2ik6ukgXHUwMDE0/qFcdTAwMTAyXGbEXHUwMDFmdPXwh8NuXHUwMDAwZJqTiVx1MDAxN7P3TV+3XHUwMDFhPcxtb/JPWyZcdTAwMTZcdTAwMDc5lXPH1Mabq657TCD8WfeQId6oQlx1MDAxZFxuN9Xy4ZQ8PzxYLeXboLTEtGjZ0t9s5Li4wDlcdTAwMTL8XG7N9yd+3NJ5+EJDh1C7XHUwMDEw2Vx1MDAwYvxuXCJcdTAwMTYsuewreGq4Ua0nXHUwMDFjw9plL1xik1wimCN4YpmELlx1MDAwNrmuuK02X7r4e+Gm0lx1MDAxOVx1MDAxMYPwXd1cdTAwMWVcdTAwMGVAvcaoqyh0Uz+j2SdcYlVFxG9cdTAwMTi5w6r1hl2c8rtXd1Fx8J6wmbK50ebc4FDpvelcdTAwMDdzM/z27a1ShKxcdTAwMDZpaCmuqLwghzuGXHUwMDBiXHUwMDA0LDjfXHUwMDAyXHUwMDEyVVM5LVlSuqizXHUwMDA2XG7exGqy9eR/6o6eXHUwMDA3QfJvXHUwMDA3TtO5uMhcdTAwMWEjXHUwMDA08jnTZVx1MDAxOOOHTl+onzz48PU1sM83iVx1MDAxYk+OXHUwMDE1unNcdTAwMDHpUtHLOFvC4SfiXHUwMDFhqG6xWlx1MDAxM/dKbfchXHUwMDExZlx1MDAxY1wi06D1pndbh2LbZimIwcZ7nUSw1zO/Mv99XHUwMDBiXHRpOa7d9VX5gFD90JcgY1x1MDAxZjdH/axaRDi8j9eQXHUwMDEwXHUwMDA3XHUwMDA3VYv5oPmpf5WDR9KfXFzJiM3FXHUwMDFlP/2PpmibL1x1MDAxYXBcdTAwMTTB/k6lK/ZcdTAwMTSIXHUwMDEykylbZOhO3k4ywXMsnov0xPBcdTAwMDL3XHUwMDA0yPt7V6W0XHUwMDFkU3hcdTAwMWPbvlxy9Fx1MDAwNVx1MDAxMMSn1+bYqyasUVepfTXkXHUwMDE38VvronKkXHUwMDFl/LRMJIb6olx1MDAwNcvQJWenOMnVX/ShXHUwMDFm789cdTAwMTPvzr7oNFxy4lx1MDAwMkJVaMZQ5lx1MDAxOWDRXHUwMDE3XHUwMDA2mP1cdTAwMDBfXHUwMDA2/anqXHUwMDBl/4slsi1LeodB56aPLTf0ge/DPnCbjywhXHUwMDAyXvk6nTH4ipq5Nlx1MDAwMVx1MDAxMnf4MVx1MDAwZqDlvYFcdTAwMGLhupVcdTAwMWZcdTAwMWPQ+pg0wZXUptBcdTAwMGJcdTAwMDaRW7/JRCxcdCNY8HtqlS5cdTAwMTdDXHUwMDFhs15cdTAwMTJcdTAwMTVcdTAwMTHdYag5Pfz1c4n5U1dD7k5aXHUwMDAzcYePxlxcjFx1MDAwMZogJK6q0qjJP1x1MDAxY3zTXHUwMDFlP4ZQM7++UrmQMvpccqVSWd+Vxj5cdTAwMWHfJj9cIjKEQZmNM/jKrpSTZ8O+lu13XaNcdTAwMTZ4v5LOc5qL/IZcYnNcdTAwMWbuUJ+htpdP8V9On1x1MDAxZYQ6fl964KNp/Zvxs8FkZpSNyVx1MDAwYjVcdTAwMTBcdTAwMWFMmFx1MDAxMJ61mqhe82Sex1x1MDAxNbZpe5InW45yb74ol+bLRFx1MDAwMVx1MDAwNr0sXHUwMDE3QVlHzFx1MDAxZmGaXG5bh2OgXHUwMDBmUYHm9lxmlIg3dHfeXHUwMDAxVI1cdTAwMGWnV2F6g/zn3mR3XHUwMDE0XHSEcHPUgWC9gtDut2r1vcJ41aax843yKE85wDCTmy+gOnbaVfp4XHUwMDFjyqBwmJ7uh0hujy9gzFO1zfkjpG31zd9NkVwiXHUwMDFlS2Rab+2SXHUwMDAx5iCgsY4wr+P7XHUwMDFin8ioXHUwMDE1xd/52Fx1MDAxYtb8qadcdTAwMWJcdTAwMTKZzOZcdTAwMTFcYpZcdJdealN/WZRreUeCkscwnr3Lu3B89Vx1MDAxOVx1MDAwMELv0vL+zqiUi+SVbbtcbtxcdTAwMDBcdTAwMWGLXHUwMDA0Z1x1MDAxY53wtcklXHUwMDE43kyyXHUwMDA3ULflgVx1MDAwZn03LWX1ZimL2VaOv6Shp+izjrff/PbeeCUwqm9cdTAwMDIwXCI8cFJZb+Ost1xmk2mBQlx1MDAwMIVSMDSH/H1NYmJcXOogQPS0XHUwMDEx225NxLlcdTAwMDG9Nz1cZlx1MDAwMFwiYc2/pzlCNDxTiynrou+En2mJL6R5W1x1MDAxMP1cdTAwMDWtsMSa5V8uWKz5u4qSKHtcdTAwMTmvXHUwMDBmXHUwMDBmazn0MkhxXHUwMDBiimtwqo54icpogpn4vVp+6WBcdTAwMWbCdde4ZPebSsZcdTAwMTcuzS9MhzuyXCJcdTAwMDaaJmTmUVWHRUBcdTAwMDJcdJlvSFx1MDAxZJpcdTAwMDDecbdDsfacjVx1MDAxOHdm8vVcdTAwMWL/Ypv432zPpShcdTAwMTKdXHUwMDEwVaSrkkXcXHUwMDAz2P9eLzdUo+9gY4X+0k7VbidiJsA8f7C1KMJsXHUwMDA2tlx1MDAxMOFLNGFysdpqvlx1MDAxYv/U01a/u7ZBi3fAfNFcdHS1XHUwMDEz8uZxRlx1MDAxNT3nQ6bITVx1MDAxMUB5fNN6Z0X5b03Jb4K0QiGI1sWZz6REXGLD6Vx1MDAxZPpI1Fx1MDAxMbCYSLVrK0n5Nddxuu+Hg0s7XHUwMDE2XHUwMDFjrkhNYmRcXFx1MDAxYy3C7TLaqvF2XHUwMDAyXHUwMDE4vi0yW5TBXHUwMDAxTOiLmpcof1ogPFx1MDAxM79nmkyykFx1MDAxMS108+5cdTAwMWTWMJq/tbvnz8lRM5j79OdmP0r7QsOw9X1Tzfok6ytw5CTE4/iH0I3Yp6byPtHm5fuB60j3mobvKnl+XHUwMDBleSanXHUwMDE32OytoFxc5nlcdTAwMTGdpJbkXHRVMt28mc5YrHpcdTAwMDTh7WaPXHLCLGMpIbH4/Fe7udH+9Vx1MDAxMCjU7sC9wGPBJURvqFx1MDAxY7a8Mlx1MDAwM+nYqOz4/8fVee04qC3d+oG4IKdLk6PJ8Vx1MDAwZUzOOT39odfea//SaclSS7YxoWaNb8CcVeviXFxg0V/zSylYXHUwMDBlZFVcdTAwMWN8x8txypZoPEacc7iSXHI07u+c6zubQXaZU+teWOI9xf3U2nqvSbBcdTAwMDKpPlVgi9H32STxhrjPf9avuzuDVb9cdTAwMWWmXHSiWXL0/k0gyG+nQlx1MDAxNVx1MDAxN+R5PlL/hOjNNmnO8614QFx1MDAxYcc9JnGdnMadrz9U8Z083ryuqVx1MDAxZF13NsJFgo+ZVT5eduJCoktcdTAwMTZbcZBcdTAwMWOJdeots1HcXHUwMDBiUMlcdTAwMTGfv2k2Mu/Iy2fCXGJie393fcNcZtSxm2ynMkaabfHM5Vx1MDAwMT2DKzDk6/DDKMn6Kn2kbVx1MDAwYtbvhuNF4Fx1MDAwYlx1MDAwMGdnrCc1K9vmIMW9OURcdTAwMTle1382/ViDOVx1MDAxMvf4vI8pnGFKwkj/fZ7Yfab1Jst6Sr9LhoZcdTAwMGXYqfJ3os5Od2EobnI7lI701F2+oFx1MDAwNNK/ZOK6XHUwMDE5dFx1MDAxODlcdTAwMDT5huGbgYW538Dr9I9ccjIzL8t2nG7DXHUwMDE5y6DC3YtcdTAwMTRcdTAwMTGIYidxKGggObJboV19gvn9M8ac0fxQ0UnankifXHUwMDEwOVx1MDAxMkWLXGKg8q34WuPV8U5y7dJKvppUt5ua9tJdXHUwMDEwReVAqFx1MDAwMoGU6vqQKuwvT2w8zS2zqSVkTu7glHi2XHUwMDFjXHUwMDBlcjSocNNcdTAwMTOkdWx96mEgZZY9SzAjL19rRFx1MDAxMG60W8J/5rv+7H/qNCBz+lxuyJSkveSt3zGh0m71usmtpmxcdTAwMTKd7e5ndChVeaFInXuoeGiOrW3t4fVcdTAwMTl9y1x1MDAxMlNcdTAwMDc/XHUwMDE0XGa8TtxcdTAwMDZKm0PbqVxyyk5Suy1cdTAwMGXMXHUwMDA3XHUwMDAyjKK1c1x1MDAwM345lYrUf5s6/5i+4XZatVqxJDLoq1x1MDAxNb9hUVx1MDAxY/pXJ4Fr00I6NZsrVpfIgFx1MDAwMFqB71x1MDAxZnuyK1RcdTAwMWPuwFsyXHUwMDExeNMr8MG4ujhcdTAwMDQ/crfDQ5JjeqtWuE1pomg5bTMj6/JcXHU2mGfzKq1X6vJl/7t0c5S+opSptlx1MDAxMUwtulx1MDAxMTlcdTAwMDI2r5K63jid498obrlsXHUwMDA211ptXHUwMDE4NGfFd//JXHUwMDFm+j0xd8I0myGzXFxcdTAwMGU/eVP1LvwqSHTf7F3NyNBcdFx1MDAxYvVLbSr5XHUwMDE0gFtS38/zV1x1MDAxZlE3XGKjOi+Q++/ah5bdmcWu0ENFcCAymdfVP9ZcXP+5xa19c2lqNvl7XHUwMDAw2DySpVxumjSu8Vx1MDAxY0PjZU04ek64VzbGgCxcdTAwMDdcdTAwMGabN2vP/N25pExA34BT9T1cdTAwMTHEdT78XHUwMDBlzklOv9opyfnnQjdcdTAwMDdcdTAwMTQ0XHUwMDA0XHUwMDE2XHUwMDA240jy09WMUfz7nCB9XHUwMDA3XTxCJFx1MDAxZGN6RX3NecZkUHiFM2RrN5fgh99/3qpcdTAwMDZ+V1x1MDAxNKbLw5lcdTAwMTOy+oM0/nm18cs1rZn8aSQwXHUwMDFks7if4eDGtiOwR1x1MDAxMeSxkfiwYHqNq+vN79zlJSaMXHUwMDA3/itl3329z9P9x0d8V37r3d/s08ZOzlx1MDAwNFmLvLmhXGIqPkiO0C5tkmMm1f1cdTAwMDNk2n/XXHUwMDBl0H/z3txZpFx1MDAxN9TRdfbHJj3shc3xXHUwMDBleFx1MDAwMlx1MDAxOFxiOlx1MDAwNlnPQ1xc4fns891gL1x1MDAwNVx1MDAxZlx1MDAwM/3aXHUwMDE5SZ6k4crNy3jH4t7eXHUwMDFj/9+xXHUwMDE48lOpUklsjuFOXHUwMDAwXHUwMDBiwbMhXHUwMDA03bWCXHTqN4XBNTNjXc6xXFxkILy62DtmXHUwMDBljNXBn9l9KcKHWFwi0LrmdSpcZqb73dlWXHUwMDA2XHUwMDFmXHUwMDA0UU7POWXKXG4r/OJf99t8LWxk4nvYqM3VQZOXp/ffOfVGxFx1MDAxZeKQXHUwMDExqy/4vpn8OliyUlx1MDAxY49cdTAwMGLF13g03WuCfKWxrTWvj1T5XHUwMDAwtj+mjvorYscyXHUwMDBm014pOUxOzl16iPF1RmA5qNutd+WCJi4jib6vwFivU5VcdTAwMTNcdTAwMWRSXHUwMDE3PfpzQElcdTAwMDYx/7mv9985Y1+ertVfnOFcdTAwMWKiXHUwMDFjKVxyfNXfSpSwypZ7kto7XHUwMDEyv3ai6/iuPky0pHRxiXJcdTAwMDa3ZypyJEwmeONcXPa0XHUwMDFmXHUwMDBl5UNJqZE7eSWInkmtZqAlaMT+3uRmaif1aV3CueP/u8fPlvLHQaLtnErvYutv6CDmPc09V57wKVu+Z0vP3dk8V1x1MDAxY6BJXHUwMDE2/PZQvyB0W9pEMZTMiKAtxlx1MDAwN1x1MDAxNj/WXHUwMDFkuJxG72RC/zZPf9Xi61x02m/Bz7nVXCIl7etcdTAwMDJxR367YZVq8ZLnw4ZiXHUwMDAymlxmsKCTqTCRXHUwMDA2yVFP2KbY+Ncof/c+XHUwMDE1OvP9XHUwMDAzKeKX9lxcxVx1MDAxNlx1MDAxMFbqXGatii3HrjpFlFx1MDAxNCRcdTAwMWJcdTAwMWVobPlGPynmXrWoXG7Uj5YkdJFCYYtPxftJLvLYZW+ATnzH/uup1XPVXHUwMDE2XHUwMDFjK0Ry91tcdTAwMGI1+Fx1MDAxMeT1NGY4hYRGXHUwMDE0fLF6XHUwMDE5XGJEl/1oLO8rbfaHptpcYmfrwFxcSU9cIuyLi9RDRNPXJ9hwRsOMOCAhuOpcdTAwMDKJX7UvtKclXHUwMDA1U9+vqSlcdTAwMDEvmV1r699tlKFu635kYu6FMKfAwrtA3L371mnZXHUwMDE2Xv1tISVDYpPWKDHGnS3IVUBcdTAwMWMnenx39VCoolx1MDAwMNNcdTAwMDZu+IiMfGnyXCJcdTAwMDNx/ck6WVx1MDAxZJJW2Oh126otXHLgMlVvfVx1MDAwMWLnaFx1MDAxZs6XuFlhXHUwMDFj75WyfCyhXGI6I39cdTAwMGZvSNesupm9m164WUO/flx1MDAwNcDgvjuRV2AxsW1YXGJZtzJ8sibKja77+FAhVSHJgers5ZXRuPNzdczJ+IlcdTAwMTP2k1x1MDAxNYMoXq4mVVx1MDAxYshcdTAwMTkyP1xcSyvCXHUwMDAzZVx1MDAwZe63JkdcdTAwMGbSKXVcdTAwMTD0blx1MDAxY1x1MDAxMz00zb5bXHUwMDFjQms+rSvzU9V7nIm9MJ9cdTAwMTL+Wlx1MDAwM8vyc++RKlx1MDAxZVx1MDAxOCzAsqdkKVx1MDAxMrXgXHUwMDFk0vTBx/czz1x1MDAxN+w0ZPLLQpp7XHUwMDA3Uf9cdD24iVxcOVx1MDAxZbvIQrxamFx1MDAxOIeBukXBbM9ZlSVWeV9glJe6XHUwMDFhPIqrRDRM6XW1enPwmrZcdTAwMTWq0/tWXHUwMDAzXHUwMDA14e17KFx1MDAwNmdTa+38Klx1MDAwN4zCX85as6Po5D8u5VxcJrlwY9FcdTAwMWb+gqD8Q51cdTAwMTb0kpB6r20pe1x1MDAwNfUj3d7BXGLTQtdiIz5ksSvP37krjMNcdTAwMTn35a/f/cZcdTAwMTFmXHUwMDFl8JqPyPQ23UCIOVx1MDAxZE5lXHUwMDA1beh6olx1MDAwM6bmTL7pQiCg8qrjXGaX0TEte1SU8GqXXHUwMDEzXFxzlE62/e1YlnHm7vtcdTAwMTl2XG5oiL/HckTfPS+gNfz1KVaTznLUVrqyXHUwMDE3Q65cdTAwMTRhhrpccr9pgoH7JeK1kYaR04322e3WllZNvkMjfb7WWvVnbzexa+WtXCIvYVwisEGfJpNs7T9hvVx1MDAwMXUpXHUwMDBlQu7M2ZdxYIszqvZ2alZxbi5oXHUwMDFiRWr7VyBn6pp5WHRcdTAwMDVtejvI41x1MDAxOf9UjFx1MDAxYWNlq+PqTUR+lFx0sqr/5FHKXHUwMDEzj+veMW1B39f2bFJr0klcdTAwMDdb7jN7XHUwMDAw1ltcdTAwMTCtxrrdTE0lRU0rXHUwMDA27567x0ruXHUwMDEyzKjhmCfZs/fS84NcdTAwMTYl5qNqXHUwMDE2XHUwMDFilurQxrJr/5Q+XHUwMDE09U1GQ89cdTAwMWS2NMPojVx1MDAxNn8jXHUwMDFkaPtC5e4uKZdfnNJ+ckzrYZYokcayguuSXHUwMDAxV1x1MDAwNSz6JE2uXHUwMDA1k/5cdTAwMGJcdTAwMWVGy+9cdTAwMTJDXG5MpPz5NyDS89qI9cfvpjyEsXhOyD1KXFxCYCXZmVxuhVx1MDAxZt6xXHUwMDFj+UzgWPUkT+5I8Vx1MDAwM2PYgjPt0OJEXHUwMDAzYPlcdTAwMWFoh+GrMMiLIM8xwt21J9WEgVxi3ihBKLyI5HBhyklcdTAwMGZLcboug8bg+J7U8+M7VqBeecqOu/RJevhcdTAwMTigtp/GvSqjlZh71oq0vu5cdTAwMTN88vtDbo/o/Vx1MDAwMC3h2eCRdsHAaL5rLVx1MDAwNN1cdTAwMDLIhDk/S7vZN8yBO5bBXHUwMDFh2neLpFx1MDAxYU/Xrl2Xn/2Vk/t1cdtM0crL4Fx1MDAwZvukkJBcdTAwMDTXX7XMbTFvQTBlQTdOajmEjdMpXGLRpVx1MDAxMdtcdTAwMTRSJlxye6D3XCKBwOM7LaxyM1b6UeaG+JmbcYHfdWlcdTAwMTZcdTAwMDLZzFhQ9jRcdTAwMDdGT6JcdTAwMDHImm5cdTAwMWZn70/Pt5q2dnggueFcdTAwMTFDI0hwOG48c5HFTCudi8RcdTAwMWHjocjNvuo7NCuCjZNxQCFcdTAwMDenIaqKdDeYylXgQG9gdVx1MDAxMZ04+W4n3IVYXGZ3XHUwMDA3ot/hf3O0rq+kTr3z2LdkUaG3r1x1MDAwN4G+ln96fsjfXFxcdTAwMGI6XHUwMDE3LOIj7JRFtKCUxPihXHUwMDFmS6OdvdhGXHUwMDFl1ndcdTAwMTd/SFx1MDAxM/Erqs/vXHUwMDAwcc5cdTAwMWVrXY5Z0liv74sopMm4VFhNUENcdTAwMWIyJMdWUzaCuiSOf7Byh3vFxtlcdTAwMGb7VZBe/VXP9yPHXHUwMDE4JKeR0Fx1MDAxZVA4OeHlj9yLubPpUfJcdTAwMWVOXSR8JFwiWCubc26zq/Ark/beXHUwMDFjfEPfYLo7XHUwMDE3boNcdTAwMDNcdTAwMGZ7kfrmXi5AnLrPXHUwMDAyXHUwMDAxz8Sc/YGYIOfF66lMeVx1MDAwMG68+K5NI2Y5fo/oYXp2uVNJZk2MsXy1hN68+1x1MDAwMGlWdjyVXHUwMDBlpz+GedTv8tGh+ymeXHUwMDFlyHXyxZO/WnLNP+tCh5fLQJ9UholcdTAwMDDAy/lcdTAwMWSYb1xy7quWP/LzOeWUtZquXHRY3XO0+FxizUe/iq/mkMDpkpmPfidcdTAwMDNcdTAwMWZwi2n5bFQ+21qsK7eVpceWbyRcdTAwMGZcdTAwMDYpXHUwMDAyLyUno3njzZdcdTAwMTk8aE71UZZlV8tccr6dtuA8Qinqb1x1MDAxY7GQXGLe4q2ewVi7abHnmkdcZo5jXHUwMDFmyKtWezZszZBcdTAwMDDzXCKf41xmQXmhwzQtSl5Xd1wiprd4a1x1MDAxNZBrPK2a/m5K+1x1MDAxMVx1MDAwMZ1cdTAwMDbdZMz3uYCIXHUwMDEx1Cg8KF66uHXxUWJRbK5W4sdcdTAwMDG7qbiPS/JcdTAwMTUjg7hrrlx1MDAxMMpqXFxodCd3bJlcdTAwMWNcdTAwMTdkZTBcdTAwMTPW2ifnY6o+nSOuJyTMsEfsOjdcdTAwMTJGiDxNeTlHluei11x1MDAwNlx1MDAwNcu6uVx1MDAxONBq4Fx1MDAxOSV0Z018vtlwhS7RxVx1MDAxNWeYWX3X74ZcXH17XGLgXHUwMDE2jJk6gurOo9LR51qkkl7ObHBJpX5QhX9cdTAwMDOiXHUwMDA2XHUwMDE04CtcdTAwMTe13u39RORgrVf2XHUwMDE33e7nmb9pXHUwMDEwqDxVcOP9m3eIvadg+SW/fnpcdTAwMTE8fLmyW0NzY39+W7aeJ/NcdTAwMDbpLd3Wq2LkntBxlWSMxkhWKsJTIbNcdTAwMWHVcGDJcXOhXHUwMDA1Qlx1MDAxZqTyO2ryXHUwMDE2vNhj2z66hlx1MDAxZYEkXHUwMDEy9/aPjcajQVYsn1x1MDAxY+59XHUwMDFlIKy3fCdcdTAwMGVUvrTSkU3OkOWCaLaIT1x1MDAxNFlglOOs1kdKXHUwMDAwxVximGJN3arUv+98Yf5uXHUwMDE3QJvCZl7mT3xaQ6BXO1x1MDAwNteNLmlFtixlNMsjdG9cIjUvMXqgcP1ofSXw6KJC+zFr1y9cdTAwMTRMXHUwMDAy2ZdcdTAwMTJvz1/NXHUwMDE3s9aWUzbckiR243ZN+Fx1MDAxMnTUN+2nJVx1MDAwZuxWLlpIXHUwMDFlXHUwMDFkUjiXcsGsXHUwMDAxvr5spyRcdTAwMWVcdTAwMDSm7npcZlWN+37zQ8zG0VS2zlx1MDAwNefzXHUwMDFhbW9cIn9QMcTCL1x1MDAwNarXstikiP+Sjq3vXG65xsqtYKq5iXVcdTAwMDGf86/GXHUwMDA0XHUwMDE3XFw4RkXz2DPaaFxm34HAmWT7vFx1MDAxYVx1MDAxOMD6PVx1MDAxNYFPe1R4LVDuazJZnlx1MDAxYVx1MDAwMq1cdTAwMDMstTynzfVcdTAwMTMzsFx1MDAwNYFcdTAwMTnmXHUwMDA3kpVcdTAwMWadiLqJW41VY2Kv6awwXHUwMDA1L+7v31xmcOy1V4KzqVCmlZ1cdTAwMDFZidRcZk5g/fW2cK9ruamV7OkjIUnbUVx1MDAxZDtA/I7eXHUwMDEzXHUwMDE4lqOuNSfwaLC/OUBcdTAwMTT5lzXZXHUwMDEyyFx1MDAxMdiOqEPdRTR6o8amZGdoJ9fKgEnJXHUwMDFlYmjlv4Z25TBcdTAwMTKfpEdfNCk4hNjN8oCCXHUwMDEyiisgXHUwMDFh99TvXHUwMDA2qS5cdTAwMTHduplcbiZcYk+FTVx1MDAwNPd4lDbXRd7/1sglP1v2101cYohYO4JcdTAwMWVeirUktlx1MDAxZo11ljtgisRoqlx1MDAxYVx1MDAwN66dXHUwMDE1YcxOv6ROhSX6bTe4XHUwMDFjsO/OPi68+dhZrjm+XHUwMDBm0ZEgI1x1MDAwZdXF7V9cdTAwMGaAXHUwMDAzquT/Z83xq+L8U5hEXcNTq40jlqiRNVx0pfjKKJROh3RatXbN+5vhwvc6yXPHXHUwMDFlXHUwMDBlaVva0v9QYlx1MDAxZtZ9gpW8XHUwMDEzglRl6Fx1MDAwNb9S4czXXFy+Oa9zgvnZxYlcbphVL5b8/j4/rYhcIv1cdTAwMWVcdTAwMDbTjVtOzT7Mh0xv9Vjx/tWkhUisL6KptnhMk+tcdTAwMTE4XGZcdTAwMDAlkYVcdTAwMWVtVPBeL0LAdG8qSDtcdTAwMGJnKm+egfFcdTAwMTK5iWqJkSj/6T3TKYt6/SS4S/ZcdTAwMWHKm1x1MDAwN1xiYFx1MDAxZux/jCw5YeeUm5Hcv5+oxHCk2Fx1MDAxNrGk7yZcdTAwMGVqlf1cdTAwMTJcdTAwMTBcdTAwMDcvUfXa5U/BqDkroi74XHUwMDE3vvRCZ65cdTAwMDfrr3+StLpcdTAwMGVV1Lf/nrZ8Po5nM75Mo8PKXHUwMDEx+DCFIU37lyGHiFL4WCqlefGSm/yCXHUwMDFm8fpcdTAwMWI2euCx9oHNXHUwMDA1oEzSSK1cdTAwMTd1XHUwMDFkdvpywN8s3Vx1MDAwN+3ZVylcdTAwMTZzY2ioKjDm/C5cdTAwMWPAXHUwMDEzh3Lprpdax1/wseVcbi+OMtxxf1x1MDAxZJLkm/Gz7yOAI/5cIrpOQj7766PdY3Ul2jMxo4XiXHUwMDAwXGJmlOBxundcdTAwMTJcdTAwMTX2e/XyXHUwMDFlOiua6Fx1MDAxYUZ5XHUwMDAwXFzIbKmvvsplnmJcdTAwMWVbmkZSxDrEd7G+gmgxSzi94jyfye213td0XHUwMDAxXGbxeOONx4mnrngnsnVcdTAwMWVpc5JFX4fbXHUwMDAw0Fx1MDAxZZ3OXHUwMDEyXHUwMDA1gOInzW6ZXHUwMDFiXHUwMDA0XHUwMDFlwl2M0CdcdTAwMDSmm85cdTAwMGX8XHTzln7DyoRri69+up0ubItv20Rf2mwx5apcdTAwMTZthyl+sOG2oU+2qFtLz5GBuvb3rCEgeolcdTAwMWaFZ91cdTAwMGUp/Ovmw70o7bBfvGas/sslXHUwMDAz242zXCJcdTAwMGKUXHUwMDE4ZoSO2nNRIHhcdTAwMWQvXHRB1HMkXHUwMDBmvDqG3lxiXHUwMDFmXHUwMDA0VIvJ1HeGXZnXXHUwMDA2XaZLrK5i+lx1MDAxYTPzTLqJJVxyhFx1MDAxZTopf2VcdTAwMGL25Lxcbvm2wFx1MDAwYidcbuM7IMdOaOZPg2N27yOP2LT6XHUwMDA36pxcdTAwMDVTPZyqUnPVM5ThYFx1MDAwMELeJlx1MDAxOfichrDg+iAgvv5ors/Xalx1MDAxN3NkXHUwMDE2cItcdTAwMTKmXHUwMDA2k6SZe1ZcdGW8THBwoPSXe1x1MDAwNNbZLY58iN2lXHUwMDE3orsufSxhmL32XG44sP13XHJxiYebzL6Zwlx1MDAwNCxi9Sb//XvTpOmSSetcdTAwMTWwTOy4lu+GzpTBySajWE1921xueFx1MDAxMmjjxctdNrxp5TLGN8+0J1x1MDAwYlx1MDAxY/j512JcdTAwMDbdXHUwMDEycdrp+45pkf3Mnlx1MDAwMOuVkk3o3ltsXHUwMDA0WTKQQL6KXHUwMDBl0/UmP41cdTAwMWbfs1ethuRGSFx1MDAxOLaZUf0t58Vj5Mud1KG5XHUwMDE5RYqiPkz3o3mSKTVN8qlO0o1rnTFePlx1MDAxMr+zqp9cdTAwMTdrMLTqXHUwMDE00lx1MDAxNnA2gWanm4FmeYfmhep9+GqxRSimMFxmXFxqU8/rJSn1tIJcdTAwMGVcdTAwMTjkXaq4yNE5XHUwMDA0Y9p26Fx1MDAxYeDdJ1xi1otNXHUwMDAw3V5cXKrPqH94uDVcdTAwMGJiP1x1MDAxNvek38OjXHUwMDBi/qtcbp7+no9TymLbOFx1MDAxZFx1MDAwNLaSaoHaKOxcdTAwMDDzxYM+XHUwMDA2mjC4Y7ZQojBvxGpNh2ucOfKJ9Vx1MDAxMUL5uk/9/M7gb7tnVonzs+GRglx1MDAxYtM6XHUwMDAzy1WUrX07RIGoa1x00LVccqAqtlxmNm3SXHUwMDFj1DSzcYt8MdRcdTAwMTdcdTAwMWSwh8jGTV1cdTAwMGb6alx1MDAxNuJ/XHUwMDBiKnj9+lx1MDAwNEexQVx1MDAwNLtcdTAwMGVFmlx1MDAxYV+8ZVI71Oa6uVx1MDAxYvN1Ur9cXCs2JVx1MDAxMlx1MDAxOfy2ttxcdTAwMDeC7GfsXHUwMDFi8WK4S3I0XHUwMDFhaNNfW6lfQ1x1MDAxMCia7YjI9z6HXGJiXGLVXHUwMDE4lZlmqVht6bDJ8Fx1MDAxYrWZuuOKzl7f+npcdTAwMTfcbVx1MDAwM1x1MDAwMbxV8EEz5F60meTh37RcdTAwMTM90ThcdTAwMDVAzlx1MDAxNGfJXyNOP3nfXG6SK5ZcdTAwMWOHcitTo2T3flxcolLRpkN7I1x1MDAxYy2Fb6y6XHUwMDFjhVx1MDAxNq/xnq6zUGlWbZBYpCVcdTAwMTj+fUv4rzjUYtavM+InurmuXHUwMDE5YDfBkzqCXHUwMDEz87u/X4TMqKL5+cHnb06mLraq5TBPyzN/qlxyJlxy12D3Mn1U7yQ/IyOh8NqPXHUwMDFmXHUwMDAzolx1MDAxZDJb071cdTAwMTdcdTAwMTBcdTAwMTlcXFx1MDAwMKGKPDDOvNp6XHUwMDFhcupEXHUwMDAyX0OO33vemoVcdTAwMTDuQj/k6zaXu1x1MDAxYrJeXHUwMDFh7EtcdTAwMGJPfI5Q/Vx1MDAwNTYmzPpcdTAwMWLiVa/PL1x1MDAwMNF3XHUwMDE2+PNfXHUwMDBmSVx1MDAxZHSdv4Iskcy1R42BtVxyhiDylN98nTVcdTAwMTW8/J1cdTAwMDaOXHUwMDEzXHUwMDE4fWCBXHUwMDAx4zzPUjXGXHUwMDE5XHUwMDFm61GVY8HLbF/P9YS3Ld6yXHUwMDE5+1x1MDAxM1xy8znQ/iOveJnsS1RcdTAwMTLjjGwv85pcdTAwMGa+h1x1MDAxMfbXXG6ORlH/gEA/hFx1MDAwZugx9Ydfs3QoQHLAo5+R5nNnXHUwMDE2XHUwMDFlXG5cdTAwMWaDO1x1MDAwZs/cPp9o21DjzW2rUN6UQVx1MDAxYfRcdTAwMDa4f2uZQH3NXHUwMDFhXHUwMDFhnuYkkVxiMmdU1nNfrz/R1LmS3Gk+VeFcdTAwMWQ6sYDWJ7MrXFxhtCnpn7Ogr0ZcdTAwMTSzZPeZW7FcdTAwMGL2dvZNKmxQffPqWnnmXHUwMDE30JZcdTAwMDTYw6a9TFS4z1x1MDAxZSNbhvSe+JxdXHUwMDFj5PZmxEOAXHUwMDE52Vx1MDAwNXz931dfXHUwMDFkoottyMI9X4hcdTAwMDI6MNBccoLa0ex7lcguuqVval9cdTAwMDZcYji0gbp7792c3j0tOeZcdTAwMWG/X+H54I0kXHUwMDBmdJFcdTAwMTbbfl7PrDiyXHUwMDFjYDuQf1x1MDAwMsJ1mVxubzR+01x0XHUwMDEyRV3sykKS4SpcdTAwMDWeNqSe3l2UyadB/sBBqZhcdTAwMTWUz/Oxza1RypOYp+IgPaDsnvewPcXK3+B4tEX401x1MDAwMoxudOKZ4fxPXHQvYUtcdTAwMDH6KFx1MDAxMFx1MDAxZF5TK7/rqrlcdTAwMTiHXHUwMDEwXHUwMDFjKessht98/0jnJSnZv/6avytKqnamZSMlgie8VrNcIkHkn4I7LmPMyHl1uM+ln6ByXHUwMDEw5M1vXHUwMDEx4SND+HtcciCoIbdcdTAwMDHdPVx1MDAxOEzIR+LLrKhpdiB6wbpCKprkN0aKXHJXXHUwMDFiXHUwMDA1XHUwMDAzOye6KrFccobQoL9TU/A5uJDSRctMTVxcjfpEf1x1MDAwZobWYsle94GTzVx1MDAxM74mXHUwMDEwicRuSsJn+qujhOgmXHUwMDEz5H/lZVx1MDAwN1x1MDAwNujXkUCb7ocyXHUwMDE4s05cdTAwMTNE21Euz+5I9ndcdTAwMTlMT5I5y7efm6tsl9JitlTg4STo5SCjYqmDiVh/+e/cqLCkXHUwMDE4j85cdTAwMTXfvnFcdTAwMGXX6ESzXGaAJVx1MDAxOSzzpNRcdTAwMTiQm+dcdTAwMTHGRzuAzNRcdTAwMTEluraDd91cdTAwMWGuL6z1RYA2XHUwMDE0aYDVlZtaPs/30t59nniAn1TdlC7wNoDi+cLqPltDa1FjyWus3E3YXHUwMDE1d8tcdTAwMDdcdTAwMTi6Kc5DXG5cdTAwMTJbNO1cdTAwMTFJNvZcdTAwMDeofSP6xH9tpPJcdTAwMDKtqvH4Vo0og2bQvf4jw6GylYaiQYNcdTAwMWVz8Vx1MDAxZjqo7Z3zqJbtcUIr02ZcdTAwMTbrXHUwMDBiZlx1MDAxMmrn21x1MDAxN/vsgUhNrrvbXCJcdTAwMWSSQMtcZmBGqtP5Jlx1MDAxZnz3pMy/g49iLbVEIVx1MDAxN1x1MDAxMVx1MDAxN1x1MDAxZFx1MDAwN71cdTAwMTlLukl5XHUwMDFh+1x1MDAxYYeD7lx1MDAxZUe1pymfRK7lNZE4LN2ZnduKzYb3nSNsXHUwMDA3jFnwXHUwMDE1mFx1MDAxMTRcYjn50EY/PoOtXHUwMDExXHUwMDAwUs2Uj74n5dxTOcGDg5KU5DumXGJcclx1MDAwNv160kLM3vEwq1xuZLFcdTAwMWFccm1FVFx1MDAwZfz3Y/vzRGO4+mKKgZswnYdh16993Dtg/H3usfhcdTAwMTRWXHUwMDE30Z/Zjlx1MDAxMON9Q/7ZXHUwMDBm+WX34Vxcp2H8PFruu0mJwtNcdTAwMDdLdH2MRitcdTAwMDV/zm3n/G9cdTAwMTWWNWRfXHUwMDE3XHUwMDA3XHLMVFx1MDAwMXKUTWRmkeuu2zWti3vC/Wox8Jcx0dCVkWxcdTAwMWLrTjqaSDUwXCKJw55Jp475efPEXHUwMDBmtzNdcjH59SBPkuTDRDaFnFx1MDAwZfxcZlZ5KFx1MDAwNY85TctgeS/ellBnpaV/2Vx1MDAxOdviMXZFzEHFtVx1MDAxN4G7RF9UUCCW8Fx1MDAwMUZLTrTYvyYsqUNEpUNcdTAwMWY6uGKhNmJw+095zTIrziStSZbyYTkvXHUwMDFhaVFPfIwwXHUwMDFh6VLTI6i3kblcdTAwMWMpJ7bsWr3cXG4hXHUwMDBlzoZcYtD2j1x1MDAxOfJBW4jjnrmNKjFW+t2mh7OEjIeobdXUIFx1MDAwYtd1XHUwMDBmK0CdwqTCZWXZXHUwMDE4XHUwMDEz7Faf+0RkcM0pukVcdTAwMTGtgdra2lx1MDAxNuOmsWKhnlxclSErWMsnRjG39il9eo1cdTAwMGJghXEva6+SXHUwMDFlXHUwMDFhXGJmUsWo4TugVsKDyOm2XHUwMDE0XHUwMDFheFGgoC5N069buCy7hVx1MDAwM3TLiOLT+Fx1MDAwMed239j0p+hcdTAwMTYoVPwr+4+pXHUwMDAxo99cdDyBxtbUZUFurlx1MDAwYl36KWqHRYJinsJTXHUwMDAwcenMv7HlJyp20KOMK8YmyvHw67uOSFRWZ9s2eLPSt6RUNz82QqrglVx1MDAxM6DRdmtG23tlJf3Op1x1MDAwNkJcdTAwMTMg5sVPm166irtF3oezXHUwMDAwRE28XGLhXHUwMDE5QJ+Tq03/WVx1MDAxMIb0f87+NbLEXHUwMDAylVx1MDAwM8lcdTAwMDaHMlx1MDAxOVlFe09cdTAwMWRcdTAwMTdcdTAwMWXoyOWrXHUwMDEzX+bLWE17YpSezue6XHUwMDEwNJCLykzUb7wz8p108UdcdTAwMDTIiZo/pt3+MNB4gp9ZzZE/mv796mAkom/an8va7uSZpXP5vOW6oVx1MDAxZnCIzuNwiNRVTflcdTAwMWGrR55OMdlcdTAwMGV7eJnVMCNPoW6Ro/yvcXvSTVx1MDAxNdz0cXGvaaVV0r1cdTAwMTmLsjOtqaI4LtYsLjg/THmcmFvs9oVDOFx1MDAwM3pcdTAwMDHWqVx1MDAwN5BB0uNWtVx1MDAwNMlxsZ+Xvm5cdTAwMGXhTo6z732SuMVcdTAwMGKiXHUwMDE3Slx1MDAwYqvZ4P0mXHUwMDE1OZZcdTAwMDA/iVx1MDAwM4zAO1x1MDAwNnDAXHUwMDA0ilx1MDAwM6Ovp6k+c1tcdTAwMTUx3jBcdTAwMDIxzVx1MDAxZr1+r3jBj2Cw3VlcdTAwMWVmr2Q82ZVQyiVtnrJMrZuXXHUwMDAxvKU99Fx1MDAwNUDold+NXCJdR6DUPv2a3S6Rhti9UVx1MDAxOKCe/1FI0MVy9cdcdTAwMDeiTd5YXHUwMDBmwVx1MDAxOd/SXHUwMDEyeKL7uMnjXFz909v0x1x1MDAxZCl0pO6Heu1cdTAwMDZy5qDDlftcdTAwMDafXCLDnOT16zHHWbBbxOC89eaO3tXOs4pko3SA1JFcdTAwMWEymVx1MDAxMnxaYFx1MDAwMVx1MDAwMepcdTAwMWTLRFx1MDAwNlx09ae+S6KX50j5pG+aXCJcdIYwVydagUlcIm0wy2yrUUbRZp08/pqHXHUwMDA18yNBfb+PQ/OCVosmvKejlGyvhVx1MDAxNPW/esa70rNSXHJt/U+k7lx1MDAxNlx1MDAxZcBbb1pA/ymys8t7PX/hdapQrq08TGqqXHUwMDExxI++j10qjXdaXHUwMDFlV1xiT2FrXHI7a/7paVx1MDAxMt3xWFx1MDAwNFDDp1x1MDAxZJ6HXHUwMDEztuimYlx1MDAxObOAKGvGVKRCXHUwMDFhzVx1MDAwMnxtSz9+lFx1MDAwM8/fp7aGcknWzFx1MDAwZvTWduyyQl5Vbl+3XHUwMDAwWVRcdTAwMTHitVx1MDAxYYoompJcdPOVqpKsXHUwMDEx1+GOJd/WtMKMbYnpmjFxqjt9VVaeLDvEusyWXHUwMDFh+2SZXHUwMDE3TM6Okj1cdTAwMTV2U1GYz1x1MDAwZqVcdTAwMDXmuK8su43oJJU0zJ98WVxiXHUwMDBlayCjXHUwMDAxq95PdkdDXHKJXHUwMDBlXHUwMDBiXHUwMDE5XHJi7MCVj0bQ2nvsXHUwMDFhgOyD9kVMXHUwMDE3XHUwMDEyXHUwMDAwKCOO87fwXHUwMDE09XWFecLrg6vDhTQuKv1yR4G/cWtcdTAwMWHCVODyQGzcOTmJx3mi58gsd9spXHUwMDE2kzichvpcdTAwMTWYbkRmdZT6XHIydFx1MDAwN1x1MDAxYfK0mVAoZ1x1MDAwMF2CWzoyYVx1MDAwNOyWNSsluvhBPV6WqFx1MDAxYyuvbu3XXHUwMDE4wX9bqoSPjn61n6H5z7l11I79zlx1MDAxM9+DYuxcdTAwMTVai1xcwpdZXHUwMDFmp1JH7qrzddg3a4ygJDpcdTAwMTlfL8BcdTAwMTZcdTAwMTip3+KGi94qvzDeXG52PDC6S++q4jU1kFx1MDAwNlx1MDAxNiitgDuG05TSJnQgdetUJ7bXUebnM49E9lx1MDAxOSdcdTAwMTVcdTAwMDI/7uB+6vfIVKp/z7PRQHlcdLUzvFx1MDAwNq6ApzR0XHUwMDE1v2LFO/K2vEPtoLZiWdPxXHKf3LazlkqWXHUwMDAxaqF0XHUwMDEy2VlcdTAwMWHWp43zWMNmRVOhpepcdTAwMDKhXHUwMDE44bvqX9zjX6NX/8HfsVx1MDAxMFx1MDAxMVxunDyg3KWhXHUwMDBmRZTNJWBKmPhppaj+XHUwMDE0ISrN4Fx1MDAwMN/vZ8lcXHc9MveHXHUwMDBmyPY7kYPjz5cufFXDrrWgTMpcdTAwMDGv/12xV6mF5i7skN2bXHUwMDA1NUNYavhfL9km3Fx1MDAxYVwid3H2XFw1lCxcdTAwMDT71/NNXHUwMDExXCJcdTAwMTaLfp1vXHUwMDExn1x1MDAwMVdakJJcdTAwMWOR27K40KxI11RLyTGSivNY0zKNfne1/7eEXHUwMDFhoEqBvdVJvcRa+lx1MDAxYUdcdTAwMTR3VyrDjIHdZFx1MDAwMUMmXHQsXHUwMDAwflx1MDAxZm38ZXJt6VxiZ+fZUvhYuaMtrGiIfZb9bpnOXHUwMDA3b25J4e+G8/lSuXKHXGaM1VPGsfi2Qabk41x1MDAwZjCVXHUwMDE5mINfps431Fx1MDAxNENcXLWtLVg8XHUwMDAyrY5UwKeldFx1MDAxOVx1MDAxOVx1MDAxN09W4X/tXHUwMDFj9WmwJnD+XHUwMDEwcJFgvlx1MDAxNFx1MDAxOS5FbeGTXHUwMDE5XaBcdTAwMWaqvv1GRIL8XFxjKDKIXFyEQ69VTlx1MDAxNeTj6aHZ2ZnpXHUwMDFjPTlcdTAwMTVcdTAwMDGcUY9BNIs4yzuaxSlRh3KSXHUwMDExI3hkXHUwMDFinFxub5xDNnlBgNxb6GjrkDxnc1x1MDAwZlx1MDAxY1xcpJTdXHUwMDE4QZxAXHUwMDEyrWyuhG5cdTAwMTLIXHUwMDExL5hcdTAwMTdAXHUwMDEzpcawYZ9HcvKkrYx8XHUwMDAwuClcdTAwMWM29Vjwvlx1MDAxOdOr1p/fL4jE6m9O7/NNXHUwMDA0+M5O6qNgf7Wg3aGtt9egsmbn61x1MDAxNVx1MDAwZmr4pIOLUFLnofiDfL4wQ9BHikDwmlh05lqd1T/mXHUwMDE5y+vZ/61XS21Thlx1MDAxZqFcdTAwMWZYavubd1x1MDAxOUlcdTAwMTNCdzP59Sw3ZYRljyDywj/uicL08MhcdTAwMTT6XHUwMDEyVyiVvVXVyMw1v6OGWCBcdTAwMWWXefn0SnhCLVx1MDAwNVNGKnrAYN29fTNt+tumZsNcdIFtlqU/dnDDuYxcdTAwMTC3a/6ZWVx1MDAwMjGqjo9cdTAwMTBIl4g1XHUwMDE5t/iNIakkPu5KsVxye8TnXHUwMDExN1o/XHUwMDE163AhXHUwMDA0wrnUujDYScon/WpvqFPRrmtGz+A9SKU6Wyayy/O2Ou1jJGIp+rraq1xu32BcdTAwMWW7S1x1MDAxMY5Y3DNVlPLZpYdcdTAwMDRpRitcdFx1MDAwNnq+2Fx1MDAxYbFcdTAwMTOcX5S1sdN9qTzW2L/18lx1MDAxZY9cdTAwMGbSeYe52bGozrFcIslcdTAwMDCCl8Tyc4J/XHUwMDFmI+BcdTAwMTFVzc9cdTAwMWZcdTAwMDCR4ssjUdVcdTAwMWHVXHUwMDA1hvD2UCE7tEF0X1x1MDAxMe1cdTAwMDMuQaxcdTAwMWZfUFjbXHUwMDA2XHUwMDBmZkOeXG7bSp3pWaNq1XusuqDrj1xu1iaKNpVJl4imiZ1cdTAwMDZbXHUwMDE3TbyoyJZcdTAwMTN6g5k+XHUwMDFm5vDn2b6KPb9zQD86i9yihSCnU1a7XHUwMDE4v1x1MDAxNnErXHUwMDFhY/ebv3awiaVCXHLNjFx1MDAwNozzii8u9mSYeHX+JFxyXGL4sFx1MDAxNa3Amp6Nk/lB+jSk2/Wd2n5O7rVEcFxmnPKAkYbLnlx1MDAwYsaumX1cXNnAXFxbTy35oOlcdTAwMTmj46SE0Ediddc0XHUwMDAwXHUwMDAzkq/PmZOX8UxbN1x1MDAwZUTOTVxivqRcdTAwMTL/99hcIrVMgk6kmoqowcOO9qFAs9i4fVJuOlx1MDAwN7erKqDXW3lcdTAwMDKI8an71V6du6OafSmboD/5m2YjSySeutDXuHBnXHUwMDAwTI/jdeKMsqfK9LJtW56i/EBZXHUwMDE40s9cdTAwMGKsXHUwMDE3bMwrdFam9H3y9ZtdTlZcInaL0ImQO2s9J/5cYm6YSyWNXHUwMDE1g4D5V1NcdTAwMTjkXHUwMDFhXHRcdTAwMWG+lHHX42+RN054UJx65spTS1x1MDAxYTd/4GuOyuKWXHUwMDFh+nOJgVx1MDAwNVCZXHUwMDFlXHUwMDE0t1jajDzxJ/t+dKxLXFw0bdt87phT45nRj6E3+W/5QLT0vLxsvFRmbXhcdTAwMDJz+vyrXVx1MDAwN4M+p5oqKmtu+VIjipvzf0U5i6NGtinC7CF6Ud/1yddcdTAwMWYulduaobaSOVx0wFx1MDAwMfOyWVgxLOvtXHUwMDFlcVpcdTAwMWUrOGZcdTAwMTl/M0+7XHUwMDA0XHUwMDE4bXfa+1qg45nqcL8ny1x1MDAwNnY+VEiNSVKjtdlvXHUwMDAwZGGGXHUwMDEzLkeWscK4nKZcbimPYZjlXHUwMDFloP5QK6Vu7lx1MDAwZqjaXHUwMDA2V1x1MDAxY4l3vF84/XrxenpNYbN87Vxyzdat+nOKvPI6zqeAXHUwMDE3JV6J7PVfwFx1MDAxNsLDXHUwMDEypFx1MDAxZSz6kTHNaXN2ktFcdTAwMTPIunXDbKkzvXXFXCJIp/UyIFWZMlxiYliM6EuCbEc/1TnYSUz7Ypt3IXVcdTAwMGKNSVx1MDAwNo1cdTAwMWVagPuY8KTqiIOj9k72XHUwMDEzSFx1MDAxZiRcdTAwMGIuXHUwMDFjKe4jkbGjXG5qmyzob56Hj9KxdLfiXHUwMDA3xY/hb9VmXHUwMDFm6LyyVcq2olwibZA8o4PUb+jcVI7jsE28XGLQSMBgTsBxkFx1MDAwNkzBoldcdTAwMDNcdTAwMDUuVnOujN5vZS9XJ11zdqtcdTAwMWNoZ7B4uH/qP39b/9N3snNcdTAwMDJcdTAwMDe8TJVTiNxcdTAwMDFcdTAwMWVcdTAwMTDKe1qQIFx1MDAwZmpcbmA/asZGZk6AT3HqZvq7MzCMyNx79Vx1MDAxZsZ1XHUwMDE4yytVXCL+aIOmmErMYr8h/ludXHUwMDEzof1cdTAwMTJ9V1rVVFx1MDAxMn3gqzVM4qX33Fx1MDAxYrxuXHUwMDA2Qlx1MDAwM55cdTAwMTSBi7Y2vVwitpVnXHUwMDE5Tp07RFtBSyBLwmf9XHUwMDAyPYPEXHUwMDEzZ4ZcdTAwMDHj8F0jNu/AvsGL5386kVx1MDAxOV5cXHwj+zGW1/mTWVwihrypdzY3+p80XHUwMDAyTpv7XZgvblx1MDAwYoVcdTAwMThtq2ay1Y1+XHUwMDA1n3doXCKLv3b2IFx1MDAxOdqUfWyktP6mM27vf/2cyLHGXG5AL+C/PPhBUopcdTAwMWNcdTAwMTFvvG/oXHUwMDAx1ZEyOVx1MDAxMsb3+cHfgfS+KvzaLqQzpf6fQkAoL3xcdTAwMDRcdTAwMTdcdTAwMWXUfXCBYenhKVxcgaXV2HPTvmlqb6LpdG66w1x1MDAxZs5cdTAwMWK7329HXHUwMDBlVCHs7miD2jJFo4tG0WnnXHUwMDEyYlx1MDAxYvdcdTAwMWEpVXusSMHVR81BXHUwMDAy2Vx1MDAxYycpkOLO66NcdTAwMTclKlx1MDAxZC6qUFwia1x1MDAxZGS+dm9k9e2ppKhcdTAwMGIrZ/rXLm3xUb3P0dKjz467XHUwMDFiekBZVnpcdTAwMGL0XHUwMDFkXHUwMDA37Zj5M3lII6bYXHUwMDAyXHUwMDFj5D2hNPzbv1x1MDAxY1e1sPLa6oTBxJv/NeF4KCeJXFzEt0Dyv/vRXHUwMDFh3dM+skdTbaC/7LEoKeChMI+mdVx1MDAxNmuvrtdcdTAwMTWas4/FXHUwMDA2t1GikOF5PX6Cx5fXzHdIvLjj2Vx1MDAxNcZBXGZU/pVcdJ1cdTAwMWaH/IPTNiGKdlx1MDAxZknNXHUwMDE0fth3XHLwbd+1NWedsrFrv9GT2vONxnJ9n3Nh0OF3tbDlXHUwMDEx5NdcdTAwMDVsvXHgiPtYWvxWk5+bIPucrpvoXHUwMDAzwoFcdFx1MDAxY5dcdTAwMTDfgVx1MDAwM2HyXHUwMDAyvlxioVx1MDAwMSbCYy3fd79cdTAwMDA+ljg6v1x1MDAxYpeg5K7yXHUwMDAzz46m3Np036iJ+N0r2Y7kXG7w+1x1MDAxZvSVck/b5vGHfijW96JcdTAwMTKnfFfBdVx1MDAxY0SteUjxtlx1MDAxOHBgKWd3yetcdTAwMDekhHLV9Fx1MDAwMXpcdTAwMTlQzf1nsp2gKLBcIsE/c49b1kZjMq5rb8Sbh+uc2+C+XCKB0qGQXHUwMDEynDPL0EbeXHUwMDE0/XmjgjSHzMXBk4CdefhcdTAwMWGG9FLQiDSQL9uq6Vx1MDAwMFI+Klx1MDAxMFxu311cdTAwMTS4becrhGZZUa3SXHUwMDA3J9dcdTAwMTNcdTAwMTeqKlx1MDAwM1xy3ohrf4U18D321iqGu9n/XHTAMVx1MDAxMnJ53tfYNurwKNbXuWfx89DFQbsuxDpcdTAwMWSpsjxtdaXZrIVeXHUwMDA19YxcdTAwMDJTdcH7/vmnrinL1Fx1MDAxNffmuej7XHUwMDFjXHUwMDAw3lxuXHUwMDE3XHUwMDE132ew00YwMTP1KuR1T3j58n4/meZTVdYgh+ooXHUwMDFmujxE2ue1QeNcdTAwMTOGr8vb9Vx0Nod3YKzFXHUwMDA3+uvXZGxNr1kouS69XHUwMDAxaPez+NJh1/rlXHUwMDE5+HDn3+jLiCfnfPwjaemQPE5x+tnlnnfbTiu6s/ZE/Ot8XHUwMDA3r9zmy8Q1VUdcdTAwMWTnimLUaXLyZtqOn+JQhldk7l9r7lx1MDAwZvHDf3lYfU0p4CXej2VF8fu54DcgTiC8RFx1MDAwNzHeXHUwMDAxqO0x5CBcdTAwMWWUJlPMVE7fkopjrarcntYx6ietr1Nwl1x1MDAxNeeOXHUwMDEzWySC0yubXHUwMDBlaqrNT5Mz8dDrnsov0IlIXHUwMDE0xJ9cdTAwMGbjX6xFNPc2vlfQXHUwMDEzXHUwMDA1mjDJi0pWWU7WnZskVYGwmNhpMFx1MDAxYrnrQaKRcKL7e+KhLHvWf2q6iaXkaUlrcOt4bJK9WeT9oq1vfmNMhU7DqF6v0OydwCU5XcRIMUR4y51cdTAwMTdcdTAwMWV3jP1J1lx1MDAwMKGxVkL5tVwiXHUwMDAxyb267dRUkXrJz1x1MDAwYr+Tm2tHleVcbt10XHUwMDE3XG4tXCLsSFx1MDAwYk/TRf7XclZa6z19I/7HikX/3Sw5ff3eXielc6djzG5cdTAwMGUontNcdTAwMTYueyFqQHr6eZH+1tVU41WOJKbDt59EPIrnWHz2V0/1eK+PXHUwMDE0fkqexEbKSVx1MDAxNzYlt1x1MDAxZFx1MDAwNMnXzeBCijZ0h1x1MDAwMWeP3fiBfVCEXHUwMDFlSJlcdTAwMDCFvDE5/c0vXFwm2PhnzPrReSj0XGZB0i0/3e9j6lx1MDAwYqZardGZZiMtOVxyLytKZUCgWFx1MDAxZvlvjvwsT4y5rWqcPWJcdTAwMWGkMFx1MDAxNotLLVxm6yctXHUwMDFi93nZtVx1MDAwNFFcdTAwMWF/slx1MDAxMyOMQJtp7Wfdbd9HcfxcdFx1MDAxOPky5SMyWlxcf8qQ7MDYsOGsclx1MDAxOJHGwDhcdTAwMGJS5MV2zaNavuyRr5zu7apcdTAwMTAqK2BUXHUwMDFjw/bMPkltW8mnJkg3y1x1MDAxYfes9PPlXHIzUlx1MDAwMl5R04FcdTAwMTHhxYw1XG6Uop2OQ1x1MDAxZvZjrIOpxeW611wiXHUwMDE1XZ5cdTAwMTabXHUwMDEyo5pYgVx1MDAwN7aY2Y05TKivXHUwMDFkXHUwMDEw5GK2i/V3Z/6OT/loq1x1MDAxYmE7+q3TnfBv6tDUrXebkliZvX/HgZ6GyJR8cqnH+0xAaq34UshrdzsuXHUwMDEwymuTIeTfNYSW+mZpyXrH0JScbls4juuS+K09XHUwMDAzclhcdTAwMWRBXHUwMDE1as+dKcFcdTAwMDSvSF3Vut6QXCI+X838XHUwMDE077cnr3213Fx1MDAxY3rpRClQxG46XbSvw1x1MDAwNlx1MDAxOERcdTAwMWWqNERcdTAwMDXJNKRihNCb1C9KXHSpkmBW/t/f3lrh09ezXCKIgc6+ht95cStcdTAwMTSxUGKJUIDoQ1h+Ln9oKE2DM07FWqW4RGF8XHUwMDEwZvxKf9+fx+3TVVxcjUVvVnNngvoqkDHAx1x1MDAxMTYnKjY/wnpccllcdTAwMDFcdTAwMTD7siQnIVkkXYTw+HtcdTAwMDG11lx1MDAxNlx1MDAwMiuExFx1MDAxMv7XXHUwMDBiMbxvwdE6kv57vlx1MDAwN0RDjNLoI7dcdTAwMDEtiuiP+1jii1x1MDAwNlx1MDAwN+DTw1xcWDeqyZNFXHUwMDA0IVCJf9/NxmH8UuBgXHUwMDFhV583rFx1MDAwM1x1MDAxYlx1MDAxM8xcdTAwMDDe6f1kL4qLx8f3b455P1x1MDAwNlah7Ehzcj7OXCLLkr2zgvT2XHUwMDEyNHqN/ee/NVx1MDAxNVXYubnhclxyapjCN1xcQuCD6FJaV9W32emir+aknFD7tVx1MDAxMmm3XHUwMDA0qneqXHUwMDFkN4/or1x1MDAxN9pI+kBW03Lczf3JzUNS7eCR4LZFdC5iXGI5OXWmSLaNxjCKazeQkXqlfdrJqodTplwi5t/1XHUwMDFl6myWrO8rzSHWYpCgWN+31d+tzp5+LaYyuTBi4YLckS+KZkeQ7/HVMXyUbVx1MDAxZerfn+v1TG7JpadcIurPTItCXHUwMDA3XHUwMDExXHUwMDAzRNJIKl91tqvBtl07alx1MDAwNFRGXGJWT+ZccnVcdTAwMTP5k2OVI1x1MDAxY2u3tJzh/V9tqfm0oau91L+bKnpcZv/CYVx0/1x1MDAxZYrDwCVm03yHXHUwMDFjXHUwMDAw7iR/YT28XHUwMDAwdJIoPF1cdTAwMDfcd/VdXHUwMDAwk0577lwi1nqPUVRt84exIFxyUI08pP6MaUO2XHUwMDBiuutqwCrRWpIv05hcdTAwMWX9ria+OsTtXHUwMDAxdPeiX1xc828tsY8sJYrDfNWor1x1MDAwZal22lx1MDAxNtQvRFxyJ/+16VxmtE8/MpLghfzduof0Oop+JVx1MDAxYsk4XHUwMDBmVOBVOXTM2cVcdTAwMGI5y1x1MDAwNKwwnlx1MDAxOO+PYlV2VnxcdTAwMDJhL/qwUrLgmFx1MDAwNC2KR3/8Xlx1MDAxM5BkRT9cdTAwMWPSVsFcdTAwMWYkrEO2e77OM6e8Uu//q5HDWM7peHySaVIoXHUwMDE5YKNcdTAwMTaOdjat11BJteWmXHUwMDA2KVx1MDAwNX81XHUwMDExlqNHgaai1+eW4F1cdTAwMTFy8jCt/E6/+oxCyWcsapSGqChX0YODV1x1MDAwZn56SFx1MDAxMqQvQpn52pwljbRvar5PSdDNXHQyXHUwMDAxXHUwMDFlrlx1MDAxMomucr1cdTAwMTL2tUT8r571+0K4hEHlaJtCO4v3VqJb5Fx1MDAxYorbsNKbjlx1MDAwNcKG/M1nTENMNOlcdTAwMWVubLP8ZTuCLZ/yZiztdHhZtu2rj4Jo41x1MDAxZm9+I1x1MDAxNzmUXHUwMDEy/m3XhCSpOVxu6Da8XHUwMDBlsHmxkTFXJFxyXHUwMDA2YtuGV6/Kz//lXHUwMDE0S2VmNqhMXHUwMDExMbxeTeFcdTAwMTFcYnVgOVx1MDAwNnxPgaNcdTAwMTVvIYV2Vi4410XsZlx1MDAwNra/vtv9I6q3QsyD9Tdj0VWdllx1MDAwNX9PNXj4S//E79BuXHUwMDEw3PyIyr9+/5J7dmhEPlx1MDAxY1x1MDAwNWZ+8Vx1MDAwNZaARlx1MDAxNLu4OJvxf41VP7Zqe2y2wrqm9VhkXHUwMDBmdpdcdTAwMTZcdTAwMDFFJf2k0XMmxdNqJ3BcdTAwMDGbaH5mZK6hO0Y5XG6rZlx1MDAxMT9lso6UXHUwMDAxg9RWWVx1MDAwYq4yZFx1MDAxNf0jpYj4de1vXHUwMDAxXHUwMDFiV116zE/SX1K0vlx1MDAxNeUm+lx1MDAwMmRPt/CWXHUwMDE019VwN3kn8c20/1dnXFzkWMOesXYwnNyckT53idxcdTAwMTXGVzPWM1T8zc3urWpKXHUwMDE0prcnxlx1MDAwZVx1MDAxNbgrjVx1MDAxOdNcdTAwMDH5sOd/+qxY7CdcdTAwMTRWLFx1MDAwMqiDJ/Xn8bssnIglO9VcdTAwMTXBKFx1MDAxY1x1MDAxZqP971x1MDAxOSbQ6iCY0DrE3HWXXHUwMDFj+S6u+V39ein4t073a7xeXHJcdTAwMWXbsme9PjoxXHUwMDEyb/WDQHa/0idcdTAwMDdcdTAwMGY7XGJcdTAwMDf071x1MDAxM4KwaF7gd79JRe/nnalR/4N6p8kxXHUwMDE2X7dj6Vx1MDAwM/WP8sGvRiXFXHUwMDAwlW17pGSsbnGOrTMsRelMR+FokWbNW/WDdFx1MDAxMyfhYb2dhtSRK4JDYv7B/lx1MDAxNy8oX33IZHRLWNk9pz+OXHUwMDAxXFxP+afIv4MrXnan7IZcdTAwMTJrwVx1MDAwZkvHs1G1weuPy1xuVlxcOmd16Tq+XHUwMDAzXHUwMDA20MavXHUwMDFibeU72ytcdTAwMTS2O1xmXHUwMDBlllx1MDAxZlx1MDAxZVx1MDAxNntTXHUwMDFk0fuPsFY/p+Pzcd0o6/p4zL81tlxcW7KY6VLHKfKx42A3k3xcdTAwMTNcdTAwMDRcdTAwMGKgpLxag1x1MDAxMcPJhGupPn20Uvk7d9rHWuWyXHUwMDFkXHUwMDA2iSZQTKJT4lxuSFx1MDAxOIKP65MhXHUwMDEx3FRoXHUwMDAxblx1MDAxN9fr8PtjzulKOPJvsnidmidcdTAwMTPfz1x1MDAxNP9oJVxig5SIw7JyceafPjosg+JT9mCQiUpZXHUwMDA11jYkLlx1MDAxYkb7henMQdq4c6dVSI5cdTAwMDDSzbU5uYfQWDHIg8EusWtcdTAwMWUtmP/Wz35fmcd88kLymIjOJKdMrdNh2Iq1vHZhjMBUMnP6/mhpnIh9YzpsXHUwMDEzeZEwdc2CvswktTOo3DDjx6d4NtZMSd9Pd//vXHUwMDEw/pf3UMuGUpljcie5Oolk/nq1NcQ4lUi0iVJm5Jb9wFx1MDAxNGfl51x1MDAxYkiIonS2XHUwMDEyx1x1MDAxNMlGj9XH70WXP4xi84L3355cdTAwMTj/30tJZYdtO/08XHUwMDFitYN+h+RcdTAwMTF+s6L9cmHfgP0lP68rXG6PK34mqkexca7Cs/zuXHUwMDAy5Y//nYT/vd7Ta1x0XHUwMDFiJrU6hrzmquhcdTAwMDZXLVxcKJjktZOXa4JcdTAwMWJMXHUwMDEx3pTl7mT+XHUwMDEwkZu4ue10wic0KHv9h01etmjK79xvSeb+K0Z/MWufulx1MDAxYYU4XHRSLn8jz9C6XHUwMDBiSdAjr5J+i6qtMv7AXCJ7XHUwMDAxc8i4lVx1MDAwM0l900/DqbtX95prOtX4P/0yXHUwMDE4kmFcdTAwMWWOmzZcdTAwMTRcdTAwMDFcZmn6t9afXHUwMDE2f6zX2ugr8U25+LnypsXFXHUwMDAwOXIh+Vx1MDAxMGDQcHunvoSzXHUwMDEyeYPDNGdcdTAwMTVgqFx1MDAwNTx+/eDll1xcaa/MmPBPb5nX0o6cXHUwMDFhtS9bXHUwMDEzXHUwMDFizy+gmrwmqPaDwzv/26vqe1x1MDAxOZZcYs3OXHUwMDFhRVx1MDAwMbVHMVx1MDAwNptNXGJ+XHUwMDFmq1x1MDAwYpItLCGboNCVNGpMXHUwMDAz3nG5yc6lzoHZvkHIWu6/NZl5iSffa/Z9XHUwMDFhvSCoTbuoYZXwmUTzavupo5uZrqeOn6D833X2WJnNXHUwMDA309a557JZXHKhzY7Henp3U8aZqSRcdTAwMTOnXHUwMDAywVx1MDAxOFx1MDAwNE3AfNA4k8xH7cnuICGQf2tATIbFyLVcdTAwMWFkYsb2XHUwMDBmvd5/y1HBmSEk5iyKSGCQLbbuhrVcdTAwMTMl+zFG+Z8xn9dFKX1cbqxcYs+VTk6sToqNYMRcdTAwMDGco1x1MDAwNfg685vXS2KR4Fx1MDAxN1VxcUFzXHUwMDA0grVBns3jPnrpr1xy4V9MJJDF806nXHUwMDAyXzHuffhcdTAwMTUrXHUwMDA1+VxyXHUwMDA3XHUwMDBmyVTFvMGUP2xcdTAwMTNBg92MhNnjMbVcdTAwMGZcYlx1MDAxMCa/K1vVMDu1f2v7vqrrKIpcdTAwMTW7ipK+XHUwMDBllaQ+XHUwMDExWvVFsFx1MDAwZeIgqFx1MDAwMZ1hyLexXHUwMDExWrJhtJ9TWFx1MDAxN11cdTAwMGLVNepKoP+cQ4lnvbaCb1x1MDAxMYfJXHUwMDFjdVfaKNRPzf1cdTAwMWNcdTAwMTlaNFx1MDAwMjBcdTAwMTfQpFx1MDAwNPwzpVx1MDAxN++IgjWXJ1iJXVx1MDAxMEqe9V+dnFv5016GqlNpXHUwMDAww6EpxkhcdTAwMDRcdTAwMTBpej7CiJKHLIbD96FcYoNAtlx1MDAwNbhcdTAwMWVny3rXWnShXHUwMDEwx79+mIyVnFbberbsXHUwMDBl1ZnlXGJxUKhxXHUwMDFjq2xcdTAwMTA2wUPU91iMh6Ld4NqYb9dcdTAwMDf5u8X9XHUwMDAxriFcdTAwMTmh71X+tz6Y8ME/81x1MDAwMkiB+FPsyK3/qbtGXHUwMDAyiFx1MDAwN+WHNJ7k5M5ZpPo/wXSTWEToXHUwMDFliKzSXcus0Fx1MDAwMHZFwYx//tmQeGslZ3VtlITAgos2QIOwSyleLlx1MDAwNjY00kNR1JWnVvTAjvTvm1x1MDAwZqAg3pc8XHUwMDE3n2/Vb0fdYNm/tcJcZqtlwOBqXHUwMDA2XHUwMDEw3+RcdMLjQKiibVx1MDAwN16wQ15iVnafjWBcbq+rMfudVkMtlWaNcCCm9M/6XHUwMDFj8H/6Vc6fiE263Fx1MDAxM6P0Wv84aO/dXHUwMDE2N1x1MDAxNnrZiFx1MDAxMaN7dNzRmVx1MDAwMFx1MDAwZiHE91CjRcfJfWTlOIDEku+Hiv/Ta4Eh2E+lspq+/jJTxs1cdTAwMWF/XHQxh+OtXHUwMDFhXHUwMDFmXHUwMDE427FcXNKI2CnW0kBgviiE819cdTAwMWazvz51SVx1MDAxMOZcdTAwMDRXelSPQU84izh+njlcdTAwMWRfQ3iQXG6SJGA7orR3nGG2K1P5+ndcdTAwMTXJ1X+KXHUwMDE0N1x1MDAxZVtcbr60SnWnmD75nWOeNl1cdTAwMTR9iT/dXGJcdTAwMWQgvVhcdTAwMWbjnP9y/4+q81iQXHUwMDE0XHS27Fx1MDAwN7FAq2UgXHUwMDAyrTU7NFx1MDAwNFqLr1x1MDAxZrK738y82mRtMlx1MDAwM1x1MDAwMrNr5zruZjrMsE/n+/jZ18Rcbs6tXHUwMDE3bKBanVxc/Y9+Vpj4W6/ZlK9cXG/WvKKDx13ZpsXC32Mus1BTZN920DpcdFXjLLkruFx1MDAxYT/+24vxkzPsObFljlx1MDAwMcYvok3H/WNcdTAwMWY4Stq1aWe/JmqxgpKYum5cdTAwMWHkzlx0661cdTAwMDXO41x1MDAxNPlcdTAwMTmEpn3/p15cdJY6W1SF4a9cdTAwMTe6MkvFQFx1MDAxMUux/fzgo1x0XHUwMDAx10iGdVx1MDAxM8DHc1HwSk/CLOFcdTAwMGJJsfI9PlxuYc//zjL+a31Pmy1pZU1oUy9wkFx1MDAwMudmfaMpnYhBXHUwMDA0k1HphrpcdTAwMTBEi75CmEb35Zs8jK2p9uJ/Z3xpK79phaEtUebcXHUwMDA0IMtfXHRUPtLf2cRaXFxKXHUwMDAyRr2XkXu4j0Hqo1x1MDAwM8eLvFPvOZ2WxutEnv9TgE+Bf8tj/43saj1Sldr3IUYyKqD+mlx1MDAwZuQknGzn5ImTuFx1MDAxMf2k5GfMXHKAypuy17tcdTAwMWLEnWDRzZkt/qeFqa1b8ZVIb1xiXHUwMDA11LrMyZ1cdTAwMGbxgvOszsurmubYzpePeFxcwHBcdTAwMTDgXHUwMDEzVjSNt32efEpcdTAwMGIzbz9ROObQ/5n9wLM5nzW+TTBtMeBcdTAwMTeVXGZybMqfKZNcdTAwMWWC7jFcdTAwMGbVjYFcdTAwMDRcdTAwMWZcdTAwMDB8Zd6GcvRcdTAwMTZcdTAwMWOTWb6vI1gn7Fe/VUHyZeXTgohTjC66lLmGivTThFx1MDAxOcmSMHbiYlx1MDAwMM9rXHUwMDFjO5RtdXlkmbYgXHUwMDA3XHUwMDE5XHUwMDBiVNE/90E0RTV4jrdcdTAwMDbgbrrMPVx1MDAxZFx1MDAxMG3Akjzgiv43XHUwMDAwbidP8Vx1MDAwMcqHs1x1MDAxZZSmXHUwMDAxO/ApsPFcdTAwMTVhvaquR+X/mp5b0CdcYiPWXHUwMDFipy8sZ68pXUnFQC5cYqdFLpuLlHFr6Vxy2Vx1MDAxMzM59dFH4+La6WNx6p1Ha/j8q2NcdTAwMWPK6Db6c5BNfY1GPOCFnajtXGKlim2lQlx1MDAxOFx1MDAxMVx1MDAxMFfxRN7/xkJcdTAwMWJcItKRXHUwMDE3MvlqtWXbdFFg/8PETbt9hFx1MDAwMHA8TWk7uVxcxesgvY9cdTAwMDdUxszNgD8myEjsXHSygVZUX4y5RY7MXHUwMDFm5I+w+/W/2krxvlj1dDhS2rk+0J2LPlx1MDAxY/ekXHUwMDAxpMBMeHgkX/TJ9KnfmnRpZSjNVSDGT1x1MDAwYvttvftQRd5cdTAwMWH+7of2ys842efrXHUwMDA3XHUwMDE3XHUwMDFhwl5RdjRxObg2T2sg/kqTyndfdeZcdTAwMDNDYiXH/65TSPS4XHUwMDE1af/NXHUwMDBlaFwi5qtcdTAwMTh+rIF7vGaDXGbTh1x1MDAxMFx1MDAwNri7nmf4U3dOXG5WXHUwMDEz7Vx1MDAxOfO5ddpeddR1XHUwMDE2UvFcdTAwMDSnc1XthUzmL3fF02nfR1x1MDAxNdXip7/9XHUwMDEw/WF04Vx1MDAxYoSJ1vyJU3pfLDvhVtTXoos4PlwibIdcYjuDiMP8ObxcdTAwMTdJ/zWfvL2KS1tB0KE0RDekMF3oofZcdTAwMTi1lJ+6ivNNhzh3ZubIo3pO187SqsyGXHUwMDFi+NNcdTAwMTT/znD5Zixr1W9ST+YyoaVxst1VI79+uW8/YiuPQX3ytzl7elx1MDAxZDzWXHUwMDA1iFx1MDAxOOGaXHQx/41FQ5iRmSjXRFx1MDAwMWPCZbOhwl9SLk+L/tYox/Kw49Kz+1x1MDAxNMdZXHUwMDE05PkoWzi6YyrAXHUwMDAyhvxcdTAwMWJcdTAwMTJcbvupmthcbqLsqqyBbMFDtFx1MDAxYlx1MDAxOO5cdTAwMTHGm1x1MDAxZFx1MDAxMlx1MDAwNGGboib1ILnMXVx1MDAwMKhcdTAwMTFuMSbbk+reqrj9U0M+f+9cdTAwMWTzj9OuXHTT04nTgVxiXHUwMDBlvtlcdTAwMDHNXHUwMDE5547vJd+kRGxijVRcdTAwMDZ3UuAhiU6K5HpyVVx1MDAwMvpqkrZj7D/cXHUwMDEzadpOP+AoO85cZlx1MDAxNsZvIcMrSnJcdI3eWj1ccprZnNfLilx1MDAwNN5bXHUwMDEzMSb2ktY1Oo+98X/5PuXtXHUwMDBmkV/1r1x0q5lO7EhcdTAwMTXjw3h1XCLKzzx0UELk479D3/JcdTAwMTOJ1Vx1MDAwNj2uyURcdTAwMDLapo8gUuY/XHUwMDEyOLTsvp3MXHUwMDE4WY+VP/vq7lx1MDAxOVKfx9BcdTAwMDPjXHUwMDAy0NlcdTAwMGZcdTAwMTDwkP/F1ZehXHUwMDFm8fP/+rbUjMc3UVxmXHUwMDE2M1x1MDAwMFnasZ572j1cdTAwMTbEU2l+TdNlij+xSH9X6uxuaTWdoyq35qbZ38xxz8h4mmnJ+YhWJj3aY1x1MDAxY+h5u1x1MDAxOYqCJlwiKrZbf543XHUwMDBlXGKEnlxmNi34lKpcdTAwMTO8bVuc8jk3t5pcdTAwMTOK/9NcdTAwMDfmxyhcdTAwMGXBaWRcdTAwMWP9XHUwMDE2XHUwMDE4VLuRXHUwMDE2945bXHUwMDAxPktcdTAwMGJcXEgskKzoKbFbbyziI4hcdTAwMWaafeU4Lz/IdeLon9bCXGb1QpfddpzgXHUwMDBih0ZcdTAwMDMnle16XG70bPeb5VEzoPxcdTAwMDFcdTAwMDJr+UWI3pZJ0DX7+1x1MDAxMUCq8lu3XHUwMDEzydj4OUhd6y+vKFx1MDAwNkdhp1x1MDAxNVwiYFx1MDAwM42b8oJcXFx1MDAwZpna7u61eTKhfnbEfVx1MDAxOUgmXHUwMDFjq4Qu7cdBP3dtXHUwMDFjNHJcdLlO6bNxXHUwMDBi8yvlw/6GNXqQ0oSgvJeU0mt8fSYkqlxyXHUwMDFkn7RcdTAwMTBcZujfnnF61Y0pXHUwMDFlVy/GjEZYlrf206ec6FTWXHUwMDE0SlXxx5j4m99Dgfu63sBcZj+AWFx1MDAwNzAj2Fx0u+zN99z1qaqDI4xm+seeKGdhMN/xwdQjXdiO3+THKcWaysdcdTAwMWbA7krgoZTfgHetWKv+/Vx1MDAxNaNZ3JWX7JT2Oi3GO8aMtYCioS3O+1vrZCftZGUnW1x1MDAxNzxcdTAwMWI+V57hJb+JoLKWNeUqZmB3XHUwMDE3Ucu668Gksar163o7XHUwMDE1/nQ8zqxTdifWi2OO9kHw2bG8Mb9cYsD+KvXq3s+RZKuBqFx0XHUwMDA1SaFSOKossa9JcHb5xXarjnnYSX5cIpxcIl3sXHUwMDBiXHUwMDA1PEpRu/Df7/39XG7gV3F4mW/cT7eMnoPw7UiyrFCfY3CZP2vNPUzDYSVcdTAwMDVaXGbTfzGUXGa80PW4VtTRdTXxMFZvKXy9bpbui1x1MDAxYs6JflPR33yVXHUwMDE1VfdcXMNL3ThcdTAwMTPRPKFcdLh9q5pdfp5cbstg8TzGsU9lf0YukoKvrKT1T8CGs1x1MDAwMfeJl1x1MDAwNl6UPCdcdTAwMGb8tFb4XHUwMDEwLNT2079R8NfRslx1MDAwMsCbXHUwMDFmklhWJZuZMFX/aPY8XHUwMDBlnzFcdTAwMTB8ZKrdPmj1Z/L9jlxi+IuHav6VXHUwMDBi4IezN1x1MDAwN7S8YGpcdTAwMWGfhH6XmZegXFxcZsu3XHUwMDExXGK4W1x00F35JVmHL6zxR2xkMbxA61x1MDAxNynM+dpUO+NZn7slf1x1MDAwMrraXHUwMDEwtunst1xuXHUwMDFkxZxcdFx1MDAxN43/4iFVXHUwMDE2VKBeZYNcdTAwMTTq2Cn/zZngXHSSXZyQLOdk8ftAf/kv0c2LkLCIipyGlW+cUz10b2htg09D7tu2XGJ/Y17/1nB0z27N8Vx1MDAxNcGcKlx1MDAwNf6iUlx1MDAxOTNFXCJM8yb23cJbrD5zydThLVxmXHUwMDFjXHUwMDEzrysl43y0MnJcdTAwMWQuvrf4LU4kISVs4DJR3fFcdTAwMWT8JoBDxp37pcM4L4aSTXzQnVx1MDAxM6ektlxiXlx1MDAxMCEurtxhofFEiMdcdTAwMDe+8b5qtIfUVjovuvN6oXQyTzN2bVxm3lNhXHUwMDA0XHUwMDA3VNRcdTAwMWOpkOy//ZlpyyXij5h/db/Y/Fx1MDAxMVE65SHmTDq2h0xYXFxPgqRSXHUwMDE4oE+biXaORP3pIN3kgblcdTAwMWYpOX/zXHUwMDBl1lx1MDAxYVx1MDAxNddZsrCqgl6QtpDlf1lLq9w0lP/i4i2EMqCtbpO5+VTW0Vx1MDAxZTcqUEejRIHJXHUwMDE2bOGKXHUwMDE1532jaqlcdTAwMWV31KhxM+4ws/Gz5XFf/V64XHUwMDBiZ1x1MDAxYyRktUzDnq739Tg1XHUwMDFimXoqXHUwMDEzvjSVxlx1MDAxN3l9Yp3vRO42KqSrQGRqMVx1MDAxY1x1MDAxN3W7XHUwMDFhs8SCKULugfNcdTAwMGXY5IiJI4fzNqs5JVx0TXyy6Fx1MDAxMzCvnFx1MDAxZqdcdTAwMGZcdTAwMWVbw++t+V8jXHL3Ja94XHUwMDE0dNZcdTAwMTOhwWTShu91k69cdTAwMTBcdTAwMDTMXHLKlyMzO5el2YNcdTAwMTfZM3NIu1x1MDAwMCBcdTAwMWNEIMpDlrRFO0dcbi2JYfPwV1NRnqp8yjB4XHUwMDAxP+n1wK/MXHUwMDBmr928XHUwMDFhd3zIz1xmdzyAaFx1MDAxYudS4FVJXCLD6f1ajPDp0WNcdTAwMTag8IE+SCdcdTAwMDXiybprXHUwMDFkPysn166x665cdTAwMDWhapBcdTAwMDQl6Fx1MDAxM4d6u0hcdTAwMTR8J2dcYjHf+3bkXFxcdTAwMWVBmlX3ct5+oKRcdTAwMDRkI6Rt+OBQXHUwMDE4h2/sVFWkR4pcXNQki3Tg3D9I19RcdTAwMTb7O4vXzFx1MDAxOFx1MDAxNnyM96vIyrTXK5lUXHUwMDA3VfSBLOT5S5EvXHUwMDFk3CCdaOqgbFwiWMu6YjeBVU+DXHUwMDE1j9Jcblx1MDAwNvuualxcodpdpcWeRPP/m9fjf3xcdTAwMDStXHUwMDFm02CVvGzuyEmxR8TuWbZcXFxcg/zQ6VogXHUwMDAypbhEXGbwvTD0OOQoJVx1MDAxNV/aOlx0YJLPXHUwMDAw/81cYlx1MDAxOGnCXHI5oeP5YVFcdTAwMWXcQEBcdTAwMGJcdTAwMDRDXGbb5X/OXHUwMDE5lKSFnjXCsFx1MDAxNLClbreulfIzO7eoyPtbeVxcXHUwMDE1kq9cIuA0q4SrPIH25fWe9YJoOsfGNYtcdTAwMDeMeHKWe9tnXHUwMDE2XHUwMDFlsqvtUrDbtED7i8VcdTAwMGZuZ4/i0NXvs1x1MDAxYTVkaL/Uhktd8nGOl++mykI14v/my1x0f6u/3lx1MDAxYnqP/4uFvzPuK/HIvlm2XHUwMDE0XCJYZNdrrOfIXHUwMDA2+CVcdTAwMDBwLubDxMmNdSZEs1x1MDAxY1x1MDAxOGtcdTAwMDPhsHXOTjVPNnRcZp43zO6+XFxcdTAwMDcv9FFcdTAwMDRhV2PuXHUwMDEz3C9cdTAwMWODwFx1MDAwNLft15vfXHUwMDFmj4w0e3LN3IeRT+fRpN6DctHOXCK1xNGdQ1x1MDAwMVx1MDAxZO9cdTAwMTaOz8L5qWmJUm73N5NcXKBsXHUwMDA2jdSgXHUwMDFmZYONXHUwMDFi0vRyJrVRgVaM38uH746oaMKBXHUwMDBl1fvmXHUwMDBiYOqxXHUwMDE0XHUwMDEzXHL4K79cdTAwMTd5Y53OJ3/rpZP1i1x1MDAwNPeL531cdTAwMDfTkTL1cZuyj/qFs5Fd/HqFPdlU36dcdTAwMTd0Y4HkQ5KPhlx1MDAwNXf6Y5P6pS9b1OqCoZy/kWGHmWRhN/xN+T4yoIpscYit23VgZOeNuJKDfvi0xUxcdTAwMTl5hJrfSFx1MDAxYata1Fxm/1x0fI6mtNqTt3JcdTAwMDbBPYO20TXkOIU/9lx1MDAxYshMitN6RcUwtn6OdU48wYNcdTAwMGIuSYFiXHUwMDE5Ydn9XHUwMDFkzqHklyuE5XeofulcdFS/Sz8ho6SVlpaDYJVd8pt5R0NRifrnXHUwMDBmZMeslJG80lx1MDAxZsPf+6JcdTAwMTB/s7hcdTAwMDZ825HvfNhxb0o28sXNrS6O56GgkyWhbNeam1Soxngp9Vx1MDAwNW3cXHUwMDFk2WLVRTXkMexcdTAwMWPcx8SwLXZcdTAwMDGAl1x1MDAxYSpdWVx1MDAxNUZrxFx1MDAxZEIu+Wif31x1MDAwMFx1MDAwM/V9yDY4klx1MDAwM8FfwEZPyFx1MDAxN1x1MDAxYlx1MDAxYWqdKc9AXCJ7OF5cdTAwMTOQfflcdTAwMTBcdTAwMTmOgVxum1x1MDAxYjqPx4WIzlx1MDAxYqixOzLj6uBpk0/zLoaNWNpGMJkymfq+WXxhnEKH4pPljzcnx7BmQH9cdTAwMTEre/IhJ9IyXFzXuI9BYne9qvyO01x1MDAwMsqDjb7ESCo2S1nxr7fgl4bgXHUwMDFhgzxcImZcdTAwMGK3ZPPpO0UnkYRwbcRcdTAwMDNFvyhcdTAwMTZcdTAwMTD4XHUwMDAzh0p+XHUwMDAzUJVTXHUwMDEyQlx1MDAxMcIkvr5eRtuxXGaQUVx1MDAwYm1cdTAwMDT+2amfaFx1MDAxZZZcdTAwMWZp5O/bXHUwMDAz2Fxu3v4u+M/C3dRcdTAwMDJvLSmIRdefuEF0x3tcdTAwMTHilUIoc02bfiMzW/lcdTAwMTmBXHRV/O8wS1x1MDAxYsJcdTAwMTn218lcdTAwMWSLLpj1I/H6bzr4J+rcbfXwXHUwMDAxOTvhcyH5mHL+NWiFhHRcdTAwMWUl/zCETm3za8lWPbpcdTAwMTfy+3GM4rdcdTAwMTdrTnDmbFT282L/cHDYXGLWsjBcdTAwMWRzYdAhTDhgyTTEokmLiqFcXFxywEfQ4kVrJT5DQjA3Jb/7XG7jxZ5Hhlx1MDAwM57HXHUwMDE5lyDSqy53nkBkpNueXHUwMDAyRlx1MDAxMFx1MDAxMLs+oVx0LCspXpmDmD9cdTAwMWOzJ9EpLlx1MDAwNdZcdTAwMTOir/K/+1x1MDAxMj62t/qhoHxcdTAwMDNcdTAwMWNUwEJ/XHUwMDE24lx1MDAxOKVbxYr+49BCXHSGTt1cdTAwMTLAZCXkjILj9veW6lFSPTxWVVx1MDAxYyWUXHUwMDAwwsBnaIy2hyq3yLMwr7/9w4+ALC/xhM/fwUi65rJgsb5FqHlmWCNpyruj1IFcdTAwMWWZo3mNfXZ0Nye6f+JMVUroe1x1MDAwN3GFXHUwMDBiULqma9lJf3VPSJ54Klx1MDAwNVx1MDAxOUlcZnWNxrg9yXX+ZVx1MDAxN+JgYElcdTAwMTbPK+1cYnhlhol7XHUwMDEzXFyM5XyaIXHiOc9cdTAwMTRcdTAwMTXP8HpcdTAwMDV90t1jXHRfdlxui/zrV1/WhOw9kZ4+XHUwMDFhijdcdTAwMWGJtEaNUepGupljtbR7RdRU2fmhnczlwq2cXGJUjuNXZG1Y7NxcdTAwMTGwq1xyXHUwMDA28FtaLZe4z6dcdTAwMDP7+Fx1MDAwMFi2lvRcdTAwMTXdZo1rraLgnEH34NK836lNXCJWXHUwMDFiJi19JKs9R7CX1E2BaypFvl781UNcdTAwMTBReoZcdTAwMDGMvWTMr1x1MDAxMZpMfayiXG5mXHUwMDExKFwiQex+ye2KhPBcdTAwMTigSsb/WVx1MDAxYnZZJuxfSlx1MDAwZu1BMJHkx1witDT50qxZqvFMdlx1MDAwZv9+JeOSXHUwMDE5XHUwMDAy0sWJbJkqWVx1MDAxYVwi5Lv3KVx1MDAxNl17bGKPZMJw9mRcdTAwMTZZhdniJ7noSLxmYt2Qs1x1MDAxNLifLOo61pL6zViE1j7MMlx1MDAxM+CKppi6e94wa1vF3ELYXFzxfONJ7KaeXHUwMDFjsvuQgpdmk3k9J2xh7Fx1MDAwN6O1XCKUkYheoliVXHUwMDFj9Fx1MDAxZNeNT663bIdsUel/PbTXN6/OpvDpXGJzgFx1MDAwNJWBskeX5F5cdTAwMWbjgphLWPXbscBcdTAwMWKH7Fs2k9dwhUGeYC+/fTRsn1wi9otKkZR5hs1cdTAwMTZcdTAwMTZSWD+byX4hvGXAXHUwMDE2q/ox0HVcdTAwMTSIXHUwMDAx2Vx1MDAxNKWk/CQwUXDm/LWClbFVQVx1MDAxNI5RfjtdQVx1MDAxZLaN4PGEXHJcdTAwMGaGfn5tJO5J6OBxXCLGMm9cZrStXHUwMDA0dMZXjeIx9Vx1MDAwM2JcdTAwMDf787Uy6EA5Sir8XHUwMDFluSxcdTAwMWKwcz9cdTAwMGVGxzvqf6N0lFOoKVwisvqFXHUwMDFmi1x1MDAxMpRcYqOBXHUwMDE5K0A30L+U5IDgnI7B4UGWXHUwMDBlIfuprUTi61x1MDAxY10nhZ4nXHUwMDA2cbKEJOjrXHUwMDFmxVx1MDAxZjrovqbGw2awn5f6zEWyqVx1MDAxZm5W5pQ9ZDFE8lx1MDAxOEna7blRn21k/ZbRXHUwMDFk+p70co3zNO1VTpA6Krg6XHT9vb/7euRcdTAwMWLFtVfbuf5WXHUwMDE3j1x1MDAwMeZcdTAwMWZkNb9cdTAwMDTWVZvqz+EmV9GGXHUwMDAz9JF0XGaydEz6W7ey3v+QXHUwMDE3M5T7K3nFumWpgb+oXHUwMDA35THwJGPwwIBYXHUwMDAxSDZZJUjHnFx1MDAwNeniXHUwMDEzPYiPKlxyJidz6WFiNlx1MDAwMvGCXHUwMDAyXHUwMDFl33sqP1x1MDAwMl17XHUwMDBmKtZcdCPQs1x1MDAxYc+stGzncrpwXGZFjttSiKBOXGI3eOpcXFEk3f7RXHUwMDEyKlVcdTAwMTLFgo5kKV9x0EhcdTAwMWbWplx1MDAwYst/Xlx1MDAxMpJvXHUwMDFjkXmY3lX4S5tcdTAwMWRqXHUwMDA2+ihcdTAwMGbRXHUwMDEzoj6D88fLZSN+wuh+XHR2TUuBtLD1v77OhXVjqSzIX6dkgWszX3vInkidqe03purCoYtcdTAwMDQ5XHUwMDE2S9zcXHUwMDFiXGY0yM7TrmPLMrGFhayJpIs+g+t+NemWXHUwMDAxQW1cdTAwMGXJx0DmiHBRyJdDL1x1MDAwZUks0D37mjFhxlaby53SXHUwMDAw6rD4qkdXieOdv4/Gj9RxXGZ4rZVcdE7miVuHXHUwMDAyapbkt2TnMknGXHUwMDA1XHUwMDE1/WZXhlx0b1x1MDAxZdnkfalcdTAwMGKhjEFcbpW1p+1vXHUwMDFkJvmo+Ge1i2czXHUwMDE3glx1MDAxZdBcdTAwMWZ06yjSPKffJjR0O1x1MDAwN1NcdTAwMWNcdTAwMWJ5oGHEXHUwMDBiJOI7TZ+QdO2zgI78JmRcdTAwMGVtNte9KN9cdTAwMDS3XHUwMDAwzFx1MDAxOJBcdTAwMGVXK35cdTAwMTBdtVRcdTAwMDEnK1SS7iCQXHUwMDAwXHUwMDEwXHUwMDBlMYRcbrGSRbawvk56WVx1MDAxZEieamXhJd1cdTAwMDF3g1x1MDAxZW/TXFxxLTRycHPTjMdcdTAwMTDSnflcdFx1MDAxOGHcy2PVXHUwMDE4XHUwMDE1MNz1X4iJ+3HP8STi9/dLgC2g81xmq1vfT1xmn25UYl6pXHUwMDBlXHUwMDA1+yDbUFx1MDAxMaB/rJC6XHUwMDA1NNhrtVx1MDAwMG+pU6B66mcyXHUwMDExwrFcbiXPXHUwMDFkUJYq+TAx70rlqkWxY1ZcdTAwMWNcdTAwMDf+TGT9tOOi6q0zJFx1MDAxZs5aU8yR5lx1MDAxZshcYrVXM76QhNm5YCdpPsNmVVm+16tZXHUwMDFi67Epd0lpXFxFXHUwMDBlXHUwMDFjOMorP25HOY+heiEpY3GHrpHl3OxyRson6mL59lx1MDAxYWZcdTAwMTjrnnp8wivV/vmNWotqu5KYoGFcdTAwMTdqmDrYX41AU9Yk6omAvWNRXHKbOkmE9tFZq4c8gX6y5czlTPuL/MlcdTAwMWKYgOu1fCViUIW4XHUwMDBmqGDhXHUwMDA0pNSSoa2MXHQjyaf1Ke5I4aGo0OOJXFzJkVx1MDAwNCZcXPNxXHUwMDFllrGaf7NcdTAwMDSr2TrkK8miXGKJyupcdTAwMDG1UVx1MDAwZZBuXHRcdTAwMTJU7U0gQpdxXHUwMDExIVx1MDAxZS77Tkz5wlqH6GytTlx1MDAxNXFcdTAwMGLr1jLP1L+cdeBNXFxqUlPWXGbHhChudlx1MDAxZn5ryKdkdW4jhyvTgFx1MDAxZbO6JXytUH+ko1x1MDAxNC7oXHUwMDA0XHUwMDA1wVfOnlx1MDAwMOZcdTAwMTRwSIF9wefVcFx1MDAxOVx1MDAxMutcdTAwMDFIhrbgVu4z2zcqqTLp2StA3V7BXHSrXHUwMDFm7vA2nVpIc1x1MDAwM0RAjDZcXOGu7XJcdTAwMTeCXHUwMDFkRDeV/SZcZtVJdndcdTAwMGZZ8kV1XHUwMDA0hUVcdTAwMDLjo2u0w5NcdTAwMDR1gTXUN5FcdTAwMTHgLjGttEvBXHUwMDA3neDQ8TWp9Vx1MDAwMXmizcPeJG8j6j5ApWwzh1CMuuw6a3r3XGLVbVx1MDAwNlZXi++mY0XbJN2jflYgMnHbdNe/vW5M7tyL1OIjV87W/LVcdTAwMDL4b6Vre7NhNNaZXHUwMDBlXHUwMDE3XHUwMDE496Pa3zM1wfbhderao9H+rq/vc8FcdTAwMDQyxyk61blcZiWBUdpgWJ/cx703XHUwMDBmtcKozYHVgMbvR7aGceDvOZ/jWtCNhUD28OfBRrmNgWJQzDw7XHUwMDFmQtxExpRcYpTToPyD/0B+UXV9k5+V4VhcdTAwMTMwID1dT3BcXLnb4Fx1MDAxZE9cdTAwMDJWhF5pXHUwMDAz4Vs52NR6WrpcdTAwMTbfOP5M/96TWlx1MDAwZmZGaW45XHUwMDFk/lx1MDAwYuKIgGddYChcdTAwMWHIiyGS+unXXHUwMDFkb7FcdTAwMWXoXG7Xe75cdTAwMTX9XHUwMDE05GFcdTAwMWPuxWz3wVx1MDAxOIjhRFx1MDAwZaYyXHUwMDA3s7RcdTAwMDLJT1x1MDAxN0edUdX20G30m7xL+YNZq/6MPPbNbsZcdTAwMWZ+gvOl38oqXHLf6683REByo00gs/bahEtHW1x1MDAxZKSTXHUwMDAwXstv321H1EnU4Krrzn2V18IrPVxcXGaAYdtf4ilRXHUwMDE3OsJcdTAwMTR7Pzv25/b+3VxuQsFE9TfLXG7GLPYsdVx1MDAxZKLteFx1MDAxM6Zj5jxamtv9fNhcdTAwMWKizWdcItJcdTAwMTBawOJuI637QnRcdTAwMDZcdTAwMThMW3V56OnMXHUwMDAy0PO112rtc0dcdTAwMDK8pm+kXHUwMDEyyWmlTno+XHUwMDFmpFxcXHUwMDE0XHUwMDE5zoNcZi6MXyumMCon6j5ERZnJXGY4XHUwMDEy4V6iwE5DstVEfI5Kwl5cdTAwMTSg7Sle38pf6XSW1iM/Jnm1uWe310Cm2aRCbMfwXHUwMDA1iNyJXHUwMDA1I/Th00X3i8TPN4lkjiaQxH+fY35cdItcdTAwMTN+7Vx1MDAxM9B+MF1cdTAwMTmohGxuq2JcdTAwMDTeONtcdTAwMTZcXOdcdTAwMWJWYXogh3/42rg0js05anOrMf73gmSuXCJW2d6glazk13FMjzJJ7sJnXHUwMDFjYEtcdTAwMWWdlLGDXHUwMDA2PFx1MDAxYcHvd1x1MDAwYqWgXHUwMDE0x1xmbNPHXHUwMDA3K1x1MDAxZVJcdTAwMTX+XHUwMDFj7D79eSb222dcdTAwMTPCM7WyjTVKv/HLXHUwMDBinERkdTjDdKjbWkUy4kzsXHImMZFcdTAwMWP2RFwiP8bhTyFcdL9pzK/z35xigS+4u0DmXHUwMDA301xmXGZxqCmnXHUwMDAxXHUwMDFm3FxmhKEn3EJE4Fx1MDAxYtnN8Vx1MDAwNimmJFx1MDAxZdZcdTAwMDDZXHUwMDFl/mnp35xcdTAwMGZcdTAwMWYtKk5WXHUwMDBl3Xl0sk/K7XVcbsZcdTAwMTOSXHUwMDE2YbOp4eE6XHUwMDFh5lx1MDAwYoFRpfBa9COGXHUwMDA2XHTGsnTBLdNcdTAwMTZd7kSV4vHauVx1MDAxZJeRj7DTVXLiyZFnXHJ+++pcdTAwMTCQjan8XCKHXHUwMDAzuskwypo28prG8vVuRVx1MDAwMo+E/dXlxlxmwPdZQj4/eHy0d3BcdTAwMTmErlx1MDAwNlx1MDAxYkbhK/rhXHUwMDE2Vtr54/ZwjdhbX1x1MDAwMiDHt3o+L1x1MDAxM4rkZ6X8isyuWTuMt9Q7llhFkISIwVxuXHUwMDE3PJHOeOf3dFx1MDAxY5DOPnz3JIOlflx1MDAwNkuuroHPz32dXHUwMDFmnHV/e9A7XHUwMDFmIfNcdTAwMDNJa5pdXFzdXFw9UGNoX1leXHRPeX9cIlO279wvd4NcdTAwMDckcsNpicuxRcotx1x1MDAxN3ZS3Eiqr/3VXHUwMDA3MtJ5WH0sKCq+QVx1MDAxZFx1MDAxMsiScilJ5sJ0v75G/9uN38E+YSajtSd0oSC8rpZcdTAwMTC3kFx1MDAxY4Kw1EUqayst/lj95DnE9Oi0qoz5MIk3ybkmec7WXHUwMDFl+Gw+3e06wMLCe82yTT40pDYtXHUwMDFmXHUwMDEymOag+3tcdTAwMWZJR7jj4PiP9X48oMidRaEmr1x1MDAwZVmF87lwtdlhVy//diVmV6YmoD96yKGSPtpUrVx1MDAxNSeQLWvQhrz5Plx1MDAxZFxi41wijlb0tV6aaib833F6KIMpXHUwMDFjXHUwMDExM9/HryuWKlx1MDAxMVN9JFx1MDAxZvD1y3BcdTAwMTSnXG53tKranOEsSTd0lP9z3uFu81x1MDAwZpm95FB1oVx1MDAxNDfaSlx1MDAwYj5evFx1MDAwNbiPXHUwMDA3XHUwMDEwXHUwMDA2md5ZhvJcdTAwMWLiXHUwMDEzL5tpU1aF+Vx1MDAxZEOkNOtcdTAwMTL/nNTL2MynY3VcdTAwMWHdXHUwMDAxXHUwMDA1UXCqhXqZr5HXtlx1MDAxOCCGcLtlXG5cdTAwMDEpXHUwMDBix22kKL6hXHUwMDFiXHUwMDA2MDp/q2WSx3qNqV1cbrsz1Vx1MDAwZqbxpY0pXHUwMDAzklx1MDAxZuTRu9yv/Y/bUFx1MDAwNVxyXHUwMDE2aFx1MDAwZujCWJg/S4u/9k2H6b0v5LL+2rFcdTAwMWVccsqh6MCtc6S/XHUwMDBlTVmzo/hcdTAwMTHgjMhcdTAwMWGi+VxyoXL/NVx1MDAxMpv3VIZyV4lNgVVcdTAwMTmBzvHwLakuOuBQLu6GeWFF2vf3bZt+981cdTAwMWIudn7BmN7r7UzaXHUwMDFkt1V9LPqRXHUwMDFhV1fL7LpcdTAwMDRGtuarcm0zXHKfw1dnsHszXHUwMDBlVXBcdTAwMDZjZJ2wTb9IXHKfqkRcdTAwMWRTI4pcYlluor1ija2gXHUwMDFkXHUwMDFkhjz6eFx1MDAwMZBcdTAwMDZcdTAwMTV9XHUwMDE25um2mFxuLlx1MDAwNHCcxb2CT/G7jvW+n5vE/DrAXHUwMDE3XHUwMDBmoFwiP4BsSMdcYsXxUE56w+6YrqRcdTAwMGa79Vx1MDAwNWUgPdYokaJcIkCnnXZ+UKl1/NhCTD1R/uNjP7VsiXr9uarpYdrhXHUwMDFkM8tr/K6gUCpeOFBKjVx1MDAwM/Qlu2lrL6TbxVlcbkrGbpWl41xmbSb50TVowFx1MDAxOLRcdTAwMTJ3L7NsJddj3emnO1x1MDAxYdxuSlx1MDAwM3grXHUwMDE1s9TH81x1MDAxNblcckJOqehEtjNzXHUwMDFiXGJFXHIrVJJcdTAwMDGE/dt9YkVG7lS5ML7yJdeT10OpnbdyR/JUPuadhFx1MDAxZVx1MDAxY2oqXHUwMDBiXHUwMDAzsPGQklx1MDAwNdNzlDOAa4tSXHJQJve5M8IttOSGVU5f5Fx1MDAxY79w39e4ZTLyg7P/NvJUXHUwMDFmvuMt32VYlucpdKajx7Rr33DuwpHKXGY3ZD/lXHUwMDE4S1x1MDAxMfmNO6rwg6E6XHUwMDE4wKbkSslJv5xcdTAwMDHXQkPkXHUwMDA0MVx1MDAwZW6DXGZLaIhcdTAwMTOVgISUV2HJT0J7ktu93IIs51x1MDAxM2vDdOrlg/w4QO0862+yZt+66F6Nhq9g3IzFfZTAN8pZYVx1MDAwNSFy7rbD42OQ53SPW2vtXHUwMDFi8JH573o1XHUwMDFlQe46yJXMP2dAw1x1MDAxOFx026ItlX5upCxcdTAwMDeVOVx1MDAxM8QpXHUwMDFjXHUwMDFlI1xifDov8nQkjfOI9NqfbFJVX0Ck1L81drCANvt+iVFcdTAwMDOmr77R54x8ZdBYzyZBYkDjRjx3RyqHt8anNXSGOb3UlO8xXHUwMDEywPfxvlx1MDAxZqDYbup0k4I8a2uZPCafpTyEdI2rQr6quvt5leZcdTAwMTGM6EXwUsRtdsKjW7E9g1x1MDAwZolOqvOkNnFP7fz0K1x1MDAwMSlXYGC6XHUwMDE2SVx1MDAwNi3Z/uVf5jZ5I3nT2lpM9Vxm7iU+97+u9uswzSX4XHUwMDAxXHUwMDAwhejYzCFcXI/EuF++o0BOrTfsRI2294TNXHRcIu/pw1NakT1Y9V420p9cdTAwMWaNXHUwMDAzXHUwMDEwXHUwMDEzjzRcdTAwMTPdXHUwMDBiJTu/VVx1MDAxY2vh1NVcdTAwMWVcIov/kGiuPlJcdTAwMDJcdTAwMWGvpZ5u6yZueWL37iNRiFV8JEa5MoD13SRcIm5v4kw5UCZcdTAwMDGR1TU8VuBcdTAwMDST7vN9r7u6q/KhmsWBTFXaRJW0+UOajIpcdTAwMGa9fFx1MDAwM1x1MDAxY1x1MDAxNfdjnfymLemfhtInOU5Eotq4VlBcdTAwMDdtU3n934bMvaB3bvtruVvbXHUwMDFjXHUwMDExN+2Xn2/Me6NNwrJcYpW5XHUwMDBiNtTXMynXc1FbcieagWbzal9cdTAwMGWe0Vx1MDAwNW26XHUwMDEwwzVdemJcYqDjLVx1MDAxYlxuWWmTZlO8poKgMqT9lLTnfqiEcTsrdDFQWFx1MDAxN6RcZtI3OMNcdTAwMTTu5XqhpeeCadfyQ05cdTAwMGaOSFx1MDAwM3XObflreNhcdTAwMDHgaFx1MDAxOOnXz1x1MDAxOVx1MDAxNVxuaT9cdTAwMDDPQ/bGvU5cdTAwMGLzntsvtuWvVYxcdTAwMDOF6Vx1MDAxZLqQw35z+TPMOlxmTYlcdTAwMDVcYlxmXtOu01x1MDAxMlx1MDAwMkNcdTAwMDBcdTAwMGXxq2dcdTAwMTTu5EkrK1BPyb/XOJnqnslVo8v2SphlkVx1MDAwNHdcdTAwMTVcdTAwMWHzW5N+28z8XHUwMDE4qGQhZFx1MDAxMFx1MDAwZZad3djKf8hmV733y2WE2as+88fvy5kzkOlcdTAwMDaR8/glYG825l9tXHUwMDBi6elnL4ondD7wtc7lXHUwMDAwxPDvcOTBc1x1MDAxZuD268ZJZm7k2FxuyFx1MDAxMLpcdTAwMThcdTAwMTJcdTAwMWZ7rpy781KM1u+xcs/W467n+7JcdTAwMDfu4Fx1MDAxN05cdTAwMTGq355cdTAwMDRcdTAwMDJvvO4ls3hqoCxemIZkWcxOXGZcdTAwMDbdXHUwMDEx1czH16GN/1xy6d9cdTAwMDD37H5831x1MDAxYcxbNG1L2dJcZtnIv1x1MDAwNlx1MDAwZd+jjSXtb1DJzb/wdC4z08Ghjlx0XHUwMDFjMXbXXHTX5fPm4rokd7bDq26OT4H8cKpcdH3Tt6VcdTAwMTDweJq71lx1MDAxNFx1MDAwMY+kWmFcdTAwMTSBk9didqxGQz1E+FGQn9Vccm1cdTAwMGJ+grpLP2CQKMKybZzMibnlQsLCoju4ZSVmXHUwMDFlTKN0yFaLdHuHszOgXGKQQ0kvXHUwMDAyhLe9XHUwMDBmNNeGyv09faDM5Fx1MDAwN3uaLzG4XHUwMDE4/rdGX3dbgtbMSqmosClPTqyAR2B8IIvAuKrPKFZu5mqfPfG4ta1ST1x1MDAxYkOsXHUwMDE4pKlcZtb1u+yPZXLUNc4pc5oxMSpcdTAwMWZupd/7gelcZt5cdTAwMTaASV1dXHRyK6F2pqO6irZl9XZ+IImCp8SHXGInlZrjXHUwMDEzXXTKUZdcdTAwMTSVKomwWkhm4J6IQPdEvjyNYJ1cdTAwMTQ7XHUwMDFmXHUwMDFkpHUr29SvlVx1MDAwZmLH/GFw+cmA7P2ILlx1MDAxZUedPWFcdTAwMDeL59fJWV7xXHUwMDAzM8rZu2vPrIXVc2g9pTqAvNeK2OX8m+BUa1x1MDAxZLhG3u9lRZH96zq/XHUwMDFhI5p5llx1MDAwNlx1MDAxYmA+MjFcImJ46swgOMEheVazR1xuOY2T0Vx08ik9XHUwMDAyrJlcdTAwMDWfc1x1MDAxM41C0Vx1MDAwNOVQZ872ZVhcIlx1MDAxY9qKPa1N0S3pJ8X879k0JsbNOlx1MDAxMU5o14dA3NtcctZ2YltcdTAwMTGFQZfT43us4a74NCnzXHUwMDBmdPEkzrE0/5SF4k1/M8NcdTAwMWNpeopcdTAwMDR3XHUwMDA0zJk+XHUwMDFmYVx1MDAxOD7vtfpvyjihXHUwMDAxXHUwMDA0J9KDqFx1MDAwMVx1MDAxZEtcdTAwMDLiezmAwKLmOoPD51wisVx1MDAwNcFIwm+x8lZhXiHCOlxizC1Iu4t6VcVFXHUwMDFljyQowoXAh0dGkp6XyMk4Qq/mXHUwMDE5okKKsVx1MDAwMJjMPVxy0Io8ZmydYFx1MDAwNp352TbnXHUwMDA0OFUhXHUwMDA2b7VNmzDdmm9cdTAwMDZmXHUwMDE3XHL/6c7lUb7vXHUwMDFm53as+LqTM5RcdTAwMGbX0m5cdTAwMWVcdTAwMDDftHtcbn9cdTAwMTCXXHUwMDAyTFrvc/7z+ihcdTAwMTh6dqTduVY6j5961eGB3W5U1E51MnnrLShcYjiy6d/3oeufijVuo/qi/t9cdTAwMWXc61x1MDAwM0P08Xw2j6In+Vx1MDAxYkZCbjVmg/A8e1qsefVJiG6wLtqQd9VkPjb0aPTEtH+iK4v2s1x1MDAxMMjG8Uwt2MtoePKbiL/UTGhPNTS568xA/qNgilxiOalcdTAwMTNem+/5kd/E/FEqK1x1MDAwMNRoTVx1MDAxOW9xLJi0tCD9eZxcdTAwMDeJ6lx1MDAwNMmnKf+s4fb1IFOqlE+9Olxu51qdklx1MDAxYrXX2lKCgqGP52CihiRcYjaE8Vx1MDAxYsdcclGAXHUwMDA1XHUwMDE5XHUwMDA3XHUwMDBmyJq8tVx1MDAxNIT4a1Gdt7/QQ0Fqr0Bx4WM5jlx1MDAwMojaxdX/TX5cdTAwMWO0I4g4RDxcdTAwMWVhZzRt7bGQXHUwMDA1MetLJLD+Q3ozN1x1MDAxZvZcdTAwMTGilNRsRZHQ7rPDitSghvCl8yCl4ajHk86zxlAuh1x1MDAxY9dziZ34mZNY7lx1MDAxY7dcdTAwMDR5ec5vsPmtMT+ZfVgnIJvY5lx1MDAxZKP1bD87XHUwMDE49fTm9qVcdTAwMTczZ1x1MDAxONOOjUaSfVx1MDAwNJ/J3LEuxVx1MDAxMlx1MDAwMCS699BNQ9HdXHUwMDBm4MXtw6ueza4/nddVPsRVaHY6XHUwMDEzIFx1MDAwNl2xe1x1MDAxM/BqSTZcdTAwMDLgXHUwMDBmWC3zsPSW84G+98fQZjb8JFx1MDAwMVx1MDAwNlx1MDAxND4x3VDXJlx1MDAwYp9cdTAwMWM/p41Aqvp8WKok6yM2QJdlv0s+2t9y0cTht4WKMs+1W43nXHUwMDFk1bL+hGiJZsxcZqKipKW/R9YhXHUwMDA0XGadUDVwR9QmYvHDuGRccqCcdnM0h3mz36BcdTAwMDO6XHUwMDAzXG6kXCJcdTAwMTmuPu7Jpq/GXHUwMDFmIVx1MDAxOe3Wh7HKjsqeW1x1MDAwNlx1MDAxYp3Z13b6XHUwMDFmP6x6JMF2MULy90Vkatj7mNBkt12HllB4dc9mlf10cytxXHUwMDAwmey3YqDvVVGX6+00TzvfXHUwMDFjUrsuQVx1MDAwYja7foUhudmjmyGMXHUwMDE34LbXwvMq2Fx1MDAxZfg+uzqGKUb7eLN/57Vf3lx1MDAwYlx1MDAxMP2hoiZtKVwi8Cpg5KaSuDigX4Lr4dZvXHUwMDE0RcxcclvQx5Km8EF8NuWBXHUwMDA1ZJUgqHH1UFx0akVxPFx1MDAwYkFQwHal4dF5smeUlTY3q+FvaKBGNbRJXHUwMDAzV8o9XHUwMDEx5o9Nvlx1MDAxNUbQWuTyNI5cbnhcdTAwMTVxm1x1MDAxNohcdTAwMDP5livP6zyPW76cP0/c1UGEQFx1MDAwZrKpXHUwMDE4+Jpablx1MDAxY3eEd+u0+4VyjHac/iXJXHUwMDExbouj9TNawNWLSvqxRzfygH1cZnVMp75qXHUwMDFkPEiM5qVcdTAwMTZEs1x1MDAwM+vdrf/VzFx1MDAwN+hcIvbrsVx1MDAxM1x1MDAxNDG7dlxii5dcdTAwMTGoUsqMfV1diGWe246/9Fsr8nJcdTAwMTfuXVKLZnCeTWFcdTAwMTfec1x1MDAxZVxczNos0VdcdTAwMTLRj1x1MDAwZlx1MDAxZm01Jz309VmWXHUwMDBiytUlxsMgYLGuXHUwMDA3kLz+elx1MDAxYdi1zMApy/hh08GyJD6/4Mg00l1gWI5kotPd2kJzStPW10tpYkpcdTAwMWaV9sMvOuEr70ifcpzFuCvkXHUwMDBmupA7XHTAvDA5lFx0VLrJQ9JoUVRcZnpfWenHkPXSXqtk41b859fZeFe1aMHdqVx1MDAxZVx1MDAwMtemPkRekFx1MDAxZIojxdBhU8tsxeuMJ75Q117iXHUwMDEw5lxiUVp8VFx1MDAxY4EwXHUwMDBiqicovsWX0TrWbzxvIe51eFx1MDAxMNh8qC/AwjNx3sRio2BAjo1nXHUwMDE333OE0WBO5OVl56mStjYvwSEtXHUwMDExvZroNTF/K2Nhq4BlWOEkXHUwMDFkojB3XHUwMDEwJlx1MDAwMn1wl6hcdTAwMTbtpHrArrLMd9C0OPHDL2Q6XHUwMDAz/EyM97VTzzn9Z9PjwUZCYYJcdE1pe8ZG/aNcdTAwMDBcdTAwMWFPXHUwMDA2+9eVXHLwclx1MDAwN87tg1FW3EbO1p3HtPSYl1x1MDAwZU+ztU+9+ZGgOVx1MDAxOX/LODVj/u47R8atYsdSOniFqlmFXGJcdTAwMDWIXHUwMDE0tfkp0cvL78lfzNUktH3Ob8/pxSvsx5i3hVs7aux91iVNZdndXHUwMDE3XHUwMDA1239cdTAwMTKlP1x1MDAxOVx1MDAxYcK/g6uOIbXUb0SvPSa4XHUwMDA2LIU2nIdcdTAwMTHCVK9sRKB8VcrAXHUwMDA2fKE4p61mRI/k5a8/zD7Zo5XehJDOzO8wXHUwMDBicz7iXHUwMDFlY8hcdTAwMTlBsoNJXFzbQlwiXHUwMDE1at90dlxcU/mja4bxXHUwMDE3+JvXd6TO/f5cdTAwMTHER+e3XHUwMDBmSd1cdTAwMDJcYmI9XHUwMDFk5lx1MDAxMPh8p1x1MDAwMOJx8jfkXHUwMDFi41x1MDAwN3tcdTAwMDK3MdNC2+RTsIaCWNBF/vdD5/CVMYclelx1MDAxMD3g6/xcdTAwMDEpwXudUWFSnb+haahcdTAwMDHz8PNgXHJUrEe/tCM13XnWobbweZz5XHUwMDA09Zxsiyt+5lxc6OuxkFwii+p6vpU5XCJ71rghbE9OUItApTZcInpUSE2YKlx1MDAxNodxZvGH6oKlQlJcdTAwMDZHKeiZwjpgnnujgCl3XHUwMDFheDhWdp8m25RFseXYp3LmemT3NndT+DhmSzZRXG6WpPZiZ7C6QtxqRteDXHUwMDE1We1e8vuNd2RZXHUwMDEzwuC4Y7NcdTAwMGboayfXkfhD7zCBl4FcdTAwMWNj+uf1zIhEsFpcdTAwMTT91c49uOb8SLg6XHUwMDEwU83AszFcdTAwMDaILyXJhW+C+Vwib9D+Jl0llFx1MDAxN6i392OX8M5shtxe8CxcdTAwMWGE0oGk+qnlq1c/Y4OHZuk6XHUwMDFm4zRDy4zVpVxy9W1OsnRcdTAwMDS3wN9cbmB1gN14S0B8XHUwMDE0i8lOXHUwMDFmXFy27kxvP39cctu/lU746GNAODLW2pVbVs9lvk8+QPe497D0j689XHUwMDFlSOOJqvD3uIpsMVuVjvF//qf0ttRcdTAwMDE2MJCT7sHMQLIylPPbOEeurixhsqV198HyXHUwMDBiv1PfkmOOdc8x/Zo5xGBS/tVLSnVcdTAwMDVL01xcYbmBXHUwMDE2XHUwMDBiTnEn+HRffJNcdTAwMWZX2NC1rJU22vrqVm9cdTAwMDFletykq1xuWKcq+6Wos0+r7vC3vyZcdTAwMDXzT9XS6ffm57FCXHUwMDEwj35cdTAwMWFWQ9z+Qz5dn1x1MDAxODWirN2EyMJcdTAwMDEoroVfUFx1MDAxY53l/qJFc4jR9TKRXHUwMDBmny1/XHUwMDBiSFx1MDAwNeFEMVxmjLqavJkg22Jh93VWMKKxI/jx0eM5XHUwMDE4jFxculx1MDAwMyRxXHUwMDExad9gZdwzn+xSKOorO60sxfEnf4gtfm1zcph4yVx1MDAxNlx1MDAwMmhcdTAwMTJcdTAwMDPv9cXzdKCimC8qqMckw3RcdTAwMGIr89NCeN2oPVAkkU/pOVx1MDAxM2O4XHUwMDFm0OLrQ1Xk2YZgimDZXHRwXHUwMDBmSTuOKJtcdTAwMTXNXHUwMDA3bepIXHUwMDE2knZcdTAwMTbIPczuqaSu0PjjMF7NnD/1OIdZrPe3lqJOXYTVolx1MDAwNUj7dICceaJcdTAwMWHfL6d9s8babVx1MDAxZtnVkmdUJyyRusI4yYzjYslO4JSgSVx1MDAwM42fPlx1MDAxM1x1MDAwNlx1MDAwZXOsVv81xGJ7ecrc/Dlet0JcdTAwMTNcblFcdTAwMDV5in0/4HZ7bFx1MDAwNb05SMCbamkzp1x1MDAxM59cdTAwMDLDr/JcdTAwMDObX8vKllx1MDAxYlJcdTAwMDWAUYD43LLK0O03Kz/TrtpcdTAwMDZjnchZoa5cdTAwMDCXLe6smTyWWd/BXG7YTS5QXGL47lx1MDAwZe8/yVx1MDAxYX9TNUtEpNBcdTAwMTR88LL9kp7FfXpsXHUwMDE4JYQ8XHUwMDE2XHUwMDAyaE+pIGHaRlx0siE2RdUjUOSxdXs4XHUwMDFhkGLfwVxubVxmOvzavM/7ayxcImRqnX1fxFx1MDAwNDXaW8fq/jpeJU4lL9H1rVx1MDAwZvhcdTAwMWVnq9rA9H13PbdcdTAwMWL7OExcZk6vLcbarlx1MDAxN1x1MDAxZHBFqVPQTUnQPm4pNu1SwPXwelenVcqLbVPoh89K6eNmuTKO0/n2rLpdZ+xRvDZYyje8ynCyXHUwMDE5ks6LXHUwMDE4c2TMXHUwMDA2kLXW9HWm2bFylDfBXHUwMDE31k1cdTAwMTNcdTAwMGKlzFx1MDAwMv/Y62a/tHF2KNVcdTAwMGKpXHUwMDFkf3Q3Yj6qrVpcdTAwMDYo0qaLXHUwMDFjXHUwMDE0uqZp513m1shcdTAwMGLRJLDfkvuU6qW4Ncm+fFmtWGf2b1x1MDAwMzIvXHUwMDEzPFx1MDAxYURnIZp3IZVvxOS/71x1MDAwNimjVzlXd8l6ztuF/nJNaVu13dNdLIiF71UloTpcdHPud1xc+1x1MDAxOFxye/mTXHUwMDEyNtozSzPH9yU/XHUwMDFlpMvXRy6gqlOtUFx1MDAxNnKbfvqXx76KujOo116bXHUwMDE43NZcdTAwMTd9q1x1MDAwMFY8pMupubdMoZ5qpEa/t5jF9SGoQPijXHUwMDE26q9ccseXO0TDqFxuXCJcdTAwMWLufd+ESmeEOay4dFx1MDAwN4aJSKtcdFx1MDAxM2isnnib3qllXHUwMDBlXHUwMDA2VSD8JShccjLC9Vx1MDAxZjgqeFx1MDAxZcfBi7C0arF5kFg9fCjsY5bn5lx1MDAwMblcdTAwMGbZg7Z6xHxLjj01rkd91Z9cdTAwMDZcdTAwMTZcdTAwMWE57PTh8O1cdTAwMTjdivIx8m7iPpB10rBcdTAwMDMvaVx1MDAwMNEvjOCNXHUwMDExV1x1MDAxNPNcdTAwMTIoQPFOYXMyK3B7T1x1MDAxMGXed1/8XHUwMDAx55wu6Fx1MDAxMehrRVxyc103gkjOonD2Kd7K+1Q7QEdpdL5tgaiwaFx1MDAxObxiQyqkXHUwMDE5IfusfOhXfoxBi7SWYFxu0ovstO7eq8s5heBcdTAwMTnRlUKYfnFcdTAwMWFiXHUwMDA2kIrfeqE44vKbpvDXiWN0IIXe8IX+XHUwMDFiif1rR1x1MDAxZHrUXHUwMDE3+uHZ2Fx1MDAxMataSITXM9UhXvd0/Vx1MDAxNtohXFw/cfvcmFxuWjE6cu6gXHUwMDEwLIiIv98p8qo0d7jue1FAf8b397+WoVx1MDAwMvngXHUwMDA0w1v6flx1MDAxNZtZLG9cdGzRJWlcdTAwMDCDveLeMb9I43Nn3KNcdTAwMWHWbYVcdTAwMWWEbVx1MDAwNvxVg8TZIVx1MDAwZoumyLqXKFrbUJ7MeI/byFx1MDAwNbpQRCbUuoGs6LY0kP9mXHUwMDE2156ufIWGOz6cjGW4XHQ31cV9Vt5pl0/hUsl1Yjp6I7whx1x1MDAxNrvSuVx1MDAxM/PlXHUwMDEyfidvlTRcdTAwMGZvQlFuXCKA4VxmpPM1vqix6JRcdI9o0Fx1MDAxZHxcdTAwMTHJSkvbqefjJ5z8Rtg3gauI4dLRbZhyZGtcdGJcdTAwMWM1gzSJzZzSKYq3qGl1a3JcdTAwMDaDxIdccuWiXHUwMDA12NPQZjp2i/oxcuqt8INQk034XHUwMDAxUtBI4CyKptCe1NRcdTAwMDSW7EmQjlx1MDAxYXEw71Tj2Fx1MDAwYu5cdTAwMDSyyO6/X2Ag64tV3dJcdTAwMTSGgj2/kUTInOZ89dYlX1XNi9fnp1x1MDAxMe2ZV7mtylW8sHbbwvvtJD1HwX89nr5rnGdcdTAwMTnbdLFkQXyoXHUwMDE3r+NcdTAwMTBpMsLM3Y39XHUwMDBli3GLp4gogYN1vZpGlifNbKjyXHUwMDA3Ysy13d2+K4PA2meioHj00OxLmPxcIstCiFx1MDAxZNzZ9Tm3VISK5S/PUFxygJ24XFyJXHUwMDA2RmHQ6KVMd/1cdTAwMWToVeM3IFx1MDAwMKDGXHUwMDBmdkJcdTAwMDNoQzE0wafCaVpn7k9cdTAwMTX3sNLb875cdTAwMTH4XHUwMDEzI0iS2y/QaPg2XCJcdTAwMGJcdJhW0o6OwYHeumxjXHUwMDE5UGk1/lx1MDAxNSOAxTq8QlO4XG47N9v+9n/ITb7VqIBK7FN6hiWKXHUwMDE15Fx1MDAxOKJNXHUwMDAwTlXj4niTalx1MDAwNkiDKIqmY1xce+ZccrZfNMp+OnVmoD+GNyues9nix7PK3+Z+sPjbybZcIn2SjGIls9lcXPT5SGlcdTAwMTXvS35QoUJcdTAwMTC+qIaZLkWaR71l+jpbXHUwMDEya1QlrkVcdTAwMDZHXCJcdTAwMDJcdTAwMWY2+oNH8UnO2N10epxvXHUwMDFkXHUwMDExXHUwMDFmKEtcdTAwMTXDlCAvL3mvnVJcdTAwMDOCNX7WVGhC/dAzX3a7IOapP5G/PV/Bw+XQXbRcYtFcdTAwMGKcioWe66NV3ptjRlx1MDAxZlwiXHUwMDE2XHUwMDBmlrpcdTAwMDVcdTAwMTdcdTAwMGa6t50yXHUwMDAykzk+oeF1o3CkWaadXHUwMDFkbUwtkVx1MDAwNd9cdTAwMDOf81x1MDAxMzjCcIBfbkPsliHBaU/7XHUwMDBizJF8QZyb31x1MDAwNlx1MDAxYzp5qqC3NXnZJl+wm0ifXHUwMDEwv/NcdTAwMTeyRNb2XHUwMDE0K3a2r7gwXHUwMDAyl5Hew71aglxcXHUwMDE1bVbQZ2K5StXEgVwiN1x1MDAxNOwyuFxyIX7SrL7el6hdXHUwMDE2yfE4P5ydYC2gUrhw+EGDv2FcdTAwMGJcYnNykZRoVC4l7lx1MDAwNHAwSa73XHUwMDFlQ7hcdTAwMDCvb9llXHUwMDFmQ6JnbH2UeMBgzcUhXHUwMDE2IzDM079Kalx1MDAxYp+/szBgpmDI1YLmXHUwMDA3Yifn71wiXHUwMDFlqsBcdTAwMTLxuKlccnBtlvdjn93YNPlcdTAwMWFlR3VcdF4hP/4yXHUwMDA3KZVrnrLPXHUwMDA2XiVC5/a/V48uWGlcdTAwMGa8d1+9qubx6rM1yflPLlxca2F4jvop/TG2XHUwMDEzLiRcdTAwMWH+gyH4sI/ytT06UDDjqzXfz0G/uVx1MDAxOTBDXG6Vg4pZ3a/RPVx1MDAxONt4eNlcdTAwMWOIw4n+vZdcdTAwMDCGUzOE7/xISUOgw7JcbqpcdTAwMGKBXFxIi/Od6yh/djbaTV3dQJxT/WxbXHUwMDBiQ8VcdM6QQHBcdTAwMDIp8tmx8MDLVYZdo8hpyFx1MDAxMzCLXHUwMDFm6SaHok2uXHI1XHUwMDAw4zv902q+hItcdTAwMDSpR4QzPVxi1Fx1MDAwN4+qqifyo8iDLXabxLTTJanuhutwsUe3XFyYTlx1MDAwM7uHuOBcdTAwMWGSnec+pGVDzFs9Xlx0XHUwMDFiXHUwMDFjxFx1MDAxY9N1hVx1MDAxMPz7aoE0r3/t++pLnXAs+GPohslxu3Q+7rxL/1xci9Oq/+taYkhcdTAwMWKTfSNcdTAwMDDbuk1K/LL8zlx1MDAxNKq+sZ2uRF0taClKXkdcZkJKx4PrJH/NmOPIXGY7I1x1MDAxNlm5VHc5TIHSqYU/zuhI8213aN2LX35tn3FcdTAwMWNG0eV2ZZbE/Dt9/43NK/5fsWn8UGQmmdPOn3t5679nJVx1MDAxNCxb6MLoc0aNjiOB+0Cv5EdcIlx1MDAwM2JQgnFUXHUwMDE55fU3LD6am+vSiGDCoF6kjO3bParsP02r7si5Q7Pn6a95Ls3yY0grXHUwMDAxPatcdTAwMTJcdTAwMDVUg1Fm19fYfM7XunnVqNOLRVwiNFx0ytih5z/Lj5SL2ZE5j393XHUwMDBmXHL4ZV7++/dcdTAwMWGHcq3DiqdcbimvXHUwMDBmVGFcZsZcdTAwMDJcdTAwMWR0I/pG7turxTZZyLFvv4RdaefNyVfk+tQjYnjJ7MquiVx1MDAxYrPQNvtPXoSZ8P/lXHUwMDA1W1lEL1x1MDAwMMe8U3VTsCRfKWfYcPnhjb5VnH+HcWLDXGb9OkKk48nr9T5PdJdcYi50XvOQok21XHUwMDAz+WGNtbBDXHUwMDE2S0rHTTTjMpVcdTAwMTZcdTAwMDQwI1x1MDAwMGQgST6USGmrKpKwL5589Fx1MDAwMr8rRG8slFwiXHUwMDA33YzFVmqyM8dOgkB2RshcdTAwMTPlt/85XHUwMDA0IS2Su4XlmyRJXHUwMDFiss11R8UgbfV1175cdTAwMWQj37cy87RFboCq+JiqkbnvvWb9OHc9vbNcdTAwMTJAilx1MDAwZniY1fBccllcdTAwMWKpXHUwMDFlZGw+hr7H9Mz+fVx1MDAwN+VQJVxmPzGSUGZ0XHUwMDE5gj+Ej1x1MDAxZSy+/HPhXHUwMDA1MplcdTAwMTLY2GLXLPupSYqfQOX1cb/GYpdlXHUwMDE2lTDy/7D1XHUwMDFlaVx1MDAwZura1m6DKJBTkWiwTc7UyDlnWn/xt89Ze53/uVxysFx1MDAxMdKcY75DQlK6Zsv3KD/7mzPRdrVSbI0m99s39vu6QbJcdTAwMDdcdTAwMGZZsp9cdTAwMTd1p1x1MDAxMTvnTjb/xlx1MDAxZZdcdTAwMGayj188XHUwMDA08IbSyLyew2DiXHUwMDFjOlx1MDAwM/olSVx1MDAxYuwkNr1cZlx1MDAxYU9Yb3Ctzy32O7SEYs5cdTAwMTbBqUhcdTAwMDPl8muEkP/bSZqRYII8TuszhTKXXHUwMDA1c6CPc9TJrFhplvKKga/UXHUwMDE01Ou3P3x5Qlx1MDAxYoXsv+eDKP+v2KtcZinReYeyPv56mFPoVDJcdTAwMTjNdbwpXYyYnmY3NPBK3MSUXCLexkrWKNtcdTAwMGJZo35cdTAwMTRNdG1y6rJd1ZpcdTAwMTboi7C1iMVb6Fx1MDAxNpZZ8pJG4l3Q+1h3vKjXKyPG8Pi9d9Tljy5pf2dFvVxuhDEh61x1MDAxNeY+TGGE7q9qXHUwMDAyLy/ZkypcZsZcdTAwMWNcdTAwMDBcdTAwMWTZnL3CXHUwMDFkXHUwMDExXHUwMDFl5zxmiJTEwVx1MDAxMMa93DMuhCr04eTt1ey5K41d96JcdTAwMDRs3IiP8H7LYS3QmlxyXHUwMDAxKfd4LFK/zSB0/tP3mP/fvFuc7ufzLM66NPpcYoBRXHUwMDFkPVx1MDAwN1x1MDAwZSrWiakgXlx0z5hqlVx1MDAxZkBPkaRcdTAwMDaTuziiJaFcdTAwMWGWSiBQjeWYfUqFPZKAS0/nmEJsX2Occfy+ZGv2XHUwMDE5XHUwMDFi8ob17p+46dGFqL/rXHUwMDE1OFx0XGI7XHUwMDAz89M9lcnruMup31x1MDAwNZHie2PyKVx1MDAxNeVRlEpBVfdbVJWDr+e1klXk1L/o8aA4mGnoQ1CBZbxcdTAwMWb95MO+ZPfESvh3l1xyXHUwMDE4XHUwMDE4LkC+0L1SPTp3PeXQdycxwYmwe8P452GaZVelXHUwMDEydl+MXHUwMDEyp3dpvH616S/xWSsuXnqiW36C6EZcct1yXHUwMDFjqIf7XHUwMDAyXy/S7Vx1MDAwNEHAZDAlgMVQe0T2v73hX2VcdTAwMDHWbPmwrCGkXd8rkP70RGjq7lx1MDAwZaRcdTAwMWSgYVdjMi8/s1x1MDAxMoroQlwiyplM22zVNu3Usf7GgP5/xoBNSz+U5OQ3XHUwMDE5TmZxu7gl+lx1MDAxYlx1MDAwMydecfcrOtRcZiRcdTAwMDA4XFzvh5/STVx1MDAxNkFcdTAwMDLginqgoXF36cQvdpKZMMPglGVZ6E/TcnGPPpTXoVBWf1x1MDAxZp2CUtR1kr9+d5n4//S7P5iwWb37NbCivftE798+Q+T+5b7/dt9Ep+Z3ke8oXHUwMDE5b4nweduXXHUwMDA3YuJcdTAwMGJjmDyxIFxycMGN3HhwpcFhLVDR5ZxUbppyXHUwMDE2XCKCkzPLP1x1MDAwNlxumOSC/z1zKvrn3VFcdTAwMWN7XHUwMDE11se22Fx1MDAxZZX9XHUwMDE4pXlcdTAwMGLVj1x1MDAxMaLf40VKpofcXHUwMDFmXHUwMDEzaXXYkOpe2ixcIrVIfPqaL1x1MDAwMImCz4C8OMyYxIDLJtRBaFx1MDAxN85XJt9cdTAwMWXWL9IpXGbTtPlWb8bZ5WhX+S9fUqlbNuxL+pW7Stlw9Dzoh1x1MDAwYl9cdTAwMDeHNLuDpDhcdTAwMTA320BcdTAwMTixvXR8XCKG+8Fu8Ptjobyi18mx37NI6+NNcdiHVDhIhFx1MDAxZYarX2jasjnA3j+fWPg1r+5cdTAwMGVuXpLsIb+tx8VHpVxynPnlOL4w/62x3Ml5dT1P20om327cotlWduuMrS9q9JF2yWybZ8xLXHUwMDBl2Vx1MDAxMNFNXHUwMDA11984n5jt0IdOoVxiyeNNQuBcdTAwMTmLh7H/U8u/ps/KsZxcdTAwMDDST5vArYKqoma2R9p/70JcdTAwMDbHn7RcdTAwMDelLmdcdTAwMTlWNcFcdTAwMWG/XHUwMDFhJf/Vgfh7xOuU2m2/KPK92Fx1MDAxNU5kNlx1MDAxN4Lxo3Ius9w+x1x1MDAxYbNhXmdcdTAwMGJLJKDxR1x1MDAxMOf4/lx1MDAxOTFuuFx1MDAxOVx1MDAwZk0sJ9hLX/TD/TvM2yBcdTAwMWbfZ3iTsUA1RJF+w+vJf6xmkjW9rHGHL6t6YXb/5LNQ00SmbphywFXoY1XeNkWfP504z8fHeFGtXHUwMDFjsd8sN2H6XHI5nFSDn8p6xu1t6P1Ua1x0lb7dnNk+XHUwMDBik/tm6Fx1MDAxYebzTFjxn/5Il0C3sSedjL7RpXSNTXqJPFx1MDAwMj95U63gzydrbXHs74Yu7/o7e4dcItGR/kZcdTAwMDCOXG5TIOPqXHUwMDExl81fm39n/lJcdTAwMDGk7v1ebNZcdTAwMTLihFx1MDAwMve6nnB+09bf7UNcdFnvOsZfLrWM/39y6bGfXHUwMDE2XHUwMDE5nIK+flx1MDAxZlx1MDAxYzQzXGJ7/3KJef02gkjZV6FfYki41pRcdTAwMDNi4qZcdTAwMWRcdTAwMWZxpFPyxtPPfVxipEdzU8ewXHUwMDEwLlZccmRcdTAwMTHevT1+5kC93N6GiJmXuV8sjTXz44a6JFJ2UFx1MDAwYmGVJFx1MDAxZv7Fsa9ccoB/XHUwMDA0KeW/NkQkNz+pVOR9V2k1Vtj2zbFcdTAwMWaXXG73o9tcdTAwMDCzTlhG1jlK7lx1MDAxZWQ/lb2OuYOrSKj/ZE9cdTAwMWOC3Fx1MDAxZbYhRmlcdTAwMTN2MM87p1x1MDAxZuN+oVx0iWFeY3z4iO21bNtz5NW2vL1FYStb143Ilo6OJG3Xhvf7tMBumuWb/r5EJCiuYfe39SrqeH98QqSRe4xodv1071x1MDAxYlx1MDAxYqDwXHUwMDFlTUbeTfKFOtFAPSxgXHUwMDE3/PM8vPvj5Fx1MDAxZlx1MDAxYoFAvttcbptcdTAwMTDQQKG424das5EqXHUwMDA0jehGqzgtXHUwMDAyeCv6fsJcYu5ROiBcdTAwMWL7pnA+XHUwMDE2TmJh/1x1MDAxNFGGN08hea+sXHTbieS4kkmfXCJrSKJoZshcdTAwMDZawFxmtNr2uMhe1GHddfBcdTAwMTFcdTAwMDE3PCVjK6SWN9WAN6XemP+eXHUwMDAwXHUwMDEycVx1MDAxYnD099xcdTAwMDNkkV2YPX6jTlx1MDAxNlx1MDAxN1x1MDAxNLxcdTAwMWZJmy65uHkpUDbkXHUwMDFlllEuuqh4rZdz6lwio7JvXHUwMDBiQ2jtXHUwMDFl8ZW4JYlXmapt2LJVy1Mjl0GRXHUwMDE02P1cdTAwMWUvWUMypCDL+yyA1oj44Pe7XGKjXzNcdTAwMDZcdN1cdTAwMDVIXHUwMDFityBohc5cYnneKlx0XHUwMDFkIGi3eOaAmGZuXHUwMDE2XHUwMDEyYodcdTAwMGVcdEufb12nkEYpJVu0XHUwMDE5m8/3c/MtIO+GhYDDXHUwMDEyJLgrfu1BkYlYeVRcdTAwMTlGdKtcdTAwMDaBXHUwMDE2fVxckjBcdTAwMGI6fKXf07tcdTAwMTWLJ6fIzWM+79ZdMah6h2Fmblx1MDAwNVx1MDAwYrtcdTAwMWOjfbUuXHUwMDEyXG5yvE9cdTAwMDP5xUXAaqfPldRXxfykXHUwMDE0nc9JeXjY46iQv2BcIt1iKuPfOFx1MDAwYj2Y3lkvlj51+b3385T3glx1MDAwM2UkXGZcdTAwMTjcJFRs81x1MDAwNFx1MDAxNzZcdTAwMTYmobtcdTAwMTbDV/fYu7JGJJSj/nxcdTAwMTLCWP6mPdo34Vx1MDAxM3+7OfeN9SD7Zst9XHUwMDEzuEI8WoNcdTAwMTP0Mn8vXHUwMDAx+sjL0nnv/G//v1+Iw/x3lqfZXHUwMDFmanqIP8004Fx1MDAxNiW3kkzS7XyQ3ozYh5G+5Vx1MDAxZFbXM1x1MDAwZTnlPJ61alBGm9s5gzJM8y01MKvEqeY8XHUwMDAxK6fEXHUwMDE4J4VsP7UnVNGB6sz8NoakpDVcdTAwMTLKq5qxiC6sopyN5218p1x1MDAxMrzFXHUwMDFlO8yLn2o/y9ZLdXKuMF7jv9xJrK5Jsb8xUVx1MDAwN1xyS6hcdTAwMDdjnT82XFySPHslon2qpMMwXHUwMDFjw1iOybpcXFxyJYnyeE832Fx1MDAxMPnWO5w2itpcdTAwMWWAPTrVe3lcdTAwMDetgFUhV31cdTAwMDfJS0Nt4H/nT2Hs6sZT7Xv0NL9GzFeMlPLEXHUwMDBlptej4lx1MDAwNGK8rFx1MDAxY3vYXHUwMDA1o4J+XHUwMDFhc6Zk0bs79CTLXHUwMDE0XHSaeOMrvD+P1khcdTAwMDOcvYpcdTAwMDbJj7ia11x1MDAxMltcdFxc595i+dq15Vx1MDAxYiVbXHUwMDA3V8nTpVXcrV2mfGFWNaPpcVx1MDAwZVx1MDAwNPjpziGc5Vxmm4JcYlg2VuWyu1x1MDAxN3zLx1x1MDAwNlxuflx1MDAxOIE9ceqMXHUwMDA0KdeAj/BcdTAwMWYuXHUwMDEzXHUwMDAyWUl/s5dUxNkueNmsin+USd1eK0EtslxcXHUwMDFmXHUwMDA05ZPFXHUwMDEwSrRLMWuCrMX/PJNcdTAwMWN/z6RUtTbgXHUwMDFkp9tvivLod3ryklx1MDAxM1x1MDAwNlxidFx1MDAxZGBwjFx1MDAxNHHEmoqmhuGF3tZqIz1wXGbLrb/cniMsg7FG1Fx0JDBn63PqaICNKlx1MDAxMNdw6OdcdTAwMDFcdTAwMTdpuW4zUPppYVx1MDAxNeojhqX+uISYUUvM9udfuZGynmdcdTAwMDBcdTAwMGU6nDxcdTAwMDc9dah/eDQvY8HPe3yg/P995+z/vLM09ac7/u6N10qfbjo5kLCJXGaqX4xcdTAwMWbjU1x1MDAxNXAokOrDqFZrLIZ2R9z37+xgsrKKU0VcdTAwMWVEfkyZXHUwMDAzkVx1MDAxNo3Nq/umtq+Grmkyi1H5hm6D0GxcdTAwMTf/LmZKmk0gX8PGXHUwMDA0XHUwMDA1XHUwMDE53kf57zymXHUwMDFkcq6FIFx1MDAxN45cdTAwMDFBkddcdTAwMTPyuuDHglx1MDAxOcNdnrRt3eo4jIK8of1YPLyzOGlcdTAwMTSefHLsXHUwMDBinZi9jjCAgeOthc1VtcnDpDNcdDtV6arQXHUwMDFkv8Ypy3jpUeu9XHUwMDFj5nyQXHL1wJezf/pfXHUwMDA1Plx1MDAwZo6fVlSgXW9GkqlbRI3TRFiWXHUwMDFjv1VcdTAwMDOMXeDkvK6rTSVcdKRUdizf7Lv6Lk+gXHSPnLxcclx1MDAxMjdcdTAwMGZNPfJcYulo6OZcdTAwMTRpqMilXFy/XHUwMDBmxFx1MDAwZk+PiFXajyPEJ21cYoGv6bj+Yrw4Xv+O8UlEkd9cdTAwMWR5XHUwMDFlZ1x1MDAxOLnCXHUwMDFjNVP/vTtcdTAwMGV7+VVR2H5cdTAwMWVg7LUjkdFcdTAwMWXFtDgyXGI6J1x1MDAxYTGTedbLaF43NsFrTmHBWbC7qH/i5q2VL9aBqPT1prKce/gr3fFhUf7z7spZ//Puo/UtkFx1MDAxNFx1MDAwMpUn7iu3RffnXz+sP1x1MDAwZXQ2nyr8Overh4LejKFv0ppcdOBVy8SEXq+YxmePjVx1MDAxYtmD9rj5XHUwMDA2fce7QJ52Ncz49nZPw7DtSYpzQLsh5eCAXFzjTad/vMhP6+rsXHUwMDFmrbOasDBcdTAwMWb+Ych501xcKT2VlJtfVlI/j1x1MDAxNvp8tPWRl0/FJrFcdTAwMTf2uVNgXHUwMDE1U4GpRlx1MDAxNG9Y/1x1MDAwNlfocSlcdTAwMWa5sV/XXG5cdTAwMDcnXHUwMDE3XHUwMDFhsFx1MDAxOVxiNveRz95EaOD7waTGSPFilyWW+o++XHUwMDA08vlEZV5cdTAwMTVPOXTq5aP1NFx1MDAxYaYwRXlGxWNG0lxmXHUwMDEyqVek0qbZpntQ0r+56/F33ZPsYuEw40Jgi5Vuj9HutOjLxaKVm1abtZYlYcKSQPObXHUwMDA3XHUwMDFmb1x1MDAwZlNMXHUwMDEyJrlqn+5+XHUwMDE4v5pcdTAwMTVKT2K8bOB5bdFcdTAwMTJEXHUwMDFlJftcdTAwMTCi0fNLozUgZJ9NlJ9cIssr88T4YY6wXHUwMDEwwFx1MDAxOWGjyFPhXHUwMDFiskd8eeaR9kDIPzGPl4GWrsbOgotcdTAwMTZcXMJY+TBUhPJgSUSK7+RjUvNTXHUwMDEyfL8vXHUwMDA38sn54y/nu39y/m1xhlx1MDAxOCd0blx1MDAwMtaaw/Bf/fiebe9NkOZcdTAwMTHk0O1fXHUwMDBlSLXYOyiG1UgybMpcIk9MiFtcdTAwMWJHXHUwMDA2UIDQ5o1cdTAwMDCTXHUwMDA0p90yK7/UOHwuUTDXXHUwMDA0ulx1MDAxZlx1MDAxM4inuk2BOsjuZVvKQDeNMvPr8+V5jpZpXHUwMDEyVP3NO027XHUwMDFkXHUwMDFiXHUwMDEwmGg1gadcZir63PKk+9Rt2jZcdTAwMTH2XHUwMDE2+FwiTFx1MDAwMIJMg535gGKFr54p64XMktynRK+I2NAtuWaQXHUwMDAwLVx1MDAxMX9cbpYqk4/RiY7ta8G5dp55zj//+bK3XHUwMDAyzoaSkaT+XHUwMDE2g6f+kNhgXHUwMDFicit/mGxcdTAwMDJXUqOfqlx1MDAxYYfu/8y95drgsJMovM/Hnlx1MDAxZUnHrvTCRi/jsOqDXHTE6fFcbpAp0SiNur/vd3/Hh02V2i+1JUf1RafKrGFcdTAwMTn7aJfjL4VcdTAwMTDN1Z/Oq//SeebDbFx1MDAxM1xy/+5EiCxmXHUwMDA3XHUwMDA0rfqulqz8Lv1cdTAwMTZcZsM3VVx1MDAxOCVcdEjji1x1MDAwNXGwzDLuXHUwMDFiS+K+XHUwMDE3TCbzqz3WQJDMXHUwMDE0SMnrvYXF70vDM23vjmW+XHUwMDEyIH7Q54m7hzM0gjc/lcwkWa547Fx1MDAxM/d7Vf5cdTAwMDK+XHUwMDE42KdcXHQ02iqvrd+Bo+7Q4qRcdTAwMGLbZT7Ikm3NsbKPJT+RUHpXtoKqdaBcdM3bMbb6Slx1MDAwYm0tXHUwMDEyXHUwMDBl4biyhGk9QkpENnVcIrK8NGq+XHUwMDBmep1XKi7TR4Pg2HeqpX8oWlx1MDAwN6l+V6rHofu4VyV/7TnK/6c9v/Vm3UZTNFx1MDAwNuCNq4rzw/lS1spfuO2TT1Fqw1x1MDAxONc4XHUwMDFhv+4lO1nUO55cXFx1MDAwMLBy0FxieVx1MDAxZGL+i8Evb6aHjonfeIVL1C5f3UOOXHUwMDFhXHUwMDA2SsvJ5naIQbpcctHsXHUwMDEzXHUwMDBmYbFcdTAwMTVbNNR/8fAy/p94oExjkXteuynNzDtcdTAwMWRmOdzrTJ33uZE8hN9hd+E4U/tcdTAwMTFLZotJK3VfR5POdVFcZkma+2hcdTAwMGWFPZWSk8kmuDveLqd8YixjrGmpOL7FkpeJreglXHUwMDE56rmyl/6BWeWPv+Ah+oe/RMZeUNFcXG5cZkvRx7LpTPYuoY3VXCKKYENcdTAwMGaI1YPKXiyUcnSi7GpVXHUwMDBlyWQ/eVmHU9xdajp7XGJosftLvlqXXFzsQOYmMLartn35XHUwMDE2XHUwMDExUqpccmFcdTAwMTRcdTAwMDN8NpBcdJmKdqU/pk6g/zI167BpnM73U9J7wKAoXHUwMDAwXHUwMDEwXHUwMDFjtn+8szadLb8rRlx1MDAxZtCIp1x1MDAwMOo8XHRI2j2w3fcpXHUwMDE5Wlx0wvKFnVhcdTAwMDJH6/BcdTAwMTh5XHUwMDBiIZfLXHUwMDA3VOZutDCpPFx1MDAwN9IzQsDZhLWv2VV6L2HGPePBnrEksJD9q1x1MDAwYmX5sHfZgO1jXHUwMDExnPJcdTAwMTmcirThdSboplx1MDAxYYDkQX9zco7Jm9wvp7tcdTAwMDRVXHUwMDE03apcdTAwMDRUK1CVZlOkulx1MDAxYiRBWm3BxmYoP5yfzz0oZVdjklT+zrFHdvZcclx1MDAxM/psrCUpRFx1MDAxNDug07coIER4XHUwMDFhnoJ0k84oVqrgK4fyfV3Sv/Nwh4etcOXNmkTib1x1MDAxMOltr8Jj5NH4pCaJdILwvSN93qXzIDI+KN+yR6Zoa1x1MDAxY5fmvid+JTdcdTAwMDBsT5b4tHLhqoZjracpg9rv0KBaxyxsXCKKXHUwMDE1kipXkP/80fCPP1x1MDAxMkbR+KKx97vSXHUwMDE1yurYpmCe01x1MDAwNEWLWmOG291cdTAwMWHei5P7Klx1MDAxNfYhhevvUVx1MDAwM43VVr5hX1x1MDAxNslgNlx1MDAxYaVBKZqChlx1MDAwNd5o4qt3o1XV2HNn33Y8/1x1MDAwMvQ7ITnFa6ie/LFxeFxckM9Dws/zIMb8rzFcdTAwMTBccsP1iIKSPEfaXHUwMDE3XHUwMDFiaJVcdTAwMDdcZqxp+mxtNLKwtFBM81x1MDAxNl/LXHUwMDExYIVSXHUwMDBil+p7Uszs9qq86sRy9HzNOi2F71x1MDAwNFLnK+Qu6anwWNzGLyfrkttscoQ3kPRcdTAwMTnosPit1XCSXHUwMDEx9f/rh4B/MUJTZFxi0K1cdTAwMDClu6pcdTAwMGVcdTAwMTRGwSZu+tOr3Vx1MDAwM5xwfFx1MDAxYokvtrmOwl3YXHUwMDA17jx2rnKEkV5cdTAwMDVs6s0+qlx1MDAxZVx0OUxcYlx1MDAxYfZaKFx1MDAxMJ34ap1PXeaubFrXWq7Ak5k9gpCpplxmayB7Rqq6hvHzgV34L1x1MDAxZtgyuVx1MDAwYlx1MDAxMFhcdTAwMGLnkzcumVhthqY35Go9huSKq1x1MDAxN4qpqUVQ1EPaM/Gd3l28NF9cdTAwMWW38qfUzVx1MDAxOTxcdTAwMTVA4M1kKu6RXHUwMDFjlOzHlXOYXHUwMDA1NLhYw1x1MDAwNqReqVx1MDAwMmxcYjhgXHUwMDFmXHUwMDFmqWxQ8Fx1MDAxM0cphmgu/1M/+H/5hKd+zE/92E2Ajl/sXHUwMDBl1cKjleZcdTAwMWL2UVs+mNpTblx1MDAwNpDOJW+/85XGv1WZ/qmayshcdTAwMTja8Nq6tDjvXGZ70lRoleNcdTAwMTJ4elx1MDAxM6h30WpDTOR2K+OaXHLD/Vx1MDAxOPPyw01cdTAwMWXC0SOq/c1cdTAwMTEkXjH/71x1MDAxY1x1MDAwMeewqk3ONuU94bMvWYNcdTAwMDCeXHUwMDA328P6Qax40uuAfUZDI+iXP56J35NcdTAwMTW06ibKijGbSk9cdTAwMWSLnFx1MDAxMFx1MDAxOfc4fZBcYpQo36ifXFx4gTDC+vC+88NWN7Rcbm5cXMZ9zyeEaMZcdTAwMTf9mlbY4FwiXHUwMDA0RjFTOTYysLr/xbDWb2FcdTAwMThqomgjXHUwMDA3KVx1MDAxOFiec6n55UhcdMDKJsuqwns4KUDhb8p++Dx/12Vny6ajbaXkozRcZkyOX2FyYa5olzD5cLZzXHUwMDFl+fq9gGJPXoYnXHUwMDE1RvzElGqU0Xxi3I+jYsY9cezIrUFlPkYzJE5cIlNcdTAwMTmVIZLQPyxnXmLqPvmOw1x1MDAxMeTdb+uc/OKislxu3+J23F55d1x1MDAxYZDehlx1MDAxMaNcdTAwMTXXx5y0XHUwMDE0yuKDvD+h/c5cXK1wTaXZv6BfwSGo1ll9o7pfXHUwMDFmx0d5y2Y/51x1MDAwZX4kbYJcdTAwMGZcdTAwMDTfXHUwMDEyXHUwMDE181dT7X/V1GZgXHUwMDFl7akyyd6A49tim3Ge8VxieW38TmHpXHUwMDAx02pcdTAwMThcdTAwMTebXHUwMDE3vYNQ+PThhSBcdTAwMWaxQuY+I/8hLGhtL++363RcdTAwMWO7pmqEWZxcdTAwMTM5XGaQk5ZBNF2S/sRcdTAwMDEvo1x1MDAxYf1JwVx1MDAwMyFk/ss5fKLZivFcdTAwMGZXT7/1hXBFYyno8CXqXGLMN5Y69SFgfEE+fV5OYVx1MDAwM8CA6TfzK6XmKXLwdPVu8q7yJ9FuxnSAQuUsidfvXHUwMDExRlx1MDAxM1xcy1x1MDAxZvtfKO1eXHUwMDEwXG78TpzMflx1MDAxMS36u1x1MDAxNFx1MDAwMSxyobfWpWhwhzP+5rJe/41T3vnNZXFgT+OoL2pcdTAwMWSpvlx1MDAxZVro1lx1MDAxOT2zcJ+SJlx1MDAxZlGsZNVcdTAwMTTm4VWb51x1MDAxM8n6XHUwMDE4MdeLnlxi5oS+ZsQ+v1x1MDAwYiZcdTAwMTBR7zh9a0nnTFx1MDAxMVx1MDAxNsDycTZP9cnJZoi6UUPfOqBLVzqkNMTsqDD86Xn8Lz1XXHUwMDFmPa+7cYtT1ILMXHUwMDE3hdpcdTAwMWbNd4ZZ9IhujGFcdTAwMDTcXHUwMDFhoFZcdTAwMWWRy1x1MDAxM41cdTAwMGaf/nBHXHUwMDFljbt1yFx1MDAxZXfDfkwvUmf3IWrJWspcZlWWlcs07oO70mRcdTAwMGUlZ8vXLim5nOtcdTAwMWVcdTAwMDC9UvJcdTAwMTlcdTAwMWIxOGw2m5S/moap/D81jcE4qoYlXHUwMDFhwFxizH384Vx1MDAwZVx1MDAwYlbVb2jo8cBcdTAwMWGuiVx1MDAxMIxcdTAwMWXcxmfWp/B0XHUwMDFm5quRL8Zuw+laSVx1MDAwM318R/0kz2tcdTAwMDBcYq6NjFx0XHUwMDE2XHUwMDFilomT35EoOJy8bOzlXHUwMDA2h5gvmpqYKWPxZyRB//F8/X8939VcYkVcdTAwMDZcdTAwMDDbnikgXHUwMDAzXHUwMDEyXHUwMDFkfE5JXHUwMDA3myu3qXZgPHZcdTAwMTjHTm1+75FWQvLjXHUwMDAxXHUwMDE3NMsp5sUmJWukXHUwMDAw8vuW42tcIjtkLyTub6sjXHUwMDAxwCtZXHUwMDE5MC/3Ka5tXHUwMDE3kcBFOk/qxEW2RdnLRVx1MDAxYn4w8u39N/dxXHUwMDAw//JBfCEhPb747HtcdTAwMDd928LQMlx1MDAxN88njuCHfMYsXHUwMDA1XHUwMDBiSmfdTdp7YdpcdTAwMWTzzq4se0xcdP1cdTAwMTRCMChccsPUaFx1MDAxMa7S6yVMXlx1MDAxN63jW9kllog3zDOGOlx1MDAxYb5cdTAwMWHJolIvPHX89Vx1MDAxNI4/5uT/zZxcdTAwMWGTbOlcdTAwMTh76Fx1MDAxYVx1MDAxN1xyLJ1WXCLjLa5FdVx1MDAwZmMhVZ5cdTAwMWadXHUwMDFju9yDcYJavtzR6N53hpNIU/jfXHUwMDFh8qBibymTXHUwMDBlg6utZFx1MDAwMt9ZUli8yqij9clyXHUwMDEynvzMN+nfJcRhezdb34BOulx1MDAwMVx1MDAwYitcdTAwMDOJLjSg+/5jv1x1MDAxNPrvPFxml7DbpO0gRkWj/aX23lx1MDAwNo9zKnvd0tEwIJToxaHxXHSmOudqX/guYXHa2XyaV0TrR2wn4rlcdTAwMWbzT8PpzY567zMwSjb9gNtcdTAwMDZu7OHDulx1MDAxY1hNjdr+OezxN1x1MDAwZTmdPj9/bfCcf/Fnwq6uXHUwMDA2JlSm1ciY7GJjyCvEJnHW+bqFxk1yWFx1MDAwMyqG2nd8POa9XtpcdKQxQylcdTAwMTbCWWUpXHUwMDFlhHRcdTAwMDPtUOdY8/DN4PaPn1x1MDAxM7+hun4rMbmIkH+vuY3CRCyNk0+RUOXaa2Ge7n1n06dB/rQsVuZ/tGx7+plcciH/0bIykF7jRp+kavlcdTAwMTW6XHUwMDAxpM+y3Gs3kC96XHUwMDE3mKr3nNig6bSaXHUwMDE45+ZMX23+ISPfqcBcdTAwMDKLLdLH3su0SFxmKrW8/f2Vdd3sdYQndFx1MDAxYqjqXHUwMDEwql5o3UfWz7Pq/VaM2dD8x6Ng/4qXjcnWXHUwMDFjz79kXG66aJriTVx1MDAxN1x1MDAxM6nTp3i5knhcIq5cdTAwMTUhhao1dUijXHUwMDEyv/u9T2onvaG5I+5Qt0hcbkm5xvhcYtf6nfSR3aX1vMbsXHUwMDE2cIRcdTAwMTmD9Y9cdTAwMWZiZ9uWmUdDtHIrd4fv+b1h0ilC4Tf4/P/6+G/xRbKB/+3xIN2Hw7WAtl4+ol5VuVx1MDAwMN+KL9j3+er02VdzXHKZ6ce7wseNWlLgTY2ITLTweDfpRFx1MDAxZldcdTAwMDe+2TyNtVxmKcT0rIO320Oa3X2PVDJcdTAwMDGX3lxiXHUwMDE1XGJ4XHUwMDFlfTFcdTAwMDedWMmfb0qH1z++qWdcZkop2y1F8p7FR4rPaFaQ3WtYXHUwMDAw8psvXHUwMDEwnVx1MDAwN3yJyz5cdTAwMDZcdTAwMThbjJ5cdTAwMTjFl4TxwdGcyzd0R3hbXHSwJ9+4xy9t3UVyw9uenmq0v9gjXHUwMDA1XHUwMDA3oO7T+f19dHVL8IN4PzVP+Kt58r/ipFx0nrDV7ybidqpcdFx1MDAxMJNqxbdwW1fP5u/ZXCLbnqu+WXpxMVx1MDAwMFx1MDAxMIck5rhcdTAwMWK8ekNjXHUwMDBlZptIlM7NJPL2IVx1MDAxN6ZYu57BXHUwMDBiZCBcdTAwMTWg2iHV+4bOxqmTPLrlzWTReTZy7YnLv/ms4WD/mUvkm/ckV2HJ8vu8XHUwMDEzLHs91lx1MDAxOVx1MDAxN6whvDFcbsG/8/7C5q6JqWv/itexfPWDI8dcdTAwMTZfKI3nr6wg10aldSvBQFx1MDAxNcuR9zGv+oJcdTAwMTlcdTAwMTRUzGtXQZ1cdTAwMDC9q1xyjdc90dnEaGrKU2nypeBp2ahP0UtcdTAwMThsIULb4rdeXHUwMDE3+chkXHUwMDA29ZDge91dXGLMc1vNXHUwMDAxM1x1MDAxYWRWdMb16K+oocWbNmAyklx1MDAxYVQ7Q1x1MDAwMeuFY1x1MDAxNpNV/zwvXHUwMDAyup/j1TLgXHTkxIUuXHUwMDBmXHUwMDE5//YxK5PiXHUwMDE0oZlo5iZcdTAwMTiG/bhBfEd56mnu/IxPyaPf3iq0yqmOkkH55maXp/ah2MBcdTAwMWLf9vFjWVx1MDAxNotcdTAwMDOtdqWh82T1XHUwMDBl/Xg/xDVJRJy6fey7t+COPmnxSZdlJJ254t2Tf209XHUwMDFl5CsokjtcdMwny+Hmzen2itpFXHUwMDA234/gaS1cdTAwMWR4PTn+bjWEL2lDX81Af1x1MDAwNuIvPmLF/ld8dMF37dJcdTAwMTE7XHUwMDE2TdeNoVxifF7/xsGXQk5N6OTT+saemS1gXHUwMDAwq5Y0M07OiiTAaTtuZZ62RemO34sowGktU7nrXFwvst2/XHUwMDAzRG3zhFx1MDAwMUE//vZq42/dITf/XHUwMDA1f5+iL7LcM1x1MDAxNmzDYlx1MDAwYlx1MDAxNuq48Sp82V40MKpYXHUwMDE1JUlcZm8oguK5xrw6hCvWyVx1MDAxZVGLi8JRnqMo0+7hTrLtLKrDcbklm3uH+1x1MDAxNKX+ZT+0zFx1MDAxZVx1MDAxYUjQZTjVXHUwMDE09ibSiII25+KN9S3hKC6dlJkuaZJ4TzzAaWNLviD/xYb8T2xwXHUwMDAzy7xgSttX0ofFglxiQWnPt0/3+rXDXHUwMDExL22811x1MDAxYVx1MDAwMvY5gqCoXHUwMDFmXHUwMDAxgD+4TfZJiJ5cdTAwMDVy8VxueX1Dedz1IKdlVGdcbo/7y5Y0V8+3oXnoRViqeNB63aO2sElXvJmm/ihcZllcdTAwMWJVtjnZ/6wz/TdvOEee9DTT2HsjkXJcdTAwMDVcdTAwMWSoXHUwMDBiUNNixW4oWehcdTAwMTOlmuOkMu0vIP2bi77hMvdxMIj6XGZsnlJcdTAwMTErkOG8SL9wuGKOl5XudV5lXHSWJOM5jnZcdTAwMGJy2Vx1MDAwZl6FXXhcdTAwMDL4Olx1MDAwN8jm+sdbLkiYXlx1MDAxYyk6jr/1kCNiNkl/8YTLXHUwMDBloizA33VcdTAwMGZhXHUwMDEwpG//1Xd+euJcdTAwMDJcdO5cdTAwMTXWYsynrFx1MDAwNGHP0IJQ+ZvjpPfsx1x1MDAxOGovXHUwMDBl/TlcdTAwMDRWtI9WLFx1MDAxNrg0N16/cjm4ekeQlSwr42JcdTAwMGWNMFx1MDAxNWRO0LPRc1x1MDAxZFx1MDAxMJxcdTAwMDAs0MGeVVx1MDAwZVwirNjm4reqXGJyMXWGvzZhkfh/27TtO4newVxigJS1JVx1MDAxN1WTl7S6XHUwMDFmT29cdTAwMTBcdTAwMDJX9Fxu4ud3KeQv91xitaeuWIdAXHUwMDExUHzDXHUwMDBlzcR+p6OSVFd0v32rQFx1MDAxOD5cdTAwMGVcdTAwMGJg6JSMv3OnlIpcdTAwMDCWvT+RIFx1MDAwZr8ntlmRQUnYQtJl4+hcdTAwMWZoYX4xnGNPm8DzXHRkYzJcdTAwMWRcdTAwMGWPcZizhK3bQapsaGa4gzg4yal0yvi9wXDpKOPDiGbPXHUwMDE3mFx1MDAwZcKbxp2p9dZsdflcdTAwMDRZq9LhXHUwMDFhXHUwMDA2eJhnmU1cdTAwMDSIM1x1MDAwMXWtfYW5XHUwMDFllVlcclxyf6D7WFxuL2y4RF1FVir8bPymVS3u/M1cdTAwMWTWPPqP/2xcdTAwMWb/XHRcdTAwMTclXHT0KdWW+lx1MDAxOW02M03GyHV4zHrMwcYt8LDxsJSnyVx1MDAwZqKvKNP07Vjp0H5rYlBO2Vx0vI/uPW/hg8/AlNfjPjXMZG5BfFx1MDAwMHqtXHUwMDE0QMlcctFccudMSc5BVep0Tv5nTUFl5P/2ifWQzm1cdTAwMWPSQdFrTYbUeZtq4fNj+7uw1Hs04VwibCVcbu9cdTAwMDZcdTAwMDVcdTAwMGZMreWMQO1cdTAwMTfuXHUwMDEwQ8RFlMTBwlo46YicXGKTcnZOot37/Fx1MDAwNlx1MDAxNu+rblxyuljrvjy1ST1cdTAwMTQuhi7sTLDJsMQ7J8jCiE8sWsrjQ1x1MDAxM0VP/ldzP7+ruTjlMVx1MDAwMUdcdTAwMThl9Fx1MDAxZcfQ2deiMI3cOpqXQ5RkIMuTqETx+J35XHUwMDAxU31cdTAwMGZb+c2PSLws4acoSlx1MDAwNkC2XHUwMDAxSytLRlx1MDAwNrOgl+DFrkiiXHUwMDE4gPspSPaeqCaDK1x1MDAwMOaegZZcXFxcjZ/S/CBcdTAwMDPedqAuZ+T1XHUwMDBl/J5cdTAwMTidP2a5IP1cdTAwMWZmiYzvRH9cYnJcdTAwMDG1Om9B3lx1MDAwM2xNJ1x1MDAxY1x1MDAwN5tIy106MM9cdTAwMTahXHUwMDA2XHUwMDFld/hcYq3E4kBcdTAwMDM/uVx1MDAxMsetfyDZ/Fx1MDAxMFx1MDAwMjFcdTAwMTNcdTAwMGKp0WNcdTAwMDZcdTAwMDGE/NPsUtfzjj6DNlx1MDAxNc3KXHUwMDE0zKV7iD9vwMcsXHUwMDFkcOI16yBgXHUwMDEzMfEyqrlcdTAwMDPz11x1MDAxZeKfOfnyMctcZrFn61x1MDAxNKFro7DcM26sylx1MDAxM86E2ZLH41x1MDAxZWK/pLXDXGarNupcdTAwMGIwlPqzlJ9t5MWgXHUwMDEzf6dgfoSWndtCfFD0INP+nNDM2sPBvIzxVeyyjCBcdTAwMGVpJ632XCK+j0tcdTAwMTmn6IH+315OXHUwMDE0SFx0tHksXHUwMDBmXHUwMDFlXHUwMDFmKc6Vtv1cdTAwMTdTZ/hcdTAwMDL+Z52qeKSbL1x1MDAxZs/HaEZW2JV7wqFcdTAwMDaumKiKLGOY70p1XHUwMDA0yE60+sFeoI+QdXDkxOQ5pXUgmzdgT7FcdTAwMWRFQI5NPLYv0tK5nqgvbzPQhuDgXFwhxlx1MDAwNVx1MDAxZUuWXHUwMDFiyFx1MDAxOalcdTAwMGWNL0BQXHUwMDA3XHUwMDA2sstdynvGguBlLGvx5K+/0P/Ob2BFwFx1MDAxMjxcdTAwMWH+XHUwMDBlUkpQmsWUM+GAWEpcdTAwMWVmXFxcdTAwMWb6jN+L0GAjXHUwMDAxXHUwMDA1+X0/6YNcdTAwMTXOW2O/8WN4JrfAmJXUx/pcdTAwMWLBuWqg9Vf4mMP3SDBhN8v6QqDbUufp6Px7oTV0rfW5X5N9YVx1MDAxMzf5TFx1MDAwNK95/7Om0v2/7Vx1MDAwMVx1MDAxZrhcdTAwMWSIzFPSnU/1YaS/LkekaDzzqrpPxp5steNB2Fx1MDAxYYdcdTAwMDCV1Fx1MDAwYq7Cclx1MDAxYjNqrWGPLjTmcjmB/lVWpCfsK0FsUl8jciuqrFx1MDAxNVxuxpL4ianZXHUwMDExiHyMSJbvRe2iW2Tx2InMot+p81x1MDAxZva6LOl/6it7cIdcYis1b6AoQNtbXHUwMDE1L35cdFVwh6BcdTAwMDa1VS+OOJ+cI4j+a05ZXHUwMDA3rtvEXHUwMDA1ordcdTAwMGVcYkQyXHUwMDBlXHUwMDFhx169gIqFpuuxW0xVSJdcdTAwMTPGKb+Yu4JPXHUwMDA1XHUwMDA05Fx1MDAxZVx1MDAxZlxcKlIvXHUwMDEzXHUwMDA3jXmBf8jg3Yj06lx1MDAwNH/tMP9POyT4251r7MPLyrfUhlxiwVOGXHUwMDE3rIzt+LvkPstzuPA1XHUwMDEwgCdv7eaOzb8pUHlfXHUwMDEwbPfL4a1cdTAwMWY+SSvaWESGgzr7XHUwMDAyrtpuant7lVx1MDAxNWZO+lKH14x9Utl15cH2XHUwMDEzelx1MDAwNkhXcWL78uzrVjp88/f79lx1MDAxMF87LllDk1CM4VP6z3wmUsT/M0+UsCorWjKdwjRzU23L36q3XHUwMDFm9VwiT/FXNLHfxnBBkFx1MDAwZjtNQT1+sl6dfrtFQVx1MDAxOVx1MDAxMHHM4r/u62vzsVZcdTAwMGaA4uxUjn6i6EzIuuhfUUrlLP19K6W1aopcIlx1MDAxN4W2epD3W1x1MDAxZrbJXFzYVpyFPydwPP7znOdBjSPZ+M1RXFzeP3NcdTAwMTTf6l1IQ35OX5ODNFx1MDAxNtNcdTAwMTOBmTbsskNccsBlmopcdTAwMDToO5RcdTAwMThASSXmXHUwMDFlT3GW/Vx1MDAxNsLIXHUwMDAylHVcdTAwMTlnSa/JiI1cXHNpN56MM47bjlx1MDAxMnj1lfgtnq5sd1RQ42Pi+V9cdTAwMGXb8lk3XGZuMNLbucWbM4RSe5hEeb20/9VcdTAwMDNcdTAwMDFcdTAwMTVizpbvfENiqf4upDhcdTAwMTCnQdzFmrw1d11cdTAwMDHfuHC6leA16WNidiOiVFB72GC/XHUwMDBlZY37lElcdTAwMDN+8kjUoOXKXHUwMDE3XHUwMDAwfsZcdTAwMWVdWtWBwvQxqFx1MDAxZEM+qn9ccunnau30omJUXFxI/WWXXHUwMDFmc9nOPLLxO1x1MDAxMZ1Buekk/uOTM5L+l0+OXHUwMDE3JLgvzvVccoWPXHSOy9nHd3XYXVx1MDAwMzpgsULp58fDXHUwMDAy9mH2c61nvyu5XHUwMDAw1Pxe154pniNcYo9lisKe/lrU8IHxMZw7m0WvlvtcXFwi7XNKNGViIDqb+MJcdTAwMDfoXHUwMDAx3Fx1MDAwNFxm4j74zPlo1JSRYo51gDpsXHUwMDE2f9+OiU9h/c+agcTEjO99oN/jVClG/Fx1MDAwN5SSXHUwMDFl8mTRTaS5V5tcdTAwMDUnMIpcdTAwMTDCL7q9S1x0QINK6kFcdTAwMTTXb8qAI9fpmVx1MDAwMpOHe1+SOVx1MDAwZotvWFx1MDAxYlx1MDAwMcqqY1x1MDAxYyNcdTAwMWZBXHUwMDFhTXdVykfGR0jMlqfFo1F2rfP8OCGSvqFcdTAwMWHcXCLP/UNcdTAwMTTmKaJcIilXr1x0M/601PjHv/OF+bdcdTAwMGVfP8HhljVcdTAwMDGWpCXHY1x1MDAwMVb3gHjJXHUwMDFh9Vx1MDAwNiV6r/dcdTAwMWFZXGKYXHUwMDFjTI/fVP++Yi9xXGJ17a1cdTAwMDMj4FBtaVx1MDAxYzosS1B1XHUwMDFiflxcXUToXHUwMDFl/Vx1MDAwNJpqN6uBXFzEpVx1MDAxYUjJXHUwMDE3Wa+2iiCYXHUwMDE0pvHvq1xmVVujXHUwMDFhXHKbMC08uZfPMmz13biER5cg+F+m+VtPXFwl98m2eaqHLCY3lmUnXFxcclx1MDAxY7I2vYEk38xRTlx1MDAxZnysJaZcdTAwMDKXXHUwMDAw35HxYU+D1OxcYiWR90bgNpvk2bRcdTAwMWbveHlBr3nrPmZFKWXzfYxVXGLybPbQ/2xv24BStyjJavqGP/pMwcpjzP60Nl/Vj1x1MDAxOauL+KrA6jVi60tcdTAwMWPNP3+XKPL/eohCXFzeXHUwMDEz49P1TFx1MDAwMjZSOXuJoyR9TuP0hT9g4tSIqWDg/na1OdriXHUwMDBl11xiyMNfQNuzeuyPjDdHueuGXCKUuD4qvTx0o+f4Rp5i3Vx1MDAwZvFcdTAwMDCc3Fx1MDAwN1x1MDAwMdLc/nxcdTAwMWFQmpZuz3bT+49nXGaV8yFESsmDaCRSZOle8kbeJ0ZcdMQ7YpO3XHUwMDFlIyRZe2/ts5ZMxVx1MDAwYp/Z/1x1MDAwNPvKS6uNXG6oYo9gXHQ/MqKdMPP63dVcdTAwMTjKhiNcdTAwMGLZ0ZMg8dtk5qfd01kguVx1MDAxMm751eNP67H659S9olx1MDAwNvrEXHUwMDE3z2zx3TZcdTAwMDT6S7/wL1Xlyef8hvnsTb3g/Vx1MDAwZXZFtEj/XHUwMDEyKFGPZN+1V3xgYMVPaG5oXHUwMDFmlH24XHUwMDFkXHUwMDBm7a7FlZk/p8CTSiNaXHSTyFx1MDAwYkFKRbX8TNPZcPTgdlvAv0lccs0pk+qEMOVR1l38y99UXHUwMDE1voPXuOFF9zZfMlx1MDAxZaKJr4OYiEHGf+6ayvxcdTAwMTBS8zQjdX0ggSRBcMvaXHUwMDFjUsDB6D2xWjdcdTAwMTifTfjIZ1tcdTAwMTBcdTAwMDE+5zZcdTAwMTfYPo6nvn4+XHUwMDFllG/NqXC+ZOW3mFPtXHUwMDE3eEmU2sFq76V9hEE5OPFcdTAwMWZnl1x1MDAxZHswXHUwMDFlXHUwMDAym3bjRTftXHUwMDEwJ1RTK/gndFx1MDAwNDBF2IZcdTAwMTCBhFx1MDAxNaW3abRniTVcItM+79RcdTAwMTBcdTAwMTGY5d1cdTAwMDXnwH0qL7bGXHUwMDFlR9DUT66yXHUwMDEw5VgpPVx1MDAxYfq7oVx1MDAwMjRE0irq2XZlkOurQ1x1MDAwZe5cdTAwMWU2zP9dPVx1MDAxYiVC+y2+JaXpMVx1MDAwM6DoXHUwMDBivlx1MDAxNky01uhmkEVcdTAwMWWRbFx1MDAxOL+QkzVH7Ks2Qi+hRKxcdTAwMWVcdTAwMGY1lD7SXG74vpVrUoOb91x1MDAxOWBcdTAwMGWRUiSAzlx1MDAxYyZi/NAhXHUwMDFjdlx1MDAxYU9TXGIxj3T9XHUwMDEyXCKbXHUwMDBlXFw2+HwqOVx1MDAwMj5VZ2vJ9j0zMezFMtd+ZydcdTAwMDCPimxojEy6wM3FTFx1MDAwZbjSyi/my8E9fFx1MDAwMJhsfnRcdTAwMTNT4tfZdaWhMVBcdTAwMGXrdkBdSmJcdTAwMTPtqq5X+yT+u1x1MDAwN/hJ54Bi5CBza3Zl+OZrbGHZm35fOvI2XHUwMDE1WZtwOO5ION78RpJzoKM4Qy5cdTAwMDTmgV97R3dcdTAwMWbJXclHnp6QXHUwMDBlhpFcdTAwMTn2bVxuorO+k7dcdTAwMWOyzma8X5PE2dCsK6L8XHUwMDFk6pdHc2zT7nCvh19cIqtcdTAwMWZ286CjIylw7EFEm1x1MDAwMdfh5iZu8a1vXHUwMDFmhs1cdTAwMTSujlx1MDAxMkBT5WRcdTAwMTfGK/+YOYKEXG4hWqfIddzytVx1MDAwNqpJ9mTX39D1spRcdTAwMGVL+rPFxz5ccrwzUt5cdTAwMDLRK21j3qKVXHUwMDFmyjeRJyhjyY3cIMxcdTAwMWP7XHS6weDqyiFMi6FcdTAwMDTuvjUuXHR+56L2XHTqXHUwMDFhroh0hDa4UUb9zX98z3ncpjavdeT5rUps83R/dosgjbbC6HWp+cnFza/MfoxcdTAwMGY/sKpF43L9IP+wwPsrrjlRJ++AloM5e3EjpFx1MDAwNlJSRlxycadcblx1MDAxNFtcdTAwMTG+78H3SFtVuFx1MDAxNTs9Vc6pm5rSLCx248f2YF6qf3U7XHUwMDAx8lwieLHsKJjhMZmZ69ZcdTAwMDGt2aXSk+6Hcbatm7p+XHUwMDA379V/mVn2sVx1MDAxYS5Fto5YZ1x1MDAwMtuk2vP5XHUwMDFiXHUwMDEwoT1cdTAwMTEpT3w5uzesw6eNO6OQoFx1MDAxMEjqVFDQnX5yXHUwMDE0XUmCe81WeLOfnlxugopo7Xf1ksXI/yDtY6qpz+aV4vLBvDhVNWdo0Oy8cuQ7UUYwXCIxyFx1MDAxMt1ygtr3odnj7kGAmj9X99Y6slx1MDAwMVx1MDAwYsFcdTAwMGZcdTAwMTFr5jLxiVx1MDAxZpln5DBF0Fx1MDAxNfRpuNnDnKpcdTAwMDaSXHUwMDBlycYvXHUwMDFjklx1MDAxMjRO5Mxd9D+m3aj8XHUwMDBiXHUwMDA3zMeLi095gFx1MDAxNpBGXHUwMDBiKsevuIOWXGY7oVx1MDAxZKRnlVx1MDAwNJuaTdsy96D6/eUzQa8keI5lXGK9XGJcdTAwMWPyXHUwMDFjiIeT5Otti0COpIB2wFxipS++61v+q1x1MDAwMVx1MDAwZSSZULJ90jDVzmU+WajzOOix99tcdTAwMGJcdTAwMWVonmw6YyWQlfRcdTAwMDVCTiiFXHLUXmjk/HagO1dMJIgwUuYwqEVCXHUwMDA0V4mzuYg4XHUwMDFhflx1MDAxYi05nExAKKNTK0Lp9/hwXHUwMDFjNN+ZXHUwMDA0PVx1MDAwMzdgKWR6OEbsQtB1RCWOLMNcdTAwMThcdTAwMWb5w2okPPGzv9VQzu6Pm1x1MDAxOcztd9Jm7dKTXHUwMDFlisxwyVx1MDAxZr5lKj2nnNsn4Tb2SLrXY1x1MDAxN3Gpwlx1MDAwNlKf7Vx1MDAwMu02KbEwiWhbmVRcIqcuXHUwMDAx9VxcaXzEde9mXHUwMDE4vXRseYx+SnhyXHUwMDFhLr1rbFKv67VHplx1MDAxY7l8TJGXXHUwMDAxRW37pnVojDq8s1x1MDAxNatKbCBcdTAwMTjJ6IqHkiyGk8VxWMGkpOCquHg0bIq6e4z8Nn2jloh2XHUwMDAx2FvdYlx1MDAwN1WpUMeC0cGGVPhcdTAwMTfB0JqUPIBcYpHfiX+Tc1x1MDAwZpMtdDWYNU0mhzKo9kfe+zjwPbXfZzbSYVwiXHUwMDFktp/3XHUwMDE0zr7rvVhK3mSE4SbsgtSV3N3cRqlLXHUwMDA0OWKuJFx1MDAxMCtkVjVUVF1o8IR6pSaoV3mb61x1MDAwYpgzgTqp9WuBYF4hdueOuY9TxNXDmHa+5ydcIlx1MDAxNncjXHUwMDEyXHUwMDEzJME5jegtXHUwMDA3c3DPJDTZUVx1MDAwMEROcUZa+FSqXHUwMDFh0IRey909XHUwMDAw+vZryvdp3Fx1MDAxYolcdTAwMTmtMqiWVNOBPuSWxcXOslx1MDAxN9hcdTAwMTCXS/hCRW6TrVx1MDAwZZs9XGK+XHUwMDEwxniAnmTytd33/qiboE5UXHUwMDFm77y7vOaN76DDKzfaiuF5or5cdTAwMTJ1fN7OJqH1uK1cdTAwMTb2XGLSmjSt31J3a0+081ug4l/6XHUwMDAztNu4mkBcdTAwMGZtXX4roC6dnWNmJHTN3Vx1MDAwMVx1MDAxYlx1MDAwMPCouVx1MDAxNlx1MDAwZlwiXHUwMDAzP+rUr1x1MDAwNLz2XHUwMDExzI6PTjCe7lU6q03qZLvTVZc0cZ5aNcF0TcRi6adB08qnaWxcdTAwMTRcXH1LNLEkQOb0jlx0tTPPRexhXGZVKiFcdTAwMWM8ZiBcdTAwMGXZmeuia3fvelx1MDAwM1x1MDAxMbX2d6p2oJ6jcF2Evlx1MDAwYuJaKzGaWu5ZXHUwMDA2rze9Llx1MDAwMU/OXHUwMDFjxIf77E8gplx1MDAxON7FvntipPq1oK44mzHIn1xi3FF7XG4s2yFOReU+ZGa0LXu7oGLbXHUwMDFjTCehhlJBl1A4nJAj3vrk+1pCcJYxXHUwMDFh92HEltdMdXByuuLz8/jyb8xPNmAv6GmnPjwqoCeeiaRQodiYWZo2wVx1MDAxZUEqU00nkFx1MDAxMVx1MDAwMNknXHUwMDE2MfdRtidcdTAwMTVcdMMr8lxynYHkxXZHsvU+R/fDtq+QXHUwMDE113LrTe5qoa1cdTAwMTlcdTAwMWJQpYtRKY28OFx1MDAwNtRcdTAwMWPirlx1MDAxZNW3+5lN9fHsXHUwMDExOUpW2L6x1CP75UKjJlx1MDAwM8FOx0V55KVcdTAwMDBRS1x01yd2YV4qxFxioHylV3/nr4+3tSVvfl3oYcdcdTAwMTC2r6MgsSr3RMKLpNj1Z+hcZuxa66iUKJdY0NvmXHUwMDFiWJ5cdTAwMTngapydn95cdTAwMTXSbmt+XHUwMDA3r1wi+Fx1MDAxNve4orFcZrZT0vzA23dxMzr2nGbqboHfO6slKSVhkKl3uzOzUov7XGJje5JcdTAwMWb8g7xYTqq840mfXHUwMDFirFqdpCpcdTAwMTbNslx1MDAwNThdfvdOqE7sXHUwMDA3r6JDY42vtc/Zb3FPg10qUIyHXHUwMDA3V3xX01x1MDAxY7n93GpcdTAwMDEs+Fx1MDAxY1x1MDAxZk87JiN+lNJcdTAwMWaNTXPe49GZXHUwMDFj8ch7ilx1MDAwYvKiNINdXGZcdTAwMDPchVx1MDAxMc/NI/t6iCtHwVflpFx1MDAwNlapXFzGXHUwMDE2rV7hQ8VKplFVqiB8XHUwMDFiXHUwMDFkXHUwMDEwedrLwdviOOe1qo3vwaNcdTAwMWP/PJ20XHUwMDA2/oxcdTAwMGZorF12XvpfXHRb2CrXmvO3X46Ldp5ccqkuvl3j8UIrp0nghr2Y/Nv379LR0zlF9Vx1MDAwZlBOmdBKU0BcdTAwMWaZRWn5xunXRcCjZM7qcfC7VW6MvfRP/faQVWlcdTAwMDAxXHUwMDA0xzCxc9yh0Fx0VPiByFpaa9CP5C5EPcy0XFzdy1x1MDAwMjNcdTAwMDHnOjDTpySc9lx1MDAxNr1MXHUwMDEyXHUwMDBioM22VHs5lZiptfSbmZs+w9K3XHUwMDA2LGBVI+i1wtk77Soyl83mLcKbysLf2EhysMvFM1x1MDAwMlxceVwi0z08qlx1MDAxZGk/LNWtoj2z2m2vXHLqV7/LemqlXHUwMDFlcu7L8Wk+v9bI/o4vnHs8qoVHc1x1MDAwMshcdTAwMThG631Wv6+XKVxiXHUwMDAyJFx1MDAwNoiw3IaPh1x1MDAwZi1kuW79pObyTFx1MDAwYl9f9iPNT79cdTAwMDB4sb78fuCvVS1uRWIkXHUwMDExMJVcdTAwMGKFXHUwMDFlbbBaXHUwMDFjJvaveYyXJCPUVyZ3LFx1MDAwMTxcdTAwMWb8yJhVgo/AXGJ0Pj+DTG+iS7w4SZ5cdTAwMGZA42swTSph8+JBtzXbep3GKlxucXExzJjVxuPaXsPlXHUwMDAzp0nrukp2I96dXHUwMDFlLErkt4Q8PnDOefP6+CGTLqKNbVx1MDAwZWMorVx1MDAwM1x1MDAxNFx1MDAwZn1hXHUwMDA1y1f+bZHHn1x1MDAxNHfDJHy2t13Cn20wMtV4PV4/0qOkRfSjflx1MDAxYzulTIk9XHUwMDBmb+cqz0E8TGaQZWGUtlx1MDAxM5KMzm1cdTAwMWZZ+p3FSVx1MDAwMnT7SZFkPIz09CB1XHUwMDFjgJzfVa1cdTAwMTVNx6LjV7mSclx1MDAwN683mFx1MDAxYTdJferwWIxj/zpn+2k/PC9cdTAwMTcv+1xyU1x1MDAxYzFcdTAwMTBdNtFTV9++R1x1MDAxZHK+7dG1TKry29NJ3W+XMCowXHUwMDExW1x1MDAwNVx1MDAwNpaMwYS1slxulFdROkMpZpK6XHUwMDBmcaIq9nlo50EljGE41VxiXHUwMDE4v5Na/rXlXHUwMDFlmSNcdTAwMWFcdTAwMDe23CRbXHUwMDE1dlff5e/AU/VcdTAwMTlcdTAwMTXWaUcufkyNceOPky4omFx1MDAxNLa0Z0cnXHUwMDEzuVFZSGgoU+flXCJpqqK2t2Z4XHUwMDFmXHLOjtNCelfQmvvtXHUwMDE4XHUwMDAybaz1XHUwMDBlJvjoy4ZTzo+qqLA3itDunezwncpcdTAwMWbLqUywXHUwMDFji6SKN3b+u5N5fSxcdTAwMTlaUpX9ev4n8Vx1MDAxZIzIK+f+wr+j3+PSV1NzVSVr4JIskaVjIGWJXHUwMDBm+nj+O6qprD/hRVx1MDAxZFx1MDAxZFxiNlx1MDAxZH5J2phubbffR+knzMtxcrNiUPRcdTAwMWI+/UuOyFx1MDAxM2XO2OqP1/f327lcdTAwMTVSnVq7uCqGNoqCkUVcdTAwMDErOrqiNnBVt43AXHUwMDE5P9+5XCKTherxeqv7NYRwgX03tVxirENv+VQuPS+SqVx1MDAxZVKjLlx1MDAxZdOlepLTQztTd9PzXG6k97tLXHTnQlx1MDAxZLu2t6KToSxYtlx1MDAxY2SryEQxXHUwMDE2XHUwMDAwrMCYXHUwMDFmU2GckudZLUE7p5P1+GVaXHUwMDEyvEZe3mry+FxuVnpcdTAwMTI2JHpjXHUwMDFmPdoqtsiQXHUwMDA0XCJcdTAwMWZcdTAwMGJMUHmivFx1MDAwMVx1MDAxOZVSOPBcdTAwMTNFKExGZvemtqVcdTAwMGa5NqCu241TpKbmf07+MXxcdTAwMDbfyNI3lMmhR3pWh1wiXHUwMDA0VFx1MDAwNClg5eRcdTAwMTE05JXDL8lcdTAwMWXMwzPMzTpeQp/53yqKZ4AmPVx1MDAxNVx1MDAxNnPPmXqwXHUwMDFigXxcdTAwMDV1XHUwMDAz41xmnTqcZ9xShnRNdJ29VMplKe/Mg2zUo81cdTAwMTDW5Fx1MDAxYYORX5NcdTAwMWPxnjhcdTAwMWOXgrdaby+45re+lpFcdTAwMTHiW0f1IaLM/cBP7ULj1TlpmdTuKlx1MDAxZLPtXHUwMDE5mVx1MDAxMFx1MDAwMu6M6058Yj6NucBcdTAwMDFmSFx1MDAxMeUy+4dcdTAwMWKvRoBcIo9cdTAwMWObXlRcdTAwMDTkjpDUw2dcIrQ4w/uyaal5XHUwMDBm8nxcXO8r4+fvm1x1MDAxZKEveN+Gclx1MDAxYZyoXHUwMDE4YJMwcF+tpl6Qk5C/+3ZxKyyeylx1MDAwN9Uvkcqlklx1MDAwMlx1MDAwNfRhUnyJjkze0E+8oWS0XFxq9Gkl/4WMdCxsXHUwMDA1XHUwMDE1wI9dpqurQGCtiZtcdTAwMGKcQl50XHUwMDEwaFGqpVx1MDAxYqLtTtdcdTAwMTefKHVAfsaPjozXXHRQsP/iU0gsPMV0Xpv6VOEukZaG6pfy4shkp9TmQUJjXHUwMDEyXHUwMDA17ipRe1x1MDAwNFx1MDAxYq1WcK1cdTAwMWZd5b3Bs1Q56jB+v8L22cwu9cogg7ecU03uTVx1MDAwNzFcYipccorug2xcdTAwMGLem8tcXLyCyfix1987M6VAVzpbsCP80crYXHUwMDEzd7CmO1x1MDAxMXG3lXiPVz+tXHUwMDBlh/ZuOaTM8MXek1xuiJK9XCK+xpj4d5mEXkZcdTAwMDI29uTcob83S1xin1x1MDAwMmaGt2W1mVx1MDAxZFFA2L9BfEc/REBcdTAwMGZcdTAwMDXlftbVal0kXHUwMDE3l2pcdTAwMWVcdTAwMDeHNG5I/Vx1MDAxZTNM6PT9u2+zNIaCXHUwMDFjeW6cpdlcdTAwMDJs4zu9XHUwMDA1XHUwMDAwmD/ohT6g/4Uhv6byfdGxWO6AOFx1MDAxMF/LXFzUgTFgOq2HgN3l0XRcdTAwMThlr8j08uQhY1x1MDAwNF+mdjVDhO5hNOkgXHUwMDA3XHUwMDBm7LN/RFx1MDAxM72tT/CbS1x1MDAwNy5qgHb1JNN0ZEiK/+bvXHUwMDE5iStcdTAwMTL7ji2G8nN6MPjaXHUwMDA1XHUwMDE3XHUwMDFiNiNcdTAwMTeoqu9cdTAwMTePdZTp/lx1MDAxYj7+//bOtY9dUL+pJ3vkXHUwMDBm2slcdTAwMTj+UfjR41xmqZEn3pVklp1cdKTRwVx1MDAxNTtqm5xxdp2b/HuY1+/ezE8rU5wovI1LK6vHzaBcdTAwMTaozlHKt1x1MDAxN1LCqyZVZbuQMu3yN95cdTAwMTCL9Dq/XHUwMDE2tdjI8jF5VNj65YM/XqumbYYnek1Rqlx1MDAxN/EuwCtcdTAwMTWR2K5cItvFnpZJVyZw71x1MDAxYmdcdTAwMTFvJ1x1MDAwNYDyeEeW2IRZ+1x1MDAwNt+Q9D4oXGKIsSew11xiPbfFvNnzd6/TNEaMIH/nbSE8XHUwMDE4XHUwMDBlc42H6NzZWnuDXHUwMDFh43sqXHUwMDEzXHUwMDFhRG581yV8XHUwMDFjXHUwMDAz/dpcdTAwMWFcdTAwMTVcdTAwMDTjXHUwMDAx6HbqOGqGa4mGSEGOibzFV0uGcCqZoa5Q+/94Oo8tSXmmW19cdTAwMTBcdTAwMDNsQjLEe29cdTAwMTKY4b33XFz9ofr9v7N69ai7KkkpXCL2s5FcdTAwMTRcIjJ5XHUwMDExdE5cdTAwMWHBXHUwMDFjnX+HzHKP9nxcdTAwMWI8XHUwMDA3XHUwMDE5tnTGgVx1MDAxYcl5lnHqbtaGyO48TzVleFVcdTAwMTmaQtuxuXvPXHUwMDE3vaZcdTAwMTjagk/XM6DT+mY9K91G4O9KXHUwMDFlOFx1MDAxZvJlM3xcdTAwMTiPRFx1MDAxOO6dQVwiNkHf6Fx1MDAwM1H6OvKw2l5A/FbJWeJ10m2jXHUwMDE3l1xu87tcdTAwMTWTR1x1MDAwMzd7Le9f0iXVbURefJftz0tC6edcdTAwMDdcdTAwMTJcdTAwMGIju3tK8+SVmEh90E11885cdTAwMTW0XHUwMDE2XHUwMDE0XHUwMDEzL/q6VKxcdKU9llx1MDAxMpvhfVosx4/85vuSRqw0eXchu19cdTAwMWZcdTAwMDBucY97+tdcdTAwMDWc1L/28S69XHUwMDA3OiY66Z08XHUwMDFle/x8XVxcR/BmTI2v76NKXHUwMDFjn2RF56AkkJqhWKiv5nJcdTAwMTOOXHUwMDE4Us4own1z5lLrpai+mvDZi3ZcIibDXHUwMDE3X6HKINfMolqF6JdDQmplrGVq4mnqJ11cdTAwMTXWv8OiPfmUQGpcXDTaJ1x0xiWCXHUwMDE4QDqYXHUwMDE10Vx1MDAxMGAoknCM9Fwi8XZcdTAwMDa3XFxUYr2zZTm2aVx1MDAxZdpLNYGMY7vqtWX9MC1kjME/XHUwMDA1YauqrFx1MDAxOcZST1x1MDAxMd5cdIVIgIJQXGY9YFx1MDAxNFx1MDAxZXhNVIFZXHUwMDFh81dHYY+mjsR0+sIl7DtcdTAwMWRcdTAwMTb8hlxmPNRZQ9mFOTKiYsdyf0Kdhr79OnFcbtUvSeG2XHUwMDFmX+BEQFWQMt72j0E5u8hcdTAwMGKCz7WM++A7XHTGJlxiNNfrm7ZY/btcdTAwMGVqanaigXHa0ltcdOGEXHUwMDBmKcMk6JJlx2L6naLqVWH6312vXHUwMDA2Y5TwysTTgd5jKrCf93doXVx1MDAwMqHYMlx1MDAxY+NcdTAwMGZLkST81d9ccv052t/+LbtFrVxmbeNC+NrVS5krnpqOXHUwMDAwWziZiIB8Oq3+dbOC9LxXYvfkhb1diPpgX51BUD5cdTAwMWZrv7dUoVxuP8OFYUFsSFx1MDAwMnZcZnJZQyCpXHUwMDFhXHUwMDBlu1mjTnvuRlx1MDAxYbpuK1x1MDAwZWFdnb/d81x1MDAxN47kcrzuRVx1MDAxYt5aRaDYeGtm18xcdTAwMTBcdTAwMTZcdTAwMTjbXHUwMDExXHUwMDBmf/uIhu+3ff/Ua9MwnFx1MDAwNSvnVPq8hNK8S/HJj7DJXHUwMDAxp5tcItefXHUwMDEzz0dcdTAwMWSux1xc6lx1MDAwN+9hXdZSrXokIPnv/klVIG5g+cz9X7P971x1MDAwZZxUiEzUKZVcdTAwMThcdTAwMTcyXHUwMDAzK1xubbVP9Vx1MDAxZFx1MDAwZTJcdTAwMDFWcs9ccmEu8nhcdTAwMWFOXHUwMDFl2Vx1MDAwMnOm4Yab4Uaz5PDmhiRPuLpcdEFcbjC3uGakc3yRkDjBXFxHo1/XeT2XK1x1MDAwMFwiX1x1MDAxNzmq/11cdTAwMTbEfmV9fWa99vGgkignV9FcZs1SOGfv4HXX7bma5P5RSvvvilx1MDAxZkpN5JvSrLneNXQhS0hnO6LTXHUwMDExTkyTXGa4N7+6tZv/pKj5LEvyg9vvbaXEML1uXHUwMDE0f5LsRqZcdTAwMGKjS5eRXHUwMDFk2TJDr4FlXHUwMDFkJps0rdWrm4dcYolfuUx1fYUuwWKNXf7Rh2iMXHUwMDAzsVx1MDAxMWRcdTAwMGKdeHpcdTAwMTOORDQ/fy/Dl51cdTAwMTcqXGLMpuFcdTAwMTGEwKvzl3/w6JMtLX8ynXFAoHmmLy28aImS/LN+0frAolx1MDAwN2VmXHUwMDFlcVx1MDAwNz6unpahWq+TqLOqNSyUILnRv6j2LFjTeo10sJXU+7T3zPXKlP3ohlx1MDAxZknW1UDs/51n14Px/XjfXHUwMDFm7cGKaGF2LDMuS1KVv3k/yX99ZTxcdTAwMDG1tb9cdTAwMDWPhFx1MDAwYjzUODBJeOto1sv06SDgkSXLnieBdklnXHUwMDA2YVKI9ZylyDal90rPcY9LJqCpMvhXrXBcdTAwMTM9XHUwMDA12r8rweRcdTAwMDGW1u3Dayyn8OPWKKrtWV74WVm2XHUwMDBiqXhjXHUwMDFkgaZU34JYaUBcdTAwMWUhU/FcdTAwMWZcdTAwMTI0yN9ej4aEZoKxnVo95t5veOLFcUh2/87Xu/1nZYZb50BJ166+hCdF/f6rXHUwMDFkf2equqEovGm6d7c3zki0kUChzZ7ukXBaY33fLt2ienJAv0yScdGBcVJJhESihlx0UHrsxk2MrXlIr7nwJsi53khw5p61/XWGNseHOrZcdTAwMDCjqtB6XHUwMDE5wlx1MDAwMVx1MDAwM3lhW7qTkFx1MDAxNl4tl1x1MDAwZlx1MDAxOIGSwF6KYitcdTAwMGVcZmTQqZSLK1GqZNdNJ7J0XHUwMDAyY6FcdTAwMTjAzyAzXHUwMDE4mWtVeVx1MDAxZFx1MDAxNXWqsMMwXHQmPsGyfp1cdTAwMTM8XHUwMDAza5GSl5EkqtdcdTAwMDTKZkZFXHUwMDEy188kT8VBUIBedvAqhCZVXVPCuFx1MDAxM8PuSjNcdTAwMTXKpmBvprFcdTAwMTXrjkWAXHUwMDA2nlx1MDAxMpO1tVx1MDAxOVxuJ1qdNIVcdTAwMTSGMJZcdTAwMWNTLusyUWBT8mpcdTAwMWZP5uKylVxy7yhcdTAwMTg6XHUwMDA0a80z9qNcdTAwMWVcdTAwMGXa+8NWsyFgR59FXHUwMDEzOoNeXFyJxlpWTN207vbzJ/tcdTAwMTBHqIloI1x1MDAwNGdcdTAwMTdtiePGmJddPNzJ7dj9YH9ie1x1MDAwYnr4KkEwqFx1MDAwZZ8n6ydEqrpOnnF649iKs1xmyIqrOVx0fDDJTXQkNVx1MDAwYl2KL69DqNZcdTAwMGVjO1x1MDAxYVx1MDAxMWm9+VogpPj5XHUwMDAyXHUwMDFjx2RcdTAwMTSmXHUwMDA3ja4x4ftcdTAwMWM1zZ21dzVcdTAwMTOwit2W/Vx1MDAwNtcjTZZYL1wiXHUwMDE17dtg26VWnym/dafZVP7KmylcdTAwMTk+wlx1MDAwZtmg9Fx1MDAxYr81efjEXHUwMDFmVpyFuz81vVxc6YtcdKiK0TWoiYF98aFHc3V4yoOExVx1MDAwNLH2XHKTlm3iM/ZE9iGriDqji6G40s9N6KRcdTAwMWJ6XHUwMDE0bq5jwJOYXyW3g/ZcdTAwMGKEfdR/ps+yn62ZdsFv91x1MDAxNed6UmrawYNcYnDIJlx1MDAxYsGtKXZXYZfj+9KjTak7qdb2mTiC2YDs5p7fvT3oPnkw90Gg6ST9Zrp1y1x1MDAwNvVtlolcdTAwMDC6T5mCXHJovyj7sVx1MDAxY1tntfaCcup881K6KVZhXHUwMDE53YNcdTAwMWV/UuRcdTAwMGV6XHUwMDBinNeawuFcdTAwMTnKfMd3XHUwMDAz6amffsjdXHUwMDFm88BcdTAwMThcbrQonnlcdTAwMWQxOFXUifFcdTAwMGX6aSErfHUvL9tcdFMl181G8kuaLlxiQu8jRVFcdTAwMTdM+Fx1MDAwNETy1VhcdTAwMTRUjlQ9csSVmVx1MDAwMXxA7Fx1MDAxM1/PSy6uY1fXz6X+3nHIJTeplPvtP1xcOlx1MDAwNNt3XHUwMDFkXCI83+dvjlx1MDAxMVx1MDAxN1x1MDAwZl1cdTAwMTPmXHUwMDEw+KLwwa9BT41cdTAwMWHmmDo4yOlcZo9cdTAwMDFeN1x1MDAxODFcdESXXHUwMDBlJEWykcev/U6FbsIj/3GgXHUwMDFkXFzWsFx1MDAxMD5lRL9lalx1MDAxNVx1MDAwMVx1MDAwMpCIXHUwMDFkLEn80Gfi5TQoot9YkbLHoVx1MDAxM/7vXHUwMDFkQUKp81ChXHUwMDE3Tn/J1GTLXHUwMDFmfsi8a1x1MDAwNlx1MDAxNU2jm9tXZuhYrkiy54k5OHgzXHJWXHUwMDBlX+RcdTAwMDTY/brhOSa1eIlf5mRcdTAwMTaXXHUwMDE1sHHwP+prztNcdTAwMGZcdTAwMDBcdTAwMTcjXHUwMDEwfYxcbjs1hvR4aulcdTAwMDaPIGtcdTAwMDNd8MRUXHUwMDE3IF2xT7qzflx1MDAwNUCXU1FvmnFcdTAwMWGX2mxWIFx1MDAwYnCm5usr5kf3Jlx1MDAxNsN4+uVcdTAwMWOYNzrQ/C1cdTAwMWNx5M1GiPSArjEyKFll0q1ccoygXHUwMDE4UfVNW1x0paSMpoRXWV6IeqCNjWBCqVx1MDAxY2+22cHlWa2x/vZYtP+4LcWOl9v6n8vS6/CLXHUwMDAyqyhs+2/92U6dlY2szVx1MDAwNlfhXHUwMDE1lIKTpb2aXHUwMDFjsWXTPaD6LqZVvCVcdTAwMTiLXHUwMDAzTcPHTVx1MDAwMlhcdTAwMDX92UJytVxmzuVVit78sv1bu7XcodFcdTAwMTVa94C8Z0fMXGJ+VpXbOrOVLGtHmiXNXHUwMDFlX56C8ExxXHUwMDBmgsvEXUNbT6xcdTAwMThTspH661nGby7NssN6O6Zd2VZ4oH493Dhw1vL784VvunZcdTAwMTnsXHUwMDExQoX6KZNcdTAwMWPAM1x1MDAxMYPu2tiBKOEhdU55XFzw9tOL5jXAXHQlM5zAO2dvl120XHUwMDFhXHL1kDH0XHUwMDE5c7PPrjPl8FGgkI2Rrp+6cVx1MDAwMXjaV9t8kUpRXHUwMDAy4nlcdTAwMWTULTCaxEtcdTAwMDDlhK6mxlx1MDAwN1x1MDAxOVx1MDAwNlx1MDAxN1x1MDAwMmz9MuPrs9mML7z+OaeNV379LWjUg1x1MDAwMCZ8S8EgVfSpr4jvzVx1MDAwN4oolFx1MDAwMa1NgiWjilx1MDAwN8Xg4VJcdTAwMTCpTLzVRTPm5VNiutbf3VqevMerX63RU1qAKkSah5WGJix0stXs62HoUo24Z9fXMO/fepZvyf0tVPpXtFpFrONZeEtaqVx1MDAxM1xi6UdcdTAwMDbmkbBcdTAwMDDfZurb25n7b3PTqF5w9J+WhJbCcLI2l2n2yiz3gIlcdTAwMDJvyW/6XHUwMDFk3TX3wlx1MDAxM/5cdTAwMWH+lVx0Lui2XHUwMDA0OdvtzJit6sV1jNzaaOVLiDXkn2/fx0xcboPsb5tSelx1MDAxOfIlmT4xzlF8M9L+Ut4yXHUwMDFk9ZLkXHUwMDBigE/CXHUwMDAwXHUwMDAwpLynN078LT5cdTAwMTF+XGZcdTAwMTeQSL34XHUwMDEwMVWlNS6wXHUwMDAxb326wVCEycI6mVx1MDAwNWa4XFwlXr9lm19GubzP2pQ2XHUwMDEwT1unvo/9vVtEIUadul8mzag3yaGsf1x1MDAwYkrBwWRcdTAwMDZ6+/ZcdFx1MDAwMZ5hmlxiZbrpSpLMXHUwMDE2yIBEf7q5kd3U93HHK61Rl1PWWVx1MDAwNjVjXctcItNo2sdcblx1MDAxYu5cdTAwMDOD0WtUrPghf0v9M5ul50tcdTAwMDOp899cdTAwMTJcdTAwMTJcdTAwMDToa9pcdTAwMDVcZlx1MDAwNvO5XFx3pM9cdTAwMWGrRirjXHUwMDAzXHUwMDFkXHUwMDBih1x1MDAwNN/jLVxu41wiXHUwMDE331wiXHUwMDE12lx1MDAxY05ccnxAv6q39OrTdPA7MVx1MDAxOdz4RFx1MDAxMTnJXHUwMDAwNZ56zoRWtfQjXHUwMDE51E3VceUzkVx1MDAwMuiH9vdcdTAwMThdk1wi8f4yibZi43Pscswwi+qg2+ebM5ZcdTAwMGI+j6OZo1QqXHUwMDAwXHUwMDBl88NcdTAwMWLIu9e1YsDDqnPhYfD53N9DXHUwMDA1gcpvMlrKX5tFXGLp1sfES+WfcCvaL1xm95jmXHUwMDFhim94NMbH0sRmneOu4CROdZ7tfz06XHUwMDE20itcdTAwMTZ4vIU1cnxKuuv5tOuvb7BFy6JcdTAwMTcnlPPpdVx1MDAwZTZTmDjLMksmmVx1MDAxYn6N16SbZj3jXHUwMDA3XG5cdTAwMWbyIX3tjPQuZ1x1MDAxN+Rfg6OWdzGj/PJMc1VcdTAwMWRcdL2S4l6o7Fx1MDAxY2e8XHUwMDEy2+tiKShJXHUwMDE2JreEX9FcdTAwMDOhXVx1MDAxMZwnxqRcdTAwMWKxNCSUPuXcuPWBiFiM+rxcctRcdTAwMTh5XHUwMDA1IPhcdTAwMTXXm1x1MDAwM+1cYnfhlCyE4zrbXHUwMDEyw+RcdTAwMWJLoVx1MDAxOZBQ/Orj6WRpaojXX62jsLalXHUwMDEw11K64kKSYZhyZfLixfRcbu1cdTAwMTVzjq2ZkpaxwIcz+Vxmk574NFEjXHKc59pcdTAwMTfzpmEwNqFAXCJok//dy2j6na1lyVTcN1VcdTAwMTLbdaCejlx1MDAxMuqEm5s6flx0zD99M01cdTAwMWVcdTAwMTfi3lwia2nUL6fA153DeUz50Wn1OXPerDo5eikvXHUwMDA39Kuh+Vx0woI7hFt+aIH/fZZ0+VGPxb0qZimWXHUwMDE0WWMtakFcdTAwMTIgpuuZOHIsXHUwMDEw6N2v17p4pJu6XHUwMDBiILJxeLNcdTAwMDF8Y40oeKKgUbruri9mUlx1MDAxZSMxb0GUdGfqtJqYXrBQrzL6+d1cdTAwMWFFN5CygiRTXCJl++2U7MT+eFx1MDAwZSNiW+eN5InNWnXTbZ6yrPRqzmQ5a0bl+Vx1MDAwMKGG61x1MDAwM6nLJFx1MDAwM95cdTAwMDahXHUwMDEzbDSqduhcdTAwMWJZyk7g+7ClKKDexSn1WY4h/8K0PodQRkuwv1x1MDAwMONAXHUwMDE5WWVgXHUwMDE2U4fwt1exYv1xxNN/9khCaPDrfkAzv8Rh4LdFUm7Wabk0XHUwMDBiZSqySklcdTAwMWGt16fLekhcdTAwMDJ5/c2KLamxnZfNsyTqpZFcXJUkf3BI2lx1MDAwNVKYV4JcdMQnv1x1MDAxMYvwkotcdTAwMDbql7VqI3uDwVqp9a8vTc+1/oGwJ5xFL4C2xtehPKv0mJQjzMGgX1O/XHUwMDFjxTg02TtOhlx1MDAwMqo0/NK/tp6YpFxiopiF6IcxXHUwMDA3iMJcZlx1MDAxNvx8XHUwMDFlp/6iKbD0XHUwMDE0LpZupy1hViRwsFUhZlx1MDAwZVx1MDAwMlx1MDAxZVV6Rylhnlx1MDAxOVx1MDAxZc5cdTAwMDdcdTAwMTJPbX+9XHImae35pzjEXHUwMDBiXHUwMDA2usS3Zc3LaFx1MDAxZYd7miUzbqL2X6M4Q4KQXHTswoSzuJHm2rpcZtVV8Hc+/o+Hq4pcdTAwMGLhJnR/ME7gXHUwMDEw6EJcdTAwMDB+vpaNXHUwMDE4XHUwMDE0kmC14bVcdTAwMDAzrq2mvjpt8NaIXHI2id91XHUwMDE3Kdl+NsCam6/mye3Dni9ncn/v3Fx1MDAxYu5ib7bCK2M222pA2Vx1MDAxM1x1MDAwMa5cdTAwMTGkmVx1MDAxN4lcdTAwMDWYXHUwMDE26Fx1MDAxN6o6g1iFYO5cYjyE+s+DK448wTrlnTA9NqPkZDaZonyXOsnnzlx1MDAwNlx1MDAxMNE+YTjB31x1MDAwZrxcdTAwMDetnOb5LsSftzS5N+yV5dd8/dxY2c5cdTAwMWVwlYymkVP8gd/chfR3QGmlZsIxz3JcdTAwMWHL+Vx1MDAwNd+h3Vq8mD2g3ShFOCf2Jfq7br1cdTAwMDI/XHUwMDA1XHUwMDEzNVx1MDAxOSP71sZFIyRZXG7r0bxb8V+gdl9mlP3vuT9cdTAwMDemXHUwMDFkSGux8S/PpMBbMNxcdTAwMTCuNcmfJUFcdTAwMDaQU1jU/1a/n1x0sVhJUVLJMS/yv5So56Fdwvsx2Gdk2EslM/FcdTAwMDNurirW44SHUsRrXHUwMDFkLenEeSObfunMUFPNQ8vMJyNcdTAwMWKP+PWuhNLv2NDIpfMw6IHP91x1MDAxN1x1MDAwNItyriZVVjz6u4fqs/9cZmQ+3e7v/Cdx4DRcdTAwMDHLyvP+rpmqUGIv8/x9mNfrNrRaWmUjKz4gLfdVaK88kEJcdTAwMDMo+i+qWCYrqHYp6dCk4Vx1MDAxMUe29quW4LeRPDm7NC1+f4j7W/O724lcdTAwMDJcdTAwMDfMXHUwMDE2LMLVteeY1keTI8NtQVx1MDAxM2PdraWwmlhXQlx1MDAxY59cdTAwMTjBXHUwMDBiXHUwMDEyPFeWirCy7M6JkYxzTq5cdTAwMDJ6i+o8hDT+IHWsV1fRi+D8mOotiVhcdTAwMWGTaCvo34thalr+XHUwMDA26bAhxHIrQm55gbKFXHUwMDE2N32ae2So/axHXHUwMDAw9eLwtrdeT43mdciW1USnXHUwMDAwXHUwMDA2mFx1MDAxNzO7cnwnPtg99cBcdTAwMDFcdTAwMTLUXHUwMDE5cy1l+Fx1MDAxNEyJVlx1MDAxZCPYylxupyxcdTAwMTayWnYvXHUwMDFmxVxcjlx1MDAwZlx1MDAxOf2GXHUwMDA3hyZVKcPUY1xuv8zD53IoJVx1MDAxMf6uxHKgI6E60ey1dz5cdTAwMWTab2j7rc8wrTvCpFx1MDAxMFOduVx1MDAwMrDvonzHQGx62lx1MDAwMXdiTzX1ssiPv0M/8lxiIFA0WOKAblx1MDAxZarnX9c9o+hZM5cyZ8UwOItcdTAwMWZcdTAwMDRxoFwi2aBhvYrBXHUwMDA2XHUwMDBiQnyIQkhdyaVY8S1/3FRek1x1MDAxZkwmqvX5bkBcdTAwMWa7j7M3YdWA0svis0tbruJCrMTiv9criIf7u9ug0Vx1MDAxZVxy1c3DKzhTxlwiySBcdTAwMTRcdTAwMTNcdTAwMWE2vvOo15hZ96XH0lxugVx1MDAxY+ZcdTAwMTKKL9haITae2yej8D5cdTAwMWKfMtN4l703XHUwMDFkXHUwMDAxXHUwMDBiIXrh77vaePjjUjtcdTAwMDMx+JFF6Kq/XHSAkE054Mze9048KG1YXHUwMDE0MXe6XHUwMDFjU1x1MDAxNpSHceFrvLVcdTAwMDb88HhcdTAwMWF8alKVaUmFj/xcXCrF5TEpxWbM+q0+kVx1MDAxZIY44vtGRHl/e8DDzUdt4zrW8JzLSH/b0ixO8lx1MDAxZldX4/w3gDLyhlx1MDAxZHyLJzMyoo3s9ikkN0bixrKliO5GaYhS+bj1RF6oYFjAXlxyJ2Kvv6qsXHUwMDA0W5uQbKOzbdxM8JW6XHUwMDFlTCGf/iZ3PC5cdTAwMTNcdTAwMDBcdTAwMTNcdTAwMDJcdTAwMGbst/A44PrS0SGgVXnSXHUwMDAx842PXHUwMDFi+XJcdTAwMWJVMpJJnVT3p8h8XHUwMDFhwFNcdTAwMTa4XHUwMDFkWohcdLJcXDTWMz7s9rSLmT6Usfe+xsP0plPb3Dpjv2U8Vqnq98ogrWnHa5L8Jyzx5mQ+r8CUXHUwMDE013GWbzlnXTXkN2lcdTAwMWPwXHUwMDBi7IRccnXEr5JcdTAwMTZcdTAwMTIzVDGhmoNcdTAwMGK8of9cdTAwMDTc4lx1MDAxN8WaXHUwMDFkr1xcxO1FOHNrMjVIZVT9t69Rs9pxe/RXQsihwvKcqzOO7mpbXHUwMDA0u6Y+v1x1MDAxMsysNF+Ub30vT62hT/FXxFNqnZFcdTAwMWFyuzD8cOyhdm7jT8ZhYl3S//qEXHUwMDE3XHUwMDAyNvVBtZg0boa4cWn6aWVYcKXHXGZxQ5StMfZcdTAwMGU2XHUwMDAyJKhqZN44oeyeeq3/4SiGXHUwMDBlK9ni0pbj/C9gsOqtbdemMFFcZvNcdTAwMDFPyy7VgjDoXHUwMDBix3J/VPoz7zymoz/Fkm+s+11hxsP+9bJcdTAwMDTqz+lHuPbip8PsIch1XG4moL9+iWOop8/PctKSWKdBNoJcdTAwMWOyfzpRXCJcXN+Dw1RccqyZXHUwMDFj9+ll6t+aQW5rVlnW7ltBkrL7XHUwMDAyOivfYlx1MDAxMOlfJFx1MDAxNmlkT04hxiueXHUwMDFhN3Vvtlx1MDAxY26sg1x1MDAxZeZcdTAwMWa1/Pz0+lx1MDAxYpvtgK59k14v1n1e2tSk1XlcdCspdNaCSJmFi0TmXHUwMDAzpIuX7WXll6dfpSVonL98XHUwMDEyMFx1MDAwNpian1E5lZPENkpiJJXaqE4tmVxinvCo/1xcv0JoQY5IJVx1MDAwNVVDbPTlldPbr5M3O65cIttMqqiov/B5J9N0lyRcdTAwMTf0aCzG2qyWXFyHUlb1aGb415VLRKszMe7GrzRsXHRMSthVg0rOb41cdTAwMTD9k1xyXHUwMDExgubw1Fx1MDAwZseHkzplSl3++v4tz1npXHUwMDFiXHUwMDE3W7TPOWiJcp9cclx1MDAwZoS13KFLqfH5vVxmUvBcdTAwMGVzXG6/u9uJg2hcdTAwMDP8IK/FuIKOmby7vJffh1x1MDAxYWCmfblPtWxNXG6dXitaeExeOyzPYCF+PoD3lfpOSr+QmPJh0Xx/k01cdTAwMDJcdTAwMTeeXHUwMDBmi1x1MDAxMZNcdTAwMTK5fZZcdTAwMWJnXHUwMDA3QtfrYGjg+N8zcVx1MDAxMVx1MDAwNVosUah4QpBcdTAwMDBIkMEvP1f5maDLzodY6plX0Fx1MDAxOJpYMFx1MDAxNFx1MDAxMFx1MDAxZtyAXHUwMDEwd1x1MDAwM7Q96KHo9aCTMFxua494SEbCTr5cdTAwMWFYNlQ3yej3YD0oiEtXtVKjuM5cclxcW/xgslx1MDAwNJiIxnYkXHUwMDA1w/DIyVx1MDAwMOCl2bZp1a9mcDLDcFxchD32pS+zgr9cdTAwMDNJfDnye9VY62e6J1NJriqrZ9Wt/8pS9rflkVx1MDAxZdL7Y35Dm2b4QORe8+qXJ0urXHUwMDExa9FU7crdVr2arVxiXHUwMDFh6Cr3XHUwMDExvMD/1lpxJlSdIGlEafPoPIcy8lxyXFz4XHREXGIq5I5GIOo6WvFdot6pslx1MDAxOS8jmqMoWppUS8flkf5kwacqmulcdTAwMGKbz6s+qC0us1inbbTBXHUwMDFlSFx1MDAwNTM7y8RcdTAwMGZcdFx1MDAxMIcr4fTV71xcSjTL563+XHUwMDA0xlxc4kKaOi1cdTAwMDeTOFkxlr8uMveg41g8RDPe24xz/rrsdJ5HKemru/I+cZE2ONRcciqSoJJcZlqAUFeXRSTk1/RFY+6FKoZ+Y1OufVx1MDAwZXtLRDrQXHUwMDEw+dpcdTAwMGJHm25cdTAwMDMygf1cXFx1MDAxMnpFiGZle8azX7ndjlVcdTAwMTGn44/F7yDVhaB9h32q0upcdTAwMTnSwVx1MDAxYW3JRqjzlDlw6ZUk01lcYiRcdTAwMDGx++Q/1lx1MDAxZlZscVY7l2pcdTAwMDJcdTAwMWFp/1XnyzFcXC/lXHUwMDBlNYFcdTAwMWWW5Fx1MDAwZr1cdTAwMTSz18jpv7+6xFWaZVV1fFx1MDAxZI52xt9QqI5cdTAwMGaln49zninsp0+ZXCJcdTAwMWVcdTAwMTNI1v4s+HN7OilpOJxi0M605uuu51+K/uxcZnxev/TGe2NcYrKRXGJD2rX1XHUwMDE2PMy5gowswoa4Z1x1MDAxNeZt4CpdWoTcNkJcZqIqilxmy3HAslx1MDAwMIjAxHk2WzVcdTAwMGK6XHUwMDA191x1MDAxOaHwZWrx7z3xkEn31Vx1MDAwNF7zVrpcdTAwMTDRm0MqWCU+XHUwMDE5yFx1MDAxZjwuYTNtt1x1MDAxMmtvRlx1MDAxY9yCv1x1MDAxNyWfXHUwMDBmXCJTQ2+H/lx1MDAxM7RcdTAwMWFcXKv+W1eg/OVzvdJshlx1MDAwMFx1MDAwNzxaSmSfYFx1MDAxMXhH5fqWXHUwMDE1XX/UXHUwMDE30fBcdTAwMWZ46ZqoftyagmN7JVx1MDAxNlx1MDAwMthcYu82rYRhU92aRGQ069BztP87e+G4jy/fJCbYbZw61ibN325ARPTPOL8j3lNP4kkrv1x1MDAxZDZS3Vx1MDAxZl2G4+I0uo3rslx1MDAwYjJnWrtcdTAwMTO8zkqmlSAg1ynG61x1MDAxZVxivI9XXHUwMDFhlVx1MDAwYlAvQCrhTUNcdTAwMGbL9Ey4gJpSLZdlRL1cdTAwMGb12uO6eKHs5Vxmu/yGOyqWgX5cdTAwMTl/75re+bwr7mTs/PX0ILZcdTAwMWNrUZhUXHUwMDFjSPUxMKKVbp6NcH9IJDrpXCKBnLowI7JcdTAwMWU3XVx1MDAwYlxy81KGUfnRXHUwMDE3x1x0giHXt+Iq/a55rt5cYiZcdTAwMTC4jFx1MDAwNcTG7+9cdTAwMDJRq1HfXHQ4nXpEXHUwMDFiK7FJYlx1MDAxZI7h6Xb5TL9Dp1HZilZf7y1/pURcdTAwMTGMyERTWM3ZXHUwMDFinnHeTisoYlx1MDAwMcDkuEWwI529as9cdTAwMDZ+ZEC2o1x1MDAwZfat2PC57s+Uiph8qkJg83vA/65fY93B2IXURMOc8HdOaVx1MDAxNlx1MDAwZijAgWOBMVJzXyf7wW1cdTAwMDOst1Rj1tP619Mhy+xcdTAwMDKdkp5cdTAwMDRdh7J2nTt90dZcdTAwMGX5Vq8rhf/Wqncpp/LlK0s9XHUwMDA2/vXJ45UtXHUwMDAxaFx1MDAxZW1Q1OLA1L0pXHUwMDA0x3Z4TkBcdTAwMTJsLFgnQHVE+r99XHUwMDE1oTi68iHuf3fiXHUwMDAxXHUwMDA2mUVs7o9cdTAwMDNaaLCbaVx1MDAxMlx1MDAwZtim4pjkWPz1XHUwMDA1IWMvcrtB+i3F6Fx1MDAwZnRqZy9mlLZ9XHUwMDFkMXIkotVyXHUwMDA0wPRIRGQ3RFx1MDAxYj2glrZcdTAwMDO9NkrepZvhNKbrftskXHUwMDFkaFx1MDAwN4W73Pz1oOqxwFx1MDAxYe6xao1cdTAwMWSZ1l9ccvk5T628qig/8+M/W4c3vC7ZeefXT7ZsU7STSVx1MDAwNGl0XHUwMDFjTcDznWZsMdyXjO/gg6a1TFx1MDAxNfvf2Wjzr+eSd1XqtGRfxVx1MDAxOLKvM5jfpp28gL6n+W+PVPp6wz3Y1COZhji49s96cdJcIpq/kY1N0HlH48Tp81x1MDAxZNaBXHUwMDBl8dE6mTAnvVx1MDAwMo6eUCw/0Wsn8UDiIPlUoDQ3JTmN1Fx1MDAxMselSflFXHUwMDE0OWeazIM37YpLs7fWnKVHje2Kolx1MDAwN3hcbi/dKrV/vYdyKV2LlchnctWEpvC+KdLzT9Do859OUlx1MDAxNI9yXHUwMDFmmnF3gylcdTAwMDb/zIy6SINlSHqjymCflsxcdTAwMDI6SS2qXHSkXmPxgu2Pnlx1MDAxM1d1V9fLv5+jXHUwMDA3i++MyFx1MDAxZS5Y8F9xUTYv9c5BUoqBRbZF+Gsz2cKvr6/dZtJcYp7/t58hTPWCZ0efwVxmMrlu9H12e+pYOq9cdTAwMDaX5+O/84X5WL/QXHUwMDEwbpot4Msj32lfWDvtd+Bfi4q/nqHdnZJPZirvp9g5VLVKwHCi0cJ9tdiWXCI4x4vESHtFP9aK87lcdTAwMWEpL1x1MDAwYkPrrFxyt/lussI0XHUwMDFmOF+Ea05cdTAwMDf5zsGIRKZcdTAwMTYzaSdCVdea/vpgU/hm71x1MDAxMVhQxqftlzry5L7j3GZcdTAwMWJcdTAwMWOei+nXrNzlm85iXHUwMDFlT6/nTJDmZDlVqqafJ1j8b15vXHUwMDBiV7CFiSu42rzniF9thzrd3L6JqU5AM3HX2aat9cnN0EdcdTAwMDenMfCt05Gmk1wi2u/dtYWH3yBtW4AlU/QxXzzTUOFHQoBHpXtex2fONTvXYYJlzOKGPCmq78hbXHUwMDBiNvI6ndehXHUwMDA39WXMgrL+7Vx07XzRoqKgjUW33bcl+ezpcGBcdTAwMTJf8n5cdTAwMDTJr1GDOJ861feb1NmjxY2L43/rmXLouDXmloEnSbnLK9eguP33uotQdU2xSDZdITHMknKLWbVPXHUwMDAyf5V3svvAXHUwMDAxjUON71x1MDAwM1xciVx1MDAxYcvFzKDx37LqV7lKfjlcdTAwMTW7QS5pSTHCXHI6/Z9dknMwXHUwMDAxXHUwMDFlKJxJR1rUXHUwMDEzzqftZfNI+ttf4TtcdTAwMTCTQ52gQ2nQkUUgulx1MDAxY2k2XHUwMDAwXHUwMDBiLcOs11x1MDAxMU50I00+XHUwMDEwXHUwMDAxzFx1MDAxZfFcYtWa5OTatNZKXHUwMDA227dcdTAwMTN6Y0i1XHUwMDBm/HpiXlpcdTAwMDFYny/oOq3K2uNcdTAwMTFcdTAwMDJ+04JHkynrMviF2o9qqnVqmdghYqvu03vUn33sfKFcdFx1MDAxNlx1MDAwMOyv12y5NHJBbupyonrgZ94rnOCOvEJcdTAwMTGJVfKJ1UTkZi9/lVx1MDAxMLWhZ3er3lx1MDAwNyHOXHUwMDFjkrIgwG3pnuN2yT5cdTAwMGUsLPg2XCJRt91r6o7BXHUwMDFhri59p2VKKsKHbmimVk5sX8s2zVx1MDAxZiFCkFx1MDAxMUe34q83XlJPc95HVc9zKbSE6iZjXHUwMDFmsihs/Vx1MDAwNXG4nljB4XhNXHT16XtpzztSXHUwMDFlTFx1MDAxNr9cYvhcdTAwMWPkvbLXXHUwMDFhbF6x7mOhvbVcdTAwMTRzYyjA3jxGi1xyXHUwMDE4+0hLX1x1MDAxMmW8xFx1MDAwZV6b1/W1LcdUl2aSwnB9Rtr36VIz6vyU1CnXWmjzokSUaM/3TFx1MDAwM6x+XHUwMDEz81GjXHTK1Vx1MDAxZuO02114aij4XHUwMDAxXHUwMDAzX34yZNqJLTtcdTAwMWbyNOzJostQklx1MDAxMPZr9DeIWlxmfab9tuBEj0t0tvRHyPWJ1OafSeycPTdcdTAwMDVXRJObXHUwMDEx+KI5wVBcdTAwMWVcdTAwMDLVhnMrLjt1Osw9IJPAe1xu0b80wLlzlzQsnUDYe75aoXnglvm9bGpWhmcgUWGDhVpQaK5+l1RcdTAwMDPp7Vx1MDAxNbN6iFx1MDAxMsmMhIezb6S9Z36QLke2apm7hZ+imzWeXoKp/i7OybmH1lx1MDAxOVx1MDAxZVx1MDAxZspcdTAwMTT7O/ZcdTAwMWFaijdPZ2hLaTxcdTAwMWGkVXeotvKkTytF5L4jIE9cZsC1ylx1MDAwMXqKgF76XHUwMDEzwsw91uVEnbJjrbvJRChvXHUwMDExudtcdTAwMTdcdTAwMTK4y2iG4UPCJoJcdTAwMWFOjM6Fslx1MDAwYkbm81x1MDAxYatcdTAwMTQj2ezxXHUwMDExKtJ4SqCpsk3zfK43XCJHTVx1MDAxY7/GnPNcdTAwMWKfOFqiqoa18dv2R1x1MDAxMqiOXHUwMDAyXHUwMDA3Y6hcdTAwMTdcdTAwMDMx11x1MDAxN/xcdTAwMGVZUru+XHUwMDBlIe+4nalzJ1x1MDAxZVGlOKCx3PtcdTAwMDFcdTAwMTlTS/c9XHUwMDFmOEo62d1cdTAwMTKLNXI4Tot8ILAoP+O/Ts5KJz4wlnvxXHUwMDFlJy1epI7m9+bfXHUwMDBmz25tUODvW+hcdTAwMDRcdTAwMTbW3pLN2E9ZkefGkDiyyfnHnHy1XHUwMDE5dDlSIyT/+VcxfFx1MDAwN1n567ix8qVmjPZrsGVoXHUwMDEx+mlOjL824ODxg2Gqx+0juy1cdTAwMGarK8ndqqYxwe7TumDT3o6MXHUwMDE00lZX+rzZXHUwMDA29mOgOPrxn1wi/4raI53agEPIJUzoTZdcdTAwMTGj1sapaT9cIuatWVx05Fx1MDAwZrop6cNCvoDHXHUwMDBmLnjZPFx1MDAxNjKOXHUwMDAzfSvvPKNs5X6sPVx1MDAwN4hcdTAwMTP1XCJA6Hyt9/tBc8vPXHUwMDBl+5STVDxcZraBLSWl2aHc61S7/Vx1MDAwZunOXHUwMDBmXHUwMDE3uDg3g1RUyyrTKFx0c4pcdTAwMTGc8WeemHZcdTAwMTF/SmFcdTAwMDPeJ/BDdZg/MDXtVZV7U7XZXHUwMDFjXHUwMDEyXHUwMDFlb1x1MDAwMcUpt9p7I+mvtuhJXHUwMDFiydCH+Vx1MDAxZSDCd9HvJ3OqfIu0XHUwMDEw4JDi5qd8XHUwMDFmumGhXHUwMDA2iVx1MDAxMMu3UFx1MDAwMcU/sFx1MDAxNqpSOcNcIihcdTAwMWYnlFbYnjjz9dP4Zqw21aEt+m5mMrKORFqDXGKctIC2PFx1MDAxNIP34zjltlx0vJVZxL5jjFx1MDAwNfR/985ZXGaL7ZDwei9k25gxzZ6rxlx1MDAxZFx1MDAxOZ1cdTAwMTiIJlxcXXFfj06+XG6TtFx1MDAxOVkh0FfD17RcdTAwMTRSv8nGzOIrniXEXHT6jrb+jlx1MDAwNTDoKDG8cfNDXHUwMDAxt10u7J2UeVCDIbPI8ScgkMH6lH5cdTAwMTVC92SkovR9Y1x1MDAxYcOIv6RcdTAwMTU4UZPpwqrA56W2Zoee61x1MDAxN/fDV0Z1XHUwMDBm7aFSW2oj+2tcdTAwMTc/UJ8pv1EhNbEguD74XHUwMDBmr+OEjFx1MDAwMv5MX+NcXEYy10iwlT3Ri+Gh1tjRQLJNPePG8Vx1MDAxYdI34OCNaHTQXHUwMDA1NJuCTDJU1/upXHUwMDE5eot7zVx1MDAxYZM8Q1x1MDAxNKG/z/mdRUaLw8F3wER/yJvb0Vx1MDAxNE5+mLY0o4RcdTAwMTitzVx1MDAwZUeQnT/WS83FdL4p21x1MDAwMFEqSj+pONusOFx1MDAxMmey9lxuiXh0ckDeKlNcdTAwMWb9JFx0SchcdTAwMGaC/W7k9yZbON5cdTAwMTejv4j2VFx1MDAwM4+aKn/n5HhcdTAwMTbTJclGbOKMzFx1MDAwNUW3+Vx1MDAwN/f761WlQ1wisnRwXHUwMDAwP97fXfTZLuyBSZRxXHUwMDAxKueqyVx1MDAxYbBkz+p8NFxm+yao+cSX8axo1GnRRFnt2lSp4Vxip87VvylMXHUwMDEwgjeAkkg+hfkp1IMpXHUwMDBiZqJcdTAwMDKw+Z6t/ZA2bDpJllc0vpNPn1x1MDAwZTBcdTAwMDFtvaqXw31cdTAwMWGqc07awJ1D8tZM4poxVHSnkD7tmyCrrahcdTAwMGKyXHUwMDE4QO0m69xRXFw49twzQtfv0MBcXC2x6S1cdTAwMWK5cNF4XHUwMDE0rVF1Olx1MDAxOf+j9bwg21x1MDAxMlfWPk4+XHUwMDFjW8gkXHUwMDE5ovqA2z/u++24s48w4D5cdTAwMDaW3Wd5PXXWwiyrJFx1MDAwZSXhXCLFrTW/Nm5cdTAwMTM4VUSIrXhccncmXHUwMDEwXHQyzr8j4KZcdTAwMDdgacum86+Rz1xmTFwiXHUwMDA0oOgz1ziQXGZcdTAwMGKaLzqb67D24LxE3GhG+2I7LVn7q55YiFUq+c84mSaTVLAgqPZ8WFxcw6KVgMtT65AlRVx1MDAwMVDLmrRcdTAwMWRh82d8o1xm5Fx1MDAxMFxuwo5cdTAwMTe4RVx1MDAxOeNKV3LWt/p+cjBcdTAwMGWD/DRez02P1TTMx1x1MDAwMiw9fa3sZE3vgL5cIqlcdTAwMWQ6/KxcdTAwMDVgJtZN/m6ckLOL4YNcdTAwMDQ2xcjzJGjuvTE8gbZJL3JG9uXAhTjbXHUwMDBliFx1MDAxNO2949aXXCKP2V5+m4ovv1QgXHUwMDBlQ7PlooqcXGaAXHUwMDEx0kJTh+k+Tf57XHUwMDFhzl+K/ZpcdKarXHUwMDEwrVx1MDAwNSPfVpNDisa+K35cdTAwMWW+XHUwMDE3wndcdTAwMTfAkSRcdTAwMTGDWPVcblx1MDAxNZRcdTAwMTfN889OIOI+zryFS84vNat0+I1H+HHSyFx1MDAwN71cdTAwMTc5P5xcdTAwMTi/XHUwMDBlXHUwMDAxXHUwMDAxj+IznKBsv7RbXHUwMDA06MSZ9KfY5on+aM/29ay//vhw+TOBqPyxp1x1MDAxZtt3dDosZVx1MDAxYt8yZf72Tpsyb29rbmzKZZD9Y9tYb1x1MDAwN/6biJCApVx1MDAxNX4jeyxcdTAwMDdmjKNcblfGqESGwVx1MDAxN/tcXDrXsptektjneFx1MDAxYZBcdTAwMDekirxTp1x1MDAwZb2mXHUwMDExgGdcdTAwMGJccqRcdTAwMGKmfTSxf/dabcTv+miKl6E+TFgv/upYxWFmvWzoXHUwMDBmXHUwMDEylrX2tCHzZFx1MDAwYlx1MDAwZqaJOYikeVx1MDAwYv10iPJdfLvKsIUxUlx1MDAwMaL4QTlcdTAwMTKq+tVNboB/g7egNMhx6lx0KuCg99VcdTAwMTC9/ZhcdTAwMTlcdTAwMGYuUFZcXMcx0Fx1MDAwYpH25yXSXHUwMDFkVyuRjoGKvSbiwrH9c4y3XHT5IVn611x1MDAxNS1gQ3jiJ/yIXHUwMDEy25Hs+el7jvtKXHUwMDAwPZnSsyzSKEPzcuHaXFzMY1KQUHZfXHLq+aM8Vy/AnW+VxvA8nE1i3m+waHx22lxc4Wq9XHUwMDAxXHUwMDE4OpNcdTAwMTA4Q93/7uuFXHUwMDFjY0/nRmSBgPMt/vjrm1x1MDAxZF4qZfXHcsfia5KRL4nbi04mP3VONSbdUbtcdTAwMGJcdTAwMWb3upBcdTAwMDH6kD/XRm5kvIEskJFsOD7j44ClsHa2gVx1MDAxM3ZzhrHgS+93kOCxacM9vP1vxVx1MDAxOIhcdTAwMDVEv3UyWmRcdTAwMDFcdTAwMTCofFTf9iheyGTo+Vxu01x1MDAxZbVcdTAwMGa39cTrqVxyrrMzW6dcdTAwMTNOqYy/86Qpl+qj/VWqIFqs5pBx0NzZMWXyXHUwMDEz3of15Myws7hcdTAwMTXK1jeqXHUwMDE1oDh8tlx1MDAwMlxybFx1MDAwNrNcXFx08Huou8WfiVx1MDAwNkK6XCLiXyZiaJtnksHexVx1MDAwNZRcdTAwMDfV/8GyqYe+rPDtRVx1MDAxM1tcbmdcdTAwMGJQkorw6aOWNWbPfFx1MDAxNGRcdTAwMTXZRuhU2v3tNLQ0M6hdwbL5O6DRXHUwMDFlu3JcdTAwMDHrbHWGbE3YI9NcdTAwMDKee1x1MDAwNWtcdTAwMDRI/z775jdcdTAwMTcweWTsS6qHotnHSFDD1UCtKTH5/Xr3XGKSJ2bw+GpE4p1A+bBcdTAwMTE7euNgOetx/H1Yz9xcdG7C01x1MDAxN6pBlPJcdTAwMWZkXHUwMDFl71x1MDAxMPpb5JLGi9iaYjXF42yJXHL/QJ47cmfpuVx1MDAxYZ3TZFx1MDAwZlZe8UbkNSfCtTKWxSRcdTAwMWVcdTAwMDSgUMdBvMbxcYZlKZlcdTAwMGaJcHKabSqmqJKY+bVdX1M+6Iz5iC3Y46pFXHUwMDFkTH2HXHUwMDBm61x1MDAxMvFxpd9WPpnrqT4r5KSEkfelrOVcdTAwMWZYLThHIXM3JH3KjqbwJaUmfbOQ0IpQsVx1MDAwZWTzjlx1MDAxYrBcdTAwMDNxLfdISH+vPenw3vRHcIxcdTAwMTRcXJWtd6JVrrx7bPcksUYox9uN48CX4YeDftqUdZS5vFx1MDAwZnM9O1iXx4iymlx1MDAwZVx1MDAwMemR5mv/iqFRiTxgXHUwMDAwNFx1MDAwNlx1MDAxYpbbe2RLfJim5zjYjytWwHpcdTAwMTCzpKmD2742VFtcInVnXHUwMDE35fa8YoQuXHUwMDEwok/8K7lvsH1EIORcdTAwMTcvXGJCloC48q8vNyNcdTAwMWRcdTAwMTlqXHUwMDFlvc5fOzHj4z74pMRatv31x+lrw9Uq09sqjVx1MDAwMPpz/G/CxVx1MDAwZc9cdTAwMTkvdKLQXUu7P1x1MDAxY/vpY2l25f75XHUwMDA0xVxiJ+rrlJVCdMd4M6PhyiPV0cNcclx1MDAwNHYrb1x1MDAxZShcdTAwMDHV41x1MDAxM0FcdTAwMTiOXHUwMDAwrcavnq2dqrWno5xcdTAwMTjyllx1MDAwNJHLjuRTl1x1MDAxOWaF2beYyb97OFoo72Wt6nr5QG464XNcdTAwMWHste9xujzGpZRcZlx1MDAxN1x1MDAwMjecJaS/JStcdTAwMWJcdTAwMTKwXHUwMDE51CwyXHUwMDFlvey2wpvXWKzUy1x1MDAxZIVNkz/PiZDh01vAW75B8K7+Xvnj9Otcclx1MDAxODfaiVx1MDAxNdrqJ1x1MDAxMTLMZ0uUaIxcdTAwMDBcdTAwMDKwL9/Nv0HmW0VlXHUwMDEwP1JcdTAwMTlcdTAwMGabomzBkb+cWa8vP1x1MDAxNMe8+ivOpH+N3SxcdTAwMWOeo1x1MDAxZileRZvDXHUwMDFl03hcdTAwMDOHXHUwMDBm/ePrXGbKXHUwMDFh1Pf1XHUwMDA2dDW+4dhcZlrKST+xs9PfXHUwMDA0qkbE1Vx1MDAxODlXoyx5XGLTvqJfy19cdTAwMGJqmXv+xfKy90mR0ynDXHUwMDEw2lwiNVxu3oxcdTAwMTPMK17L+vTNjp1U91JXMcx1vvLpqJxWv3bJ6sikXHUwMDExLlM18qD93u3t61FcdTAwMWSTwVx1MDAwZd73OissLcM+XfiiXHUwMDAx5NLJ12zOj87Mn2ZplW9h052IMFx1MDAwNP2vXHUwMDA3avEtXHUwMDBlkojkv+XU4Wug19yc1GA1TKWEgErDqlxm/9bhM0fHU/Hwd9juhc4wXCLjRjQsW1x1MDAxYu3j6Sb6V5Ne3losSKy7XHUwMDA30El3TaRZco9cdTAwMGLsaJVHXHUwMDBlT9Q+XGbTJMJofXX2vEGhYm5x/FxirZf8rU8utV/WOJGaZJDtXGL6XHUwMDAydnHeiMCsM7I9yX6tOadXntR23tT93YGro+r8QDD/8lx08Vx1MDAwNaNsJ2/8nSAk9CxPsbG/XHUwMDFla81cbrt7L/HUqFwiw5FcdTAwMWKo4GqPZfz4X3SuvFx1MDAwMPZ7rPWZ10XTpFb9XHUwMDEy2j9+J7NmjkDd1cbQKZVOmlEtV5L6ISpcdTAwMGX/XHUwMDEw6sueX0Cu+Fx1MDAxNfg7zuNaUSZZNl1jk4FSnj8vTbG3RH1j3Vx1MDAwYu2gVpRcdTAwMWRKwFfJi1x1MDAxNk3rl4iJNe2LMu/hQyZIwNf7VCo+NpSy42xNXHUwMDEzvn5cbtJcdTAwMGVcdTAwMTjSXHUwMDBl4vvQZcRRTPq/u/pOXHUwMDE4cGNcdTAwMGKVdC1sPzn2/k49gU9Ae8znh+ypMpNcdTAwMTVcdTAwMWJcdTAwMTJR4pkxL1x1MDAwZXbMWiHJ/lx1MDAwMFx1MDAwYswwdC15ktTWgnz49HPwoumLXHUwMDAyZ1mDy+L1abInUEQy0YSmyHF86NP/1jFcdTAwMDBWyn74ZDviSlmSL5/0lSGnXHUwMDFiM6lGmDXLXHUwMDE5Mlx1MDAxNINcdTAwMDJcckCUP+BcdTAwMWZcdTAwMWVcdTAwMGapd1x1MDAxOFx1MDAxYlfgNy1cdTAwMDXNeYxcdTAwMDTbvWhG21wimWolgz/9XHUwMDA3nYKQaGzFXHUwMDE1c2SLoIyxnMNcdTAwMWR0oFsuLiG6XHUwMDE5W/ZAhz6BeZcmgTl9nHecdojanPSfXHUwMDAwXlx1MDAxObFap6VcdFx1MDAxM+PlrL94kXha/+v7LfbYlv1cdTAwMTb3777yMDZcdTAwMGUsWHtcdTAwMWTVap3/uXEmXHUwMDA248VYMXR8YNhcckhcdTAwMWTUXHUwMDFl5v6qXHUwMDBi9lx1MDAwM1HTMGOysY+QeVwiyb1p/1PaXGJcdOYglFx1MDAxNz9UXGKj6YU7XHUwMDFlXHUwMDE5XHUwMDFkp8eplY1fiym7jlxuYIU4LHy01vjaOLrdUtS/dchcdTAwMTdcZsmyo1BcdTAwMWHesS+s7k5xmDtH/O2Z4mFWaCVg0Vx1MDAxN0wkZ8V5bVBcdTAwMWVcdTAwMDNgsVx1MDAwMd/ZXHUwMDFh6+9PQiB6x29cdTAwMDKP1IRLIWC+KFx1MDAwZqBwa+1leEPFXHUwMDEw8vOUTCVIXjfGp1x1MDAxNe+7LTNeXHUwMDE44Fx1MDAwMFwiT2l9t1nVXHUwMDAw+G9cdTAwMGZGMWWyuicyTL46x3eeb1uez3k0xb3lPrsuLr06XrS1jLwy2ObsQkhtuINpnre86KQo30ZcctH1bHFvXHUwMDA32JyePctk2din5JjzxdXs9JCXYfpcdTAwMTTWXHUwMDA3XHUwMDA0tW92sbvh+1x1MDAwN5hcdTAwMTGzXHUwMDA2eiCZJcTzMky1slx0X2X7f+/n//bKcVx1MDAxOYcxmHEp/lx1MDAxZNFcdTAwMTF/3jlSRVx1MDAxYnC2wUFPVejuuXPjgFx1MDAxN1xiXS2gXHS8NlxmtMlLuIghe13N31x1MDAxMlx1MDAwMH9cdTAwMWS7T2qIc6dcXPlcdTAwMTWQp29cdTAwMTLYV++a0Lu6vWqJuNF7qHqFU9rLrpLAXHUwMDFmyFxy++uhlFarN0bGZfTlSf29lJV2XHSj+LZ7v6R1kJtPJVx1MDAwMOn7slx1MDAxOFx1MDAxOF5cdTAwMGJzXHUwMDE00e99T4SYrkU1nFx1MDAwNdhcdTAwMTbBXHUwMDE1XCJ/Yj8wmpW/JeVcdTAwMTNiVndcdTAwMDT8w1x1MDAwM2RcdTAwMDWG5tG2M+md1Y5huupcdTAwMDSI03xx3lxiplx1MDAwMblccnd9jGGJ7/VhZ0a0yfjbckFcdTAwMTL+XHUwMDA18PvXrGNKc7OAvI9fXFxZiu6m8OZ+I9z3SlBcdTAwMGZC3snNS3ig2HjCOFx0XmyNeUDeVsJ49p6ZkFxi2p5b/ED98pxeXHUwMDAwxr9uzYO4XY7wXHRMXG5xXHUwMDE2z/SC/G6EnFx1MDAwYmU7/vNdXHUwMDFkRGjPgMnHd33tra3R539zlNJcdTAwMWXNyDm4a1x1MDAwNoeLP3Qr4Cbzg9PELI8xyVx1MDAxYvbdrHOFj1bmXHUwMDExq5Gp5p7X11x1MDAxZYb4b1x1MDAxM3I5NzFC5K5cdTAwMWE6jVx1MDAxN1x1MDAxNkLcyoWLsoCjTbZcdTAwMGJ9YbRcdTAwMWFJLFx1MDAwZTWC+o1EXG5o7PU9XHUwMDBlk76Cq0RQ2M3fXHUwMDAwsf5cdTAwMTcsXGb9d1ff7oi8XGI8M0Es9Fx1MDAwNmCd8Wt/bchcdTAwMDAgik2/T5TouCbhn0+uNVx1MDAxMljUwlx1MDAxZH7ygquIt1xuqiOiszakv7BcdTAwMTHge2tUhuyvS7J9bEvstrhcdTAwMTCtui1K1mpM9TW2p1j+O+BBnfS/e+HuoqGH/Fx1MDAxYWOh/Sy166bD2rXlK7uYhMl7uy60XHUwMDEycNI4alx1MDAwYqhq9Z1cdTAwMGUyXG7QXHUwMDExhVx1MDAxMLLRXHUwMDAwyFx1MDAxN93jx4qXuDWr45MpRefMkVNcItn3XFxcdTAwMGWplui+U1x1MDAxOVx1MDAxM7veXHUwMDEycpHgXGKrXHUwMDBmuyfH/a2Flbb+N1x1MDAwZi39d+8utuPYs2Jm+t1cdTAwMDDt9l6c7VK949FQ+rj4SJFcdTAwMWGNJDmEzV0xvi7dLXmmKM7cwKbwlFx1MDAxMilcdLIhg1x1MDAwMt/3uaR6uYKb9JfDXHQ1XHUwMDBlmlvrvHC8kGs21Fx1MDAxYnl16OC9slFVXHUwMDFhXHUwMDFjTl+y/v+a2shg941cdGRW1NVcdTAwMDCRYEI6NoXhIPbhx+ZcdTAwMThcYl5Y73G64oUnLjzvh2kzJiy/QjhFnmb7WU/qLoGDbiiAzcur1Z6s2D7XY3716XbrM0VcdTAwMGWU+Fx1MDAwN89cdTAwMWRCoN6WXHUwMDAzYlx1MDAwMafU/kU9I/+v56PNnlx1MDAxY/XqIX5j3ud1aCkwb6VZwOGqXHUwMDE3JnRcZle/Z1xcmU923Fx1MDAxMXzRaLBpOnjhhlx1MDAxN/1Oq1x1MDAwMZr+jP8s4Jhws1x1MDAxMSPP7/Kv65WVMptcdTAwMWZcdTAwMWQjXHUwMDExxCZcdTAwMWE+f/2qXHUwMDFkN69pR40zXHUwMDEzK1x1MDAxZbDuXHUwMDExkcTlaSDIWv/VilJiUUag6I6HuHnCjWdaZ2pcdTAwMTSf1qu7gYk/K6KL+O/bf5Dw+HVwNoTxqdxcdTAwMDX4SYNcdTAwMWZK4Vx1MDAwNCG8Mi5mfpT6xECz+mCyqnNn4yT87XzDLSfu4UNV7GJ/PFi3WICCgob1Yrr8L1x1MDAxZb5cdTAwMTRHXHUwMDFm2EpIwMNgXHUwMDAx/X5Ht8ogRdJoZeo0ZO0+ljXVXHJ5fl2NZE1cdTAwMTcvrJFcdTAwMWb9XHUwMDBlI7avXHUwMDAwzoGYPMgzkj+/S77zh3Zk+H2KXHUwMDBlXHUwMDA3XHUwMDFjO+/NxHzTpcE/uGC36beKkaiSXHUwMDE03ef+T9KKiz13onzm7Pfar62Artoo2Nm987plzaYmQPyTfJRB4UbzaWEzSJjvMWDUuVx1MDAxMqRb72flrzzap7NSb7lcdTAwMWF65ziLXHUwMDE0XHUwMDE4q5/DNq2xYDzFXHUwMDFjXFxcdTAwMGLRXHUwMDFil/xcdTAwMTApUtL0/z7YvNRTXHUwMDAz62QwV1xuRkj9YdRAKb21d36n961+OJuufbxcdTAwMDJJ94DTpYA2N8HaQcVf79LsvI5cdTAwMGJcdTAwMWbOfHLRiuhcdTAwMWLkKsdcdTAwMTVcdTAwMDS/WlxmKVIrLVqwmbj72XdTbKDtrc8tXGLPTFx0JIJ1sdq/KacoXHUwMDA1kFx1MDAwMXpIf/lcdTAwMWSxIazn8DErKLnbzCxFmyyGbfiCylx1MDAwMmmKgWiXskBcdTAwMDOwqK/SZ7tcdTAwMTWkII/Wr+/1Qk9nU7S6plx1MDAwNe/BWlx1MDAxObResi1meVx1MDAxY1x1MDAwMFx1MDAxMYXDmDg/xO7unZdCbyBcdTAwMTC4xe8y5Fx1MDAxYdvkXGZF/S161m9N4jiQIXZYM1GC+LYtTIDUzIeUupBcdTAwMWLOPSpcXGtQ4FxiXHUwMDA3aq9he1x1MDAwZq5b8Fx1MDAxZlx1MDAxMt514FxcjPLv36f4N6uVZyCmnFx1MDAxN1wiXHUwMDA2ZllGg+vamjxcdTAwMTmkXHRCJEcusONXbfFAxyYnMdVsoIj/XHUwMDAw658+JaVcZr5cdTAwMTaI/1x1MDAxNnCBLuF9rVx1MDAxZtRD8Gr7fImiPImknVx1MDAxMn4xf3qT5Kbbflx1MDAwMI5cdTAwMDdcdTAwMTE0b0dcdTAwMWXuuuygY2l6ecNRbIOoLdZ3hih1jUPa0lx1MDAxN5ynvMtzZInf+GfOr2yH2tBcdTAwMWXmhmOw/zuZ8//qslx1MDAwNr1jsOyPplx1MDAxY6/HQLdHXHUwMDFl0TT9LF+i99LXX5Vcbt5VSFx1MDAwM2vL+aiZINdZgZfVdfyMgVx1MDAwN3bMMpiKkcvsMGKhXHUwMDFh12YrgoLTltaBJMHNXG6jQ1x1MDAxZX3HKC8hKrAwT5dcdTAwMTPzPfvb6fw/XWTf/LvH+MhrXHUwMDE3ypNcdTAwMWX+XHUwMDE2hvnqN/XOkuPZtK87Ytx8u+klqFx1MDAwMHQzo4X1dfQpyWREPGu+7ceUI0qV+e2Zla6II1et2cOFXHUwMDAyr5fzOnVcdTAwMTa1cexcdTAwMTdmMj3S5HL4fDN2vNlX75jQmYnm/f+U8V9esFRiuV9l/2ja9NvJlTj8zuPAXHUwMDE2m6ffVku/XHUwMDFmjiDhIPnq8biCKldR4E9cdTAwMTiuP1x1MDAwNZojrpDJgFx1MDAxYlxihFx1MDAxZPW9W1x1MDAwNFx1MDAxMIvCulx1MDAxM1x1MDAxOK8kjXa5k/bV6Sp0XHUwMDE5j3YsP3izuu8tXG5Ti1C//2KBoeJzwLzsjEI71ehtJ1x1MDAxMHJcdTAwMDO7bZBInldcdTAwMWU7a2B0kVx1MDAwNyz8fIBzjdFcdTAwMGX+RIG7XHUwMDEy+ltCWqKAcM6Unlx1MDAxODTiv7OBb0AvSVHPXHUwMDFkIVx1MDAwNdR9mv7ZOJUg6FD0Q9+f01x1MDAxZVxyJlmrMFx1MDAxOYuLl/+FXCJaXHUwMDA3pY3yw7k48blzqnBLun6OVSea+TN+V5S9XHUwMDFm2Vx1MDAxN5Q1ZMnX5Iks8ZX+XHUwMDFmV9+xLKeytPtAXGbwblxiNJ7G+1x1MDAxObbxXHUwMDFlXHUwMDFhePpLn7Olff6rXGJFrIG0cJmfycrKwlx1MDAxMTAj1fla30h2XHUwMDAw25yS1Fx1MDAxOFxiXHUwMDFkbNpcdTAwMDWHmVeuglCvXHUwMDA2/lo6Oo3mjdepuJvIXHUwMDBlrl6I4DnMP2n4elx1MDAxY7NcdTAwMDJcYi+7X91XhIJ0Je9Oyjl8bLVcclOl5LlCnWMjZtKxRNS8IVCNffUu3toxXHUwMDAxg0WTYjqQ5Fx1MDAxMaNcdTAwMGYkrVx1MDAwMXCWK7pcdTAwMDd6cmMp347TTMmGpMzv24X3JGinZnu9S0NcdTAwMTGC65/rd9iAvfKzu/csvFFcdTAwMGJBV9Qv7FYz2UynPP/tXHUwMDBlNkPYxDskXHUwMDAxkFxuXHUwMDFik3L2odgoX8VEPCNLuLhcdTAwMGYypTV1aFx1MDAxZkdcdTAwMDLsXHUwMDE54Vx1MDAxOef1IH0pYMnRxb+z5fTrnSGoXHUwMDA3fFr+XHUwMDFm/JN3ZWe1LM8sbnquqbtQXHQt1aBAXHUwMDFhTkR7XHUwMDE2MJOS0lgh3mtcdTAwMTdcdTAwMTFfXGJcdTAwMTFiVTo+Vl/4o9f25stMRFx0nlx1MDAxZlx1MDAwNvwqddexmXyjRSxMXHUwMDA0i8dZSEpNhVFcdTAwMDKK7cZcdTAwMWJcdTAwMDEppvhcdTAwMDP7+ml+e7LR4nVYXHSpovPkVfPkNGvjmOzIRODrWDRcdTAwMWOxTzyR93GvyPbt+iV51o1EoCqMPZnxXGLYwe9cdTAwMWXh6kGpzn6D4/XGXlx1MDAxOPqirEdkJ5KLmbwmP2bsNlx1MDAwYtZ/Mfx/k1xcZUb2d+n1XGZcdTAwMDH8XHUwMDBmx/NaJ2hy2/VekiaNu7hWN55W583H0dtzfsSpoyZfXHUwMDE5IbCkzHhXqpDfnjhcdTAwMGLaWywv1FZcIoeHilBcdTAwMWGQ9stcdTAwMGVcdTAwMDcu1TX36vLhMTGmqJxZyPMkptVcdTAwMWY+O/7EOO6BjIut8ZuOZUXQQr4nsO57XHUwMDE0zSnL6bQwbv1cdEaaXHUwMDA2I9FtXHJcdTAwMGaLlFU+0cKqU7qrzVx1MDAwN1Po0s8l4dVcdTAwMWHTQEOaXHUwMDFl81x1MDAxNJ1aXHUwMDE3qkHeJ9fWVTiQXG4rzZvkpbwjvHf0sv4rcTxG5spKQeOGXHUwMDBmX2NpNq9cYlx1MDAwMkf2lmbHk+vrZlx1MDAxNXNXXHUwMDA1JFGe12SQXHUwMDFjcWgkcr5cdTAwMDflyunqXWTGiTZRPV3WXG7ORLHgR1Cc2Vi53JtGm4wzd2jqdVx1MDAxN8NNtyNYSrxRg0mC/1x0NGagnFxcXHUwMDFiXG7r+c/jrsqzZ1xuZ1x1MDAxNVx1MDAwNVmPxP02R/lcYme5yFx1MDAwZTZ3XHUwMDBm3jaobk6eS1xyXHUwMDBlXHUwMDFmiG5cIkCre+DgTKPIfV04IKhcdTAwMDVcdTAwMGY7zVx0/VxcL5dq6VxuikVpfN85gsM88OX+qy3Zr/hcdTAwMTVBTVQu7n74XHUwMDA3XHUwMDA1v1x0rlxmYSuPWGRbg/9hfaRVXGJlQmAt2aDftIJcXP9pqF6SdGvXaqg8XHUwMDA0jVx1MDAwNOKXNdAhXHJk60WOb1x1MDAxY2VzXGaM12xcdTAwMGVU63Xh66CptOlC6osk9neEvpl/RP77JTzx1pKD9chcdFx1MDAxM1x1MDAwMFx1MDAwZqJ0ONG0UWiBqVtNzcovdkTH7vctQWWS0SV2OoCYSOJA7MdSwGvy/LRMz+0yYKnttLiVK1x1MDAxOeykvlx1MDAxOSlgXHUwMDE1XHUwMDEyT4l5pnSHK1x1MDAxOVx1MDAwNlx1MDAxZXxcdTAwMTA+/MvpWs1+XHUwMDA0KnhcdTAwMWLpXHUwMDAyiqx5U71cdTAwMDdt1Fx1MDAxOGfqTkvgy/dHbq9GIY4j+D1cdTAwMDHyQKrYrlTQzVx1MDAwYvpOa8RcdTAwMTlcdTAwMDB0XHUwMDBmPkIpJ4FcdTAwMDZmJlx1MDAxNLLGb96SPvVlTqfr6DbuMcBoWlxcP1x1MDAxNNmJIGlcbnsmav76uzfXsdK3I1x1MDAxZmVe1Fx1MDAwNKyWK3dvO1x1MDAxZTexelaPb6dpjCxcdTAwMWHvXHUwMDE0MyvfveRcdTAwMDBcdTAwMWKd59A9/u19XHUwMDBl6dRcdTAwMDPNvPeu/vR6pGJoRokhpa50Ic22fruxry45wIpsw9XVXHUwMDFlzJ3Q6yP/b6iFWZBcdTAwMDWsXHUwMDA25UNJ2Vx1MDAxY+NcdTAwMDJ8kc/hi2/cJHbqJzOEKVx03Vx1MDAxMVx1MDAxNaJ6WJFl4DRcdTAwMTSDv/td0GGMlJf9XHRcdTAwMTCQMyjZhy4uTd49Yq9JP01E5s6lRDGSLIRcdTAwMDTL/+VcdTAwMGWsx9j8jOHbQmmfblx1MDAxMD+ekFeFj2OceNqj++RcdTAwMTS85d8+o2nQ/LvyQCqVbVxcuCNEX6KHosNcXCGCmaJDXHKKkVx1MDAwMlx1MDAwNsq9XHUwMDEz/ThcdTAwMTejKt9cdTAwMTZcdTAwMDfa1INS8O9E6Fx1MDAxZsH6r2b8SKtcZogp7XV5+NBogkiP6NRFXHUwMDA2XHUwMDE4ou4hXHUwMDEyYmGRO1xytzba4va3h1ZcdTAwMDB7XHUwMDA3+FqiwXlcdTAwMTi7LKTZXHUwMDA2UzGjxVx1MDAxNZo8q9deI7/qSlB/Q6QuXHUwMDA2eTchXHUwMDE2YCreNtCLl//Z91x1MDAxN/Mm99pfpuKrqt5cdTAwMDSFQFAqmr35RTZw1bhXX86VvlGRbVx1MDAwMuktXHUwMDE1l9n162+XRyUhIe6HXHUwMDE59EVcdTAwMDVcdTAwMGWTXGK2tez35v3hkzRtXHUwMDA3XHUwMDFiLFqEyNlReSxSgFx1MDAwMZsrn+9m8Vxm0FhcdTAwMDKCXHUwMDBi/7zjXHUwMDFlqzA5XHUwMDE3arj/6q5cdTAwMDf9tpo33S1cdTAwMThuMdE0WjMmmIy+dtfYbjp14spf7KXww5dE7C9EVXpcdTAwMTK5xT2TXHUwMDA3oqRwatxFl3/httLU3bDRXHUwMDE3XHUwMDA2mCYptfD6XHUwMDA07p8yn8TgT9jIXHUwMDA2/E7npLgpbPW7XHUwMDAxUeTPXCJcXNBKqpbXwYLCl1x1MDAwN2pcdTAwMTFGpVFcXFx1MDAwMGxvnCFRWvhK33fSd2spxK+ycInXm7acxz/7z0eMKvl4e6NL5fblXt8goFwicsTcwtKzP55kfzxcdJzFudYjXHUwMDEwmIqvz9Ze4lx1MDAwMPWTNiraVrxevj1yxV54k5CHQ8NcdTAwMDM6WixcdTAwMTlcdTAwMWRcdTAwMWJcdTAwMDOCcqyl7HLPmPSRgrVT4yjU0yToo1N8RCnpXHUwMDBiaqKOZ3BcdTAwMDHrolDn7mYoR3/NrdiWUcn/QEf6aCHaXG40I6BD31x1MDAwZn2ENovMKodDyVx1MDAxZLWTmEOwXVx1MDAxN/2nhtdTpchOXHUwMDA0V1x1MDAwYnx301xmmkzObpm0WVksRZMjXHUwMDAxTESPoLFcdTAwMDSx+a0rhsBcdTAwMDfyWtVNTW1cdTAwMWF4W2FcckLSKcBcdTAwMTNcdTAwMThJxW8uyVx1MDAwZjtQ/nHUgGZUQuX7cFx1MDAwNi7LvoFOnlH8pM7McGdpnlx1MDAxZWKfh7Wbdj3UtWuH3pnfkJfB91xuXHUwMDFip1x1MDAxOFx1MDAxNozX1DBtmsF+XHUwMDFjSFuZoFx1MDAwM2G28yjuaNFRSLQzufncguKvpFx1MDAxNFx0YXV0b+zJ6PZcdTAwMGZu06z23bPxxFx1MDAxMnGa94WrXHUwMDFl6Fx1MDAxMmXLXHUwMDE5XHUwMDA0ToyVeFx1MDAwZfbe8l95g1DbWWOHdFx1MDAxNuZtNmtcdTAwMTNcdTAwMThEj1mPcn5cdTAwMWM8XHSFU1SCNCw6XHUwMDEy2Ozqmq5cdTAwMDM1UrTyppb19Vx1MDAwNjPjJZ+Uc8k7ruJMhbz+XHUwMDAxXHUwMDEzj7HEo76Pm1xyie9cdTAwMDaCsP3uTJ67LadpO/eRI7//qz9pQlx1MDAwNVx1MDAwZe9PoSNcdTAwMTRcdTAwMTXJft13RUj9ucahXHIss/m8izc34DnIZOnagkxcIiy9X0bwXGZcdTAwMDLmy2nRXHUwMDEzXTjj8TiIXHUwMDAzcf/FzVx1MDAwZsZAXFxY5SjenGGJlih+Vl13iVvhtcNiXHUwMDBiqFxiqUA82Fx1MDAxNK29rfxcbmHWXcphfOFvwX4gXHUwMDFiXGZ/Nc1cdTAwMTn69lx1MDAxMHZcdTAwMTO9vr1Umsm9elx1MDAxMFL9t1NcdTAwMTBJjH49hzztPOxcdTAwMDS5zSp/437+m29cdTAwMWO7Pro/XHUwMDBmxUFcbt56bpaZU7f0XHUwMDA1t+/xXHUwMDFk51RSLHMgSJyPxFx1MDAwMXaVvz6bXHUwMDE3op/+8Fx1MDAxZMZ3nvM3w41LcVx1MDAxM0DCxDEy3ChWibmxi0XaMPavO+hAiM2F0NegJdRcbsJcdTAwMDBccuPIc5ltksTrX/0vWkohXGZcdTAwMDWuybdcdTAwMGagXHUwMDEz8SBcImfgvDf67q13W1xuiVrwOqnIXHUwMDFjvpXsOK9VnVx1MDAxY8DSnihXXHUwMDE5NWhcbjSP8cT3u7MourZtxI3ZsFwiPf363qf2lvRcdTAwMTMxzcYpXFxcdTAwMTgws9Amp7Fu/9ThTL7kqJ1dI9GoL8FcdTAwMWXq4aH4d6CYRspk7Gx4XHUwMDBmz1x1MDAwNYJfXHUwMDE5Wkpvv8HIXHUwMDE2XFxHXWSGkWjuXGZk02VcdDO6rmBcdTAwMDPsXFxMZ6t2y4I8M1rOjGG/PYBCjlVK+X5cdTAwMTmf6F98c54kO3VHXGKQ99D5pVx1MDAwZr5cdTAwMWI15KlcdTAwMTGy77edO11MxP1ccoG9t9BcIrPf/NByaEFcdTAwMDSWSP4mRH4mIDOcvZo4XHUwMDAzLbRModDfuFx1MDAwNafgw0FcdTAwMWZzs/FcdTAwMTFzMFx1MDAwNbiAfjPx/lx1MDAxM18vj1x1MDAxYp74klx1MDAxMmQrYdqVytOstd1xc3idlp1cdTAwMDGLMq64nl2NM4pWssIsme3O91fCXHUwMDA25GVdlIuEvPH9wHLmsVx1MDAxZH2sdmnwXHUwMDE5Re5VazQyRSPWftFcdTAwMDZPvDnrvzVcdTAwMDWGcVx1MDAxMfv90rBcdTAwMTXLdlx1MDAxMdDsjVx1MDAwZUTixj+KhWmkMfShtr6gQ1x1MDAxNfVNnkjqUTMozNc2Z0iJVTyWgFXOpI+lW0TWXHUwMDA2pFxmweNxbMPLcnA89vCQYVx1MDAwZizkuEfIXHUwMDE45P6JXHUwMDA3XHUwMDFkdVx1MDAxZsv3aZHf/pPfXHUwMDAzd8rMdI9EtrdcdTAwMTPetLjw4HdeKuE73aDKQ9Izxlx1MDAxZkujS12X+qGb0TqIlVxyXHUwMDAzQr5UZXLHXHUwMDE4bMr3/DwvXHUwMDAwfCTGgL5cZuPqu0LJPFx1MDAxNDXj+JWoXHJLJVwi2rayYymZn1NcbsFKf/iLfjzWunzukP6S41xmofDHeVx00DhlXGJPk0ehntfZNor0eChH4VH9XHUwMDA2sUzos1wiIzCwSmRBosFcdTAwMTJcdTAwMDXh6sqspDpfXHUwMDAziEcguyOBXHUwMDE3bHBsm9KbXHUwMDEwm+HNiXehXHUwMDE02OlcdTAwMWFf5k9cdTAwMWSHh/iDu/ebLVFcZlx1MDAxZCVcdTAwMTKI5uxcdTAwMWU7wVB34GWaQD7u51x1MDAxN9BcdTAwMWJcdTAwMTd585qqsv5wXHUwMDBlXHUwMDExU9DQzZRcXDU3UFx1MDAwNFxu1lx1MDAxMlx1MDAxY0Isq0GN3NW8y5VpSdh49c+9fk9cdTAwMTPzXHUwMDA0u6WNj/FnPc5lKsx/rPNcdTAwMWLxxfFcdTAwMGXsfmOO9/RcdTAwMDX5WfCUuLeV4dTVUtu+j67RUOZ6xSnPS49cdTAwMWJcdTAwMWPWTyshpc77ZSDQKYV6XHUwMDE1m4T8TICG6TMzqL77U9q6tES4K1x1MDAxZVx1MDAxNOn+VGhbv0Kp2Ym/npJ7c1JcdTAwMDVXgVx1MDAxY0SA8N1fZVx1MDAwMqmNeYX2XHUwMDBiVfza71O3u01cdTAwMTVcdTAwMWTiT8w34XbrgFx1MDAxYXmPQ3rzdPtiOt5cdTAwMWRcdKOJJGJegfltmSpnllx1MDAwMD9cdTAwMWJcdTAwMWa+ITdt2rLjYaDfgLNcXIHKvrH+O7uF+bhPPumeX7d973V0XHRcdTAwMDJNcM5palx1MDAxOJlda5tz8+mj5sK1KcI2g6JQWFxiXHJcdTAwMTiS7tGuxM1cdTAwMTbsN5NYp07bmuXqzleTlzuIvvfl7O3alrk4XHUwMDA2pU6KpuRDV7LHi/pnfU+45OLln1Fr54BgXHUwMDAxXFy/adFD7q/6OEV1JVx1MDAwNNNcdTAwMTE4ykTMdCZM1/PoNIBcdTAwMDdCf38qgf7yxM1R7JP5cVx1MDAxOW/bmlx1MDAxNDPJYNC6g31cdTAwMDfQyOJccqIobKn7XHUwMDE4I7NcdDpcdTAwMGXvU1x1MDAxYTyRXHUwMDE3IFx1MDAxZH90wcOrJvubXHUwMDE21H65iq820tXTvtuB+26H3/laXHUwMDAzXHUwMDFkO2rmrVx1MDAxN4p/fnOIXHUwMDE2/XHqTkclXHUwMDBlQDyMXoGfOoLeN3BvuFx1MDAxOVQxPmSzytW2f9lgOaSOJ4TltFx1MDAwNcDbhVx1MDAwMFA0lF2hqu/r+4/e1im5XHUwMDEwwoy1PlXvPSBm7c2jnspLYnY1XHSxqyM9JEEwb7NcZsS4XGbgVzVcdTAwMTlEYFVWIetcdTAwMWUzKWaflqW4eMrHUTtI6ephcHxbdSjLQCFcdTAwMTI9nLx3YdNcdTAwMTdcdTAwMTD+RsNCmHJNosnrdfzRv8Ojf8Xu9E9gLVx1MDAwM39JqGMwilwi8+ZcdKVQxm+iV113r7Q7tPSFXaZpgVx1MDAwM1x1MDAxOY2iVEF+NTJ2jlx1MDAxOa9cdTAwMGZEXHJiib+sRVM+n8VcdTAwMTX8ieaYJ4D7uIM3XHUwMDAzXHUwMDE0lT4xKrR+XHUwMDFkb/7fXHUwMDFhPZF81FJcYr1Nu85cdTAwMTDWXHUwMDEz0XQu/upcdTAwMDSV7rFicVx1MDAxOMfzVlx1MDAxNdG4/Twk11x1MDAwZrlcdTAwMTNhXHUwMDFkiSfVKJjD7cF+XHJX+tdcdTAwMTNHTGRq3oJcdTAwMWPTrY2O7lx1MDAxOTQl01x1MDAwNGI6vLIm41xiPoQgU+/BXGKkwqhkXHUwMDA2sl7puL71P5q0rKWPXHUwMDFmXG6D0Mvmb/DF68ydXHUwMDE4fizcR6uXsb6DPndXXHUwMDA30bQ5XHQ0XHUwMDFjyFx1MDAwN5JKQrrXOJbOhejh50K3XHUwMDAzv31o/ygyu1xix1x1MDAxMXLq2Zor50VDXCKSZOSFXGJlczOUIbl1wi+vNXYuaa/3VaKZ6L+22mBrpnugXHUwMDA2iSp9a1xc6ttxhLHaVlx1MDAxN1JiUnvyXHUwMDEyd8/lO1gyelx1MDAwMUhcdTAwMDBcdTAwMTZ9XCKKXHUwMDA1Pif5dd5cdTAwMDbgIduSnEvS49veXHRcXGZb04NPXHQgb1xi+nZypX15oH7f0N55i27R53Z9v+hcdTAwMWZTXHUwMDBiyFx1MDAxNyNQfp6251x1MDAxY0Ig2J2OvWBcdTAwMWOmgvOq956Vvo/CUb/rcHuojmbou/dcdTAwMDLUKse3RvHZ2jPqkaI0TdW7e2mecpHXXHUwMDA11ql/aOR2x/Thvlx1MDAxZu5UrsC+OFx1MDAwM/DTeKjY6lx1MDAxZlxujSmbUmfsjfBcdTAwMDSALsRBiHLJSXz4pFvup1x1MDAxOZKnc9ZoOKH2QlVcdTAwMWVnlaKj2XJcdTAwMTLgXHUwMDA0XyCXxl0jWJFsPlx1MDAwMiyorWB1XHUwMDA3dqHJXHUwMDA1XHLknvbCqZt1VjY0JGVplL3LL/XPe2ZQZsKCXHUwMDFj0+kjz2zHwVx1MDAxMejgXHUwMDFhpVx1MDAwYs94yWqnXHUwMDEzeiRcdTAwMWLapF9A8jGe0iNWqIJrJky232KO01/qtzW/fddA11x1MDAxOfKaUoIlkWFcdTAwMTXyLvN99Dqonrx8XGIgL5VCbrHEv2tcdTAwMDBcdTAwMTT7iFx1MDAwNfL3bctcdTAwMWKqqK61cigoa5nAVkSWqrFMWie4XHTztqOAf0j/OrRcZtVcdTAwMDes55NcdTAwMGXU2yhA34r1mHdvkFfWuLmbv9u2b8Hyo4nAXHUwMDE5Ri/gT33kd07R9cgv9LdQgVx1MDAxOVx1MDAwZTU8PoBQTFx1MDAwYvKmyb+/YyE9SlOsaVxmM6yE+bLyhSXYXHUwMDE3Kmdm4lx1MDAwNyzF4dNyKt722CawkVx1MDAxNVZcdTAwMDBcIph683Z/Z1x1MDAxZFx1MDAxY6N/XG7oianv4Y++plx1MDAxZX1cdTAwMWKHQvjOmzQ/dZvo//tsXHKfZlxcJoH6y1x1MDAwMsCx/r/XQ6axXHUwMDEw88aQ5O7xaJVsXHUwMDAyuj88kq1cdMJaXHUwMDAxUoezobGOXFy12yCHZqr/qT15XHUwMDFm5cGMwv+kIKjb7/6WXHJCNY/9MtDcXHUwMDAxRVx1MDAxY0v5O1x1MDAxYylZePLpUaQ6V0hGSzmQ3j7B9fu3ZCc35EdFXHUwMDBlN3JDtFx1MDAxMbFdq1x1MDAwN5tF7TJjjY/1fzTsXHUwMDBlLL9BXHUwMDAwoIr7RDvjJm5fVE62pClcdTAwMWHFpFiXdtRHtZaSXHUwMDA0XHUwMDAwsVx1MDAxN/Cfss4/z/NoXHUwMDE29fbb8NVi+Hm/KZB+zYGMUeCGqqj5WJzd4Vx1MDAxMneDzEyIeWD/yH/khvbcc5DfweuwXGaUv1x1MDAwMmiXnzxcdTAwMDRw6JZ7cvhcdTAwMTJmg9M2qpK2+P14XHLPXCI4QZyU6+l0XHUwMDE5lHh3MijrvWmfT+9cdTAwMWTN4iBuqGh1XHUwMDFjrEt/z018X1x1MDAxMPtPLVx1MDAwYpOwx4/F6FhcInTpXHUwMDAyjtNAv3OkR/7mXHUwMDE3cmmoq3zxhNJcdORcdOVcdTAwMGa5VJxoo2Q1puDdPY5cdTAwMTNbcfriXHUwMDFmZ9o/t0JcYoyMZ06WZWX2ssbm5IKa/bP+yDBV+1xc6IxcdTAwMTJNmuQ9ioBiz7U3pVx1MDAwMkRcdTAwMGK8wy+iN9Pkvl9mpDPhp43kXFzyIInFo7u6hEy+KGpCXHUwMDE0XGbtvo18U9iucIB5XHUwMDAyXGZwZmTmptpH+rOu5X5cdTAwMWRKM1xi7oPC9Haq0zBy+S/mXHT/Qm5pXHUwMDE3zzUrPdAtIIeXXHUwMDA1OWbyPduho+5cdTAwMWTOpfioJr/tXHUwMDBiXHUwMDEwXHS0z3dcZsGruL6x79CSOYeyYf7ArPXnOrj1n+vMjyVFQJh55Fx1MDAxM01cdTAwMTG+XHUwMDFiz3zuXHUwMDFm7z6aUVx1MDAxM62AJ7+8zF/gXHUwMDAzYlx1MDAxZmGjXHUwMDA0rCq7XHUwMDE2qi9cdTAwMDQ9uiRV9q6mcc3y6MmCR8tcdIjCiLVcdTAwMGVcdTAwMDWXqVx1MDAwZjk+Zlx1MDAwNbXkP74x+/x8Y+5cdTAwMDPgQqSd4Fx1MDAxMK5e/rBliCpcdTAwMTFcdTAwMTU93ryZy1x1MDAxY/AsSzcxvVjrzShcIqp5v2NcdTAwMWNQ/kOANWqwz2tcdTAwMTcs9Fx1MDAxMaCDXvXBflNReFx1MDAwYmdcdTAwMTaSP4wnsCco/vYpkP9cdFxuIVxcXHUwMDFmQFx1MDAwNiVcImyNX17EgOzMK1x1MDAxOYCviaVSycC/d8t7KFP95lx1MDAxZGOK8ehvojDszISeXHUwMDE0fr8n31x1MDAwNXX4XHUwMDE25JSDa7PDa8+t45NFT0s0wz+9bu9Z+uXxkFx1MDAwNsdcdTAwMDbmpDNcdIO1ff3SU3pcdTAwMDFcdTAwMTGDLa5i17RcZsVWXHUwMDE0XHUwMDA17U13cF7c94GDiMGz3zBygFx1MDAwYtn3Tn0qLpEj+4n70Ozv7uzwM65cdTAwMTUkd7lcdTAwMTjknlx1MDAwN3lcXPH4x7ONr++js4aszUTg6Cl7jnGpNlTe06DvXHUwMDE39jKmj+y4XHUwMDFiXHUwMDFl+JfhvNBW0vh+n1xcPr+qXHUwMDExfirJXCKhhbZcdTAwMDGsXHUwMDE0tcqIzUbojNFcdTAwMDOl+lx1MDAxMORcdTAwMWJcdTAwMGLvbO187b3tl7BnIdZHXHUwMDFkj41cdTAwMDDPXHUwMDBiMFx1MDAxZm7ZeVreX1xik43X6X2qdtXKY4acqfvNdFx0kd2AwWgpXVx1MDAwN9pkd0KMsyBcdTAwMTlZJUdcdTAwMTNcdTAwMTJcdTAwMDWAK2x10V5ccvuJd7xcdTAwMWGA/NFwIKNcdTAwMTXW86ayoEzftHFcdTAwMDLu73jRyMBcdTAwMTbkYpBcdTAwMTlj/3nur/Cb4lHd01x0j4/GeVx1MDAxZClSjtiUsYNcdTAwMTDSrz7nqNWr49BcdTAwMDNC/c7Ax8v6jV1GjEFB60dcdTAwMDFw7lx1MDAwNENcdTAwMTh1Zt6UYatubVx1MDAxZFxiXHUwMDAyKlxmVjxzs/OBWFCOXHUwMDA1uTFEeq2gXHUwMDBifEF/YulB28pHjf5iXHUwMDEx9btcdTAwMDB0Y6sjSjDnXHUwMDEzkZuLqv3j9uAucJ04WDroXHUwMDExVYhzf1JcdTAwMGa+XHUwMDAxgkNcdTAwMGaWf94p+uvByNHNgFxmbfWYyXckXHUwMDA2WMBmXjFWUlx1MDAxZa1sulx1MDAxY2hcZlpccm2nLe2hfX9cdMb7xzs9glh6XHUwMDE0g1x1MDAxOaJcdTAwMDe2yoBPyDugmI5cdTAwMWF4L+FcdTAwMTPUV1x1MDAxMS7TpZ00rnMvSVHl6eDCkf+k38dcblx1MDAwMO+kn2ZpXHUwMDBiY/6AcIFQRW9cdTAwMWVdVlx1MDAxYWApXHUwMDFlw0Tq9vN5/1x1MDAxZlx1MDAxMS1zXHUwMDEwtLDYyGh02u07NMOEx//WebnKZDo875Xaw3OxJ4xfXHUwMDE565Gxjmityz1SsH6Oc6WL5qGOsVj594ecXHUwMDFlXyvYj0fn3qxcZlx1MDAxMPPzp0B181x1MDAxMVxuWThLQsjURfJcdTAwMTaqfs2pXFxkR0J0xFgpXHUwMDE5Zv+Xt2jGe3iLnj5kXHUwMDEybotcdTAwMDOXmHLeYZjqdE5+O1lUXHUwMDFkaFgjIVx1MDAxNO6Qolxuk6XiS+zze7Jeq+CWR6pHXHUwMDBmP1x1MDAxM1xifJSQ+Fx1MDAxOVx1MDAwZjV12q696lx1MDAwYiC+fvNcdTAwMWIw9riCx2SHMCs/2E9TLMHy/1vb/HkoOVx1MDAxMpCR/Pjbo2FKXFw5Nadv9y5cdTAwMWTIo5B1XHUwMDBl84B8zVdcdTAwMDLHI/mQPFZcXPJcIjNcdTAwMTawQlx1MDAwNCN8o5D+aI12mTrPqVx1MDAwZX5UplFpXHUwMDFiTYCKXHUwMDFk7deim8BMkjlcdTAwMDNzXHUwMDEwmd//9W9cdTAwMWPMvr5cdTAwMWJZK0/u5kKPL6BCvfEv2EfjXG6yoZiQQNYrVFK0epNcdTAwMDLV24+gXHUwMDEwYV6H/o5UbqHh3WuLXGbf8sByudAstXy6x5p8JFx1MDAxNFT+1lx1MDAxZEvohdalUEVg8UdnXaPB+FSQXHUwMDAziZZ6QolcdTAwMDLKo7+79Vx1MDAxZfRcdTAwMWZv+LS1z3zv2cPNX9ukYIDu5qh6xs1/dMb6PZhg/+xAZna6Klx1MDAxOcDzcVx1MDAwN1x1MDAxOMSnPFx1MDAwMbvxxnpcdTAwMWNOy4fi7/edUlx1MDAxMqlI9Fx1MDAwN7Llf3KLRX91gSxQuFmcXHUwMDFl4Vx1MDAwZv6aWq6IwnGRVoNcdTAwMGXRnEdWe6uzLiqMwyglvlx1MDAwNkqvXHUwMDE31lx1MDAwMiyFxmWRud5jzI3xo8L2uJp915ov0DA1Zo5ZQ317aVxi9VvY8LRcdTAwMTliXHUwMDAxr44+36Qx+0/d68FgNoSvh3+Y4PVNU1x1MDAwM15cdTAwMTKSNYpcdTAwMTcvZV2fyP2OI1x1MDAxNjYtXHUwMDE19ci08Yp9J7xcdTAwMTj3yI2vdppGM9cugUyz1umO2Fx1MDAxYZQh/7dcdTAwMWXRpW5yXHUwMDAxT66QgIbV5HjoUvWnftr7zFfdlk64t1x1MDAxMVtcdTAwMWHgYYwzbbHaV+aKj2LgbWtKM8Ff3T5eXHUwMDE48ttFS/hcdTAwMDJ+LVx0KEaVXGbZiWlvtCclN/aZXHUwMDA0zrN0wI8+0fdsK+KBXHUwMDA3XHUwMDAz0V2PfHhuevJcYvg3j0gmXHUwMDAxVINC80FbU8Lo6fbUrpgrXHUwMDE2cbXzNShab7RjuI2pXCJpXHUwMDBmYdz0qCx25JGNJdp+orebP5RccoiYY/38icdE1Vx1MDAwYubMyepE0e+UxaZQMV6pj1Qqq/3i3//bqyH6Z3zGrZRLXHUwMDAxSGBcbjtRx8RanoE+7zdcdTAwMDOJXHUwMDA03ea88GPvMSg6oCxcdTAwMDXUZVx1MDAxZp4wh4hTmLleZmRcdTAwMWJTZMZV6n0rXHUwMDE3o2J6VeG7pHSe8agohG+ZQN7v27LZv71qhVxmsF1cdTAwMTbkXGLZTElw04F3wtRcdTAwMDdnXHUwMDFkr1Wtfbkx765DrMD/XHUwMDEzjyA2t+rqo4y0ZDwmrPiGJsRmpD29XHUwMDFkXHUwMDE4/pXasEPd+zLpgHexXHUwMDE2Uori9SHe9VQpbFdrW2NHw/Anh1x1MDAwZf6xxYC6a/ZEh1x1MDAwMfLFJ51zWk+hykf1uZPJupJwXHUwMDFiXGL5+n5z+JFxxcT3aDCuJKOy7Mn/3NVv/s/hjFFcdTAwMDPDXHUwMDE1l/HBXHUwMDA09lx1MDAwMFa3XHUwMDFic9zvSFx1MDAwNlx1MDAxY4Mh3lxyfiqcXr9+npv567lcdTAwMDWmePBqzdtL3MnHXFwvwLJYXHUwMDFk7UOP67dcdTAwMTXd8dGj2Ua2QPErP9K3z02wXHUwMDA0ybfzZFGubSmzXGaoTFx1MDAxZqVcdTAwMGUyupqFNyfwWErmaX30OHq5vDfZXHUwMDE0Wb7kS6dfiOFJajeyf/pSpVx1MDAwZn/U93b7c3KvoGF/XHUwMDFmVlwiSd3u00q1eE4zkC7tKt/UOuySMFx1MDAxYextts5bXY2YnWBlKedfr6PVl1x1MDAwNFlcdTAwMTOkmlNSXHUwMDEx+E1cdTAwMTWeeENv/Hhlyzx13Vx1MDAwMZZcZqRKKMbotrn1tfandO08vlvTPo9ccrmzR2KmM3FIcKFWTN25/Vx1MDAwNGhk/5Xeaa29z/Vxp9KrXHUwMDAyXHUwMDAxm8pr0toy2WB7Zk9pREeLcoh9u1xiNq/uKVx1MDAxM1paLfG9qmvXVbtcdTAwMTD6Q/2GVIO1RfNK+Fx1MDAwMPWf9ZhcdTAwMWY//XzVeVP1KO3DsE6TU35m9NG/81x1MDAxYteg9yjFs6bhXHUwMDE3sWmWZ8OVf4VcdTAwMTfbXGZcdTAwMGZ+yDaSk1x1MDAwMVx1MDAxYcJ67pWd2SzVy5uTnKKOcFxiXHUwMDE3dKBrxHXyPqbwNPBcdTAwMDdcXM7s/Ni4Wvrz3Mnz3LKBjSCaXHUwMDFmbnY5XHUwMDEzOSlcdTAwMGboYfNcdTAwMTda4cpxtja58S/6dqXzwIjHXHUwMDExSzJ0fLgjwM2v9k1HWlx1MDAxON/C11x1MDAwNVx1MDAwNiCjUMSD9lPiultQJobekCOt4z4mUsP9zeWW921ffYRcdTAwMDH/1bvCR3/0rjXopHFMXHUwMDAwXlx0MLs9XHUwMDA28mohWNVcZnIuMJ9K+/NcdTAwMDSNjHx3ulx1MDAxNVx1MDAxMtJJMnucJZzlXHUwMDE0QaxNhkhcdTAwMGWSoVx1MDAxMa1LXVpNmulAoZfoeVPcsVx1MDAwMFFcdTAwMGVcblx1MDAwNGSI38V2ejTg+bLH9Z/81ornuz18kc/+XHUwMDBiqY9cdTAwMTJxcj7sXHUwMDA0rHcuyVx1MDAwZfehXTrn0a7zNf20K/VoV3lcdTAwMWOsW5dx5oZcdTAwMGaH4ijjXHUwMDFiXHUwMDEzXHUwMDA1XHUwMDAx9PXx1WTHfnFMt1x1MDAwMqe9q4zFelx1MDAxMCH4W4VKzVx0XHUwMDAxXFyXsq/UIO2E07eRZ/6R3sn38TFo2Vx1MDAxM+iG+rnvqvRKplOR9TTUlFx1MDAxMnTc8e2vfoCk2S7Y5tmtj2dcdTAwMTC/9aaOUFx0XHUwMDE5O8K+z3iHJ07sXHUwMDBl8nn/1aRXXHUwMDEyx8vXRvjByK6el1/1zePHXCLRcPqbLlx1MDAwYo5ccoJcdTAwMTBsoOrxv3WK8pOHwnAseFjxqkmI21x1MDAwNFrD0FtJ1l9DN1x0QaaKozsv+J1ILlx1MDAwNERYXHUwMDA37Ct5rFxcXGLV6FxiUDy/aZVLXHUwMDE26CbQvudLuKlcdTAwMDb+vDCCm1ifcZxdXdNcdTAwMTJs+22pikL8XHUwMDA1XHUwMDE4jSdcdTAwMGXUR8D/cudcdTAwMDd7hWeM4kxHhz5dWo8ghGSKXHUwMDE0nId/lFx1MDAxOInq50//XHUwMDBlgmhcdTAwMWRcdTAwMDSFSlx1MDAxYso/2YyEsfPjcUstP355I9+w1JqcXasznNL88YqnOFx1MDAwYttcdTAwMTaMXHUwMDFmNic+ifzrsWHIv2u+WP+fa1wifYqmXHUwMDA3fWTvkqcssD7nus9dKU9e823xvz1cdPykUmlQrTj/xnI4S1x1MDAxNOJcdTAwMTVWl/3JdzR5KKXwOzpXJ2h0v09UMaxi84JH0ev7/lpcdTAwMTPRXHUwMDFiQbaMo207cK/4xtlcdTAwMTXGb3b5azfyJ0DRUfynzs+IKFx1MDAwZnKvXddcdTAwMTX+JW+NXHUwMDA3lXXu/mZ5aHfdXHUwMDBiO3dUp+J4vDrLxlCNuWnzVltcdTAwMTOVlnySk8XejHBcdTAwMGbz3ixcdTAwMDXy0mPfT0/f4dpxslx1MDAxYUXTIcAz62yrXHUwMDFlkyRWVJpJse0gmV78WZd8/nbnb3z55364dGtcIuioc0c4qEhQoGpcbrcpTlx1MDAxZZtcdTAwMTWwce7MXHUwMDAwnUtcdTAwMTNcdTAwMDEslFx1MDAxNXd+Ulx1MDAxMi/UtZRcdTAwMWUmiH6q01x1MDAwNMljpKNcdTAwMWKZ5FxmXHUwMDBmW848cVxueZKtSy5cdTAwMDe0WtPHKcCJR/9PXHUwMDFmtPZcdTAwMDRcdTAwMWZcdTAwMGLyg9uhMC05j1x1MDAxNN3cXHUwMDAyNd+Y3NzqXHUwMDAy/Vq2kO26ymH6XHUwMDE2RrVcdTAwMWW+WSuCz0ZT6Fx1MDAwMFRqXG5Thdo+jdLXul1ccm7WvCznQDd8XGKOXHUwMDBmRnWmv5feaN9Qjvsu/37WP61S2StjzUdPXHJMNrPkTL5gpc9tsdvk5lx1MDAwYtFNrn9cdTAwMGVcdTAwMTif4Lqb/Djwutx4eWh+XHUwMDFkTk9cdTAwMWW6nVx1MDAxMpBNUi75lopj2GVvpHn5uZ/7K3aClkUrYEy4tTVrXulcdTAwMGa/XHUwMDFkh0d/mD89RNqqXHUwMDAwfPghJHE+XHUwMDFlJ1xyktL2NTtV9VpcdTAwMTnywSmLXHUwMDAz48N06IideYmyXHUwMDE4obWjK3xcdJtgXHUwMDA36+LIL1xyJlR6JcQ4XHUwMDFkTtSaXHUwMDE2R0RcdTAwMDI4przmbVx00mHZrkJNhOihXHUwMDE052BJiqz1t0frk7HWXHUwMDEzRVxuavpcdTAwMTCdXHUwMDEywFx1MDAxNzE3e6NG+PiGgiiEi3hupqQgXHUwMDE5yPv7p4BcdTAwMTJcdTAwMDLh5PDbjPTF6fZs+nTyeH1He0lcdTAwMDR9XHUwMDE3KoeE2ZCnlIpqzvElwKGygJLn/IEznps2R579308soFx1MDAwZr6s04NyRVx1MDAxOfpdhVrxiePTXHUwMDAzntdn7lajiTCA+a4oXGY2Qool0cRcdTAwMWY0VEbhui9qglxy8cabdlbl78/nW6kr90hKhMWy92FBdc/dX46H/lx0ZOFcdGShfMTe/FvGJZfyIfAgoFvq9dJcdTAwMDBcdTAwMWQlIFx1MDAwYopcdTAwMDF6vahxxYArXHUwMDBmULTN0+1cIjFOXHUwMDA1XZQ2cZ03P/FA5neVVVx1MDAxMJDCK+JcXL9DL8awQYE3L2oqsjQvo/uwf0t5O9b+etFcIorMeO+Jud86LsSogO3Sk42XOFxyfVXbXHUwMDFi6q1cbmTp9Vx1MDAxMGtmmtZcdTAwMWW/afTDw2BcdTAwMWNJKczCM1x1MDAxOVLJvKhgbar4UipcdTAwMTSdXCJlSoRcdTAwMTVFXHUwMDE0w12DOlx1MDAxYVx1MDAwNWWpp4/M+f964CZcdTAwMTj+1JWJ5qBcdTAwMGZ8uqGlPSfWqFx1MDAxN+Hc3Fx1MDAwZVWGtXevXHUwMDEzXHUwMDE5XHUwMDE2XHUwMDAyXHUwMDFifydcdTAwMDTuZ83ttIWe9Sfplie0JFx1MDAwMl+bNtzbVkI874Bs7t1cdTAwMDdOQ7E5P6Zxw1x1MDAxM0N3pmXZ/Oo+6lVzXHUwMDFlWvdf5lx1MDAxZlx1MDAwMvuaXHUwMDEwX3Ll/lx1MDAxZHxYQ+AtOfC5mrZcdTAwMWFcdTAwMWaw58dtXHUwMDE47460r1x1MDAxZU9cdTAwMTGhxTVcdTAwMGKTs91Yk4rEkeToUnrD5zN/5CTZ5YHvXHUwMDE3lGfttfliWYQ8uIXKQvFcXCPTnrNeo1x1MDAxOElCM4z1k79cdTAwMGY/YFxcecqQciDTgyxnlF32lSNRXHUwMDAzQcxke+1vjq49xs41j6afgmBcdTAwMDOWOchL4YFcdTAwMWHvR1x1MDAxNE81+ingLlx1MDAwZVx1MDAxZrcwXHUwMDEyJd7acnvdY75aOYB/XHUwMDBiIc24klx1MDAxMKFSOl3ole3Ze1r/7KX7+fn/9JgqjW+9aTNcdTAwMDW66oUlta1nuid28jhFtzLpk5KavVx1MDAwMpQm8F1cdNONXHUwMDFk4ftpRYpDUlx1MDAxZEFTtHzQmXpcdTAwMDFcdTAwMDBXXHUwMDFhZp6hm2rDKd/hWbGT3Jdi98eLoLfNvP9djiqYIUvyPFnVrzEr20BcXNNyYOHsOFx1MDAwMKxty9hcdTAwMDDYqnXxRzs0W2hcdTAwMWHmweVwXHSQrSGOo1kwLcK/rlbgOrvZVjaw1vVumsvgXHUwMDE16VXcPbR/XHUwMDFh6J9rKbtSMOivnzNPkXwo8lx1MDAwMGFcdTAwMDPUMDQj/d6ZUeV33nYqJ1x1MDAxY1qqnVjUL7NcYlY1icZoXHUwMDE3w7QyPnjG2nPSw/PebYpcdTAwMWV9WnUm7zHpjpiUVO2GvqXBOjZdTTLKizD6XHUwMDE4/r/98couXHUwMDAzzFx1MDAxM+u6Ko82N1x1MDAxNo9cdTAwMTd/dHznyHo6vFx1MDAxZl5cdTAwMTGcXHTijln9RFx1MDAwM75nhlx1MDAwNFdpgKpBflbsXHUwMDE3cCOC4mmDLlx1MDAxZlx1MDAwZnGGXHUwMDEyXGLGWGCB2OWo0ib0RznkVssn/vBcdTAwMGU6vNiDL6FcdTAwMWY5PmigbiDvf3uyRP7BSVx1MDAxYjWa8y5hsKR9da5JXHUwMDBly4Bw1XcxttZqqa5SXGbHNDfgkpjZS383x396bJ7IWeZcdTAwMWV01I+s+Fx1MDAwZiXbXHUwMDA3fFawxzNP7lV55VxuVVx1MDAxNpY4pU1okU8uI/8lYOGUv1wiWLvLwVxmz7dsoLhcZuB3XHUwMDBlKrbTVjqXW1x1MDAxMFx1MDAxNVx1MDAxYVgtc6hcdTAwMTgo06BVbS6B1CVcZs2etVhcdTAwMWP0Jve29/l3vFx1MDAxNYJPwMMt4Y4zXHUwMDFijPvFLZFRW6jhXHUwMDE3MFx1MDAxYlx1MDAxN5WBo+YzXGJ/3nn37ztXXGY2zfw8XGZLNNp+U/jvYZDj64lG01PkZVx1MDAxY2xfxVx1MDAwZVGonFLyiIFcXGVzcFx1MDAxYcD/wGKKxVx1MDAxNT3EaLn1N7l7li1fmvpccutcdTAwMTJJPlF0OfB+qPacP1x1MDAxOFx1MDAwZahNs1x1MDAwMlRcdTAwMDOI/+zDatY+YsrTh/dbXGIl2lx1MDAwMosrXHUwMDFj+vWRJ5rpXCKm4qnQ+DubYlxmZPS/e1ulWmi/QCvgXHUwMDAwpX62/W7i6Xu/xd+efrdHYdGJwnLHtnzJwlx1MDAxY3gwj0t017tBiT2h0PjO/Z8+oV1RXHUwMDE5iVxu8ny0jC/g5GmAlC8hXHUwMDBlXHUwMDBlXHUwMDBmXHUwMDFiY1eG9k15vfnJcabPXHUwMDA3N+aqjSVtzZtXpX86xjZE1J72MpQxflx1MDAxOTv5Vv19IJPuc7135GtsZ2F9XHUwMDE4XHUwMDAynOTZajOjka/Mslx1MDAxZffBzFwis+k89Gffj/JcdTAwMWQwP79iXHLs8yWBXHUwMDA3uLMkXHUwMDEyYFx1MDAxZH5cdTAwMDE4VdbjNNWGdzaveFx1MDAxZcD+zzaiX2H0p1x1MDAwZXv5aC9WXHUwMDBmSqE+XHUwMDFjQzpU1OYjPEg1kWKxn7GQr5i+NM1GrUzp/OSg/djTsyA4LmH/Yuf4KnVcdTAwMGZcdTAwMTVcIlx1MDAxZTSHb1+BXHUwMDFlpisp+CT3zsP2XHUwMDAw1Vwi/KiMoJuSXFw/XHUwMDExXHUwMDE1tMNcdNrIRdXDtCvXXHUwMDAz+dVwSGif7tbvQ73E8LlcdTAwMTZVXm7HR/gocXZcZjzKp6tcIklSSXL0v9dtf5hcdTAwMWRdU5GXT2rlp0OMi8CLXHUwMDFjXHUwMDFi5lx1MDAwNuQhi1wiiDySxnDG9TS9OdOcdGcl1lx1MDAwNCpcdTAwMWHdXHUwMDFiXHUwMDAywW3wMGVcdTAwMDAjzMTN+I6QsH1P5Vx1MDAwNnRcdTAwMTlVXHUwMDE4RVx1MDAxNauqs1m8+8HMXHUwMDA2pScl8Dt/oI6h5F9u8Xft7b97/+4n5vosedlE/ohSSkhuPbK/WlqCpmx71zyvs9l0v31bbHZo13eQXCLOjrL0XHUwMDE46n4vgVx1MDAwMEG33ynXKdbTXCLt/OaJw4lcdTAwMTiVXHUwMDAzWVxuefbaXHUwMDAxWn/E+tqwdinZbVneXHUwMDFkQoaRyfPAXHUwMDFm/mI+XFz6wanAMFwiyuXGIDFcYmN7+OvqXHUwMDBiw9bT91pW7pNcdC+zXHUwMDE0tzb7XHUwMDFkXHUwMDE12NSbXl3w+l640vJQqLa1uolcdTAwMWUjWmVcdTAwMDFI+7LnXHUwMDFisDngoZ8/rH6sllx1MDAwMiyTJaXK45nwXCI3TqDYK7JJZZin/vTuY8LKlVx1MDAxZPjtZf/joiU6fVXvsOMhW5cuJ1x1MDAxOGyk7lx1MDAwMjO0uY36XHUwMDEzRmjlePyif2G7Jl/5nqPYhMWLtYHdoFx1MDAxN3XV+5VlXHUwMDE0uFx1MDAxZr+79pSRPbZcdTAwMGIj+G0wjoTLdy+XbfQ/+Vx1MDAwN8hcdINSfp43UoRIXHUwMDE1Mr3I6/O9Tf9Va1ZK31lcdD3atu36t7dehSe9RsA81rcy54FmM1x1MDAxZlxuRvdDZpLkdXvPZ0BcdTAwMDbbU2FcdTAwMWRlqqBuXGbIjvic4Vx1MDAxMzhcdTAwMTBvoSqplTJcdTAwMWKMXHUwMDAw2JVbmegxK397T7+y9fa7cFx1MDAwNWH6uVx1MDAxOe/TUFx1MDAxOTbjK77gjs30WnBE4oMzcW9X5HKa6pSBpVVwfmNcdTAwMWZ3NH+UNcCXpJm7YyZ39mz3oO6EKzKoloNcclx1MDAxOZcvp0lcdTAwMDN4xYoh7nHmXHUwMDEy4zNcdTAwMTKNv+t82qkwhrz3kC3kQ45cdTAwMWNk6WxcdTAwMWLRPcK+Wr0ldqVYqFx1MDAwNfX9Tlx1MDAxM5tcdTAwMGaoordcdTAwMWKSUOJ7YlksLkzRtPtcdTAwMDQhXHUwMDA10udsryDMz6Hkllpd7KpcdTAwMTZcIlx1MDAxNbI2p3zWPo07sCBYLOFvzlx1MDAxMZT43a7ckEPM32/Pc7xUXHUwMDE4+2tcdTAwMDWE11g9vocyoMBcdTAwMGLrK3lfTEGnQ1jNnjDU3TVU0jVkZjNcdTAwMDKA9DWNpD7py+TxKC/tXHUwMDEzS1x1MDAxN4vG3E9qWWTeh30pINig195qUZnEklx1MDAwMZb74qKUsSwy+//4PvHx/e9cdTAwMTCys8hcdTAwMDSfhPUvXHUwMDE5fbNjOJ1W6dVcZlxc4rzAvb1sXHUwMDE2XHUwMDAwo7FcdTAwMTC9SiXNhEE+iSvzXHUwMDExXHUwMDFkXHUwMDAxtt6/Su9cdTAwMGJyuFx1MDAwZZX2omK27cgxyVx1MDAxNI68fXhFYJKer/I1pZ5oXHUwMDA1v1x1MDAwNJGr4JeTob91p4h52zk8XGYxbVxm+lx1MDAxZJdcdTAwMWWMOcBcdTAwMDMg3oOlOjvcaoxqS5WoX+19XHUwMDE4nElOWCqe11x0VzGl7Fx1MDAxN/L4PMmSWE0m81x1MDAxNtbv71x1MDAxZFZcdTAwMDfgOjTOrDdcdTAwMTlcdTAwMWNr7JtcdTAwMWarVVwiu2c1uolFrZ69uvVcdTAwMWHC+Fx1MDAxMN6f+tOuWK+zPVx1MDAwMj2snPlcXFORnmP5e4HY2UZh/pEyXHUwMDAz6dHV+37P+dJdIyHrXCLoXHUwMDFj3FQmXHUwMDBlh9LVZpBcYpOrPZNxcVx06jjpp3Wt8zIoseleXtp/9vng9uk0nZqGOowhelx1MDAwM+Na+Fx1MDAxOJ7NUFZ2/NPjl//mvYC7bMpf5iHTXHUwMDE1uM+KVFx1MDAxZc+/i3tNbnLiWF1cdTAwMDeLXHRcdTAwMThcbmdRrkOG6mc1XHUwMDE4Yax4XHUwMDEyiqZcdTAwMDTOoEf2fb/ITnlcdTAwMWTte2lvXrpcdTAwMDSzxJM6XHUwMDBixFwit886XHUwMDFlouM9PJB5aMhrSOsyylx1MDAxOOqvOVx1MDAwNUXoicVcdTAwMWPEXHUwMDAyPdJfXHUwMDFlPOSKXHUwMDE1gPmiOj53vFx1MDAxN1x1MDAxMr5cZtmrkpv0XHUwMDFlb534YK/MJXh286N8NotCpFx1MDAwZUh7vGNawZzfvKlcdTAwMWRPmFx1MDAxM1x1MDAxNU+Ei7f6XHUwMDEz7ibhe1x1MDAwMsUnUotTR8hsXHRal8n+9C7E/5lcdTAwMTdJJnJcdTAwMWV/XFxcdTAwMDDYKoW7t+mOs2lIozdpcFxcvVx1MDAwYpqwIVx1MDAxMNZ513b0U59cdTAwMDJhOVx1MDAxOJE9kZ/zM1x1MDAxN6Bau1n8YLhBXCLVXGZEikVccu6Qf7vKR5ZDklx1MDAwZfDBamctXHUwMDEwf86fXHUwMDFj+0FcdTAwMTZJ84TpnF/Kcf+uf2uc/5tZ0pYmq5lcdTAwMGK5XHUwMDFmW1x1MDAxMXVid2PMXHUwMDA3V1x1MDAwZqq8aELO2jWupDSeXHUwMDAwnKS5Sj9cdTAwMTVcdTAwMGWuxP55UilcdTAwMWTjKl9yxCSLq1x1MDAxZeCAz1x1MDAxNU6QiEdSllx1MDAxOf1JZ2RI3kiemK9cdTAwMGamXHUwMDBmxZE1jXFcIqj5kv76Se6rWaK8X29btInKU2t8JsJu+UA73Vx1MDAxY1VcYi9cdTAwMTDmTCXTzO40q/z7vV/lLbtccozYLpdcdTAwMWV5RmKjcHE7eM1gXCJcbkP0eZLJ9NHS3NU+pWeY6TGnXHUwMDA1XHUwMDFldav5VD43gfqGcptcdTAwMDBG3/VgXHUwMDEzbHyEjKhAxv/kKP/6LN+OQU1cYuZJnYRpM6BcdTAwMGZSnfdcdTAwMTnlLlx1MDAwMfpcdTAwMWTQc4CmuFB566dWXHUwMDE0QKdGRaRccuWSaaw6h1x1MDAwNTZcbkj5vVx1MDAxMVx1MDAwNLqXfbuvy+xcdTAwMTJcdTAwMTBPcrkt207lc+Xna4CWXHUwMDE0klx1MDAwZp6FhFx1MDAwZX3ix5JlXCLbXHUwMDAyv3NJ0HZrXG42+nd+isHKTMWir0vAvoDwdaFcdTAwMTWjhrWKbVTX6pu9qlx1MDAxZJQqo7/sz++Mn8N9o+ZxI7k70lx1MDAxZoFcdTAwMDDae0OzxTF4Vp/TkVx1MDAwMObFQuhcdTAwMTIy1KBdJ/fT+Fi1h/r3IztjXHUwMDBmb0tcZlx1MDAwMJm70rovT4asT4js/YlcdTAwMTOy5plvqEAh8tnnpVhwamVrXHUwMDEweWkjuVVcZoGfqPGNOYrfhFx1MDAwZmpAYpBGyOB3ZWneLVxyhv1gpfA9g5RRZSBqXHLNcCPk3o/pXHUwMDBis81UrEbgmn2in1SH55dzp9fn96mYXHUwMDA3XHUwMDE3RySlTF89Sv71fWRcdTAwMThhWvnlf+jtI//Tr2u92t8sdHJf8ndipMBxIKbgKrd+eXNcdTAwMGVExvGeprynj1x1MDAxOVwi18jo8kNmN/S23Fx1MDAxMP2dXHUwMDAxRYLQmdjVZZnI/abgZkXeXGKP8L6S/uZP7YFcdTAwMWb7Jyt8VzLeu5ulen2TKFx1MDAwMG8w7vFcdTAwMDe1087rQ/Jn1sy2SFx1MDAwZW9L+2OtuFxuZCpmeVx1MDAwMfDrSGtI2siyoCHRp4C641x1MDAxOGox71x1MDAwMaBcdTAwMDVR5iE4tpE58TtNXd9g758lXHUwMDAwljhQ9rHmKCZcdKgxgr62PnpcdTAwMDFh4SNu24VcdTAwMDW4XHTfbJ43aO/czlx1MDAxYp1cdTAwMDVcdTAwMWZ2XHUwMDBl3y0jg+Ql3pYsca4sWzXuzlx1MDAxYVx1MDAxOFwiXHUwMDA1dNWmkf/vR1SsjYlqskKTXHUwMDFjSdElfZSGvXBcYtmm7O5cdTAwMDXT1/L72D1ykEgrZetVv4L8T/aq4NJcdTAwMTUrKHt8JeDyXHUwMDFjOt9RmFx1MDAxNNJxXHUwMDAzdHzniYVLL1x1MDAwMtc7l3Sb1Vx1MDAwMl5rxSZcdTAwMTJfiWy9IfjR6Ci16W6cVF5cdTAwMTXeLWRcdTAwMWOyit+I+rrina6q9U9PpsqvXHUwMDFjz00ggqA9qaPAsFx1MDAxMaTiiFx1MDAwM57hU5dcdTAwMDRDVNpcdTAwMGYmVlxcpzPpS1hkXHUwMDBmSlx1MDAwZpfDttBF0NV80excdTAwMTlcdTAwMWHoduJI2zfm805cdTAwMTJCODMsOWXbXCKOhZhcYldNofc6yrHPOZ6nvHuJiH6CaW/EqJ5g4Lgp0KCyLMrvxcW/plx1MDAxY/3T98VaISNbOVxupFx1MDAxYjTo6Fx1MDAxNvplJ/p+2L+8OY2ETT1cdTAwMDW0MLpZRVFVcTtcYvpY61hOcFx1MDAxY5pNdJsoqFx0vVx1MDAwZclcdTAwMTVHI5ibV4ROXHUwMDEycsPrukQkXHUwMDAyXHKnxeua10VcdTAwMTVQZlx1MDAwZqZTcoWJXCLlJIzGMVxcISCnYjeyNeGQ7DEtx+FcdTAwMWUtl1umz25cdNTf2SayxZ5cdTAwMWKIXHUwMDFhQ0o01FJcdTAwMDOffOd5nmpcdTAwMDU58J5cZlxc5LeTndRcdTAwMWGYSJFlqDAkTUg/XHUwMDE5XHUwMDE1kVx1MDAwMsK3qvuSw0J0TWBBsbBcYlx1MDAwMdDTXSfjXHUwMDE5QtCWIFx1MDAwMkOF84VKdUJcdTAwMTaAvVx1MDAwMpQlJPGd1uFcdTAwMTjr4r6Hklx1MDAwMVGIg/7BXpJxTCMncv9sXHUwMDAy4pmT815Z6oGpxrvJSEtDRUzLUVx1MDAxM+3IVfPRQNCLhqur1sZFXHUwMDE5e1/Rne/cwFx1MDAwNGXX2LzG8lx1MDAwMlx1MDAxNFx1MDAwZWdfckuZQVx1MDAwMfaEXHIpJlx1MDAwMKuElMvpXCJcdTAwMDJq8Cijai6kXHUwMDE5U1x1MDAwZYexVlx1MDAwZVxivM1fnThxXGb0XHUwMDE4RqfnxvKrM51cbmqXb6M3Rb1cdTAwMDfZfki2WsY/5McykfVgvYiaOpmlUfE4TFx1MDAxMIhcdTAwMDVD8epjSlx1MDAxMdi88Vxu6lx1MDAxM1wiqq9Fjae0nOwmukSaLt0kXHUwMDAwTK3AXG6Wqlx1MDAxNOP9NuCM+FJbrFx1MDAwZkatTfm32lx1MDAxZXrhredcdTAwMWVcdTAwMTdjJt3NQVDVfdDfN+rNxZec9JJLXHUwMDEwQUBZorTL1c6u4tBrgajHXHUwMDBmks3cPF+aL339y5H641x1MDAxYvL7aGKKLPLUQcLudKX0NK7ugtBH759cdTAwMWRSyMRrwfA2VzX4XHUwMDBiO7NcdTAwMTlcdTAwMWNOQHt3b2BdS83E46v91+ucTnervZlutLJ4WeB91i9cdTAwMWXW3TRAZDGDYDk00eRFXHUwMDAx0W3FXHUwMDFkMlx1MDAwNTvoXHUwMDE5hVx1MDAxOFx1MDAwNntTm4WBXHUwMDBmXHUwMDE0Z7C15clxLFxc6SPO5YuK+CNaN/DVoVx1MDAxOf+6/8fzarz1VZVcdTAwMDWn3Tcz5GVcblx1MDAwMrmzto+G2TJFKGPDpVx1MDAwZXTp44L3zHv+0FxiPlqDSe95XHUwMDE40tXZ1stGO9pFoWWFXHUwMDEws1x1MDAwM6BcdTAwMTVcdTAwMDL237qEJb0gM3hccnE22JpcdTAwMDRcdTAwMWH8LfdcdTAwMGXNucZdfquZo1hcdTAwMTPQXciMhVxcbCtcdTAwMGafYONdXHUwMDAycVx1MDAwNamvt4KY8VxcvqST1jpcZjRcdTAwMWWEIPO70D7u35qYTPxHXHUwMDBm3WvXXHUwMDExNFx1MDAwZW9cdTAwMTNcdTAwMWWmflnOinXZXHUwMDE5joJNs9OvXHUwMDBmi1x1MDAxNY7xXHUwMDE2PY+WicLrJ9tcdTAwMTmC0Nsv6f1d7+NcdTAwMGKJXHUwMDFmsJSiRepYlMf6T6NySceRXHUwMDAzu4JcdTAwMDV8gDktkemOrMfDcbz54nLf94PMlmN6XHUwMDBm4KQ0x1wicmOuds52XHUwMDFjy+xYvWOg/Fx1MDAxZaBcdTAwMDChe37/Qpf+K1wi3oR1Jc5sXFyZVGB/1naZT/DuXHUwMDE5SUQz1MFcdTAwMDfrJjFcdTAwMTclj2Wv4Ilm1VxcXHUwMDFmauf1zVfSeqFcdTAwMTmBg7I8kt3X5mfZ9jvxXHUwMDFkjiZcdTAwMGWe5kVcZlx1MDAxZXnBXFzZXHUwMDA09ypxplx1MDAwN/26jZsxdFx1MDAxZlFLi3hcdTAwMTRs9Fx1MDAxMUPyQd9HXHUwMDAxrGBcdTAwMDbS6U0jkmvezlx1MDAxM0me/fngW5JcdTAwMTDAILHzPLtcbltcZo7qJ0NmjUa43XI8Yi5QSH2K3u94xlx1MDAxM1dEzInOSsmipK1cdTAwMWM8XHUwMDBmXHUwMDFlXHUwMDAxiki/XG70d1x1MDAxZOnxLZL1edXpUHrrXHUwMDEwXHUwMDFlyPbklYpcdTAwMTlgW33TRlx1MDAxZaMlr/OTpXMta87JXHUwMDAyqj7l3qVPrc7XvdO1nuIllOMrm3VKUE2UTjnl9PgxXHUwMDBlYTiH7Vx1MDAxNvOxg1F9VnN0WIyDoDVsbdq4dZbmoC1Zu4Hr1s9nTlPZ3r53XCIzW1aqXHUwMDEzPIzriDqFrz1cYqZcdTAwMThaXHJtem+HjofXSFx1MDAxOEeVMktcdTAwMDSBXFzO/vNtUrn5fZtcdTAwMDLP4k/4KFfgXHUwMDE1VoV8fLeeRC1cdTAwMTNcImyjn2TZ3fuBXHUwMDEzUKNcdTAwMTNCmaI1cHkpXHUwMDE3XHUwMDBmXHRcdTAwMDJcdTAwMDe7tp30ctXHZzC8KceqNH6dYqh0XHUwMDFmXFxcZuS+hVuNZeT0XHUwMDFiMN/3zf8mVXb5XHUwMDA1Wqj+zVx1MDAxZVx1MDAxM1x1MDAxNv0w++NM9ZJnk7NcdTAwMWawXHUwMDA0KfLhqK3hn89riGxOs5bJXHUwMDFk5dF+eIFcdTAwMTc7X1xujddcdTAwMDKRXHUwMDFkvVdcdTAwMTeSiL47dY1CooZozlx1MDAxMNWTNVwiaL815tmFyN/BUcD7cWquNGBn/qs7sXz6P7OvNN75aE1qup27aTOyXHIxaEOHpj3R4Fx1MDAwNVx1MDAxNKLHjJ2ZWVx1MDAwYpYo/6FcdTAwMDCEXGJB8Hc8Tlxy93ifeYpXbDzkOtVj/sa2XHUwMDE2PM5cdTAwMGLGsHHv8H2l5o5LnS6bhFx1MDAwYiDy/JiETlx1MDAxMdaBmvVQniqOzGI0sunC85Itr/o2IyssRytcclx1MDAxY4jkcbC442w9csP8MpOxca8nyFx1MDAwN+mWY5mp/+uR2IHpaoy08UqrT53WYrRcXD41L9W3/m7bzHy0zNWcp8DLhlFGt0jEWTvu+Eu364T1OEj5f4y9R6+sStdcdTAwMDY296+wvimWyMmWXHUwMDA35JxDXHUwMDAzMzI0ock0WP7vpu/73nOvJVx1MDAwZnwkdPbuTVx1MDAxN1WrVnieRdWq4lqlz07AIMYyXHUwMDBlwuwsyeS6V4OS2Fj2XHUwMDBi/uawJYt7Sckl0kU3pjB/clx1MDAxNtbl/PxcdTAwMTHfXHQ0wad3+c21JvlcdTAwMTCvWUfzXHUwMDE1I9dHeVx1MDAxYVxyKiRcYqM2XHUwMDA3YZe894tJVfBcXDbt0Fx1MDAxZFx1MDAxZaIn19HpQVrvI9VHqmhcdTAwMTmD7Vx1MDAxYc2LeFx1MDAxZpG3K9Z/v1B8r2+GXHUwMDE30Fx1MDAxY8PkXHUwMDEy2oVzjCC6v700Mo+2XHLrpSaLKcGE2mU++qlcdTAwMGWK3jPBXHUwMDA0ljaoUEpoidtcdTAwMDP3QlQvUe9PXHLG31x1MDAxYYvm1+YjzSRRXHLZzO9cXF9rbFx1MDAxZK26TnuhyiRRXHUwMDAwfmsjXHUwMDAy8Vx1MDAxNFxuu72Sb5G8OuJcdTAwMTh9I1x1MDAxOStsuIs96lx1MDAxZLHW/86fyc5cdTAwMGaLXHUwMDFk9+SNhoT1wti0pmljn/O2iJp/eTNwmVqCScxf3dQ8I/9cXFx1MDAxMnilWD5+Q8iO+6S6Y+7vddFcdTAwMWPKXHR8TuZINVB9XGIsO2FT+Vo0vTv1zFx1MDAxMazZ8fb28le7T2MoTt26OYlcXOq3L9tI+yBdcVx1MDAxNVx1MDAxYY01gWw9prxT+DNuN/eZx1ftoGU411x1MDAxYno1tyr65PDbM1x1MDAwZkFTkek6ScLf7U9aKqzTd+G57ZVuPY3E9uJsQdtivWqf3vlfKihXgsJhXHUwMDE3XHUwMDA2LH6khb9XLlwinIszgfXeZ1rHTHhcdTAwMTOfrJ+u8r+5Nn1XJFY7hbbPXHUwMDFhLJVI+HE0VrF+xniLLLlCXHUwMDE48e93XHUwMDAy/I/vWpFMZOPpW1x1MDAwN1x1MDAwNlx1MDAxZU/IYFx1MDAwZdxcdTAwMTc+SrqBfXPB6V9nx7FcdTAwMTQ7ees33N4vb1C+VNUmpf21XHUwMDExPbxH3Hyk9N9cdTAwMWOzTSmOefc38DCvXHUwMDBi81r/andcdTAwMGanepi75LVcdTAwMGapOo/0WPhcclxcq7XHkudtIbLCvDtcdTAwMWPkXGbdXG4zgjX+zlx1MDAwZryxXzyLXCIgz+qiitBjSFx1MDAxZClcdTAwMTInXCJcbrCkXHUwMDEzJle+rm+7/XK8vZoyZVxuJuFcdTAwMWHZ5JdcIij+IdTypHtSMumB/acuk2Kx949TXHUwMDAzXHTE7L6iZFx1MDAxYUfi3+R3XHUwMDE0qvWpq8RcdTAwMDBtXUqRXHUwMDFmjlx0mo5Dplx1MDAwNn5cdTAwMTPxq8fN8VuKd/Qr6bVcdTAwMDXTm1x1MDAxZv+ubfnXOsLYe+KTfoC3XHUwMDEyViQ5yW6zpqSB98ZlXGYlXHUwMDE3S1FFJ1x1MDAxZsH5KWYt+HwzNJ91ca9MQj9IWqwv8U3jfzfGxPzDh+QqXHUwMDEz/Fx1MDAxOTnuolqXlbB6vFx1MDAxMp2GcmZcdTAwMTlBM9H9isZ/3l1cdTAwMGXsXFxyXHUwMDEzR95cdTAwMThlXHUwMDFk38BZWyn+XldMLqpHMuLfOSf4dGqyXt5gfyO+/lx1MDAwMlx1MDAxM5CVvKpcdTAwMTZZs7s5yEiXh/JwrMfXoqtB8cTEXHUwMDEyXHUwMDA0mFx1MDAwN9C9eFx1MDAxNdfRbGs/QlH9XetW4Vx1MDAxObJuXHUwMDFlvUEs+OHy5rKhelx1MDAxNWxcZiAqhFRwrZumerTLlHFcdTAwMTe/kPifeiPMM91cdTAwMDIh25bWPfY4X/yKWoyHMP+4u1xuglx1MDAxOGwmzvVSsnFcdTAwMWJT4FCfaVx1MDAwZqNdfWhbPX1D+D2kLCQ4XHUwMDFjXHUwMDA3spzrNqIoZW9cZjNm7S3YPohCXGbXV+flXHUwMDBl61x1MDAxZuzQsfkvz4efVY1Kt8BlKG2D37zvk9xpSn1ogtKSfzlyW33abfuXwSHqZH9cdTAwMDHWXHUwMDFhxW8hdy50+4jv8n9cdTAwMTZf1EH9+LXIkWp7btTgSzTLjO2yXHUwMDAyQagmKKXra8rXKa3x85deXHUwMDE4mJgjjvWKRFx1MDAxY7+3m0PtvCbtzFx1MDAxMFx1MDAxOeTPe1x1MDAxOUdcdTAwMTBUxzxD0aJcdTAwMDeMiCmnM/lcdTAwMTNcdTAwMThNLH9vo21q3ihcdTAwMDPL+/35q46pwXyFN9vzl1x1MDAxM4VfoJT0NceBy+o8pfybTzOK0P5qvmpffFx1MDAxNXAyQWiYLuOwj65XL1x1MDAxYXg7R/Xrw+V/3YuwXHUwMDFk20Gc+NqvkX1cXMW4p4FdMD1cdTAwMGbzSCxVVM7mf3KmveIwvz2Hq1VpXG7WXHUwMDAy9EqCa7tyOpxoTsmE75smmPo/bY5cdTAwMDEnXG5dNiSI9jVga4JVyn0v3Vx1MDAxM1x1MDAwM2r9XHUwMDBm3lx1MDAxNiaTsbR9Z7Fz8FX+XHUwMDEzsu+E9OF7vaXvIVx1MDAwNUZoxLveXGZcdTAwMWb+P321uFx1MDAwZrve2/h8OoR0fMhcdTAwMTOSPdG0XHUwMDE51Hr6Y99cIlx1MDAwM/xyy+1OLXd4wVv2KoKeKkCmi5TdXHUwMDEzrFWIvlUulr/15WbDOaws6q8sqYdcdTAwMWPI5YZcdTAwMDJZyCmmuvynPbZkOebj7cbRIVxcv2UjTFwiXHUwMDFif3q0riSuXHUwMDBmniSgKVx1MDAxMFxicb+9W7zaXHUwMDBmg1x1MDAxYmwnZPI4YHiSYOE9neeYtZ6G8M9+hUeOgjvJ2lx1MDAwYk8xWfaR/lx1MDAwMMlKbNdcdTAwMGZqtFx1MDAxZP4pflx1MDAxYs9cdTAwMWZcdTAwMDfz+IvTyoXC7PhXIyggP5SvN/7X8df3o6r8II9cdTAwMTQ2sFhs/J3jiX45XHUwMDFl6Fh02GDIZVx1MDAwMUG2JTuDXHUwMDE4bzy7IHVcdTAwMTbRn9jHr+S0bTNcdTAwMWLROlx1MDAxZMnjLPt6LerH/UZcdTAwMTDC3Gz+9/TcX47ZuX3TIFx1MDAxOG9+a5znXGaZprh6rLF0Q1x1MDAwNzG1XHUwMDE5Sv60yTtcdTAwMTaaaVx1MDAwZp66XHUwMDFlZIdg8/iQLUBabUvFb9H4u03/q/3apF9cdTAwMTjKcFjFq3dcdTAwMTU2IFx1MDAxMGlmaGhCIN2FTrJuytQspXCCNm1Zelx1MDAwMUumXHUwMDAyRWc7xVx1MDAxYj/LIP47/1er+WM3XHUwMDE3fpLrcFx1MDAwNpPtUzRcdTAwMWXmXHUwMDE3XHUwMDExdU2CJ7VcYpJv3iZcdTAwMWa3pj9cdTAwMDNmpbbh9GBp/flcdTAwMDJL892Tcy/5budY2J98629upmduXHUwMDE0k5S10p8rlpZcdTAwMGIk6mJcdTAwMWW20orZXHUwMDBiMqwxMMcuM35cdTAwMWVeKlx1MDAxZVx1MDAxM1x1MDAwNGHGrFx1MDAwM1x1MDAwMFbAg4Fjz3nb1lx1MDAwZYVcdTAwMDK//9Hxv979XHUwMDA0jOLx5fdcdTAwMWGrVFx1MDAxNkf2vZJcdTAwMTFlq+VSvFeeXHUwMDA3/Fx1MDAwM1x1MDAwNZj2VStMxKnNfcR3csBAPqAkgVx1MDAxYYum8+q7XFylTWKMP7ZcdTAwMTiLlfKObKaRaquwXHUwMDBi4P1cdTAwMTaJIdQ8XHUwMDAxUzzuhUOidHK1r3SK6nr9gCZcdTAwMGVt6Fx1MDAxNJDvulx1MDAwN1x1MDAxNV9+II3DaX3m7/WYXHUwMDFj21xcXHUwMDFjMz798Fx1MDAxZIQuiWLx4MCgXHUwMDBmXHUwMDFmMK9cYnrFn09istCI0784XHUwMDFmSKc09ZKGZF41xFg/ftWqPVCvZV1Oe72IstH/xd1kMVxuR6N+XVx1MDAxYdtp2UBO2CeelN/O88CFesFcdJ0nXHUwMDA0i/ZHdWuWXHUwMDAw1ohp3lx1MDAwZthcYlnNaVx1MDAxYrN7vfBeV1VcIvI4d/9+iGJcdTAwMDZPPv6Tr2dq/Vx1MDAwMUk5nkdvJpy+TEvFPFx1MDAxZqNcdTAwMWLqUj6Q0Pmt9qxcdTAwMTZ4XFytpO9cdTAwMDfGTdjwUYJcIsnmcszDXHUwMDEy3KtcdTAwMDZ7raripWxHXHUwMDE08juX/uQvaob6S7dcdTAwMTCgXHUwMDFmmFwiS1x1MDAxML+Ps2JFNWJEhPKu92J7r1xmJqBCyDRovXht7ztcdTAwMDd6fyrJrajH/Wdrzkrbn5iuqNRDXHUwMDEwyMvLjDNLuuIws1x1MDAxN9zYc32/0NwgSE2Zc1x1MDAxMYuhV1x1MDAxZLDZV3bOXHUwMDBl95z21lxidrV5hlx1MDAwNmV+Q9BROd3a+Fx1MDAxMy/5K2byMC9zSl8xOYRcdTAwMGJcdTAwMWZcdTAwMWFeovhVKPAsus/UzVfQXHUwMDAwdK0+c1Z/+GTN18FcdTAwMTfFw75cdTAwMWRcdTAwMDLohLFcZpb9wCtOPf5+R/2fnGf8y3megTRcdTAwMWHV4MeDsD2mXHUwMDFmXHUwMDAw81xcv4tv7DjlvfO94HOPkUq2ILOc4Vxm70b84r9almhOWFx1MDAwZnivJ5uyxPNPo09Y+MtWw1x1MDAxZbHMU9qO9DFWUZtcdC/SXUfn+Fx1MDAxMMZcdTAwMWW9XHTqQKw5byqsT+InjVYvPPJcdTAwMTLHXGI/XGKGZlx1MDAwNTlcdTAwMTWTXHUwMDE4fP3Za6bx3c/XezvBRe5Ws1wiXHUwMDFlpcA+wUXEXHUwMDEyWOBcdTAwMDD1WTpvXHUwMDE3fbuCXSv8yLHvr9tcdTAwMGWNq42o7J5F5Vx1MDAxNpzho2N8nv+si7JcdTAwMWbM+fhQajrrVyxH8JHGxMCf7iTQNZY7d6VDanpKXHUwMDBmr3JcdTAwMDLhM/qEXHUwMDFjxL1GXHUwMDAzXHUwMDE0XHUwMDFmX2pcdTAwMTQ/MpbDxfnXWs1Q/MW4w75gOJz9RHuNR1l1c72QbIvj5jlcdTAwMTc9Qd2x3ymkXCIx4MLydExcdTAwMTSq5ZvNQ+3seVx1MDAwMdFXZ3+ShmSUTf7X2PNcdTAwMWZ/6ZNDfj+s4GFDn7T84qVcdTAwMTTSmLkmZ1x1MDAwMJycICnJOJKimfKn9DhcdTAwMDYtXGJi7PS0/Vxc+M9Z7fWiXHUwMDA2v1x1MDAwMiTgP1xcvdZz5TdPx1xymvxGXHUwMDAwqe6Aj07hUT5fcof0ouJ6cjarv5rOp75cbr/1M0ay96Ing5XMflxibv1cdTAwMDRcdTAwMTZeJIjZ/cOhXHUwMDE5/4e5LULuwPEwpOx6XHLT9Fl1XHUwMDE532vunVxcdW95XHUwMDBmr7/p/D/1gY26XHUwMDE3tVdW9DpFjYJaiVx1MDAxOMivTrHht9E95OFv2S5r/8upvFx1MDAxMH0/XG5ASFmVS+uSKEmQkeTHclV9YZktuzdcdTAwMDCD0Sn+7blfRYN7PSqFgObdVu9K/WrqXHUwMDBi/zq+TvpcdTAwMGbTr/7ZXHUwMDFjzDHmj1x1MDAxYsmjviCx/P6ynlm8feDsuUvbf7VEuYVE+1x1MDAxNLul/vRcdTAwMDIkkdDBjsa/9m18LfXLUjUpn7jgs1x1MDAxZuGf14sz493Y4effTaDNZrnYZcFRo0v3XljmUF6Ig5Ir9DBQd3cy5vNZ3NedcdtJb+T7/HROa5RZsFx1MDAxNlx1MDAwNkkvzVx1MDAxZt/y16Vs9JvCWDnVpm9ypyhdoV63TGFy6VLjkDTRooZ3XHUwMDFkws31/OFUST9WY7xcdTAwMWWRrv3KLihcdTAwMDaalMV9SOz5d4jRSFx1MDAxNeOK0YRuXHLPx01cdTAwMDLgizXMXCJcbu1cdTAwMDdcdTAwMDXMwKTXn9qCKWNcdTAwMTGrjPFZ5mRXwNx7XHUwMDE1XHUwMDE17VGsU6vdXHUwMDFhlTFJs2mKz79APnuZjOFcdTAwMTU0UIpaXHUwMDEyOVx1MDAwMjNcdTAwMTeQeefUXHUwMDAzk9rJhFxc7zvmzlx1MDAxYixpXHUwMDEwlCRcdTAwMTlcdTAwMTfWuvf7vnhcdTAwMDVcdTAwMDOdvFSE3mwr4Fx1MDAxM36hNjTV/36n/p+iXHJcdTAwMDLjnTtHXHRhVcKpq21/5SP5PX1cdTAwMTFU4/J4XHUwMDE23mS59k9cdTAwMWOjXr/isZTvcZGlvEz98Yb6NKS/tfaAx77PXHUwMDE5pt9Oyv99nsbvKoX6x8mAwb3woFx1MDAxZaCFQEdv2bUjXGa1NFx1MDAxNDk66kowKv/CXHUwMDEyXkczWlx1MDAxYXQxdXrOdtGbnlx1MDAxMe1fXHUwMDE4i1x1MDAxZlx0aDkksWb+5Vx1MDAxZpiff5D1K7C/2818XHUwMDAwyCWMY2ZcdTAwMTDJXlxyMYOeyFKdrNut9crkXFzZWYWRp4pgf3VcdTAwMDew39nFPTYozzFDXHUwMDBilPdPgVRAOZmvitqyhXeob6nhbz9hR6wzcZC2XHUwMDAxnl9iWpnI8zdKXHUwMDA0PZ5tXHUwMDFm8eFMXHUwMDA0WXD9ObdJboYsz6VcdTAwMDZcdTAwMDCvRfxQmGlcXFx1MDAxZfKIl/mn3zM21sqLXCLgXHUwMDA3KDCm+ZlCRVx1MDAxNZVqqXvaZlx1MDAxOSXiNFx1MDAwMbKj8+a0O9aRNv7lQFNI6Dn18UJa8jlcXMZaXCLKx60vwkJYhFx1MDAxNSpT/2vvXHUwMDAwd/7O8LCaZEJcdTAwMWYu+Fx1MDAwMPb3Qsr4pkgs6Fx0U+JANTLEJtp8XHUwMDA298FNXHUwMDBiXHUwMDE3PGxQt2LXa1x1MDAxYlx1MDAxOENNX0S+21x1MDAxMiNtZcLL4YTvP0tff3VcYplf3Hxl7fzpst7xzTFFxmmedf2SuuVcdTAwMTN/ueFcdTAwMTXyQ2reXHUwMDE1K3uId6GrruzfKXJcdIyG31x1MDAxMG5Vv97ypl3lp/Vm/+FdtFx1MDAxMHNcdTAwMTjyNYD7vqhXxVHHglx1MDAwMdDTXHUwMDExQFx1MDAxMHrYp9XggthcdTAwMWRtS8pXJKyOOWAoRK0w4KuESfFbRtFccmUjiPb9Ye3A46f1/7eZY2r9xGaqXHUwMDE07syws1x1MDAxMktt/n5cYrZm5jYqzyW/qfJq+SBV4J9tjGKAXHUwMDE1Y4nRgsXStblcdTAwMGJFOvDoXHUwMDE05NuXVPCJUeVJ2N5LsFxcOyfQf+eEnktuXHUwMDEzhs2W6Mj2NYY3XHUwMDAzuu496/FVk1x1MDAxMLAzvXYvNM1cdTAwMTl6Vqq+XHUwMDBmK53GQ0GZXHUwMDEwbWtr5lx1MDAwYj+93VudwDVtXHUwMDFlSLXInjOsiVx1MDAwNFIvXHUwMDFlUv7lXHUwMDA2XHUwMDAwT2HyJD+6XHJfXHUwMDEy1IhcdTAwMTbisXj/V1xuVEa5nOT3j8NcdTAwMTWHROHIZcxcdTAwMTIj3Fx1MDAxMlE88UDwjlxibrJx2ig/gtv0fMH5iVx1MDAwZf/aWCR/XHUwMDFmTqlbMEBWvzNcdTAwMGIwdeBcdTAwMGJcdTAwMDLZlryIXHUwMDEwPKi4XHUwMDA3cdf7N7GVlsrKsWHflG/IwXuuSJ6QmjmrXHUwMDEwOrhNP6LEfUyAkTVi64/Of4Lxh2dLI+vR1Vx1MDAxY1x1MDAwNi0uPYFcdTAwMWXx61x1MDAxNdbxx+Y4qe1NNafqfGPGv7Bk/L5ETVx1MDAxM8L127Sua8OoNolcdTAwMTiAnJdcdTAwMTV7nZb8i2c+V+P98Fxc8Vx1MDAxOCA+VT+ZkMMjdlx1MDAwMPpcdTAwMDBcdTAwMDZPIMfUQuhsXHUwMDAzd1vmlS5cdTAwMTl9yVmtLZdcdN8gaMbiSVx1MDAxNOxAPKojvm1W7U9z6+DT9+/1j/95L8uzP8wgOtemfo9SV4fapSv30f1v5vOY3JJcdTAwMDFcdTAwMTV8XHUwMDFhLP6MdoyzZOwxSz+MXHUwMDE0XHUwMDExnC0pXHUwMDFhzcORXHUwMDA3bJHt+zGIt6aj2VxcYIZB/3/O64HPyW1cdTAwMDYrRlx1MDAwNmbmQk1BJZzZXHUwMDFliMVd717zoTeK0iDR1ptMdDGrXHUwMDBlkvJ1m7YvKFTEN8qLYFx1MDAxMmhcdTAwMWODY/ORtjjjTP6xg4/yWzP01TlcdTAwMWHio1x1MDAwMVx1MDAxOXNcdTAwMDSfU39cdTAwMWWmJVqP4JqjnIlGyr/rmLmbmXEht1x1MDAxNVx1MDAwYnRl257V9a1LvDlcdTAwMGJt3/g+RpxOIZ6TNTZzuNow/1x1MDAxZYfrXHUwMDA1v7lcYlCVXFwz6eBEd9rScWqqXHUwMDEwffhR4NTQXFx9IXOzXHUwMDA1ikDzkjfWvtW8yNh2XHUwMDE0po2MMH37pnDamGjzjWjoTaU3XHUwMDAzXHTC30CAUX9rwPq75Vx1MDAxOCBe3YGDNz9cYtl95p5gtM7LXHUwMDE1tFx1MDAwMrIvqjvU74hWOFx1MDAxYvQv4U7gz+i8fFxyXHUwMDFkfXavjlx1MDAxMW9jQFx1MDAwZng2j1x1MDAxNNA/SUOO/8SrnOnYlt8jy1DeSfN1zVnal4E4LVfFxyBKknh2atVV9l1xbXCbJHFcdFxinzVaWNU0LURVvIzs9ydrUVx1MDAxOLwgvCB3S1x1MDAxY8mmXrh/xYBcdTAwMTbrXHUwMDE4WVx1MDAxZZ1HXHJOzqFcdTAwMTfUn1x1MDAwYoKUoea7221cdTAwMWZcdTAwMDTg69Wus8Y9WFx1MDAxY86xfTywRVx1MDAxNclvrVx1MDAxYrT18c1cdTAwMWNcclOYXHUwMDFienlrlFx1MDAwNaZo+12+OVxcXHUwMDFhOyfyPzApr/+K7TfzYLFcdTAwMDepMTC8g42kqu6yXHUwMDEwXHUwMDE0MC/nXHUwMDBlfpcsRoG+sJ9+O59324jMxvJCXHUwMDE0lbgx4lxy+lx1MDAxNbBCefnxun+XaU/Gg7ygjXVRyXrjw3LYKlxcnz77j5+tI6WumVx1MDAxMLaidlx1MDAwMiU0fzWA/XBhaFx1MDAxNFx1MDAwZpHk8+UzYfWuM9OHatdXhVx1MDAwMfqRu5rwhDVlia3aXHUwMDE4lNfZKmA7XHUwMDA2wFx1MDAxOKbIXHUwMDEz33Tntmzk6+zgh/CB/1e+wTFY+MdhXCIr9/zv3lx1MDAxNfdXyD5+IbtQxCo2XHUwMDBiI9nLxInBoYHcXHUwMDAzgVx1MDAwN2a478f9XHUwMDEx2tK0uTk6XHUwMDFlocV2h4x6pqxcdTAwMDTFXHUwMDEz7p4t3IOZzd9cdTAwMWHyW5a9XHRa3ZzWW36Kdlx1MDAwNpb+9VL1ad1hdY35mthkxtaKWyT8/oLZgYI01Fx1MDAxNTj2zqN4j+bm8KIvtypwXHUwMDBiQFx1MDAwNVxiemOL0b7Xjj7iXHUwMDAxosBZ3rpS+5Q8zCvjTsPq61MgilxuiHm3/vyxp/FcdTAwMTdzy1xcNfFsU1x1MDAxNDK+Xrtl8tRX1CZcIlx1MDAwYkNcdTAwMTHPuuTe9zwoQ86cRGp63Vx1MDAwNckufH5JYdLiyc2pXHUwMDFjtVx1MDAwMVx1MDAwM1x1MDAwNPSLiiRjkWpBklderVx1MDAxYVx1MDAwNsdv8DJcblx1MDAwNc/8U9JQMGv1x+PGkOfsOOhWO6DGfVx1MDAxONeU3PNSPFx1MDAwMX401lx1MDAwM2A189XxkOquXHUwMDE00jqA5VTay7lcdTAwMGb2g1xccfDihlBDXG5Gk1x1MDAwNFR/VKZ6QKg907o0fFckXHUwMDFkffC2USeX3lx1MDAxNs+s/073LL9cdTAwMWOXbc1cdLXdkT7cxVx1MDAxMH/R7c5RcarC6tV6nXLcjsPxeJGrdFwiOJV/XHUwMDE1XHUwMDEy6i45uUFtt1x1MDAxMe0tcbq1Wlx1MDAxZYmRZd9XRyScq0fvoVL422DdmVW7WVx1MDAxZcjxv95cdTAwMTUqLDP+lZNcdTAwMGZUVV1U7Vx1MDAxNIplXHUwMDE4vKhsXuU5TN47gO00b0JcdTAwMTloPofKfbo2XGa65fhK7TZ9X5X4eeFrveGm45m9+2JR9fzulGhV/tRcIlVKz4WvXHUwMDE1d96BdEaB9tXonsl9Ju/KW8D4+7yzv/LJXG72KFx1MDAxNIw0No9OnudYSIn+Nsm8XHUwMDAzp1xmQjhcdTAwMDMuLVubXCLpt9e7I+jVy1x1MDAxOa5cdTAwMGJcdTAwMGItw187iV+f+J6IXHUwMDFlXHUwMDE2JU0zpvttoc9UXHUwMDFiXCKSRfBIJD5cdTAwMTf773HA+TP/pCFDVIQ4/iN3jmWa34Lv1XnxXlx1MDAxNp4qMe6pt1x1MDAwMJ5cdTAwMTcx3lx1MDAxYipbUUx+p90vM9FcdTAwMTb33e9cYq3Wi6EgXHUwMDFlN/Zw/SvgcC2GOVx1MDAxNmtcdTAwMTFBxHWSVCWHNFx1MDAxOJRcdTAwMGJRhFx1MDAwYlx1MDAwZVQjf+OfXHUwMDFlXCJtXHUwMDBlv8ZcdTAwMWODstj5XHUwMDE3YFx1MDAxNTjgt+ZcdE/WXHUwMDBm0q5dXXwttJFI/XdOud18XHUwMDFj2k5cdTAwMWU+Olx1MDAxYVRcXC6QfdFcdTAwMTJemsPlJ9Pl+Fx1MDAxZWTlSYDW4dXkmcnPXHUwMDE06Fx1MDAxMlmTK6WDrcT30D3nwenZm0qoh0/oj0uniIj6ZEx6yv+mgHWc/96XyUgoW6yscXqSXHUwMDFiyu/cgGWx1f3Gw+efSLfG2HLdYjrtfY98T1x1MDAxZvBFweQt02hcdILsJzGHnlwiLp1D01x1MDAwNk5ewUJccm9cdTAwMTm+K2mZ3y3c87azWcIxZlx1MDAwYshZ/8KmtaO4p6UhjsS7mSiotvjuXHUwMDA2J1x1MDAwNKpcYqWl8idcdTAwMDNfu9b57kV3JLZpcFtYXHUwMDEx8CHSXGKEydFJLIpcdTAwMTcyXHUwMDA24/ZJz1IlXHUwMDEzq511cFBcdTAwMGXX8/SQzGRcZjvotLJ/b5yWmVazV95cdTAwMDZw3ko4gqaCXHUwMDA0/cv4ntia/t51LfdcdTAwMTBEgK3eZbW9+GzYZmBug9xuseBXPuTRwocvvtdcdTAwMDDzII+T1FDU9Fx1MDAwNj/rS4m+WFS4hzxcdTAwMDRcYoSa4yf0vVx1MDAwMdSFXHUwMDEwrkeR88Res7KXj72vMDQh3PB/Rdh57f76TudeQznSjP9vm5RcXJ55woIxMo7/xnoma1x1MDAwYlx1MDAxOcTNI0uF7eFmSVx1MDAwMlxcXHUwMDBmqOLPtzE/XGI9169cdTAwMTiMLOiFw3ZvSVrZhVxcVVx1MDAxOVLwymf9XHUwMDE4mJt18FUwh8OWXHUwMDFl1HbBZUyqmZVizSyTXGburM0hTqZ+4C9cdTAwMDPknFdcdTAwMGKinVx1MDAxM/ROvvZwx57i40SEf8dcdTAwMWW5c1x1MDAxOKzG/bOmfstcdTAwMTks821cZj9cdTAwMWPiWtuS1umvfo3VQVoukdzmwraW1r0rTnn7QmC7PYlrSOpe/S70yUFVjPqayL7xRVjDxFx1MDAwME0r753CVvx7XHJcdTAwMWJ3XHUwMDBiN1x0v8FSTlx1MDAxYaxcIn+Hf/D8V4X2+Ir3XHUwMDEwXHUwMDAxUFx1MDAxZbxjXHUwMDE3TP9cdTAwMWRcdTAwMTZcdTAwMTlGtn/vvCnsXFyMhC1cdTAwMDT5raBcdH1a7LXP6Yd4RSzu9rBJltbkVrE7VTMuyP5NmkVlbTMhkGHo2MtWoC9oXHUwMDE4RZlcdTAwMWLmYk+c7+GvxPWtyUPXrvJcco4gX1x1MDAwNK2/j2JcdTAwMTOXOauXmVx1MDAxYzYnK2IvylxcXG5AbFHmn1x1MDAxOPa7wNauN+j1XHUwMDAx78tcdTAwMTBetKywXHUwMDA1Mni7UOU+XHJcdTAwMTdRXHUwMDE45ZLWjqhcdTAwMGJ/SJpA1mWCWU2GjMmORe81i1x1MDAwN8xJ+b7fXFzfbZ53vF7j2V0oq3tEXHUwMDEyVcNoXHUwMDAwUHn/kESgUEug8F7EL3KgrHi+j1x1MDAxY9tccqY3jytcdTAwMDdcdTAwMTcv8Fx0RVx1MDAxYshcct+eb3NvfsbIr21oZs3EUpQyurdcdTAwMDVUXHJcdFx0/7KLX25cdTAwMTPnTm7V/aNcdTAwMGVY+2HrXFylbCaDIcuwx6LpXHUwMDA3KGwmZcRcdTAwMWKdVlxiXHUwMDEyXHUwMDBm9db0aMZvJ6HRTIrgXHS7lidcdTAwMTA4JVx1MDAxNW2T4/zBts6m3XX9XHUwMDBl4P3JlexccmZcdTAwMTVcdTAwMWRR5NqndfBx++urdlwiJ+jiXHUwMDFjfVx1MDAxZkwsuVxcelNcdTAwMTVcdTAwMTWsJXGb85f87upbgIikrks7wvPlYvq5XHUwMDExxyFcdTAwMDXTf2rF/K6Q8jUj5qCtZIyqvVSSg0NFsYTqXHUwMDA2yVx1MDAwNN1Sej1cdTAwMDUjrTpcdTAwMWPGXG4uSK5MpTmLTEGQXHUwMDA2X/3h8efa61x1MDAxY8i/XHUwMDBiXHUwMDFhwnBcdTAwMTcrXHK5XHUwMDE4epF7uVx1MDAwNNuGYqfaiPBmwb0w88k1XHUwMDFlP1s40ddcdTAwMGa64+gwqUDqfthcdTAwMTVcdTAwMWZ6ue3OazOMQ53P6+hNMFx1MDAxNyBXmbO9dlx1MDAxM8Cb5Fx1MDAwMS1m7Vx1MDAxOVx1MDAxZFx1MDAxYttcdTAwMDD8+TxcdTAwMTNcdTAwMWZ3alx1MDAxZqNcdTAwMWRJSOlcdTAwMThcIoH0zb+8/NszTlx1MDAxYz01YzOdZVx1MDAwZihJbyQ6xVhcdTAwMTjfO/ZRz5tjj1c7fPhccpGKoWSFlvlzPfOHsVx1MDAxNCBcdTAwMWFDwFx1MDAxYUTq6OaILEChT1x1MDAxMNN1W1x1MDAxZHCZXHUwMDFh83Pxnj9cdTAwMTRcYmhcZmyYXHUwMDA15z1OmPd32idlfVxcxtA13EHbx+iVhcCCfD7zsmBWO4lcdTAwMWLey0Ddm8yC4rWRfM3ywNHYdeRcbr5XgmRcdTAwMGL5Vb1cdTAwMTnIjLdcdTAwMTRcbk9ccjdcdTAwMDIkwlx1MDAxNr5cdTAwMDbL2CndUvHtKFx1MDAwN0v9W6pZVFSLblx1MDAxYy9GJiknd+BcdTAwMGby0S1lxldcdTAwMWFDRv5UO4b5z2UwXHUwMDEzJ/L5XHUwMDE4K1x1MDAxN3DXMrMjz1x1MDAxMNKDfJhOe/pmwmt4oURkaEShJSqF5rNBbPF1UzNSLYPHqK9x1bzhLT29vFAjgHNcdTAwMTmzilx1MDAwNigsXc/ituO+g7lcZj/uXHUwMDE5VLg7LVTi9oBcdTAwMWY/vOn+wLWxMMFVL1x1MDAxOVx1MDAxMvUpXHUwMDBmkFx1MDAxM5x9ZYlcdTAwMWFcZnB8X1RBw4SA9FdmK2JRh5FcdTAwMTWXXHUwMDEw7n6fUO/+famYcDpcdTAwMWZyI4Wfc1x1MDAwNy+Jdc6jwlxct0KIJVRtXHUwMDE3IIe7MuJ3RmKvvThdX2i+fIfA6r9cdTAwMWFRMMFcdTAwMTF+lYPBmKuTKb2A89H3X02XXHUwMDAwXHUwMDE3lk6t6/r//D//53/7X/7Xv/79T76U6VZcdTAwMTb/87//rzBB01x1MDAxOI6SXHUwMDE4ilDIn7/36bq55ba05fGfu0iUhCFcbsMwXHUwMDE4Jv+66f/+z73/Q2BURVx1MDAxNCSUV1xiXeZcdTAwMThZoVx1MDAxNU2lZVx1MDAwZVVcdTAwMTlMXHUwMDEzXHUwMDEwiVx1MDAxMlx1MDAxOJSWXGL1NPJ//d360Fx1MDAwZaV/TeXz2f+0Q1qX4DTW/3Su/T3x/3/Df75XpFtcdTAwMWG4+u/Lv1x1MDAxZv/3P03/XHUwMDFmWfq4XG7sf2tD1nJPSJPqz084plx1MDAxNzTCb0dcdTAwMWJTPGGC4S6O+Vx1MDAxZOLIk6BPVM9cdTAwMGbO7zRWJ3QxpvzSWfotkHAsKYTIhopNJEhcZj71XHUwMDAwj65cdTAwMTdyvWxcdTAwMWa3XGLudm67IVx1MDAxN1x1MDAwZY4jNKG2x4lcdTAwMTZfqf9WXHUwMDAy5sZXo+RUnPUySfZcdTAwMWPFy1La/YisSDpfLp1/p7BB81x1MDAxZKOB/MVcdTAwMWa3XHUwMDFk6plWOGHoPVrBTsOrv4qJXHUwMDFlyVxmtdGyzI+qwnerutGhwI9qK0jyKOlMqraSJu6NXHUwMDFjz++Qv1x1MDAxNcb91Y49XHUwMDFmNFc7xjtcdTAwMTZcdTAwMTTaUPz99zvjmTWrnEwsqFx1MDAwNS5G9fFBXHUwMDE4wWc4d+dcdTAwMTVFYjnbV3XSNWCmy1x1MDAxZTTcsq6n1k5cdTAwMGZ1+46TndNi2fX7/s28WvH5XHUwMDFjWfCK7f5+XixcdTAwMWGuoYk7sU442iX1n/u15LdtlTBf7v50wKhZ4WSev4vPk4m2XHUwMDFl6OZp8umG+Fx1MDAxOVx1MDAxOOAmOk5tXHUwMDFjXHUwMDFlXHUwMDE4OWD5597daeNALfVccsrvf/qmneeCmzO3XG4oZGT/XHUwMDE5281ggcw08oTBm/rbzvWfNtpNwFx1MDAxZYRJ1ItLXHUwMDE3rPRfWZxcdMucXHUwMDFml0imKlWlWnj/+ndyyjNcdTAwMGVhXHUwMDE3NuhccumFXHI5/5VcdTAwMWLzXHUwMDExfK1cdTAwMTb5N5b+51nXM4LaYdosYCh5/P57zHysMq49qzPywpGP8F9cdTAwMTktLcaoXHUwMDBmTI2+jXEzf+43zux0jdk2JdiGkr/H0Vx1MDAwNf4zjk/X09CYOb9xiE+jqrxcIpRPbGJe4Fx1MDAwMPzX3K2McrNcdTAwMWQrXHUwMDAwc85EIfr7XWKEd847XHUwMDBmXHUwMDBiS1x1MDAxYrmDoapI/n+OXHUwMDE57ulcdTAwMTL+/plTK1BcdTAwMDaRjY7aK/8zXHUwMDE3P9mfXHUwMDEyK1xcn1x1MDAwNlx1MDAxMcLKIXTXYGnp/LXjXGbOylx0ViNcdTAwMWH8W+H+7lx1MDAwN/RMLpdcdTAwMDWZTOeP3KzTY/x8+1xumMs8c8qAbnxMwZ/nyf95XkPC8kO/f31ehVpGj5fzyL7R2e3mJee/fbZcdTAwMWU4qriEZVZhglx1MDAwNP+Vsaa7XHUwMDFh12Rfc2auXHUwMDA2+fvemn3Us370bfFcdTAwMTSrwP7q1+9zhzE4dXOkQEruPVx0/rabPHGe+Vx1MDAxMFxunI7Q/e9xXHUwMDE4fP7rw13TSqG7XG5LI9Bfz3zJv8/fy9Fp5fj9r4xcdTAwMWWB/PTiXHUwMDFk1oNPK4rO/vd+g6FcdTAwMDSee1x1MDAxYTFFXHUwMDFhXHUwMDEx/tZcdTAwMGJZ/vVtkkCWuf6yx1x1MDAxNvKZyqWKn5xTkn+JXGJZ2VHU0FxyvUXVXHUwMDFiNYv+vScq+EWV3oSH/VwigT7KXHUwMDA3MF5cdTAwMDZcdTAwMGZFUrzri3h6f5MrrYDUOlRvJHg81Etcbth+O1x1MDAwYkzMZv4rcyVr40cnXHUwMDFk5KXHx3sjjdy8rDfLvIJXM8o5a0M58UFcdTAwMDO8h7W9WDvSyl1cdTAwMTS7b9DKyiBxpWo00begkSGxjbqwS2xcdTAwMDU11LzO1FRbMVhmVbZkf8lfjlx1MDAwNcZ/pfhngOUwflOMmnPBXHUwMDAzSNRRybwlP/SItLxxrK6Jd1x1MDAwMKjDaZGIyGKVQVx1MDAwNV5qnopcdTAwMWXB/NfuXy7v0O9Jt8gyUU+ldapQRr2C69v9XCK+Vlx1MDAxOXZcdTAwMDfgXHLv40ub6ot8RL774+gzUrwuXHUwMDA0zJZ//GPMxsKmPlRpwFx1MDAwYlx1MDAwNLmHw2hFXHUwMDA1cKZcdTAwMTFyXHUwMDE2VYDVRnyA9DV6/ki+nDNKPSlk1HW6jlxixJGuXHUwMDBl/b/685ep+sw2XHUwMDAxXHSyfNzRXHUwMDE0PopcZiFrfVx1MDAwMlk4h+42IetwrPVcZrnJx1x1MDAxYlxuddrmoZxCXHUwMDA17dp5XHUwMDE54//634ElWN2H/Vxy1PQy1Vx1MDAxY1x1MDAxNYRcXNlNhVevTST16s/Wp0eMkmjTqprUP5BcdTAwMDfs751cdTAwMWLsXHUwMDEwYdD5f33Gl9FOPU36dYkyoWP1WmsrV6laXHJcdTAwMDd2Ozl62p/LeepwcFx1MDAwYt73NkndWJEq/lFRSudcdTAwMTLwTklcbqqtblx1MDAxZYX1XHUwMDFmnVx1MDAwZjhk0MZsd6T8cU2Z8YiX1Vk1lYqCyZPpaNJImZ95+67sN/woeMBcdTAwMGXR63L3Tlx1MDAwZXA6eEVJyTlKXHT/XHUwMDE1i2DZMY+tmUAun1x1MDAwYpAqdVqAQJBQXHUwMDFmnU7fnbJucJksXGJcdTAwMDSWqN7VeyBWXHUwMDE3biNcdTAwMWI8dUO8W+yMi8qbXG6FYvH8aUIpMztcdTAwMWWyVlx1MDAwNzeaOLWfeFLy8Nd5nlncbGf154T/XHUwMDEzO8ram5fIJ/quhL7Jass0uCVZm7AvXFzyXHUwMDA3XHUwMDAxXHUwMDA3g5ar3lxc09N0IPmPVyPRVf0onNdcdTAwMTHqbo+8T1x1MDAxMyDCNFx1MDAxOaTuXHUwMDAyS+BKoFx0XHUwMDFl0lx1MDAwNzjw2lx1MDAxMJRcdTAwMDJcdTAwMDff81x1MDAxMqw3QNv0UzVcdTAwMDJN/0CdR2fgxFx1MDAxN7jmhNhn2txcdTAwMTejcKiQRobxaaRWsy1G+PpcdTAwMTczXHUwMDA1goV0wt1DPXArPpVYXHUwMDA2/fRcdTAwMTmeXHUwMDE0NWM3M+zTrrz9KVNvcFx1MDAwMqJHsc2S82tUmKIhXGJTMf9cdTAwMWH7QatcdTAwMGI4XHUwMDBmQDL+8T3KVzzF4/NSWolpXHUwMDE0XHUwMDFj8lxuSVx1MDAxOSevjb/BR0SC2qkleLhcdTAwMWSXi2W3t+ZcdTAwMGa8XHUwMDEy3O+QXHUwMDAzt5zkXHUwMDFjXCJcdTAwMDAvXHUwMDAwXHRwg5NcYr1m+Iy+O0q+XHUwMDAyiUyninpcdTAwMDaHW1x1MDAwZTz+4vXjy1x1MDAwMo5vIVfgszRcdTAwMWMgoVZAmq9AXGYgfFx1MDAxNFRJILErqlx1MDAwMfbLxVxcJUhKb3fe7qxsYVbqRsOzjpRcdTAwMDT1nnar6PpfLzJPiK/eXHUwMDFhW9BJlMLW3T0ogsrUZfVqXHUwMDEwI1K3gNNcblx1MDAxYlbY/evhf9lcZiM9tDe8N37N+Vx1MDAwNL/JXG5cdTAwMDBcdTAwMDdCQpQnTn7AXHUwMDAxRLve2PxD7I01es2cwmGzqkGXIN/BXHUwMDBibFlYwWeVyWNcdTAwMTb03ylb9GKdXHUwMDExbK9UTlx1MDAwMKneXHUwMDA2W1mcvcXcPL9piCHe59TXyO/nkUi44/VcdTAwMDdX9Mb7I8Ew0WVvafi2YLX/3lx1MDAxYaJCIFxcbKyDXG6nXHUwMDBiqTDtRsI5XHUwMDFjXHUwMDFkj9hcdTAwMTNoPnM6ZeFrICdjPr/rXHUwMDFk087OXHUwMDFlU5fY+u3ogFx1MDAxNFxup4d0w61cdTAwMWT9Ulx1MDAxY7r/8z/hnZA1tZBVXHUwMDFmX/5cdTAwMWJXqXWXuq/w+FH+NXvrKI/H6CNcdTAwMDTMJadlOpo9VoszZylcdTAwMWPSSGNcdTAwMWaD1YHGy1x1MDAxYvmSRmBwVdc3cslcIiMpL7FWXHUwMDEyZFK5+V2f5meI+/3VvltYt+joXHUwMDAxgvvm0dnxJcXt9kiqeKLvgVx1MDAwMGlcdTAwMWEtXm+5Y+WK2TaXXHUwMDA1qH3taptUiCZR6PtG1oe0XGJuK59cIpWD4J1cdTAwMTB2uG/rgNEzWT2x4NLNbXqhR/jEhuT2STKz06Eh7Fx1MDAxZSBJmkebcZhMw/PwTmowNp1cdTAwMWTOnVxmJ8ZhTlHVzspD7U3KmT1ZwrpcdTAwMDLzSMdkXHUwMDE4Y+7p9e5EN+mOKMDmL+LKk3iYZI6/wzF6VP5sj0lNXHUwMDFh7ovruH01p/04XHUwMDFlm4W+4+O8pdaql8gzJ7KK51x1MDAxMMXoXHUwMDAzoDxET+qwlVx1MDAwZVZVJ8S8Pl5XfG5Di8O9rlx1MDAwM8+3sTmuo5mQXHUwMDE2s91cXN2bXHUwMDFlJ0BcdTAwMWNs3M5cYuxcdTAwMDH2K1MhK+VKMG5fTyxcdTAwMDP742GN83HONyxbYzZcdTAwMDRcdTAwMWLWIbffWXiKIaJcImzCXHUwMDFlvkmyhU7g6Fx1MDAxZXZRvqJcdTAwMTQlSnJ8l7dcdFx1MDAxMFx1MDAxN1xiQPCo76hV7khugXa+RdY4kkeiqlx1MDAxZv43XHUwMDA25omJ5jgz+HRktKGioCU+8EBWTFbSX1xcxnxOLCg0J13TXHUwMDE3YiZrwcjOXHUwMDE1nKZcdTAwMTPeWvei2deDXHUwMDE2/KNUtdaTyJZcdTAwMTkh7LSYiU0jYpiQMFx1MDAwMal2ilx1MDAwMmIyK+osfWJurfxIcf2bs91uhMJcdTAwMWVcdTAwMTWXLuudXHUwMDBijE+wXHUwMDFk85ahs8aZqs2aPCT/+vn0XHUwMDE1XHUwMDFiMfNcdTAwMTO9t5hgVNBfLVx1MDAxOVx1MDAwZpZn/nfOL91cdTAwMGW+ZuNYwbL8g0xVVSmfL/dxwqfDLNRDiFx1MDAxN1x1MDAxZZJ01lx1MDAwN1pcdTAwMDdcdTAwMDNcdTAwMTbg6XMh35FcdTAwMTJjdtPGrVv7MEbVT4KYp6a4iKVcdTAwMTbaw9Qy3Mj1R6PBVfDfQtd93zefPZ7lvcoqXHUwMDFjbLwjXHUwMDFlNFQnWYPJJVxiNiMgfDDurZpvJlx1MDAxNFx1MDAxZajGXHUwMDA0dVx1MDAxZF7xXHUwMDE4pEJzhbDyhlxu99WgWIHQ6tAsU9dAfDZcdTAwMTBN2ryYeHLprE+H91wi0Fx1MDAwZuWwXHUwMDA3xEZcdTAwMDBccqZcdTAwMWZ9WppfrDqw+T1WcztW9ypAuFx1MDAxNEuCXCKy8NFcdTAwMDVfPEQ//imOhlKOOzw7XHUwMDA0e/HFN1x1MDAxNlxcSE1cYkzAkCm20Vx1MDAwM9h2ZTNcdTAwMDV5UDwhXHUwMDE4+u62XHUwMDFjkdFUht2sRZXz+iNcdTAwMDWfjlx1MDAxMM9cdTAwMDc0/TK7s7F1n0v6eun8lj9tP1x1MDAxNpMrosit53vIX1x1MDAwZq5cXG7q1aFT0OtFxzxYi1x1MDAwNIwuROFcdTAwMWU883PrXHUwMDFlrKqxJqmghZhcdTAwMTPirW341Ct0XHUwMDAygXtcdTAwMTj9aqTXotOcJYyKq7E++mBcdTAwMWbAfu4g0CBK/Vx1MDAxObzgMda3MY/JXHUwMDA1OYe51HH8vUXOVzlcdTAwMGaezJdcdTAwMTQ0XFzFdfw1f1ckXHUwMDE2kiVcdTAwMWVbTY9eWuhcdTAwMGZw4u2hXHUwMDE2RFx1MDAxNYAm81x0yiRcdTAwMTVfk0D4c0DDjo1NarWGOnFEK/rrI/Nhq1iJWitcdTAwMDNVRuFcdJe8QDH2MEZcdTAwMTg8W1x1MDAxMnWs/ahYTY3cw4ro4P3RYIjOzJhiToCySJusVdxLk79WvalK6HR54alIXmu+130kQPhaTee2g/nVclx1MDAwYqGZXHUwMDFkwcZcdTAwMGYwQlx1MDAxMCD6XHUwMDExYldKxb/leUR6M0rCfk43LVx1MDAxZG1V9/xks/ler7BSlCqOhV5AJteqrTtcdTAwMGZnt0DDXHUwMDE1q6qR8lx1MDAxZCt+53eh32xsnFenV+lcdTAwMDLu2/uaSOK8t9hXPuvYjP6D1fFcdTAwMDUtXGKSXCJDXGLd0IhurHyv5sv/nuOOXHUwMDEwbVx1MDAxMlx1MDAxZHNK6uXrU3JVfvdcdTAwMDTRXHUwMDE1ZVx1MDAwZSvyrlx1MDAxM5jRq1x1MDAxOLJcdTAwMTBcdTAwMTB5d9Y77Vx1MDAwNPqObDXgXHUwMDBm+ES62KaDXHUwMDBloFx1MDAwMFx1MDAxMtybY1x1MDAxMvHf4c28XHUwMDFlcFx1MDAxM1x1MDAwNFx02EswlqnWXHUwMDE061x1MDAwZVx1MDAwNsVwzrcqxKNcdTAwMDE98k/cPpSQtITcIC/U31x0KXRFQTJcdTAwMTBcdTAwMTcr4DOXfJLSy4xg4Oo3INHOXHUwMDExXHUwMDEzXGJkuGAq7IV+wcq8zLwow6OCXHUwMDA0XHUwMDE37dtqXHUwMDAzUD36QJHXTIOUXHUwMDEx5Zt7YboglFx1MDAwYlJcdTAwMDPDVuJcdTAwMDZe7CNgSjtcdTAwMWExfpht8rVcdTAwMDPFqGbgIy5gai+6lIpcdTAwMWPJd7So8PSDfbo7eVx1MDAwMf1cdTAwMGVcIr0n3aEowoidsCeIyttcdTAwMDLQOlx1MDAxNJEnZFx1MDAwM9ZoRzrk2q/bRyFkloJcdTAwMTjQwlx1MDAxM7RxXHUwMDE2glx1MDAxMlxyso8ontvTS4fueqLP/jbhp8WDs1x1MDAwMLFcXPzjSklccrbns1x1MDAwMjwutFx1MDAxN9GoXHUwMDAwg1hccmphTtOMVT9ywMdBieQxzVx1MDAxODkmtFx1MDAwMGPZ8Hn3121cdTAwMWbrw8RcdTAwMGUlgM4+T53lsPuR++TZO0eiT3+vnWBfbpZWum5XZl6Rl0qbTkZZ56f4sD5r1KtcdTAwMGKtXHUwMDAyIT3RZy+8iV9cdTAwMTFViadcdTAwMWWFmqb3kF/ZvIRjXHUwMDE3ozM5adJ6XHUwMDE5aF4pNk9xXHUwMDFhLNWNN8BRffli/mQuMZtZzFx1MDAwM5J1Rlx1MDAxMn5Bn7KzzaDpNFx1MDAxNlvex5qy1vGOtyn23zRcdTAwMWFcdTAwMDDQN6Y/rVx1MDAxNs/r1NSZL5+VkYHSM1x1MDAxN9WSfFx0XGJxyZblXHUwMDEzcIyD6N6aXG7UkKvuXHUwMDFjkVwiv+a7coc848/QlmXbyDZcdTAwMDAvUi8y4Of/ykVcdTAwMTScllxc6n2D+IecmzBcZlNcYuSQXai/6ijT4/dFQFG786gtokbqbzlcdTAwMGbg6JBC9WhKubvYOIK/oep+9XHDXHUwMDA26JhiUTgs197j+Zyx6qeFkVx1MDAwZYhJKjyP6ihAXGaHpkJcdTAwMTZv0pmHVuNcdTAwMWUoblx1MDAwMCwzoaugJVKLqFx1MDAxM1x1MDAxM4b09XKQOns3aWz0Xmia6/OkZlimnk267XN1e8DaXHUwMDAwNKvD59s7QI5CLKV7XHUwMDE5noJcdCBdfDi/6DXZlIVa21x1MDAwYrkvN4+Az+1Vv1x1MDAxYYbIge5Wgd0mU8JlXHUwMDE2KK2ZcKshXHUwMDFl3jQmiUR/Xq3b+dPoW/uxMoChMFx1MDAxMOFActfDXHUwMDA1Pkkthplfq5LerkRcdTAwMWZyU23RXHUwMDA0XHUwMDE2YS17+lx1MDAxNL9+SdpcdH13Z2ZsRzLSL9VcIrBcdTAwMWFXWTG85ZhcdTAwMTY1+84w/t794Vx1MDAwMFxcr+BcdTAwMWJCP1x1MDAwNjsvgdpcdTAwMDbMN9iGa/E4XG6phKHKo49cdTAwMDVYv4P/NtwhU5Zu6M/qhF5G2r7PuGAwXHUwMDA3k2psSL+4sH45hVx0g02zyIdcdTAwMDA9onOieX18eVx1MDAxNkyIUFVcdTAwMTGplTBgQ+bDjSgkzIYjucSQnkApm463dGxcIt+NoXz+zlD/T91xXl7E+1x1MDAxYcpcdTAwMGZ7njhdXHUwMDA1KOFcdTAwMTWtcMGcL1x1MDAwMq9efXeEbPAxKlSypVx1MDAwZrcvqVx1MDAxMmzg/mC3r+u4a5l2XHUwMDA0/a5+5evSPFx1MDAwN0IqNYllXHUwMDBmNpuct4icKZu468N+P/41eiBnxJWbeJJcdTAwMTidXHUwMDAw0LtcdTAwMTHkfSS09M4kwX2Nj5usIPlcdTAwMGJVMWKOvMpU17GW9Fxy01x1MDAxZGfT01pcdTAwMDJcdTAwMTCFo8LCbS5yJFx1MDAxNivy1eeNgnZVvvLUukSEiyGvZeqQXHUwMDFkX7+VcJxcdTAwMWMwujFLZahcdTAwMTWMlOheX6+whYeTiGIvUauQk9JmrX84xiFcdTAwMThdT29cdTAwMTM3qlx1MDAxMWktZlx1MDAxZE49KFx1MDAxOVx1MDAxZYhPXlx1MDAxNs09XHKvwZ5IeVx1MDAxN1x0hkHh81xyXCJcdTAwMTaY7Vm8Zmk3XGb5xV6hNa5cdTAwMTIoS1x1MDAxYVx1MDAxZbmTXHUwMDFkxu/v4SN2XHUwMDA3by/0XHUwMDFjn2vJ69CiJyi8fVxmNizP11x1MDAwM4mi1CPp9P7By+hxikVELtZUp/2Uiy8qy9tDX8CwVcDlW5iIyXVZ5PLTjVx1MDAxMaRcdTAwMGLi6Fx1MDAxYkzUZIQu3/08oUJuXHUwMDE11nNcdTAwMDU0uojLXGJE6ImjQlZ5XHUwMDA2XHUwMDFlmI5uOZHXzFx1MDAxZYRcdTAwMDczUvFcdTAwMGbeTItcdTAwMTbe4vF6XHUwMDAxIJ8y57cq6ExcdTAwMDTCjqRcdTAwMDdcdTAwMWGETHvhK5FcdTAwMDXXXHUwMDAw1nSvXCLSXHUwMDA3O7l3wYX42Y259YudsEUtK1x1MDAxNVdNXHUwMDEwl1/UXHUwMDA1YdT0ZnVBd37mXHUwMDE351x1MDAwM/U1blx1MDAxOEgqzFRwo1x1MDAxMVW2yVx1MDAxYlxmkVx1MDAwMZ+2Rlx1MDAwM5nPXHUwMDBimVXQ4Vx1MDAxMvd+ZIhEhFx1MDAwN46WrbCzXHUwMDE0Wc7LUmm5fVjjXHUwMDA3zVx1MDAxObBcdTAwMDC0Qz/2mkAuxY1r/Fx1MDAwMX55XHUwMDA1tD6KXHUwMDBlRVnKgXVcdTAwMTLI2p5o5mzbXHUwMDE3eFx1MDAxY1x1MDAxNph3u/Uy5Lj+vJiP0IrwJLHGyijDTER1pu1cclx1MDAxM318eSom3lxmbquZTnWjuaBcdTAwMTZhpShxxoV1pddcdTAwMTl8bGK+Y6kwPLd3t9B9WFXafSzKMlbfsNKihMQ4XHUwMDEwbkk8RbM5QZsrRaaDcCj6jUr2XHUwMDFiZ5DOaKtSf6OQMdBcdTAwMTZcXPDSg0NlxPBcdTAwMDBcdTAwMWH0LLYxkbVhsGbf5mjAyjJMtlx1MDAxOf5CiK0999op+t1k5TuDXHUwMDE1Y1x1MDAxMvj7vu7LwFx1MDAxZqKhkkNWhtH4+PWhXGaOOyjmtyPj9GSavdXq5OLL/FgwY3CEXHUwMDAwNdjHrns3XHUwMDFjK+DU1Vx1MDAwNFxyzVx1MDAwNDzBoLHSUVx1MDAxZUU0MiFLXGKlXHUwMDEyRlx1MDAwNl+s2WBb5KpzQcuRTvv0S7zRzCXV471nyTOj78P6VPX8TKd8x1x1MDAwM310y3TNVXnZZOX3XHUwMDE1o8ovokayfGCfuYlCupu2r4Qj8PhcIiHu9b5k8Fx1MDAwMkBIuN4uJFxm8stcdK2QXHUwMDFlg1l1w3Ym0E/iMH72uVx1MDAwMtUogttlliBcdTAwMTBcdTAwMDRcdTAwMDLOhFwie6V10tqfXHUwMDFlguCu76OvdjCv+TPb//By+IvqPYS+1VxiLKeRXHQkUFx1MDAwZpErXHUwMDA0bquaJNxW7CPe4lx1MDAwN4NjwiR/w1x1MDAxMtio2rCg8Vx1MDAxM+o6OH/xe539h+BdXHUwMDE08o3v7He8z8dcdTAwMTdcdTAwMDAwzqujXHUwMDBmj1x1MDAwNZTgPGJ5XHTMw4412l5ess90glx1MDAwMfB+Yae5PYyHXHUwMDFhaVx1MDAxNodnXHUwMDFi0iT0+Pm5fDg9XHLPXGLMRVx1MDAwMqKUS5GGa8qR+oczit7ux1VqYzKSlJCzqzV6aju6n8Rrsam8U16oW5TEJdlzSLxcdTAwMDZnRa3Xx7X2Nj0thSHRyqIkfT9cXGCy0po4n+nkx0naRPg1XHUwMDFhqGhcdTAwMTRldsJcdTAwMWLdo5xW5zuJbpKHL1x1MDAwZp3XK+BLXHUwMDE0TzChkG5cdTAwMTlhetXKY/6SIFDt8EiMbeeAYtV9OKnRmpNcdTAwMTLH7PqXvVx1MDAxMIXbWGmrXHUwMDA3olx1MDAwMVxcWd+w70J5zalcdTAwMDTh6fI8XHUwMDBlhUnXrV7DXHUwMDE0IIWSe1x1MDAwNNH6VOYs6/Lzo/6IZtdDx4t15ZhcdTAwMTFcdTAwMTVcdTAwMTS6K1RwnYf0kThYW1x1MDAwNVx1MDAwNbik4Wn7MjXBQlx1MDAxZeG7ZXe2td+Tglx1MDAxNFx1MDAxMorLK7ratEv+XG73wZ9EdizEVDSTdmXCpCpSJFx1MDAxNaDAU8rat++6p8hdrvHbUVx1MDAxZlRhXHUwMDE3N8u8vlx1MDAxYmnZ1k7I5JeQj/yVJWhkjvpcdTAwMWNcdTAwMWTkXHUwMDFjwynT5E17XFyS2EbNW1x1MDAxNKdtJWAsJY7hOO6VLtRvRpzxXGZk+MTB+25G6s6TpYkv1avOaJYgczx8XHUwMDE3NCwn5/z0nW1cdTAwMWEznkOo3HGkqZTJv2fhzkRj3mJ4v/qvjFx1MDAxZp1d7SyYZlwilnyXrqlcdTAwMTn7lsMn/u/EKlx1MDAxYdPqNHpcdTAwMTFCx+d6fbmT4Jyh/nBQOM86XGbdSfJMnO+OpidcdTAwMTmdbtGCzIG9XHUwMDAyalx1MDAwZjBS7195LOB+qCdCLVx1MDAwNoAkr7JcdTAwMTG9LCGbXHUwMDE3Oip3VkEnJ4Do9914c4AreTxcdTAwMWYkXHUwMDEz0+ssXG7F58wqwezweKGQSMrmQFx1MDAxNVx0RqDQK2FAhpznUpQ5YFx0SalqKTqjXHUwMDAwvklcdTAwMDdkoFviXHUwMDE1XHUwMDE0XHUwMDA1Jiustpcotj1cbk/1epNF9aZcdTAwMGZRXHUwMDBlc1wi3WVh1Fx1MDAwYlx1MDAwMSSPJ5eLJLa+V5SrO+lcYubMXHUwMDFhhSoqqjch1z3ZdTgsV3xKZLWlXHUwMDAyfW9Iqf5cdTAwMDZcdTAwMTa8Wt5cYk6QtqTfQG6Tp3A3Qlx1MDAxYlx1MDAxZUcyXHUwMDEx5qU6XHUwMDExLGCCfr5+3q5cdTAwMGUsj1imXCKMinb68kndztxcdTAwMDH1YVwiXHUwMDE3XHUwMDAy2n1e8dnumzG/Qt7sKoOeiVx1MDAxYdY7+Ct+va8uY31m5Vxymegh4eia5fDadVxcmUxcdTAwMWJcdTAwMGbcaNJcdTAwMTmYJlx1MDAwM6R3g5l4XGZcdTAwMWJxXHTIqcy1aaMyp7R4XHUwMDBmr0L6TkQpXHKpVoXEkWNcdTAwMTV3cVxi891cIsWmMrmCQEHoUZihgyPP0MdTd1x1MDAxOdLwt1wi7flcdTAwMTNccmwmkdhNf6cm1vCP5OLPpOyqUFx1MDAxMVx1MDAxY5GU1vmMN6pcdTAwMGX41lx1MDAxZTtXxE/HOWbh130lo4/j1KxcdTAwMTdcdTAwMWTtpd/O8pmo8aFcblj3XHUwMDAxXHUwMDA156CXTzbyszW2XHUwMDFids85PZ5cdTAwMTDLPjBcdTAwMDK6cawrXlx1MDAxZsKtvslcdTAwMDI1QfHmkeNzm8npXHUwMDBm1khrUlx1MDAwMZC7knG54/HD51xmnOJyhNLBXG5cdTAwMGamtktEXHUwMDFmXHUwMDEy4iCxsrdLIVx1MDAwZVx1MDAwM5Kcobb28Vx1MDAxMrah5jlnLjDaO3Rk3nxfse/RtJrI44hOLVxyIGChRaKtXz1Jb1x1MDAwMPA6Ov66wEpRr27UQlhcdTAwMDNcdTAwMWWgXHUwMDEz9lx1MDAwZoum3lGQXUdcdTAwMTdjXHUwMDE0tVx1MDAxZch3udBetMPpmnp5e4OAv07VXHUwMDE0nY/R0+5xkFx1MDAxYvJcdTAwMDVBXHUwMDAyXHUwMDAxK7CNVFx1MDAxM2bB+OpHlCTpNqiqo5FcdTAwMGVxsXfwfFx1MDAxM2fmZI49XHUwMDE0XHUwMDFinaGi3n/5L5uMe7VJyFxcbmB874fql4dGxactXHUwMDEyQIj7ZjVcdTAwMDFcZqX6RVWJppxej+VGPGqKqD1cIuXJ7EYoVnEzzVx1MDAxN0PqvE5/K9ku8Ic4c+TbXHUwMDFlXHUwMDFk2FjgXHUwMDBiTePHxdoyQtDse2JHI4TBjLeO8Vx06SNcbtZu2TgoMNCoOyqF1ma0b2bb8YZcdTAwMDekhj8nSGNWoUydcE1x0YmDtjKcijGsXHQrXHUwMDBmet9cdTAwMWbXXHUwMDFjhs+E5L9cdJnr5Vx1MDAxMTZ3u5B7c9brZTHmMCNt035cdTAwMDKseFx1MDAxMD6iNYXJXG5cdTAwMWXXVJG5yLfhSX05Vo6Rqou264BwUFNBKO9cdTAwMGZCgd+XdsWFmFx1MDAxZXmpbVx1MDAxM/FcIsKv/fmQtGt9wLb2jy39cNHXLiF0vSu5XHUwMDAyZnKqxlx1MDAxY1VF+HDBxOpOXHUwMDA2wuFcdTAwMWLd11x1MDAwZdZcdTAwMGJcbjxcdTAwMWFcYnxJ+1xc7qJcZjZcdTAwMWT26adcYvStXCKKdZL7ZrFJ3yS4ePeB3IfNXCLKXHUwMDEzjCimvsRYXHUwMDA3gzm2vc2lI+LDvCmJb5Tp1TkrWVx1MDAxNrXkszJcdTAwMTSkW5l2niBxLy7Pz0lcdTAwMWa6clx1MDAxMF7n/FGsyYGn1ptka3HfvstjJOvfqYlcdTAwMWHxR3u4+NaOluzAXHUwMDFmeD7L/6ex81iSVVx1MDAwN9b1/Lxcblx1MDAwM7xcdTAwMWLiTUFhXHUwMDBiN8N776qIOO9+qdW99t6jXHUwMDFiZ9DRJlxuIaVSmX+CPrVuXFyIXm07+aKPOtw/aoDu6HRcckF9e/wn5DKaXHUwMDFhXtVcbm/YRD/T4t1cXFx1MDAxZJMs+ZFcdTAwMGbPzHfr0G/2+Fx1MDAxNt5cZrRIQy+FMZhcdTAwMWJ6XHUwMDE3XHUwMDA0xV1cZlx1MDAxYk9f0Xax1ePNKotcIsbeiSUkXHUwMDEx/ZFcdTAwMTlEK8V3XHUwMDFlUbegeZxcdTAwMWbYXHUwMDFh4UTuIFiUn/TA62H+oWXA7E5m5JmdSFx1MDAxZHdjXHUwMDA1Stc3f/WJhtZN9ftcdTAwMGV2tWol0FdcdTAwMTL+pDnZwJCw+lx1MDAxOUHX5Fx1MDAwMTQwrZW2+/OcsJ3fXHKkSFx1MDAwNvD9XHUwMDBmXHUwMDE3pilzZJetXHUwMDBlTKbmXHUwMDFk47BcdTAwMTFxkYs6gMw/UJNQcNV8XHLgZyZDWil2ZNkukIjv1Vx1MDAwYu71caBcdTAwMDEpQ1x1MDAxM4BcdTAwMTFoXHUwMDAyo2SjwVx1MDAwNlx1MDAxMFx1MDAxZEecQEu+XHLodkuxXHIgl/ZFO0Xeu+T0XHUwMDAyaDNcdTAwMWTgXHUwMDAyJOArXHUwMDA29Hf0lX2qTOjMJUzKOvbxgmi5to/ynUGaR1x1MDAxZUBcdTAwMTbAba77XGLgXHUwMDFjd3FWo2WDemEnIVKWO6yP/U1dTO7Xc/M0n1x1MDAwNJFcdTAwMDFcdTAwMWWb51x1MDAxOdFcdTAwMGa0XHUwMDA0VPhcdTAwMDJjXHUwMDFkdFx1MDAwNEVcdTAwMDD7RJdlxlx1MDAxZWD4eFhcdTAwMTGsdJuW81SkXHUwMDEzrrLGxzGtpJVxt6RhQiS8S1x1MDAxNp1cdTAwMWFKV3deUPswjVaRgXYn3fkxO0M8f940XGKsXHUwMDAx2F8gzezBXGZSQ1x1MDAwMVwi8uOCVaA6XHUwMDE0XG4vXHUwMDFlXHUwMDA1XHUwMDBlgGCcTiZcdTAwMThcZlx1MDAwMCzQlnagXHUwMDA3+Fx1MDAxOIZcdTAwMDdcdTAwMGLUIN90b1x1MDAxMFtBQLjj1sei6qvDJrA3wVPHLeM1gVx1MDAxNHSAPHBcdTAwMDGvYJjVdNQ+JrVhMlx1MDAxMFx1MDAwNqipN1x1MDAwNVxyXHUwMDE5L1x1MDAxOX2fIKVcdTAwMTlgjptvULn9VI87csmnW9RcdTAwMTWk2XSmOlx1MDAxNTtHXHUwMDExKFx1MDAxYctS/p5Vd1xiomN0jaek4cCExqqRep+7hry9XHUwMDEy/cCPXHUwMDBmToOksNzBXHUwMDA0RvKMXGb8nVmeeUL7tyRcdTAwMTheIU2T6M7QpmxxnFx1MDAxM83IcbBaU5hhkFvx5Ip+9mSQg3hUT9RcZmmx7ag+rVx1MDAxZL+tXHUwMDFjXHUwMDE2qVx1MDAxOFxuULm2w4hnoVx1MDAxZVxiXHUwMDFk0MVecF1Cj6xccie6kWLds2AshJ8lNVxun2FcdTAwMTNcdTAwMWRtXHUwMDFk82zwbGeSYNaBUEG4eaNLd5dpNL5cdTAwMTlmkMxcdTAwMTaBXHUwMDFlqVx1MDAxYmf2eyj2WVx1MDAxNN9cdTAwMDalb8o2orDViGP2hs9VxZ52Q4KXKqWJ8Vx1MDAwNk/s1LlIpppcdTAwMTDrXHUwMDEwXHUwMDE338q5JfBcdTAwMDRX4YLL2+yC8NLyh7RCuk8ojVRl5YNBv+BcdTAwMWRia1x1MDAxY7aMrjQxLXDBt1x1MDAxNFx1MDAxMFee8M5jic6YIctcdTAwMTnGt8hcdTAwMTLY0NJcdTAwMTnRcTg2XHUwMDE2XHUwMDFlqrfC0ulcdTAwMTFX5LhcdTAwMGb+ZM6S8Vx1MDAxZHZ67F0ts4u+lqs68Vx0ncbq+KJHu0TDRzeu3NvnL1x1MDAwMVx1MDAwMGaAxTFcdTAwMDDtWj9J3KDZ4lx1MDAxM2y0kcZp903iXHUwMDEwd+xcdTAwMTLnhmDGvvL9zDoqNoZTxVxyueih+iA+bd6sXG5WgdFbXHUwMDA2JbKIuVpcdTAwMDeuQcCcZKgn0IpRqNLtN/hcdTAwMTI31M3kXHUwMDA19T9umm9WXHUwMDEzgfJahMFTXGas8FxiLNplTuTRXXcwf58vto1fXHUwMDFmMuknX1x1MDAxONaF/74heZDLaMqEXHUwMDAxoumVW8dS6U+DlFdcIk6Fnbw7LGpcdTAwMTmaPzSN/dRcdTAwMWSL1Ck8XHUwMDE4s+VETtRzKn8qtrNEgnO9kqe9ipH5XHUwMDE0RJtcdTAwMTNqlFx1MDAxYTSc2sxcct6Yzbm9+XFZie4wVkRcdTAwMWQyczuE/VRcdTAwMWJcdTAwMTQgpMp4teGx9zgqvGOT4Lkrv9v2QDpunlXBpmxzvC2LJklrT1x1MDAxYpvEzUzulnJE6zVUMVx1MDAxOSv2uNqF+YrPMCE77qThZt5cdTAwMDDa2NieY7riXHUwMDBix4WaXHUwMDA1hN6dq4wtJlwidmcwXHUwMDE39WV514tXeGs9n8ndw9RFOWJcdTAwMGL3qFxmnWlcdTAwMDJcdTAwMDJb/O91rc3mMoxcdTAwMDYn4FxuS1x1MDAwNVx1MDAxMlx02Vx1MDAwMNByjVx1MDAxN1x0WFx1MDAxOYkwktpcdTAwMDW4U4Fs3C1XXG5cdTAwMDBtXHUwMDAy4ymyc8fbW1x1MDAxZH5sfeB0IDuqlfo9P1xubq7KXHUwMDE5atOJYZlcdTAwMTXuT4xgMm57lFx1MDAxZnvarzZcIuE64rJcZqmEVeey4qBcdTAwMDFcdTAwMDZ9NFx1MDAxMffgPsqpekbRdSs4nzjD3dXOMcE5+EyjIzZcdTAwMTL0I7frXGaktVx1MDAxY5qWXG7zMuhjXHUwMDE14Jlg7K2ZNCa9nT+ASlx1MDAwMf1PYjBpQiOkMmpcdTAwMWLSOjZzXHUwMDFk6STnqLEmvkKF1Fx0QVxmh65QPcavlHlCfF+pXHUwMDEzlWSoj3RcdTAwMTQ1XHUwMDE3VrBcdTAwMTGU0ZFcdTAwMWFcdTAwMWFt2FxmbdT1PkBcdTAwMTS/XHUwMDE2L7hz2lx1MDAwZTJcdTAwMWUvTPl6XHUwMDA0XHUwMDFlIKJB89Ku9/twMNRryZJk4Oyu657Uek9cdTAwMDMsg0dbXHUwMDA03IxcIm9cbqE+nytofNnFvZ1cbmZdXHUwMDA2vUqH8blQ42F3t+JcdTAwMDLaaDFgskBidLm0OrFOq6PFRyS8kY9cdTAwMDI3bCOMXHUwMDFmcaq6+Vx1MDAxY2H/XCKjj1x1MDAwN0qWXHUwMDEweXhT3n5WVmNcdTAwMDRBXHUwMDFmVFxyorQuecJcdTAwMTNWkdPsYOR7WadZs6/Q1lxmcnvKXG6iiWFcdF/ON4vrSVxcbJmUQYD5ulVjtWLbS26uNFx1MDAwNyv8PV4tKMJcdTAwMGXUv5h7Mlx1MDAxOedls96zfttcdTAwMDPl3Vx1MDAxZPpU70Mk01xmXHUwMDEzydlzXHUwMDE4ZlwiXG44vvbuYY6ktanCXHUwMDEzfFEwUTMmZUJTl82dbN5cdTAwMDVo/95mXHUwMDE5rVx1MDAwMtnNzzTfkydcZqPzO3eN0EOK25v1+uBcImCT+nBsKYLvjVm0uJVtXGZcdTAwMTi8zKOQ5S3AzkuB5J2sfVx1MDAwZTN3XHUwMDFmQjZLpczFUeBnxoBcdTAwMDFwXHUwMDFkkk1p7dVcdTAwMDFcdTAwMTiX2oLsXHUwMDE4XHUwMDAzOTzRy3hIMNy0MFiiZ1x1MDAxYlx1MDAxM3tcdTAwMTdjU6NcdTAwMWTGTs+z21x1MDAwMm6uI1x1MDAwNoBcZuL78uS3XHUwMDBmXHUwMDEwsXZktPxcZsnjI/oyr6iKXHUwMDEwrpXoyV4ll+RwxFx1MDAxZt4uOuTBQVx1MDAxNtM+bMC/XHUwMDE3WYSBupK8xFezwf7zrisoXHUwMDBipPsjTrnY0Sk6myk6X1CCvStjWJdcdTAwMDZekYdcZi9j3yNcdTAwMWXPpvPNXHUwMDE3lbS5hoXRZd3emjCSrDFzeqeF04ukXHUwMDA2+JBcdTAwMWM5ZGzX3J6WPFx1MDAxN9UsgGRuXFxcdTAwMTF9XHUwMDAzJ1x1MDAxMdlqXHUwMDFmcK5cdTAwMDRcdTAwMDD07Vx1MDAwMsTa51x1MDAxYyUlfomyXHUwMDA3ulNt6oG1ZVx1MDAxOJRcdTAwMTGwaauokHb3xUFcdTAwMDbdXGZcdTAwMDEsXHUwMDFmQZNOMIJcdTAwMWVReT6PXGaxacyp+UtqX9bbvrBcdTAwMGafqzl50lx1MDAxNJTyXHUwMDBmuErFRV2x9+leXHUwMDEw/7UnfCbT/VN8aVx1MDAwNHqWiTg2QXKHMPjB4XdKPVxcdUOB1V9cYlx1MDAxOEHzXHUwMDE4Qlx1MDAwZt1cdTAwMGUnrXxcbrv6ap9EzdvNR4gmkswqXHUwMDA1iOulXHUwMDE4ddo4XHUwMDFjg/luYNGUrqRcdTAwMWXRXHUwMDAw2yzGdyrX+9Gi4i2Hsv7sX1x1MDAxMFx1MDAwYsLqUzuzyKGNXHUwMDBiXHUwMDE4dtpcdTAwMGVEVJRs4y0hXHUwMDAxvdDf93bNYn6m26ykmtlcdTAwMTRxj1x1MDAwZW5cdTAwMGLemdLk2K/mIIJcdTAwMWX29mVNVrL39et8p1x1MDAxMsS0b95CWKC/qJxcdTAwMDIxSIWQXHUwMDAzXVx1MDAxNtKIXHUwMDExd+XIUd3xXHUwMDE1d02dXHRcdTAwMWL184bdyVxu+sy9y1ItqDn+06tcdTAwMWVcdTAwMDcuyUJsXHKEnlx1MDAwYk35O1x1MDAxMI+sVUYg/mhcdTAwMTVcdTAwMTaiPoLnIVxm+4Dma5W0W4eMUntq8WSxu1x1MDAwM3WR8mejZJVcdTAwMDFiyNVa4qfMy565XHUwMDBm2zKiT1+G7ZrZLeCivH1uhqx201x1MDAxYuO2y+yUfIeGrN9Petyiqq9HTlEl8Fx1MDAwZXCII/RgRS+volx1MDAxZotcdTAwMGJccuZnma26PvTGqltcdTAwMGJeXHUwMDA01t390LlcdTAwMGJcdEzv7+Jqu7bXklx1MDAwMpOmYXhf9Fx1MDAxMvJ+536KT3KWJ9NcdTAwMWLYRS/3w1xuJ0tcdTAwMGKaXHUwMDE1WdtcdTAwMTP3cVx1MDAwYmBEXHUwMDFiysLq6VRYnpBcIrvT+HCCsmxcdTAwMDcleO675PBcdTAwMGWnp59pWIQxiXtcdTAwMGVcdTAwMTBcdTAwMWKVXHUwMDE3umhcdTAwMDCmVlx1MDAwNSTWTyRxOOOLfNqSu43NJMxcdTAwMDXR+VvS9JeFe2K8vZVccu1j5U3l/Vx1MDAwZVx1MDAwYlx1MDAxNLCRXHUwMDE5XGaG3lx1MDAwMrjbM82sjVxczHRcdI2IJYpcdTAwMDOBsTHVXHUwMDEwXHUwMDExRuFcblpcdTAwMWQvXHUwMDAwwahFMIAsu26q4CNcdTAwMWH3OFDR58X5d0Uxv1xmmyjiNoZjwFdcdTAwMTc+L8V4OY3c/iiHucZF73HimMcskH0mdFxc71rBy0JcblfvRFx1MDAwMbxRWHFim0iKkkavzox8OZPTkM56sZxCXHUwMDEyh2HdXHUwMDEymY1roFx1MDAxMXHW2LE2UFx1MDAxNjs/Wm1cdTAwMDHqRZ1OXCJcdTAwMDfxXHUwMDA0SV8kW1xuTo3M8nFhpERUXHUwMDE3yphcIpSaXHUwMDFj1NtoXHUwMDFkszTVe++iXHUwMDA2tKZXTYrMXHUwMDFmykirmPLYINq1ejtYh1x1MDAwM01cdTAwMDbioWZcXHOyg5LU0bsl2kfzKMCavJgg31TMjbpHSsAgXHUwMDAzXHUwMDE1u1x1MDAxYodS2lx1MDAwYsgtgeTX0+VH/J2Sl+01m3mnXHUwMDA2Y0xfbzRwa1LE2yzPyc4mc9VtTSNaTH+AqvZcdFxmSUlcdTAwMTkziD+Zk6EjSDYmkFlVXGJ48Vxy8lx1MDAwMmfdJzfK0YqQzZX1bVZcdTAwMDEvjFx1MDAwMn/LqMmBRK+XR63y9cZnxFx1MDAxNJbNPIpcdTAwMTHPfEyjvEhKyVvR7SX3d6WVYrpcdTAwMWXg5KgtijZ2xlx1MDAxM+5kbVx1MDAxOJaKolhcdTAwMTlcdTAwMWSLU5Bs3VXFkLOQ/OZ86aNcdTAwMDRbs27lNJeufygxelxuXHUwMDFmXHUwMDA2nTJcdKWWXHUwMDEyRdDmktzeNVxmZKYloaGzgNqq4CtNr36/eyF+XHUwMDEydlx1MDAwMr1cdTAwMTSH/Sq3KnJ5XHQ4XGLKrVMrXHUwMDFjSUWKPeei4UeK0vmIXHUwMDE5U4BhkJd6q6jhNnb4NrJcbmU2mCRcdTAwMTZcdTAwMTmG3OW+R6bmO+2b1+6/7O5YuiHnmseTWMhp1Cz04STXuchmslx1MDAxZia3puqQROJI3KpjYulkkOGxbo9NXHUwMDE4Wqk4W1Caqlx1MDAwZlx1MDAwNPvkI3hmzbCKXHUwMDEzx3uTU1rm094/RKRwT1fJe/FcdTAwMTndi/iWh52ai2xcdTAwMWbYwjBeuKFor2gpqVfRXHUwMDA1XGKB8e3EQajE6F4sXHUwMDE4XHUwMDFjXHUwMDFlx9/3O43Wak4vuz0wml1/14FWtVx1MDAwN1x1MDAxNc9QXHUwMDFhJiBYfSXwmPDAZMbe3VbY4qpcdTAwMDSrXHUwMDFiqJppJNAzqE0n+uBcdTAwMTReJ81cdTAwMTj5fG07fPeZOEW8gdPRQi6av/3agPN+XHUwMDBlXimlxGvNgv5dyUYkkuTCiWxcdTAwMTSqI/ggkZxr1l78XHUwMDBl64ZH8vd1KY6MUO8q4+yIXHUwMDBlZCDAdOczf1x1MDAxZkTmUI91/VEgXHUwMDAyXHUwMDE4Lbe9uFxcXGZIok1cdTAwMGLEXreog0B5XHUwMDAya69SW+lT4LW2VpJY3Fx02F2UrUZVgNSqaybT3HvGxevY5cO/XHUwMDA1XHUwMDFkslNeiu10dYQwXG7cpW/8TkBrRlx1MDAxMNnnQ33BY2WfOG72rFx1MDAwNK9Lu/dcIu5cdTAwMWNf+OPYRFx1MDAxZFx1MDAwNyxtZkqhbcttNuJKRkvT4zbBhFx1MDAxYp2frTdjd/1cdTAwMTBusFTvXHUwMDEyS79eXHUwMDE5w3ojhpVd4p1cdTAwMGVcdTAwMTiJXHUwMDFhvVg2XGJIcvKl0+zH6ajr+qb19NFccrdcblppm332Z49HMZnYmObpwVaqJ0mmPYDKXHUwMDFhPFx1MDAxM1x1MDAxYvnlU6p9zf3oXCJmQdLaWfBcXIdUSqJq+2vTvSbk4cf+qVx1MDAxN9fnQPeIXHUwMDAxW1/DeGGLXHQsmc9W11x1MDAwYsR2XG41XHUwMDExxPwwsnl+bb9cXE2jc5SQsYhpUFx1MDAwMI96oFx1MDAxZmIy67XsrD7b7bnRVvdkU1upUERa5qqWT6f3wURXvMRccud2gVx1MDAxZjGha0A+7s1HY0GLkDCxU1xm5n23a1tcdTAwMTCbULhAXHUwMDEyoZFSXHUwMDFjQFx1MDAxOehRXHUwMDAzy37tJpF1XHUwMDA2UFx1MDAxN2b+3k2M7jT60kSSXGLWpTBt7ChcXLAjYVx1MDAxMShlXHKogUcng59cdTAwMWHQX8W4fGRqI2SsKlxum+yYPJ+r3Fx1MDAxY2ieKjRcdTAwMTfWXHUwMDAxS+6l9Fx1MDAxMDaqeFxcXHUwMDFkXHUwMDAzXHUwMDAwqktcIiNuXHUwMDE1I3hhXCJVyGZr482gTTVgNiYodFQhXHUwMDE143FCuKt1n6mQ3iggUcuzkCZcdTAwMTDTjWDuqNdcdTAwMTDMXHUwMDFj5ZhcdTAwMWR+17SAyZNvyFx1MDAwMcxcdTAwMDBcXMZcdTAwMGVDSUVn2VFcdTAwMTaTXzva9spcdPnsXHUwMDA06Cc7vlx1MDAxYv/tWiudmOq+rMfmnb5Ljb9siYXwluBcdTAwMTJzvPVGtvywQl+uwy7xL7PEP3lcdTAwMWP7h8kpWTO09Ye8h6RcZkFlkd9JSCtAOstcYlpcdTAwMTnmyKCOalia9zN3XHUwMDE2tSCHXHUwMDBm/Fx1MDAwNPPu3EDiXHUwMDA0dtpcYlx1MDAxMnAzPFx1MDAxYUw6mlx1MDAwMChcdTAwMWFetbxQk1x1MDAwMqBcdTAwMWZtXHUwMDBmVO7xID00RpKJXHUwMDBlgbXDLe6HL1x1MDAxMl56ady536DNSZs1+52D1Fx1MDAxZMG+z/WaXHUwMDFkP++YYtzVkZKnXoesykk5IJbu6uXyW9xcdTAwMTnPdq3o+Vx1MDAxY1xmdcRJi09UU45cdTAwMWMnIf2yKD41yXHpL3cjhlx1MDAwZkaLrGG7lz2ksFxcZ1x1MDAwYpZOMFJcYlx1MDAwMTZXSlx1MDAxOFx1MDAwYjmP/rUxXHUwMDE4n1lMLTFcdTAwMDZjP1x1MDAwZjrHXHQ9dcNcdTAwMWaGSJF4xWc5065cdTAwMDBcdTAwMTahn1C7Q0+Cn0InbKxynpra61x1MDAxNYFxS9lW5siB+PJcdDOasl5cdTAwMDfYXHUwMDE0oPGMQZEn1LdhkYn2h9dAXHUwMDE57MvgLFx1MDAwM5MphFx1MDAxMlx1MDAwZe7ssY1FX1LzUV5cZopAo9zKXG7B8C5CoDzggST8pD+3tvzdX8+d6ZftOmtxl3JcdTAwMGVcdTAwMDPvXHUwMDFlvlx1MDAxOGFVVG8kkd3vn3JrYXcp/1SqydOctyPq0/DLr3Cn+b2WWphcXPJ7Rlx1MDAxMD2NJVpbevKQzlx1MDAxN4QgMSNj9Nar7G5cdTAwMGKQXHUwMDEwgcJcdTAwMDNX/9jyNFx1MDAxNevLaPHAYbdpLV2mJSvjI+7/9p/5cKKoZFx1MDAwZfVmSi5kYmv5UCT40SCkT3mF46CCYd41a33ZJuWJaU+BcMulTSWbj6qXJWSuXHUwMDBlP1poNLoqqri2NaYwLEPu+Vx1MDAxOGqQXHUwMDAzXHUwMDEy11x1MDAxMNs/fuyV4tffvZjNm9f3eG+/q8+HqttcdTAwMDHDdKqa+eyjr/B+Mlx1MDAxZmVcdTAwMDOQ9zRcXElcdTAwMDBcdTAwMTTyobhcImKVYXmLhpA1zVNxiLF7kcNcdTAwMWF2fJaorVx1MDAxM1o1U7e2XG4/XHUwMDE4fMyjMmK5edEw8Fx1MDAxY9xHqOpcdTAwMTXws+d+3rjvtY/dwrWls+yP7bCsnl3cYnV56WhcdTAwMWPn+Zp0+L5cIlx1MDAxNWGdRuZkoPjAff5wfMbpl1x1MDAxNlLBbFDTJmVDXHUwMDAwOqtcdTAwMDImWE1cdTAwMGZpssV894SKzPVcIlxup2TIXHUwMDE2U9Fp/kSustvr79jx79hFXHUwMDA3Y4G7smOx3uVK2Tp9o6pPNZs9XHUwMDFlO0VXeqko+H7sQ+FnXHUwMDBm5y+Lsu9MyXRwXHUwMDE076VP353xR1x1MDAwZYBnw3ngVutcdTAwMDTTKIV9/Y470rw0XHUwMDEweeyRvlx1MDAxOP/wQfelf7hITMuZbJNqlmjs6Zp1jpFcdTAwMWLstXOD0zGHsjqPqCCuzTXY9k/sh8uVXHUwMDE1gHGGMT2VUoFn2q5cbjDDgJ6f9p6zz2n2gYm8PqJzJmpErH/u9T3KXHUwMDE0mFx1MDAxZVx1MDAxZN7p8+tyWEZVQ1x1MDAwZuCbknXHlC6eeOvw0q9PymP9ZUmxZLbUqyVcdTAwMWWejkuOYLhcdN4qJeOva6VO41x1MDAxZGtcdTAwMWQgbXRGYYbbpVx1MDAxMo/9M/fzXHUwMDBiW1aqVV5cdTAwMWOAMyd3yzVJ4dpXv1x1MDAxNrfPcIna6dhcdTAwMGa/5/ryl1x1MDAxNS3H4JYpWF4zXHUwMDEzK6qGPbMv9WlcdTAwMWNUXHUwMDA0TcPP3KhMhUOP8vZv0WSfKV2is1wicbsq3CNcdTAwMWHLXHUwMDEy76Wm/66J0/1dXHUwMDEz3/iSfE27WZ7WOYrFXHKtS1x1MDAxMZzX8fdwmE9cdTAwMTFcdTAwMWaHy/jy+9d3XHUwMDE0q9KduEzSLk70XHUwMDE2+sShXHUwMDFkPlXmNZnmJYN9+1x0bLfb+Ov5hyOsXt85e3xsf1x1MDAxNJ5N27aNp2pMxE26JvywbPyX8dSWh+1cdTAwMTi2Wi2dfMctXHUwMDAzXHUwMDA0bFx1MDAxNyU8XHUwMDE51Fx1MDAxZFx1MDAwZfm1M1x1MDAxN/6xM1x1MDAxY4+Zdqb+/IrTXHUwMDAylCUnek5cXNh7vzyMK7h3XFzrXHUwMDFiLzjesoqAla9cdTAwMTFcdTAwMTle9I26PTtN0eRfvnH9w0L22pvM39kkL/B7XHUwMDFkXHUwMDAyXHUwMDAze6ax9cu1VDv79VVcdTAwMDW/1+VlcVx1MDAwNIYwXHUwMDExklxuXHLDltbhef/lePmyXHUwMDBlX0bKjMv6Nz5cdTAwMWFMkVOPL7PLZ93kvs0/+fPLSkrrl6FcXFx1MDAwZfeTXHUwMDBm7D/x1CmDXHUwMDAxSV6PTMWX/XP+5ZSx9bvWXHUwMDE08oDM4V+OUz2VXHUwMDFlllx1MDAwNCj5LsnfdvvvuU3AqI9ar/5lYiVFrL785Ik1YVBbXHUwMDFjua0/XFysVH5Z11x1MDAxY5lcdTAwMDO4tttfjcR8vrbTqud2V0C/LPKdf3qu+86hd84ge6W/7cp8OTIqnXDrpIP8XHUwMDBmi6yVx4gyPnP7nqRX6fhcdTAwMWZcdTAwMDa7XHUwMDEwlF7k5Vx1MDAxMLCUf+zAWVxcRdjH3efKf9VFVf3a4nH63/xcdTAwMTBcdTAwMWYySlxiv3whyiqCWLlWXHUwMDAztYQ5Qn/5RUwvyz9s97fQuF5/xywqPctcdTAwMDWOQ8T0jE7/cLHaZVOcYFxmtI7G+j+cq/XDuZ5QgD5+mNP1e7/X11x1MDAxNvLmezTa/sNVXHUwMDA393yNKea5Q9Z/f1cq8UShqFx1MDAxY+z77zF5XHUwMDExQ/VcdTAwMGYru/LfMTNoNLfU6/f6P58/M/HL7L5cdTAwMTg3Q8t/efTv/YTyXHUwMDA37frlUmU75rRcdTAwMTdcdTAwMDPGXHUwMDFivSb/4a0/3/loqLdcdTAwMDNAzj+MX/v1NTZXk64olq9Q+7FcdTAwMDVfhfc8ecw2QaD0x5Z3+97oM1xc4HlcdTAwMWb5SH/m7SfGOnd+rLRcdPrwSPnXh2QhvP21llPPo93/8t3s+NVrmFx1MDAxZT1f31x1MDAwM1x1MDAwNfLXn3PIkbN/XGb/+p88fXWGO+bBiCH/cr0+dX79mvcwyr010Y9edH32vNfkMa+Vn9X/1YtncC9ccjbVV21F/zKwIyYxXFzhjYtmmtBfO7KxfrLCXHUwMDAwM35DXHUwMDAwxK9tkttg/Fx0nlx1MDAwMsOYIPjheif7nnvARH/23jInP61HXHUwMDE4ga9H5Vv/x3MjSFx1MDAxYyNcYopcIlxiXHUwMDE4gv8/50b851M/50b8z/frf/9cdTAwMWZYLC7VIn0=Minikubekafka<<namespace>>kms<<namespace>>kms<<pod>>myproxy<<namespace>>simple<<pod>>kroxylicious<<crds>>strimzi<<crds>><<pod>>proxy-producerdefinesdefines<<pod>>proxy-consumerproduceconsumekafka-broker<<pod>>consume<<pod>>cluster-consumerproducesplaintextrecordsgetsplaintextrecordssees only ciphertextrecordskey-encryption-key (KEK) used to encryptthe records \ No newline at end of file diff --git a/documentation/0.20.0/html/images/sasl-inspection-seq.svg b/documentation/0.20.0/html/images/sasl-inspection-seq.svg new file mode 100644 index 0000000..4e38dce --- /dev/null +++ b/documentation/0.20.0/html/images/sasl-inspection-seq.svg @@ -0,0 +1,4 @@ + + +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nOx9WZPbxpbme/9cbofnZSbYJoHEluiJfsBOkMTGXHIg53Y4sFx1MDAxMcRcdTAwMGVcdTAwMDIgXHUwMDAxcmL++yRKtmpj2SWp7rXubVFhucStXHUwMDEyyHO+8501/++//fTTz+21XG5//o+fflx1MDAwZXvfzeKgdruf/314/lx1MDAxMtZNXFxcdTAwMTboJfDw76Y81/7DO49tWzX/MZk8fmLsl/mnT4VZmIdF26D3/Vx1MDAxZvTvn376v1x1MDAwZn+jV+Jg+OxqaWl5LqtSJHVcdTAwMTmx+qXYn+a3h48+vOn3xdSh37pFlIWPL/XoeYJgxjjEXGKSoEmahCT5+dUrevVcdTAwMTecZMZcdTAwMDSJsVxmSTCAxFxiXHUwMDAwPr/exUF7RO/BXHRqjFMkgFx1MDAxOI5jXGZO4PTnt1x1MDAxY8M4OrbDe3A4pmiCpiBNYjiJXHUwMDEzxOf3fFrTf/yEfX6maesyXHKFMivrYeH/XHUwMDAzXHUwMDBmhz+Py/ZcXD+N6vJcXFx1MDAwNJ/f09Zu0VRuje7T4/tcdTAwMGVxlq3a68O3o3uN7uvPL36H/dslgFx1MDAxN8+/9Sn0S6NjXHUwMDExNsNe4J+fLSvXj9vhduHY41VcZius1OBh2/7rcU21m4fqsG/FOcs+P1x1MDAxZFx1MDAxN0E47MbPXHUwMDFlKJ79ulwi+O3X/b7pjztK/PbM/3tcXHxcdTAwMThcdTAwMGXfjDaRojBcdTAwMDY+XtWj4OE4xb58Wi+LXHUwMDA3KcRcdJLBXGKKYZnHdTVcIlx1MDAxMr/24WtcdTAwMGZu1oSPmzCsTXopmk/F85n0tWH/uDNPhFdJz8Shxklst4dXc1GQauGcfv78vv/320+PN/BcXFx1MDAwNe6n9eBcZo1RXHUwMDA0S+JcZoE/bkZcdTAwMTZcdTAwMTfpy7ublX76eFx0//bkpr1QpfureaVKzy7mk1x1MDAxNjH4XHUwMDE4KVx1MDAxMcPggIAkXHLwXHUwMDE3WoTEXHUwMDFmYyhIYTSgWIqG7CstoqkxizEkIFlAM1x1MDAxNFx1MDAwM/HXSkRjY4wgSFx1MDAxY0dKXHRIpEk/dOgtXHUwMDFkUu4r0bP3/6YtOEtcIpmncOyuulx1MDAwMJJ4S11IhiEwjFx1MDAwMdTXaMtHXG70o3xcdTAwMGVyiW7A3D2k7t9cbiGLn+9lWbSr+DasXHUwMDFkkGNcZoEwjZBcdTAwMDJCliUp+tm7ZDePs2EzqGffzWVxNNyVn330vWH989M708bIcn1+Q1x1MDAxZVx1MDAwN8FTS+OjL3XjXCKs1feYrLKOo7hws/XT6/np5eW457ZcXIbNp1x1MDAwYmrrc/j0loXTz6ZnXGaoP1D5KPZcdTAwMTh7q1x1MDAxMpdyw+Mu++usuVx1MDAxNJd3W09cdTAwMDZgY1xiaVx1MDAxYTAshSHD9ni/frOe6GVcdTAwMDJcdTAwMTA0XHUwMDA0kIGQYVx1MDAxZoXps/VkwFx1MDAxOOBcdTAwMThL4YBcIlx1MDAwMIvw4471xFx1MDAxZcXhh6o/U3W6+2ZzSeI0gFx1MDAwMPGWe/pPXHUwMDAy7OXTn80lJDFIXHUwMDExT6H6724uM0vpmEOi3KbTXCJv8FV1w7TtXHUwMDE3mUt0qdRcdTAwMTNcdTAwMTL3Teby/mreYS5cdTAwMTmSXHUwMDFhIyqIXHUwMDE4IaKMXHUwMDA09YQxflJcdTAwMWLEKFx1MDAxMSaTgEaMlFx1MDAwME846WetXHUwMDAxYFxm0Wchxlx1MDAxMoDGXHUwMDE5nH2tNSwyl1x1MDAxNOKkNFJSyFx1MDAwMJb+oUNv6FD/JdZcdTAwMTJcdTAwMDJcdTAwMDZDW/eKRVx1MDAwZS9cIn7zlrZQLGBwiHbqg60lsl6QZr5Anl9Zy5XbZH8rVLSZXGLj0Yr/Vshx9sy8fT+G80+s1UvD+eeX9jFG1F1p62R5XHUwMDE0wK5eOMrJ9bSCnr5cdTAwMDaCOHejXHUwMDE3XHUwMDA2XHUwMDE0x5H/yTBcdTAwMThG0lx1MDAxNHJNwCsoINnBcWRcdTAwMTlcdTAwMDbxXZIlXlx1MDAxYlDAjFx1MDAxMVx1MDAwNlBcdTAwMThcdTAwMGKR7WRJXHUwMDE2f7z1n6HgXHUwMDBm3vOnWHBXzz9cdTAwMWVcdTAwMGbIXHUwMDE3z/+VeHD9XHUwMDAyPEDOXG4kaIZ4RZNcdTAwMDeYJ5iXz342nlxmXHUwMDA2XHUwMDAwhT78keyZXHUwMDAyOEuxg1x1MDAxYvs1eNC0bntuXHUwMDFlbrl7XHSDZ5v46X79TLF0XHUwMDEwMiGAXHUwMDE4g2xcdTAwMGbBXHUwMDEyXHUwMDE0cSBcdHiAiL1cdTAwMTFcdTAwMDRcdTAwMTUyrk9QXHUwMDAxRj3ZZKTc4TN7/3nT0I+vzLVfl9Vvy/1cdTAwMDN1XHUwMDBihcjz1MKL1tC1gqD4RVx1MDAxNnXl3ZxcdTAwMTVcdTAwMDc4OaZpXHUwMDE2Q2RcdTAwMDBnkM6xL1SOwsc0TrM4S2NoY58g3CNnpVx1MDAxMa3FIHKOXHUwMDEw6UXs91x1MDAwZWXFmTHOMjhcdTAwMGUwXGZxXHUwMDBltC8/rO9cdTAwMWLadvtmXHUwMDA2i0CUXHUwMDAyXHUwMDE4y9y1ycTrpz8rIdpcdTAwMTlEnlx1MDAxMFx1MDAxZf7jXHUwMDE4rHDzl67hL66pPK2JnWBiR1l6N4N90HCKRpzxY1x1MDAxOOz91byDwVwiXHUwMDAySiObXGJI5NVBgP7BvFBcIlxmjjH0LE5cdTAwMTOIJyA9gq+1iFwikFx1MDAxYVwiJaRcdTAwMTBcdTAwMThC9mno9bNcdTAwMWFcdTAwMTGIw1wiiMUoiiFopG7gh1x1MDAxNt3XXCJcdTAwMDb7XHUwMDAym8VQgCHuKcaDx8e+XG5cdTAwMDR91lx1MDAxN1x1MDAxYUM2XHUwMDBiY8mvXG6QfqRIv1wisZ9CJPywXHUwMDBi3yVx/Vx1MDAxM5N1P+Lz8nI+hqza+DyL8G17na57/tezXalzn3xcdTAwMWZZJShyXGZJgqJcdTAwMDCkhjv5SHo+h3tcdTAwMTBcdTAwMTRgNElcdTAwMTNcdTAwMDQ+cNo7Sj9mWFxmZ1xiXHUwMDE2uaYsRVx1MDAxMneSJYBcdTAwMWGjz1x1MDAxMyxcdTAwMGJohOlcZsN+gdb/g9gq/uL5z59cbsq2XHL/waqPv1/1kc6TyFx1MDAwYr1cdTAwMTfqId8mq5BcdTAwMDVcYqBp+Ljdf7Xav4OrYlx1MDAxZXs44D5cdTAwMTJEgsRd4NE+XHUwMDEzUCSO+Vx1MDAxNEV68OCzNImD8Clu/l246nw5LVd7LPlVmXWd5lZNlOz819o2KPBzZSMxpGtcdTAwMDN3hFx1MDAxOCBZXGZcdTAwMTAvMpPIp6NIiiVpjFx1MDAwMVx1MDAwNMJk8rWFJZBcdEZcdTAwMTRcdTAwMTfHXHUwMDAwNuTDcHDHNURcdTAwMWIxplx1MDAwMUZSwy+C6Pu+wML6YUBcdTAwMDbuf1x1MDAxYj3j30tUwZtEXHUwMDE10U3I4Cz7StU+Uaq3XHUwMDE08CEpgv77SFx1MDAwNVx1MDAxY4JH7EPm+2tcdTAwMTSwKuOXNPjxp59cdTAwMWVl5uFcdTAwMWaff/6vf7/77l/eXHUwMDE21OHxSkRcdTAwMWa/75VSZm7TXG5lnseDeJjDXCJfIWHr1i2PtjUuopevhUXwxitcdTAwMGaf4uq67I6h+0pI0OfefK0qs2v0sMF/RsZJ3br9apOnTlx1MDAwN8Gc0oljQebue6BcdTAwMDLixFx1MDAxOGA4pFx1MDAxMErj+NPigk9IwY5xZJrRZlx1MDAwM1x1MDAxMtBcdTAwMDBR6VdIXHUwMDAxxlx1MDAwNFx1MDAwM8CDR0+RNGTuXHUwMDAxXHUwMDA1jbxmxORcdTAwMTGbh8g5Jr8kJfPfXGYohG9cdTAwMDdcbopFZJuB2ONGPFx1MDAwMVxu5tWzv1x1MDAwM1x1MDAwNUDqzKBcdTAwMGZcdTAwMTNcdTAwMWZcdTAwMWRmZoesyeOd+auQ4k05XHUwMDFkXHUwMDFlryT0X1x1MDAxNCeuSnucmWx3NdxltqmwzXlz5d+DXHUwMDEzOIEzY1x1MDAwMoEsg9FoX1x1MDAxOeqRMjxcdTAwMDBcdTAwMDVBjVx1MDAwMUtcdTAwMGbcXHUwMDFjsFx1MDAwNIk9XHUwMDFhqd9hglx1MDAxObNcdTAwMTRBsviQsCXuglx1MDAwNEWNWeRbMlx1MDAxNEZCXGLgXHUwMDBmkHhcdTAwMTMkxG9cdTAwMDdcdFx1MDAxYUfWkqTwuyBBvlx1MDAxOfZcIlx1MDAwMNrloVx1MDAxMOe7ofNcdTAwMWbLJt6Q0uHxSj7/RSHi0ESumYdcInSBW1x1MDAxZLO2PPu28Fx1MDAxYVwi3OE3vXQ72DFGXHUwMDBl9YxcYvaHwN7zhFx1MDAxNDlmSIKEgCYgXHKQeXpdXHUwMDBlSWJwzCBvkVx1MDAwMVx1MDAxMEkmfc/nXHUwMDE46FxujtjIkJFCovP0Pd9DWO9NmPiDsN7jej9cdTAwMTYlpG9GXHSKZFx1MDAxOIjY4d1cdTAwMDTV26E+lkBcZoT9QIigcGKoQoBcdTAwMTj21ztcdTAwMWNvyujweC2d3ztIvNTjMPPK7l3xf2jy0HI8r9F+5YJTsTlcdTAwMTJcdTAwMWHBvVx1MDAwYicgXHUwMDBlx8j+QIBDXHUwMDAyXHUwMDEyXGZ8nkTDh1x1MDAxMN5DaVxuSZKQIcFrLkGy5HhI2uA0w973ONBGYFxmwFx1MDAwME5C8inb+IFcdTAwMTHPMUL+dozAcYZcdTAwMDWQvYdcdTAwMTHgXHUwMDBmQFx1MDAwMvmSLHJcdTAwMGI+XHUwMDEyJlx1MDAxZZhcdTAwMDTyX1x1MDAxOPw7gIk3RHR4vFx1MDAxMM5/XYhcYmeMne1BsuiVuPHywJonyvI9KULEwcaQolx1MDAxMe6zXGaDUdhcdTAwMGJnXHUwMDAzgDHDXHUwMDEwQ/RcdTAwMTKjXHUwMDEwVWPvxC9cdTAwMTG9XHUwMDFkQ8Q0XHUwMDE4mkBcYsJcdTAwMTD3MoRPnNJcdTAwMWa48Fx1MDAxY1x1MDAxN76kXGKchjiG41x1MDAxNHO3XGKUeDuDTlx1MDAwZdUvXHUwMDE4+5FF4Fx1MDAwZkSBJFx1MDAwNlx1MDAxOPhcdTAwMWFcdTAwMDT4PSM4dYugObpp+NMyPJ3D5n4hOP5lacAsPDz5nldJwLas3spcdTAwMDA+W/rLdN9cdTAwMWas9WNyfrJcdTAwMGY3VnG4zYh2nvyy9KROON+pmLlj53FcdTAwMDIhXHUwMDFkRZJcZobRiFx1MDAxMlHwuT+A/CmKXHUwMDFj0nTI5cIgok137DxcdTAwMWOTXHUwMDE0y+JcdTAwMTTyV3FcdTAwMDI8vuOxUnWMUVx1MDAxNEWiXHJHbOKHoX9ToWffXHUwMDFlMsAoxGlcdJa6XHUwMDE3MniajH2p51x1MDAxOIuTNP001PBRlp56Wnn+l8VcZt6U0uHxQj7/dW19v1x1MDAwYoml+eua1kRFN1x1MDAxM+lcdTAwMWOpbfg+d1x1MDAwMGPHNMRcdTAwMTBY3Ktop+FcdTAwMThnh9xcdTAwMDSDTFxmQ5Ov279IXGahXGZyVWmCQZ7n08qCzyjBjFx1MDAxOZZ5XHUwMDE5U/hcdTAwMDFcdTAwMTHPIWL+7Vx1MDAxMIG8NnSL6ftFXHUwMDAyf5R6YCiCIJAx+GAqQFxmzZx/ferhlzdFdHg8XHUwMDE1zn9dfJidzsoqWZZcXNK70cW5/NJcbqc7+PDaXHUwMDE3YCE2Jlx1MDAwMaQxXHUwMDEy+YzIXHUwMDAyvYJcdTAwMDdcdTAwMDBcdTAwMWboXHUwMDA1gVx1MDAwM4y+Q1wicIpcdTAwMWSzXGJCXHUwMDE4xDWRR3CPRPxwXHUwMDA03lx1MDAwNIXFXHUwMDE3OFx1MDAwMiRcdTAwMWNCdMglu6P9XHUwMDAwvOlcYlxmXHUwMDExY4b+yFx1MDAwMoVPuk+TkPqqQMA9N6CpyqJcdP9J/ICXi/1cdTAwMThHXHUwMDAw2+/MNKk8K7+eSMWuhPRcdTAwMTf9TjnSXHUwMDFiiVx1MDAwMUTaXHUwMDAwooEkgdH083IkXHUwMDFjkONh9lx1MDAwMVx1MDAwM2lIUCR7p9PzR2LgI3Va+/agXHUwMDFmxVx1MDAwZYVcdTAwMDKvnfthhVx1MDAxML589tFcdTAwMTXAqCGO/5E1wEOFXHUwMDAxsp9cdTAwMTT113tcdTAwMDI/Ulx1MDAwM7/3tC1dcmWR3SmtU1le6qZiXHUwMDEx/XtsPTLiY4j4XHUwMDExw2CAJugn4eNPso9ghEVWXHUwMDFlmVx1MDAxOHZIXHK80Vx1MDAxMs5cZuVMXHUwMDE0pO7XXHUwMDE5/DD2b1x1MDAwMoP+fmPPXCKfjKEhflx1MDAwZlx1MDAwMcDrjrbfXHUwMDEx4IEg0MRHhlx1MDAwMlx1MDAxZTpZMYKgvqQz+5Wt587tXHUwMDEx/VwiZIrbf4ao31x1MDAxZi/3Y+x9aJD23CeuqmAyhbOXXHUwMDBlXHUwMDA3v3p/q1x1MDAxY7LmY+TuYCRJIdR/uuXD3Vx1MDAwMiw5Jlx1MDAxMOtjWJpcdTAwMDJcdTAwMTjCy8eXP1cgs1x1MDAxML2FJFx1MDAwMVx1MDAwMUiKfjpcdTAwMWbi0eZcdTAwMDNcdTAwMWHxXG52SEDhXHUwMDE08bSX+XfNppF3XHUwMDAwaIxBuIAxXHUwMDEwsi9bRf+7arr9zY1zXHUwMDAww9HmMvfrkdnXJVx1MDAwM4+Tklx1MDAxMNfDXHUwMDE44sNcdTAwMWKBXHUwMDEw2Vx1MDAwN1+EXHUwMDAxfyD6VuPUqUCpUy2J1+RpajF+8P7JJlx1MDAxNDGIPvI1XHTEXHUwMDA0MMA8r6klWXpM0kMnXHUwMDBiYJBTSjKv89vYmGDo3/tcXIi7tfdvv+WHUXsu6rtvXHUwMDE29aHRnoBcdTAwMTCn7ok6fLtPm1x1MDAwNcQwRIP5yFx1MDAxNPdX0d0/kPR8R0nOWUxUWVjeSGleVFNcdTAwMTC/h6pBnHxcdTAwMTjbNXSjQ4Z6Uq45bFx1MDAxY/FQXG5GkzSCZZbG8NdRW4TYY+TusSRcdTAwMDMo5KhcdTAwMDPsToJcdTAwMTZnx1x1MDAwNEVDjFx1MDAwMSSSdPR1P6T8LSnfv5+6QXYou8HuRWko+PbILrRJLFx1MDAwNcD347v9Tt3iw0//x33kQ2jNPzVn30dcdTAwMTfb/Nd9XG5HjYfQXHUwMDEwcjNYXG6nXHUwMDA3XHUwMDEx/lx1MDAxZSjd+y7jY6idNlx1MDAwYjf2civp9FU1yVkxm3ZC8t6c7lx1MDAxME6lacTIXHUwMDE4XHUwMDEy4s9tXHUwMDFiXHUwMDEyXHUwMDBmpPZwmCOBQURcdTAwMGVeT1x1MDAxZlwiWTBmkFx1MDAxZkxcdTAwMDJcdTAwMDb9XGKeXHUwMDE0XHI8av1Qio9cdTAwMGZuXHUwMDAyXHUwMDA22KFr+IfWv6X1/ntt21x1MDAxZqRsXHUwMDEwz2ZcdTAwMDBO3m0rI+i3R3iRQ3ct8rE/vICLpJ5cdTAwMTag/4Vp3TckdXi8ltHH7/u3XHUwMDE33/vPXHUwMDFlzVnO9SS/tnHeXHUwMDBixuFcbtZhWM+K91BcdTAwMDSWRjyYxLCBXG5D5Mo9r/NEZn9MssP4XHJcdTAwMWNcdTAwMTIsuol3xuMyiCNcdTAwMDBcdTAwMDKxXHUwMDAzZCiwu2HfO9GcXHUwMDFmPt99sFxi309cdTAwMTFoXHUwMDFhXHUwMDFiptneTeQ8qaR7SVx1MDAxMYY0JrJcclx1MDAxZt1q+u1cdTAwMTThWbik/v6TOX+y3o8hXHUwMDAxc3bzq8xqXHUwMDE5S1pcdTAwMTc9X9T5pl8y76vYXHUwMDAwYIxcdTAwMDRcdTAwMDRcdTAwMTF/SLM0eFnAzVx1MDAwZcNZkIeLs/RcdTAwMTAguJfPYbExcn1x5Fx1MDAxObyRzSHH+NBmXHUwMDAz2Vfv+cFcdTAwMDGeq/XhmzlcdTAwMDDyXHUwMDA1IINhzD1cbkDib6o7TuJcdTAwMTBcIv+O+fjCLojB7yCdc19Ih8dr8fzXNf/6XFwhfCletzi2JWfUVq3OXFz7PvNcdTAwMGaGkS5cdTAwMTBHXGZcbsOejjF7XHUwMDEwfURcdTAwMGWQ9zW0klJcdTAwMThD/EjmfDQuRF9g7tHtXHUwMDA36L979p54u4JcdTAwMWKwXHUwMDE0gyGN/c7t/Y9szvA7ND1cdTAwMDbyL7G1a5fyas+Fcdsld9T4rcGHyM1cdTAwMTlcdTAwMDJ6XHUwMDA0TbFcdTAwMThcdTAwMWNicc+U+Vx1MDAxN5yAXHUwMDBmulx1MDAwZZEzSVI0XHLuzFx1MDAxZMbxMUkwyG+kkLBRXHUwMDA0fW/uMDsmkbMwXHUwMDFjdVx1MDAwMYZB/j9mtr2l3cl7rf7bs7tZXHUwMDEyXHUwMDE5d/qu1cfp12mdx2JNilx1MDAxOWKyXzd+9PP6vmjyobbcYrtff2nTXHUwMDFiZUpcdTAwMTcu8GY6JL5s8iFy4eGXzDb9I1W6u5p3WERcdTAwMWMj6DFcdTAwMWOKXHUwMDFiXGJcdTAwMWOncKQsL7RoOOpcdTAwMDXDXHUwMDEw5cBcdTAwMDHNYvjrpChLjZlhaiyBXHUwMDAz9vmQhFx1MDAxZkddfLFcdTAwMGWlX1DbSFxm4e9hjtI9bWHot23kw8g76kOHqnyVPL+ykZ/GWf+tXHUwMDEwkJ16Jqnfz+TDP7FZL83om1f0MVx1MDAxNpTlXHUwMDE0kLPkXHUwMDE5P1x1MDAxMFx1MDAxOF2saYnPb8d3W1BcdTAwMWGyY1x1MDAwNlx1MDAxYlx1MDAxYVx1MDAxYyCDU1x1MDAwNPNy6Ck9ZHTJh3RcdTAwMWGBYcSdrDBcdMkxxIec2V0qPExcdTAwMDNnXHUwMDFmXHUwMDA2nUJ66EL5ZzGef8VcdTAwMDCV7NtzwuxQyFx1MDAwZsnXZ9z8/NB8+lx1MDAxNlx1MDAxZSBVwlx1MDAxOUjSXHUwMDFmjlx1MDAwNzRcdTAwMGWfXHUwMDE0v3+TfTvjSqO616JcZtZLn0t4aVx1MDAxYjTG+6nikFx1MDAwNFx1MDAwMlx1MDAwZrNcdTAwMDVZXHUwMDEyXHUwMDAz2Fx1MDAwYqqIXHUwMDE4/kNYXHUwMDFkXHQ8JGhI3CGKP0Zkf6Cof/uZaIj00+RcdTAwMWLtvfTbZzyhxVx1MDAxM4Bl8X/giWirxZ5Sf81XQWZbeWfodqL0sy+iiehBf9SA7PureVx1MDAwZk1cdTAwMDTIm4JgyLZcdTAwMGazhlxi+DxyQpPswyQunCVcdTAwMTBFxO/lTX6Mx/5AXHIq309cdTAwMTNcdTAwMTmIbjd5f0guzryuXHUwMDFm+qwrOFwi/VxiLZmPLor7Ynl+RVx1MDAxM7/36dh/Yqz+kdOxIW1x2zC9Lbr+tseh2Vx1MDAwNtGNeq3wd6dj08x4XHUwMDE4m1x1MDAwNWmKYTGKfu5cdTAwMTjSg7l7XHUwMDE4iY98b1x1MDAwMoev/cJcdTAwMWazsX/6cL2v3q/36JZjXHUwMDA0fFaB/GRS1utSq8dcYuowolx1MDAxOX7ocN5vU/t/nunYsSv7YWT8giCHy1XhTFx1MDAwYlx1MDAxYZ69m6VcIj1cdTAwMTgj+0lTkMJxkn16VMsnjcPGXHUwMDAzw0dWXHUwMDE0WWHiSZzlx9G9vz37scr27WdcdTAwMTHiOE5ccl3kd49Twkns7a40+HA6M/l1xvfrmGq1LSRcdTAwMDPkxzBg2SpgxLNp7uW/jKneX807mCrBkENfO1x1MDAwNpG+XGbTg8FcdTAwMGItXHUwMDFhXHUwMDBldaBYjMWG1mt45zDCXHUwMDFmR/d+oFx1MDAwZX3JWYTD6Y9cZvKtv/hcdTAwMWNcdTAwMTeE7lx1MDAxMH1cdTAwMTD78KT/xzDV7/no3j+xWP/Qo3v3xq/kXHRtNN7OujOtZot0ar/W+LvDXHUwMDFisTFETiN8mKiPP3dNqSGKiVxyfsww15GgX5vNh64ufKhcdTAwMDd4ey5cdTAwMWI+tHmy7JBcbqY+zfT/rlT+e0ryv3Hc4JdcdTAwMTT/kFxmhFxiX+9cdTAwMDJcdTAwMDF4u/5cdTAwMTfB+dCV93fAXHUwMDAxXHUwMDFhw/764p9f3lx1MDAxNtTh8VpEXHUwMDFmv/CV7f4nL1x1MDAwMFrbXFwmRvRq6lHSL31nePNge6f+9/XMeFx1MDAwNOhjXG5cdTAwMGWhQ3SHXGL8xVmJxDBcdTAwMWFcdTAwMGK5XG5cZo0jKEH+w2t2XHUwMDAwxoCmqOF8XHUwMDFhQD5cdTAwMWbv9shcdTAwMGWYoVx1MDAwNXRIirCQejY86sfU+J+eY8W7XHUwMDBmS3xcdTAwMTMraHY4Spa62/JcdLC3OcOQqGaIp8nTXHUwMDBmOllcdTAwMDKB15Puyr/uZIk3xHR4vFx1MDAxMtDvXHUwMDFkKL5ybHygzVx1MDAwNS5m3XlXyjqprvVoL6ze40NQQyMgySA+imFcdTAwMThJXHUwMDEyz2GCXCKHY+NcdTAwMTBfXHUwMDAzXHUwMDBm50qAO6GvXHUwMDFmTVx1MDAwMlx1MDAxZlx1MDAwN1x1MDAxMvBLzoJEQlx1MDAwZjFcbr9fNvj6ZInPcEBRNFx1MDAwNCz+oVx1MDAwMyF/9Fx0/N36XHUwMDA0Tuv5wYczZjuNOGfLXHUwMDE45XmV3zn08W6fXHUwMDAwMaaR105cdTAwMTOQhVx1MDAxMOLP5z5cdTAwMTHI+Vx1MDAxZlx1MDAxYXtcdTAwMDGG0ThLPW3D/KzbQ6pcdTAwMGI5bEO6mLyv2/SYZFmKXHUwMDA0gKBcdTAwMWaKXHUwMDFlvq9M8Pek2m+c9fgl9p9i8eEosLu+XHUwMDAy/vZhycRw1i986mN8kK/AUFxm+yVFXHUwMDBmf1x1MDAxZvtcdTAwMGaxMVx1MDAwNlx1MDAxZca/XCJcdTAwMGWAhPmZp1x1MDAwMMY0cmlcdTAwMTDHpT6dXHUwMDFh87RV4P7XvSn0w+OVuH/vdOLr/Y6Dp3RpKrSMwWiaUaTUXHUwMDE50ulr3Hlr/lxmi42HOVxc2OB/XGanyj7DXHUwMDFlklx1MDAwMENcdTAwMGVcdTAwMWTZXGZ8mMNcdTAwMGbuzp9cdTAwMTlcdTAwMWNcdTAwMTRAXHUwMDAwXHUwMDFj+TA4xdyL72P0mCFcdTAwMDCgIEXTXHUwMDBmJ4n/4Fx1MDAxOZ/W9KdgRLxcdTAwMTeM3o73XHUwMDBm2ZmhxORcdTAwMWX9YP9gLFx1MDAwN1xy0ceezVx0/uZw/2+T0rdzem3fbldTX+FcdTAwMWKfO+mHX73n0f/nxvLzK++I90OWJsFcdTAwMDdcdTAwMTV4MefKxImVf7VcdTAwMGWRndhGXHUwMDEwzlx1MDAwNPw9XFx9OLlcdTAwMDVSXHUwMDE4QYLhSN8nRa1cdTAwMGY6RTLjIVxcXHUwMDAyXHUwMDA3n1x1MDAxZinMncouiI9xkoZcdTAwMThcdLGhd+TOpOZcdTAwMWYjP35f05+qXHUwMDEw+Vx1MDAwNVSdwIahXHUwMDFmLHbPc6f/oMlcdTAwMWa5+1x1MDAwNINR39HExj+Y+nFw4+yffeTHy2v4XHUwMDE4XG5fzZNFtz7+XHUwMDAyyjlVxdosOGzy/btcdTAwMTSeXHUwMDA0SOFcdTAwMWZixFx1MDAxOEHTL4YvI4d8jFx1MDAwM1x1MDAxMuFcdTAwMTKJ/mDw3umwxFC6QjDDXHUwMDE4OPph3s9rnf/Omvi+p0plyHyBklx1MDAwZqdy0lx1MDAxNHG3UvOP/HFy6P2FNPzwUD7NsORXhed+V3LvXHUwMDFjZ8HKbbLV2UtcdTAwMTDP+5+DttzU4D+90vtf37Ff/s51f4xyT6neXHUwMDAye7OTYkqXpe2Jyn+Ny3cp9zA+caDIXHUwMDE0jawx9WIs89BugF5F1Jkh0XYyd1x1MDAxODKJ3Pu3TmD7odRvK/VcdTAwMWKHPN9TanTfXHUwMDExlbo7aPlpXfDL5Fx1MDAxY6K3JFx1MDAwZT6+nFx1MDAxNMdx9ptmqvtcdTAwMGbp7EE1htiVjKxdXHUwMDE4PGjHJ+X495/C3lx1MDAwZqvBXHUwMDE0fs/6/VVX8THa3ot1wt1AMePT7XI7zZeddsZea/tcdTAwMWJeMYtRY8ggT3UoV8QhfHHcO/KpXHUwMDA2nVx1MDAxZkJyw2gn4t7Bau9o48WfJHC/a+X/x1x1MDAxN+nAd5/d/Fx1MDAwN4VuXHUwMDAwwfFwXHUwMDE08Vx1MDAxZFDAXHUwMDE55u2TmGhcdTAwMDCGYkXmq/Jwn1x1MDAxN/hFhW5cdTAwMWRFXHUwMDFlXHUwMDEyrS7UMlx1MDAxM4pyXHUwMDBm/Mapqi9yfGmcouBcdTAwMDfNdb2/mneYSlx1MDAxNlx1MDAxZs5cdTAwMTlhWHyIJkGSetX+ToxcdTAwMTlcdTAwMWNjmaFcdTAwMDaYXHUwMDE4XHUwMDAyfq/0Zlx1MDAxOIeMkVx1MDAxOM7iNFI+XHUwMDE2u1x1MDAxM05isTE2XGZcZqVcdTAwMTmAXHLn3X5JLvu/l1x1MDAxMr1xtPH90mxcdTAwMTZZQ4Kh75aFwtdk+dH3JYa6xVx1MDAwZp9TTOM0fLL7X2FDXHUwMDA3u/O34jdq+beCXHUwMDFmyOb32ZzxJ8bqpVl9dmGvLutj7OdtfSCOO80r+jD+pWj5y1x0a+5MvXpdzYLUe5hcdTAwMDeENpBAXCJFvezdXHUwMDFmLCdLgqGtfzjUXHUwMDEy3pl4+6Oa5Vx1MDAwMyHg208uXHUwMDFlyv5cdTAwMTHFIe+eYUCDN1x1MDAwM8hcdTAwMTBiQ1qG/chqllx1MDAwMVx1MDAxOFx1MDAxOJJi6a9cdTAwMDKGXHUwMDFm1SxcdTAwMWZdzbJmmtNlf937/ew051OhXHUwMDE31v70/bkn8JDZXHUwMDFl6iMg8sLY5441YmFDV8hQgD3c4zsnXHUwMDFhPlxmvkJ4QyGmNyQ4wL1A+Vx1MDAwZo79Jja8cXrxXHUwMDE3cOyht1x1MDAxZvG410Gzh92h3pyJXHUwMDA3cIJBXGbu6eb83Sl2/4v9635/3Fx1MDAxYfJqXHUwMDE1XFxlSV9Y7e4v6yW5v5p3UGyGZMeIqFEs/jBcdTAwMDCHfqk0cIx8VoxcdTAwMThcdTAwMDZcdTAwMGVCXGbemVx1MDAxNofUXG6iOz90Nlx1MDAwMFx1MDAxYWfwe/OlfjDsT2v6U1x1MDAxNZp+XHUwMDAxwyZZdCfBnVFcdTAwMDBcdTAwMGYs+nV52JNcdTAwMTHSOPpcdTAwMThDf3+9JJ+YqIp2XHUwMDEzITxa8t+KT8NlvkeS/Se26j7J/qNL+1x1MDAxOKJtXVx1MDAxY2eVVdLetFx1MDAwZt3U17mFXHUwMDFibl5cdTAwMDPBvW5onFx1MDAwNGNkNzGGJJGIQPp5k1x0jVx1MDAxM2NI4CSSLFx1MDAwNlx1MDAxZlx1MDAwZaR+zbSZMcJcdTAwMDBcbmOR9UVI/lx1MDAxNMZcdTAwMWbj02+/53vphn5ZK/JX4oH6fjyghvlwLPW6XHUwMDAy42Epf+BwXHUwMDAz5DeRLPz4PNTfs1x1MDAxYlx1MDAxYXH2IGRCXHUwMDAw0ZUhs8RcIlx1MDAwM3UgXHR4gIi8XHUwMDExXHUwMDA0XHUwMDE1Mq5PUFx1MDAwMfZkXHUwMDBlwN+lXHUwMDFierssMpU17anWhylD5lx1MDAxNDhe1+8mrDhGXHUwMDEwY1x1MDAxMv3FXHUwMDEykMTAy1mtNOKzOFxyKVx1MDAwNiDDTNH0a437MdzxI5Vt9u38dbDJ1P2gXHUwMDE3wF5Hjlx1MDAxZmuzIXg4ou9cdTAwMWbIXyPiXHUwMDE3+Tq7Vr/KU/fMXFxcdTAwMWI65HftX8Zf76/mXHUwMDFk/HWgrWNAkNhQc0iT1IvjXHUwMDBl6KGRgaUwcuiHXHUwMDA2XHUwMDA0/prA/pjt+IEq9MZh9nftXHUwMDE18zB05W5T09OutFed0DhJXHUwMDEzw1x0X9+NufonXHUwMDFh7fgn9upcdTAwMWY82lx1MDAxMbd+XHUwMDE18l+c/nr2Ql7ssV86+ninxfGt0Y4supdcdTAwMTTEaGJcdTAwMTjm8rRH6dPAO2KMXHUwMDAxxGWRpFxmqv1K73/MdfwwrX/jtPovMZxcdTAwMDQ5tKvcPVxuXHUwMDAxvo1cdTAwMDVcZlx1MDAwYoYz8D60w/GjLdtxLXVJw5fTbT0vT4lti6X3forI4thcdTAwMTiAh7Z+XHUwMDFjYVx1MDAwNvG8clx1MDAwMMnnXHUwMDE40XdE/jBcdTAwMWNcdTAwMWLOcPoqhvgjpvm2aL/70PY/qFx1MDAxYkDsXHUwMDAzkVx1MDAwZvZeUHMoXGZ4U7qRn40jRvl10v11pLDkllnrn3V1rWO6d3a8uYtE/69cIoX3V/NcdTAwMGVSyFx1MDAwMjBGJpZFXHUwMDFlXHUwMDBmYt049tKvYsfDWFx1MDAxY4jMMMvQ4HW1zY+qgVx1MDAwZlShLzneXHUwMDFj8WuAg7vz3Fx1MDAwMMDeLrGhSFx1MDAxMoNcdTAwMDT2XHUwMDFkjsf556lcdTAwMWH4XHUwMDEzQ/VXVFxysKfCv1x1MDAwNrvovFpi4b7UXHUwMDFjXlxm39XdXHUwMDBlSWxMXCJXXHLxXHUwMDAzJE/Ui8Bcblx1MDAwMVx1MDAwN3hAjjrJ0iyigHdcbuhcdFx1MDAxY1x1MDAwZWlcdTAwMTFcdTAwMDZQ/yyH4HxXjNB4v85DxExIgro7XHTnj47BXHUwMDFh8uQszmDfT3fr/WLbxy6T1XCubNP8z+aTzvzzVNq+51x1MDAxMj5G4f+4l++Pm95cdTAwMDeiTFx1MDAwMWStkWIzL07IpXBijNCAoVlcdTAwMWG9RNxcdTAwMTneXGZcdTAwMThyaP/F0cfxt4rrXHUwMDExXHUwMDE3p4eZXHUwMDE3yNJQ9EOT8HeFXHUwMDAw31OXnPXNdUJcdTAwMDO5XHUwMDAyw1nud3BcdTAwMDHRrje5XHUwMDAwcoWGuSXEh1x1MDAwN4jgMCzxrz8hXHUwMDE3eWtjdmjjXHUwMDFjXHUwMDFhwJin/SPDXHUwMDAzjClIs1x1MDAwMFI0zlxmLdTsn33d23L/6Ze9lPjH73vlXHUwMDBifFx1MDAxN5VHX9/4XHUwMDFlb2XJUeE+ptmIuvCYtVx1MDAxM+zt+7FcdTAwMDfRXHKAXHJHXHUwMDE2Uy/KlEmMXHUwMDFjI19iiFOwXHUwMDAzqyPvZU5/gM9cdTAwMDeCz/KbwVx1MDAwN2BI45HfTt8t9kek8i30QT4ng+Dnw0nJkCT8Kj/kXHUwMDA39vy+s99cdPb822/L/tmtqlWLtvmzZP58icOOf62Z/+Pw8Fx1MDAxOMIwXHUwMDBmgvqQXHUwMDA2f1x1MDAxNOj358JcdTAwMWZVXHUwMDAw+YJ5uH5aXHUwMDBiMqmKJ0dXxl+ZZEdi626Wi1x1MDAwN7dcdTAwMDP9+Fx1MDAxZp+/+n97blx1MDAxM1wicYm3vLHssLlcdTAwMTKVXHUwMDFjeuirzVHaROgnafgnz1x03Fx1MDAwZf1fOLnONFx1MDAxY57hXHUwMDFjXHUwMDFk+X4qVzekT1tcdTAwMWMnxtRsKcmbUGZcdTAwMDK7azeZvrGJxFCj3CA6K4xOhqnSOHXkV7ZpV25cXF9cdTAwMDSF9pzSd7eWJ2xO9GlcdTAwMGLT0jZr3i5PQlx1MDAxYbnrQJZymO/iVTqX5jJhcYedUsy7birLaVx1MDAxNMtHvrrpN3zirJWCyib7XHUwMDBiNVx09XVbXHUwMDFi22suXHUwMDE2XHUwMDEzw1x1MDAwZSZ7asSyk1x1MDAwMkxyZyNuQIKtjpPZYb69wsxZ4WWm4DNcdTAwMDPGbpuldYCHJ8Gr4nxJulZgO5vr6ezGXFzjLOpcdTAwMWWcT2uppE+nuDp5OZ03tdRNqvm5nt9SxmBcctJcdTAwMGZN9Vx1MDAwNtnLhTZFUt6eWu/kXHUwMDA2bmK56qI7W+zyNDyF3m6felx1MDAxNo9L7ppsXFyCPM1Xt+JyOVx1MDAxY8KN4Hb1dsZcdTAwMWZC1pFMmrhsJ3zthixjMeymZSXvYFx1MDAxM1eNzlx1MDAxN6StXHUwMDFj20VcdTAwMDM8M6xdwE6zfrM1LYLTXFy3YNjJeVx1MDAxZjr4rT2r7JapeUfJz37KdeIx6Vx1MDAxOX1cdTAwMTKXR9WXwi5cIudwLjKmTGBW1bpL3aTcvCbJrHGBXHUwMDAyOTw4OFx1MDAwMuGKVbqcLkfQPGjR5MZXx4WIiUnYiluNcKw05cj5rZBcdGp0XGJcdTAwMDBcdTAwMWRcdTAwMWPA1sxLV49cdFx1MDAwZauuwaE9jPwqPLFcdTAwMTSdTuJqqlx1MDAxY9dlaVx1MDAxZFrmjNlo52uOS6bUXHUwMDE5SSqWUb3GTqL9mteXtT6fXHUwMDAzf99wSC7W166nTsEqY6ZpiJd1XHUwMDBmQ7xyQcRDajS5XHUwMDFjXGLTbVx1MDAwNX9cdTAwMTLIXHUwMDA2dYnVWTSf32ZhdqOa695cci/5XFzOyPZcdTAwMThzmLzKy53ET1Pvam3Oo9v1XHUwMDE0256eY+6ti9UsTuwgW1x1MDAwN46N6ytcdTAwMTZcdTAwMGI70khSalx1MDAxM65guC5GZsTqtXc95Y5yakTuZiZ0aGeVy05NemRcdTAwMWWt7uxKwV7lwGKXNI7jXXCzIZY+O7e3t8SsR9spXHUwMDFkMFx1MDAxN72TlrdkhI1cdTAwMTa0zWSiX8+vaYVvSGA0orXk1atcdTAwMTnDi3bzscy4+lx1MDAxOVxiXHUwMDEyvNq7rkJ1+XqfXo9hfaLPiVVuTN+j9XxcdTAwMWTOlTOebW554bVnwrtiXHUwMDFiMTKN287W/UmRnSS9Y1x1MDAwNX2720pkUlx1MDAxNOdccmXizc0lvXlcdTAwMDO1ypanydRsLWEq9/DgJJONl8PZKKPkZivr65S9yHHvU+jjpSzS6Eptn1wiXHUwMDE1XHUwMDBlXHUwMDEzkoLkQopJr2uw0OaZbVx1MDAxNIE9XHUwMDFkxWd8akhgzWviau9Oclx1MDAwNDuRZG5cdTAwMWRxLa2gXk+Ph/WaXG5cdTAwMWLMm5bRfFx0d3u7SNYmXHUwMDEzbpE8b4ldoNJRfzSMuvYyXHUwMDFl3bdcdPDznFDw08zLg4V3uFlnXCK2+9GM70SlxsHZWTZ7YzWiXHSsm3SWtOd0jtuMypY/Os3tXHUwMDEy7PvD6TxxqLU72ck+cyBcdTAwMDHu7Vx0ekFoa7twOb7rXHUwMDFiOjRcdTAwMGXmsUqBJ0/5w46lSKfgNUbuXHUwMDEz3yu2fSZphk5sjyDbb+XVZrTSOJZSNvlcIvL23U2d96yFUWLvtFx1MDAwME9ati101+VPlWHAYq/sNcBpi2lcdTAwMGad9ljY8o1cZvnGXvuHJJzNJFJbu8TC3IRMMIKVXHUwMDE0WVx1MDAxY7alXFxQUbdwcjhTu5WjXFx41ZFGl4BcZuvl6rrKiEPsbCRuXTDUKFxiblRqSV1cdTAwMDHKLj6AUTRjwnRGKlx1MDAxYraQbVwibHLbkCxxN9lhXHUwMDFlXHQpnj3kZ8TZXHUwMDFjfHtJ1H7OtqZkmVx1MDAwN1x1MDAwMsOYZdS56jSxeM5cdTAwMTYzdpSMYso3trqx2C+JtnY8XGaI3Vx1MDAxOcNP/Vx1MDAxZZtUq1BdXHUwMDBigiqKYJtcdTAwMTclbSQ9scNLI8Xj1dLgXHJtqlx1MDAxMlGnklx1MDAwNjPvI95cdTAwMTfE2840r5TfbEuoXHUwMDE2wmZcdTAwMGal84HpXGJnOnL8vaZcdTAwMWVcdTAwMDFcdTAwMTPc8NOpnV+CjVx1MDAxYelcdTAwMTGBj47R5DDSOD5cdTAwMGVcdTAwMGb4dT9hLU41XHUwMDE2yaR1XHUwMDAysooqgl8sd7meKDhcdTAwMWRO9mpiXHUwMDFlXHUwMDFiPp2dwio7s+HFmVx1MDAxNJa7k457gTyTpnFmNqetjjF61F+by1x1MDAwMsNHeILuSVx1MDAwMPhcdOVW21x1MDAxM37NppxSyq3YXuOtWi+m3N5KXHTTv1x1MDAxNTtFN1x1MDAxN1x1MDAxNyxwjXVU7ldunpaAMFxiM7Jccp+ZXbeEXHUwMDA0OnLXLGQjaSxcdTAwMGLZg9OqQ3hgJOLBqYnJ3HPXdDPnlGy2XG5uXHUwMDBlmeviMr1Oj1x1MDAxN8yRJlx1MDAwYuPSwr50YdgnhL0jc5eLtlx1MDAwNsTaMJnhXHUwMDA3XHUwMDE3nKmug4aBLGjpw2B3NZdcdTAwMTOO7/Uzg++N+cHX7LmSrajDaDKHcjw53cx0525ked1cdTAwMWVcXLnhXHUwMDBmdivUjKJteKDkx1x1MDAxMVx1MDAxNLP1zidxTZqq01JcbqW5XHUwMDFmhdJZu04v/uKCXGbMdFxu6p3h2XPdcWBvXtqGXHUwMDA1mDizXHT3dIbi/Hxccrp+Uurdrfbml9owteAwN1x1MDAxNLo7XHUwMDFi6lx1MDAxYWdcdOZcdTAwMTJxKSaWuiTV29TLJ1x1MDAxMzy3XHUwMDE3V2e6M/frPoqbUuA6bcXPdJ5ac8dccuZcdTAwMWbxnVx1MDAxYlx1MDAwMamwbZlVTlx1MDAxYp31XHUwMDBlNa5baexcdTAwMTXamlx1MDAxMjTSijS9ZbfscZ3RkpklcFx1MDAxNFx1MDAxY1x1MDAxYVuVj+vbKGC28jY5VlTHXHUwMDA0x1xi81xcc+3P99hOtuLThlx1MDAwM/1KUruc5Fx1MDAwM1pPMvmsrlx1MDAxNdBcdTAwMTW3tVx1MDAwNKyG5/3pLpW0W0Ms8jU5YaI2l0RbUJVcdNFSYbBhjKTaJn1Hke3ihLttscX3tnJcdTAwMDajkiO4jEnl0MtuXHUwMDBlwVD+RmM4Re6IokmWyt6+eE7On1x1MDAwZlxuXHUwMDE0w0m3j/mSk9TGU3ptKuKTglx1MDAxOfmbRIZrXd8t9GtyXHUwMDFjsXubvVx1MDAxMLe6x6z0fDymZVx1MDAxNzTRWVx1MDAxNdWzo1x1MDAxM1x1MDAwZVx1MDAxOI2udspfrsrKj6jRSrf2XHUwMDE5WOxVm1+wO9yYVCUrXHUwMDAypT9cdTAwMDHq7J3XMVksXHUwMDE0wJ5raVx1MDAwMZGobaddx8WLw4GmXHUwMDAx3KydqulcdTAwMWFd8HHPdsS0UfGUV5OJSHRcdTAwMWLemi2OlrHn187s2rSKnipb0jFcdTAwMDKj2ZdR5Ik7e1x1MDAxOVVcdTAwMDdtt9xZQFx1MDAxMaJcdTAwMDUzutShhO/yXHUwMDA1a4PNNZ2A3XQ0ueFBXHUwMDEza3R4kaGrzWdcdTAwMTferFx02T675Ibj5no7b4IoPcpxwVx0O1XT0mXqxJK3qPbXdi5NXCI73+pFXHUwMDExKVLBMEjlksJcYjlcXFNoLruO2lx1MDAwM6GxMlx1MDAxZHhYLJQstOer3l9Lx7nStEmIJUasc0JcdTAwMDBEXHUwMDA1IaNhiLx2TGRdNLuIl0lbQneK32hmcPTsaWckXHUwMDEzXHUwMDE5g47aYUJDX1vPnZlNQvbn/VnhSmFyns4zsrrV7vSwzFfrkVwi7HDOiMKr2JOrUbRD7NY/XHUwMDFlar+hXGI/X4r01LvUV2FrrZ0pxog5uVGWzW2e30q1drZzoi0p50J6XHLR7KtIT+SYOVx1MDAxZSOu8lxuq1x1MDAxMyWl7Vx1MDAwM4d24pZcdTAwMTI3hirHXj61uZi37bk82kdKeWpcdTAwMTWoJXpDVfvcwMHFV/WJwIlcdTAwMTHnkFx1MDAxOXZcdTAwMGVBykHJXHUwMDA00UlcctQty4FDvSlcdTAwMTZVJ7dae3Iu6VxiXHUwMDEzw+Q0mWFcdTAwMTgn51Fh3Fx1MDAxYZbXinV7THbmMaSMgI6volxchItjYymYd8bpU3d1dVssuZDzzN3qdNBHWuScXdX2qnmzroWrhjaMceOj4s5H8yu2tMmkv7Uuq+rWZTNZ6YiEbG8sPtpcdTAwMDTZlZPmcUfTo1x1MDAwMnLiZXJmqcmEOHaYsYy03XxGW+ZRodrLYVK0OsuSt45cXOjdXHUwMDFjYP1hcl1cdTAwMWatllhkqzgka51W2UkqKLM5Ylx1MDAxY6tcdTAwMWKu+jOkLHstZ6VcZpdcdTAwMTbyMVxy6lxyyanKWjNcdTAwMWRcdTAwMTKb3lx1MDAwMn6bTZf2JOOqebtvXHUwMDFhtaNcdTAwMTab9KSLXHUwMDE3YSaMzsT6WLJBvEOK7Yz4+S7Zt5pcdTAwMDU5PlWlfGZcdTAwMDTFrjtp0vJ8uvAzXHUwMDE5rdTtPfVA7uUsRvYucPqc66r5qlx1MDAwMF6IXHUwMDEzZ0OBplx1MDAxZqpcdTAwMWMpIPqxXHUwMDEwTZuAXHUwMDFhXHUwMDBmmVx0TOy8rpexJcnB+YpcdTAwMDBcdTAwMTVmXpBDw7Kk+cLa8cumPE/5tXjcmJ2RX1x1MDAxYtI+lu406Vx1MDAxNVeRlkpsO61vK8omXHUwMDEzXHUwMDFibtqLxrU54zVxtSGbzlx1MDAxObHaXHUwMDE0XHUwMDE5vFx1MDAxZFxybTvle21OedNYLFx1MDAwNY1SV9JN57U+vVqnPej23CnCTlx1MDAwYtJa70NcdTAwMGV5KJKJ1P1UyYotXHUwMDE0t5bxsmy+KkvhwvGg8FmnUSyVXlx1MDAxOE5cdTAwMTdr/o1XY2UhpKyEXHUwMDFjtFxch7xcdTAwMDCqKb7abXc0p/lcdTAwMGJ9I5WZ4DL8XHUwMDBlX545g6tyYi/svM1K7lx1MDAxYjvzq2YlpbS3XHUwMDE0q/2Cclx1MDAxMCe7XSGcKLtcYi8tcr/lXHUwMDEzktOs827BaVx1MDAwMrMmt/ZhXCJOXHRcdTAwMDPYllx1MDAxZvEsXHUwMDE3r0ZaXHUwMDFjVdVkbu8rnlx1MDAwYjfoPlxckJFKXHUwMDEwgrDOcZVE+kbmMNygr9V2XtN5Vbozqs9SYU069DG+zdaRN+uZfilcdTAwMTJpLCNcdTAwMDVZniVF6jZcdTAwMDRWrZaS1kentJxSguxcbrauRjySXFxzXHUwMDA3ZlBQT7W+4/HCXHUwMDEw9WBjjzq92yqj6tBcdTAwMWPwdZ70I/VcdTAwMDS0OJBcbovsuEb28IWV5mzh+5y92jZcbudPXHUwMDAz0Z3PsmzPZpvdykaX6HPwSpbH42x1oK8m1olcdTAwMWJOQJRkXHUwMDFhI5jbOHNayFx1MDAwZYkgXHUwMDAwRerbTdyol+1oyjj7KL1yx3O0mrQj3987PKbcvNSNeXxcdTAwMWaeRtVOkiZcclx1MDAxM5xO/UicU1x1MDAwYoqxr47brfmV5LpZVeptpkRkqS23NTfbjtz5NKWM9SVqXFx9XG7008KbJTNcdTAwMTJcdTAwMWVcdTAwMTL1qomig41C71x1MDAxNPqb+azeXHUwMDFkTizCKlxy81xyQTouXHUwMDA0Klx1MDAxOc379lxmdblSj9o62OyQzY2P+Vx1MDAwNK0/a2/oMVx1MDAxMczcytv9xHB1I56GSZ+CQkr7lFlIx5VcdTAwMTPeeqv0Z5Od73eyt+dvdbvyJIZMyOvZcHJTUCf8XlnqiebSVrMrrdLlppyPODMzSiNLXHT3XHUwMDE3jJYzXHUwMDFhp6loXHUwMDE5Xnub626M7bbspnRcbnTb1Fx1MDAxYmYv5MhcdTAwMTP6m7qlhFFJe1dcdTAwMDWOcGu5XHUwMDBmqminMtFBU6gsmENFa1xyaWFya2FcdTAwMDMkbdGHJFS6QNnM8+riVNhkwmDWfLU/XHUwMDA2TNFtN6vrxuZ4XHUwMDE5Qm964iZZ1IXtzYqmdlx1MDAxMVx1MDAxOZ5iVepmK1bhtSonh1x0Y6pbo1im6aya2LxkMKZWZ2BZXHUwMDA2l8xMV7Rb4UvzpO1cclNfljBZkox201x1MDAxMpVUXHUwMDA1XHUwMDBl81fGlj5kkysl40Iv8yNC4mN835xXzM7XlaNUZFK87L1OqNrL/iTUlrxcdTAwMTRSdzHVL8yaam67XHUwMDEx4pRcdTAwMWEjNtJSrSckWTaTdVx1MDAwN/bntNLmKa5cIlx1MDAwNOA7bsf5+DL0Vyk7j6vTabZcXKQ3Z1x1MDAxYbVcdTAwMWJXNYsrNtq6i7RKo1x1MDAwNC5hs1LMrKbwXHUwMDEzXHJcdTAwMDMl3XK8IMFdmEexb180rl1cdTAwMTWKXHUwMDFlzumkNfCQP1x1MDAxNrf50pozXHUwMDExsbnutcJcdTAwMWbBVbDddpelgu2zQ7eW9naVM7M03irYSlx1MDAxN7b7tVxudT2jtUlIa7NiXHUwMDFiXHUwMDEzwik9dNOAvOqrq2DJpECxl8WVbo5zISqXdLhlllNmXuG7s3tDm7HnYTs57tzs0mYtb23kbevZeF1cdTAwMWNx0bZk5TJcdHaXTlx1MDAwZnzkcpdge+a6g1nf5jdcdTAwMWa0oSlEne+0dnyy3DaRhJY9wjne+DP2kDk9ez6h1/mtoO5cZqmMPFBeltxcdTAwMTFKXGawqX5a7tWVo7YsM8d2e3NG6TZcdTAwMWSc53CdwjlcdTAwMDC4korQOi6M5abnQ3vvzKj5NlxuXHUwMDE2VZyh3yzSzWHUT1x1MDAwZcxi1G1cIrQ/0UNsbLbcUFKdzqIo+s//fJLVrcPPsWJcbicgXHUwMDE4xiw+SVx1MDAwZVxmkdFl2NZxeHl2cjVOsiT5NFx1MDAxZPL+XHUwMDEzXHUwMDA2vzSO+OVHXHUwMDE3fn1cdTAwMWNxbaG/pthvccSbXHUwMDFiSPW9OKI63M9PccTGsUJsJjnbSc6YXHUwMDE3XHJX5SxcdHOa3lx1MDAxNy2QZ1ZWW9PZqkzXs1xycoo0ReakLb/cSILk4Fx1MDAxMi+tVrM0lbkoPVmiQEY7WyYqOqz3/WhxVixwSVx1MDAwZWuWPuRcdTAwMTd/q3vsSCrOzCl3q5uhXHUwMDA2t/ZcXIdcZkFtXHUwMDE56nKuT1x1MDAxNSO4O/1cboW0qJj+sF+HV25WKEvO3uxcXD5Y5nCWTG1ekXyOu3Cn0lRGkahxTCRgfMNcdTAwMTG5KCj9MtKzs8VPIzVKXHUwMDE3cpPRm01M+nIpVjs+6kR9LXG6szmRXHUwMDFhXHUwMDFkOFx1MDAwMVHfpoJSS1tJ6eUlXHUwMDBmp1GDcfapwWXktpazVDI1XHUwMDAzObq3+FxigvlofeVW+Vx1MDAwNSruWYlcdTAwMGX7vONcIjfVarBfhNeF0SnQIDlcdTAwMTP92nXGhGogXHUwMDFluKBvt4f6krdTb4RVzFx1MDAwMpPWhS1FJufFXHUwMDEzTdNcdTAwMTdkTS+2XHUwMDE5pXpcdTAwMWUyzaHoc1x1MDAwMteGXHIh+anKX7idRjNcdTAwMTeyKXVcZlx1MDAxY/T8XGKQNTIlbcZbfFLNMX1FNFNqPrVcbiHrXHUwMDEydZbfXGauXHUwMDE0LyqzXHUwMDFmtaPaddmOXHUwMDBlwnozKddHneB07opcdTAwMTeI4Ug3b9rWVmLrfVx1MDAwZVx1MDAxNyS/ueJZe9npyJyItX/k/U182lx1MDAxMvmJNUYmr804jW8rXHUwMDE3m87BxVxu+XVkdld7qS1cdTAwMTmsXGZXtLhATuntXCJBhtnSS+oyOpYyQPSm5VfAuYa9tjdBethtm7O9Iafk8lx1MDAxMExcdTAwMWOimFxcrnN6VO6u81xcsXZ0WipAqpd+XHUwMDAwSFx1MDAwMWvkfS/GnVxu/HU4a/Z7XHUwMDEyuvrIXHUwMDE13MDIT57eVcdUMcpcdTAwMTPfXHUwMDFlXHUwMDA1XGaGJlwie0WAO1x1MDAxYsWS4Vx1MDAxNNO3S41J4p1cZuMuSuX5XHUwMDEydlx1MDAwZVx1MDAxZqH353zPXdyj0oPzVYxWnawx89XsdJVt/lx1MDAxMrt1saBmpubake5Vaeuh+7uz/EtcdTAwMDGvhjhpyosw7YVcdTAwMWJcdTAwMTdcdTAwMWODLVTrXjxCdb5cdTAwMTFHpYFcdTAwMWLcTVx1MDAxNNdcdTAwMGJLUOXF/qKD47pcdTAwMGKsJSxcdTAwMTGLMvIlPFrHQj4tN8rVye3Mnq6nZXGsUtJy9Ca8jbhFXHUwMDE0dnZcdTAwMWNcdTAwMTj2TOtcdFx1MDAxYyrTXHUwMDExw0xOrVx1MDAwZZKpKFq6q1XczlrqQlwilbdbfoiueHnNl71V94ujttCP6aybadix3l+5ZZTsKcYvklHjXHUwMDE5XHUwMDE3Kt1cdTAwMTd0yeq6fptZ/UYwr1l0Zlx1MDAwZvssuopcdTAwMGJrzbHlwk5cXM/x/flIILmc8ddwWUtd05HVNl5RIOb6XHLXiepaiHRX0JtcdTAwMWM0wM5DTEDE6YT1TXJcdTAwMTV5fkRtKkoqRVx1MDAwZVO03UosReRCudhIb8R5e1x1MDAxNUmxX62CfTDptEvu4W3g0Vx1MDAxN62IykOrKc5N1FxcIStcdTAwMTX7XHUwMDA2fNBEuk2d/E1V78JFN+mZpuu6utBcdTAwMTcwXHUwMDExb5W+a1J7XHUwMDBmXHUwMDBiri9nIFprVeZbuidyOjK7VGywXHUwMDFhIIGAz1x1MDAxYfLip3vzME3lemYn1GFKtUxcZie8wq9CVvB6ISlcdTAwMDP9QNzSLvZLc6/NXHUwMDA1vZSAqyv5XHUwMDE2NjOZTlx1MDAxNric791d7nK03Z6vXtPtj2vlYiuRXHUwMDE3uZi0sKpccr3HLlx1MDAwN4JWXGJfXHUwMDA08+IsaFdum1xiUZ2WwWYmXttst9NvO52j8dhCKnBls33gXHUwMDE3MKexOdZcdTAwMWXbI6eEK9h7cnrKXHUwMDEwx997/m7Hn2eROt2j91x1MDAxNqCIVjRhr7VYMenjZDrLtayigSnvLlIgXHUwMDA20n6lujy1jNVtwF/P25tyitamtlx1MDAxMJR82erKivdcdTAwMTmsopq5V4rCTexkVeuFfWl0YmU7XHUwMDFl4HZcdTAwMDKhXHUwMDE3RmxYhnRjspVzkqhVZJpcdTAwMWHPXHUwMDFmjlx1MDAwZT+NpyZn6IVmrdRdqI6E69mVbc/0l3NcdTAwMGVXxbNcdTAwMWRt42H7VbjLObiJPVxcS5pMc26lcVlMLaV0zzTSZVx1MDAxN9tcdTAwMGL81do3MDzM1eXBzM1cdTAwMGWP1Cu2R/ut7FWR66l8Y1x1MDAwMZentZ6j1EVcdTAwMGVMt+Jm+ZpcdTAwMTZPl/ik9JfNNqA3uWzlsqGdJVx1MDAwZjdcYlx1MDAwM/FKQa9cdTAwMTUmnODXeVx1MDAwMoJoMW3X+c3rm5DsXHUwMDA1YkayXHIwj/quPObqVuevbYHh0Y5SdUVfRFx1MDAwNHRIPuVu9qIzlbm7hJwwOzKL5bw5dvNcblx1MDAxOVx1MDAxMUHVL1Voc2mTn2dcdTAwMTRRTzx0l/W5QlxilrJcdTAwMTKy+tDelimm+9LUlTdCP4ViwMPkvICCKeN1s5dPV1x1MDAwZsjdZpVGgOAuvMZcdTAwMWKdgG3zhSNcdTAwMTla2F6XxOrajzimb5XdUcP4jlx0u1x1MDAwM1x1MDAxN15dfWXNQv6s0LJpbDGCOFxiXT7J/Evaxmpt8Fx1MDAwYu3YSdhcIl4x6T7vXHUwMDE3ejWqzlx1MDAwN1a7zad9JVx1MDAxZktup6hHXHUwMDA162zNTdiQW9L+Wbzx3r7fLnpcdTAwMGZcdTAwMTHhyrJ29WaD4T4/SU6cvr1Uc7D2xK5cdTAwMGLJLtnXolxcKErsR5tIuvm5amPTXUUoO2lHpqa6iVxmLW2zwKLOfuye8ivualfB63golFxcn66zc3dU+PZak5NcXNdzkUd4ZVx1MDAxYzUk8lxiNzP/aFRS3UlcdTAwMWRXbsNDolx1MDAxMPlCOG021YJMb6K3saws4Woy6fNcdTAwMDP6nE7EN5e8iF1cdTAwMTKcXHUwMDEyuURrsqL9bpFX2lImlWi03k3M3Vx1MDAxY1x1MDAwYtykPteaS4lTbOdcdTAwMTSeWe35eVPEtC7oR+B3lrDBryGOXHUwMDBiI2Wvz3ZcdTAwMWFHYjdMnvFcbjxcbmdCXHUwMDAw+HHEXG7hXHUwMDAxrKbFicNcdTAwMDTKX1aedls4RXCWNo2khyc/pSa6T0xYw+2jblx1MDAxYmFcIrueWptUvlx1MDAxZM1opfBcdTAwMDeHv+ZX4rix1oU1dVx1MDAxMlx1MDAwNff2mba/bM6rXHUwMDE2nD18tzpUgD7X5eLoq7G3SZGrelKiYDfPc2zCXHUwMDA3/FS3lzdpp5nzST26LavY7phVdT43XHUwMDFh4YUnfXpa2TgxPUgrjFTktFxik6SNtKqhYoSTQtbg+VxmT/lcdTAwMGLdXHUwMDFkXHUwMDBiS+qnW7VcZjdlJCE4XVxcXHUwMDFj89xcdTAwMWKRs7akg3upr1x1MDAxM1xm65VNXHUwMDE0LCNxsTQwR/JgykVcdTAwMTOspMy+PVx1MDAwNOnlulxy6uOJm61N6jaRJvZ2q9iXm1JXU2Bvllx1MDAxNd3j63l9nlx1MDAwYilxyTzJ0pqBM8jC5JRcdIa6cILJxK7mTnTWSHN1dIp22kpcdTAwMDKJ1pSWYeCn+fYsmodUa6W1NWsz0EbdyU09c2tUc4/FjCnN3tpcdTAwMWGbRiFj0Vx1MDAxOd2c1iBcdTAwMDLO4rJcdTAwMTajVvJW0NtPuFKflFaMvFx1MDAwM/pcdTAwMWE1Wcqg7Vx1MDAwNmhcdTAwMWYmmr7E51vCRZZjNFlcYkaPs5jqJ5ErYmK9nGOgz7Ht6HLERy6vXHUwMDA0sEY0kGpcdTAwMGZbY3lcdTAwMWHxJ3xxc6J5afdcdTAwMTdpqnRrdr/pPVslrMUyKnlb2Cc5XGJ5kztllYSwPaovq5w5XGKn8+p6XHUwMDE4bW7AXHUwMDEy3JFzNEJ8eelol7nk9k1cdTAwMWGlvdpfpZlcdTAwMTNcYldcdTAwMTD2+bZcdTAwMTFNulFTLcSD+TQ/pVPZ01x1MDAxYt+mj1x1MDAwYnZblVLAXHUwMDFj6tWVMK95ISTkdLmL9oJ8W1x1MDAwNZdcbvmPxkhYsJvlkXHbrbjchVuqlYzEXCKKLXvaVcqWsLjdjUc3XHUwMDBl3Vpx2SMsP2DkbN7FyjnTkb/ubnFVi/ujX0q15uxbrjpa1zxLovBkI3eqr1UgqtbZVfWJI7elZMiTLd7Wt5BGtu1cdTAwMDBcXFLIqiWPnVx1MDAxM32x5nxnVVFcbjHZuqtcdTAwMWHr62MqllbtiilPZzFcdTAwMTFyN+6EqNZcZjojOU26yjv2y5GG4OvUrmbOcZvgS/Ew9+pcdTAwMTFcdTAwMWRMJe/Q75bHXVbKXHUwMDE2v1winFx1MDAwMq3sZFx1MDAwYoqcLG9QVoitPL/sjsTSr/csR0qjXHUwMDEzpnSzc57wlWmdlrwge0uoX9pKvESIICewXHUwMDFlXVx1MDAxNkHQUlx1MDAxYeD3SWGAiZNcbo6741lsxFxcqmvMWSRaq4ZurGNcdTAwMTXqjVSjiKb4XHUwMDAz06DPWbe2Mlx1MDAwYoNy1N0pcln+pkCdKZYnTttytGgp3XGDXHUwMDE5RJN384Oyjlx1MDAxN8dQx9Y641xuKvTtRcn7c3BzdpRBY6fGXHUwMDE2yi1B91mCSK/S5Vxc5EjSmjyq3eVcdTAwMTgpjbJvbNVq91hNLUVccqRJYjf+puVMRDlujZw5XHUwMDFkQ+zPOoKG5ELsXHUwMDFlfq/NdtLOnLhcYlx1MDAwZXKKns1Dn1xiiYzCJ+4psTNabaiiJ7xYXHUwMDE041x1MDAxYn00XHUwMDAyao2ocYc+jnxcdEGu11xmXHUwMDE3dpZG4jdHZkeGstNcdTAwMWEvMYWDRO2yLownRlaYalifJ1x1MDAwN3lcco2IXHUwMDE211xud9xiprqHlrU2j2RcdTAwMWTv1oWzSolkuVx1MDAxNddcdTAwMWE5hfQ6UPYmI7LddbTQZVx1MDAwMlx1MDAwZkya3u35eJapyFNCnCVWLHUk5al0vbVcZm46XHUwMDE5nshJrG3ZNlx1MDAwZZnadnpcdTAwMTPo/aVcXK75I1x1MDAxYrImXpNwj6iNXHUwMDFmcrSEcNFYuFx1MDAxNlx1MDAwN5KZruzb3ltoWUCixWSAXHK0XG7ryIMuz1x1MDAwZtCSu4nijfyrtHCji3WM/KbHiLND++Vop/nrmDhnvV7ut+GatCmsXHUwMDE5lcuMj4lmbrT7yVWd59ZcdTAwMTI3utRAOtLiZNnRXGJ7tpZQTuzTVc85am5XXHUwMDA1h+z/7ZbqiaoseYmuJYDchdK+cFx1MDAxMmeaclx1MDAxNFxcy+nWv3bnfn4zz1ximDv+zO5ZXHUwMDEzTPqSXHUwMDEwR1x1MDAwNoR8qtqt0Vx1MDAwNZxcdTAwMDH3c1x1MDAxMmi2Tc32+UKWZuat4IWpXHUwMDE0myCZyFx1MDAxMphLXHUwMDExtdN6zFx1MDAxNv0g4ZCcVu66TOrYkaPbtFOESc1sq5RccidcdTAwMWXMp7LEZLRHNmSQndNcdTAwMTSWKVx1MDAxMMsg/XTvW3o/b/SFeVIp5FEx9ZK6sZc46TpfLlx1MDAwZf4sb1tCNK3zgVx1MDAxMuX1enqrSFx1MDAxOZqHpKq02bG3s4ls+sZ8XHUwMDAxXG7mIDdd38i1c9hcdTAwMWbw/pqdWlu4jlx1MDAxMCkwSGZy+yQjM8AmkeL0JZPsrlx1MDAwYmK/gP65Q3q1tohcdTAwMDCwfXPchFx1MDAxMcnNsTkxJ1x1MDAxNvjxfFm09kLZ6T0x54yjUFVcdLg1PMtB/Ty7XHUwMDFkR8V8xSdRXHUwMDFjUcKNOWAz2WRxXHUwMDE1ztZ1te6dYrRIkHVdib5iXHUwMDFkbcxcdTAwMTP3td3Ji+lu3kiL2WpcdTAwMTWDbqkp07SXnMjhobygbLrUu8vqknXeNNE4XHUwMDBl+ZNcYmcsnLvWilxmMsyX1qHHizROms0kWbZT2aSL9axYsVx1MDAwN6+uIVTm5t4xbVx1MDAwZtZyvGpcdTAwMWN2muxmXHUwMDA0iWlcdTAwMTO+UW1djMFG3Ox3xCRQR2JcdTAwMTbFbHLZ+i7uWIx17lx1MDAxNse0PivTJoFTSSbY8Nim01x1MDAwNvmcXHUwMDFjtjYtLlVudbcor8ZRtFx1MDAwMzJpmG3bbJfQ5vym9leWNFIvvXnU5lx1MDAwNLFxk3PniqZcdCm6br1Jte8jNSWnXGIvsaKfhTNcdTAwMTg0nbXen+NcdTAwMTGFXHUwMDFk7NGlb1x1MDAwZbV5m1x1MDAxZq7IXHUwMDA27YWUj52W2FBTnMlcdTAwMDU+U1x1MDAxMb/gc4nxj1x1MDAxY63O7XZE6Mphhen5XG6ZxVxmX5JJ3YlHlWdIxnDstXjpPFFcdTAwMTJL5L6dKipo4HrH726b40hhnIxp6yjeblx1MDAxNInMtW6bnmy1O205XVx1MDAwN7EmiPC8Mlx1MDAwYpEvQ2+3c3nkm6tOwG1UZO+M1rJHquDrKTbzws2NrKe7XHJFXs6WNTsz7aqvmLZcdTAwMWPlXHUwMDEzIdeixrpiS8TbreJqKuJkfTw6Sm2uy1x1MDAxNPk1xY1hTVx1MDAxYut0K01ncN33i7hcXK31o5iNdtPEuXaI6vr7JFXky1LTOXfgn1xinbJcdTAwMWNxeEHc0rvtrUBcdTAwMWPgqFx1MDAxZjz7nJ3Pxi3kN4284eaXkqvWXFzQL5GDcFx1MDAwZbZcdTAwMTlGaus43tNcXFx1MDAxNp084apf4pm1XHUwMDAzsYjEaY2taK6RicmZXVfJqV/NJUXZ9NPWiFx1MDAxNFxyX2F8XHUwMDA2PX1K6Kv4uL2OkqqAjFx1MDAxNnC0XHUwMDE1XHUwMDE4KW1g15TZcKQ8xP0gVu710vA8Uu3EoEisXHUwMDFhn23DXHUwMDFh58qTdumH2MYuN6JsN1x1MDAwN7O1XHUwMDE2xldwLZdgXCLhMXZYLm5VuG38NcnPQKHSlnFeXHUwMDEwh42EXFxcYlxckVx1MDAxMCG4WdyMT2IqO2G4NlnXubOh8yCGTiyaoKuXx6VTRlx1MDAwN21jLtRekiZpzbPEaC1cdTAwMGKkfrvss3JmXHUwMDBifOwn68g7TnmiUke8XHUwMDFlmf5ptKCNNSUvNqlrXHUwMDE0XHUwMDA3jOr0ySrdhFx1MDAxY0WoJ9zGVsa5pFxmXG4oJ2TQ9WJcbvvF5uQ4gOUk77Ra3cyZtzPm1FxuXHUwMDAywpF0UKwqeXNcdTAwMTIml1FncGKgLZ3eXz34cCNds93N2eKWu4y7YsiN26q32r3MWm65sfbb6lxuXHUwMDE12rxt8axOsnm2riaeYyBcdTAwMDJOWGFdXCJk2ymLRaEuIyD3ikhOJT5cdTAwMDXllOlkoXfTM3Oiz6fbaFIo22BR+YsqrPdXfFFcdTAwMDVzhlx1MDAxM+vzOidqflx1MDAwNdaA3JXhPOGNXdsoolx1MDAxMs649pDHRdZQXHUwMDEy5eyUxM3pm2GPfF5T9+j65NjeksTk2tGTiye2XHUwMDEzk1VijltdnMLRmvjmL1x1MDAxNlx1MDAxYbXmOJmLpkc20ndSaZLe4jyJbCBAsVxcuIeDu1etXCKVrM2lklxc5IMgP1x1MDAxZlNcYkdcdTAwMTc3S2N3I6O8rc+RdvHKk2pelUXYTH2nW1+jc8/d9JFoXHUwMDBiXHR/ITn1yFxuv/E1Ok5W7cra+f0k7a5nu1WCXHUwMDFk4E0y5agzXHUwMDE4iSTGXaNcdTAwMTXk1lxcgu9cdTAwMWFcdTAwMWFMXHUwMDEx3qCbJVr71ekmlr2ErVdcdTAwMTWNwylcdTAwMDY6/lx1MDAwMOTNeTJZZFucokqS6kVnXHUwMDEzSKJKi6FcdTAwMTAoN9Xqr6JcdTAwMDBpejPFXG56inE+zlx1MDAxMXQ76zWqMlwinCc5pttHPrG5qtJcdTAwMGVeL1x1MDAxYp9rMU9dxHWNz6lcdTAwMTNcdTAwMTNcdTAwMTIsXHUwMDA0O1x1MDAxOKxbM1GF6frCaFx1MDAxYe/hJNbhkVx1MDAwNGVs7fg5XHUwMDFmOKtuO6WzXHUwMDExXHUwMDE3jar9er7HXHUwMDAzw1x1MDAwZdbcru/FLt6L2jJ3XHUwMDE1wWzsatG1Wlx1MDAxObRkfLxcdTAwMDCKTdXEuZxikVxiVULctKP1pPNcdTAwMDR2vzRcYlxcLWXdXCJcdTAwMTCL947qLGe6xDpcdTAwMDTlTUvWnFx1MDAxYVx1MDAxZFx0acpcdTAwMWZcdTAwMTTnaCFzXHUwMDAyXG5PsYZ4XHUwMDE2P6+bnt9cdTAwMDPVd1x1MDAwYjYgWMfJUrpok3K1XCJE2YzokXXdXHUwMDA0XHUwMDE4YU8nrO63gbPxe7JrOKny7aKUKbngXHUwMDAyYebb1bT391x1MDAxMzWRbks5yrXFzE5afz6HXFy6Wy6NKmKas7RcdTAwMTN3t9vKsWzSWJurU1x1MDAxN/JdX2+KqFjU61XDpXzrWeF6uolLrFx1MDAwMbVcdTAwMTOFh4Nccmp2PerSo57GVd5cdTAwMDOtnKxcdTAwMGbkPMOzy/GgmpWcUFx1MDAxNmFGwsbtse3WY1XexqJcdTAwMWN5K7xcdTAwMTBcdTAwMDXbnais2UiDOrqyXHS7XHUwMDAxsuddt1x1MDAxNF4sTVbgrttJXHUwMDA2prhcdTAwMTG3pVx1MDAxZVx1MDAxNF2bJ315pVx1MDAwZfpcdHNcdTAwMWTQ+rqg3jaRvLamm5FIxeqkx0FcdTAwMTXLzkJcdTAwMDKLw87G91x1MDAxYoBR++NOnbVcdTAwMWWMu0OziCZrh+z4yWxcIorRaXOT62rp0Fx1MDAxZc/LizzyvNowcrNIljVrXbZaYqezXHUwMDFkyZtcYjgntbrivSTzW1+6dfV8dMV7fSqKPvBcdTAwMDSbJItZtzbsZTDa0U4xSbRsgttEiuyZT2fLqZYyV2nkMf1eTnpwPWKjs8xf+iVR7ya3K487eFx1MDAxYVx1MDAwNOJGXHUwMDFmTfVcYlv78EY0rZjMYuSLnk56XHUwMDEx7yOR6Zdcblx1MDAwNrf/n4i3WJdVaVx1MDAxYW4viFx1MDAwNm5N3K1werhcdTAwMTTuxdVcdTAwMWbm2u/3n2e1ZmNcdTAwMTVJklx1MDAxMTFG2lx1MDAxN2UumUF+MdbBT8E4XHUwMDE0elk9Qn2bQK+lXHUwMDBiQlnaXHUwMDAy0CooXHUwMDE1WVx1MDAxZFx1MDAxZr2vdG2RKy6+XHJoT6JiXHUwMDA0ZoKd3NKbz2s2XHUwMDAyvZFccs1cdTAwMWaxM82arCnyXHUwMDBmNjRcdTAwMDOoZaJcbvZcdTAwMTnrUcSBPVx1MDAxOdCIr8Q6i16QdEaOJ8J8zE9cdTAwMTJHTlx1MDAxYrKBXHUwMDA1vkGP2DDfTL1cIsv/uVx1MDAxY1xmXHUwMDFka1elXHUwMDFjb3bHeZBccka/LFxySNjvNMNjjan4SWqZnUJinlx1MDAxOWLYyUfUhppfcVx1MDAxMllKqsKe9sFcdTAwMTMhZVH/mUSs0Jpkx6KhjMCqNpvtKrVsKztcdTAwMDZJM9tR6lZ+KzdcdTAwMTR8ZU0mXHUwMDBiQn0+iFx1MDAxM9hjYeKgv1x1MDAxZZlUJpt/ffTlwlwixmnIoVsy2Ee2mGJcdTAwMWQpXHUwMDFhZdiQKlwim1xmXHUwMDA2+mHn51x1MDAxMj5k9Vx1MDAxM1x1MDAwM0d2fFx1MDAxYi7hhXBcdTAwMWbE9TptdVx1MDAxOEpcdTAwMWFsqYu/w1wiXG5xgUZcdTAwMWarSkijLYXInyMt60yihOmZjbCdXHUwMDE1IPF/89XOsqVQ1m6c6WVrXHUwMDFjsyBcdC7AMVbxz0WCnVxuRV7+4V+on/zyXHUwMDA2mozLelvvN1x1MDAwYn4tuVx1MDAwYkhkSFx1MDAxZdZxbId3XHUwMDBlneHNKlmSmD9IW6KrKKRmuFhZXHUwMDAzRYbnxqmpXHUwMDExc6Co2FxcZ59i+mFwZTh2MLFg/cSfN5V9Vyewalx1MDAxY6FcdL42T6PKwVx0vD++OEF3e2dcdTAwMWJt3i+HXCI6um6l3JanXHUwMDFkjfm1y0/205bka9xr7Fx1MDAxYlx1MDAwYvemXHUwMDAynnToXG4hr1HrxpRcckbaXHUwMDE1fHto1y6TrVxcS/Fm3Vx1MDAwNJU8idfxjHhcdTAwMTH6LqzbNNIxXTJKirnSPOxcdTAwMDZMXHUwMDE0XHUwMDE5XHUwMDBifFx1MDAxOVx1MDAxY5uWPIRE3WNV0qe56NNcdTAwMDHEp2hDQjQtdn5JXHUwMDEwvCXsSTZcdTAwMWE7Y+kmPeWLXHUwMDE3L8p/zEikdrPFU5ameLZcdTAwMWKI2dSDZKcnXHI5OFx1MDAwZlx1MDAxOfB64XZ3wjdcdTAwMTNWrqquZc7BP1x1MDAxNomHfqc5+/CtNKTodS66t1x1MDAxNriyjTJcdTAwMWWDK69UPG2KiG1cdTAwMTSNJrmf9LCP/EzexlrCxE2YnjpZblxy8er1XHUwMDFiXHUwMDA2VC3RZ1x1MDAwNunWPFR/c1s9045cdTAwMDWvyMPmXHUwMDFkQd1lLjeC0O9vdunFiCSzXHUwMDEzPmm33lx1MDAwM8ql+jhcdTAwMDaCzZ++hqTwzWVcdTAwMTgwXHUwMDE11pM8XHJCt8eiKHhcIqPTdVx1MDAxOdwzXHUwMDAxqY1EWTpK/SNBks9cdKJXR1x1MDAwMVpcdTAwMTDUbcwhwS9sIdWj34mjwahF0KR966aL/ypPse3jdlx1MDAxM1xiXHUwMDEz5GjsbXAzXHUwMDFmJ4VcdTAwMDIr4Y+ovurb5IeKkCU8XHUwMDFliH9O391RXHUwMDAwj85o5vnFXHUwMDAwiFx1MDAxZNHAXHUwMDEzyUikYnA6Z4lcdTAwMDD1irn/XHUwMDEyKmGZ67l2XHUwMDE4rUAopFx1MDAxOdxcdTAwMThSM8JkTrCY0kJcdTAwMTkxPV9cIrBIXHUwMDFmsGdupVmyWn7fkSu5QG7Fk0X4vTn4TcnOgFx1MDAwM8hcZlx1MDAwZeZemzVuXHUwMDBlP1x1MDAwMbeq+3DOXHUwMDFmdmk4MfWNZ5P5KzpcdTAwMTKc4Vx1MDAxNknj2Fx1MDAxM6Hpr29cIiA4peSP/U5+//ZcdTAwMDI6I1x1MDAxOGusqWL7S+MpXHUwMDExkjlcdTAwMGZcdTAwMDRcco3lR8Oz4lx1MDAxZfU6p+3R/U+t2nlcIlx1MDAxZTv62t85nFilXHUwMDE5LHpcdTAwMTg28uOvTFx1MDAxY5B1XHUwMDBmZH06uUlcdTAwMDExSelcdTAwMDQ+gcteL1x1MDAwMnGATeaL0oAwXCLu19ZcdTAwMDCPRJxcdTAwMDOA8ivJXHUwMDE3f12rqpSs5Vx1MDAxN/bh8jxcdTAwMTNcdTAwMTRTynGH31PLQ1OCmlTZeNn7PUUtMV64qWeNkqzww9p4XHUwMDAwYlxc+elcdTAwMWRAdjNEyyFcdTAwMTckJlx1MDAwNyW8XFx3+Fx1MDAwNSaHmXajXHUwMDA29Sk3W8XEumopXHUwMDAwjHJcdTAwMDdcdTAwMWNx7olcdTAwMDFnXHUwMDE40qm5Xmm1ydFcdTAwMDcorZl3/lxmqVWXmcK2XHUwMDBl6TLNVH5WTkBcdTAwMTNOWoO0N1x1MDAxNnRcdTAwMDfWQoygJXsjYXEqJUDc0KVcdTAwMTVcdTAwMDFuQqt2Pv1d85v/beb/m4eH7S7DLFxmgNnXnTzkmMLgLjSkXmOMMORTnUo29zTm93rR5i5CVatcdTAwMDdjvzZcXNDg8YXbtP/Gh39cdTAwMWZcIqHX2Vx1MDAwZn5cdTAwMDQ9aIKoXHUwMDE1UiZ2RGWcvDBcdTAwMDE67Fx1MDAwNdPAiIRcdTAwMTTisFE2Tp5g1Vp1QFxm0aRB1UFWXHUwMDA2sO+CQ1xy0O9NXHSpcdufLFexhzHJS/3GmqOTXHUwMDA0xYFCYc0utonT0fftL6U7U+taXHUwMDE0YENOZ5VcdTAwMWNcdTAwMTHLN2nJn6o8POVDJPZcYuKlnImxN1GPXHUwMDE0eFx0XHUwMDE3O1x1MDAwNVP+clxcPj+PmVwif8tcdTAwMTdYKrfk78NcdTAwMDJcdTAwMTjHVzz5XHUwMDBlO1x1MDAwZVx1MDAwNEmztuZlXHUwMDFhzl1LbrJUXHUwMDBmfqhcdTAwMTVzbYnIZYB4XHUwMDBiPzD4q433XHUwMDA18lx1MDAxMVx1MDAxMlC4K7S2uMZ6edrgWOdYNzCFo2Xs35qxtS7IXHUwMDA0xF39XHUwMDBl/ttM4mKwflx1MDAwNsavLVx1MDAxMFx1MDAxOFx1MDAxYXBcdTAwMTHVT5aZL1xiVNGD+lx1MDAxZEpSszD+Mkmvf5tcdTAwMTCPXe/tN5Nh1UcuXFxrhKMpYOOZeXtN0C7ZPFx1MDAwMVx1MDAxM2Iy9epe4nmAMM/QXHUwMDE1OeFvcrLQ+Fx1MDAxYmt7uFx1MDAxMilU8Fx1MDAxOZHdukuo1/VcdTAwMWVBtb1cdTAwMGbfTnc46JCbS8C+vylunM4jIXj8wTklXHUwMDA38n7cZrrBVkCIXHS0XHUwMDBmhtdcdTAwMGaKXdRSei1KVEtcXOstXHUwMDE145fpu1FFXCLvJd1JJD55XHUwMDFjz5DyjpxQy/nCQadnjk/MXHUwMDE3ZF4nbsLe5M9cdTAwMTGePnhhe8+dhLmv8lx1MDAwMIhcdTAwMTJbtFx1MDAxZnuR6eC5Uz8w6oditDl0UWcl42KBOPW031qZJCGUOp7FiUdMQFRcdTAwMTY6jH+7XGIkXHUwMDEx5lx1MDAwMzAg38Rl5PE/24k4XHUwMDAyXfqo+d1ccuWwXHUwMDFkXHUwMDEyXHUwMDBlIX9cdTAwMTW5X1W08rbtxYBfXHRJU+1WxmG9XHUwMDFlXHUwMDAwYDUo0Z7+Uyz241x1MDAxNC/1XHUwMDE06elYXHUwMDFkYdHfradEtixWUIL3OCjxXHUwMDEzPZOpI1x1MDAwNy6HqMmPbvqWZlx1MDAxZVx1MDAwZbVsl2IgM2B7xq9cdTAwMTRcdTAwMGKuRf384tRcdTAwMTNg6+8nxv3zcadcZp07orlSNyqGSjPj70rn0Pz9mJw5fd1cdTAwMWagqVx1MDAxMCZVoihwhFxuXHLVfp6NXHUwMDBig0XwsoAwy+rPmIfdSTJiXFzvhfREXHROzCqXYVD4mdNcdTAwMDWye9Rccl04czuV2neycdVbOEuh8o9kNTZcdTAwMWOL4rHpUVx1MDAwMu26mjvDeYtK7LT0+PnYqVx1MDAxNatrMcLrXHUwMDFlYFximUUuZlx1MDAxMru3Xb+1XHUwMDE5cb2+y19cdGtcdTAwMDJq7TVVf+VcdTAwMTf+pS+MpdxcdTAwMTOZXHUwMDE0+Thd6lx1MDAwZZloa/K8h97qpOYspnk7XHUwMDEz195uUWuBkTD1Z/X/1oTqJ+LNMvpiv1ryZS9cdTAwMTNcdTAwMTGJoSq11fe3Zvh5Sogx4VZcXHFGw12DYlx1MDAwZTbSql9O8ZjRXG7dM0Q2rfeCmjjki2OlXHUwMDAxRN6/dDWu4VxuW7JcdTAwMWQsslnvo09V9u6qwj9/qJR0XHUwMDEwXHUwMDEyUstcdTAwMTF+4u/jLT7/+a5H8dk5Y7LG304rXHUwMDEwv5VIcVXTXG5BXHUwMDE5t0HMSfJpOOy7XHUwMDExRVx1MDAwYmyTjifNtcZVQo9cZjUxT1x1MDAwN1x1MDAxOf7NU1x1MDAxZJlKOs28mZRDm/1YpLLyXHUwMDAzXHUwMDA15LNcdTAwMDaZ5deThdBhgi2JeVx1MDAxZl6AXHUwMDEy1aXVXHUwMDFkMrmIvNFn/6ptXHUwMDE5o1x1MDAxZdJccpyPeGbxpXijsuz6ueBccn7bIHJ8/lVcdTAwMWOQcYdrLL5D7JbKrFx1MDAxNcMkPE6TZjLlx97yZpbx11xu0YMve/HhkN9cdTAwMDYvglx1MDAxZVx1MDAxNlx1MDAxYeC7sVHOw4+UxfjiXHUwMDEwmFFcIlxm2Fx1MDAwZrdcIjVOnd7xhoYxadTUmtJWbECuX1jg61x1MDAxMlx1MDAxOV5cZjGt0qeYzcOniY42wLtcdTAwMTdwXHUwMDE1pCVAXHUwMDFh9Vx1MDAxYo5cdTAwMWFvq1TyqDfH4CzaiFMsnI9WXHUwMDEzyYA5XHUwMDFiXHUwMDE42t2dlLdcdTAwMGadzK+XXHUwMDA0XHUwMDA1zzHhQX9cdTAwMDRZQyxcdTAwMTVgvviCwrorXHUwMDE2d1x1MDAxMvyOXHUwMDEzps/4eIeLy9RcdTAwMTfmzNdcdTAwMTMqzJStrl6OXHUwMDE3/vz9/8zFRESZwFx1MDAwNs5cdTAwMTbLSOFcdTAwMTQlLfbg9fYk0FG846lzXHUwMDBiXHUwMDAyI/dr6OujbGl++K7QvNTNX5ubd1hcdTAwMDSD47WIr+S0iTzv6LS7tlx1MDAxY2pnXHUwMDFiyCn4ku5nPVx1MDAxMUEvxlx1MDAwMFx1MDAwMrPtYiGiNCf231xcftFcdTAwMWNi1adLtkByqX9jYk/J9cUqUyHaL2J0XHUwMDE5XHUwMDEybnEld1upXHUwMDBlQMp4JieuXHUwMDFiQbJcdMPaslx1MDAwN/9WaPfRXHUwMDE5/pJPTFd2R0fUk8E7zqFcdTAwMWKV34CpY99CTf6NQSNcdTAwMDT5eVx1MDAxN1xmQ0LM62aI2X/IJfuNXHUwMDFmKDSxdlx1MDAwMn3KwVx1MDAxYYPFQGlcdTAwMDJdcuxQSX37tUt16byQmMV5XHLP4pZDNCpcdTAwMTZKyahnl5iLYu53vLmvrVx0vtuNNlx1MDAwYlx1MDAxMmNcdTAwMWK5WPP875l6gFxyWVRWOjZcdTAwMWVPkVXiudopmtfgYlx1MDAwNS9DpYAtvdpcdTAwMDPed7ogxiFjIEc3XHUwMDA2SHYpkzjxjvNedqKN3FxuPFx1MDAwZsD6r8fb31x1MDAxNHnpidvIbrmnKltojH195ouYXHUwMDEySNb/8puRgiy+Q+RQ3lx1MDAxZkUnfqX/6qHLcyq9fb+hXXyszzbl3ldAfZuXK8aAMqfT3lRPfNpNy0y9P1x1MDAxY2RzXHUwMDBiPMNcdTAwMWPmXG7vg7r0PH09LfyNki88dZORMmQ9zDvW/q3PXHUwMDE16Ta+kfKytG49ISpkTqCHmofp8mxcdTAwMDOwwpeuYKlOvEWAYVx1MDAxMkCOv/1cdTAwMGVNQbU8xtu3/m/2c/CDNfSV1X3WfVx1MDAwNp9iN25zabavJvR6kWc3fqrW/G+dsC1cdTAwMGZRRFx1MDAwMV0wi1x1MDAwMl7JpFx1MDAxYjGefPhcdTAwMWN+P97/9ddvy1x1MDAxMvI1g/trzGNwUFxysd3fLI4vmEVcdTAwMGU5Nlx1MDAwNWqKw/vUtOdbnpaXsr7BXHUwMDE5RFx1MDAwN72tW+31XHUwMDA3XHUwMDE58MVcbnNjXHUwMDE3a1x1MDAxMZIqr4aWRSfSJUT/1aI8JDjDvNBcdTAwMWQt7Gj+alx1MDAxZPymk+XRyVx1MDAwNUD51lx1MDAxOFT16+B7Z1x1MDAwMMzz7zv6p4tShFx1MDAxM7Jo9kKCXHUwMDEzdoJ8va5GoEM5XHUwMDEzXHUwMDE4W/iPjlx1MDAwMJrNXHUwMDFiXHUwMDFmUCuAL1x1MDAwZq/30FnnaIxkSD2JM0MuXGJ1+U9cdTAwMTlnTNDV48FcdTAwMGZZlIlcdTAwMDJ5bm7ib7+a869LXHUwMDBmXHUwMDA0bFx1MDAwZtyrfVx1MDAwZt9wMvNIL5Fmf+fXXrehnt+DJoG/md5cdTAwMDKSpa1usU/sq3iirPDJ5ZHtqUrqXFxjXHUwMDAx6X4rOmPFpLKj1sK1f7Fo4ryNP5RP28Xp0lx1MDAxMVGvjsjYUXV0olx0cVxuoz/8XHUwMDE0uizWc+gq5OAzb6WgXHUwMDA24iFcdTAwMTcnYPjcmF5cdTAwMWOxYctcdTAwMTexU5yRYZmhsYg+m19cdTAwMWbjpNNcdTAwMWJi+qmsKKtcdTAwMGKhpIbXKj9cZsPUjNBcdTAwMGJO4EhcdTAwMTSDxaVcdTAwMDCrqcc0XHUwMDBlJGM6JvrrXHUwMDAykL5PXHUwMDE2UdT2k62hXHUwMDAzXHUwMDE5XHUwMDFizDO+JZ9mTKRneUt0XHUwMDAyalJGkO3aZ+1cdTAwMTFN+17ANtRaUURcdTAwMTA5c4Ks45G2vkl2gl71YOxrro1M3Gs3LfxcdTAwMWJ7v1H+fSlcdTAwMGb0r5mOOj970kEwsrFEp3zvNVFcdTAwMTB+4t9GKlx1MDAxOM/JXHUwMDA2XHUwMDExleQ+XGJcXJPWfPeOJk5FQTPdi8drmVdjdPh9n+nonPB6XHUwMDE4fWo2mYNLL1x1MDAxNLXZe0mCsc286Vx1MDAxN8MgsIBcdTAwMTjVduDZN0v/t0ftuMjktVxcXHUwMDE5x9VuSYdcdTAwMThcZmJ2XHUwMDAzYVx1MDAxZXDj+DbZ0kSVuzSOf1x1MDAxZTssTK/LZl5cIuCVOXo3XHTewZDcSoLSXHUwMDA3uXZG4/W9MsWtkDBcdTAwMGXSzp1CgILbKi4lVdi+zFx1MDAwMFxu3z9DP4ZcdTAwMTD0ipp24qfKXHUwMDAwXHUwMDFmkF3lXVxi0ddcckbDssah9njGXHUwMDAyN+Ak6eFgVFx1MDAwMUuDXHUwMDA36+TB5m9DgZC43Fx1MDAwYlx1MDAxOC9WRqu/QD3sQL+qXHUwMDA1+zDqJSumLyrSRfbG3Fx1MDAxY1v7y1F3rJBVT0ij3GtcdTAwMTV8S5laRVx1MDAxMrKbXllZY7CcUFx1MDAxYVx1MDAwZlPq7lx1MDAwMORJlbfONVwiJlx1MDAwMHO8v09qsqWK/Fx1MDAwN4bDUOgrrFx1MDAxNTJMj3X0KqVed69HirBcdTAwMGW7r6iqyGlXwLvypTVcIiOfWYCvq96mpfkzvrc4Nmz+vaTFWJm9tlRcdTAwMTOLjIzx31x1MDAxZZo7XHUwMDEwan/HQ/c3XtUt+ZlC9ETKW1x1MDAxY3Jp+rmXm1Tvq7m3K4td9+bzObl+TkeEW2gtXHUwMDBi3CMz61x1MDAxM7oh7Fx1MDAwMJJWa0+MOGWK8oJcdTAwMTi+mJblmFx1MDAwMUvcm1x1MDAxZVx1MDAxMLLmadlgJTP/TEf9mFx1MDAwZVx1MDAwZjI94Vx1MDAxMVx1MDAxZlx1MDAxY7tjMDZoz/PEXHUwMDAx5sx1L1x1MDAwNJtcclx1MDAxOOkyXHUwMDE5XFxcdK4jcd3V11x1MDAwN7pcckVAMZLzZraLXHUwMDFiXHUwMDBlkqQwpjBcdTAwMDC4stwsLUi3XCJUT06LLZ/mOnrH24uOYFx1MDAwN3xcdTAwMWOOXHUwMDFieFx1MDAwNlwig7joLVwis0FQfkRuhFNk4LNMYV4/NFx1MDAwN91cdTAwMTh0ZPCSM4R/SqR7YfYgjp1IKlx1MDAxY4r1053fcT1oUNH116bndFHOQffqXHUwMDA0syheMlFcdTAwMTcp5y+GuWNrj5gq49VcdTAwMGbJf1982FJcdTAwMWFcdTAwMDf/dlx1MDAwMiiBNVGLX4yrU1x0xlx1MDAxZlx1MDAxM3qTXvPEWFx1MDAwNvnccWY//a1tQrtkOzKjbkOiXHSDXHUwMDFjplwiZ+XNWOHN62VcdTAwMGVccvVwXHUwMDA2fP6gn6W8UVx1MDAwNUj5XHUwMDE1ulx1MDAwM6jIi4hcdTAwMTeG/DlrXHUwMDE181ltoT6+6ZefYH97IIZcYqrbnZVQref6XCIjQVx1MDAwMDi+TOXQTHArw6lDXHUwMDE3VW8vRvmWZk1pj6BcdTAwMTlBhFx0WPPcus7tysjR84k4LNC1xougLoX1aGroUmPaM0lO13iwzyp8K/L7dYpJXHTPIJPKxpb6T9Vcclx1MDAxMJuWXHUwMDFhNt7DKEIvL1uTacVoejFcdTAwMDFcdTAwMTSZSvi6pcLjYcKDXHRccsKhqYmY0UQqV6lQjCNDfkhyM31nXHUwMDFjLMhcdTAwMTJdgkVcbusmVWz8/mHspi3Slz7mr4VrdExh7lRcdTAwMTaQMHjqXHUwMDAyu2HWTf11U+tcdTAwMDZcclx1MDAxOFx1MDAxOTKE3564NnSCuEBXrIw9cDghQvaNzVx1MDAwN+tBVXv4q0Im2NlcdTAwMWZfXGa3XHUwMDAwJpSC7mpjMoiSsH3ba936klx1MDAxNixjhC69OL8z+kJ0IcCxXGZcdTAwMGY2vTVD2Cli3X5T6UPxe4xcdTAwMDYpfVxyXnPDXHUwMDE2m83eWqG2RVXI1qX/j99cdTAwMDJUjrlcIq07plBcdTAwMDa79v1atmit9ENfYFJwXHUwMDA2MWZcdTAwMTJccqg6IPWL66Bg2mqT6OhNNKjjlEtyXG7i396M5Mvt21x1MDAxNlx1MDAxYSW29Ueunov+1vl0MCQ2ckbn81xy71x1MDAxMNo+XHUwMDFiwoCOXHUwMDBlg5X/ykNIUmSfr4MqMl5U29K9abaDfjBWf2zvQWdccl3DV8/Ko1tcdTAwMTHG3+lxXHUwMDEzlnuOLFx1MDAxN0KiSpbjlNhVXHUwMDEwV7TwZWc52S8jlqNCxCt2vy9+/1x1MDAxMUvPgCtZwsUr1lx1MDAwN2xU01u/brlcdTAwMTbf7nI6KYyTXHJioVwijrC0XHUwMDFk+1x1MDAxZlwiseP6ILgs0tNdbfft5GzCvmqsb5P1u74pXHUwMDA2lWH6rY9YyZ36XHUwMDA15UA8L5O4QHWyeidR+MeXL4/shaXfKfWrqqe5zoZW79STatRFZimvO2mpXHUwMDE2XGYoXHUwMDE5Mlx1MDAxZPRV5GBcdTAwMDGHXHUwMDE1XHUwMDEwgX3nfqNcdTAwMDezXHUwMDE1XHUwMDA3XHUwMDE1hvCaVL1JvjZrXHUwMDFmRX32S6ntqJ9cdTAwMTNcdTAwMTk/xFx1MDAwNVx1MDAxOMBSXHUwMDA0sNX9LYqJ2T1An4lcdTAwMDG5SD81elxywP1cdTAwMWTAXHUwMDBlYXg012pcYpWWfJVcdTAwMWWXZ1x1MDAxOESwXGZcbupZ2+DVMUBy2G/lunKAmlx1MDAxOZi8RSHHXHUwMDE21lx1MDAxNDtpeEtcblxcUN5MXHUwMDA0zMzhXHJcdTAwMGIx/fIoWjdznLm1XHUwMDFmw1xmopdcdFxcpyTdS1x1MDAxNbdGXGKRRFxuTlx0o+G6ffZZOlpcdTAwMTUoSuhQIZ3vrlNcdTAwMWb14Vvwi3fnINaJQVxmLrpcZlx1MDAxZrd3+d+nXHUwMDBi8vinyrlcdTAwMTVx2adhp+YuXHUwMDE24Vx1MDAwYsck6va7PtL8b1x1MDAxZlEuljK9P6dE/3ZcdTAwMGZJwN+a2YJpQPreXHUwMDA25jveiFx1MDAxMu601qK8LVvbfsH7zlx1MDAxYT3KuXxcdTAwMTH00MxTSfpcdTAwMDW265E/xlwi3lxyX0u8XHUwMDFjtYfkXHUwMDAzTX1aoLxBPMtf5KM2XHIg/ypcdTAwMDdcdIfetJNcdTAwMDQw2Hm8oTo2coODUlx1MDAwMkG1YGrN2lYlW4io68zZ7ZjxhscwJ6JfqbJo90h3XHUwMDAw7qTIYWsxWMzhS0h14jw++WuCReVE1Fx1MDAxOYV74Ka6dGXnRuE1MUAkTEomhPGyiirtXHUwMDBiXHUwMDAwnPk1KTa0xqPXZNfQXHUwMDE5ju3xXHUwMDFjMkGUXG7m0vyUb5aInHzt86Zd2N+MXHUwMDAw3TyUz+Ayb272Z9GbR9orLlx1MDAxM5Ls54hfeyqOz5V288KW7njdSEaA31x1MDAxM5aY3oSM1JZcdTAwMWZ6KMxSaW7LtzOnXHUwMDFjv09lNU191X2NTFx1MDAxZKPizbnIvpOQK9Bd0jDRiDsjs1x1MDAwMJtcdTAwMTEndJ9fJlx1MDAwYjsj++PDe2/PyoxhMlx1MDAxN3N98ujk+y2GYk6IXHUwMDFjmT/JLGaDj5v9XHUwMDAxjMTkJmNcXLdcdTAwMTFcdTAwMTV8tcNcdTAwMTCNUkhYmCk0MVD5lS/lUpph6tiOdyypjvHx0iBnX0bYsyxccpFmXHJi0ickVop61tA5XHUwMDFlXGZcdTAwMGVcdTAwMDVlUXx2/Fx1MDAxZZc36EOH6ddcdTAwMWPM0sBje1xcMqBYXHUwMDE32fP7XHUwMDA17Vx1MDAwNsdcdTAwMTm0/tu3aFxctWxeNtPxvnFcdTAwMWI+YySYwVx1MDAxY4dyVVx1MDAwN9tcdTAwMGaG3lx1MDAwN8+nYkqr+uqlWjFW/PHGNOhcdTAwMWP22JjF0Lq//STCXHUwMDE2Mz0+zo9wq+NcdTAwMWF8hS1YoDcmKFx1MDAwNPtp8dWOOf6XXHUwMDE3gcDQpXJcdTAwMTYgVepcdTAwMDJ/0Gr8krYwpXmIpi6By/lV1I9NfuUg+PhcdTAwMWbsXHUwMDE3ppchrke5Qlx1MDAwM0re2PBcYuhv3ZBYsHdcdTAwMWWuguh1OS/8anxPlj+T57H6zZ1SK1x0tVFnXHUwMDE4tFxuuoiTb+RcdTAwMWbnXHUwMDEzXHUwMDFjyVx1MDAwZpno+unPSIKAmfxA8ZFcXLFcdTAwMDUno1x1MDAxOFAvlZ+Fs6fPmqGKyi2z+czrh2aElI+G6Fvq+t1cdTAwMTlcdTAwMDXeOedIl1PWXHK8XHUwMDEw3pLBhrVde+Lpf7/P8UpWUyvY+tg64H9zpW9tXHUwMDAxXGJZ6oyxe1x1MDAxZfadXHUwMDE3XHUwMDFhK8y2sKX8ZI/C81xmiqJekoPBnkV6/6VokeaJjaJcdTAwMWJcdTAwMDCCX2qo9pqL6mkjiChcYmCwXHUwMDE4nlx1MDAxOV5cdTAwMWFcclx1MDAxZfpcdTAwMTktwDydYG12XHUwMDFk6VJcdTAwMWOhkvJntPchnzVAPduYgFx1MDAxMoRtQoN+0GNcdTAwMTdcXFx1MDAwM1cynO1EIPaMw9z0ijNyoK+p9fjfea/0dn1cdTAwMDN2g6l0ReB+v/xea0rWxTK1dk/neDlcZqCkR4YtM4HahFA3idXMgUlcdTAwMGKK3IY6rZe4qZQ6/khNXHUwMDBiNIDGfbZqcnXNIz/lXXmBQnm9rV34oPk0WVx1MDAxOVx1MDAxMtFQMolZqKI0uPaBPFx1MDAxM1O9bbxcdTAwMGVIUVx1MDAxZDXsoFx1MDAwMdvBk95cdTAwMDVWdnaVztR8iJhcdTAwMDGYa7HigUG/6DJLIYlHmNjLpYij52dYuVx1MDAwYoePf2vkr74l3Zdkt2JmXG5103DWXHUwMDFkQFx1MDAxNFjS6fH/7fdcdTAwMGYw9irk3WJWkLlcZkA7XHUwMDE3SpPJklwi3+QgS288/U2iKlx1MDAxNUN0ZLZYMjGgIFgrguZI5bnvcZrQ3mOlbFxidkmR4MidQ6VcdJRRfZpcdTAwMGWxmjZ5+lMoXHUwMDA39nXKR6doyuDk+7Dhe8qkW8b4w4plxY+v+zdzsqHjr/CWtTOMq6Gnxk68Qz715Gxljt9cdTAwMWXe8Fx1MDAwYpgwdlx1MDAxNC/cmLVR8eHP/9xS28rMylLI6Fx1MDAxNbVcIkRcYlhfgfSYUbdcYnmDLW/iXHUwMDA35NBG8zlcIkrEXFwvcvugbPS9kZ7EXHKsXHUwMDEzwF/ROlx1MDAxMEz2vLyRs+/5WIerUCWQRTNElKBcYkdcdTAwMTTR3oNIXFz6U0m96MnWeptcdTAwMTn6+/m2XHUwMDFkXHUwMDE1RqEgq8aagqV0jG/S3r282dRTJNRcYlx1MDAwNZlV5atcdTAwMWObXHUwMDFlmvZHwOhcdTAwMTjVXHUwMDEy0qrwelx1MDAwNaXJUelcdTAwMTjeXHUwMDEwXHUwMDFhP1xyu9E/XHUwMDA1XHUwMDFk2WR77/JtXHUwMDE3XHUwMDAzgLx8wMAspDM6klx1MDAxYlx1MDAxYlx1MDAxZvliXHUwMDE17YRKaf3h1oMo/lZZfErkY889WVNcZvGoZ7/8zTqG8EJRbGtNIKP+YqRlOcZcdTAwMDDsUl9wau2jXGZcdTAwMDRcdTAwMDMmMMFcdTAwMTCfqLLylOes4dcg4Vx1MDAwZSHyXHUwMDEzvE5cdTAwMDaG0ap6PGtcdTAwMTDjJdX7PGvVgJl9zlx1MDAwNMbqOf7j2PfzbVJcbspulMbnaSWklMtcdTAwMGKGnNKSXHUwMDE1rNmknJGgaKL6TXrAQP9cIspcdTAwMDNWTzr+PIilPla1+aPFXCL80vm26td7XpNn+Phf+W++XHUwMDA1jWyoXHUwMDFlizpcdTAwMTQsXHSq589IkFx1MDAxOXYhrN/HId9ni1rnKLdpJfn2XGJcdTAwMDJZet1cbtpMa7pcdTAwMTVqu2xrj7aE0JFxXHUwMDA0W9HZW3ZLXHUwMDA0m+5hXHUwMDAyXHJy1lx1MDAxODM4zpecL1x1MDAwNc1LIcZmd5lOKSv231H8loDpXHUwMDBmJmM75Ern6vyqOFx1MDAwNuVcdTAwMDaQQX/nIGnX75/vgIwlXCLTScTGN75Trrv7LUGfgFx0RIv8XXz6s33oO1x1MDAxY+Od5/rp51x1MDAxM+tcdTAwMTPZ6lZcdTAwMTNcbnHcOirTNVx1MDAxMN2Aak9rhTyenOXu24jFtftcdTAwMWHlL5RcdTAwMTjBXHUwMDFmMtuy/rlIXHUwMDEwequ4bImvXHTDXHUwMDAyYGE0xGNcdTAwMDJcXG4oVtCD92yDXHUwMDEyu6ZcdTAwMThBuOQzXHUwMDAyZVwiklwi0cVl6fZcdTAwMTHgY/tcdTAwMTZF6Lv3WSWSd4dV+iZ4KVx1MDAwM/bTXHUwMDAwXHUwMDFh/S3S7auvXHUwMDE0/TVcdTAwMDetnS6BXHUwMDEwXHUwMDE03pHsrVx1MDAxNSy8wY9T0oNcdTAwMWJDUCZxR1eNsfCfXHUwMDEzdzVfzNepWCOzqYZ+sO63WiTTsNDAfGNcdTAwMGabXHUwMDFjXHUwMDE4mVx1MDAwYkrC8uPoJaRweDd7Qnxgiza7os0tlUmSruGsI1x1MDAwMdXNO2BKXFzFalDlXp9P6D1cdTAwMTKAVmlspFx1MDAwZu6G8k1cdTAwMTmFs52+n1x1MDAwNF45q1x1MDAxN9vwqnxVPVhwhk3pIChcXNNsQopcdTAwMDXg31lCcPL1nbCX01x1MDAxNGVcdTAwMTY4s/1Uflx1MDAxNcNJP+pj11b9WVx1MDAxNqcshlx1MDAxMk9XU1xccLQrtz73dkbi6lx1MDAwND2TXHUwMDE0Wp50OST485vORU2ZXHUwMDAyuOhNXHUwMDE0nZJcdTAwMWS6rjFcIlSly4iYcog+YPBFxOxvzU/SXHUwMDA2M5ZcdTAwMDUgllx1MDAxNWU1VeTV5Vx1MDAwYplsnFx1MDAwZVx1MDAxMuSB81wiXHUwMDFmIV6xo4rAXHUwMDFlRqFYXHUwMDEyRKPIof7tja1OqVfLXHUwMDE42ZJcdTAwMWZcdTAwMTFcbs9Hblx1MDAwNZtxzcxSLGFcdKhcdDm9pnpQXHUwMDBmWFx0yoknw6dgW1x1MDAwNVx1MDAwNrlt3rhEyfRu+f3szckgjvOFeGvwV2FZXG53idjxXHUwMDAz49XyZp9OT1x1MDAwMi37VXSaXHUwMDFlXHUwMDFmKUA+08t9906YkrK/XFyyd+KPxEL+XHUwMDA0kM7Tk4fw7FhTXHUwMDE1krbhyzu4XZuplFxcwTVXJSSZ2Me6+jd2TomwfL7qvm+PxIhYQ0la4iBC1kBxzak8ktZzfnHvaDZeXHUwMDE234A3OqtqJlGSxEaDbJUjXHLLXGLv7Vx1MDAxNlxyKlx1MDAwNiZyLYFKxJ4tiepcdTAwMDKcTU+OZsTm5Jt5lfbQoSWZ+VJIuJ/AfyX8fX5Pmlx1MDAxNXVcdTAwMTdRXHUwMDE4jvZcdTAwMTO03i8lS/yhR4RxXFzCcMW/bbC2tPZIr1xyjLBpelx1MDAxZHx5XHUwMDA22tS/M1x1MDAwZlHNr/DDXHUwMDFjZIvlrP6hoc5cdTAwMWM/wtDG2Fx1MDAwMTJ7TbvzXHUwMDFixL2Cyt1KXHUwMDAzXHUwMDAy0qFyRFx1MDAxY1xmJWRcdTAwMWX3fIZcdTAwMWFHxF3XRXBcdTAwMDdO/LNW0Sfas+BcdTAwMTOliL9cdTAwMWJMZzK0USdFcLo0hnpyWvHzTTHyn1x1MDAwZlKuf1x1MDAwNYqfo8EhanQq3Vx1MDAwNdl6JsJcdTAwMTJTZm8lrDP+wvgy/9pcdTAwMTHi3aKGsonD2DblmeIxbUgpv5kjqaVNP7s7L/CLwJpcdTAwMWRzV7OEXHUwMDBmTnsyXHUwMDFl+nMvslx1MDAxOegzpVxmhFx1MDAxNiGDubYr59z32X3MlYaQOkhcdTAwMTGWuI43Sab82Fu8V+V+UvKFUFx031lcdTAwMDOZe150RD1cdTAwMDHtlUJp3HHyZHHIqFx1MDAwMLNcdTAwMWZ0z9h1YXZOSlx1MDAxYrfaJoI1wyxcdTAwMTiR+D43nbEkmZtJiqVl0sJccoBoTv6MT2q2xFx1MDAwYlEnpTR/6yOux1x1MDAwMOJEwGL/bWzro1x1MDAxZFx1MDAwMaKv7PFk+cxcdTAwMDRcdTAwMDWTI1x1MDAwZlx0gyW1JMCUK5d4Tu3f2iAz6aaSJLd2Wcm4XHUwMDA1kExpJHJT/Vx1MDAxM9FwiHAl8puO1VxmkbKT0K7fXHK/krzGSH6Tcmhd/bvNt+W1nyn2XGaHOU+8v2VcdTAwMTDl5uZBm8fZK1x1MDAxYVx1MDAxMHJ+6riyfP+5+UvIkFqPkTdrLUjITcDK25IqvbVcYsx23tSJ8ueIu0A3/VIuyLxcdTAwMGaS1qrMy4d/Plx1MDAxMERiil/nTFx1MDAxMlxiXHUwMDAyz/M6XGa7Zebw7CXwT6pEWDnvykvQjug+znqQ+WFe2Un1Xc0+MuFLuL8r2bGPXHUwMDA1L+/Ad+UzN+d7Nlx1MDAwMJar/TunnyzxxOWelKxfLYKX+8eecPSSoLm2W1x1MDAwMy2vVVx1MDAwN043XHUwMDA2zju2+aluRlx1MDAxMj0yMrecXHUwMDE0vIeAk1xcVm5cdTAwMTX7JYgpZmNcdNXsXHUwMDBlMK6xXHUwMDBmxTPuXHUwMDFh/sVLydlrJjFed/MkvTdCaM6iop5lkPZcXMKW+Vx1MDAxZMlURXu4pIfKz1x1MDAwZYCbYX337mT2PMLI/Vx1MDAxNj1X2lx1MDAwMFx1MDAxNd555Vx1MDAxZMtcdTAwMGZTLdbeduaKevrcxmpZKGGQzyt9Zsi5f3/C9DT7oDGFXHUwMDAwLq713zz4kCVtlJj1d2XuWpiXej9XsXObx+CdkZHhOOiCrbjtXGK/qfE4SaDDWeJ75pvR+LDLXHUwMDFmOrEtTto3XHUwMDE2Vfm1Y69cdTAwMThcdTAwMTUkd1q0+Vx1MDAwMObqdLHq31x1MDAwNSrnYlx1MDAxZIc63F2pqVWvR5XQy0nRcWjQxTxcXGA/Ti9aXHUwMDE4Q1eEwLq31koqw1x1MDAxNXPH6JnP0Vx1MDAxOVxivTKFaPpcdTAwMTlcdTAwMTHYei5el3dqy9Z1qsL2XHUwMDE3XGbQ6vxFs82eXHUwMDE05HE1K0FLzSFtXHUwMDFlvNyIKMRcIvK/bGnAme0/3GVcdTAwMTHP81x1MDAwNlx1MDAwNtm4UV/oupbasc9cdTAwMTVcdTAwMGW6WZ2AQHOsXcfv7NFibd2nvu47tlx1MDAxObN5e5ZTiLThfv7ubuGnWMpLiVRcdTAwMTe9/c3INHbd1UREKFx1MDAxMDplcGlbcD7+77wzMKVccjh+J+s0XGKlf19AW1xuM85cYudrc2pccpBJSJ3AoOnAgP25eIHx8Fx1MDAxOZBCoX8yasE1a6Ok6nFcZk1cdTAwMTDfXHUwMDA0wFx1MDAwZlDWrih2qn6/gVx0XHUwMDE4XHUwMDFhXHUwMDEwj5Nr+t19g4aK8a5++9jmjlx1MDAwMkwu5DWSmWsp6Is9yNXlXGL8cpmauICqfd9cdTAwMThRJaFcXOZjXHUwMDFhZOH1NFxclWAkVLZrlFiO4Jjo6+XBeCb2XHUwMDEw+rlcdTAwMTDr+efUzVx1MDAxMDBkpJfslpVcdTAwMTeYXHUwMDFhq2NVRLVcdTAwMDJEJuFcdTAwMTlcdTAwMDLKWp6HxJIxrojyqs2G7MvSyS8wjesyflx1MDAxN4NLlSBcdTAwMGJcbpbsQ5HLTlx1MDAxN1x1MDAxZLBSympFXHUwMDE2Z0z6co3NlU+7gVx1MDAxOU0qXHUwMDFjxXZ7LyE94bd5+Wc7OKSNjdapP772JPVNX1x1MDAwMuP+msJccsCVb3y16eYvckHMzossl1x1MDAwZprJ3LwvzPzsP1x1MDAxYv86pFx1MDAxNU+ZNMRcdTAwMWNO2iugiba2njFOVm6JS+7vg4kxXHTDwlx1MDAxN9JcdTAwMDa13H2a/nxcdTAwMThhOXRcdTAwMDBcdFlcdDD21n9cdTAwMTNC0bJIlq+oXHSxPHFg9lx1MDAxMVx1MDAxMfF1t0X911+qL+JcdTAwMTmpJcSxJt70e9P/ulx1MDAxNLaoXHUwMDA1Q/b2uF4rh57VP8qE35xcYmXGMNGTXHUwMDBmvnnCP2pcdTAwMTaBjpRGK9nFjcH7/H6piVClI1xyZo2iwVx1MDAxZvaoa0GVvP3lZFx1MDAwMZLEt1x1MDAxZT9cIuVCXHUwMDBlNv34vqM0NON+iHbZwe94i2yASYYwjooy8J2z9FDnXHUwMDE2hlx1MDAxYqtcdTAwMDNiZ8ElQrOZxl451WtayFx1MDAxZpTh6zn+7Jh2dVx1MDAxOMaIiPE76ax5YsyJe1ebwvm3NmlcdFfMzn6SXHUwMDFkXHUwMDFmxzJcdTAwMDfEzGyyrP8rOZb/w5ZCsIToUZTj0Glfzsw4n8Hs+vacLvos2FRMo5VcdTAwMDFHOl+Y0YNm4ubp/z9TvPvOxajMvlpcdTAwMDPg0zO/W2gl4Ptae1x1MDAxN0ukXHUwMDE4+kh0XHUwMDFhXCJD4sA4gXdY4ItZou5cdHXU04G9ibB9a1x1MDAxMFXMz26NlaAqRWJcdTAwMWHpplx1MDAxM958MstXpvy9QEGgfforzezp9llcdTAwMWZ6hfW/deZzZiNm/dT11KhERHVAjO1xXHUwMDE4PVhbXHUwMDE5pUhcIrWa88ozt1xiqVx1MDAxZfCHXHUwMDFjmbRcdTAwMGXqa1PCVi1cdTAwMTn4c9JcdTAwMTdYoCiYaHDsMW3scelTNkVcImycXFwoxVasXHUwMDAxPP5cdTAwMDSaqmBcdTAwMWLi9TZheVx1MDAwYvrYXHUwMDAzXGIzt8GBhVxy6cbAo11RIDcxxadOufZgizxcdTAwMWFxO2PQYFx1MDAxNFx1MDAwMEf6pIzQsd7wvopjsj87XHUwMDFi7G/jf2dBg3+JXHUwMDE4ks/kOssvTNbaWEX5RIyOXHUwMDFj8M/nXHUwMDFivJ5ZY6DAO4y2XHUwMDBmVXmsXHUwMDFmYHhcXMVcdTAwMTZ0ncGQsf8uaVx1MDAwNnymfOd+xZhEt419RPRaWUfGoib6fTe3LkJcdTAwMDZWXHUwMDE2VnV8s/R2cqLWZm1cIm56c1xiXFyF/X5EUWEpV0bvmWE1Kp1avfCS0cZ8+lxcr05cdTAwMDBY61x1MDAxNVx1MDAxOaQ6m+JQWJ3vyIFcdTAwMTkxTpx9vPVcdTAwMTZPXHUwMDAzyi1guv9ltqDUXHUwMDFj5Fx059KtLYB6dfM+2HjYOVx1MDAwMZztXHUwMDFjYSBcdTAwMDO2c+49QzmPalx1MDAxZVD1XFzk9y1cdTAwMTGXics+mkfqc4flXHJtx07adLWRlMe4Ts2715Bex1x1MDAxM9Nfg8lcdTAwMTLDXHUwMDAxmWUozyj/XHUwMDAxP0X36Fx1MDAwZVx0XHUwMDFmXHUwMDA0gzOGXHUwMDE4MrE1PGOGxmFI2lx1MDAxOWrkiXpZ6lx1MDAxN2HBrYOu8ILHwP5vXHUwMDBml/Bpsk6M93SfjVx1MDAwNFx1MDAxYlx1MDAxNHNvXHUwMDAzREpN0O+uwX1cdTAwMThcdTAwMDTaVaRLMjkutKsh6IxKN+Cz5cXwW1V4LHdcZrRQxlxubveHO83d0mTPJaXsxU4lXHUwMDEyXHUwMDFm4+pcdTAwMDY8VIukeFx1MDAxNUPq4Zey96zPJ0zD/TQkRsf/gnXfRMb64U1cdTAwMTJYz4owzjFcIrrv61x1MDAxMfqvmFx1MDAxOFx1MDAwMiiwXHUwMDE2Y1x1MDAwZcon3rRPVtfOpt2O9ufOgb6dpZDbdkO90dkhXHUwMDEwUHxIsp3v/Ojha1x1MDAxNnWmU3VcdTAwMWaWXHUwMDBijTtcdTAwMTO0n3lZP1x1MDAwNmFkhYm6nW1eXHUwMDE1XHUwMDFkXHUwMDBmMNCCr/OOiI/AnGFcdTAwMTODJrqydVOWJVx1MDAwMMFBUsJZMWn/zm1qsnDwKetnmFx1MDAxYuoujKM9wKySzOzDvVx1MDAxMTlcdTAwMGKqptNcdTAwMTlB2zBbXGJ9hGeOrlY889tSoV/ir1x1MDAxMUJcdTAwMDAg2Fx0XFwxcFx1MDAwM1x1MDAxOXfXXHUwMDE215bD5PUptEZDyVCqrDr9N1FcdTAwMTjuXGLPulx1MDAwMj5qYj1nNlx1MDAwZVx1MDAxNb+KpIm3otHvmPl9WP4y1tVF0KDV/XxUSEy5Np9PPq2L6p3h8dTcXHUwMDFmn4RcZlYum2xcdTAwMTiGgeck9lV/eCQpWY9VniA20vfpXHUwMDE1czCnUP1GXGY8XtFEriw/XHUwMDA0cj/hp9aJnclcdTAwMDfTUZuPUl7LXHUwMDFjONHmXHUwMDFkrZVltFx1MDAxZfN+XHUwMDFll0JL9y5cdTAwMDRcdTAwMDaTND5CYYIoMlxi7o1RlY0kRnl4wGbXU3L8/NoyP/bGoKyawEXwisJcdTAwMDXggGxcdTAwMTeHM/hcXO/ujHs0LfJFXHUwMDAy4ileXG5cdTAwMTDx29JOOItxs0NcdTAwMGVnXHUwMDA0qM/3eMaKpcVcdTAwMTDFRVxijoSiXHUwMDAwXHUwMDFm9L+7PubwZEZHqcVcdTAwMDC6s+8vMj6Y8HWjrv9iIERcdTAwMTFcdTAwMTVaZERcbuBcbvXZ3WKbQyRx0TrDXHUwMDE489Vd6GyVZrJytEBpoPksKa5LxVx1MDAwM6hcdTAwMTWmwGAuX5XU+8ewY1H3wU1qTuidfMeQx5h4XCJAd3PJNT8p2/rGU2i4YOPW/o7gdlx1MDAwMa9cbkb4eaNtXHUwMDBmlmfC97lcdTAwMWOn4aXO2jslWS1v1bjUXHUwMDFjYU+uWKGehJujPvJBXHUwMDEyZ46IWz55MYu9gGXWlNCTbf5CcvJcdCyWejvMnFx1MDAxNclOSPfBunHguVx1MDAxYrBcdTAwMWJdeEubXHUwMDAyMtchlThcdIXz7mOZXHUwMDE1bMDDcEtcZoJtdNNpojy7Z6LoVt8xRFTmXHUwMDAwp1x1MDAxMW4hToOUP+SDsP04XG5cdTAwMTX38Vx1MDAxOXTNwot1dHDH39e1uouGf+yE5NRFXHUwMDA1IISvn6GwqX5cdTAwMWWoyN0x2C1cdTAwMGXa/4hcdTAwMTZxfJOIyHzAZfJItoVcdTAwMTd87tTZqVt4qndsXHUwMDFkgmzhqOBo9UyNoG1cdTAwMWHfx/tcdTAwMTHQXHUwMDAz1YTmn9j+JOhcdTAwMWM7gUUmXHUwMDEz5nhcdTAwMTh/b27cwcOI1ZTHtnHgXHUwMDEyflg4XGZcIiZOXkdcdTAwMWa91SjnXHUwMDFk8OO8/exvwWPe2SO+3yH7pyfL3Na/P9dcYp9cdTAwMTlcdTAwMDZ/XHUwMDAzo/5U4XMvyK5daflcdFl68tpcdTAwMTeUKMwx4za1Vlx1MDAwZTgwXHUwMDA29Hyr5lBcYnHA61x1MDAwZbzDWqvLXSS0iYjUSGHEsHNcdTAwMTH69HVmasZcdTAwMTTFpVx1MDAwYjDkXHUwMDFi01x1MDAwMDy+Jlx1MDAwYsXB/DJIeEnfdm2MbpvH+rx9xl5AtkL0qmP/rVx1MDAwNfqldrhcdTAwMDXjT+It2cLfbcGKIOLSaU/cuaudXHK3NZ+103i/KFx0ylxiY06E0lx1MDAxMC5Zxih731x0XHUwMDFk0X6eXHUwMDA1vedRr9/am8zIXHUwMDEwyJSVXHUwMDEyblx0n8VcdTAwMTnOOlx1MDAxYqZcdTAwMTmrzXR/c++26jFiolx1MDAxZPvsb0DPe4ZcdTAwMWMx2VS0am6Ff3s8zlx1MDAxNrC4/Fx0k12juFx1MDAwZsNcdTAwMDLdunvhPjTG+vPjmElcblisZlx1MDAxME3OXGZcdTAwMDC4Tf0mq1xirGvtXGZq0Fx1MDAwZlxi6/mZT1x1MDAwNaarc21K+Fx1MDAwMVx1MDAxZNOHXCKwpnOk21x1MDAwMX9v1q9lXHUwMDEzYca/Xlx1MDAwZYJcZstpoeBsl8hzvcm1NqjDf3O2XfTpzSuumMCtautIv3DWuGtX9FdDlYaMjtd37dbLOTD1zvxcdTAwMGaqXHUwMDFiXHUwMDE2t8ZUcTe+/lx1MDAxYqFxP6dg1zBwPKZjwFx1MDAwM/eA1lx1MDAxNEZ9I3ez8SXKftMxkNN+MjBpQJoh9Fx1MDAxOVJIvIJEnlFkT1x1MDAwNNDG+Fx1MDAxY8l0XFxXM4M56HrHXHUwMDBlYe1cdTAwMTGMN5o0eVx1MDAxN+bYXHUwMDAx31NCqmthqlx1MDAwMa6M2PtW62ZAXj+SYnyKUm7Cme1VxK1BdVpCLJcymepcdTAwMTZKXlx1MDAwNCPAlknfeXq6XHUwMDAy4LPlb1B7z1x1MDAxNX2Yerm4qVx01VK9mcLAmGX7tvdmnN94UNF9I/Tn/WlcdTAwMTbQltJOXHUwMDA3r5vxSYwpLOvRTFxuof6bP5bMIIdcdTAwMWRcdTAwMWNcYlx1MDAwN7fwRDR7ek3z8eFcdTAwMTPvniWEf5M8xlr6eYJy2IhWNJ6/Q1xiOnw5sr+Lhawtg1x1MDAxNlxmYa+SXkY07E/9QIQsQtOv53z1v7uxhi/VXHUwMDA3MFxcklx1MDAxYc07xm1cXFxmXHUwMDA2Tem3wtMpYLFcdTAwMDJcdJRAyOJvOvq2w9KmlFx0ZPlcdTAwMDO8XHUwMDA3xY9eXHUwMDA3rPyqpbc/iOVcdTAwMThHXHUwMDBmKmI7KC7P41x1MDAxZFWJNVbHWkU/bTJuIbunqlx1MDAwM6lP9D5cdTAwMWJcdTAwMTiu2uFcdTAwMDSYjqWvXHUwMDFmjItYLE6SyPo3gJWP3X6rXHUwMDE0w+9vOOaJZTRdbTQyvYunNj5cdTAwMTfz+svLV0nhaXllSFx1MDAxNajMsKjuTMSRJFxuPFx1MDAxY2W29/RqL3NPVVx1MDAxZF2c+XqysYVC3L6aff+GSVx1MDAxNqXYzPdcdTAwMDClXHUwMDFl4rOBYFx1MDAwM75UNNZcdTAwMTK730Ers4yTr9lwRmWvMTNcdTAwMGX2XHUwMDA2/a1cdTAwMDdveH5nXHUwMDE4q6ZleFx1MDAwZsWSrD1cci1Dv2KXuzJcdTAwMDT/XHUwMDE4uHZY3V1NaveK0MmyL/S/829CwuD0KSl+kv7dW8nWUi3n+3XGLyv8XHUwMDEw31M5wXNcdTAwMDNccoV9XHUwMDE4a+RHqfzPUrFcdTAwMWRvXHUwMDE4XHUwMDEyXHUwMDEzS1LSXHUwMDE2y+yA9mKhNFx1MDAxZUhcdTAwMTLTi5DqdVx1MDAxMUdEk79eosLY5qVcdTAwMGKd9F3ZXHUwMDFlXHUwMDEzt9fdPqHLtYnG3lBqvVx1MDAxMsMrYDk7t1x1MDAwNS1L0+f75rBcdTAwMTXFxFx1MDAwMsl/npEuz56o9dU9XGIxtychsS//cltcdTAwMWFjv5ArSbyTYVx1MDAwN1AgXHUwMDFhXHUwMDFkXG5GYFovc4au/eJDgM/q6/b2RzyRUSdcdTAwMTZ/h2dcbkbDXHUwMDBi2SVcdTAwMThvXHUwMDFhIaTuXHUwMDFkXHUwMDE3hOvfnTMkMMtb2XDwXG67PqKQt9wloM9cdTAwMThcdTAwMTH015egljbbXHUwMDFj44zOXHUwMDBlqiCp/lx1MDAxYpxZp1x1MDAwMYlMjsKDSl/mw1/qts5PueBccr25zkuiSzFcIs07XHUwMDE21UCROt3CJLmVL/71Nlx1MDAxMbHdXHUwMDE15DtcdTAwMWWIM2S/vUB0wUJcdTAwMDGjv2U0pF/cVS6Nr5CtQnBcdTAwMTmfpvK4JWDHwuS536Wb8z5cdTAwMWa5XHUwMDE5XHUwMDAy+IWdrZrCIVx1MDAwMfReSozwulxyXHUwMDE3ITnp4jZfWVx1MDAxZDaG4Vx1MDAxOMb1P2zwKuRHvnE9dCF/53xcdTAwMTD2SrHP71xcrPdY+FU3L12C4tHEhqTY6+dcdTAwMTHCt9xVx1x1MDAwM9kqfMn8tXt15iZ3XHUwMDExuVx1MDAwYuotZUftaomzem5cdTAwMWFx2duQVGqPXHUwMDExXHUwMDA22MjA3lx1MDAwMo8qf0bJflx1MDAwZjAq3oqeO+mUa8ZcdTAwMTJcdTAwMGIs29NcdTAwMWVtQ11cdTAwMDOcaf6+XHUwMDFmq7Kvj2xtrWOXzPFcdTAwMGZcdE6Pb8AjW5BcdTAwMTn9YtDwXHUwMDE1My9i6ltcdTAwMWFccsuAvzWCSL9cdTAwMTiLf9RcdTAwMTNcdTAwMTZb4FKlXHUwMDE0fD5HMHFf42WyZLxsao2JN3ZcdTAwMTF+ZM14V6uxTOfaa+v/8Y+20JgoakyWIVjjI4nKXHUwMDBlr5EwnVxcxs46XHUwMDE4S/WqZiCF0s9MKn7htVtcdTAwMGVcZsRdRY1aYJVsPcp231x1MDAwMs/9/k7bOMbhXHUwMDBizpyyQf+nXHUwMDFhK6hOKoBmYDjtJ75q4/uVXHUwMDE3NFx1MDAwZfErKWZcdTAwMTePJDxYKFxyjCu+iYvdOnRcdTAwMTh19NpkKoTXlpEkupHb+O4gdiHBXHUwMDE3iFx0couj6/RKXHUwMDAzXHUwMDA1f1x0alx1MDAwYlx1MDAwZvc1+c5AqlxmYEW9gvP421x1MDAxN411XHUwMDExMCC724zs53OaRSpFu9VcbpZKXHUwMDA1XHUwMDFis5CR21x1MDAwMSlcIsU3XHUwMDE5l5L2KaNfXHUwMDE2Slx1MDAxMW78W4/+1JqxUbysLogu6mRcdTAwMGKcdO80If3fefR/5yiTXHUwMDEwXHUwMDBmU+bogip69Vx1MDAwZkuntyz7M54r0+9V57pcdTAwMTesdSC9a4/X6XlcdTAwMTPHXHUwMDE3mjGtMlx1MDAxM/U3XHUwMDE1MTZ4yVx1MDAwMrlj36CgxI+YXHUwMDFjLlGQkzakNFx1MDAxN1x1MDAxMVx1MDAxY92GvGz1TXQ7KdKOg9GqviaY9lxuR5rUNaFLl+vZyoc70I+WgVx1MDAxMrhcdTAwMTKMnlx1MDAxMetcdTAwMThijipxik1BXHUwMDFkj4q2YCdMXHUwMDFmbtiO0CCbXHUwMDE1r2JcdTAwMGX84iyJXHUwMDE4XHUwMDAwdu53+0nlv3Pn2pebgled11xmv/mLr1xmOKnToKe/UdZF2/Lw6fO9XHUwMDEwaFaOhMw/1Fdba+Faklx1MDAwMIhX95XCnlpcdTAwMWX2ynV3gEBuv7rFqZPpLDNKXCKrdKdcdTAwMWEpjMqk7lx1MDAxMW2eWbXRzaBcdTAwMTVJT0z/7rJ1S1x1MDAxNjbDeM9cclxy2Zt5UCRwPmdZ5uGOru8gfzwkXHUwMDE4XHUwMDExzlUoTMac83awIWB4Sr9cdTAwMTbOwVNcdTAwMWG8l6VcdTAwMDVcdTAwMTdzcatcdTAwMGW6zau30nNtQVx1MDAxNFx1MDAxNjNH5Pls31x1MDAwYt1cYmC2XHUwMDExwMi+6OEt5MbDVJ2o59/gXHUwMDEzlqFKhUHzecmqJE342NphgK6YKiNoLqKA2kVm0Z25RSFcdTAwMDH9XHUwMDFh81C06ZWZXHUwMDA1kXOOpuczOVx1MDAwMv4mrVx1MDAxNOQhs1ZT87jV/lx1MDAxM3xoMHBeXHUwMDEwj1Fmel3V1vlVoshntnr7a1x1MDAxOYS8/F1OI4gkXHUwMDEx309StEou4OzvXHUwMDAw565cdTAwMDP+3SP0kav1XHUwMDE4RbnhjVx1MDAxN7RxpYREj2HRf2tcdTAwMDN5JzF25FaA4nUlRin271ZcdTAwMDB3XHUwMDBmKjdvtoTzflx1MDAxMSbeVs5IKuQ8Ylx1MDAxOD92I23uXHUwMDA3XHUwMDFjPp7h1E1jlFinaFuDz2/BwPw1VG7z9yuhJCFDe7NcdTAwMDViXHUwMDAyzZFT7NL3P4CC1b233OFcdTAwMWLQTlx1MDAxN1x1MDAxN232VfdcdTAwMTVuXHUwMDE4e3qLOdTlRftcdTAwMTWQjNrE1m3d01x1MDAxYUtwzotGs1x1MDAxZJU5XGKj+DtH6sKEXGb1pFx1MDAwM7NTiooxIJac9z1TXHUwMDFktbzK0Vx1MDAwZcmG8rBKq7qsSuT3XHUwMDE1/eK0cVDojlx1MDAxNb/g19m3xX5CXHUwMDAyK5n2Wlx1MDAwMFuTyzxboYA8zU1RZNo4nKspiXNcdTAwMDHcXHUwMDA2TjKl/uxG0VHA2Vx1MDAxZrOxj4bMQUf+5JCogo0zjFwiXHUwMDExUvnSenBccidwyDuYUGxiUVx1MDAxMdLGJuKmdlx1MDAwYoHA+Jl4M0Tu8M1mT8JAay6Ty7HrZllcdTAwMDVeelx1MDAwYlxcMcnXXHUwMDEyXHUwMDAzQb+GPMVjq/59XHUwMDAx3CQq1VdxMFxyfngpVDEyqFx1MDAwN/UpyvUge7xLuIlcdTAwMGXSylx1MDAxNn6LWVx1MDAxOGGrJ1nRxYfy3flcdTAwMDKX4H/3XHUwMDA3cjR8XHRXrNpaVFx1MDAwM1x1MDAxMDVcdTAwMDY7XHUwMDEz3lx1MDAwNFx1MDAwMUyBy5CwXHUwMDAxw/fSXHUwMDBmXHUwMDAw97Xj/JfUXHUwMDAylsGic65u0ZQ/XibXt+lcdTAwMTWuJ1x1MDAxMOA+fLNpml8hS8R62Vx1MDAwNYSV0D4rnTIsNVx1MDAxYyeZ/IJcdTAwMTd44/M7zCbEMZjg/ILs7/AjOl1cdTAwMTTjfPSj/VBLLNeyRoK8YIpQUbYsXHUwMDEy51x1MDAxNX2BqU7SyFx1MDAwNIBcItJSd2nOlPzUeiFiXHUwMDA0JOmYK0fcgKb3zob38/u/+zRcdFOUXHUwMDE5vkWoR2uo/uKW6LhPfJvxj1x1MDAwMeuKhVx1MDAxMIBcdTAwMWXTXHUwMDEzxVo94l2vVLVPXHUwMDE2/H89nceO81Bwpfd+XG7DW1x1MDAwZcCcZsdcdTAwMWPELOZcdTAwMWRzpphcdTAwMTPgd1x1MDAxZvZvY1x1MDAwNPSiITUp1a1b53wtVlx1MDAxMfSv8lx1MDAwNz99Wm5Im2GcNv9sv7dU4dJwPkGCb9JcdTAwMDa1cMrfrTLZhd21l+JcdTAwMTEuYzBHbPbmXHUwMDA3J6tcdTAwMDNDRG6VN8DqkS0hqfTwp0nlQSVcclx1MDAwZi/89P1zjHkm3Fx0JM/TV1x1MDAxMDvWXCIsLVx1MDAwN1vxesrE37ggYNA53WaEyU2WNVxikM++XHUwMDFic7BtpP3qJ/bSiVx1MDAwMlx1MDAxMsM/lt6hnF3/XHUwMDFiSbvYedbqQSf0WySnxFx1MDAxNTVcXEtcdTAwMDVcdTAwMDaG2Vx1MDAxYibVQpdK6NReR6Cqc2OHclx1MDAxZSqvXHUwMDBmQ5iPj7BoZVU8XHUwMDEwdDpcIpj2lzAg/oQvuada6MVcdTAwMDHtI11cdTAwMTCcPJ5goqxxoXNdz8RGQlx1MDAxZlxmnfzv4VxmUJ5cdTAwMWQp3WQx/XlcdTAwMDHN/excdTAwMTl03J2AudsnwEby71x1MDAxYWVBc1x1MDAxYVx1MDAxMJuEkN0qdmMgvlx1MDAwZsRcdTAwMWaMV/1cdTAwMTd+qs9bTtmtJu6PXFxj0/4uL69cdTAwMGZkjo6v9zilpYJcdTAwMDV5bVx1MDAxYjTeasjSNoefXHUwMDEwSUkqXHUwMDA2Xoj8aKxcdTAwMDbAj+ndY9FcdTAwMDdhfsqE0qbLXHUwMDEwXHUwMDAxyliSJeVeI+BcdTAwMDLENmRVSVisXHUwMDA3qbDiKKAlp3NcdTAwMWVcdTAwMDY36ohOPtFt7Pa1vixcdTAwMTHXKqSRyURZf8999PGJe1V12fCD2cvfrFx1MDAwNru6ZXcjWYrXcH/91OXqS7uUh1x1MDAwNlx1MDAxOFx1MDAxMnrNXHUwMDEyt7rVQSiLYzl3es2ALuOX5Wj46/f3o+DVXHUwMDE4tpRJto+vXHQo9rpcdTAwMWFcdTAwMDWpJUhSy0ZcdTAwMTKYTLrrY3rxREm2eDjPQlx1MDAwN1x1MDAxYVx1MDAxMlx1MDAwNGDJ2VRcdNi6izltdf1cdTAwMWFcdTAwMDEqXHUwMDFlrFx1MDAwZSnB9iw664Lt31xmzpKrPeWEU8XVXi2D41m0XHUwMDBiLX9TtMtcYslcdTAwMTUud+qEOz39f729ooapoFxyTYw819nW9LTAXHRcdTAwMDDujVx1MDAxOEVFbiBFzC49ypwl0b/+wPyLl2A6LVx1MDAxOfLls8RPu7X8XTC7XGKFv1x1MDAxNagu+V9AvuhcdTAwMDOj//VcdTAwMDXy4n7Gf2WpXHUwMDFlaGjnrJZ97TtcdTAwMWNHioLetFx1MDAwMqTm0HLOmVlvRJPWIXr2QeXp/tIns6lcdTAwMTCwUvtE5vbKUqdcdTAwMTO12Un+fqnuXG65z9W4QX1ccuUk389cdTAwMGJcdTAwMTNGVos0wTiGZVxu4lpcdTAwMTI87Y9/14WqNGv8nGk7jdrevkqqq1x1MDAwMaZE+GadoH2NXHUwMDAytyBJ3Dgm8yykIeCLuZI6tE3XJkNY5UcnXHUwMDA213FEM+Pf7D1d9Fx1MDAxY/356299jeSIPWqZe1x1MDAxYkNRie1cdTAwMWFWXCJL++mzXHUwMDE0jqBkwCRTMSGXMVx1MDAwNudcbjPznGyMnFx1MDAxN1mrVWktwi1/nP3/rnNRUVxiXHRDoc381rdcdTAwMWU9x15E7Xd69fJKwVx1MDAxN1xc3ENvcfb7foSNb8JIr1x1MDAwYqNcdTAwMThcdTAwMGImP8hyXHUwMDA25K1cdTAwMWLtnYPl2jRcdTAwMDWBnjvRged//bQtvIjrXHUwMDA2PNP/9PFcdTAwMDG65GBuzvVaITyFaVonuY1VfH5srOTAmnqENnkzOepcdP5JXHUwMDBmXHUwMDBiKZOC1ea28DYjaFjqXHUwMDBmKJsm2VT5g0XYjmJcdTAwMTBAXyGFVkMkaLFcYtrCzj3Vfv2bS/esdjRd+UfvXWyNnC2k6kv7Tde8OVx1MDAwMIywx0Olf3NcdTAwMDGmVSBSXHUwMDA255Z2RStfY1szWWteI8StXGI/K0w6ZEBcdMb6YK/DqoC4lKB/faOgOZzfymGbzXF4uDD1zZUrMUTi5vJcdTAwMDVeJ/LWqlx1MDAxMk5cdTAwMDP0s/S/2jReyv2/sftcdTAwMTU1YJStdOK2XHUwMDEyfPte/HVcdTAwMTZzi1xiO+sm21+fsyVhg4M3XHUwMDFmUq6rZnVMXHUwMDBikM5cdTAwMGK6MqC0XHUwMDE47yPNVFBcdTAwMDad6mooNWjBa7K+XHUwMDFjs1x1MDAwMvG8btpcblx1MDAxM49cdTAwMDbRtrbg4sreziUszb4wtVx1MDAwMGNXXHRcXCzDXHUwMDE5glx1MDAxY5q0si1i5FjG8iqQmFxctylcdTAwMTVB2n7rMP5cdTAwMTayv3WriEVcdTAwMGZcdTAwMDbdrVx1MDAxMbq7XHUwMDE5XHUwMDE3QVx1MDAxM8/SJWBZPmChk1P+rVwielx1MDAwZpnZ4e1cIkRDXHUwMDEx2JPqXz/zU1JKXHUwMDEyXHUwMDE4fJ99kKaq+lLrJny1XHUwMDEzaGO/nCBpXHUwMDFlJktcdTAwMDbsL/PMp23712dq/JThTUFkSjR8gf5mrUuM12hcciBcYqB2VDdcdTAwMDXJQsdBKXXE9J6pudpcdTAwMDWCq+yZd9xcdTAwMDX3XHUwMDE3U1x1MDAwZVxuXHUwMDE0qq40Jlx1MDAwYsgzXHUwMDA2kVx1MDAxMa68Rklcbpq705WutVx1MDAxYTJcdTAwMTJcdTAwMDFhaNu6XHUwMDA1O2d47X+uTUAw4bGbhN/XS2TuZNK4Nzc+X955T1x1MDAxM3i/Kuh/jpplubJP3PdJTsukXGLvr46wXHUwMDEzYJZfifs3r9SkXHUwMDE0KpUuXHUwMDE0+HBR5k/u7Vx1MDAwMmLabnnz971cdTAwMTDBSlx1MDAxM62sQmxcdTAwMWHvLqjIXHUwMDAzIFx08JfJVlx1MDAwZiRb93dcdTAwMTezNME5RFx1MDAwZrlcdTAwMDTlffl8sVZcdIlgp5l08+fs6S9cdTAwMDFUI1x1MDAwNcnhJM5cdTAwMDTDuX/mvIC/xE3xwFPuKnG93IjkmPFaa119MHfbbneqk3Eyv5R7zrWF7ieau0lm6lx1MDAxNKkg4zQ1R589/+h/uX+M2rzeMHviylx1MDAxN1x1MDAxYutKrlx1MDAwN2VVOV23Zv5cdTAwMDc8hVx1MDAxY3NcdTAwMTiiY1ZPTFx1MDAxOLdK4qqoMfqYQ1x1MDAwNbUwXHLPT/xq5KamRjO+qlx1MDAxOSwqbOv9uHbZSeU+zCtDQ9DbRLGpW+aAdvbDUr5ep3R8xiHTT9lcdTAwMTlIT/RBipP2w1x1MDAxYYlccmxcblxmSa7a/U1cdTAwMTS6TihYXHUwMDE5Z9jFzlx1MDAxNdww6bfQyP2F+qpcdIZv47nYQ/pjVZBDuVx1MDAwNVx1MDAwN8H6c1x1MDAwMNrEwoz5enPNjS4ssVx1MDAxM1k7MrxfXHUwMDFkq71cdTAwMWRBu/aTSjNcdTAwMDLaI1RcdTAwMTDzXCI645/hI1x1MDAwYvbEXHUwMDEw35CfXHUwMDAyXHUwMDA3e1x0UuJYftdcdTAwMTg7lifJ8cOaLFpjrSVYZarcp1x1MDAwZonv3ujRciNZzGLiyzTt5Vx1MDAxMDKbbprlXHUwMDE1a1nZXHJcdTAwMGI+he4hf6Sd+kErXHUwMDFm9/f03TeYXHUwMDA2f6dThTb6pinAUvJNeFu/UVG+aq7A3VIowFh/VlFsxX34aczhZ699Soz79D99+1x1MDAwYmC5gXhfciPzrJmuk8KdxUJqkbIoprZi01xmw9xijOy57Vx1MDAxYsfUwFwiplxcf6Y3PYtKgdJHulNcZvXLvfNcdTAwMGIk/nomX8PEbiW2VDb4TmalT20gI3phdVE3XHUwMDAy36nQSOGj8L7G0Fx1MDAwMbv+WvEghiVmvX+WIW7NSH3cuybSa1x1MDAxZqh/17KlnPpcdTAwMTVi5YWkKlx1MDAxYv/dO1x1MDAwMl8/uzKyRFx1MDAxYtKL21x1MDAxZqPAXHUwMDBi8alAy0tNgv302cDGwNdDmStcIo1IXHUwMDFkWFx1MDAwZeFYp7FemP8gtFx1MDAxN5UxSIRTuJMgjV96V39iUCXXUMCB4WtcdTAwMDY6dlRccrbtvHbCpfecbdJsXXuR6cFcdTAwMDZNiGWVQebUv1x1MDAxOa5ojSRWYP7uXHUwMDFm28YgZVI6pv52na44YFx1MDAxN1TomMrL4lBp/OPTspKv2XaoSfGB82U6Rag3fMXv8OG4rVbnNN+KXHUwMDA127eXUJow4yhcdTAwMTbi8yhcdTAwMDNcdTAwMDXdijhGp2ysoFx1MDAxNEKVPYJcdTAwMTUsV6VcdTAwMDAwRVx1MDAxND395juYg4NcdTAwMTZxhCpcYmxcdTAwMWaxgEyceVx1MDAxOXDUrKQxXHUwMDA1XHUwMDE0lvtcbqNoNy5cdTAwMTdcdTAwMTFcdTAwMDPby8zF1ojyRNdEZ+GFIb3+VpxOffSpm1hhy/u8037yI1xij5ntmMdY0MOM1CZcdTAwMThQN6FcdTAwMTe+V9aIiq5VIaZqMvLavT5cXMJruY1sXHUwMDFlrcq2Lvck/M7hd5V9XHUwMDA1XHUwMDBli8ugaUqHclZngjOvVExF4S/Y2pCEh8zvXHUwMDA3e2irt4mi67FmxOblXHT188KIXHUwMDBl7UiCr3Wd3Vx1MDAwMENohPpzoneHvSYw2TRC6jtT5keVXHUwMDE4XHUwMDE1uO5j0KFC9ifA+s1cdTAwMTJMzGigXFxbhVx1MDAwMlx1MDAwNJDk9Fx1MDAxNlxcPcTGjIx1aj3STD173CiB/rpcdTAwMDUjLnfceEVcYtRQl+FcdTAwMTT0lqnoufNaQ5ptXHLgtTCYXHUwMDFm7eCa24p6vdAyplxifDpcdTAwMDXh0LzeaJOr2sKhdjtcclFZupp/XHUwMDEz7ozX3oE6UFx1MDAxYTbeYsjJIGlq9ivTVvO9XHTH63CO7Vx1MDAxYdbIK54qXVx1MDAxNpJcdTAwMWXKl1x1MDAwZvWOXeqAzCTlZphynlx0dFx1MDAwN+VcdTAwMTV3gnNJTiNcYlxyklx1MDAxMvDJYFx0djBrxVx1MDAwNYuTl8iC917R3EDOpo6Nr3iYuI/mXHUwMDA3VVRsq8ypw0NcdTAwMTlxPz4xxW1Kno29XHUwMDEx/94v1tcq9odcdTAwMDFcdTAwMTKXklx1MDAwNsifPFx1MDAxMCFsjIJcdTAwMDLlXHUwMDEyoaVcdTAwMDeQyJu199V93eMgPTO6XHUwMDA22Gr9XHUwMDEzXHUwMDAz21x1MDAxNJbvXHUwMDFlXFxcYkrfPMD2XHUwMDFjq4c1TEIzXHUwMDFjhs5nVlx1MDAxY8Kn/mbBi6lzjTYh//WK6r49XHUwMDE0UcBcdTAwMTl1dUd2LNyUXHUwMDA1bmO4Z7JcdTAwMTj4r6SN+1B8pZiVhZUxvn5cdTAwMGX7d65cdTAwMDS6sVx1MDAxNIHNhtFJ+X3Vrc36+VXrUspcdTAwMGVcdTAwMGJcdTAwMGLhVTlN89NcdTAwMTXu85BcdTAwMTFcdTAwMGa29Vx1MDAxYTGWr9p+4Nu24Pks/6GrWEl2ol9fa8FyLPe1XHUwMDA270LHXGbJh+LmuOBL7MSyL69cboBAWlBgU1xmPUDMO0b3V6+BUVx1MDAxMlGrgM5OXHUwMDAxNbmZ4l5cdTAwMDeqVlx1MDAwZb+16NBoIWVcbibJXHUwMDAw0TtcdTAwMDBZe0B0KKqBJbbnzoLnWr4jaKpffthUOuy5kIzExIMgXHUwMDA0jpRcdTAwMDHGJVYzeiydgUmd7icrlYu2lFx1MDAwMCp7rlGlXGYviZnw41x1MDAxN9FcdTAwMTTOXHUwMDFh7ihcdTAwMTGOqnbiWr4lIeFKzmfmxDKQ0Vx1MDAwYl+DXHUwMDE2adQnWVxmwrW2SqAxUviZS1liNolRS5ZnXGZcdTAwMTeT01x1MDAwMWUnp/BcdTAwMGW/clx1MDAwM/46WYdcIk2/XHUwMDFh8khcctBcdTAwMTRcIlgsXHUwMDFjNO/EPG29XHUwMDEzXHUwMDE2slxybPyh6itcdTAwMGKDVO7FXHUwMDBiNlR+cb9bzvlcdTAwMDV5akdcdTAwMTJmTjs+PDB7eDRcdIuNitokqDxcdTAwMWNcdTAwMDZcdTAwMTDZhfG3ytyx/dD5W1x1MDAwMKmqI5j8XHJ5wrNcdTAwMDDzeUuHr0Q1vLbZZ1xyXHUwMDFi1lx1MDAxY9bOaVx1MDAxM9xwXzbY5/AkXHUwMDFhM+TMw1SQXHUwMDEyKs/VrFx1MDAxZG9H4Fx1MDAwZZhcdTAwMGLamlaYu8hYV1RxxVx1MDAwM2DQrF53UJKuU9Nq0jZtJki2uXfzlEr4ektccm/LVW5QnuoghVx1MDAxMrSxXHUwMDE32Vx0Sss9cyPIiD3qzIiussXWYTbSTlx1MDAxZF1C7WDD+MXc3nJcdTAwMTmcYbtYu1x1MDAxNzpcdTAwMGZcdTAwMDNcdTAwMWZcInCS1EKQvam6YLg1XHUwMDE0S3xcZldcblx1MDAwZclcdTAwMTFcdTAwMDamhoVcdTAwMTWc0bHwrDzY/Fx1MDAwMPosPtG6XHUwMDA1op1xreXIQHxfhflcdEbFUlWdXHT5VZuKVnYhkyXk5Vx1MDAwZstgK9brS3KjWTbbmdXz3NhcdTAwMDBFSGOkyywsSEw8ff5QXHUwMDA3TchcdTAwMDW6VTDVolx1MDAxNK3po/OIXHUwMDA3v/khK1x1MDAxMUphXHLmvfY1JstHtY9J/0pa9EVxVpGqLalbQo5PeO6yg1x1MDAwN93q6j6zXVx1MDAxZKY7Jnzg+lx1MDAxNS7J1Tufp1eaUOWQ3dBd7aGLRFx1MDAwYky5Pouw9vtH+6lS76/AmSSve/4tu622PJs6eLt5tVV9MPz5tGI5Jt7QZGPp9Vx1MDAxYtFcdTAwMWLQ01xmJn2dxC6PJ0KMXHIktN9H/oYzNcZcdTAwMWR5+ntcdTAwMTDlXCLgtG9cdTAwMTX5Jq6s5DhanUfVV3tcdTAwMTPVk/vT1e1G1ryjqC9lcVxuNn9cdTAwMDJISEstXHUwMDAyvrTUv1x1MDAwNFx1MDAwNF1cdTAwMDH7Y/pCZFxc1oPh+M7ablx1MDAxZaAj2liUMe+ii1x1MDAxZG/SXHUwMDA1Jlx1MDAwNH7i+S1cdTAwMTMkeIp0Zlx1MDAxM86YOlx1MDAxYbOOXHUwMDAxXHUwMDBiXGYyjlx1MDAwZfhcdTAwMTCsNk2SmkphXHUwMDBiedMyy6tDPHdcdTAwMTKKNrCNXHUwMDFjtOZ4ILnTUpVcIndeYWL8hC5xh1knPmGY7cOMyEx264ZvtIdcZnHtZ6fqsS6By3zM4lx1MDAwNUNHXHUwMDAwXHUwMDEyMv64aSiB4rqLXHUwMDAyiZQhfc6tSUhJ7kFstFx1MDAwNlx1MDAwNkOuXHUwMDAzSVx1MDAxZradwVx1MDAwMvSNXHUwMDA3QmeZ9qBcdTAwMTVcdTAwMTfzf2fhXHJ5Qjb9sFx1MDAwZbhcdTAwMGXE4pmFxqFcdTAwMTfmd1xmi3hcdTAwMGZdnNr9NnOPNFx1MDAxNYHpp1x1MDAwZVx1MDAxNiNcZv7urODxXHUwMDAya64w+Lu3et70k7skXHUwMDBitKNcdTAwMWX7XCKZ6Jq141x1MDAxNdmIXHUwMDEwxYkuXHUwMDE3OqehXGbIYb0v4vdcdTAwMTj7L0a8L1x1MDAwNWVsTVxcxe8nXHUwMDBmeFpcdTAwMDSgcvTUKlx1MDAwN41Yfvx9nZPBdHtcdTAwMWPX4lxueP1/rS2UnHxmxVWGyk9cdTAwMGVfXHUwMDBlm3XPVcrwVYdacUrfde64pSB3I5JcIi1Fi32LKWXRXGbg7fJcdTAwMWVMa55FIcnDgJ0gwJBcbsneajjs6r2oKC6v0Ca1x2ylWe58WXyyXHUwMDEwRDIt+HFkY8TsSFx1MDAxZYArI5L62tSCcVx1MDAwMSXi+u3L2a378UOs05D9m8hjf9ZAR0/pXHUwMDFmmOdne2VKUSrU9kCPc+nZRVx1MDAwZlx1MDAxMyffSlx1MDAxMJPeuFx1MDAwZXxcdTAwMWKP73axnDqd4Vx1MDAxMZo8SE/J/UPH63XrMFD+wLdcdTAwMWPNP8e1vtL+wPGXXG7sXHUwMDA33KVqXHUwMDAyinIoel7Rb+2C9sbvMlx1MDAwNWBcIuz4PEGi16GzTXljT1x0XHUwMDFjXG7Aozzalui26/GLUu5cdTAwMWHjrMzBpEy7jZSYLVY2izZcdTAwMWSiYFx1MDAxZDQnnimfPY1pU+BcdTAwMGa2ZFx1MDAxMMYwvv3ht5F4PvXBS85sXaNOXFzqXHUwMDFk/1x1MDAwNIBcbp1cdTAwMTZidqDSY2a+OFtcdTAwMDXYg7/Ffuc/XHUwMDEyd4YzqImEmFpKtKFcdTAwMTKCkm5cbtFcdTAwMTmkVe6L5qpcdTAwMTnzlf+GdCyN01x1MDAwM5FcbqvP5ZNcYp/IdezM735Ay3r8zqNcdTAwMTBZ8flyXGJ8yFx1MDAwMO1cdTAwMDDpmkGHXHUwMDBivdr413eVXvfE5627lOtDmtZ/v3GZm3hg3bxcdTAwMTc2yJlwP4Mw9mhEvpIpM3Il21x1MDAxNiVEn3wnuSFcdTAwMDGAosD7tm/8YIGb9lx1MDAxZc9cdTAwMDHFXHUwMDAwMLHbXHUwMDFmd1x02XONXHUwMDA3OOfnYlZLZf343ZZa+n5dndxRLS7Yf7faebk28qrWpalcYvtmXHUwMDFjhIHSvEFlnct64E8knp6scj6NX41PTV1S4HJsXHUwMDE51laNhVb6JHJezL6tejFcdTAwMDdidXZFPsWRZDiNivX3XbLD7Fx1MDAwNthi1IWdMrO/KrA5pH62XHUwMDBi7zCusWVryIxXwSuBelx1MDAwMvaPgUuk/sBcdTAwMWGLJZK/lnXErcjsf2ZZ0L17LTCfe+zezJxV8PfDx0GzXHUwMDExpeJdPb8oTS01+ifImlx1MDAxYW81Vlr/Nlx1MDAwNWcxeyXZ3KdcdTAwMDPo1Vx1MDAwME1cdTAwMDfBnuBcdTAwMWVcdTAwMGL8XHUwMDExa77mPVx1MDAwMeTEjpVcdTAwMWM20497wmhcdTAwMWRcdTAwMDTRT1xmp1x1MDAxZj1cdTAwMWXIqC6gO8zH82RcdTAwMTFIpVxu9PJcdTAwMTO47z4wPMV+vlx1MDAwMTJEUcOwg+2vi0KigmvplKNcdTAwMWLnbWblVntLrlAu3PPGXHLPbVx1MDAxYrrgXGLuslx1MDAxYVx1MDAwYvwqXlx1MDAxYuZhLq6ol1da+Vx1MDAxM3RguSxGp1x1MDAxZHeMd9FxQstUl3NcdTAwMTJ+dVx1MDAwZYmP3MX0i/A4So+7UKf5XHUwMDAysFx1MDAxZu/ThONrMLPfYdX36kDfXHUwMDE5dlx1MDAwZWT40PhcdTAwMWHHVSt8XHUwMDFiNrCT3fv8sm+dXHUwMDAyilx1MDAxMel7q2+bXHUwMDA0XHUwMDFj8tWRKz67g/Zu2CSYe1+c9FhcdTAwMWaHXHUwMDFlVbdcdTAwMDEjw4W8mPtcdTAwMDMgeKtcYj1rKn7OzdtbadhcdTAwMGX/jrtcdTAwMWYwXHUwMDAzf7ruYVxyo590XHUwMDBikpj761xcfVx1MDAwM7eckJNPKUKTwTDfNSrkt1JcdTAwMWWaOCTFtbhcdTAwMDCLMN/Nm8f1+4Htl+3ctFx1MDAwZqBQwVx1MDAxZFx1MDAwZXOyLX65MFx1MDAxYZ9UPixBq8OHRFhQ8lx1MDAwZU4nXHUwMDAzXHUwMDEwjVAhSHJbvrl4W0ehaJd3Vb2JXCK8Wm7SecRccrTkfs9cdTAwMDfKbDFdyJee1dFzkeZ3XGKy5dIsLVx1MDAxONSQ7OXv21xioC2bZXqpzIKVXHUwMDAxzjGAaUzb4VpcdTAwMTYr4/5cdTAwMTf3m4ZiMiaat1xcff1ccsQvtlxmKiUpffch0Fx1MDAxNUfwqr5cdTAwMDU+d25ZIy2vTpk+TslcdTAwMDJogOdNNVFcdTAwMDZcdTAwMWFnXHUwMDE32UdkQ/6uLn11on/CnrVuQJtcYkNHxcWrXHUwMDA0XHUwMDA1qF7DXHUwMDBmnrp7+5iNiJjxmlx1MDAxNasq6Fx1MDAxN8ne41PHt1byXHUwMDAzN21cdTAwMGWHfCRMiLdcYmgwxP1d6OlRb241SUJv5YDc/q/yfXV8ZFx1MDAxMVJcdTAwMTGDanWjlJyKJZ0kgpKNeHBw4cFYiqpcdTAwMDFyvs7NXGZ2qEuM/oS1nmi1XHUwMDFmP1x1MDAwZiXXmFx1MDAxZiRcdTAwMTdrxJJcdTAwMTF8KbRcdTAwMWJcdTAwMTLNYEdmXHUwMDE4XHUwMDAxT1Nkm1x1MDAxY/Tq61x0Sp1BZqpcdTAwMGau0Vx1MDAwNrOMLVx1MDAxY3Ys8XhyPqBod1NLpOFcIo5cdTAwMDQvRIGyO3dEY1x1MDAwNDulRVx1MDAxOV9Keaa2iXhLXHUwMDE3lCazzS/nL/JcdTAwMTadVcdDuF3W8jlRXHUwMDFhlGTkS2Gcdv9M9WPz4baC8aY8LTS9WYtcZoFcZlx1MDAxNpxt5ls6oEOEJWPr8V01x+58s6/J9VKsNaZcdTAwMGb0I6ls3ndzXHUwMDFmaGos/HaCmFxuT2v1ZYZ3ze9M0lxy+9sor0/5XHUwMDE5Pco0TspcdTAwMTE7YNSpVIxZXHUwMDE58tBPRqmnTHtcdTAwMDT4flx1MDAxOIvo+W5wXHUwMDFkL/VcdPCbXHUwMDExl6Q2N1x1MDAwYrDSW7e6fM/zzWPwXHUwMDA0Llx1MDAxNPXVXHUwMDEwoVxcldjVcFx1MDAxN1k7XHUwMDE1UNBcXPJkg5WPhNvvr3X2jIJUjyooospcdTAwMDYkr1U7LFx1MDAwM6+XoFLis76Shm2RXHUwMDBlXHUwMDE3k+9cdTAwMTFj9Fx1MDAxY5Agf2xcIjzjnLBLWIdDOSqfsYO4ruqjvb/yRHGBmcl+hpYpupJ9XHUwMDE1dlx1MDAxMTqh+/S4fOucOYN4q1x1MDAwMiRcdTAwMWZcblDUdWl8RsxIs3/nzlx1MDAxMJjkPCZZ9GRcdTAwMWPR6eXGXHUwMDEyLZSX1Vk9hSmrVM307Fx1MDAxZMgofnJkYzrmvlx1MDAwMVRZXHUwMDBl/knDXStcZojbIeu4w1x1MDAxMlNcdTAwMTIspz3oXHUwMDFmfsyyO/039D4xXHUwMDAz/YD6kDlVh6PnkLFmhlgubmqspS3nfN5cclx1MDAwNVnoJVx1MDAwMT/i7le/XCLG0F52gWuiauHz+qDgIZ3qQ3+fMVx1MDAxOC2c9Yvn9s/xhYpcdTAwMDXPqC0hXHUwMDE4kPzA7r9YtH+x2NOkXHUwMDFkL3BcdTAwMWHn6ZLfva5p4NFer78swlx1MDAwMNVMdlx1MDAxNz6w17mRL1x1MDAxYY21+Vx1MDAxN1wiUzhGM5OiXHUwMDA2XHUwMDFm9+XU9eN83lJJXHT2Jsj73Fxukk9cdTAwMTJLe7xKdk/FrIubXGYwKKj1XtZcdTAwMWEg9dZjXHUwMDBmXHUwMDEyb1x1MDAxMlx1MDAxNHZcdTAwMDaOMcaRW1tcdTAwMDA0xlJTbytQnkmnNC9wwdSw4ZKBpV0t7LlcdTAwMDD2y1x1MDAwNFv0/lwikJxcdTAwMTX9LrTAxGjhK0ktsCW7N9CGk9/BQEhcdTAwMDW99lx1MDAwMWDSb8NEXHUwMDEz2Vxy/1x1MDAxM1x1MDAxM3Skz5tyXHUwMDFi2Nk3SCPWYm49yaCRedpcdTAwMTReXHUwMDA1JighQfDoM/5Y3rUxkqXVLfJxbvZrh8ZWnD5TXHUwMDEyUIRRXHUwMDAwZWuXmtnXXHUwMDA3fS3YrqYvXHUwMDA1XHUwMDExbfnTv5xcdTAwMWVPS9VcdTAwMGKa1JpZxZPzN/xcdTAwMWNgwGFcZlx1MDAwN+tJe1nj+NmPOaRei19cYlq2KFx0R8XTyLx/gsxcdTAwMTSjiYpuaHmakm5cXEzJc1Xch0TLXHUwMDE2bLw3ZFx0ZJ7cXHUwMDBmnSqKqPxmf679SMaEXqiL4DU/fyqHnyk1i8DZVFx1MDAxZVx1MDAxMGSlv/uxQsi3t1mxuDNcdTAwMGJcdTAwMWZ2smiJp1x1MDAwZatEoiZcdTAwMTKMPzm749mDzcxf2jQ7hp5Oy9CS6N9jXtdUy1JcdTAwMDL4sjCoueab7zLYTMRcdTAwMGZYsFx1MDAwNlx1MDAxMVx1MDAxN1x1MDAxYZPqX1x1MDAxZczYw1x1MDAwM69lr7xOdqcmXHUwMDBiXHUwMDAxQfnTXHUwMDFhy3u6UFx1MDAxM1vbJNX9b0BZp4DpZ1x1MDAwNlx1MDAwM3cxXHUwMDA2uoHLY7z02OGl/MHeJJ9exjMpXHUwMDA2u465y1VcdTAwMWHtWdDn4eyNvFx1MDAxZPY74PJ/01ldXG5sPmOlXHUwMDFjgoJJWVxc2VlXveeVUvyp5No+X6RccizXP0pcdTAwMGJ5af0+QnxcdTAwMGWGPn5Rk6nCROVcdTAwMGbLxyp+e1emNjj+XafP0D4xXHUwMDA1lHCxxFx1MDAxZnXVP1x1MDAwYqBcdTAwMTCxk/xQwqU65st1nOtkcFx1MDAwNfE+4MkvKlxyXWpgKXOff/Fqv+uwktRcdTAwMTCc1GRSQym4L2eYd2fSM5nQMmZ1vyGFRcDkw86gviFUqT/lL/dcdTAwMGJIWMxXXHUwMDEwbdurXHUwMDEzmDuJXHUwMDE342EsOUN/Ko77MrNcIlx1MDAxNUJW/5Hl8KXxJlx1MDAwMVx1MDAxN8dUwo3JcOT1jpvHm1wiOrBlYFx1MDAxMayoWaL8pyXjtTicZ3O2+4X9XHUwMDEwPiOChmBcdTAwMWXLyPmMN5DLxkQveCqE8oo3z2f/Tf2ww0OdXHUwMDFldKFW3lx1MDAxOGRcdTAwMWPeXFwvXHUwMDEypnJeZVx1MDAxNPOpd2P7sLCUfuKuXHUwMDE2LOgwjDJcdTAwMTczNJBPVkiX1SW6L7ZzqXA9ezyDe3b79GjYsFnUk+xkXHUwMDFj/L5Nqlx1MDAwMcjMlZ/4XWCN0Fx1MDAxYYQ6bSbM8EFmoFxyWbZiOeluiW5cIpXD5FE9dVx1MDAwMnsuVDP4aZKSZjnFyZk5P7qF5XFXPi+qvzLBXHUwMDAxKtdcdTAwMDVcdTAwMGLHlZOxtDlcdTAwMDZOXHUwMDExOOGu80zftEFoIaLg6JWBRL0492eMsmA2Mlx1MDAxOWUudj5cdTAwMWPwnPXyW1x1MDAxY1x1MDAxYvlcZn//n0ZzMITuzfrm1FvGyzTrnFxis4crXHUwMDEzXHUwMDBm/tGolFx1MDAxOV/7J4S2eoBcdTAwMTVcXHEvm5Rnmv9cbu5cdTAwMGJcdTAwMTG7SFx1MDAxY1x1MDAxNr1cZpaJSD6CjkFcdTAwMTWb8Pd3nk1QXGIs6H6ayHVNTLk49dfN6mKCqoaDUlwiOFCGgXz1j5uk+HLdIWtcdTAwMDakdFx1MDAxYX5cdTAwMDNcdTAwMGU/rVx1MDAxNbNcdTAwMTRfY8NMhyaI7ybmcbbUacu3XHUwMDE5hkUm1Vx1MDAxMURcdTAwMGZCklx1MDAxNliPWD94hm70VGxBhDaspVx1MDAxN+VcdTAwMDOSZXHbaE6Rxz3uXHUwMDAwWVx1MDAxZD7x1fE5j9mLT4dcdTAwMTK2MtGr3cOXY1x1MDAxMNvfMVx1MDAwNCHTJT6Kl8RcdTAwMTnQN3U1XHUwMDE1a1erN1x1MDAxY+9cdTAwMWVcdTAwMTeq3Vx1MDAwNt/n9Et97DCfIVx1MDAxNv81z9RcdTAwMTdBr0dt0WeOrVZ59XLPfa2Ak/GUSiq/XHUwMDBlylx1MDAxYVx1MDAwYoJcdTAwMDBcckJcdTAwMWKPf83I4VxmXHUwMDE4XHUwMDEx/cw9TSlVsTrlgCxhavTLeZPHXHUwMDBmVsjv4uZhq4vVfpWgmVVvY2yQgquy4NF0aa1cdTAwMDFUmzxcdTAwMWaP+1PnuTx3dUqPR57aOpcuqnzgcV+jPu5cIvPVXHUwMDAzNkApXHUwMDFmXzbrQ/6NmN26XHUwMDA0+9joNJZvyFx1MDAxYbqeNkCqglx1MDAxOTYxUrq+p0DMXHUwMDE4PN021Y/mT81C9G5/sGwjrMa8Klx1MDAxOKxcdTAwMWTOnK5cdTAwMDGj9PVqTkC6znKtXHUwMDFlcYhF+tdfVM8vNFx1MDAxN/dcdTAwMDF4KJkrR8VxomQooFurmcssb01f7aNN0pU95ETkmZxXR3P+XHUwMDEzcGJW/IQsXHRcdTAwMDDcrDiLs1x1MDAxZJxcZta7NtN0T7P0q519yOy8olx1MDAxM2HNN1x0taFyW1x1MDAxY+2pU1x1MDAwNlxc9VZcdTAwMWSpJj1Q/1x1MDAxY7PP5Ibk2u35/eVwaHC+aCEn4lx1MDAxMro9nmz9Jlx1MDAxM7CDJZtAeaqFXHUwMDFiVli1hebrLVY3mzBVp1xmjf9cdTAwMWR8eb5CgtdvRd0vYeE5Nj1Lx0cmXHUwMDBlZUP5zII3Vjdyyvbn71x1MDAxNtQ6vztcdTAwMGKnPvZcdTAwMDQ+1THhXdw99Xs87t/xqvt55bR8nY5cYnn2ev7c+X3P9eC/RSiE6Fx1MDAxY1x1MDAwMbM9/LQxJOkhaI5cdTAwMDacXsUnPd3KOVWB4SY08dr2qHMxWFx1MDAxMVx1MDAxNVx1MDAxOL/DWslcdTAwMTLt21x1MDAxZpXLZy504tWiZ1x1MDAxMFxcXHUwMDA371x1MDAxMDZyy7feclxyIPF7zGRsSTOjcehcdTAwMWOrXHUwMDBlZMyeLVx1MDAwN9AsSv1moZiCXHUwMDExSlK0/rJr7Sf+zPnpJ4XMn65DyXx4V0xcdGX+04hcdNzOXHUwMDFmXHUwMDE3Jy/32Vxyc9mx5Vx1MDAxMOTP0p3kXHUwMDBl3PAjXHUwMDE5i41aXHJcdTAwMDEnW7hQ9Nw0yUGz6p/OduRNhlmByVx1MDAxOMZDyrqhuO5A0cuSIJpcdTAwMDCfuF3zb2BvXHUwMDFmribaStZcdTAwMDFcdTAwMWRcdTAwMTidn0v0v4wvTFx1MDAwMjlcdTAwMGZhoKAhZ6AlgpRExTnsJ1xm47JcdTAwMWJcdTAwMTmTpfFUJZOyMOySqVxcSjdufDXRffF292O+dnxQNsehjtG/sVx1MDAxM9nUXHUwMDFiXHUwMDE4ypVcdTAwMGXli11cdHOy4/uqv1tBxyrZyqx941x1MDAxNq4u4URcdTAwMTL+udapTKNvomNtXHUwMDFiYM2o32lrKozYV01cdTAwMWP79TNilIuVTILHzdBbV8rDXHUwMDBixtuQuaz417u/Qcqq9mdcdTAwMThvXHUwMDE5f1x1MDAxNnNcdJish1x1MDAxMGrOqJlXXHUwMDA3019cdTAwMDLUKEPIZT6qXHUwMDAwM1uiVpRmZTX1YFx1MDAxYpVPXHUwMDA3dFx1MDAwYk6/XHUwMDA1wi5xKUNBjFxyMS6z/kQ3VH7PXHKVcT/WqM34RiE2Z8VcdTAwMDJ45XPjXHUwMDEwJnrL6FVq25Cg2ddcdTAwMDaMSJmqhiHwrrpHUK9cdJKpZmY+zfKQXCLJXHUwMDFhM/BbaPq3KmC7nOBcdTAwMTHFpWokXeJyp85Uiv5cdTAwMDR9NbjgyVxih6rzZHm7/alB9XWTPUwxXHUwMDBmk3VcYsO/YWZEdv2qXHUwMDE3i5PdlD/xXHLrpFx1MDAxZJvWKIbp7iVkR0mPXHUwMDBm7uAjVfyKXHUwMDA2XHUwMDFkXG5ysJXbXHUwMDAzcHunXHUwMDE0xpot5OxcdJIkSYNcdTAwMGaoXHUwMDE5XHUwMDBizsQ/1MNcdTAwMGJcdTAwMTJP0OXQUeblcfF0UIKdqyZb7YH5sZrtb/rBcf/82ihLPqtcXNHzXHUwMDFiKPmMoFFcIsZw8TM3XHUwMDFlolx1MDAxOVNcdO76rS3r5fHdXHUwMDBm+EJpXHUwMDE0XGb3haqB82j/XHUwMDE24ICB3br2klx1MDAwYvhI6Fx1MDAxYbPaXHTO6FB+o/qOXHRcdTAwMTEx4TufiNDK237EzNsw3vk/+KreXHUwMDAyYjtfJWi+LuVfL87qySnqPlUtXHUwMDFmXHUwMDAyXHUwMDA3Q6ddrFx1MDAwMD/pgntcdTAwMDJvVHBJUFpcdTAwMWX8TnbPw2mK8p6EvvplevSVXFzejFx1MDAxNf1cdTAwMDSCZ0G8XHUwMDA2QZzRS9eVlPmeTffd2Fx1MDAwZbWM8SVs/zNcdTAwMTBcdTAwMTRcdTAwMTd9W5dcdTAwMGLTN9+LmtdpJcGPd+HilGm6RuBnVkK+Wtr1OGrb4F+rXHUwMDAwNmHzOfir8knhdVx1MDAwNFaN5lxcm5fmW7J5RYK47YeN4Vx1MDAwNz+0zKdGj6E7SPKBmWpcdTAwMTlcdTAwMTlcImlcdTAwMTMh4G2QW9H1n9V9N5vgNfBP31x1MDAwMJDBZqNcdTAwMWL1gWMzZ1x1MDAxNSGZ51x1MDAxNbyORFlcdTAwMTDnXHUwMDExgCwgfcxcdTAwMTdWx49gVJ8qtzVkTzJ88j99zK2vrqx3OPTww9elXGIoM4QuI/6UnNvr1mNy299sXCJfnVYvXGZi+1nH1CDSyq0tquQycWihsNpjckhzXHUwMDA2YTP7XHUwMDEzXHUwMDBipGvI51x1MDAwYirl51JKceSMasRIr2DAOlx1MDAxNZVUezgtbsUymbTcYPruTVx1MDAxY0Rccmj/XHUwMDBi2F/Goj5cdTAwMDJD5qpcdTAwMDJ5vCTWMmbun9P0eNtnLa+oXHUwMDA2X9Aro1JjkXRB5ilcdTAwMGJ8OZhcdTAwMTiTL7/i3ajRk1x1MDAwM5HK08i8gUKWsW/gpEMp8veqwc3QrKy0ibppSl1cdTAwMGV1i7Qkkto7/XlQxVxuhb2SXHUwMDE1/1xiXHUwMDAxXHUwMDFiXHUwMDA104qti1x1MDAwMbtcdTAwMDSiqzv2ZlFmTL60XHUwMDE4fKZcdTAwMTCHTcWtSlx1MDAwNqus1E0ti8xuPvt+RTq+7WxHYayQaz5bXG6RXG5sZVJccmapwm36+k9cdTAwMTjmoVTtVnSwjcBSjXllfWhoMMNiXHUwMDAyIJLD2YFUfdDLXG6cXHJm/6Kc6MaIcTfRW36mji/NXHJcdTAwMTHdXHUwMDA3Pekvm3BmJL7msntTwvEtaGJcdTAwMTRdL6Y7kkl9tbSFf9TO0nxcdTAwMDAouZNDqERQYjZlutRGmove/adYsjdJuoZcXHXvOd3bXHUwMDFk0ndfM0NcdTAwMWRcdTAwMTGcVVnya11ZXGZcdTAwMWRUoIteoy1VdEDwwdxKzV6zzSQgaLxUdcTUepX9XHJcdTAwMTi/XGLyso/fxFx1MDAxY8zfQ+hFt/vu9sBx//V//uM//z3+641Islx1MDAxNfl//d//hElcdTAwMWNGKVx1MDAwNEdQjET+//N9sm5OsS1Ncfzvq1xiXHUwMDFjgWlcdTAwMWPGaFxm+/ei//6Pv5///n9Aam99In0=KafkaClientSaslInspectionFilterKafka BrokerHandshake RequestHandshake ResponseAuthenticate Requestif [authentication succeeds]Authenticate responseAuthenticate RequestFilterContextKafka BrokerKafkaClientAuthenticate responseif [authentication fails]buildSaslSubject(authzId=bob)clientSaslAuthFailed(authId=bob, exception)SaslSubjectBuilderSaslInspectionFilterFilterContextSaslSubjectBuilderclientSaslAuthenticationSuccess(subject) \ No newline at end of file diff --git a/documentation/0.20.0/html/kroxylicious-operator/content.html b/documentation/0.20.0/html/kroxylicious-operator/content.html new file mode 100644 index 0000000..d724d78 --- /dev/null +++ b/documentation/0.20.0/html/kroxylicious-operator/content.html @@ -0,0 +1,3100 @@ +{% raw %} + + + +
+
+

About this guide

+
+

This guide covers using the Kroxylicious Operator to configure, deploy, secure, and operate the Kroxylicious Proxy on Kubernetes. Refer to other Kroxylicious guides for information on running the proxy outside Kubernetes or for advanced topics such as plugin development.

+
+
+
+
+

1. Kroxylicious Operator overview

+
+
+

Kroxylicious Proxy is an Apache Kafka protocol-aware ("Layer 7") proxy designed to enhance Kafka-based systems.

+
+
+

The Kroxylicious Operator is an operator for Kubernetes which simplifies deploying and operating the Kroxylicious Proxy.

+
+
+
Additional resources
+ +
+
+
+
+

2. API concepts

+
+
+

The Kroxylicious Operator uses a declarative API based on Kubernetes custom resources to manage proxy deployments.

+
+
+

2.1. API resources used by the Kroxylicious Proxy

+
+

The operator takes custom resources and core Kubernetes resources as inputs:

+
+
+
+
+ KafkaProxy +
+
+

Defines an instance of the proxy.

+
+
+ VirtualKafkaCluster +
+
+

Represents a logical Kafka cluster that will be exposed to Kafka clients.

+
+
+ KafkaProxyIngress +
+
+

Configures how a virtual cluster is exposed on the network to Kafka clients.

+
+
+ KafkaService +
+
+

Specifies a backend Kafka cluster for a virtual cluster.

+
+
+ KafkaProtocolFilter +
+
+

Specifies filter mechanisms for use with a virtual cluster.

+
+
+ Secret +
+
+

KafkaService and KafkaProtocolFilter resources may reference a Secret to provide security-sensitive data such as TLS certificates or passwords.

+
+
+ ConfigMap +
+
+

KafkaService and KafkaProtocolFilter resources may reference a ConfigMap to provide non-sensitive configuration such as trusted CA certificates.

+
+
+
+
+
+ Diagram showing the input resources, KafkaProxy, VirtualKafkaCluster, etc, as boxes, connected by arrows representing the references between the resources. +
+
Figure 1. Example input resources and the references between them
+
+
+

Based on the input resources, the operator generates the core Kubernetes resources needed to deploy the Kroxylicious Proxy, such as the following:

+
+
+
+
+ ConfigMap +
+
+

Provides the proxy configuration file mounted into the proxy container.

+
+
+ Deployment +
+
+

Manages the proxy Pod and container.

+
+
+ Service +
+
+

Exposes the proxy over the network to other workloads in the same Kubernetes cluster.

+
+
+
+
+

The API is decomposed into multiple custom resources in a similar way to the Kubernetes Gateway API, and for similar reasons. You can make use of Kubernete’s Role-Based Access Control (RBAC) to divide responsibility for different aspects of the overall proxy functionality to different roles (people) in your organization.

+
+
+

For example, you might grant networking engineers the ability to configure KafkaProxy and KafkaProxyIngress, while giving application developers the ability to configure VirtualKafkaCluster, KafkaService, and KafkaProtocolFilter resources.

+
+
+
+ Diagram showing the output resources, Deployment, Pod, ConfigMap, Service, with arrows showing the Deployment managing the Pod, the Pod mounting the ConfigMap, and the Service selecting the Pod. +
+
Figure 2. Generated Kubernetes resources and the relationships between them
+
+
+
+

2.2. Custom resource API compatibility

+
+

Kroxylicious custom resource definitions are packaged and deployed alongside the operator. Currently, there’s only a single version of the custom resource APIs: v1alpha1.

+
+
+

Future updates to the operator may introduce new versions of the custom resource APIs. At that time the operator will be backwards compatible with older versions of those APIs and an upgrade procedure will be used to upgrade existing custom resources to the new API version.

+
+
+
+
+
+

3. Installing the Kroxylicious Operator

+
+
+

This section provides instructions for installing the Kroxylicious Operator.

+
+
+

Install the proxy operator by applying the proxy installation files

+
+
+

Installation options and procedures are demonstrated using the example files included with Kroxylicious.

+
+
+

3.1. Install prerequisites

+
+

To install Kroxylicious, you will need the following:

+
+
+
    +
  • +

    A Kubernetes 1.31 or later cluster. For development purposes, Minikube may be used.

    +
  • +
  • +

    The kubectl command-line tool to be installed and configured to connect to the running cluster.

    +
  • +
+
+
+

For more information on the tools available for running Kubernetes, see Install Tools in the Kubernetes documentation.

+
+

oc and kubectl commands

+
+

The oc command functions as an alternative to kubectl. In almost all cases the example kubectl commands used in this guide can be done using oc simply by replacing the command name (options and arguments remain the same).

+
+
+

In other words, instead of using:

+
+
+
+
kubectl apply -f your-file
+
+
+
+

when using OpenShift you can use:

+
+
+
+
oc apply -f your-file
+
+
+
+
+

3.2. Kroxylicious release artifacts

+
+

To use YAML manifest files to install Kroxylicious, download kroxylicious-operator-0.20.0.zip or kroxylicious-operator-0.20.0.tar.gz file from the GitHub release page, and extract the files as appropriate (for example using unzip or tar -xzf).

+
+
+

Each of these archives contains:

+
+
+
+
Installation Files
+
+

In the install directory are the YAML manifests needed to install the operator.

+
+
Examples
+
+

In the examples directory are examples of the custom resources which can be used to deploy a proxy once the operator has been installed.

+
+
+
+
+
+

3.3. Installing the operator using installation files

+
+

This procedure shows how to install the Kroxylicious Operator in your Kubernetes cluster.

+
+
+
Prerequisites
+
    +
  • +

    You need an account with permission to create and manage CustomResourceDefinition and RBAC (ClusterRole) resources.

    +
  • +
  • +

    You have downloaded the release artifacts and extracted the contents into the current directory.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Edit the Kroxylicious installation files to use the namespace the operator is going to be installed into.

    +
    +

    For example, in this procedure the operator is installed into the namespace my-kroxylicious-operator-namespace.

    +
    +
    +

    On Linux, use:

    +
    +
    +
    +
    sed -i 's/namespace: .*/namespace: my-kroxylicious-operator-namespace/' install/*.yaml
    +
    +
    +
    +

    On MacOS, use:

    +
    +
    +
    +
    sed -i '' 's/namespace: .*/namespace: my-kroxylicious-operator-namespace/' install/*.yaml
    +
    +
    +
  2. +
  3. +

    Deploy the Kroxylicious operator:

    +
    +
    +
    kubectl create -f install
    +
    +
    +
  4. +
  5. +

    Check the status of the deployment:

    +
    +
    +
    kubectl get deployments -n my-kroxylicious-operator-namespace
    +
    +
    +
    +
    Output shows the deployment name and readiness
    +
    +
    NAME                      READY  UP-TO-DATE  AVAILABLE
    +kroxylicious-operator     1/1    1           1
    +
    +
    +
    +

    READY shows the number of replicas that are ready/expected. The deployment is successful when the AVAILABLE output shows 1.

    +
    +
  6. +
+
+
+
+
+
+

4. Deploying a proxy

+
+
+

Deploy a basic proxy instance with a single virtual cluster exposed to Kafka clients on the same Kubernetes cluster.

+
+
+

4.1. Prerequisites

+
+
    +
  • +

    The Kroxylicious Operator is installed in the Kubernetes cluster.

    +
  • +
  • +

    A Kafka cluster is available to be proxied.

    +
  • +
  • +

    TLS certificate generation capability is available for ingress configurations that require TLS.

    +
  • +
  • +

    DNS management access is available for ingress configurations that require off-cluster access.

    +
  • +
+
+
+
+

4.2. The required resources

+
+

4.2.1. Proxy configuration to host virtual clusters

+
+

A KafkaProxy resource represents an instance of the Kroxylicious Proxy. Conceptually, it is the top-level resource that links together KafkaProxyIngress, VirtualKafkaCluster, KafkaService, and KafkaProtocolFilter resources to form a complete working proxy.

+
+
+

KafkaProxy resources are referenced by KafkaProxyIngress and VirtualKafkaCluster resources to define how the proxy is exposed and what it proxies.

+
+
+
+ Example KafkaProxy configuration +
+
+
kind: KafkaProxy
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  namespace: my-proxy
+  name: simple
+spec: {} (1)
+
+
+
+ + + + + + + +
1An empty spec creates a proxy with default configuration.
+
+
+
+

4.2.2. Networking configuration

+
+

A KafkaProxyIngress resource defines the networking configuration that allows Kafka clients to connect to a VirtualKafkaCluster.

+
+
+

It is uniquely associated with a single KafkaProxy instance, but it is not uniquely associated with a VirtualKafkaCluster and can be used by multiple VirtualKafkaCluster instances.

+
+
+

The KafkaProxyIngress resource supports the following ingress types to configure networking access to the virtual cluster:

+
+
+
    +
  • +

    clusterIP exposes the virtual cluster to applications running inside the same Kubernetes cluster as the proxy.

    +
  • +
  • +

    loadBalancer exposes the virtual cluster to applications running outside the Kubernetes cluster.

    +
  • +
  • +

    openShiftRoute exposes the virtual cluster to applications running outside the OpenShift cluster by using OpenShift Routes (OpenShift only)

    +
  • +
+
+
+

The clusterIP ingress types support both TCP (plain) and TLS connections. The loadBalancer and openShiftRoute types support only TLS.

+
+
+

When using TLS, you specify a TLS server certificate in the ingress configuration of the VirtualKafkaCluster resource.

+
+
+

When using loadBalancer, changes to your DNS may be required.

+
+
+

The following table summarizes the supported ingress types.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Supported ingress types
Ingress TypeUse caseSupported TransportRequires DNS changes?
+

clusterIP

+
+

On-cluster applications

+
+

TCP/TLS

+
+

No

+
+

loadBalancer

+
+

Off-cluster applications

+
+

TLS only

+
+

Yes

+
+

openShiftRoute

+
+

Off-cluster applications

+
+

TLS only

+
+

No (hostnames are assigned by OpenShift)

+
+
+ + + + + + + +
TLS is recommended when connecting applications in a production environment.
+
+
+
clusterIP ingress type
+
+

The clusterIP ingress type exposes virtual clusters to Kafka clients running in the same Kubernetes cluster as the proxy. It supports both TCP (plain) and TLS connections.

+
+
+

The clusterIP ingress type uses Kubernetes Service resources of type ClusterIP to enable on-cluster access.

+
+
+
+ Example KafkaProxyIngress configuration for clusterIP with TCP +
+
+
kind: KafkaProxyIngress
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  namespace: my-proxy
+  name: cluster-ip
+spec:
+  proxyRef: (1)
+    name: simple
+  clusterIP: (2)
+    protocol: TCP (3)
+
+
+
+ + + + + + + + + + + + + + + +
1Identifies the KafkaProxy resource that this ingress is part of.
2Specifies clusterIP networking.
3Defines the connection protocol as plain TCP.
+
+
+
+ Example KafkaProxyIngress configuration for clusterIP with TLS +
+
+
kind: KafkaProxyIngress
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  namespace: my-proxy
+  name: cluster-ip
+spec:
+  proxyRef:
+    name: simple
+  clusterIP:
+    protocol: TLS (1)
+
+
+
+ + + + + + + +
1Defines the connection protocol as TLS to enable encrypted communication between clients and the proxy.
+
+
+

When using TLS, specify a TLS server certificate in the ingress configuration of the VirtualKafkaCluster resource using a certificateRef.

+
+
+
+
loadBalancer ingress type
+
+

The loadBalancer ingress type allows applications running off-cluster to connect to the virtual cluster. TLS must be used with this ingress type.

+
+
+

The loadBalancer ingress type uses Kubernetes Service resources of type LoadBalancer to enable off-cluster access.

+
+
+

When using a loadBalancer ingress, the proxy uses SNI (Server Name Indication) to match the client’s requested host name to the correct virtual cluster and broker within the proxy. This means that every virtual cluster and every broker within the virtual cluster must be uniquely identifiable within DNS. To accomplish this, the following configuration must be provided:

+
+
+
    +
  • +

    A unique bootstrapAddress. This is the address that the clients initially use to connect to the virtual cluster.

    +
  • +
  • +

    An advertisedBrokerAddressPattern that generates unique broker addresses which clients use to connect to individual brokers.

    +
  • +
+
+
+

You decide how to formulate the bootstrapAddress and the advertisedBrokerAddressPattern to best fit the networking conventions of your organization.

+
+
+

The advertisedBrokerAddressPattern must contain the token $(nodeId). The proxy replaces this token with the broker’s node ID. This ensures that client connections are correctly routed to the intended broker.

+
+
+

Both bootstrapAddress and advertisedBrokerAddressPattern may contain the token $(virtualClusterName). If this is present, it is replaced by the virtual cluster’s name. This token is necessary when the KafkaProxyIngress is being shared by many virtual clusters.

+
+
+

One possible scheme is to use the virtual cluster’s name as a subdomain within your organisation’s domain name:

+
+
+
+
$(virtualClusterName).kafkaproxy.example.com
+
+
+
+

You can then use a further subdomain for each broker:

+
+
+
+
broker-$(nodeId).$(virtualClusterName).kafkaproxy.example.com
+
+
+
+

You can use other naming schemes, as long as each address remains unique.

+
+
+
+ Example KafkaProxyIngress configuration for loadBalancer +
+
+
kind: KafkaProxyIngress
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  namespace: my-proxy
+  name: load-balancer
+spec:
+  proxyRef: (1)
+    name: simple
+  loadBalancer: (2)
+    bootstrapAddress: "$(virtualClusterName).kafkaproxy.example.com" (3)
+    advertisedBrokerAddressPattern: "broker-$(nodeId).$(virtualClusterName).kafkaproxy.example.com" (4)
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1Identifies the KafkaProxy resource that this ingress is part of.
2Specifies loadBalancer networking.
3The bootstrap address for clients to connect to the virtual cluster.
4The advertised broker address used by the proxy to generate the individual broker addresses presented to the client.
+
+
+

Specify a TLS server certificate in the ingress configuration of the VirtualKafkaCluster resource by using a certificateRef.

+
+
+

You must also configure DNS so that the bootstrap and broker address resolve from the network used by the applications.

+
+
+
+
openShiftRoute ingress type
+
+ + + + + + + +
OpenShift Routes are available only on OpenShift and are not supported on Kubernetes environments. The Kroxylicious Operator detects whether the OpenShift Route API is available on the Kubernetes server. If it is not available, the operator rejects configurations that use this ingress type.
+
+
+

The openShiftRoute ingress type allows applications running off-cluster to connect to the virtual cluster. TLS must be used with this ingress type.

+
+
+

The openShiftRoute ingress type uses OpenShift Route resources to enable off-cluster access.

+
+
+

When using an openShiftRoute ingress, the proxy uses SNI (Server Name Indication) to match the client’s requested host name to the correct virtual cluster and broker within the proxy.

+
+
+

The bootstrap and broker addresses are generated automatically, for example:

+
+
+
Example bootstrap and broker addresses
+
+
your-cluster-bootstrap.ingress-domain:443
+your-cluster-0.ingress-domain:443
+your-cluster-1.ingress-domain:443
+your-cluster-2.ingress-domain:443
+
+
+
+

where:

+
+
+
    +
  • +

    The bootstrap address follows this pattern: <virtualClusterName>-bootstrap.<ingressDomain>:443

    +
  • +
  • +

    The broker address follows this pattern: <virtualClusterName>-<nodeId>.<ingressDomain>:443

    +
  • +
+
+
+ + + + + + + +
The bootstrap and broker addresses may contain different ingress domains if Ingress Controller sharding is used.
+
+
+
+ Example KafkaProxyIngress configuration for openShiftRoute +
+
+
kind: KafkaProxyIngress
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  namespace: my-proxy
+  name: openshift-route
+spec:
+  proxyRef:
+    name: simple
+  openShiftRoute: {}
+
+
+
+

where:

+
+
+
    +
  • +

    spec.openShiftRoute exposes the proxy to off-cluster clients using OpenShift Routes.

    +
  • +
+
+
+

Specify a TLS server certificate in the ingress configuration of the VirtualKafkaCluster resource by using a certificateRef.

+
+
+
+
+

4.2.3. Configuration for proxied Kafka clusters

+
+

A proxied Kafka cluster is configured in a KafkaService resource, which specifies how the proxy connects to the cluster. The Kafka cluster may or may not be running in the same Kubernetes cluster as the proxy: Network connectivity is all that’s required.

+
+
+

This example shows a KafkaService defining how to connect to a Kafka cluster at kafka.example.com.

+
+
+
+ Example KafkaService configuration +
+
+
kind: KafkaService
+metadata:
+  # ...
+spec:
+  bootstrapServers: kafka.example.com:9092 (1)
+  nodeIdRanges: (2)
+    - name: brokers (3)
+      start: 0 (4)
+      end: 5 (5)
+  # ...
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
1The bootstrapServers property is a comma-separated list of addresses in <host>:<port> format. Including multiple broker addresses helps clients connect when one is unavailable.
2nodeIdRanges declares the IDs of all the broker nodes in the Kafka cluster
3name is optional, but specifying it can make errors easier to diagnose.
4The start of the ID range, inclusive.
5The end of the ID range, inclusive.
+
+
+
+

4.2.4. Virtual cluster configuration

+
+

A VirtualKafkaCluster resource defines a logical Kafka cluster that is accessible to clients over the network.

+
+
+

The virtual cluster references the following resources, which must be in the same namespace:

+
+
+
    +
  • +

    A KafkaProxy resource that the proxy is part of.

    +
  • +
  • +

    One or more KafkaProxyIngress resources that expose the virtual cluster to Kafka clients and provide virtual-cluster-specific configuration to the ingress (such as TLS certificates and other parameters).

    +
  • +
  • +

    A KafkaService resource that defines the backend Kafka cluster.

    +
  • +
  • +

    One or more KafkaProtocolFilter resources that filter the Kafka protocol traffic between clients and the backend Kafka cluster. The order of the filters in the filterRefs array defines the order that the filters are applied. Client requests pass through the filters starting at index 0, then 1, and continuing to index n. Broker responses pass through the same filters in the reverse order. If the filterRefs array is empty (or null), the traffic will pass through the cluster unchanged.

    +
  • +
+
+
+

The following example shows configuration for a VirtualKafkaCluster that is exposed it to Kafka clients running on the same Kubernetes cluster. Protocol traffic is filtered by the my-filter filter.

+
+
+
+ Example VirtualKafkaCluster configuration with a single ingress and filter. +
+
+
kind: VirtualKafkaCluster
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  name: my-cluster
+  namespace: my-proxy
+spec:
+  proxyRef: (1)
+    name: simple
+  targetKafkaServiceRef: (2)
+    name: my-cluster
+  ingresses:
+    - ingressRef: (3)
+        name: cluster-ip
+  filterRefs: (4)
+    - name: my-filter
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1Identifies the KafkaProxy resource that this virtual cluster is part of.
2Specifies the KafkaService that defines the Kafka cluster proxied by the virtual cluster.
3Defines the ingresses that expose the virtual cluster. Each ingress references a KafkaProxyIngress by name.
4Specifies the list of filters applied to Kafka protocol traffic.
+
+
+

The following example shows configuration for a VirtualKafkaCluster that is exposed to Kafka clients running both on and off the cluster, using TLS. Because TLS is used, the ingress configuration must reference a TLS server certificate. This example has two filters.

+
+
+
+ Example VirtualKafkaCluster configuration with two TLS-enabled ingresses +
+
+
kind: VirtualKafkaCluster
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  name: my-cluster
+  namespace: my-proxy
+spec:
+  proxyRef:
+    name: simple
+  targetKafkaServiceRef:
+    name: my-cluster
+  ingresses:
+    - ingressRef:
+        name: cluster-ip
+        certificateRef:
+          name: 'cluster-ip-server-cert' (1)
+          kind: Secret
+    - ingressRef:
+        name: load-balancer
+        certificateRef:
+          name: 'external-server-cert' (2)
+          kind: Secret
+  filterRefs:
+    - name: my-filter-1
+    - name: my-filter-2
+
+
+
+ + + + + + + + + + + +
1References a secret containing the server certificate for the clusterIP ingress.
2References a secret containing the server certificate for the loadBalancer ingress.
+
+
+
Generating TLS certificates for clusterIP ingress type
+
+

When using the clusterIP ingress type with the TLS protocol, you must provide suitable TLS certificates to secure communication.

+
+
+

The basic steps are as follows:

+
+
+
    +
  • +

    Generate a TLS server certificate that covers the service names assigned to the virtual cluster by the ingress.

    +
  • +
  • +

    Provide the certificate to the virtual cluster using a Kubernetes Secret of type kubernetes.io/tls.

    +
  • +
+
+
+

The exact procedure for generating the certificate depends on the tooling and processes used by your organization.

+
+
+

The certificate must meet the following criteria:

+
+
+
    +
  • +

    The certificate needs to be signed by a CA that is trusted by the on-cluster applications that connect to the virtual cluster.

    +
  • +
  • +

    The format of the key must be PKCS#8 encoded PEM (Privacy Enhanced Mail). It must not be password protected.

    +
  • +
  • +

    The certificate must use SANs (Subject Alternate Names) to list all service names or use a wildcard TLS certificate that covers them all. Assuming a virtual cluster name of my-cluster, an ingress name of cluster-ip, and a Kafka cluster using node IDs (0-2), the following SANs must be listed in the certificate:

    +
    +
    +
    my-cluster-cluster-ip-bootstrap.<namespace>.svc.cluster.local
    +my-cluster-cluster-ip-0.<namespace>.svc.cluster.local
    +my-cluster-cluster-ip-1.<namespace>.svc.cluster.local
    +my-cluster-cluster-ip-2.<namespace>.svc.cluster.local
    +
    +
    +
  • +
+
+
+

Create a secret for the certificate using the following command:

+
+
+
+
kubectl create secret tls <secret-name> --namespace <namespace> --cert=<path/to/cert/file> --key=<path/to/key/file>
+
+
+
+

<secret-name> is the name of the secret to be created, <namespace> is the name of the namespace where the proxy is to be deployed, and <path/to/cert/file> and <path/to/key/file> are the paths to the certificate and key files.

+
+
+
+
Generating TLS certificates for loadBalancer ingress type
+
+

When using loadBalancer ingress type, you must provide suitable TLS certificates to secure communication.

+
+
+

The basic steps are as follows:

+
+
+
    +
  • +

    Generate a TLS server certificate that covers the bootstrap and broker names assigned to the virtual cluster by the ingress.

    +
  • +
  • +

    Provide the certificate to the virtual cluster using a Kubernetes Secret of type kubernetes.io/tls.

    +
  • +
+
+
+

The exact procedure for generating the certificate depends on the tooling and processes used by your organization.

+
+
+

The certificate must meet the following criteria:

+
+
+
    +
  • +

    The certificate needs to be signed by a CA that is trusted by the off-cluster applications that connect to the virtual cluster.

    +
  • +
  • +

    The format of the key must be PKCS#8 encoded PEM (Privacy Enhanced Mail). It must not be password protected.

    +
  • +
  • +

    The certificate must use SANs (Subject Alternate Names) to list the bootstrap and all the broker names or use a wildcard TLS certificate that covers them all. Assuming a bootstrapAddress of $(virtualClusterName).kafkaproxy.example.com, an advertisedBrokerAddressPattern of broker-$(nodeId).$(virtualClusterName).kafkaproxy.example.com, a Kafka cluster using node IDs (0-2), and a virtual cluster name of my-cluster, the following SANs must be listed in the certificate:

    +
    +
    +
    mycluster.kafkaproxy.example.com
    +broker-0.mycluster.kafkaproxy.example.com
    +broker-1.mycluster.kafkaproxy.example.com
    +broker-2.mycluster.kafkaproxy.example.com
    +
    +
    +
  • +
+
+
+

Create a secret for the certificate using the following command:

+
+
+
+
kubectl create secret tls <secret-name> --namespace <namespace> --cert=<path/to/cert/file> --key=<path/to/key/file>
+
+
+
+

<secret-name> is the name of the secret to be created, <namespace> is the name of the namespace where the proxy is to be deployed, and <path/to/cert/file> and <path/to/key/file> are the paths to the certificate and key files.

+
+
+
+
Configuring DNS for load balancer ingress
+
+

When using the loadBalancer ingress type, you must ensure that both the bootstrapAddress and the names generated from advertisedBrokerAddressPattern resolve to the external address of the Kubernetes Service underlying the load balancer on the network where the off-cluster applications run.

+
+
+
Prerequisites
+
    +
  • +

    The Kroxylicious Operator is installed.

    +
  • +
  • +

    KafkaProxy, VirtualKafkaCluster, and KafkaProxyIngress resources are deployed.

    +
  • +
  • +

    The VirtualKafkaCluster and KafkaProxyIngress resources are configured to use a loadBalancer ingress.

    +
  • +
  • +

    DNS can be configured on the network where the off-cluster applications run.

    +
  • +
  • +

    Network traffic can to flow from the application network run to the external addresses provided by the Kubernetes cluster.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    If using Minikube as your Kubernetes environment, enable the Minikube Load Balancer tunnel by running the following command. Use a separate console window to do this as the command needs to stay running for the tunnel to work.

    +
    +
    +
    minikube tunnel
    +
    +
    +
  2. +
  3. +

    Run the following command to discover the external address being used by the load balancer:

    +
    +
    +
    kubectl get virtualkafkacluster -n <namespace> <virtual-cluster-name> -o=jsonpath='{.status.ingresses[?(@.name == "<ingress-name>")].loadBalancerIngressPoints}'
    +
    +
    +
    +

    Replace <namespace> with the name of the Kubernetes namespace where the resources are deployed, replace <ingress-name> with the name of the KafkaProxyIngresses and replace <virtual-cluster-name> with the name of the VirtualKafkaCluster resource.

    +
    +
    +

    Depending on your Kubernetes environment, the command returns an object containing an IP address or a hostname. This is the external address of the load balancer.

    +
    +
  4. +
  5. +

    Configure your DNS so that the bootstrap and broker names resolve to the external address.

    +
    +

    Assuming a bootstrapAddress of $(virtualClusterName).kafkaproxy.example.com, an advertisedBrokerAddressPattern of broker-$(nodeId).$(virtualClusterName).kafkaproxy.example.com, a Kafka cluster uses node IDs (0-2), and a virtual cluster name of my-cluster, the following DNS mappings are listed:

    +
    +
    +
    +
    my-cluster.kafkaproxy.example.com => <external address>
    +broker-0.my-cluster.kafkaproxy.example.com => <external address>
    +broker-1.my-cluster.kafkaproxy.example.com => <external address>
    +broker-2.my-cluster.kafkaproxy.example.com => <external address>
    +
    +
    +
    +

    The exact steps vary by environment and network setup.

    +
    +
  6. +
  7. +

    Confirm that the names resolve from the application network:

    +
    +
    +
    nslookup mycluster.kafkaproxy.example.com
    +nslookup broker-0.mycluster.kafkaproxy.example.com
    +
    +
    +
  8. +
+
+
+
+
Generating TLS certificates for openshiftRoute ingress type
+
+

When using the openshiftRoute ingress type, you must provide suitable TLS certificates to secure communication.

+
+
+

The basic steps are as follows:

+
+
+
    +
  • +

    Generate a TLS server certificate that covers the bootstrap and broker names assigned to the virtual cluster by the ingress.

    +
  • +
  • +

    Provide the certificate to the virtual cluster using a Kubernetes Secret of type kubernetes.io/tls.

    +
  • +
+
+
+

The exact procedure for generating the certificate depends on the tooling and processes used by your organization.

+
+
+

The certificate must meet the following criteria:

+
+
+
    +
  • +

    The certificate needs to be signed by a CA that is trusted by the off-cluster applications that connect to the virtual cluster.

    +
  • +
  • +

    The format of the key must be PKCS#8 encoded PEM (Privacy Enhanced Mail). It must not be password protected.

    +
  • +
  • +

    The certificate must use SANs (Subject Alternate Names) to list the bootstrap and all the broker names or use a wildcard TLS certificate that covers them all. Assuming a bootstrapAddress of $(virtualClusterName)-bootstrap.ingress-domain:443, an advertisedBrokerAddressPattern of $(virtualClusterName)-$(nodeId).ingress-domain:443, a Kafka cluster using node IDs (0-2), and a virtual cluster name of my-cluster, the following SANs must be listed in the certificate:

    +
    +
    +
    mycluster-bootstrap.ingress-domain
    +mycluster-0.ingress-domain
    +mycluster-1.ingress-domain
    +mycluster-2.ingress-domain
    +
    +
    +
  • +
+
+
+

To prepare your certificate in advance, look up the ingress domain in the Ingress Controller:

+
+
+
+
oc get ingresscontrollers.operator.openshift.io -n openshift-ingress-operator default -o=jsonpath='{.status.domain}'
+
+
+
+ + + + + + + +
The bootstrap and broker addresses may contain different ingress domains if Ingress Controller sharding is used.
+
+
+

Create a secret for the certificate using the following command:

+
+
+
+
kubectl create secret tls <secret-name> --namespace <namespace> --cert=<path/to/cert/file> --key=<path/to/key/file>
+
+
+
+

<secret-name> is the name of the secret to be created, <namespace> is the name of the namespace where the proxy is to be deployed, and <path/to/cert/file> and <path/to/key/file> are the paths to the certificate and key files.

+
+
+
+
+
+

4.3. Filters

+
+

A KafkaProtocolFilter resource represents a Kroxylicious Proxy filter. It is not uniquely associated with a VirtualKafkaCluster or KafkaProxy instance; it can be used in a number of VirtualKafkaCluster instances in the same namespace.

+
+
+

A KafkaProtocolFilter is similar to one of the items in a proxy configuration’s filterDefinitions:

+
+
+
    +
  • +

    The resource’s metadata.name corresponds directly to the name of a filterDefinitions item.

    +
  • +
  • +

    The resource’s spec.type corresponds directly to the type of a filterDefinitions item.

    +
  • +
  • +

    The resource’s spec.configTemplate corresponds to the config of a filterDefinitions item, but is subject to interpolation by the operator.

    +
  • +
+
+
+
+
+
+

5. Operating a proxy

+
+
+

Monitor the operational status of the proxy and configure resource usage. This section explains how to check the status of the KafkaProxyIngress and VirtualKafkaCluster resources, and how to set CPU and memory requests and limits for the proxy container.

+
+
+

This section assumes you have a running Kroxylicious Proxy instance.

+
+
+

5.1. Checking the status of the VirtualKafkaCluster resource

+
+

The status of a VirtualKafkaCluster resource provides feedback on its configuration through a set of conditions. These include the ResolvedRefs condition, which indicates whether all referenced resources exist, and the Accepted condition, which indicates whether the cluster’s configuration was successfully applied to the proxy.

+
+
+

5.1.1. ResolvedRefs conditions

+
+

When you create a VirtualKafkaCluster, the operator checks whether the following exist:

+
+
+
    +
  • +

    A KafkaProxy matching spec.proxyRef.

    +
  • +
  • +

    Each KafkaProxyIngress specified in spec.ingresses, and whether they refer to the same KafkaProxy as the virtual cluster.

    +
  • +
  • +

    A Secret referred to in the tls property.

    +
  • +
+
+
+

The result is reported in status.conditions with a ResolvedRefs condition accordingly.

+
+
+
+ Example VirtualKafkaCluster status when all referenced resources exist +
+
+
kind: VirtualKafkaCluster
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  # ...
+  generation: 12
+spec:
+  # ...
+status:
+  observedGeneration: 12 (1)
+  conditions:
+    - type: ResolvedRefs (2)
+      status: True (3)
+      observedGeneration: 12
+
+
+
+ + + + + + + + + + + + + + + +
1The observedGeneration in the status matches the metadata.generation, indicating that the status is up-to-date for the latest spec.
2The ResolvedRefs condition type reports any issues with referenced resources.
3A status value of True means that all referenced resources exist.
+
+
+

A status value of False means that one or more of the referenced resources is missing. In this case, the condition includes reason and message properties with more details.

+
+
+
+

5.1.2. Accepted conditions

+
+

When a VirtualKafkaCluster has a valid spec, the operator attempts to configure the proxy instance accordingly. This might not be possible. For example, the spec may be valid but incompatible with other virtual clusters running in the same proxy instance.

+
+
+

The operator sets a condition type of Accepted in status.conditions to indicate whether or not a virtual cluster has been successfully configured within a proxy instance.

+
+
+
+
+

5.2. Checking the status of the KafkaProxyIngress resource

+
+

The status of a KafkaProxyIngress resource provides feedback on its configuration through a set of conditions. These include the ResolvedRefs condition, which indicates whether all referenced resources exist.

+
+
+

When you create a KafkaProxyIngress, the operator checks whether a KafkaProxy corresponding to the spec.proxyRef exists. The result is reported in status.conditions with a ResolvedRefs condition accordingly.

+
+
+
+ Example KafkaProxyIngress status when spec.proxyRef exists +
+
+
kind: KafkaProxyIngress
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  name: cluster-ip
+  namespace: my-proxy
+  generation: 12
+spec:
+  # ...
+status:
+  observedGeneration: 12 (1)
+  conditions:
+    - type: ResolvedRefs (2)
+      status: True (3)
+      observedGeneration: 12
+
+
+
+ + + + + + + + + + + + + + + +
1The observedGeneration in the status matches the metadata.generation, indicating that the status is up-to-date for the latest spec.
2The ResolvedRefs condition type reports any issues with referenced resources.
3A status value of True means that all referenced resources exist.
+
+
+

A status value of False means that the KafkaProxy resource is missing. In this case, the condition includes reason and message properties with more details.

+
+
+
+

5.3. Configuring Proxy container CPU and memory resource limits and requests

+
+

When you define a KafkaProxy resource, a number of Kubernetes Pods are created, each with a proxy container. Each of these containers runs a single Kroxylicious Proxy process.

+
+
+

By default, these proxy containers are defined without resource limits. To manage CPU and memory consumption in your environment, modify the proxyContainer section within your KafkaProxy specification.

+
+
+
+ Example KafkaProxy configuration with proxy container resource specification +
+
+
kind: KafkaProxy
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  namespace: my-proxy
+  name: simple
+spec:
+  infrastructure:
+    proxyContainer:
+      resources:
+        requests:
+          cpu: '400m'
+          memory: '656Mi'
+        limits:
+          cpu: '500m'
+          memory: '756Mi'
+
+
+ +
+
+
+
+

6. Securing a proxy

+
+
+

Secure proxies by using TLS and storing sensitive values in external resources.

+
+
+

6.1. Prerequisites

+
+
    +
  • +

    A running Kroxylicious Proxy instance

    +
  • +
+
+
+
+

6.2. Securing the client-to-proxy connection

+
+

Secure client-to-proxy communications using TLS.

+
+
+

6.2.1. TLS configuration for client-to-proxy connections

+
+

This example shows a VirtualKafkaCluster, exposing it to Kafka clients running on the same Kubernetes cluster. It uses TLS as the transport protocol so that communication between Kafka clients and the proxy is encrypted.

+
+
+
+ Example VirtualKafkaCluster configuration +
+
+
kind: VirtualKafkaCluster
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  name: my-cluster
+  namespace: my-proxy
+spec:
+  proxyRef: (1)
+    name: simple
+  targetKafkaServiceRef: (2)
+    name: my-cluster
+  ingresses:
+    - ingressRef: (3)
+        name: cluster-ip
+      tls: (4)
+        certificateRef:
+          name: server-certificate
+          kind: Secret
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1Identifies the KafkaProxy resource that this virtual cluster is part of. It must be in the same namespace as the VirtualKafkaCluster.
2The virtual cluster names the KafkaService to be proxied. It must be in the same namespace as the VirtualKafkaCluster.
3The virtual cluster can be exposed by one or more ingresses. Each ingress must reference a KafkaProxyIngress in the same namespace as the VirtualKafkaCluster.
4If the ingress supports TLS, the tls property configures the TLS server certificate to use.
+
+
+

Within a VirtualKafkaCluster, an ingress’s tls property configures TLS for that ingress. The tls.certificateRef specifies the Secret resource holding the TLS server certificate that the proxy uses for clients connecting through this ingress. The referenced KafkaProxyIngress also needs to be configured for TLS.

+
+
+
+ Example KafkaProxyIngress configuration for TLS +
+
+
kind: KafkaProxyIngress
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  name: cluster-ip
+  namespace: my-proxy
+spec:
+  proxyRef: (1)
+    name: simple
+  clusterIP: (2)
+    protocol: TLS (3)
+
+
+
+ + + + + + + + + + + + + + + +
1The ingress must reference a KafkaProxy in the same namespace as the KafkaProxyIngress.
2Exposes the proxy to Kafka clients inside the same Kubernetes cluster using a ClusterIP service.
3The ingress uses TLS as the transport protocol.
+
+
+
+

6.2.2. Mutual TLS configuration for client-to-proxy connections

+
+

You can configure a virtual cluster ingress to request or require Kafka clients to authenticate to the proxy using TLS. This configuration is known as mutual TLS (mTLS), because both the client and the proxy authenticate each other using TLS.

+
+
+
+ Example VirtualKafkaCluster configuration requiring clients to present a trusted certificate +
+
+
kind: VirtualKafkaCluster
+metadata:
+  # ...
+spec:
+  # ...
+  ingresses:
+    - ingressRef:
+        name: cluster-ip
+      tls:
+        certificateRef:
+          # ...
+        trustAnchorRef: (1)
+          kind: ConfigMap (2)
+          name: trusted-cas (3)
+          key: trusted-cas.pem (4)
+        tlsClientAuthentication: REQUIRED (5)
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
1References a separate Kubernetes resource containing the trusted CA certificates.
2The kind is optional and defaults to ConfigMap. To reference a key in a Secret, set kind to Secret. For example: +
+
+
    trustAnchorRef:
+      kind: Secret
+      name: trusted-cas
+      key: trusted-cas.pem
+
+
3Name of the resource of the given kind, which must exist in the same namespace as the VirtualKafkaCluster.
4Key identifying the entry in the given resource. The corresponding value must be a set of CA certificates. Supported formats for the bundle are: PEM, PKCS#12, and JKS.
5Specifies whether client authentication is required (REQUIRED), requested (REQUESTED), or disabled (NONE). If a trustAnchorRef is specified, the default is REQUIRED.
+
+
+
+

6.2.3. TLS version configuration for client-to-proxy connections

+
+

Some older versions of TLS (and SSL before it) are now considered insecure. These versions remain enabled by default in order to maximize interoperability between TLS clients and servers that only support older versions.

+
+
+

If the Kafka cluster than you want to connect to supports newer TLS versions, you can disable the proxy’s support for older, insecure versions. For example, if the Kafka cluster supports TLSv1.1, TLSv1.2 and TLSv1.3 you might choose to enable only TLSv1.3 support. This would reduce the susceptibility to a TLS downgrade attack.

+
+
+ + + + + + + +
It is good practice to disable insecure protocol versions.
+
+
+

You can restrict which TLS protocol versions the proxy supports for client-to-proxy connections by configuring the protocols property.

+
+
+
+ Example VirtualKafkaCluster with restricted TLS protocol versions +
+
+
kind: VirtualKafkaCluster
+metadata:
+  # ...
+spec:
+  # ...
+  ingresses:
+    - ingressRef:
+        name: cluster-ip
+      tls:
+        certificateRef:
+          # ...
+        protocols: (1)
+          allow: (2)
+            - TLSv1.3
+
+
+
+ + + + + + + + + + + +
1Configures the TLS protocol versions used by the proxy.
2Lists the protocol versions explicitly allowed for TLS negotiation.
+
+
+

Alternatively, you can use deny to specify protocol versions to exclude.

+
+
+

The names of the TLS protocol versions supported depend on the JVM in the proxy container image.

+
+
+
Additional resources
+ +
+
+
+

6.2.4. TLS cipher suite configuration for client-to-proxy connections

+
+

A cipher suite is a set of cryptographic algorithms that together provide the security guarantees offered by TLS. During TLS negotiation, a server and client agree on a common cipher suite that they both support.

+
+
+

Some older cipher suites are now considered insecure, but may be enabled on the Kafka cluster to allow older clients to connect.

+
+
+

The cipher suites enabled by default in the proxy depend on the JVM used in the proxy image and the TLS protocol version that is negotiated.

+
+
+

To prevent TLS downgrade attacks, you can disable cipher suites known to be insecure or no longer recommended. However, the proxy and the cluster must support at least one cipher suite in common.

+
+
+ + + + + + + +
It is good practice to disable insecure cipher suites.
+
+
+

You can restrict which TLS cipher suites the proxy uses when negotiating client-to-proxy connections by configuring the cipherSuites property.

+
+
+
+ Example VirtualKafkaCluster configuration using cipherSuites to allow specific ciphers +
+
+
kind: VirtualKafkaCluster
+metadata:
+  # ...
+spec:
+  # ...
+  ingresses:
+    - ingressRef:
+        name: cluster-ip
+      tls:
+        certificateRef:
+          # ...
+        cipherSuites: (1)
+          allow: (2)
+           - TLS_AES_128_GCM_SHA256
+           - TLS_AES_256_GCM_SHA384
+
+
+
+ + + + + + + + + + + +
1Configures the cipher suites used by the proxy.
2Lists the cipher suites explicitly allowed for TLS negotiation.
+
+
+

Alternatively, you can use deny to specify cipher suites to exclude. The names of the cipher suites supported depend on the JVM in the proxy container image.

+
+
+
Additional resources
+ +
+
+
+
+

6.3. Securing the proxy-to-broker connection

+
+

Secure proxy-to-broker communication using TLS.

+
+
+

6.3.1. TLS trust configuration for proxy-to-cluster connections

+
+

By default, the proxy uses the platform’s default trust store when connecting to the proxied cluster over TLS. This works if the cluster’s TLS certificates are signed by a well-known public Certificate Authority (CA), but fails if they’re signed by a private CA instead.

+
+
+ + + + + + + +
It is good practice to configure trust explicitly, even when proxied cluster’s TLS certificates are signed by a public CA.
+
+
+

This example configures a KafkaService to trust TLS certificates signed by any Certificate Authority (CA) listed in the trusted-cas.pem entry of the ConfigMap named trusted-cas.

+
+
+
+ Example KafkaService configuration for trusting certificates. +
+
+
kind: KafkaService
+metadata:
+  # ...
+spec:
+  bootstrapServers: kafka.example.com:9092
+  tls:
+    trustAnchorRef: (1)
+      kind: ConfigMap (2)
+      name: trusted-cas (3)
+      key: trusted-cas.pem (4)
+    # ...
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1The trustAnchorRef property references a separate Kubernetes resource which contains the CA certificates to be trusted
2The kind is optional and defaults to ConfigMap. To reference a key in a Secret, set kind to Secret. For example: +
+
+
    trustAnchorRef:
+      kind: Secret
+      name: trusted-cas
+      key: trusted-cas.pem
+
+
3The name of the resource of the given kind. This resource must exist in the same namespace as the KafkaService
4The key identifies the entry in the given resource. The corresponding value must be a PEM-encoded set of CA certificates.
+
+
+
+

6.3.2. TLS authentication to proxied Kafka clusters

+
+

Some Kafka clusters require mutual TLS (mTLS) authentication. You can configure the proxy to present a TLS client certificate using the KafkaService resource.

+
+
+

The TLS client certificate you provide must have been issued by a Certificate Authority (CA) that’s trusted by the proxied cluster.

+
+
+

This example configures a KafkaService to use a TLS client certificate stored in a Secret named tls-cert-for-kafka.example.com.

+
+
+
+ Example KafkaService configuration with TLS client authentication. +
+
+
kind: KafkaService
+metadata:
+  # ...
+spec:
+  bootstrapServers: kafka.example.com:9092
+  tls:
+    trustAnchorRef:
+      kind: ConfigMap
+      name: trusted-cas
+      key: trusted-cas.pem
+    certificateRef: (1)
+      kind: Secret (2)
+      name: tls-cert-for-kafka.example.com (3)
+    # ...
+
+
+
+ + + + + + + + + + + + + + + +
1The certificateRef property identifies the TLS client certificate to use.
2The kind is optional and defaults to Secret. The Secret should have type: kubernetes.io/tls.
3The name is the name of the resource of the given kind. This resource must exist in the same namespace as the KafkaService
+
+
+
+

6.3.3. TLS version configuration for proxy-to-cluster connections

+
+

Some older versions of TLS (and SSL before it) are now considered insecure. These versions remain enabled by default in order to maximize interoperability between TLS clients and servers that only support older versions.

+
+
+

If the Kafka cluster than you want to connect to supports newer TLS versions, you can disable the proxy’s support for older, insecure versions. For example, if the Kafka cluster supports TLSv1.1, TLSv1.2 and TLSv1.3 you might choose to enable only TLSv1.3 support. This would reduce the susceptibility to a TLS downgrade attack.

+
+
+ + + + + + + +
It is good practice to disable insecure protocol versions.
+
+
+

This example configures a KafkaService to allow only TLS v1.3 when connecting to kafka.example.com.

+
+
+
+ Example KafkaService with restricted TLS protocol versions. +
+
+
kind: KafkaService
+metadata:
+  # ...
+spec:
+  bootstrapServers: kafka.example.com:9092
+  tls:
+    # ...
+    protocols: (1)
+      allow: (2)
+        - TLSv1.3
+
+
+
+ + + + + + + + + + + +
1The protocols property configures the TLS protocol versions
2allow lists the versions of TLS which are permitted.
+
+
+

The protocols property also supports deny, if you prefer to list the versions to exclude instead. The names of the TLS protocol versions supported depend on the JVM in the proxy container image.

+
+
+
Additional resources
+ +
+
+
+

6.3.4. TLS cipher suite configuration for proxy-to-cluster connections

+
+

A cipher suite is a set of cryptographic algorithms that together provide the security guarantees offered by TLS. During TLS negotiation, a server and client agree on a common cipher suite that they both support.

+
+
+

Some older cipher suites are now considered insecure, but may be enabled on the Kafka cluster to allow older clients to connect.

+
+
+

The cipher suites enabled by default in the proxy depend on the JVM used in the proxy image and the TLS protocol version that is negotiated.

+
+
+

To prevent TLS downgrade attacks, you can disable cipher suites known to be insecure or no longer recommended. However, the proxy and the cluster must support at least one cipher suite in common.

+
+
+ + + + + + + +
It is good practice to disable insecure cipher suites.
+
+
+
+ Example KafkaService configured so that the proxy will negotiate TLS connection using only the listed ciphers. +
+
+
kind: KafkaService
+metadata:
+  # ...
+spec:
+  bootstrapServers: kafka.example.com:9092
+  tls:
+    # ...
+    cipherSuites: (1)
+      allow: (2)
+       - TLS_AES_128_GCM_SHA256
+       - TLS_AES_256_GCM_SHA384
+
+
+
+ + + + + + + + + + + +
1The cipherSuites object configures the cipher suites.
2allow lists the cipher suites which are permitted.
+
+
+

The cipherSuites property also supports deny, if you prefer to list the cipher suites to exclude instead. The names of the cipher suites supported depend on the JVM in the proxy container image.

+
+
+
Additional resources
+ +
+
+
+
+

6.4. Securing filters

+
+

Secure filters by using the security features provided by each filter and storing sensitive values in external resources such as a Kubernetes Secret.

+
+
+

6.4.1. Security-sensitive values in filter resources

+
+

Filter resources can be configured to handle security-sensitive values like passwords or keys by referencing Kubernetes Secret and ConfigMap resources.

+
+
+
Template use and value interpolation
+
+

Interpolation is supported in spec.configTemplate for the automatic substitution of placeholder values at runtime. This allows security-sensitive values, such as passwords or keys, to be specified in Kubernetes Secret resources rather than directly in the KafkaProtocolFilter resource. Likewise, things like trusted CA certificates can be defined in ConfigMap resources.

+
+
+

The operator determines which Secret and ConfigMap resources are referenced by a KafkaProtocolFilter resource and declares them as volumes in the proxy Pod, mounted into the proxy container. This example shows how to configure the RecordEncryptionFilter using a Vault KMS deployed in the same Kubernetes cluster.

+
+
+
+ Example KafkaProtocolFilter configuration +
+
+
kind: KafkaProtocolFilter
+metadata:
+  # ...
+spec:
+  type: RecordEncryption (1)
+  configTemplate: (2)
+    kms: VaultKmsService
+    kmsConfig:
+      vaultTransitEngineUrl: http://vault.vault.svc.cluster.local:8200/v1/transit
+      vaultToken:
+        password: ${secret:vault:token} (3)
+    selector: TemplateKekSelector
+    selectorConfig:
+      template: "$(topicName)" (4)
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1The type is the Java class name of the proxy filter. If the unqualified name is ambiguous, it must be qualified by the filter package name.
2The KafkaProtocolFilter requires a configTemplate, which supports interpolation references.
3The password uses an interpolation reference, enclosed by ${ and } instead of a literal value. The operator supplies the value at runtime from the specified Secret.
4The selector template is interpreted by the proxy. It uses different delimiters, $( and ), than the interpolation reference.
+
+
+
+
Structure of interpolation references
+
+

Let’s look at the example interpolation reference ${secret:vault:token} in more detail.

+
+
+

It starts with ${ and ends with }. Between these, it is broken into three parts, separated by colons (:):

+
+
+
    +
  • +

    secret is a provider. Supported providers are secret and configmap (note the use of lower case).

    +
  • +
  • +

    vault is a path. The interpretation of the path depends on the provider.

    +
  • +
  • +

    token is a key. The interpretation of the key also depends on the provider.

    +
  • +
+
+
+

For both secret and configmap providers:

+
+
+
    +
  • +

    The path is interpreted as the name of a Secret or ConfigMap resource in the same namespace as the KafkaProtocolFilter resource.

    +
  • +
  • +

    The key is interpreted as a key in the data property of the Secret or ConfigMap resource.

    +
  • +
+
+
+
+
+
+
+
+

7. Advanced proxy tuning

+
+
+

Configure advanced network and connection settings for the proxy.

+
+
+

7.1. Advanced network tuning for a proxy

+
+

The spec.network section of a KafkaProxy resource provides low-level tuning options for the proxy listener and management HTTP server. The defaults are suitable for most deployments — only configure these settings if you have a specific operational reason to do so.

+
+
+
+ Example KafkaProxy with network tuning applied +
+
+
kind: KafkaProxy
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  namespace: my-proxy
+  name: simple
+spec:
+  network:
+    proxy:
+      workerThreadCount: 8
+      shutdownQuietPeriod: 5s
+      shutdownTimeout: 20s
+    management:
+      workerThreadCount: 2
+      shutdownQuietPeriod: 5s
+      shutdownTimeout: 20s
+
+
+
+

where:

+
+
+
    +
  • +

    spec.network.proxy configures network tuning for the proxy listener that handles Kafka client connections. All fields are optional.

    +
  • +
  • +

    workerThreadCount is the number of threads available to process requests across client connections. Each connection is pinned to one thread, but a single thread can serve many connections. More threads increase parallelism but also CPU consumption. Tune this in conjunction with the pod’s CPU limits and validate under realistic load. Defaults to twice the number of available processors.

    +
  • +
  • +

    shutdownQuietPeriod is the grace period during which the proxy continues to accept and complete in-flight requests before shutting down. If no new requests arrive during this window, shutdown proceeds. Defaults to 2s if not specified.

    +
  • +
  • +

    shutdownTimeout is the maximum time allowed for the proxy to complete shutdown, including the quiet period. If shutdown does not complete within this period, it is forced. Defaults to 15s if not specified. Set this to a value less than the pod’s terminationGracePeriodSeconds (Kubernetes default: 30s) to ensure the proxy can finish gracefully before Kubernetes forcibly terminates the pod.

    +
  • +
  • +

    spec.network.management configures network tuning for the management HTTP server that serves metrics and health endpoints. Supports the same settings as the proxy listener, and can be configured independently.

    +
  • +
+
+
+

Duration values use a string-based Go-style duration format (for example, 30s, 5m). Supported units are: m (minutes), s (seconds), ms (milliseconds), μs or us (microseconds), and ns (nanoseconds). Units can be combined, for example 1m30s.

+
+
+
+

7.2. Configuring idle connection timeouts

+
+

The proxy can automatically disconnect idle client connections to reclaim resources. Idle timeout configuration is optional and disabled by default. Enable it only when required for your deployment. Idle timeouts are configured under spec.network.proxy in the KafkaProxy resource and apply only to the proxy listener — they are not available for the management HTTP server. When enabled, idle disconnects are observable via the kroxylicious_client_to_proxy_disconnects_total metric.

+
+
+

7.2.1. When to enable idle timeouts

+
+

Consider enabling idle timeouts in the following scenarios:

+
+
+
    +
  • +

    Security posture: unauthenticated connections can be closed quickly to limit the window for abuse, while authenticated connections get a more generous timeout.

    +
  • +
  • +

    Unclosed connections: clients that abandon connections without properly closing them, leaving resources allocated unnecessarily.

    +
  • +
  • +

    Network infrastructure requirements: environments where firewalls or load balancers drop idle connections, configure the proxy to disconnect gracefully first.

    +
  • +
+
+
+
+

7.2.2. When not to enable idle timeouts

+
+

Avoid enabling idle timeouts in the following scenarios:

+
+
+
    +
  • +

    Legitimate idle connections: applications that maintain long-lived connections with extended idle periods, such as consumers with long poll timeouts or applications using connection pooling.

    +
  • +
  • +

    Stable network infrastructure: environments with reliable network infrastructure and no issues with idle connection management.

    +
  • +
+
+
+
+

7.2.3. How idle timeouts work

+
+

The proxy supports two independent timeout settings that apply at different stages of the connection lifecycle:

+
+
+
    +
  • +

    Unauthenticated timeout (unauthenticatedIdleTimeout): applies to connections where the proxy has not yet detected completed authentication. The proxy considers authentication complete if either of the following is true:

    +
    +
      +
    • +

      A transport subject builder (a component that extracts an authenticated identity from transport-layer attributes) creates a subject with an identity (for example, from a client TLS certificate).

      +
    • +
    • +

      A SASL inspection or termination filter invokes io.kroxylicious.proxy.filter.FilterContext.clientSaslAuthenticationSuccess.

      +
    • +
    +
    +
  • +
  • +

    Authenticated timeout (authenticatedIdleTimeout): applies to connections where an identity has been established, for the remainder of the connection’s lifetime.

    +
  • +
+
+
+ + + + + + + +
+
+

For the proxy to detect authentication completion, you must configure either TLS client certificate authentication or a SASL inspection or termination filter. Without one of these, all connections remain in the unauthenticated state for their entire lifetime, and authenticatedIdleTimeout has no effect. For more information, see the SASL inspection filter guide.

+
+
+
+
+

Both timeout settings are optional and have no default values. You can configure one, both, or neither depending on your requirements. Timeout values use a string-based duration format, following Go conventions (for example, 30s, 5m). Supported units are: h (hours), m (minutes), s (seconds), ms (milliseconds), μs or us (microseconds), and ns (nanoseconds). Units can be combined, for example 1m30s.

+
+
+
+

7.2.4. Configuration examples

+
+
Example: Unauthenticated timeout only
+
+
kind: KafkaProxy
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  namespace: my-proxy
+  name: simple
+spec:
+  network:
+    proxy:
+      unauthenticatedIdleTimeout: 30s (1)
+
+
+
+ + + + + + + +
1Disconnect connections that remain unauthenticated for more than 30 seconds.
+
+
+
Example: Both timeouts configured
+
+
kind: KafkaProxy
+apiVersion: kroxylicious.io/v1alpha1
+metadata:
+  namespace: my-proxy
+  name: simple
+spec:
+  network:
+    proxy:
+      unauthenticatedIdleTimeout: 30s (1)
+      authenticatedIdleTimeout: 10m (2)
+
+
+
+ + + + + + + + + + + +
1Disconnect unauthenticated connections after 30 seconds of inactivity.
2Disconnect authenticated connections after 10 minutes of inactivity.
+
+
+
+

7.2.5. Monitoring idle disconnects

+
+

The proxy tracks idle disconnects using the kroxylicious_client_to_proxy_disconnects_total metric with cause="idle_timeout". This counter increments each time a connection is closed after exceeding the configured idle timeout.

+
+
+

The kroxylicious_client_to_proxy_disconnects_total metric also tracks other disconnect scenarios:

+
+
+
    +
  • +

    cause="idle_timeout" - Connection exceeded the configured idle timeout duration

    +
  • +
  • +

    cause="client_closed" - The downstream client initiated the connection close

    +
  • +
  • +

    cause="server_closed" - The upstream node closed the connection, causing the proxy to close the client connection

    +
  • +
+
+
+

For more information about connection metrics, see Overview of proxy metrics.

+
+
+
+
+
+
+

8. Monitoring

+
+
+

Kroxylicious supports key observability features to help you understand the performance and health of your proxy instances.

+
+
+

The Kroxylicious Proxy and Kroxylicious Operator generate metrics for real-time monitoring and alerting, as well as logs that capture their actions and behavior. You can integrate these metrics with a monitoring system like Prometheus for ingestion and analysis, while configuring log levels to control the granularity of logged information.

+
+
+

8.1. Overview of proxy metrics

+
+

The proxy provides metrics for both connections and messages. These metrics are categorized into downstream (client-side) and upstream (broker-side) groups They allow users to assess the impact of the proxy and its filters on their Kafka system.

+
+
+
    +
  • +

    Connection metrics count the connections made from the downstream (incoming connections from the clients) and the connection made by the proxy to upstream (outgoing connections to the Kafka brokers).

    +
  • +
  • +

    Message metrics count the number of Kafka protocol request and response messages that flow through the proxy.

    +
  • +
+
+
+

8.1.1. Connection metrics

+
+

Connection metrics count the TCP connections made from the client to the proxy (kroxylicious_client_to_proxy_request_total) and from the proxy to the broker (kroxylicious_proxy_to_server_connections_total). These metrics count connection attempts, so the connection count is incremented even if the connection attempt ultimately fails.

+
+
+

In addition to the count metrics, there are active connection gauge metrics that track the current number of open connections, and error metrics.

+
+
+
    +
  • +

    If an error occurs whilst the proxy is accepting a connection from the client the kroxylicious_client_to_proxy_errors_total metric is incremented by one.

    +
  • +
  • +

    If an error occurs whilst the proxy is attempting a connection to a broker the kroxylicious_proxy_to_server_errors_total metric is incremented by one.

    +
  • +
+
+
+

Connection and connection error metrics include the following labels: virtual_cluster (the virtual cluster’s name) and node_id (the broker’s node ID). When the client connects to the boostrap endpoint of the virtual cluster, a node ID value of bootstrap is recorded.

+
+
+

The kroxylicious_client_to_proxy_errors_total metric also counts connection errors that occur before a virtual cluster has been identified. For these specific errors, the virtual_cluster and node_id labels are set to an empty string ("").

+
+
+ + + + + + + +
Error conditions signaled within the Kafka protocol response (such as RESOURCE_NOT_FOUND or UNKNOWN_TOPIC_ID) are not classed as errors by these metrics.
+
+
+
Understanding connection metrics relationships
+
+

The proxy provides several related metrics for tracking connections:

+
+
+
    +
  • +

    Connection counters (kroxylicious_*_connections_total) track the total number of connection attempts over time. These values only increase and provide a historical view of connection activity.

    +
  • +
  • +

    Active connection gauges (kroxylicious_*_active_connections) show the current number of open connections at any given moment. These values increase when connections are established and decrease when connections are closed.

    +
  • +
  • +

    Error counters (kroxylicious_*_errors_total) track connections that closed due to errors.

    +
  • +
  • +

    Disconnect counters (kroxylicious_client_to_proxy_disconnects_total) track connections that closed without errors, categorized by cause.

    +
  • +
+
+
+

When a connection closes, it increments either the error counter or one of the disconnect counter causes, but never both. The active connection gauge decreases regardless of whether the closure was due to an error or a clean disconnect.

+
+
+

The following relationship holds:

+
+
+

Active connections = Connections total - (Errors total + sum of all Disconnect causes)

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Connection metrics for client and broker interactions
Metric NameTypeLabelsDescription
+

kroxylicious_client_to_proxy_connections_total

+
+

Counter

+
+

virtual_cluster, node_id

+
+

Incremented by one every time a connection is accepted from a client by the proxy. +
+ This metric counts all connection attempts that reach the proxy, even those that end in error.

+
+

kroxylicious_client_to_proxy_errors_total

+
+

Counter

+
+

virtual_cluster, node_id

+
+

Incremented by one every time a connection is closed due to any downstream error.

+
+

kroxylicious_proxy_to_server_connections_total

+
+

Counter

+
+

virtual_cluster, node_id

+
+

Incremented by one every time a connection is made to the server from the proxy. +
+ This metric counts all connections attempted to the broker, even those that end in error.

+
+

kroxylicious_proxy_to_server_errors_total

+
+

Counter

+
+

virtual_cluster, node_id

+
+

Incremented by one every time a connection is closed due to any upstream error.

+
+

kroxylicious_client_to_proxy_active_connections

+
+

Gauge

+
+

virtual_cluster, node_id

+
+

Shows the current number of active TCP connections from clients to the proxy. +
+ This gauge reflects real-time connection state and decreases when connections are closed.

+
+

kroxylicious_proxy_to_server_active_connections

+
+

Gauge

+
+

virtual_cluster, node_id

+
+

Shows the current number of active TCP connections from the proxy to servers. +
+ This gauge reflects real-time connection state and decreases when connections are closed.

+
+

kroxylicious_client_to_proxy_disconnects_total

+
+

Counter

+
+

virtual_cluster, node_id, cause

+
+

Incremented by one every time a client connection is closed by the proxy. The cause label indicates the reason for disconnection: +
+ idle_timeout - Connection exceeded the configured idle timeout duration (requires idle timeouts configured via network.proxy.unauthenticatedIdleTimeout or network.proxy.authenticatedIdleTimeout). +
+ client_closed - Client initiated the connection close. +
+ server_closed - Backend server closed the connection, causing the proxy to close the client connection. +
+ Note: Error-based disconnects are tracked separately via kroxylicious_client_to_proxy_errors_total, not this metric.

+
+
+
+
+

8.1.2. Message metrics

+
+

Message metrics count and record the sizes of the Kafka protocol requests and responses that flow through the proxy.

+
+
+

Use these metrics to help understand:

+
+
+
    +
  • +

    the number of messages flowing through the proxy.

    +
  • +
  • +

    the overall volume of data through the proxy.

    +
  • +
  • +

    the effect the filters are having on the messages.

    +
  • +
  • +

    Downstream metrics

    +
    +
      +
    • +

      kroxylicious_client_to_proxy_request_total counts requests as they arrive from the client.

      +
    • +
    • +

      kroxylicious_proxy_to_client_response_total counts responses as they are returned to the client.

      +
    • +
    • +

      kroxylicious_client_to_proxy_request_size_bytes is incremented by the size of each request as it arrives from the client.

      +
    • +
    • +

      kroxylicious_proxy_to_client_response_size_bytes is incremented by the size of each response as it is returned to the client.

      +
    • +
    +
    +
  • +
  • +

    Upstream metrics

    +
    +
      +
    • +

      kroxylicious_proxy_to_server_request_total counts requests as they go to the broker.

      +
    • +
    • +

      kroxylicious_server_to_proxy_response_total counts responses as they are returned by the broker.

      +
    • +
    • +

      kroxylicious_proxy_to_server_request_size_bytes is incremented by the size of each request as it goes to the broker.

      +
    • +
    • +

      kroxylicious_server_to_proxy_response_size_bytes is incremented by the size of each response as it is returned by the broker.

      +
    • +
    +
    +
  • +
+
+
+

The size recorded is the encoded size of the protocol message. It includes the 4 byte message size.

+
+
+

Filters can alter the flow of messages through the proxy or the content of the message. This is apparent through the metrics.

+
+
+
    +
  • +

    If a filter sends a short-circuit, or closes a connection the downstream message counters will exceed the upstream counters.

    +
  • +
  • +

    If a filter changes the size of the message, the downstream size metrics will be different to the upstream size metrics.

    +
  • +
+
+
+
+ Conceptual diagram showing the downstream and upstream message metrics within the proxy, illustrating how they respond to message transit through it. +
+
Figure 3. Downstream and upstream message metrics in the proxy
+
+
+

Message metrics include the following labels: virtual_cluster (the virtual cluster’s name), node_id (the broker’s node ID), api_key (the message type), api_version, and decoded (a flag indicating if the message was decoded by the proxy).

+
+
+

When the client connects to the boostrap endpoint of the virtual cluster, metrics are recorded with a node ID value of bootstrap.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3. Kafka message metrics for proxy request and response flow
Metric NameTypeLabelsDescription
+

kroxylicious_client_to_proxy_request_total

+
+

Counter

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by one every time a request arrives at the proxy from a client.

+
+

kroxylicious_proxy_to_server_request_total

+
+

Counter

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by one every time a request goes from the proxy to a server.

+
+

kroxylicious_server_to_proxy_response_total

+
+

Counter

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by one every time a response arrives at the proxy from a server.

+
+

kroxylicious_proxy_to_client_response_total

+
+

Counter

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by one every time a response goes from the proxy to a client.

+
+

kroxylicious_client_to_proxy_request_total

+
+

Distribution

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by the size of the message each time a request arrives at the proxy from a client.

+
+

kroxylicious_proxy_to_server_request_total

+
+

Distribution

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by the size of the message each time a request goes from the proxy to a server.

+
+

kroxylicious_server_to_proxy_response_total

+
+

Distribution

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by the size of the message each time a response arrives at the proxy from a server.

+
+

kroxylicious_proxy_to_client_response_total

+
+

Distribution

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by the size of the message each time a response goes from the proxy to a client.

+
+
+
+
+

8.2. Overview of operator metrics

+
+

The Kroxylicious Operator is implemented using the Java Operator SDK. The Java Operator SDK exposes metrics that allow its behavior to be understood. These metrics are enabled by default in the Kroxylicious Operator.

+
+
+

Refer to the Java Operator SDK metric documentation to learn more about metrics.

+
+
+
+

8.3. Ingesting metrics

+
+

Metrics from the Kroxylicious Proxy and Kroxylicious Operator can be ingested into your Prometheus instance. The proxy and the operator each expose an HTTP endpoint for Prometheus metrics at the /metrics address. The endpoint does not require authentication.

+
+
+

For the Proxy, the port that exposes the scrape endpoint is named management. For the Operator, the port is named http.

+
+
+

Prometheus can be configured to ingest the metrics from the scrape endpoints.

+
+
+

This guide assumes you are using the Prometheus Operator to configure Prometheus.

+
+
+

8.3.1. Ingesting operator metrics

+
+

This procedure describes how to ingest metrics from the Kroxylicious Operator into Prometheus.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    Apply the PodMonitor configuration:

    +
    +
    +
    apiVersion: monitoring.coreos.com/v1
    +kind: PodMonitor
    +metadata:
    +  name: operator
    +spec:
    +  selector:
    +    matchLabels:
    +      app.kubernetes.io/name: kroxylicious
    +      app.kubernetes.io/component: operator
    +  podMetricsEndpoints:
    +  - path: /metrics
    +    port: http
    +
    +
    +
    +

    The Prometheus Operator reconfigures Prometheus automatically. Prometheus begins to regularly to scrape the Kroxylicious Operator’s metric.

    +
    +
  2. +
  3. +

    Check the metrics are being ingested using a PromQL query such as:

    +
    +
    +
    operator_sdk_reconciliations_queue_size_kafkaproxyreconciler{kind="KafkaProxy", group="kroxylicious.io"}
    +
    +
    +
  4. +
+
+
+
+

8.3.2. Ingesting proxy metrics

+
+

This procedure describes how to ingest metrics from the Kroxylicious Proxy into Prometheus.

+
+
+
Prerequisites
+
    +
  • +

    Kroxylicious Operator is installed.

    +
  • +
  • +

    An instance of Kroxylicious deployed by the operator.

    +
  • +
  • +

    Prometheus Operator is installed, and a Prometheus instance has been created using the Prometheus custom resource.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Apply the PodMonitor configuration:

    +
    +
    +
    apiVersion: monitoring.coreos.com/v1
    +kind: PodMonitor
    +metadata:
    +  name: proxy
    +spec:
    +  selector:
    +    matchLabels:
    +      app.kubernetes.io/name: kroxylicious
    +      app.kubernetes.io/component: proxy
    +  podMetricsEndpoints:
    +  - path: /metrics
    +    port: management
    +
    +
    +
    +

    The Prometheus Operator reconfigures Prometheus automatically. Prometheus begins to regularly to scrape the proxy’s metric.

    +
    +
  2. +
  3. +

    Check the metrics are being ingested using a PromQL query such as:

    +
    +
    +
    kroxylicious_build_info
    +
    +
    +
  4. +
+
+
+
+
+

8.4. Setting log levels

+
+

You can independently control the logging level of both the Kroxylicious Operator and the Kroxylicious Proxy.

+
+
+

In both cases, logging levels are controlled using two environment variables:

+
+
+
    +
  • +

    KROXYLICIOUS_APP_LOG_LEVEL controls the logging of the application (io.kroxylicious loggers). It defaults to INFO.

    +
  • +
  • +

    KROXYLICIOUS_ROOT_LOG_LEVEL controls the logging level at the root. It defaults to WARN.

    +
  • +
+
+
+

When trying to diagnose a problem, start first by raising the logging level of KROXYLICIOUS_APP_LOG_LEVEL. If more detailed diagnostics are required, try raising the KROXYLICIOUS_ROOT_LOG_LEVEL. Both the proxy and operator use Apache Log4J2 and use logging levels understood by it: TRACE, DEBUG, INFO, WARN, and ERROR.

+
+
+ + + + + + + +
WARNING: Running the operator or the proxy at elevated logging levels, such as DEBUG or TRACE, can generate a large volume of logs, which may consume significant storage and affect performance. Run at these levels only as long as necessary.
+
+
+

8.4.1. Overriding proxy logging levels

+
+

This procedure describes how to override the logging level of the Kroxylicious Proxy.

+
+
+
Prerequisites
+
    +
  • +

    An instance of Kroxylicious deployed by the Kroxylicious Operator.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Apply the KROXYLICIOUS_APP_LOG_LEVEL or KROXYLICIOUS_ROOT_LOG_LEVEL environment variable to the proxy’s Kubernetes Deployment resource:

    +
    +
    +
    kubectl set env -n <namespace> deployment <deployment_name> KROXYLICIOUS_APP_LOG_LEVEL=DEBUG
    +
    +
    +
    +

    The Deployment resource has the same name as the KafkaProxy.

    +
    +
    +

    Kubernetes recreates the proxy pod automatically.

    +
    +
  2. +
  3. +

    Verify that the new logging level has taken affect:

    +
    +
    +
    kubectl logs -f -n <namespace> deployment/<deployment_name>
    +
    +
    +
  4. +
+
+
+
Reverting proxy logging levels
+
+

This procedure describes how to revert the logging level of the Kroxylicious Proxy back to its defaults.

+
+
+
Prerequisites
+
    +
  • +

    An instance of Kroxylicious deployed by the Kroxylicious Operator.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Remove the KROXYLICIOUS_APP_LOG_LEVEL or KROXYLICIOUS_ROOT_LOG_LEVEL environment variable from the proxy’s Kubernetes Deployment:

    +
    +
    +
    kubectl set env -n <namespace> deployment <deployment_name> KROXYLICIOUS_APP_LOG_LEVEL-
    +
    +
    +
    +

    Kubernetes recreates the proxy pod automatically.

    +
    +
  2. +
  3. +

    Verify that the logging level has reverted to its default:

    +
    +
    +
    kubectl logs -f -n <namespace> deployment/<deployment_name>
    +
    +
    +
  4. +
+
+
+
+
+

8.4.2. Overriding the operator logging level (operator installed by bundle)

+
+

This procedure describes how to override the logging level of the Kroxylicious Operator. It applies when the operator was installed from the YAML bundle.

+
+
+
Prerequisites
+
    +
  • +

    Kroxylicious Operator installed from the YAML bundle.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Apply the KROXYLICIOUS_APP_LOG_LEVEL or KROXYLICIOUS_ROOT_LOG_LEVEL environment variable to the operator’s Kubernetes Deployment:

    +
    +
    +
    kubectl set env -n kroxylicious-operator deployment kroxylicious-operator KROXYLICIOUS_APP_LOG_LEVEL=DEBUG
    +
    +
    +
    +

    Kubernetes recreates the operator pod automatically.

    +
    +
  2. +
  3. +

    Verify that the new logging level has taken affect:

    +
    +
    +
    kubectl logs -f -n kroxylicious-operator deployment/kroxylicious-operator
    +
    +
    +
  4. +
+
+
+
Reverting operator logging levels
+
+

This procedure describes how to revert the logging level of the Kroxylicious Operator back to its defaults.

+
+
+
Prerequisites
+
    +
  • +

    Kroxylicious Operator installed from the YAML bundle.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Remove the KROXYLICIOUS_APP_LOG_LEVEL or KROXYLICIOUS_ROOT_LOG_LEVEL environment variable from the proxy’s Kubernetes Deployment:

    +
    +
    +
    kubectl set env -n kroxylicious-operator deployment kroxylicious-operator KROXYLICIOUS_APP_LOG_LEVEL-
    +
    +
    +
    +

    Kubernetes recreates the operator pod automatically

    +
    +
  2. +
  3. +

    Verify that the logging level has reverted to its default:

    +
    +
    +
    kubectl logs -f -n kroxylicious-operator deployment/kroxylicious-operator
    +
    +
    +
  4. +
+
+
+
+
+
+
+
+

9. Glossary

+
+
+

Glossary of terms used in the Kroxylicious documentation.

+
+
+
+
API
+
+

Application Programmer Interface.

+
+
CA
+
+

Certificate Authority. An organization that issues certificates.

+
+
CR
+
+

Custom Resource. An instance resource of a CRD. In other words, a resource of a kind that is not built into Kubernetes.

+
+
CRD
+
+

Custom Resource Definition. A Kubernetes API for defining Kubernetes API extensions.

+
+
mTLS
+
+

Mutual Transport Layer Security. A configuration of TLS where the client presents a certificate to a server, which the server authenticates.

+
+
TLS
+
+

The Transport Layer Security. A secure transport protocol where a server presents a certificate to a client, which the client authenticates. TLS was previously known as the Secure Sockets Layer (SSL).

+
+
TCP
+
+

The Transmission Control Protocol.

+
+
+
+
+
+
+

10. Trademark notice

+
+
+
    +
  • +

    Apache Kafka is a registered trademark of The Apache Software Foundation.

    +
  • +
  • +

    Kubernetes is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Prometheus is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Strimzi is a trademark of The Linux Foundation.

    +
  • +
  • +

    Hashicorp Vault is a registered trademark of HashiCorp, Inc.

    +
  • +
  • +

    AWS Key Management Service is a trademark of Amazon.com, Inc. or its affiliates.

    +
  • +
  • +

    Microsoft, Azure, and Microsoft Entra are trademarks of the Microsoft group of companies.

    +
  • +
  • +

    Fortanix and Data Security Manager are trademarks of Fortanix, Inc.

    +
  • +
+
+
+
+ + +{% endraw %} diff --git a/documentation/0.20.0/html/kroxylicious-operator/index.html b/documentation/0.20.0/html/kroxylicious-operator/index.html new file mode 100644 index 0000000..a484a6c --- /dev/null +++ b/documentation/0.20.0/html/kroxylicious-operator/index.html @@ -0,0 +1,11 @@ +--- +layout: guide +title: Kroxylicious Operator for Kubernetes +description: Using the Kroxylicious Operator to deploy and run the Proxy in a Kubernetes + environment. +tags: + - kubernetes +rank: '020' +version: 0.20.0 +permalink: /documentation/0.20.0/html/kroxylicious-operator/ +--- diff --git a/documentation/0.20.0/html/kroxylicious-operator/toc.html b/documentation/0.20.0/html/kroxylicious-operator/toc.html new file mode 100644 index 0000000..6cff87a --- /dev/null +++ b/documentation/0.20.0/html/kroxylicious-operator/toc.html @@ -0,0 +1,51 @@ +{% raw %} +
+ +
+{% endraw %} diff --git a/documentation/0.20.0/html/kroxylicious-proxy/content.html b/documentation/0.20.0/html/kroxylicious-proxy/content.html new file mode 100644 index 0000000..73b6e0f --- /dev/null +++ b/documentation/0.20.0/html/kroxylicious-proxy/content.html @@ -0,0 +1,3060 @@ +{% raw %} + + + +
+
+

About this guide

+
+

This guide covers installing, configuring, securing, and operating the Kroxylicious Proxy in a non-Kubernetes environment. Refer to other Kroxylicious guides for information on running the proxy on Kubernetes using the Kroxylicious Operator, or for advanced topics such as plugin development.

+
+
+
+
+

1. Kroxylicious Proxy overview

+
+
+

Kroxylicious is an Apache Kafka protocol-aware ("Layer 7") proxy designed to enhance Kafka-based systems. Through its filter mechanism it allows additional behavior to be introduced into a Kafka-based system without requiring changes to either your applications or the Kafka cluster itself. Built-in filters are provided as part of the solution.

+
+
+

Functioning as an intermediary, the Kroxylicious mediates communication between a Kafka cluster and its clients. It takes on the responsibility of receiving, filtering, and forwarding messages.

+
+
+

A Java API provides a convenient means for implementing custom logic within the proxy.

+
+
+
Additional resources
+ +
+
+

1.1. Why use proxies?

+
+

Proxies are a powerful and flexible architectural pattern. For Kafka, they can be used to add functionality to Kafka clusters which is not available out-of-the-box with Apache Kafka. In an ideal world, such functionality would be implemented directly in Apache Kafka. But there are numerous practical reasons that can prevent this, for example:

+
+
+
    +
  • +

    Organizations having very niche requirements which are unsuitable for implementation directly in Apache Kafka.

    +
  • +
  • +

    Functionality which requires changes to Kafka’s public API and which the Apache Kafka project is unwilling to implement. This is the case for broker interceptors, for example.

    +
  • +
  • +

    Experimental functionality which might end up being implemented in Apache Kafka eventually. For example using Kroxylicious it’s easier to experiment with alternative transport protocols, such as Quic, or operating system APIs, such as io_uring, because there is already support for this in Netty, the networking framework on which Kroxylicious is built.

    +
  • +
+
+
+

1.1.1. How Kroxylicious works

+
+

First let’s define the concepts in the landscape surrounding Kroxylicious.

+
+
+
    +
  1. +

    Kafka Client, or Client refers to any client application using a Kafka Client library to talk to a Kafka Cluster.

    +
  2. +
  3. +

    Kafka Cluster or Cluster refers to a cluster comprising one or more Kafka Brokers.

    +
  4. +
  5. +

    Downstream refers to the area between Kafka Client and Kroxylicious.

    +
  6. +
  7. +

    Upstream refers to the area between Kroxylicious and a Kafka Cluster.

    +
  8. +
+
+
+
+ Diagram showing Kroxylicious in the context of the applications and the brokers +
+
Figure 1. Kroxylicious landscape
+
+
+

Now let’s define some concepts used within Kroxylicious itself.

+
+
+
Virtual cluster
+
+

The Virtual Cluster is the downstream representation of a Kafka Cluster. At the conceptual level, a Kafka Client connects to a Virtual Cluster. Kroxylicious proxies all communications made to the Virtual Cluster through to a (physical) Kafka Cluster, passing it through the Filter Chain.

+
+
+
+
Virtual cluster gateway
+
+

Each virtual cluster has one or more dedicated gateways, which Kafka clients use to establish connections.

+
+
+

Each gateway exposes a bootstrap endpoint, which the Kafka Client must specify in its configuration as the bootstrap.servers property.

+
+
+

In addition to the bootstrap endpoint, the gateway automatically exposes broker endpoints. There is one broker endpoint for each broker of the physical cluster. When the Client connects to a broker endpoint, Kroxylicious proxies all communications to the corresponding broker of the (physical) Kafka Cluster.

+
+
+

Kroxylicious automatically intercepts all the Kafka RPC responses that contain a broker address. It rewrites the address so that it refers to the corresponding broker endpoint of the Virtual Cluster. This means when the Kafka Client goes to connect to, say broker 0, it does so through the Virtual Cluster.

+
+
+

Defining multiple gateways for a virtual cluster is useful when exposing it across different network segments. For example, in Kubernetes, you might configure one gateway for on-cluster traffic and another for off-cluster traffic.

+
+
+
+
Target cluster
+
+

The Target Cluster is the definition of physical Kafka Cluster within the Kroxylicious itself.

+
+
+

A Virtual Cluster has exactly one Target Cluster.

+
+
+

There can be a one-to-one relationship between Virtual Clusters and Target Clusters. The other possibility is many-to-one, where many Virtual Clusters point to the same Target Cluster. The many-to-one pattern is exploited by filters such as multi-tenancy (Kroxylicious Multi-Tenancy guide).

+
+
+
+ Diagram showing a single virtual cluster proxying a single kafka cluster +
+
Figure 2. One-to-One relationship between Virtual Cluster and Target Cluster
+
+
+
+ Diagram showing many virtual clusters proxying the same kafka cluster +
+
Figure 3. Many-to-one between Virtual Cluster and Target Cluster
+
+
+

A one-to-many pattern, where one Virtual Cluster points to many Target Clusters (providing amalgamation), is not a supported use-case.

+
+
+
+
Filter chain
+
+

A Filter Chain consists of an ordered list of pluggable protocol filters.

+
+
+

A protocol filter implements some logic for intercepting, inspecting and/or manipulating Kafka protocol messages. Kafka protocol requests (such as Produce requests) pass sequentially through each of the protocol filters in the chain, beginning with the 1st filter in the chain and then following with the subsequent filters, before being forwarded to the broker.

+
+
+

When the broker returns a response (such as a Produce response) the protocol filters in the chain are invoked in the reverse order (that is, beginning with the nth filter in the chain, then the n-1th and so on) with each having the opportunity to inspect and/or manipulating the response. Eventually a response is returned to the client.

+
+
+

The description above describes only the basic capabilities of the protocol filter. Richer features of filters are described later.

+
+
+
+ Diagram showing a kafka request message (and its response) being manipulated by several filters. +
+
Figure 4. Illustration of a request and response being manipulated by filters in a chain
+
+
+

As mentioned above, Kroxylicious takes the responsibility to rewrite the Kafka RPC responses that carry broker address information so that they reflect the broker addresses exposed by the Virtual Cluster. These are the Metadata, DescribeCluster and FindCoordinator responses. This processing is entirely transparent to the work of the protocol filters. Filter authors are free to write their own filters that intercept these responses too.

+
+
+
+
Filter composition
+
+

An important principal for the protocol filter API is that filters should compose nicely. That means that filters generally don’t know what other filters might be present in the chain, and what they might be doing to messages. When a filter forwards a request or response it doesn’t know whether the message is being sent to the next filter in the chain, or straight back to the client.

+
+
+

Such composition is important because it means a proxy user can configure multiple filters (possibly written by several filter authors) and expect to get the combined effect of all of them.

+
+
+

It’s never quite that simple, of course. In practice, they will often need to understand what each filter does in some detail in order to be able to operate their proxy properly, for example by understanding whatever metrics each filter is emitting.

+
+
+
+
+

1.1.2. Implementation

+
+

The proxy is written in Java, on top of Netty. The usual ChannelHandlers provided by the Netty project are used where appropriate (e.g. SSL support uses SslHandler), and Kroxylicious provides Kafka-specific handlers of its own.

+
+
+

The Kafka-aware parts use the Apache Kafka project’s own classes for serialization and deserialization.

+
+
+

Protocol filters get executed using a handler-per-filter model.

+
+
+
+

1.1.3. Deployment topologies

+
+

The proxy supports a range of possible deployment topologies. Which style is used depends on what the proxy is meant to achieve, architecturally speaking. Broadly speaking a proxy instance can be deployed:

+
+
+
+
As a forward proxy
+
+

Proxying the access of one or more clients to a particular cluster/broker that might also accessible (to other clients) directly.

+
+

Topic-level encryption provides one example use case for a forward proxy-style deployment. This might be applicable when using clients that don’t support interceptors, or if an organization wants to apply the same encryption policy in a single place, securing access to the keys within their network.

+
+
+
As a reverse proxy
+
+

Proxying access for all clients trying to reach a particular cluster/broker.

+
+

Transparent multi-tenancy provides an example use case for a reverse proxy. While Apache Kafka itself has some features that enable multi-tenancy, they rely on topic name prefixing as the primary mechanism for ensuring namespace isolation. Tenants have to adhere to the naming policy and know they’re a tenant of a larger shared cluster.

+
+
+

Transparent multi-tenancy means each tenant has the illusion of having their own cluster, with almost complete freedom over topic and group naming, while still actually sharing a cluster.

+
+
+
+
+
+

We can further classify deployment topologies in how many proxy instances are used. For example:

+
+
+
    +
  • +

    Single proxy instance (sidecar)

    +
  • +
  • +

    Proxy pool

    +
  • +
+
+
+
+
+

1.2. Compatibility

+
+

Kroxylicious aims to provide consistent compatibility across its public interfaces, including APIs, configuration syntax, and supported plugin types. Kafka compatibility is maintained in alignment with Apache Kafka’s protocol guarantees.

+
+
+

1.2.1. APIs

+
+

Kroxylicious follows Semantic Versioning rules. While we are still in the initial development phase (denoted by a major version 0), we still take API compatibility very seriously. We aim to provide at least two minor releases between deprecation and the removal of that deprecated item.

+
+
+

We also consider our configuration file syntax a public API (though not the Java model backing it). As such, the syntax follows the same Semantic Versioning and deprecation rules.

+
+
+

Kubernetes custom resources are a public API, and we are making every effort to evolve Kroxylicious custom resources in line with Kubernetes best practices.

+
+
+

Kubernetes resources have their own versioning scheme, which is independent of the Kroxylicious Proxy service version. As a result, Kroxylicious may reach version 1.0.0 while still using alpha or beta versions of the custom resources.

+
+
+
Third-party plugins
+
+

Kroxylicious supports loading third-party plugins to extend the core functionality of the project. While these plugins are configured and loaded as first-class entities within Kroxylicious, we cannot guarantee the compatibility of their APIs or configuration properties.

+
+
+

We do however hold filters and plugins provided by the project to the same standards as the rest of the public API.

+
+
+
+
+

1.2.2. Wire protocol

+
+

Kroxylicious offers the same backwards and forwards compatibility guarantees as Apache Kafka. We support the same range of client and broker versions as the official Apache Kafka Java client.

+
+
+
+
+
+
+

2. Configuring proxies

+
+
+

Fine-tune your deployment by configuring proxies to include additional features according to your specific requirements.

+
+
+

2.1. Outline of a Kroxylicious configuration

+
+

The following example shows the overall outline of a simple Kroxylicious configuration. While not complete (as indicated by # …​), it illustrates the essential structure.

+
+
+
Basic outline of a Kroxylicious configuration
+
+
filterDefinitions: (1)
+  - name: example (2)
+    type: org.example.filter.Example (3)
+    config: (4)
+      # ...
+defaultFilters: (5)
+  - example
+virtualClusters: (6)
+  - name: my-cluster-proxy
+    targetCluster: (7)
+      # ...
+    gateways: (8)
+    - name: ...
+      # ...
+    subjectBuilder: (9)
+      # ...
+
+# ...
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1A list of named filter definitions.
2A filter definition called example. The definitions must each have a unique name.
3The name of the filter class implementation for the example filter. Required.
4The configuration for the example filter instance. Usually required for non-trivial filters.
5A list of default filters. It’s possible to override this list at the virtual cluster level.
6List of virtual clusters specified by name, with cluster-specific configurations.
7Configuration of the actual Kafka cluster that is proxied by the 'my-cluster-proxy' virtual cluster.
8Configuration of the gateways for this virtual cluster.
9(Optional) Configuration for the transport subject builder.
+
+
+
+

2.2. Defining filters

+
+

Filters in Kroxylicious can be defined globally with filterDefinitions, applied by default using defaultFilters, or customized for specific virtual clusters. The following example shows how these elements work together flexibly:

+
+
+
Example configuration showing global filter definitions applied as defaults and to virtual cluster
+
+
filterDefinitions:
+  - name: encryption
+    type: RecordEncryption
+    config:
+      # ...
+  - name: validation
+    type: RecordValidation
+    config:
+      # ...
+  - name: special-encryption
+    type: RecordEncryption
+    config:
+      # ...
+defaultFilters:
+  - validation
+  - encryption
+virtualClusters:
+  - name: my-proxy-with-default-filters
+    # ...
+  - name: my-proxy-with-custom-filters
+    filters:
+      - validation
+      - special-encryption
+    # ...
+# ...
+
+
+
+
    +
  • +

    The order of definitions in filterDefinitions does not matter.

    +
  • +
  • +

    Each filter definition in filterDefinitions must have a unique name, but you can have multiple definitions with the same type and different configurations (as with encryption and special-encryption in the example).

    +
  • +
  • +

    The order of defaultFilters determines the sequence in which the filters are applied to incoming client requests. In the example, records are first validated and then encrypted.

    +
  • +
  • +

    The defaultFilters are used for all virtual clusters which don’t define their own filters, such as my-proxy-with-default-filters.

    +
  • +
  • +

    The defaultFilters property is optional. It is useful when all virtual clusters must use the same filters. There’s no need to specify it if all virtual clusters have specific filters defined.

    +
  • +
  • +

    When a virtual cluster has defined filters, like my-proxy-with-custom-filters, then those filters are used instead of the defaultFilters.

    +
  • +
  • +

    When using defaultFilters or a virtual cluster’s filters to reference a filter definition, you must define a filter with the corresponding name in filterDefinitions.

    +
  • +
+
+
+
+

2.3. Configuring virtual clusters

+
+

A Kafka cluster is represented by the proxy as a virtual cluster. Clients communicate with the virtual cluster rather than the actual cluster. When Kroxylicious is deployed, it includes configuration to create virtual clusters.

+
+
+

A virtual cluster has exactly one target cluster, but many virtual clusters can target the same cluster. Each virtual cluster targets a single listener on the target cluster, so multiple listeners on the Kafka side are represented as multiple virtual clusters by the proxy. Clients connect to a virtual cluster using a bootstrapServers address. The virtual cluster has a bootstrap address that maps to each broker in the target cluster. When a client connects to the proxy, communication is proxied to the target broker by rewriting the address. Responses back to clients are rewritten to reflect the appropriate network addresses of the virtual clusters.

+
+
+

You can secure virtual cluster connections from clients and to target clusters.

+
+
+

Kroxylicious accepts key material in the following formats:

+
+
+
    +
  • +

    PKCS #12 keystore format (Public-Key Cryptography Standards).

    +
  • +
  • +

    Keys and certificates as separate PEM (Privacy Enhanced Mail) files. The key must be in PKCS #8 format.

    +
  • +
  • +

    JKS (Java KeyStore) keystore format.

    +
  • +
+
+
+
+

2.4. Configuring virtual cluster gateways

+
+

Clients connect to a virtual cluster gateway. Each gateway provides a bootstrap address for the initial connection. The gateway also facilitates communication between clients and proxied brokers. This can be implemented in two ways:

+
+
+
+
Port Identifies Node
+
+

The gateway binds separate ports—one for each broker as well as an additional one for the bootstrap address. Clients make connections to the different port numbers to interact with each broker.

+
+
SNI Host Identifies Node
+
+

The gateway assigns a unique hostname to each broker. Clients make connections to these distinct hostnames to interact with the respective brokers. The gateway uses SNI (Server Name Indication) to identify the target broker for the client’s connection.

+
+
+
+
+ + + + + + + +
You must make sure that the gateway’s bootstrap address and generated broker addresses are resolvable and routable by the Kafka Client. You must also make sure firewall rules permit traffic to required port numbers.
+
+
+

2.4.1. Port Identifies Node

+
+

In the Port Identifies Node scheme, the virtual cluster opens a separate port for each proxied broker in addition to a separate port for the bootstrap.

+
+
+

By default, this scheme assumes that the target cluster comprises three nodes with broker ids 0..2. If this is inadequate, additional configuration can be provided describing the broker topology of the target broker.

+
+
+

This scheme can be used with both plain and TLS downstream connections.

+
+
+

This scheme works best with straightforward configurations where the target cluster uses a known minimum broker ID and uses stable sets of broker IDs. For more complex cases, it is recommended to use the SNI Host Identifies Node scheme.

+
+
+ + + + + + + +
When using this scheme, you have the responsibility to avoid port number collision. Ensure that each gateway has its own range of port numbers and these do not overlap with the range used by another gateway, or the gateway of another virtual cluster.
+
+
+
Example Port Identifies Node configuration
+
+
# ...
+virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    gateways:
+    - name: mygateway
+      portIdentifiesNode:
+        bootstrapAddress: localhost:9192 (1)
+    # ...
+# ...
+
+
+
+ + + + + + + +
1The bootstrap address used by Kafka clients.
+
+
+

With the example configuration above, the gateway exposes a target cluster of up to three brokers with node ids 0, 1, 2. The advertised address is defaulted to that of the bootstrap host name. Port numbers are assigned sequentially beginning at bootstrap port number + 1.

+
+
+

The gateway exposes the following three broker addresses:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Node IdBroker Address
+

0

+
+

localhost:9193

+
+

1

+
+

localhost:9194

+
+

2

+
+

localhost:9195

+
+
+
Example Port Identifies Node configuration with customized broker address
+
+
# ...
+virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    gateways:
+    - name: mygateway
+      portIdentifiesNode:
+        bootstrapAddress: localhost:9192 (1)
+        advertisedBrokerAddressPattern: mycluster.example.com (2)
+        brokerStartPort: 9200 (3)
+    # ...
+# ...
+
+
+
+ + + + + + + + + + + + + + + +
1The bootstrap address used by Kafka clients.
2(Optional) The advertised broker address pattern used to form broker addresses. If not defined, it defaults to the hostname part of the bootstrap address.
3(Optional) The starting number for the broker port range. Defaults to the port of the bootstrap address plus 1.
+
+
+

With the example configuration above, the gateway exposes a target cluster of up to three brokers with node ids 0, 1, 2. The advertised broker address is defined as mycluster.example.com. Port numbers are assigned sequentially beginning at 9200.

+
+
+

The gateway exposes the following three broker addresses:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Node IdBroker Address
+

0

+
+

mycluster.example.com:9200

+
+

1

+
+

mycluster.example.com:9201

+
+

2

+
+

mycluster.example.com:9202

+
+
+
Example Port Identifies Node configuration with customized node ranges
+
+
# ...
+virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    gateways:
+    - name: mygateway
+      portIdentifiesNode:
+        bootstrapAddress: localhost:9192 (1)
+        advertisedBrokerAddressPattern: mycluster.example.com (2)
+        nodeIdRanges: (3)
+        - name: mixed
+          start: 1
+          end: 3
+        - name: brokers
+          start: 101
+          end: 103
+
+    # ...
+# ...
+
+
+
+ + + + + + + + + + + + + + + +
1The bootstrap address used by Kafka clients.
2(Optional) The advertised broker address pattern used to form broker addresses. If not defined, it defaults to the hostname part of the bootstrap address.
3(Optional) One or more node id ranges. If omitted, it defaults to a single range of node IDs 0..2 (inclusive).
+
+
+

With the example configuration above, the gateway exposes a target cluster of up to six nodes with node ids 1..3 and 101..103. The advertised broker address is defined as mycluster.example.com. Port numbers are assigned sequentially beginning at 9193 (bootstrap port number + 1).

+
+
+

The gateway exposes the following six broker addresses:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Node IdBroker Address
+

1

+
+

mycluster.example.com:9193

+
+

2

+
+

mycluster.example.com:9194

+
+

3

+
+

mycluster.example.com:9195

+
+

101

+
+

mycluster.example.com:9196

+
+

102

+
+

mycluster.example.com:9197

+
+

103

+
+

mycluster.example.com:9198

+
+
+

The advertisedBrokerAddressPattern configuration parameter accepts the $(nodeId) replacement token, which is optional. If included, $(nodeId) is replaced by the broker’s node.id (or broker.id) in the target cluster.

+
+
+
+

2.4.2. SNI Host Identifies Node

+
+

In the SNI Host Identifies Node scheme, unique broker hostnames are used to know where to route the traffic. As this scheme relies on SNI (Server Name Indication), which is a TLS extension, TLS connections are required. It cannot be used with plain text connections.

+
+
+

In this scheme, you can either share the port across multiple virtual cluster gateways or assign a separate port for each virtual cluster gateway. However, you cannot use a port that is already assigned to a virtual cluster gateway using the Port Identifies Node scheme.

+
+
+ + + + + + + +
When using this scheme, you have the responsibility to make sure that DNS for bootstrap and brokers resolve to an IP address that is routed to the proxy. Wildcard DNS is one way to achieve this.
+
+
+
Example SNI Host Identifies Node configuration
+
+
# ...
+virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    gateways:
+    - name: mygateway
+      sniHostIdentifiesNode:
+        bootstrapAddress: mycluster.example.com:9192 (1)
+        advertisedBrokerAddressPattern: mybroker-$(nodeId).mycluster.example.com (2)
+      tls:
+         key: ... (3)
+    # ...
+# ...
+
+
+
+ + + + + + + + + + + + + + + +
1The bootstrap address used by Kafka clients.
2The advertised broker address pattern used to form broker addresses. It must include the placeholder $(nodeId) which is substituted for the node ID.
3TLS configuration.
+
+
+

With the example configuration above, the gateway accepts all traffic on port 9192. Any TLS connections received with the SNI of mycluster.example.com are routed as bootstrap. Any connections received with SNI matching mybroker-$(nodeId).mycluster.example.com are routed to the upstream broker with the same node ID. The configuration exposes a target cluster with any number of brokers. It does not need prior knowledge of the node IDs used by the brokers.

+
+
+

The gateway exposes the following broker addresses:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Node IdBroker Address
+

0

+
+

mybroker-0.mycluster.example.com:9192

+
+

…​

+
+

…​

+
+

n

+
+

mybroker-n.mycluster.example.com:9192

+
+
+

Both the advertisedBrokerAddressPattern and bootstrapAddress configuration parameters accept the $(virtualClusterName) replacement token, which is optional. If included, $(virtualClusterName) is replaced with the name of the gateway’s virtual cluster.

+
+
+
Example SNI Host Identifies Node configuration with customized advertised port
+
+
# ...
+virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    gateways:
+    - name: mygateway
+      sniHostIdentifiesNode:
+        bootstrapAddress: mycluster.example.com:9192 (1)
+        advertisedBrokerAddressPattern: mybroker-$(nodeId).mycluster.example.com:443 (2)
+      tls:
+         key: ... (3)
+    # ...
+# ...
+
+
+
+ + + + + + + + + + + + + + + +
1The bootstrap address used by Kafka clients.
2The advertised broker address pattern and port number used to form broker addresses. It must include the placeholder $(node) which will be substituted for the node id.
3TLS configuration.
+
+
+

With the example configuration above, Kroxylicious is instructed to listen on port 9192, but advertise brokers of this virtual cluster as being available on port 443. This feature is useful where a network intermediary (such as another proxy or load balancer) is port forwarding.

+
+
+

The gateway exposes the following broker addresses:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Node IdBroker Address
+

0

+
+

mybroker-0.mycluster.example.com:443

+
+

…​

+
+

…​

+
+

n

+
+

mybroker-n.mycluster.example.com:443

+
+
+ + + + + + + +
Single port operation may have cost advantages when using load balancers of public clouds, as it allows a single cloud provider load balancer to be shared across all virtual clusters.
+
+
+
+
+

2.5. Securing connections from clients

+
+

To secure client connections to virtual clusters, configure TLS within the virtual cluster gateway by doing the following:

+
+
+
    +
  • +

    Obtain a server certificate for the virtual cluster from a Certificate Authority (CA). +
    + Ensure the certificate matches the names of the virtual cluster gateway’s bootstrap and broker addresses. +
    + This may require wildcard certificates and Subject Alternative Names (SANs).

    +
  • +
  • +

    Provide the TLS configuration using the tls properties in the virtual cluster gateway’s configuration to enable it to present the certificate to clients. Depending on your certificate format, apply one of the following examples.

    +
  • +
  • +

    For mutual TLS, use the trust properties to configure the virtual cluster gateway to use TLS client authentication.

    +
  • +
  • +

    If required, you can restrict the TLS protocols and cipher suites that are used to form the TLS connection.

    +
  • +
+
+
+

Examples below illustrate how these steps may be done.

+
+
+ + + + + + + +
TLS is recommended for production configurations.
+
+
+
Example applying a PKCS #12 server certificate to a virtual cluster gateway
+
+
# ...
+virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    gateways:
+    - name: mygateway
+      # ...
+      tls:
+        key:
+          storeFile: <path>/server.p12  (1)
+          storePassword:
+            passwordFile: <path>/store.password (2)
+          keyPassword:
+            passwordFile: <path>/key.password (3)
+          storeType: PKCS12 (4)
+# ...
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1PKCS #12 store containing the private-key and certificate/intermediates of the virtual cluster gateway.
2Password to protect the PKCS #12 store.
3(Optional) Password for the key. If a password is not specified, the keystore’s password is used to decrypt the key too.
4(Optional) Keystore type. If a keystore type is not specified, the default JKS (Java Keystore) type is used.
+
+
+
Example applying a PEM server certificate and key pair to a virtual cluster gateway
+
+
# ...
+virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    gateways:
+    - name: mygateway
+      # ...
+      tls:
+        key:
+          privateKeyFile: <path>/server.key   (1)
+          certificateFile: <path>/server.crt (2)
+          keyPassword:
+            passwordFile: <path>/key.password (3)
+# ...
+
+
+
+ + + + + + + + + + + + + + + +
1Private key of the virtual cluster gateway.
2Public certificate of the virtual cluster gateway.
3(Optional) Password for the key.
+
+
+

You can configure the virtual cluster gateway to require that clients present a certificate for authentication. The virtual cluster gateway verifies that the client’s certificate is signed by one of the CA certificates contained in a trust store. If verification fails, the client’s connection is refused.

+
+
+
Example applying TLS client authentication using a PKCS #12 truststore
+
+
# ...
+virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    gateways:
+    - name: mygateway
+      # ...
+      tls:
+        key:
+           # ...
+        trust:
+          storeFile: <path>/trust.p12 (1)
+          storePassword:
+            passwordFile: <path>/trust.password (2)
+          storeType: PKCS12 (3)
+          trustOptions:
+            clientAuth: REQUIRED (4)
+# ...
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1PKCS #12 store containing CA certificates used to verify that the client’s certificate is trusted.
2(Optional) Password to protect the PKCS #12 store.
3(Optional) Keystore type. If a keystore type is not specified, the default JKS (Java Keystore) type is used.
4(Optional) Client authentication mode. If set to REQUIRED, the client must present a valid certificate. If set to REQUESTED, the client is requested to present a certificate. If presented, the certificate is validated. If the client chooses not to present a certificate the connection is still allowed. If set to NONE, client authentication is disabled. If a client authentication mode is not specified, then the default behaviour is REQUIRED.
+
+
+ + + + + + + +
The client’s identity, as established through TLS client authentication, is currently not relayed to the target cluster. For more information, see the related issue.
+
+
+

You can restrict the TLS protocols by specifying either an allow list of TLS protocols to be enabled, or a deny list of TLS protocols to be disallowed from the platform’s default. If both an allow and a deny list are specified, the resulting list of TLS protocols includes only those protocols from the allow list that are not in the deny list. If neither list is specified, the virtual cluster uses the default TLS protocols provided by the platform.

+
+
+

When the client connects, it negotiates the highest mutually acceptable TLS protocol with the virtual cluster. If the two have no protocols in common, the connection fails.

+
+
+

The names of the TLS protocols are defined by Java specification.

+
+
+
Example restricting TLS protocols using an allow list
+
+
virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    gateways:
+    - name: mygateway
+      # ...
+      tls:
+        # ...
+        protocols:
+          allowed:  (1)
+          - TLSv1.3
+          - TLSv1.2
+
+
+
+ + + + + + + +
1List of allowed TLS protocols.
+
+
+
Example restricting TLS protocols using a deny list
+
+
virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    gateways:
+    - name: mygateway
+      # ...
+      tls:
+        # ...
+        protocols:
+          denied:  (1)
+          - TLSv1.1
+
+
+
+ + + + + + + +
1List of disallowed TLS protocols.
+
+
+

You can restrict the TLS cipher suite by specifying either an allow list of cipher suites to be enabled, in preference order, or a deny list of ciphers suites to be disallowed from the platform’s default. If both an allow and a deny list are specified, the resulting list of cipher suites includes only those ciphers from the allow list that are not in the deny list. If neither list is specified, the virtual cluster uses the default cipher suites (and preference order) provided by the platform.

+
+
+

When the client connects, it negotiates the most preferred mutually acceptable cipher suite with the virtual cluster. If the two have no cipher suites in common, the connection fails.

+
+
+

The names of the cipher suite are defined by Java specification.

+
+
+
Example restricting cipher suites using an allow list
+
+
virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    gateways:
+    - name: mygateway
+      # ...
+      tls:
+        # ...
+        cipherSuites:
+          allowed:  (1)
+          - TLS_ECDHE_ECDSA_WITH_AES_256_CCM
+          - TLS_ECDHE_ECDSA_WITH_AES_128_CCM
+
+
+
+ + + + + + + +
1List of allowed cipher suites in preference order.
+
+
+
Example restricting cipher suites using a deny list
+
+
virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    gateways:
+    - name: mygateway
+      # ...
+      tls:
+        # ...
+        cipherSuites:
+          denied:  (1)
+          - TLS_KRB5_WITH_3DES_EDE_CBC_MD5
+
+
+
+ + + + + + + +
1List of disallowed cipher suites.
+
+
+
+

2.6. Configuring a target cluster

+
+

The target cluster defines the physical upstream Kafka cluster that is proxied by the my-cluster-proxy virtual cluster.

+
+
+

The target cluster configuration defines three properties:

+
+
+
    +
  1. +

    bootstrapServers: Comma-separated list of bootstrap addresses for the Kafka cluster being proxied. If the cluster exposes a bootstrap endpoint (as is the case with some cloud-based Kafka services or clusters managed by Strimzi), use that address. If the cluster does not have a specific bootstrap endpoint (as is the case with a standard Kafka deployment) list the address of several broker nodes. This helps spread the bootstrapping load and improves reliability.

    +
  2. +
  3. +

    bootstrapServerSelection.strategy: The bootstrapping process selects one bootstrap server from the list of configured servers. This property defines the strategy used to select the bootstrap server. The following strategies are supported:

    +
    +
      +
    1. +

      round-robin: This strategy selects a server from the configured list of servers in a round-robin manner starting from the first server, looping back after the last server is selected. This is the default strategy used when no strategy is explicitly configured.

      +
    2. +
    3. +

      random: This strategy selects a random server from the configured list of servers.

      +
    4. +
    +
    +
  4. +
  5. +

    tls: TLS configuration for connecting to the target Kafka cluster. See Securing connections to target clusters for more details.

    +
  6. +
+
+
+

The following examples illustrate the strategies that can be used for selecting a bootstrap server from the list of configured addresses.

+
+
+

When multiple bootstrap servers are configured with no bootstrap server selection strategy explicitly configured, the bootstrap server is selected using the round-robin strategy.

+
+
+
Example using default strategy
+
+
#...
+virtualClusters:
+    - name: my-cluster-proxy
+      # ...
+      targetCluster:
+        bootstrapServers: my-cluster-kafka-bootstrap-0.kafka.svc.cluster.local:9093,my-cluster-kafka-bootstrap-1.kafka.svc.cluster.local:9093,my-cluster-kafka-bootstrap-2.kafka.svc.cluster.local:9093
+        tls: {}
+#...
+
+
+
+

The following example illustrates how to explicitly configure a bootstrap server selection strategy.

+
+
+
Example configuring a bootstrap server selection strategy
+
+
#...
+virtualClusters:
+  - name: my-cluster-proxy
+    #...
+    targetCluster:
+      bootstrapServers: my-cluster-kafka-bootstrap-0.kafka.svc.cluster.local:9093,my-cluster-kafka-bootstrap-1.kafka.svc.cluster.local:9093,my-cluster-kafka-bootstrap-2.kafka.svc.cluster.local:9093
+      bootstrapServerSelection:
+        strategy: "round-robin" (1)
+      tls: {}
+#...
+
+
+
+ + + + + + + +
1Round-robin strategy for bootstrap server selection.
+
+
+
+

2.7. Securing connections to target clusters

+
+

To secure connections from the virtual cluster to the upstream cluster, configure the target cluster’s TLS setting by doing the following:

+
+
+
    +
  • +

    If the upstream is using a private CA, use the trust properties to configure a truststore for the target cluster.

    +
  • +
  • +

    If you want to use mutual TLS, specify the certificate with the key property to identify the virtual cluster to the upstream.

    +
  • +
  • +

    If required, you can restrict the TLS protocols and cipher suites that are used to form the TLS connection.

    +
  • +
+
+
+ + + + + + + +
TLS is recommended on Kafka clients and virtual clusters for production configurations.
+
+
+

Examples below illustrate how these steps may be done.

+
+
+

Using an empty object ({}) enables TLS using the platform’s defaults. This means that platform trust, and default protocols and cipher suites will be used. This option is suitable if the upstream cluster is using a TLS certificate signed by a public CA and the platform’s defaults are suitable.

+
+
+
Example enabling TLS for a target cluster using platform defaults
+
+
# ...
+virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    targetCluster:
+      bootstrapServers: my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9093
+      tls: {}
+# ...
+
+
+
+

If it is using a TLS certificate signed by a private CA, you must add truststore configuration for the target cluster. The example illustrates using PKCS #12 format. PEM format is supported too.

+
+
+
Example specifying a truststore
+
+
# ...
+virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    targetCluster:
+      bootstrapServers: my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9093
+      tls:
+        trust:
+          storeFile: <path>/trust.p12 (1)
+          storePassword:
+            passwordFile: <path>/store.password (2)
+          storeType: PKCS12 (3)
+# ...
+
+
+
+ + + + + + + + + + + + + + + +
1PKCS #12 store for the public CA certificate of the Kafka cluster.
2Password to access the public Kafka cluster CA certificate.
3(Optional) Keystore type. If a keystore type is not specified, the default JKS (Java Keystore) type is used.
+
+
+

For mutual TLS, add a keystore configuration for the virtual cluster. The following example uses a PEM format server certificate and key pair. PKCS #12 keystore format is supported too.

+
+
+
Example configuring mutual TLS
+
+
# ...
+virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    targetCluster:
+      bootstrapServers: my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9093
+      tls:
+        key:
+          privateKeyFile: <path>/client.key (1)
+          certificateFile: <path>/client.crt (2)
+# ...
+
+
+
+ + + + + + + + + + + +
1Private key of the virtual cluster.
2Public CA certificate of the virtual cluster.
+
+
+

The TLS protocols and cipher suites available to the TLS connection may also be configured.

+
+
+
Example restricting TLS protocols using an allow list
+
+
# ...
+virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    targetCluster:
+      bootstrapServers: my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9093
+      tls:
+        # ...
+        protocols:
+          allowed:  (1)
+          - TLSv1.3
+          - TLSv1.2
+
+
+
+ + + + + + + +
1List of allowed TLS protocols.
+
+
+
Example restricting TLS protocols using a deny list
+
+
virtualClusters:
+  - name: my-cluster-proxy
+    targetCluster:
+      bootstrapServers: my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9093
+      tls:
+        # ...
+        protocols:
+          denied:  (1)
+          - TLSv1.1
+
+
+
+ + + + + + + +
1List of disallowed TLS protocols.
+
+
+
Example restricting cipher suites using an allow list
+
+
virtualClusters:
+  - name: my-cluster-proxy
+    targetCluster:
+      bootstrapServers: my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9093
+      tls:
+        # ...
+        cipherSuites:
+          allowed:  (1)
+          - TLS_ECDHE_ECDSA_WITH_AES_256_CCM
+          - TLS_ECDHE_ECDSA_WITH_AES_128_CCM
+
+
+
+ + + + + + + +
1List of allowed cipher suites.
+
+
+
Example restricting cipher suites using a deny list
+
+
virtualClusters:
+  - name: my-cluster-proxy
+    targetCluster:
+      bootstrapServers: my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9093
+      tls:
+        # ...
+        cipherSuites:
+          denied:  (1)
+          - TLS_KRB5_WITH_3DES_EDE_CBC_MD5
+
+
+
+ + + + + + + +
1List of disallowed cipher suites.
+
+
+

For the purposes of testing (that is, outside a production environment), you can set the insecure property to true to disable TLS trust checks (hostname verification and certificate validation) so that the Kroxylicious can connect to any Kafka cluster.

+
+
+
Example configuration to disable TLS trust checks
+
+
virtualClusters:
+  - name: my-cluster-proxy
+    targetCluster:
+      bootstrapServers: dev-cluster-kafka-bootstrap.kafka.svc.cluster.local:9093
+      tls:
+        trust:
+          insecure: true
+# ...
+
+
+
+
+

2.8. Configuring the transport subject builder

+
+

Some filters require the verified identity of the client, derived from successful authentication. This identity is called the authenticated subject.

+
+
+

For applications that use TLS client authentication, the virtual cluster can build the authenticated subject from information in the TLS client certificate presented to the proxy.

+
+
+

The transport subject builder controls how certificate information is turned into principals within the authenticated subject. For example, you can build a principal from parts of the X500 principal. A typical use case is mapping a distinguished name such as CN=myapp,OU=dev,O=kroxylicious.io,C=US to myapp.

+
+
+ + + + + + + +
For applications that use SASL authentication, see the SASL Inspection guide for information on building the authenticated subject from a successful client–broker SASL authentication.
+
+
+

2.8.1. Configuration

+
+

The following example shows configuration for the transport subject builder:

+
+
+
+
# ...
+virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    subjectBuilder:
+      type: DefaultTransportSubjectBuilderService
+      config:
+        addPrincipals:
+          - from: <field name>
+            map:
+              - replaceMatch: <match replace flags 1>
+              - # ...
+              - replaceMatch: <match replace flags n>
+              - else: identity|anonymous
+            principalFactory: <principal factory>
+        # - from: ...
+
+
+
+

where:

+
+
+
    +
  • +

    <field name> identifies the field to extract. Valid field names are listed in the Supported fields table.

    +
  • +
  • +

    <match replace flags 1>…​<match replace flags n> define a set of replacement matchers used to match and transform the field value.

    +
  • +
  • +

    else defines the behavior when none of the replacement matchers match the field value. identity generates a principal based on the original (unmapped) field value. anonymous generates an anonymous principal.

    +
  • +
  • +

    <principal factory> the name of a PrincipalFactory implementation. Currently, only UserFactory is supported.

    +
  • +
+
+
+

Field values are tested against the replacement matchers in the order they are configured. The first matcher that matches the field value generates the principal. After a successful match, remaining matchers for that field are ignored.

+
+
+

If no matcher matches, the outcome is defined by the else clause. If there is no match and no else cause is provided, no principal is generated for this field.

+
+
+ + + + + + + +
Currently, the subject builder is restricted to producing a subject containing at most one user principal.
+
+
+
+

2.8.2. Supported fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field nameDescription
+

clientTlsSubject

+
+

X500 Principal

+
+

clientTlsSanRfc822Name

+
+

Email address from the Subject Alternate Names

+
+

clientTlsSanDirName

+
+

DirName from the Subject Alternate Names

+
+

clientTlsSanDnsName

+
+

DNSName from the Subject Alternate Names

+
+

clientTlsSanUri

+
+

URI from the Subject Alternate Names

+
+
+
+

2.8.3. Replacement matchers

+
+

Replacement matchers control how field values are matched and transformed. A replacement matcher is defined using this format:

+
+
+
+
/<matching regular expression>/<replacement>/<flags>
+
+
+
+

where:

+
+
+
    +
  • +

    <matching regular expression> is the regular expression used to test the field value.

    +
  • +
  • +

    <replacement> defines the replacement value to use when the regular expression is matched. The replacement can use back references ($1 etc) to refer to capturing groups defined within the regular expression.

    +
  • +
  • +

    <flags> (optional) can be either L or U for lower or upper-casing respectively. The case transformation is applied to the replacement value after any back reference resolution.

    +
  • +
+
+
+
+
+

2.9. Configuring per-virtual cluster logging

+
+

You can enable low level logging on a per-virtual cluster basis. The logNetwork property controls logging of information about requests and responses at the network level, before they’ve been decoded into Kafka requests and responses. The logFrames property controls logging of the decoded requests and responses.

+
+
+
Configuration fragment showing logging properties
+
+
# ...
+virtualClusters:
+  - name: my-cluster-proxy
+    # ...
+    logNetwork: true (1)
+    logFrames: true (2)
+    # ...
+
+
+
+ + + + + + + + + + + +
1Enables low-level network logging for the virtual cluster.
2Enables low-level protocol frame logging for the virtual cluster.
+
+
+
+

2.10. Configuring management HTTP endpoints

+
+

The proxy can run an HTTP server for exposing basic management information. This is configured with the top level management property.

+
+
+
+ Configuration fragment showing the management property +
+
+
# ... (filterDefinitions, virtualClusters etc)
+management:
+  bindAddress: 0.0.0.0 (1)
+  port: 9190 (2)
+  endpoints: (3)
+    prometheus: {} (4)
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1The address the HTTP server should bind to. Defaults to 0.0.0.0.
2The port the HTTP server should bind to. Defaults to 9190.
3Control over the exposed endpoints
4If present and not null, exposes a Prometheus scrape endpoint at path /metrics.
+
+
+
+

2.11. Configuring network and Netty settings

+
+

The proxy allows configuration of network settings for both the proxy endpoints (client-facing) and management endpoints using the network.proxy and network.management properties. These settings control low-level Netty behavior and are optional, with sensible defaults provided.

+
+
+
Configuration fragment showing network settings
+
+
network:
+  proxy: (1)
+    workerThreadCount: 8 (2)
+    shutdownQuietPeriod: 5s (3)
+    shutdownTimeout: 20s (4)
+  management: (5)
+    workerThreadCount: 2
+    shutdownQuietPeriod: 5s
+    shutdownTimeout: 20s
+virtualClusters:
+  # ...
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
1Network settings for the proxy listener that handles client connections.
2Optional: Number of Netty worker threads for handling concurrent connections. Defaults to twice the number of available processors.
3Optional: Grace period during which the proxy continues to accept and complete in-flight requests before shutting down. If no new requests arrive during this window, shutdown proceeds. Defaults to 2s if not specified. Uses Go-style duration format (for example, 30s, 5m).
4Optional: Maximum time allowed for the proxy to complete shutdown. If shutdown does not complete within this period, it is forced. Defaults to 15s if not specified. Uses Go-style duration format.
5Network settings for the management HTTP server. Can be configured independently from the proxy listener settings.
+
+
+

Supported duration units are: h (hours), m (minutes), s (seconds), ms (milliseconds), μs or us (microseconds), and ns (nanoseconds). Units can be combined, for example 1m30s.

+
+
+
    +
  • +

    The workerThreadCount setting allows tuning for high-concurrency deployments. Increasing this value can improve throughput when handling many simultaneous client connections.

    +
  • +
  • +

    The shutdownQuietPeriod and shutdownTimeout settings together control graceful shutdown behaviour. shutdownQuietPeriod should always be less than or equal to shutdownTimeout.

    +
  • +
+
+
+ + + + + + + +
+
+

The shutdownQuietPeriodSeconds property (an integer number of seconds) is deprecated and will be removed in a future release. Use shutdownQuietPeriod with a Go-style duration string instead (for example, shutdownQuietPeriod: 2s).

+
+
+
+
+
+

2.12. Configuring idle connection timeouts

+
+

The proxy can automatically disconnect idle client connections to reclaim resources. Idle timeout configuration is completely optional and disabled by default, allowing you to opt in only when needed for your deployment.

+
+
+

2.12.1. When to enable idle timeouts

+
+

Consider enabling idle timeouts in the following scenarios:

+
+
+
    +
  • +

    Security posture: unauthenticated connections can be closed quickly to limit the window for abuse, while authenticated connections get a more generous timeout.

    +
  • +
  • +

    Unclosed connections: clients that abandon connections without properly closing them, leaving resources allocated unnecessarily.

    +
  • +
  • +

    Network infrastructure requirements: environments where firewalls or load balancers drop idle connections, configure the proxy to disconnect gracefully first.

    +
  • +
+
+
+
+

2.12.2. When not to enable idle timeouts

+
+

Avoid enabling idle timeouts in the following scenarios:

+
+
+
    +
  • +

    Legitimate idle connections: applications that maintain long-lived connections with extended idle periods, such as consumers with long poll timeouts or applications using connection pooling.

    +
  • +
  • +

    Stable network infrastructure: environments with reliable network infrastructure and no issues with idle connection management.

    +
  • +
+
+
+
+

2.12.3. How idle timeouts work

+
+

The proxy supports two independent timeout settings that apply at different stages of the connection lifecycle:

+
+
+
    +
  • +

    Unauthenticated timeout (unauthenticatedIdleTimeout): applies to connections where the proxy has not yet detected completed authentication. The proxy considers authentication complete if either of the following is true:

    +
    +
      +
    • +

      A transport subject builder (a component that extracts an authenticated identity from transport-layer attributes) creates a subject with an identity (for example, from a client TLS certificate).

      +
    • +
    • +

      A SASL inspection or termination filter invokes io.kroxylicious.proxy.filter.FilterContext.clientSaslAuthenticationSuccess.

      +
    • +
    +
    +
  • +
  • +

    Authenticated timeout (authenticatedIdleTimeout): applies to connections where an identity has been established, for the remainder of the connection’s lifetime.

    +
  • +
+
+
+ + + + + + + +
+
+

For the proxy to detect authentication completion, you must configure either TLS client certificate authentication or a SASL inspection or termination filter. Without one of these, all connections remain in the unauthenticated state for their entire lifetime, and authenticatedIdleTimeout has no effect. For more information, see the SASL inspection filter guide.

+
+
+
+
+

Both timeout settings are optional and have no default values. You can configure one, both, or neither depending on your requirements. Timeout values use a string-based duration format, following Go conventions (for example, 30s, 5m). Supported units are: h (hours), m (minutes), s (seconds), ms (milliseconds), μs or us (microseconds), and ns (nanoseconds). Units can be combined, for example 1m30s.

+
+
+
+

2.12.4. Configuration examples

+
+
Example: Unauthenticated timeout only
+
+
network:
+  proxy:
+    unauthenticatedIdleTimeout: 30s (1)
+virtualClusters:
+  # ...
+
+
+
+ + + + + + + +
1Disconnect connections that remain unauthenticated for more than 30 seconds.
+
+
+
Example: Authenticated timeout only
+
+
network:
+  proxy:
+    authenticatedIdleTimeout: 5m (1)
+virtualClusters:
+  # ...
+
+
+
+ + + + + + + +
1Disconnect authenticated connections that are idle for more than 5 minutes.
+
+
+
Example: Both timeouts configured
+
+
network:
+  proxy:
+    unauthenticatedIdleTimeout: 30s (1)
+    authenticatedIdleTimeout: 10m (2)
+virtualClusters:
+  # ...
+
+
+
+ + + + + + + + + + + +
1Disconnect unauthenticated connections after 30 seconds of inactivity.
2Disconnect authenticated connections after 10 minutes of inactivity.
+
+
+
+

2.12.5. Monitoring idle disconnects

+
+

The proxy tracks idle disconnects using the kroxylicious_client_to_proxy_disconnects_total metric with cause="idle_timeout". This counter increments each time a connection is closed after exceeding the configured idle timeout.

+
+
+

The kroxylicious_client_to_proxy_disconnects_total metric also tracks other disconnect scenarios:

+
+
+
    +
  • +

    cause="idle_timeout" - Connection exceeded the configured idle timeout duration

    +
  • +
  • +

    cause="client_closed" - The downstream client initiated the connection close

    +
  • +
  • +

    cause="server_closed" - The upstream node closed the connection, causing the proxy to close the client connection

    +
  • +
+
+
+

For more information about connection metrics, see Overview of proxy metrics.

+
+
+
+
+

2.13. Example Kroxylicious configuration

+
+
    +
  • +

    Virtual clusters that represent the Kafka clusters

    +
  • +
  • +

    Network addresses for broker communication in a Kafka cluster

    +
  • +
  • +

    Filters to introduce additional functionality to the Kafka deployment

    +
  • +
+
+
+

In this example, configuration for the Record Encryption filter is shown.

+
+
+
Example Kroxylicious configuration
+
+
filterDefinitions: (1)
+  - name: encryption
+    type: RecordEncryption (2)
+    config: (3)
+      kms: VaultKmsService
+      kmsConfig:
+        vaultTransitEngineUrl: https://vault.vault.svc.cluster.local:8200/v1/transit
+        vaultToken:
+          passwordFile: /opt/proxy/server/token.txt
+        tls: (4)
+          key:
+            storeFile: /opt/cert/server.p12
+            storePassword:
+              passwordFile: /opt/cert/store.password
+            keyPassword:
+              passwordFile: /opt/cert/key.password
+            storeType: PKCS12
+      selector: TemplateKekSelector
+      selectorConfig:
+        template: "$(topicName)"
+defaultFilters:
+  - encryption
+virtualClusters: (5)
+  - name: my-cluster-proxy (6)
+    targetCluster:
+      bootstrapServers: my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9093 (7)
+      bootstrapServerSelection:
+        strategy: "round-robin" (8)
+      tls: (9)
+        trust:
+          storeFile: /opt/proxy/trust/ca.p12
+          storePassword:
+            passwordFile: /opt/proxy/trust/ca.password
+    gateways: (10)
+    - name: mygateway
+      sniHostIdentifiesNode: (11)
+        bootstrapAddress: my-cluster-proxy.kafka:9092 (12)
+        advertisedBrokerAddressPattern: broker$(nodeId).my-cluster-proxy.kafka
+      tls: (13)
+        key:
+          storeFile: /opt/proxy/server/key-material/keystore.p12
+          storePassword:
+            passwordFile: /opt/proxy/server/keystore-password/storePassword
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1A list of named filter configurations.
2The type of filter, which is the Record Encryption filter using Vault as the KMS in this example.
3The configuration specific to the type of filter.
4If required, you can also specify the credentials for TLS authentication with the KMS, with key names under which TLS certificates are stored.
5Virtual cluster configuration.
6The name of the virtual cluster.
7The bootstrap addresses of the target physical Kafka Cluster being proxied.
8The strategy used for selecting an address from 'bootstrapServers' when the proxy receives a client connection. Options are 'round-robin' (default) or 'random'.
9TLS configuration for the connection to the target cluster.
10The gateway of the virtual cluster defining how the virtual cluster is presented to the network.
11The identification scheme used to route traffic to brokers, which can be sniHostIdentifiesNode or portIdentifiesNode.
12The hostname and port of the bootstrap used by the Kafka clients to connect to the gateway. The hostname must be resolved by the clients.
13TLS encryption used by the gateway for securing connections with the clients.
+
+
+
+
+
+

3. Built-in filters

+
+
+

Kroxylicious comes with a suite of built-in filters designed to enhance the functionality and security of your Kafka clusters.

+
+
+

3.1. Authorization filter

+
+

The Kroxylicious Authorization filter enables the proxy to enforce authorization rules on client requests before they reach the Kafka brokers. For information on using the filter, see the Authorization guide.

+
+
+
+

3.2. Record Encryption filter

+
+

The Kroxylicious Record Encryption filter enables encryption-at-rest for Apache Kafka clusters. For information on using the filter, see the Record Encryption guide.

+
+
+
+

3.3. Record Validation filter

+
+

The Kroxylicious Record Validation filter validates records sent by Kafka client to Kafka brokers. For information on using the filter, see the Record Validation guide.

+
+
+
+

3.4. Multi-tenancy filter

+
+

The Kroxylicious multi-tenancy filter presents a single Kafka cluster to tenants as if it were multiple clusters. For information on using the filter, see the Kroxylicious Multi-Tenancy guide.

+
+
+
+

3.5. Oauth Bearer Validation filter

+
+

The Kroxylicious Oauth Bearer Validation filter enables a validation on the JWT token received from client before forwarding it to cluster. For information on using the filter, see the OAuth Bearer Validation guide.

+
+
+
+

3.6. SASL Inspection filter

+
+

The Kroxylicious SASL Inspection filter extracts the authenticated principal from a successful SASL exchange between Kafka Client and Kafka Broker and makes it available to the other filters in the chain. For information on using the filter, see the SASL Inspection guide.

+
+
+
+

3.7. Connection Expiration filter

+
+

The Kroxylicious Connection Expiration filter closes client connections after a configurable expiration age. This is useful in dynamic environments like Kubernetes where proxy instances scale up and down, helping to rebalance connections across proxy instances. For information on using the filter, see the Connection Expiration guide.

+
+
+
+
+
+

4. Community filters

+
+
+

Community contributed filters are showcased in the Community Gallery.

+
+
+ + + + + + + +
These filters are contributed by the community and are not managed or maintained by the Kroxylicious team. Use them at your own risk.
+
+
+
+
+

5. Monitoring proxies

+
+
+

Kroxylicious supports key observability features to help you understand the performance and health of your proxy instances.

+
+
+

The Kroxylicious Proxy supports real-time monitoring and alerting by emitting system metrics. You can configure metric emission within the proxy and integrate it with a monitoring system like Prometheus to ingest and analyze the data.

+
+
+

The Kroxylicious Proxy writes a log so that its actions may be understood over time. You can adjust log levels and customize logging as described in this section.

+
+
+

5.1. Introducing metrics

+
+

If you want to introduce metrics to your Kroxylicious deployment, you can configure an insecure HTTP and Prometheus endpoint (at /metrics).

+
+
+

Add the following to the ConfigMap resource that defines the Kroxylicious configuration:

+
+
+
Minimal metrics configuration
+
+
management:
+  endpoints:
+    prometheus: {}
+
+
+
+

By default, the HTTP endpoint listens on 0.0.0.0:9190. You can change the bind address and port as follows:

+
+
+
Example metrics configuration with bind address and port
+
+
management:
+  bindAddress: 127.0.0.1
+  port: 9999
+  endpoints:
+    prometheus: {}
+
+
+
+
+

5.2. Overview of proxy metrics

+
+

The proxy provides metrics for both connections and messages. These metrics are categorized into downstream (client-side) and upstream (broker-side) groups They allow users to assess the impact of the proxy and its filters on their Kafka system.

+
+
+
    +
  • +

    Connection metrics count the connections made from the downstream (incoming connections from the clients) and the connection made by the proxy to upstream (outgoing connections to the Kafka brokers).

    +
  • +
  • +

    Message metrics count the number of Kafka protocol request and response messages that flow through the proxy.

    +
  • +
+
+
+

5.2.1. Connection metrics

+
+

Connection metrics count the TCP connections made from the client to the proxy (kroxylicious_client_to_proxy_request_total) and from the proxy to the broker (kroxylicious_proxy_to_server_connections_total). These metrics count connection attempts, so the connection count is incremented even if the connection attempt ultimately fails.

+
+
+

In addition to the count metrics, there are active connection gauge metrics that track the current number of open connections, and error metrics.

+
+
+
    +
  • +

    If an error occurs whilst the proxy is accepting a connection from the client the kroxylicious_client_to_proxy_errors_total metric is incremented by one.

    +
  • +
  • +

    If an error occurs whilst the proxy is attempting a connection to a broker the kroxylicious_proxy_to_server_errors_total metric is incremented by one.

    +
  • +
+
+
+

Connection and connection error metrics include the following labels: virtual_cluster (the virtual cluster’s name) and node_id (the broker’s node ID). When the client connects to the boostrap endpoint of the virtual cluster, a node ID value of bootstrap is recorded.

+
+
+

The kroxylicious_client_to_proxy_errors_total metric also counts connection errors that occur before a virtual cluster has been identified. For these specific errors, the virtual_cluster and node_id labels are set to an empty string ("").

+
+
+ + + + + + + +
Error conditions signaled within the Kafka protocol response (such as RESOURCE_NOT_FOUND or UNKNOWN_TOPIC_ID) are not classed as errors by these metrics.
+
+
+
Understanding connection metrics relationships
+
+

The proxy provides several related metrics for tracking connections:

+
+
+
    +
  • +

    Connection counters (kroxylicious_*_connections_total) track the total number of connection attempts over time. These values only increase and provide a historical view of connection activity.

    +
  • +
  • +

    Active connection gauges (kroxylicious_*_active_connections) show the current number of open connections at any given moment. These values increase when connections are established and decrease when connections are closed.

    +
  • +
  • +

    Error counters (kroxylicious_*_errors_total) track connections that closed due to errors.

    +
  • +
  • +

    Disconnect counters (kroxylicious_client_to_proxy_disconnects_total) track connections that closed without errors, categorized by cause.

    +
  • +
+
+
+

When a connection closes, it increments either the error counter or one of the disconnect counter causes, but never both. The active connection gauge decreases regardless of whether the closure was due to an error or a clean disconnect.

+
+
+

The following relationship holds:

+
+
+

Active connections = Connections total - (Errors total + sum of all Disconnect causes)

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Connection metrics for client and broker interactions
Metric NameTypeLabelsDescription
+

kroxylicious_client_to_proxy_connections_total

+
+

Counter

+
+

virtual_cluster, node_id

+
+

Incremented by one every time a connection is accepted from a client by the proxy. +
+ This metric counts all connection attempts that reach the proxy, even those that end in error.

+
+

kroxylicious_client_to_proxy_errors_total

+
+

Counter

+
+

virtual_cluster, node_id

+
+

Incremented by one every time a connection is closed due to any downstream error.

+
+

kroxylicious_proxy_to_server_connections_total

+
+

Counter

+
+

virtual_cluster, node_id

+
+

Incremented by one every time a connection is made to the server from the proxy. +
+ This metric counts all connections attempted to the broker, even those that end in error.

+
+

kroxylicious_proxy_to_server_errors_total

+
+

Counter

+
+

virtual_cluster, node_id

+
+

Incremented by one every time a connection is closed due to any upstream error.

+
+

kroxylicious_client_to_proxy_active_connections

+
+

Gauge

+
+

virtual_cluster, node_id

+
+

Shows the current number of active TCP connections from clients to the proxy. +
+ This gauge reflects real-time connection state and decreases when connections are closed.

+
+

kroxylicious_proxy_to_server_active_connections

+
+

Gauge

+
+

virtual_cluster, node_id

+
+

Shows the current number of active TCP connections from the proxy to servers. +
+ This gauge reflects real-time connection state and decreases when connections are closed.

+
+

kroxylicious_client_to_proxy_disconnects_total

+
+

Counter

+
+

virtual_cluster, node_id, cause

+
+

Incremented by one every time a client connection is closed by the proxy. The cause label indicates the reason for disconnection: +
+ idle_timeout - Connection exceeded the configured idle timeout duration (requires idle timeouts configured via network.proxy.unauthenticatedIdleTimeout or network.proxy.authenticatedIdleTimeout). +
+ client_closed - Client initiated the connection close. +
+ server_closed - Backend server closed the connection, causing the proxy to close the client connection. +
+ Note: Error-based disconnects are tracked separately via kroxylicious_client_to_proxy_errors_total, not this metric.

+
+
+
+
+

5.2.2. Message metrics

+
+

Message metrics count and record the sizes of the Kafka protocol requests and responses that flow through the proxy.

+
+
+

Use these metrics to help understand:

+
+
+
    +
  • +

    the number of messages flowing through the proxy.

    +
  • +
  • +

    the overall volume of data through the proxy.

    +
  • +
  • +

    the effect the filters are having on the messages.

    +
  • +
  • +

    Downstream metrics

    +
    +
      +
    • +

      kroxylicious_client_to_proxy_request_total counts requests as they arrive from the client.

      +
    • +
    • +

      kroxylicious_proxy_to_client_response_total counts responses as they are returned to the client.

      +
    • +
    • +

      kroxylicious_client_to_proxy_request_size_bytes is incremented by the size of each request as it arrives from the client.

      +
    • +
    • +

      kroxylicious_proxy_to_client_response_size_bytes is incremented by the size of each response as it is returned to the client.

      +
    • +
    +
    +
  • +
  • +

    Upstream metrics

    +
    +
      +
    • +

      kroxylicious_proxy_to_server_request_total counts requests as they go to the broker.

      +
    • +
    • +

      kroxylicious_server_to_proxy_response_total counts responses as they are returned by the broker.

      +
    • +
    • +

      kroxylicious_proxy_to_server_request_size_bytes is incremented by the size of each request as it goes to the broker.

      +
    • +
    • +

      kroxylicious_server_to_proxy_response_size_bytes is incremented by the size of each response as it is returned by the broker.

      +
    • +
    +
    +
  • +
+
+
+

The size recorded is the encoded size of the protocol message. It includes the 4 byte message size.

+
+
+

Filters can alter the flow of messages through the proxy or the content of the message. This is apparent through the metrics.

+
+
+
    +
  • +

    If a filter sends a short-circuit, or closes a connection the downstream message counters will exceed the upstream counters.

    +
  • +
  • +

    If a filter changes the size of the message, the downstream size metrics will be different to the upstream size metrics.

    +
  • +
+
+
+
+ Conceptual diagram showing the downstream and upstream message metrics within the proxy, illustrating how they respond to message transit through it. +
+
Figure 5. Downstream and upstream message metrics in the proxy
+
+
+

Message metrics include the following labels: virtual_cluster (the virtual cluster’s name), node_id (the broker’s node ID), api_key (the message type), api_version, and decoded (a flag indicating if the message was decoded by the proxy).

+
+
+

When the client connects to the boostrap endpoint of the virtual cluster, metrics are recorded with a node ID value of bootstrap.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Kafka message metrics for proxy request and response flow
Metric NameTypeLabelsDescription
+

kroxylicious_client_to_proxy_request_total

+
+

Counter

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by one every time a request arrives at the proxy from a client.

+
+

kroxylicious_proxy_to_server_request_total

+
+

Counter

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by one every time a request goes from the proxy to a server.

+
+

kroxylicious_server_to_proxy_response_total

+
+

Counter

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by one every time a response arrives at the proxy from a server.

+
+

kroxylicious_proxy_to_client_response_total

+
+

Counter

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by one every time a response goes from the proxy to a client.

+
+

kroxylicious_client_to_proxy_request_total

+
+

Distribution

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by the size of the message each time a request arrives at the proxy from a client.

+
+

kroxylicious_proxy_to_server_request_total

+
+

Distribution

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by the size of the message each time a request goes from the proxy to a server.

+
+

kroxylicious_server_to_proxy_response_total

+
+

Distribution

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by the size of the message each time a response arrives at the proxy from a server.

+
+

kroxylicious_proxy_to_client_response_total

+
+

Distribution

+
+

virtual_cluster, node_id, api_key, api_version, decoded

+
+

Incremented by the size of the message each time a response goes from the proxy to a client.

+
+
+
+
+

5.3. Ingesting metrics

+
+

Metrics from the Kroxylicious Proxy can be ingested into your Prometheus instance.

+
+
+

Configure the scrape_configs property to enable Prometheus to scrape the monitors from your proxy instances.

+
+
+
Example Prometheus scrape config
+
+
scrape_configs:
+  - job_name: 'kroxylicious'
+    static_configs:
+      - targets: ['proxyhost:9190'] (1)
+
+
+
+ + + + + + + +
1The host that is running the Kroxylicious instance and the port number assigned to management.
+
+
+
+

5.4. Integrating Micrometer

+
+

Kroxylicious integrates with Micrometer for gathering metrics.

+
+
+

Micrometer provides a simple facade over instrumentation clients for popular observability systems, allowing you to instrument your JVM-based application code without vendor lock-in. The following example shows how to define the CommonTagsHook and StandardBindersHook types to add a label to metrics and register a JVM metrics binder.

+
+
+
Example proxy configuration for Micrometer integration
+
+
management:
+  endpoints:
+    prometheus: {}
+micrometer:
+  - type: "CommonTagsHook" (1)
+    config:
+      commonTags:
+        zone: "euc-1a" (2)
+  - type: "StandardBindersHook" (3)
+    config:
+      binderNames:
+      - "JvmGcMetrics" (4)
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1Specifies the CommonTagsHook type to add common tags to all metrics.
2Adds common tag zone euc-1a to all metrics in the global registry included with Micrometer, which appears as a label in Prometheus.
3Specifies the StandardBindersHook type to register standard Micrometer binders.
4Registers the JvmGcMetrics binder with the global registry.
+
+
+

Prometheus is connected to the Micrometer global registry, so filters can record metrics against it as part of the Prometheus scrape data.

+
+
+

Using the curl localhost:9190/metrics command shows metrics as follows:

+
+
+
Example metrics returned from request
+
+
jvm_gc_memory_allocated_bytes_total{zone="euc-1a",} 0.0
+
+
+
+

5.4.1. Common tags

+
+

Add common tags for metrics to appear as labels in the Prometheus scrape.

+
+
+
Example common tag configuration
+
+
- type: "CommonTagsHook"
+  config:
+    commonTags:
+      zone: "euc-1a"
+      owner: "team-a"
+
+
+
+
+

5.4.2. Standard binders

+
+

Micrometer uses the concept of meter binders to register metrics that provide information about the state of some aspect of the application or its container. By registering standard binders included with Micrometer, you can expose metrics about the JVM and system, such as JVM memory usage and garbage collection.

+
+
+
Example binders configuration
+
+
micrometer:
+  - type: "StandardBindersHook"
+    config:
+      binderNames:
+      - "JvmGcMetrics"
+      - "JvmHeapPressureMetrics"
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3. Standard binders available with Micrometer
NameMicrometer class
+

ClassLoaderMetrics

+
+

io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics

+
+

JvmCompilationMetrics

+
+

io.micrometer.core.instrument.binder.jvm.JvmCompilationMetrics

+
+

JvmGcMetrics

+
+

io.micrometer.core.instrument.binder.jvm.JvmGcMetrics

+
+

JvmHeapPressureMetrics

+
+

io.micrometer.core.instrument.binder.jvm.JvmHeapPressureMetrics

+
+

JvmInfoMetrics

+
+

io.micrometer.core.instrument.binder.jvm.JvmInfoMetrics

+
+

JvmMemoryMetrics

+
+

io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics

+
+

JvmThreadMetrics

+
+

io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics

+
+

FileDescriptorMetrics

+
+

io.micrometer.core.instrument.binder.system.FileDescriptorMetrics

+
+

ProcessorMetrics

+
+

io.micrometer.core.instrument.binder.system.ProcessorMetrics

+
+

UptimeMetrics

+
+

io.micrometer.core.instrument.binder.system.UptimeMetrics

+
+
+
+

5.4.3. Pause detector

+
+

Micrometer offers a pause detector (using the LatencyUtils package) which attempts to compensate for requests which would have been accepted and delayed by a pause arising from a source external to the monitored section (There are a wide variety of possible sources such as Garbage collectors or system pauses). Micrometer defaults to a no-op pause detector implementation, but it also provides a clock drift based implementation which can be optionally configured. The clock drift based pause detector can be configured by providing a sleep interval a pause threshold. These values are defaulted to the Micrometer recommended 100ms but you can choose to configure different values based on your environment. Using the clock drift based pause detector can result in samples being added to timers in unexpected ways in some degenerate cases so users are advised to use it after careful consideration.

+
+ +
+
Example pause detector configuration
+
+
micrometer:
+  - type: "PauseDetectorHook"
+    config:
+      sleepIntervalMs: 500
+      pauseThresholdMs: 500
+
+
+
+
+

5.4.4. Using Micrometer with filters

+
+

Use the static methods of Micrometer Metrics to register metrics with the global registry.

+
+
+

Alternatively, use Metrics.globalRegistry to get a reference to the global registry. Metrics registered this way are automatically available through the Prometheus scrape endpoint.

+
+
+
+
+

5.5. Setting log levels

+
+

The Kroxylicious binary distribution includes log4j2 as the default logging backend.

+
+
+

When using the bin/kroxylicious-start.sh script from the binary distribution, you can set an environment variable to load a custom log4j2 configuration file or change the root logging level.

+
+
+
+ Environment variable to load a custom log4j2 file +
+
+
KROXYLICIOUS_LOGGING_OPTIONS="-Dlog4j2.configurationFile=/path/to/custom/log4j2.yaml"
+
+
+
+
Environment variable to change the root logging level
+
+
KROXYLICIOUS_ROOT_LOG_LEVEL="DEBUG"
+
+
+
+ + + + + + + +
Setting the root log level to DEBUG or TRACE will produce very verbose logs.
+
+
+
+
+
+

6. Glossary

+
+
+

Glossary of terms used in the Kroxylicious documentation.

+
+
+
+
API
+
+

Application Programmer Interface.

+
+
CA
+
+

Certificate Authority. An organization that issues certificates.

+
+
mTLS
+
+

Mutual Transport Layer Security. A configuration of TLS where the client presents a certificate to a server, which the server authenticates.

+
+
TLS
+
+

The Transport Layer Security. A secure transport protocol where a server presents a certificate to a client, which the client authenticates. TLS was previously known as the Secure Sockets Layer (SSL).

+
+
TCP
+
+

The Transmission Control Protocol.

+
+
+
+
+
+
+

7. Trademark notice

+
+
+
    +
  • +

    Apache Kafka is a registered trademark of The Apache Software Foundation.

    +
  • +
  • +

    Kubernetes is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Prometheus is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Strimzi is a trademark of The Linux Foundation.

    +
  • +
  • +

    Hashicorp Vault is a registered trademark of HashiCorp, Inc.

    +
  • +
  • +

    AWS Key Management Service is a trademark of Amazon.com, Inc. or its affiliates.

    +
  • +
  • +

    Microsoft, Azure, and Microsoft Entra are trademarks of the Microsoft group of companies.

    +
  • +
  • +

    Fortanix and Data Security Manager are trademarks of Fortanix, Inc.

    +
  • +
+
+
+
+ + +{% endraw %} diff --git a/documentation/0.20.0/html/kroxylicious-proxy/index.html b/documentation/0.20.0/html/kroxylicious-proxy/index.html new file mode 100644 index 0000000..836f3c7 --- /dev/null +++ b/documentation/0.20.0/html/kroxylicious-proxy/index.html @@ -0,0 +1,11 @@ +--- +layout: guide +title: Proxy Guide +description: "Using the Proxy, including configuration, security and operation." +tags: + - proxy + - security +rank: '010' +version: 0.20.0 +permalink: /documentation/0.20.0/html/kroxylicious-proxy/ +--- diff --git a/documentation/0.20.0/html/kroxylicious-proxy/toc.html b/documentation/0.20.0/html/kroxylicious-proxy/toc.html new file mode 100644 index 0000000..31e9da4 --- /dev/null +++ b/documentation/0.20.0/html/kroxylicious-proxy/toc.html @@ -0,0 +1,48 @@ +{% raw %} +
+ +
+{% endraw %} diff --git a/documentation/0.20.0/html/multi-tenancy-guide/content.html b/documentation/0.20.0/html/multi-tenancy-guide/content.html new file mode 100644 index 0000000..14b7c19 --- /dev/null +++ b/documentation/0.20.0/html/multi-tenancy-guide/content.html @@ -0,0 +1,222 @@ +{% raw %} + + + +
+
+

About this guide

+
+

This guide covers using the Kroxylicious Multi-tenancy Filter to present a single Kafka cluster as if it were multiple clusters.. Refer to other Kroxylicious guides for information on running the proxy or for advanced topics such as plugin development.

+
+
+

Kroxylicious’s Multi-tenancy filter presents a single Kafka cluster to tenants as if it were multiple clusters. Operations are isolated to a single tenant by prefixing resources with an identifier.

+
+
+ + + + + + + +
This filter is currently in incubation and available as a preview. We would not recommend using it in a production environment.
+
+
+

The Multi-tenancy filter works by intercepting all Kafka RPCs (remote procedure calls) that reference resources, such as topic names and consumer group names:

+
+
+
+
Request path
+
+

On the request path, resource names are prefixed with a tenant identifier.

+
+
Response path
+
+

On the response path, the prefix is removed.

+
+
+
+
+

Kafka RPCs that list resources are filtered so that only resources belonging to the tenant are returned, effectively creating a private cluster experience for each tenant.

+
+
+

To set up the filter, configure it in Kroxylicious.

+
+
+ + + + + + + +
While the Multi-tenancy filter isolates operations on resources, it does not isolate user identities across tenants. User authentication and ACLs (Access Control Lists) are shared across all tenants, meaning that identity is not scoped to individual tenants. For more information on open issues related to this filter, see Kroxylicious issues.
+
+
+ + + + + + + +
For more information on Kafka’s support for multi-tenancy, see the Apache Kafka website.
+
+
+
+
+

1. (Preview) Setting up the Multi-tenancy filter

+
+
+

This procedure describes how to set up the Multi-tenancy filter by configuring it in Kroxylicious. The filter dynamically prefixes resource names to create isolation between tenants using the same Kafka cluster. The prefix representing a tenant is taken from the name of the virtual cluster representing the tenant. For example, if the virtual cluster is named tenant-1, the prefix is tenant-1. Each tenant must be represented by a unique virtual cluster, and virtual cluster names must be globally unique within the Kroxylicious configuration. This means that the same virtual cluster name cannot be used to represent different Kafka clusters.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    Configure a MultiTenant type filter.

    +
    + +
    +
  2. +
  3. +

    Verify that multi-tenancy filtering has been applied.

    +
    +

    For example, create a topic through each virtual cluster and check that the topics are prefixed with the name of the corresponding virtual cluster.

    +
    +
  4. +
+
+
+

1.1. Example proxy configuration file

+
+

If your instance of the Kroxylicious Proxy runs directly on an operating system, provide the filter configuration in the filterDefinitions list of your proxy configuration.

+
+
+

Here’s a complete example of a filterDefinitions entry configured for multi-tenancy:

+
+
+
+ Example filterDefinitions configuration +
+
+
filterDefinitions:
+  - name: my-multi-tenant-filter
+    type: MultiTenant
+    config:
+      prefixResourceNameSeparator: "." (1)
+
+
+
+ + + + + + + +
1The separator used for the prefix. If a separator is not specified, - is the default. +
+ + + + + + + +
Currently, only the prefix with separator is validated.
+
+
+
+

Refer to the Kroxylicious Proxy guide for more information about configuring the proxy.

+
+
+
+

1.2. Example KafkaProtocolFilter resource

+
+

If your instance of Kroxylicious runs on Kubernetes, you must use a KafkaProtocolFilter resource to contain the filter configuration.

+
+
+

Here’s a complete example of a KafkaProtocolFilter resource configured for record validation:

+
+
+
+ Example KafkaProtocolFilter resource for record validation +
+
+
kind: KafkaProtocolFilter
+metadata:
+  name: my-validation-filter
+spec:
+  type: MultiTenant
+  configTemplate:
+    prefixResourceNameSeparator: "." (1)
+
+
+
+ + + + + + + +
1The separator used for the prefix. If a separator is not specified, - is the default.
+
+
+

Refer to the Kroxylicious Operator for Kubernetes guide for more information about configuration on Kubernetes.

+
+
+
+
+
+

2. Trademark notice

+
+
+
    +
  • +

    Apache Kafka is a registered trademark of The Apache Software Foundation.

    +
  • +
  • +

    Kubernetes is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Prometheus is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Strimzi is a trademark of The Linux Foundation.

    +
  • +
  • +

    Hashicorp Vault is a registered trademark of HashiCorp, Inc.

    +
  • +
  • +

    AWS Key Management Service is a trademark of Amazon.com, Inc. or its affiliates.

    +
  • +
  • +

    Microsoft, Azure, and Microsoft Entra are trademarks of the Microsoft group of companies.

    +
  • +
  • +

    Fortanix and Data Security Manager are trademarks of Fortanix, Inc.

    +
  • +
+
+
+
+ + +{% endraw %} diff --git a/documentation/0.20.0/html/multi-tenancy-guide/index.html b/documentation/0.20.0/html/multi-tenancy-guide/index.html new file mode 100644 index 0000000..1387101 --- /dev/null +++ b/documentation/0.20.0/html/multi-tenancy-guide/index.html @@ -0,0 +1,11 @@ +--- +layout: guide +title: Multi-tenancy Guide +description: Using the multi-tenancy filter to present a single Kafka® cluster as + if it were multiple clusters. +tags: + - filter +rank: '022' +version: 0.20.0 +permalink: /documentation/0.20.0/html/multi-tenancy-guide/ +--- diff --git a/documentation/0.20.0/html/multi-tenancy-guide/toc.html b/documentation/0.20.0/html/multi-tenancy-guide/toc.html new file mode 100644 index 0000000..9c72d3b --- /dev/null +++ b/documentation/0.20.0/html/multi-tenancy-guide/toc.html @@ -0,0 +1,12 @@ +{% raw %} +
+ +
+{% endraw %} diff --git a/documentation/0.20.0/html/oauth-bearer-validation/content.html b/documentation/0.20.0/html/oauth-bearer-validation/content.html new file mode 100644 index 0000000..26efa07 --- /dev/null +++ b/documentation/0.20.0/html/oauth-bearer-validation/content.html @@ -0,0 +1,264 @@ +{% raw %} + + + +
+
+

About this guide

+
+

This guide covers using the Kroxylicious Oauth Bearer Validation Filter. This filters validates the JWT token received from client before forwarding it to cluster. Refer to other Kroxylicious guides for information on running the proxy or for advanced topics such as plugin development.

+
+
+

OauthBearerValidation filter enables a validation on the JWT token received from client before forwarding it to cluster.

+
+
+

If the token is not validated, then the request is short-circuited. It reduces resource consumption on the cluster when a client sends too many invalid SASL requests.

+
+
+
+ Sequence diagram showing the filter validating the oauth token before it reaches the broker. +
+
Figure 1. Sequence diagram showing the filter validating the oauth token before it reaches the broker.
+
+
+
+
+

1. Configuring the Oauth Bearer Validation filter

+
+
+

This procedure describes how to set up the Oauth Bearer Validation filter by configuring it in Kroxylicious.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    Configure a OauthBearerValidation type filter.

    +
    + +
    +
  2. +
+
+
+ + + + + + + +
OauthBearer configuration follows Kafka’s SSL properties.
+
+
+

1.1. Example proxy configuration file

+
+

If your instance of the Kroxylicious Proxy runs directly on an operating system, provide the filter configuration in the filterDefinitions list of your proxy configuration.

+
+
+

Here’s a complete example of a filterDefinitions entry configured for Oauth Bearer validation:

+
+
+
+ Example filterDefinitions configuration +
+
+
filterDefinitions:
+  - name: my-oauth-filter
+    type: OauthBearerValidation
+    config:
+      jwksEndpointUrl: https://oauth/JWKS   (1)
+      jwksEndpointRefreshMs: 3600000        (2)
+      jwksEndpointRetryBackoffMs: 100       (3)
+      jwksEndpointRetryBackoffMaxMs: 10000  (4)
+      scopeClaimName: scope                 (5)
+      subClaimName: sub                     (6)
+      authenticateBackOffMaxMs: 60000       (7)
+      authenticateCacheMaxSize: 1000        (8)
+      expectedAudience: https://first.audience, https//second.audience (9)
+      expectedIssuer: https://your-domain.auth/ (10)
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1The OAuth/OIDC provider URL from which the provider’s JWKS (JSON Web Key Set) can be retrieved.
2The (optional) value in milliseconds for the broker to wait between refreshing its JWKS (JSON Web Key Set) cache that contains the keys to verify the signature of the JWT.
3The (optional) value in milliseconds for the initial wait between JWKS (JSON Web Key Set) retrieval attempts from the external authentication provider.
4The (optional) value in milliseconds for the maximum wait between attempts to retrieve the JWKS (JSON Web Key Set) from the external authentication provider.
5This (optional) setting can provide a different name to use for the scope included in the JWT payload’s claims.
6This (optional) setting can provide a different name to use for the subject included in the JWT payload’s claims.
7The (optional) maximum value in milliseconds to limit the client sending authenticate request. Setting 0 will never limit the client. Otherwise, an exponential delay is added to each authenticate request until the authenticateBackOffMaxMs has been reached.
8The (optional) maximum number of failed tokens kept in cache.
9The (optional) comma-delimited setting for the broker to use to verify that the JWT was issued for one of the expected audiences.
10The (optional) setting for the broker to use to verify that the JWT was created by the expected issuer.
+
+
+

Refer to the Kroxylicious Proxy guide for more information about configuring the proxy.

+
+
+
+

1.2. Example KafkaProtocolFilter resource

+
+

If your instance of Kroxylicious runs on Kubernetes, you must use a KafkaProtocolFilter resource to contain the filter configuration.

+
+
+

Here’s a complete example of a KafkaProtocolFilter resource configured for Oauth Bearer validation:

+
+
+
+ Example KafkaProtocolFilter resource for record validation +
+
+
kind: KafkaProtocolFilter
+metadata:
+  name: my-oauth-bearer-validation-filter
+spec:
+  type: OauthBearerValidation
+  configTemplate:
+      jwksEndpointUrl: https://oauth/JWKS   (1)
+      jwksEndpointRefreshMs: 3600000        (2)
+      jwksEndpointRetryBackoffMs: 100       (3)
+      jwksEndpointRetryBackoffMaxMs: 10000  (4)
+      scopeClaimName: scope                 (5)
+      subClaimName: sub                     (6)
+      authenticateBackOffMaxMs: 60000       (7)
+      authenticateCacheMaxSize: 1000        (8)
+      expectedAudience: https://first.audience, https//second.audience (9)
+      expectedIssuer: https://your-domain.auth/ (10)
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1The OAuth/OIDC provider URL from which the provider’s JWKS (JSON Web Key Set) can be retrieved.
2The (optional) value in milliseconds for the broker to wait between refreshing its JWKS (JSON Web Key Set) cache that contains the keys to verify the signature of the JWT.
3The (optional) value in milliseconds for the initial wait between JWKS (JSON Web Key Set) retrieval attempts from the external authentication provider.
4The (optional) value in milliseconds for the maximum wait between attempts to retrieve the JWKS (JSON Web Key Set) from the external authentication provider.
5This (optional) setting can provide a different name to use for the scope included in the JWT payload’s claims.
6This (optional) setting can provide a different name to use for the subject included in the JWT payload’s claims.
7The (optional) maximum value in milliseconds to limit the client sending authenticate request. Setting 0 will never limit the client. Otherwise, an exponential delay is added to each authenticate request until the authenticateBackOffMaxMs has been reached.
8The (optional) maximum number of failed tokens kept in cache.
9The (optional) comma-delimited setting for the broker to use to verify that the JWT was issued for one of the expected audiences.
10The (optional) setting for the broker to use to verify that the JWT was created by the expected issuer.
+
+
+

Refer to the Kroxylicious Operator for Kubernetes guide for more information about configuration on Kubernetes.

+
+
+
+
+
+

2. Trademark notice

+
+
+
    +
  • +

    Apache Kafka is a registered trademark of The Apache Software Foundation.

    +
  • +
  • +

    Kubernetes is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Prometheus is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Strimzi is a trademark of The Linux Foundation.

    +
  • +
  • +

    Hashicorp Vault is a registered trademark of HashiCorp, Inc.

    +
  • +
  • +

    AWS Key Management Service is a trademark of Amazon.com, Inc. or its affiliates.

    +
  • +
  • +

    Microsoft, Azure, and Microsoft Entra are trademarks of the Microsoft group of companies.

    +
  • +
  • +

    Fortanix and Data Security Manager are trademarks of Fortanix, Inc.

    +
  • +
+
+
+
+ + +{% endraw %} diff --git a/documentation/0.20.0/html/oauth-bearer-validation/index.html b/documentation/0.20.0/html/oauth-bearer-validation/index.html new file mode 100644 index 0000000..46077b9 --- /dev/null +++ b/documentation/0.20.0/html/oauth-bearer-validation/index.html @@ -0,0 +1,12 @@ +--- +layout: guide +title: Oauth Bearer Validation guide +description: "Using the Oauth Bearer validation filter to validate JWT tokens received\ + \ \nfrom Kafka® clients during authentication.\n" +tags: + - filter + - security +rank: '023' +version: 0.20.0 +permalink: /documentation/0.20.0/html/oauth-bearer-validation/ +--- diff --git a/documentation/0.20.0/html/oauth-bearer-validation/toc.html b/documentation/0.20.0/html/oauth-bearer-validation/toc.html new file mode 100644 index 0000000..3740ac1 --- /dev/null +++ b/documentation/0.20.0/html/oauth-bearer-validation/toc.html @@ -0,0 +1,12 @@ +{% raw %} +
+ +
+{% endraw %} diff --git a/documentation/0.20.0/html/proxy-quick-start/content.html b/documentation/0.20.0/html/proxy-quick-start/content.html new file mode 100644 index 0000000..ceaf60d --- /dev/null +++ b/documentation/0.20.0/html/proxy-quick-start/content.html @@ -0,0 +1,189 @@ +{% raw %} + + + +
+
+
+

Get Kroxylicious, the snappy open source proxy for Apache Kafka®, up and running in minutes.

+
+
+
+
+

1. Prerequisites

+
+
+

Before you begin, ensure you have the following installed and configured.

+
+
+
    +
  • +

    Java 21+

    +
    +

    Kroxylicious requires a Java Runtime Environment (JRE) version 21 or higher (JRE 17 remains supported for now but is deprecated). To check your version, run:

    +
    +
    +
    +
    java -version
    +
    +
    +
    + + + + + + + +
    If this command fails, you may need to install a JRE or add it to your system’s PATH variable.
    +
    +
  • +
  • +

    An Apache Kafka® Cluster

    +
    +

    Kroxylicious needs a running Kafka cluster to proxy.

    +
    +
    +

    If you don’t have one already, and you have a container engine like docker or podman installed, then the easiest way to deploy a Kafka service is in a container like:

    +
    +
    +
    +
    podman pull apache/kafka:4.2.0
    +podman run -p 9092:9092 apache/kafka:4.2.0
    +
    +
    +
    +

    Otherwise, the official Apache Kafka® quick start provides further instructions for setting up a local cluster using the Kafka binary distribution.

    +
    +
  • +
  • +

    Kafka Binary Distribution

    +
    +

    To interact with your Kafka cluster and test the proxy, you will need the Kafka command-line tools. Obtain the binary distribution from the official Apache Kafka website: Apache Kafka Downloads.

    +
    +
  • +
+
+
+
+
+

2. Download and Install the Proxy

+
+
+
    +
  1. +

    Download the binary distribution from the GitHub release page.

    +
    +
    +
    curl -OL https://github.com/kroxylicious/kroxylicious/releases/download/v0.20.0/kroxylicious-app-0.20.0-bin.tar.gz
    +
    +
    +
  2. +
  3. +

    Extract the archive into your desired installation directory.

    +
    +
    +
    tar -zxf kroxylicious-app-0.20.0-bin.tar.gz
    +
    +
    +
  4. +
+
+
+ + + + + + + +
For Windows, you might find the .zip format easier to work with.
+
+
+
+
+

3. Configure the Proxy

+
+
+

Kroxylicious uses a YAML file for configuration. You can define virtual clusters, specify target Kafka clusters, and enable filters.

+
+
+

For this quick start, we’ll use the example configuration file located at config/example-proxy-config.yaml. This file is pre-configured for a local Kafka cluster running on default ports.

+
+
+ + + + + + + +
If your Kafka cluster uses custom ports or runs on a different machine, you’ll need to adjust the settings in the YAML file. See the Kroxylicious Proxy guide for more advanced configuration options.
+
+
+
+
+

4. Start the Proxy

+
+
+

From your Kroxylicious installation directory, run the start script and point it to your configuration file.

+
+
+
+
cd kroxylicious-app-0.20.0
+
+./bin/kroxylicious-start.sh --config config/example-proxy-config.yaml
+
+
+
+

To use a custom configuration, simply replace the file path after the --config flag.

+
+
+
+
+

5. Configure Kafka clients to connect to the proxy

+
+
+

Finally, point your Kafka clients to the proxy’s bootstrap address and send it some requests.

+
+
+

5.1. Create a Topic

+
+

Use the kafka-topics.sh client to create a topic named my_topic through the proxy.

+
+
+
+
bin/kafka-topics.sh --create --topic my_topic \
+--bootstrap-server localhost:9192
+
+
+
+
+

5.2. Produce a Message

+
+

Send "hello world" to your new topic using the console producer.

+
+
+
+
echo "hello world" | bin/kafka-console-producer.sh --topic my_topic \
+--bootstrap-server localhost:9192
+
+
+
+
+

5.3. Consume the Message

+
+

Read the message back from your topic using the console consumer.

+
+
+
+
bin/kafka-console-consumer.sh --topic my_topic --from-beginning \
+--bootstrap-server localhost:9192
+
+
+
+
+
+ + +{% endraw %} diff --git a/documentation/0.20.0/html/proxy-quick-start/index.html b/documentation/0.20.0/html/proxy-quick-start/index.html new file mode 100644 index 0000000..4fe2a8e --- /dev/null +++ b/documentation/0.20.0/html/proxy-quick-start/index.html @@ -0,0 +1,10 @@ +--- +layout: guide +title: Proxy Quick Start +description: Start here if you're experimenting with the proxy for the first time. +tags: + - proxy +rank: '000' +version: 0.20.0 +permalink: /documentation/0.20.0/html/proxy-quick-start/ +--- diff --git a/documentation/0.20.0/html/proxy-quick-start/toc.html b/documentation/0.20.0/html/proxy-quick-start/toc.html new file mode 100644 index 0000000..a3efdda --- /dev/null +++ b/documentation/0.20.0/html/proxy-quick-start/toc.html @@ -0,0 +1,16 @@ +{% raw %} +
+ +
+{% endraw %} diff --git a/documentation/0.20.0/html/record-encryption-guide/content.html b/documentation/0.20.0/html/record-encryption-guide/content.html new file mode 100644 index 0000000..e9c2546 --- /dev/null +++ b/documentation/0.20.0/html/record-encryption-guide/content.html @@ -0,0 +1,2672 @@ +{% raw %} + + + +
+
+

About this guide

+
+

This guide covers using the Kroxylicious Record Encryption Filter to provide encryption-at-rest for Apache Kafka. Refer to other Kroxylicious guides for information on running the proxy or for advanced topics such as plugin development.

+
+
+

The Kroxylicious Record Encryption filter enhances the security of Kafka messages. The filter uses industry-standard cryptographic techniques to apply encryption to Kafka messages, ensuring the confidentiality of data stored in the Kafka Cluster. By centralizing topic-level encryption, Kroxylicious provides streamlined protection across Kafka clusters.

+
+
+

To use the filter, follow these steps:

+
+
+
    +
  1. +

    Set up a Key Management System (KMS)

    +
  2. +
  3. +

    Establish encryption keys within the KMS for securing the topics

    +
  4. +
  5. +

    Configure the filter within Kroxylicious

    +
  6. +
+
+
+

The filter integrates with a Key Management Service (KMS), which is responsible for the safe storage of sensitive key material. Kroxylicious supports the following KMS providers:

+
+
+
    +
  • +

    HashiCorp Vault (On-premise, HashiCorp Cloud Platform Vault and Enterprise are supported. Free tier HCP Vault Secrets is not).

    +
  • +
  • +

    AWS Key Management Service.

    +
  • +
  • +

    Azure Key Vault

    +
  • +
  • +

    Fortanix DSM

    +
  • +
+
+
+

You can provide implementations for your specific KMS systems. Additional KMS support may be added based on demand.

+
+
+
+
+

1. How encryption works

+
+
+

The Record Encryption filter uses envelope encryption to encrypt records with symmetric encryption keys. The filter encrypts records from produce requests and decrypts records from fetch responses.

+
+
+
+
Envelope encryption
+
+

Envelope encryption is an industry-standard technique suited for encrypting large volumes of data in an efficient manner. Data is encrypted with a Data Encryption Key (DEK). The DEK is encrypted using a Key Encryption Key (KEK). The KEK is stored securely in a Key Management System (KMS).

+
+
Symmetric encryption keys
+
+

AES(GCM) 256 bit encryption symmetric encryption keys are used to encrypt and decrypt record data.

+
+
+
+
+ + + + + + + +
If you are using Azure Key Vault and Managed HSM is not available, you can use RSA-OAEP-256 encryption, using a 2048-bit (or greater) asymmetric key instead of 256-bit AES-GCM symmetric keys. This approach is not quantum-resistant.
+
+
+

The process is as follows:

+
+
+
    +
  1. +

    The filter intercepts produce requests from producing applications and transforms them by encrypting the records.

    +
  2. +
  3. +

    The produce request is forwarded to the broker.

    +
  4. +
  5. +

    The filter intercepts fetch responses from the broker and transforms them by decrypting the records.

    +
  6. +
  7. +

    The fetch response is forwarded to the consuming application.

    +
  8. +
+
+
+

The filter encrypts the record value only. Record keys, headers, and timestamps are not encrypted.

+
+
+

The entire process is transparent from the point of view of Kafka clients and Kafka brokers. Neither are aware that the records are being encrypted, nor do they have any access to the encryption keys or have any influence on the ciphering process to secure the records.

+
+
+

1.1. How the filter encrypts records

+
+

The filter encrypts records from produce requests as follows:

+
+
+
    +
  1. +

    Filter selects a KEK to apply.

    +
  2. +
  3. +

    Requests the KMS to generate a DEK for the KEK.

    +
  4. +
  5. +

    Uses an encrypted DEK (DEK encrypted with the KEK) to encrypt the record.

    +
  6. +
  7. +

    Replaces the original record with a ciphertext record (encrypted record, encrypted DEK, and metadata).

    +
  8. +
+
+
+

The filter uses a DEK reuse strategy. Encrypted records are sent to the same topic using the same DEK until a time-out or an encryption limit is reached.

+
+
+
+

1.2. How the filter decrypts records

+
+

The filter decrypts records from fetch responses as follows:

+
+
+
    +
  1. +

    Filter receives a cipher record from the Kafka broker.

    +
  2. +
  3. +

    Reverses the process that constructed the cipher record.

    +
  4. +
  5. +

    Uses KMS to decrypt the DEK.

    +
  6. +
  7. +

    Uses the decrypted DEK to decrypt the encrypted record.

    +
  8. +
  9. +

    Replaces the cipher record with a decrypted record.

    +
  10. +
+
+
+

The filter uses an LRU (least recently used) strategy for caching decrypted DEKs. Decrypted DEKs are kept in memory to reduce interactions with the KMS.

+
+
+
+

1.3. How the filter uses the KMS

+
+

To support the filter, the KMS provides the following:

+
+
+
    +
  • +

    A secure repository for storing Key Encryption Keys (KEKs)

    +
  • +
  • +

    A service for generating and decrypting Data Encryption Keys (DEKs)

    +
  • +
+
+
+

KEKs stay within the KMS. The KMS generates a DEK (which is securely generated random data) for a given KEK, then returns the DEK and an encrypted DEK. The encrypted DEK has the same data but encrypted with the KEK. The KMS doesn’t store encrypted DEKs; they are stored as part of the cipher record in the broker.

+
+
+ + + + + + + +
The KMS must be available during runtime. If the KMS is unavailable, the filter will not be able to obtain new encrypted DEKs on the produce path or decrypt encrypted DEKs on the consume path. The filter will continue to use previously obtained DEKs, but eventually, production and consumption will become impossible. It is recommended to use the KMS in a high availability (HA) configuration.
+
+
+
+

1.4. Practicing key rotation

+
+

Key rotation involves periodically replacing cryptographic keys with new ones and is considered a best practice in cryptography.

+
+
+

The filter allows the rotation of Key Encryption Keys (KEKs) within the Key Management System (KMS). When a KEK is rotated, the new key material is eventually used for newly produced records. Existing records, encrypted with older KEK versions, remain decryptable as long as the previous KEK versions are still available in the KMS.

+
+
+ + + + + + + +
If your encrypted topic is receiving regular traffic, the Data Encryption Key (DEK) will be refreshed as new records flow through. However, if messages are infrequent, the DEK might be used for up to 2 hours (by default) after its creation.
+
+
+

When the KEK is rotated in the external KMS, it will take up to 1 hour (by default) before all records produced by the filter contain a DEK encrypted with the new key material. This is because existing encrypted DEKs are used for a configurable amount of time after creation, the Filter caches the encrypted DEK, one hour after creation they are eligible to be refreshed.

+
+
+

If you need to rotate key material immediately, execute a rolling restart of your cluster of Kroxylicious instances.

+
+
+ + + + + + + +
If an old KEK version is removed from the KMS, records encrypted with that key will become unreadable, causing fetch operations to fail. In such cases, the consumer offset must be advanced beyond those records.
+
+
+
+

1.5. What part of a record is encrypted?

+
+

The record encryption filter encrypts only the values of records, leaving record keys, headers, and timestamps untouched. Null record values, which might represent deletions in compacted topics, are transmitted to the broker unencrypted. This approach ensures that compacted topics function correctly.

+
+
+
+

1.6. Unencrypted topics

+
+

You may configure the system so that some topics are encrypted and others are not. This supports scenarios where topics with confidential information are encrypted and Kafka topics with non-sensitive information can be left unencrypted.

+
+
+
Additional resources
+ +
+
+
+
+
+

2. Preparing your KMS

+
+
+

This section assumes that you already have a supported KMS instance up and running. It describes how to prepare the KMS for use with the filter.

+
+
+

2.1. Preparing HashiCorp Vault

+
+

To use HashiCorp Vault with the Record Encryption filter, use the following setup:

+
+
+
    +
  • +

    Enable the Transit Engine as the Record Encryption filter relies on its APIs.

    +
  • +
  • +

    Create a Vault policy specifically for the filter with permissions for generating and decrypting Data Encryption Keys (DEKs) for envelope encryption.

    +
  • +
  • +

    Obtain a Vault token that includes the filter policy.

    +
  • +
+
+
+

2.1.1. Enable the Transit Engine

+
+

The filter integrates with the HashiCorp Vault Transit Engine. Vault does not enable the Transit Engine by default. It must be enabled before it can be used by the filter.

+
+
+
Vault Transit Engine URL
+
+

The Vault Transit Engine URL is required so the filter knows the location of the Transit Engine within the Vault instance.

+
+
+

The URL is formed from the concatenation of the Api Address (reported by Vault reported by during startup) with the complete path to Transit Engine, including the name of the engine itself.

+
+
+

If Namespacing is used on the Vault instance, the path must include the namespaces. The URL will end with /transit unless the -path parameter was used when enabling the engine.

+
+
+

If namespacing is not in use, the URL looks like this:

+
+
+
+
https://myvaultinstance:8200/v1/transit
+
+
+
+

If namespacing is in use, the path must include the namespaces. For example, if there is a parent namespace is a and a child namespace is b, the URL looks like this:

+
+
+
+
https://myvaultinstance:8200/v1/a/b/transit
+
+
+
+

If the name of the Transit engine was changed (using the -path argument to the vault secrets enable transit command) the URL looks like this:

+
+
+
+
https://myvaultinstance:8200/v1/mytransit
+
+
+
+
+
Role of the administrator
+
+

To use the filter, an administrator or an administrative process must create the encryption keys within Vault, which are used by the envelope encryption process.

+
+
+

The organization deploying the Record Encryption filter is responsible for managing this administrator or process.

+
+
+

The administrator must have permissions to create keys beneath transit/keys/KEK-* in the Vault hierarchy.

+
+
+

As a guideline, the minimal Vault policy required by the administrator is as follows:

+
+
+
+
path "transit/keys/KEK-*" {
+  capabilities = ["read", "write"]
+}
+
+
+
+
+
Establish an application identity for the filter
+
+

The filter must authenticate to Vault in order to perform envelope encryption operations, such as generating and decrypting DEKs Therefore, a Vault identity with sufficient permissions must be created for the filter.

+
+
+

Create a Vault policy for the filter:

+
+
+
+
vault policy write kroxylicious_encryption_filter_policy - << EOF
+path "transit/keys/KEK-*" {
+  capabilities = ["read"]
+}
+path "/transit/datakey/plaintext/KEK-*" {
+  capabilities = ["update"]
+}
+path "transit/decrypt/KEK-*" {
+  capabilities = ["update"]
+}
+EOF
+
+
+
+

Create a Periodic (long-lived) Vault Token for the filter:

+
+
+
+
vault token create -display-name "kroxylicious record encryption" \
+                   -policy=kroxylicious_encryption_filter_policy \
+                   -period=768h \ (1)
+                   -no-default-policy \ (2)
+                   -orphan (3)
+
+
+
+ + + + + + + + + + + + + + + +
1Causes the token to be periodic (with every renewal using the given period).
2Detach the "default" policy from the policy set for this token. This is done so the token has least-privilege.
3Create the token with no parent. This is done so that expiration of a parent won’t expire the token used by the filter.
+
+
+ + + + + + + +
The example token create command illustrates the use of -no-default-policy and -orphan. The use of these flags is not functionally important. You may adapt the configuration of the token to suit the standards required by your organization.
+
+
+

The token create command yields the token. The token value is required later when configuring the vault within the filter.

+
+
+
+
token              hvs.CAESIFJ_HHo0VnnW6DSbioJ80NqmuYm2WlON-QxAPmiJScZUGh4KHGh2cy5KdkdFZUJMZmhDY0JCSVhnY2JrbUNEWnE
+token_accessor     4uQZJbEnxW4YtbDBaW6yVzwP
+token_policies     [kroxylicious_encryption_filter_policy]
+
+
+
+

The token must be renewed before expiration. It is the responsibility of the administrator to do this.

+
+
+

This can be done with a command like the following:

+
+
+
+
vault token renew --accessor <token_accessor>
+
+
+
+
+
Testing the application identity for the filter using the CLI
+
+

To test whether the application identity and the policy are working correctly, a script can be used.

+
+
+

First, as the administrator, create a KEK in the hierarchy at this path transit/keys/KEK-testkey.

+
+
+
+
VAULT_TOKEN=<kroxylicious encryption filter token> validate_vault_token.sh <kek path>
+
+
+
+

The script should respond Ok. If errors are reported check the policy/token configuration.

+
+
+

transit/keys/KEK-testkey can now be removed.

+
+
+
+
+
+

2.2. Preparing AWS KMS

+
+

To prepare AWS Key Management Service for use with the Record Encryption filter, use the following setup:

+
+
+
    +
  • +

    Establish an AWS KMS aliasing convention for keys

    +
  • +
  • +

    Create a policies giving permissions to the key aliases.

    +
  • +
  • +

    Create a user for use by the filter and attach the policies to it.

    +
  • +
+
+
+

You’ll need a privileged AWS user that is capable of creating users and policies to perform the set-up.

+
+
+

2.2.1. Establish an aliasing convention for keys within AWS KMS

+
+

The filter references KEKs within AWS via an AWS key alias.

+
+
+

Establish a naming convention for key aliases to keep the filter’s keys separate from those used by other systems. Here, we use a prefix of KEK- for filter aliases. Adjust the instructions if a different naming convention is used.

+
+
+
Role of the administrator
+
+

To use the filter, an administrator or an administrative process must create the encryption keys within AWS KMS, which are used by the envelope encryption process.

+
+
+

The organization deploying the Record Encryption filter is responsible for managing this administrator or process.

+
+
+

The administrator must have permissions to create keys in AWS KMS. As a starting point, the built-in AWS policy AWSKeyManagementServicePowerUser confers sufficient key management privileges.

+
+
+

To get started, use the following commands to set up an administrator with permissions suitable for managing encryption keys in KMS through an AWS Cloud Shell. This example illustrates using the user name kroxylicious-admin, but you can choose a different name if preferred. Adjust the instructions accordingly if you use a different user name.

+
+
+
+
ADMIN=kroxylicious-admin
+INITIAL_PASSWORD=$(aws secretsmanager get-random-password  --output text)
+CONSOLE_URL=https://$(aws sts get-caller-identity --query Account --output text).signin.aws.amazon.com/console
+aws iam create-user --user-name ${ADMIN}
+aws iam attach-user-policy --user-name ${ADMIN} --policy-arn arn:aws:iam::aws:policy/AWSKeyManagementServicePowerUser
+aws iam attach-user-policy --user-name ${ADMIN} --policy-arn arn:aws:iam::aws:policy/IAMUserChangePassword
+aws iam attach-user-policy --user-name ${ADMIN} --policy-arn arn:aws:iam::aws:policy/AWSCloudShellFullAccess
+aws iam create-login-profile --user-name ${ADMIN} --password "${INITIAL_PASSWORD}" --password-reset-required
+echo Now log in at ${CONSOLE_URL}  with user name ${ADMIN} password "${INITIAL_PASSWORD}" and change the password.
+
+
+
+
+
Create an alias-based policy for KEK aliases
+
+

Create an alias-based policy granting permissions to use keys aliased by the established alias naming convention.

+
+
+
+
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
+cat > /tmp/policy << EOF
+{
+        "Version": "2012-10-17",
+        "Statement": [
+                {
+                        "Sid": "AliasBasedIAMPolicy",
+                        "Effect": "Allow",
+                        "Action": [
+                                "kms:Encrypt",
+                                "kms:Decrypt",
+                                "kms:GenerateDataKey*",
+                                "kms:DescribeKey"
+                        ],
+                        "Resource": [
+                "arn:aws:kms:*:${AWS_ACCOUNT_ID}:key/*"
+                        ],
+                        "Condition": {
+                                "ForAnyValue:StringLike": {
+                                        "kms:ResourceAliases": "alias/KEK-*"
+                                }
+                        }
+                }
+        ]
+}
+EOF
+aws iam create-policy --policy-name KroxyliciousRecordEncryption --policy-document file:///tmp/policy
+
+
+
+
+
Establish an authentication mechanism for the filter
+
+

The filter must authenticate to AWS in order to perform envelope encryption operations, such as generating and decrypting DEKs.

+
+
+
+
Authenticating using long-term IAM identity
+
+

This procedure describes how to create a long-term IAM identity for the Record Encryption filter to authenticate to AWS KMS. The process involves creating an IAM user and access key, and attaching an alias-based policy that grants permissions to perform KMS operations on specific KEKs.

+
+
+ + + + + + + +
Do not enable console access for this user. The filter requires only API access, and console access would unnecessarily increase the security risk.
+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    Create the IAM user and access key:

    +
    +
    +
    aws iam create-user --user-name kroxylicious
    +aws iam create-access-key --user-name kroxylicious
    +
    +
    +
    +

    This example uses kroxylicious as the user name, but you can substitute a different name if necessary.

    +
    +
  2. +
  3. +

    Attach the alias-based policy to the IAM identity:

    +
    +
    +
    AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    +aws iam attach-user-policy --user-name kroxylicious --policy-arn "arn:aws:iam::${AWS_ACCOUNT_ID}:policy/KroxyliciousRecordEncryption"
    +
    +
    +
    +

    This step grants the user permission to perform KMS operations on KEKs that use the alias naming convention defined in the KroxyliciousRecordEncryption policy.

    +
    +
  4. +
  5. +

    Verify that the policy has been successfully attached:

    +
    +
    +
    aws iam list-attached-user-policies --user-name kroxylicious
    +
    +
    +
  6. +
+
+
+
+
Authenticating using AWS EC2 metadata
+
+

This procedure describes how to use AWS EC2 metadata for the Record Encryption filter to authenticate to AWS KMS. The process involves creating a trust policy, creating an IAM role, and attaching an alias-based policy that grants permissions to perform KMS operations on specific KEKs.

+
+
+

The filter authenticates using the temporary credentials retrieved from EC2 instance metadata.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    Create a trust policy:

    +
    +
    +
    cat > trustpolicy << EOF
    +{
    +    "Version": "2012-10-17",
    +    "Statement": [
    +        {
    +            "Effect": "Allow",
    +            "Action": [
    +                "sts:AssumeRole"
    +            ],
    +            "Principal": {
    +                "Service": [
    +                    "ec2.amazonaws.com"
    +                ]
    +            }
    +        }
    +    ]
    +}
    +EOF
    +
    +
    +
    +

    The trust policy specifies that the EC2 instance can assume the role, enabling it to retrieve and use temporary credentials for authentication.

    +
    +
  2. +
  3. +

    Create the IAM role using the trust policy:

    +
    +
    +
    aws iam create-role --role-name KroxyliciousInstance --assume-role-policy-document file://trustpolicy
    +
    +
    +
    +

    This example uses KroxyliciousInstance as the role name, but you can substitute a different name if necessary.

    +
    +
  4. +
  5. +

    Attach the alias-based policy to the role:

    +
    +
    +
    AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    +aws iam attach-role-policy --policy-arn arn:aws:iam::${AWS_ACCOUNT_ID}:policy/KroxyliciousRecordEncryption --role-name KroxyliciousInstance
    +
    +
    +
    +

    This step grants the role permission to perform KMS operations on KEKs that use the alias naming convention defined in the KroxyliciousRecordEncryption policy.

    +
    +
  6. +
  7. +

    Verify that the policy has been successfully attached:

    +
    +
    +
    aws iam list-attached-role-policies --role-name KroxyliciousInstance
    +
    +
    +
  8. +
  9. +

    Associate the role with the EC2 instance:

    +
    +
    +
    aws ec2 associate-iam-instance-profile --instance-id <EC2_instance_id> --iam-instance-profile Name="KroxyliciousInstance"
    +
    +
    +
    +

    Replace <EC2_instance_id> with the instance ID of each AWS EC2 instance hosting a Kroxylicious instance.

    +
    +
  10. +
  11. +

    Verify that the role has been associated with the EC2 instance:

    +
    +
    +
    aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=<EC2_instance_id>
    +
    +
    +
  12. +
+
+
+
+
+
+

2.3. Preparing Azure Key Vault

+
+

To prepare Azure Key Vault for use with the Record Encryption filter, use the following setup:

+
+
+
    +
  • +

    Setup Azure resources

    +
  • +
  • +

    Establish a naming convention for keys

    +
  • +
+
+
+

You’ll need a privileged Azure user that is capable of creating users and resources to perform the set-up.

+
+
+

2.3.1. Setting up Azure resources

+
+

This procedure describes how to prepare the Azure resources required to use the Kroxylicious Record Encryption filter with Azure Key Vault. This process uses the Azure CLI to create a resource group, provision a key vault, configure a key management user, and establish an authentication method that the filter will use to access the key vault.

+
+
+
Prerequisites
+
    +
  • +

    An Azure subscription that includes Azure Key Vault

    +
  • +
  • +

    An Azure user with sufficient permissions to create and manage users, resource groups, roles, and resources

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Create a resource group

    +
    +

    Before you create a key vault, you must create a resource group to contain it.

    +
    +
    +

    If you deploy Kroxylicious into multiple different environments, you must have separate resource groups and key vaults for each environment.

    +
    +
    + + + + + + + +
    Resource groups are tied to the region they were created with. While resources (such as key vaults) within a resource group can be deployed to any region, Microsoft recommends that they should be located in the same region as the resource group. Keep this in mind when choosing a region for your resource groups.
    +
    +
    +

    If using the Azure CLI, you can create a resource group with a command like this:

    +
    +
    +
    +
    az group create --name "my-resource-group" --location "eastus"
    +
    +
    +
  2. +
  3. +

    Create a key vault with the Azure CLI:

    +
    +
    +
    KEY_VAULT_NAME="kroxylicious-key-vault"
    +RESOURCE_GROUP_NAME="my-resource-group"
    +az keyvault create --name ${KEY_VAULT_NAME} --resource-group ${RESOURCE_GROUP_NAME}
    +
    +
    +
    +
      +
    • +

      Key vault names must be unique.

      +
    • +
    • +

      RESOURCE_GROUP_NAME should match the name of the resource group created in the previous section.

      +
      +

      There are several methods to create key vault resources in Azure. This step describes how to do this using the Azure CLI. The Microsoft Azure documentation has further instructions on how to create key vaults via the Azure portal, Azure CLI, and Azure PowerShell.

      +
      +
      + + + + + + + +
      Microsoft’s best practice guide for Azure Key Vault recommends having one key vault per application, per environment, per region. For example, if you have Kroxylicious deployed in your development, test, and production environments, and each of those environments is deployed across two different regions, you would create six key vaults for Kroxylicious — one for each Kroxylicious deployment in each environment in each region.
      +
      +
    • +
    +
    +
  4. +
  5. +

    Create a key management user.

    +
    +

    To use the filter, a user such as the Key Vault Owner or any user with the Key Vault Crypto Officer RBAC role must create the encryption keys in the key vault. These keys are used by the envelope encryption process.

    +
    +
    +

    When you create a key vault, only the creator (the Key Vault Owner) can manage it. Access to key vaults is controlled through RBAC roles. A user with either the Role Based Access Control Administrator role or the User Access Administrator role can grant those roles to others. For information on exceptions, see the Microsoft documentation.

    +
    +
    +

    The following Azure CLI commands demonstrate creating a user in Microsoft Entra ID and granting key management RBAC privileges. This example illustrates using the domain example.com but you must use your own domain, such as a *.onmicrosoft.com domain. Substitute the value in the USER_NAME field (kroxylicious-user) for a different username if preferred.

    +
    +
    +
    +
    KEY_VAULT_NAME="kroxylicious-key-vault"
    +RESOURCE_GROUP_NAME="my-resource-group"
    +
    +SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    +PORTAL_URL="$(az cloud show --query endpoints.portal --output tsv)/$(az account show --query tenantId --output tsv)"
    +
    +USER_NAME="kroxylicious-user"
    +DEFAULT_DOMAIN=$(az rest --method get --url https://graph.microsoft.com/v1.0/domains --query "value[?isDefault].id" -o tsv)
    +USER_PRINCIPAL_NAME="${USER_NAME}@${DEFAULT_DOMAIN}"
    +INITIAL_PASSWORD=$(tr -dc 'A-Za-z0-9!?%=' < /dev/urandom | head -c 16)
    +
    +# Create user
    +az ad user create \
    +  --display-name "${USER_NAME}" \
    +  --user-principal-name "${USER_PRINCIPAL_NAME}" \
    +  --password "${INITIAL_PASSWORD}" \
    +  --force-change-password-next-sign-in true
    +
    +# Create RBAC role assignment
    +az role assignment create \
    +  --role "Key Vault Crypto Officer" \
    +  --assignee ${USER_PRINCIPAL_NAME} \
    +  --scope "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP_NAME}/providers/Microsoft.KeyVault/vaults/${KEY_VAULT_NAME}"
    +
    +echo "Now log in at ${PORTAL_URL} with user name ${USER_PRINCIPAL_NAME} and password \"${INITIAL_PASSWORD}\" and change the password."
    +
    +
    +
    +
      +
    • +

      View all subscriptions for the logged-in user with az account list, and change the active subscription with az account set.

      +
    • +
    • +

      The Azure portal URL varies depending on your current Azure cloud.

      +
    • +
    • +

      The Key Vault Crypto Officer role lets a user perform any action on the keys within the key vault identified in the --scope, except managing permissions.

      +
    • +
    • +

      The scope in the role assignment command specifies the full scope hierarchy of the key vault. For more information on this format, see the Microsoft documentation.

      +
    • +
    +
    +
  6. +
  7. +

    Establish an authentication mechanism for the filter.

    +
    +

    The filter must authenticate to Azure Key Vault in order to perform envelope encryption operations, such as generating and decrypting DEKs. See the following procedures for details of the authentication methods available.

    +
    +
  8. +
+
+
+
Authenticating with Microsoft Identity Platform via OAuth 2.0
+
+

This procedure describes how to create a Service Principal (an application identity) within Microsoft Entra ID to allow the Record Encryption filter to authenticate to Azure Key Vault using the OAuth 2.0 Client Credentials flow. The process uses the Azure CLI to create the application identity and assign the required Azure Role-Based Access Control (RBAC) role.

+
+
+ + + + + + + +
This identity is used solely for application-to-application (machine-to-machine) authentication. Grant the Service Principal only the minimum permissions needed to access Azure Key Vault to avoid increasing security risk.
+
+
+
Prerequisites
+
    +
  • +

    Access to the Azure CLI

    +
  • +
  • +

    A user with permissions to create and manage service principals and RBAC roles

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Create the service principal and retrieve the credentials:

    +
    +
    +
    az ad sp create-for-rbac --name "kroxylicious" --query '[appId, password, tenant, appId]' --output tsv
    +
    +
    +
    +

    This command creates the Service Principal and outputs, in order, the Client ID, Client Secret, Tenant ID, and App ID of the Service Principal. You require the Principal ID for the next step. You can replace kroxylicious with a different user name.

    +
    +
  2. +
  3. +

    Assign the built-in Azure Key Vault RBAC role to the service principal:

    +
    +
    +
    PRINCIPAL_ID="00000000-0000-0000-0000-000000000000"
    +KEY_VAULT_NAME="kroxylicious-key-vault"
    +RESOURCE_GROUP="my-resource-group"
    +SCOPE_ID=$(az keyvault show --name ${KEY_VAULT_NAME} --resource-group ${RESOURCE_GROUP} --query "id" --output tsv)
    +az role assignment create --assignee ${PRINCIPAL_ID} --role "Key Vault Crypto Service Encryption User" --scope ${SCOPE_ID}
    +
    +
    +
    +
      +
    • +

      Set PRINCIPAL_ID to the App ID output in the previous step.

      +
    • +
    • +

      Set RESOURCE_GROUP to the resource group where your key vault is deployed.

      +
      +

      These commands assign the built-in Key Vault Crypto Service Encryption User role to the Service Principal, scoped to the target Key Vault. Replace KEY_VAULT_NAME and RESOURCE_GROUP with your actual values.

      +
      +
    • +
    +
    +
  4. +
  5. +

    (Optional) If you do not use the built-in RBAC roles, assign the following permissions to the managed identity instead:

    +
    +
      +
    • +

      Microsoft.KeyVault/vaults/keys/read

      +
    • +
    • +

      Microsoft.KeyVault/vaults/keys/wrap/action

      +
    • +
    • +

      Microsoft.KeyVault/vaults/keys/unwrap/action

      +
      +

      If you are using Managed HSM, also assign Microsoft.KeyVault/managedhsms/rng/action.

      +
      +
    • +
    +
    +
  6. +
  7. +

    Verify that the Service Principal has the correct role assignment and scope:

    +
    +
    +
    PRINCIPAL_ID="00000000-0000-0000-0000-000000000000"
    +SCOPE_ID=$(az keyvault show --name ${KEY_VAULT_NAME} --resource-group ${RESOURCE_GROUP} --query "id" --output tsv)
    +az role assignment list --assignee "${PRINCIPAL_ID}" --query '[].{Role:roleDefinitionName, Scope:scope}' --output tsv --scope ${SCOPE_ID}
    +
    +
    +
    +
      +
    • +

      PRINCIPAL_ID is the object identifier (Service Principal App ID) we output in the first step.

      +
      +

      Confirm that the output shows the Key Vault Crypto Service Encryption User role and the full resource ID of your key vault (for example, /subscriptions/…​/resourceGroups/…​/vaults/kroxylicious-key-vault).

      +
      +
    • +
    +
    +
  8. +
+
+
+
+
Authenticating with Managed Identities for Azure resources
+
+

This procedure describes how to use a System-assigned Managed Identity (on the Azure resource where Kroxylicious is deployed) to allow the Record Encryption filter to authenticate to Azure Key Vault. The process uses the Azure CLI to enable the identity on the hosting resource and grant it the required Azure Role-Based Access Control (RBAC) role.

+
+
+ + + + + + + +
A Managed Identity is a type of Service Principal that Azure manages automatically and does not require credentials. Assigning RBAC roles to a Managed Identity follows the same process as for other Service Principals.
+
+
+
Prerequisites
+
    +
  • +

    Access to the Azure CLI

    +
  • +
  • +

    A user with sufficient permissions to manage the hosting resource and assign RBAC roles.

    +
  • +
  • +

    The Azure resource that hosts Kroxylicious must be provisioned in advance.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Enable the system-assigned managed identity on the hosting resource:

    +
    +
    +
    HOST_RESOURCE_NAME="kroxylicious-host"
    +HOST_RESOURCE_GROUP="my-resource-group"
    +az <RESOURCE_TYPE> identity assign \
    +  --name ${HOST_RESOURCE_NAME} \
    +  --resource-group ${HOST_RESOURCE_GROUP} \
    +  --query "systemAssignedIdentity" --output tsv
    +
    +
    +
    +
      +
    • +

      Set HOST_RESOURCE_NAME to the name of the Azure resource that hosts Kroxylicious.

      +
    • +
    • +

      Replace <RESOURCE_TYPE> with the correct Azure CLI subcommand for your resource type (for example, vm).

      +
    • +
    • +

      The command outputs the identifier of the system-assigned managed identity. Use this identifier in the next step.

      +
    • +
    +
    +
  2. +
  3. +

    Assign the built-in Azure Key Vault RBAC role to the managed identity:

    +
    +
    +
    SYSTEM_ASSIGNED_ID="x.kroxylicious-host"
    +KEY_VAULT_NAME="kroxylicious-key-vault"
    +RESOURCE_GROUP="my-resource-group"
    +SCOPE_ID=$(az keyvault show --name ${KEY_VAULT_NAME} --resource-group ${RESOURCE_GROUP} --query "id" --output tsv)
    +az role assignment create --assignee ${SYSTEM_ASSIGNED_ID} --role "Key Vault Crypto Service Encryption User" --scope ${SCOPE_ID}
    +
    +
    +
    +
      +
    • +

      Set SYSTEM_ASSIGNED_ID to the managed identity’s identifier from the previous step.

      +
    • +
    • +

      Set RESOURCE_GROUP to the name of the resource group that contains your key vault. This may differ from the resource group that hosts Kroxylicious.

      +
      +

      These commands assign the built-in Key Vault Crypto Service Encryption User role to the Managed Identity, using the target Key Vault as the scope. Replace HOST_RESOURCE_NAME, KEY_VAULT_NAME, and RESOURCE_GROUP with your actual values.

      +
      +
    • +
    +
    +
  4. +
  5. +

    (Optional) If you do not use the built-in RBAC roles, assign the following permissions to the managed identity instead:

    +
    +
      +
    • +

      Microsoft.KeyVault/vaults/keys/read

      +
    • +
    • +

      Microsoft.KeyVault/vaults/keys/wrap/action

      +
    • +
    • +

      Microsoft.KeyVault/vaults/keys/unwrap/action

      +
      +

      If you are using Managed HSM, also assign Microsoft.KeyVault/managedhsms/rng/action.

      +
      +
    • +
    +
    +
  6. +
  7. +

    Confirm the role has been successfully assigned:

    +
    +
    +
    SYSTEM_ASSIGNED_ID="x.kroxylicious-host"
    +az role assignment list --assignee ${SYSTEM_ASSIGNED_ID} --query '[].{Role:roleDefinitionName, Scope:scope}' --output tsv
    +
    +
    +
    +

    The output lists the Key Vault Crypto Service Encryption User role and the full resource ID of your key vault.

    +
    +
  8. +
+
+ +
+
+
+
+

2.4. Preparing Fortanix Data Security Manager (DSM)

+
+

To prepare Fortanix Data Security Manager (DSM) for use with the Record Encryption filter, use the following setup:

+
+
+
    +
  • +

    Establish a naming convention for keys and choose a Fortanix group where the keys will reside.

    +
  • +
  • +

    Create an application identity, with an API key, for the Record Encryption filter.

    +
  • +
+
+
+

2.4.1. Integrate with Fortanix DSM

+
+

The filter integrates with the Fortanix Data Security Manager (DSM). Both Fortanix DSM software-as-a service (SaaS) or an on-premise installation are supported.

+
+
+

These instructions assume that you are using the Fortanix DSM CLI, but you can use the Fortanix DSM user interface if preferred.

+
+
+ + + + + + + +
The Fortanix KMS plugin for Record Encryption doesn’t yet support keys in the Deactivated state. For more information, see the related issue.
+
+
+
Fortanix DSM Cluster URL
+
+

The Record Encryption filter requires the URL of the Fortanix DSM cluster.

+
+
+

If you are using SaaS, the URL looks like https://<region>.smartkey.io where region is an identifier such as amer. For more information, see the link: Fortanix documentation.

+
+
+

If using an on-premises instance, talk to the group responsible for it within your organization to find out the URL you should use.

+
+
+
+
Establish a naming convention for keys within Fortanix DSM
+
+

Establish a naming convention for keys to keep the filter’s keys separate from those used by other systems. Here, we use a prefix of KEK- for filter key name.

+
+
+

Choose the Fortanix DSM groups to keep the keys. Here, we assume a group name of topic-keks.

+
+
+

Adjust the instructions if a different naming convention is used.

+
+
+
+
Role of the administrator
+
+

To use the filter, an administrator or an administrative process must create the encryption keys within Fortanix DSM, which are used by the envelope encryption process.

+
+
+

The organization deploying the Record Encryption filter is responsible for managing this administrator or process.

+
+
+

The administrator must have permissions to create keys with Fortanix DSM.

+
+
+
+
Establish an application identity for the filter
+
+

The filter must authenticate to Fortanix DSM in order to perform the encryption and decryption operations.

+
+
+

Create a Fortanix DSM App with sufficient permissions for the filter:

+
+
+
+
sdkms-cli --api-endpoint https://<region>.smartkey.io create-app --name kroxylicious --default-group topic-keks --groups topic-keks
+
+
+
+

Retrieve the API key for the app:

+
+
+
+
sdkms-cli --api-endpoint https://<region>.smartkey.io get-app-api-key --name kroxylicious
+
+
+
+

The Record Encryption filter uses the API Key in its KMS configuration to authenticate to Fortanix DSM.

+
+
+
+
+
+
+
+

3. Configuring the Record Encryption filter

+
+
+

This section describes at a high level how to configure the Record Encryption filter using a previously prepared KMS. Subsections provide in-depth details.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    Configure the plugin for your supported KMS, as required.

    + +
  2. +
  3. +

    Create a filter configuration that references the configured KMS plugins.

    + +
  4. +
  5. +

    Apply the filter configuration:

    +
    + +
    +
  6. +
+
+
+

3.1. HashiCorp Vault plugin configuration

+
+

For HashiCorp Vault, the KMS configuration used by the filter looks like this. Use the Vault Token and Vault Transit Engine URL values from the KMS setup.

+
+
+
+
kms: VaultKmsService                                          (1)
+kmsConfig:
+  vaultTransitEngineUrl: <vault transit engine service url>   (2)
+  tls:                                                        (3)
+    # ...
+  vaultToken:                                                 (4)
+    passwordFile: /opt/vault/token
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1Specifies the name of the KMS provider. Use VaultKmsService.
2Vault Transit Engine URL including the protocol part, such as https: or http:.
3(Optional) TLS trust configuration.
4File containing the Vault Token.
+
+
+

A TLS client certificate can be specified using a PKCS#12 or JKS key store file.

+
+
+
Example TLS client certificate configuration using a PKCS#12 key store file
+
+
key:
+  storeFile: /opt/cert/server.p12 (1)
+  storeType: PKCS12 (2)
+  storePassword: (3)
+    passwordFile: /opt/cert/store.password
+  keyPassword: (4)
+    passwordFile: /opt/cert/key.password
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1storeFile specifies PKCS#12 file
2storeType specifies what the keystore file type is. Supported values include PKCS12 and JKS.
3Optionally, a keystore file password may be specified.
4Optionally, a password may be specified for the key entry within the file.
+
+
+

A set of trust anchors for the TLS client can be specified using a PKCS#12 or JKS key store file.

+
+
+
Example TLS client trust change configuration using a PKCS#12 key store file
+
+
trust:
+  storeFile: /opt/cert/server.p12 (1)
+  storeType: PKCS12 (2)
+  storePassword: (3)
+    passwordFile: /opt/cert/store.password
+
+
+
+ + + + + + + + + + + + + + + +
1storeFile specifies PKCS#12 file
2storeType specifies what the keystore file type is. Supported values include PKCS12 and JKS.
3Optionally, a keystore file password may be specified.
+
+
+
+

3.2. AWS KMS plugin configuration

+
+

For AWS KMS the configuration for authenticating with AWS KMS services looks like this:

+
+
+
Configuration for authenticating with a long-term IAM identity
+
+
kms: AwsKmsService                                            (1)
+kmsConfig:
+  endpointUrl: https://kms.<region>.amazonaws.com             (2)
+  tls:                                                        (3)
+    # ...
+  longTermCredentials:
+    accessKeyId:
+      passwordFile: /opt/aws/accessKey                        (4)
+    secretAccessKey:
+      passwordFile: /opt/aws/secretKey                        (5)
+  region: <region>                                            (6)
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
1Specifies the name of the KMS provider. Use AwsKmsService.
2AWS KMS endpoint URL, which must include the https:// scheme.
3(Optional) TLS trust configuration.
4File containing the AWS access key ID.
5File containing the AWS secret access key.
6The AWS region identifier, such as us-east-1, specifying where your KMS resources are located. This must match the region of the KMS endpoint you’re using.
+
+
+

Alternatively, the configuration for authenticating with EC2 metadata looks like this:

+
+
+
Configuration for authenticating with EC2 metadata
+
+
kms: AwsKmsService                                            (1)
+kmsConfig:
+  endpointUrl: https://kms.<region>.amazonaws.com             (2)
+  ec2MetadataCredentials:
+    iamRole: <name_of_IAM_role>                               (3)
+    metadataEndpoint: <EC2_metadata_endpoint>                 (4)
+    credentialLifetimeFactor: 0.8                             (5)
+  region: <region>                                            (6)
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
1Specifies the name of the KMS provider. Use AwsKmsService.
2AWS KMS endpoint URL, which must include the https:// scheme.
3Name of the IAM role associated with the EC2 instances hosting Kroxylicious.
4(Optional) Metadata endpoint used to obtain EC2 metadata. Defaults to http://169.254.169.254/. If using IPv6, use http://[fd00:ec2::254] instead.
5(Optional) Factor used to determine when to refresh a credential before it expires. Defaults to 0.8, which means the credential is refreshed once it reaches 80% of its lifetime.
6The AWS region identifier, such as us-east-1, specifying where your KMS resources are located. This must match the region of the KMS endpoint you’re using.
+
+
+

A TLS client certificate can be specified using a PKCS#12 or JKS key store file.

+
+
+
Example TLS client certificate configuration using a PKCS#12 key store file
+
+
key:
+  storeFile: /opt/cert/server.p12 (1)
+  storeType: PKCS12 (2)
+  storePassword: (3)
+    passwordFile: /opt/cert/store.password
+  keyPassword: (4)
+    passwordFile: /opt/cert/key.password
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1storeFile specifies PKCS#12 file
2storeType specifies what the keystore file type is. Supported values include PKCS12 and JKS.
3Optionally, a keystore file password may be specified.
4Optionally, a password may be specified for the key entry within the file.
+
+
+

A set of trust anchors for the TLS client can be specified using a PKCS#12 or JKS key store file.

+
+
+
Example TLS client trust change configuration using a PKCS#12 key store file
+
+
trust:
+  storeFile: /opt/cert/server.p12 (1)
+  storeType: PKCS12 (2)
+  storePassword: (3)
+    passwordFile: /opt/cert/store.password
+
+
+
+ + + + + + + + + + + + + + + +
1storeFile specifies PKCS#12 file
2storeType specifies what the keystore file type is. Supported values include PKCS12 and JKS.
3Optionally, a keystore file password may be specified.
+
+
+
+

3.3. Azure Key Vault plugin configuration

+
+

For Azure Key Vault the configuration for authenticating with Microsoft Identity Platform looks like this:

+
+
+
Configuration for authenticating with Microsoft Identity Platform via OAuth 2.0
+
+
kms: AzureKeyVault
+kmsConfig:
+  keyVaultName: my-key-vault
+  keyVaultHost: vault.azure.net
+  tls:
+    # ... client trust configuration for Azure Key Vault
+  oauth2ClientCredentials:
+    oauthEndpoint: https://login.microsoftonline.com
+    tenantId: "00000000-0000-0000-0000-000000000000"
+    clientId:
+      passwordFile: /path/to/id
+    clientSecret:
+      passwordFile: /path/to/secret
+    scope: https://vault.azure.net/.default
+    tls:
+      # ... client trust configuration for Microsoft Identity Platform OAuth2
+
+
+
+
    +
  • +

    kms specifies the name of the KMS provider. Use AzureKeyVault.

    +
  • +
  • +

    keyVaultName is the name of the key vault the filter uses.

    +
  • +
  • +

    keyVaultHost is the key vault host name, without the key vault name prefix.

    +
  • +
  • +

    oauthEndpoint is the URL used for the OAuth 2.0 Client Credentials flow.

    +
  • +
  • +

    tenantId is the 32-character identifier for the Microsoft Entra tenant where the OAuth credentials were created.

    +
  • +
  • +

    clientId.passwordFile specifies the file that contains the OAuth client ID.

    +
  • +
  • +

    clientSecret.passwordFile specifies the file that contains the OAuth client secret.

    +
  • +
  • +

    scope is the App ID URI of the target resource that the proxy authenticates to (your Azure Key Vault URI).

    +
  • +
+
+
+

Alternatively, the configuration for authenticating with Managed Identities for Azure resources looks like this:

+
+
+
Configuration for authenticating with Managed Identities for Azure resources
+
+
kms: AzureKeyVault
+kmsConfig:
+  keyVaultName: my-key-vault
+  keyVaultHost: vault.azure.net
+  tls:
+    # ... client trust configuration for Azure Key Vault
+  managedIdentityCredentials:
+    targetResource: https://vault.azure.net/
+
+
+
+
    +
  • +

    kms specifies the name of the KMS provider. Use AzureKeyVault.

    +
  • +
  • +

    keyVaultName is the name of the key vault the filter uses.

    +
  • +
  • +

    keyVaultHost is the key vault host name, without the key vault name prefix.

    +
  • +
  • +

    targetResource is the App ID URI of the resource that the proxy authenticates to (your Azure Key Vault URI).

    +
  • +
+
+
+

A TLS client certificate can be specified using a PKCS#12 or JKS key store file.

+
+
+
Example TLS client certificate configuration using a PKCS#12 key store file
+
+
key:
+  storeFile: /opt/cert/server.p12 (1)
+  storeType: PKCS12 (2)
+  storePassword: (3)
+    passwordFile: /opt/cert/store.password
+  keyPassword: (4)
+    passwordFile: /opt/cert/key.password
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1storeFile specifies PKCS#12 file
2storeType specifies what the keystore file type is. Supported values include PKCS12 and JKS.
3Optionally, a keystore file password may be specified.
4Optionally, a password may be specified for the key entry within the file.
+
+
+

A set of trust anchors for the TLS client can be specified using a PKCS#12 or JKS key store file.

+
+
+
Example TLS client trust change configuration using a PKCS#12 key store file
+
+
trust:
+  storeFile: /opt/cert/server.p12 (1)
+  storeType: PKCS12 (2)
+  storePassword: (3)
+    passwordFile: /opt/cert/store.password
+
+
+
+ + + + + + + + + + + + + + + +
1storeFile specifies PKCS#12 file
2storeType specifies what the keystore file type is. Supported values include PKCS12 and JKS.
3Optionally, a keystore file password may be specified.
+
+
+
+

3.4. Fortanix DSM plugin configuration

+
+

For Fortanix DSM, the KMS configuration looks like this. Use the API key and Fortanix DSM Cluster URL values from the KMS setup.

+
+
+
+
kms: FortanixDsmKmsService                                    (1)
+kmsConfig:
+  endpointUrl: <Fortanix DSM Cluster URL>                     (2)
+  apiKeySessionProvider:
+    apiKey:
+      passwordFile: /opt/fortanix-dsm/api-key                 (3)
+
+
+
+ + + + + + + + + + + + + + + +
1Specifies the name of the KMS provider. Use FortanixDsmKmsService.
2Fortanix DSM Cluster URL including the protocol part, such as https: or http:.
3File containing the API key.
+
+
+
+

3.5. Filter configuration

+
+

This procedure describes how to configure the Record Encryption filter. Provide the filter configuration and the Key Encryption Key (KEK) selector to use. The KEK selector maps topic name to key names. The filter looks up the resulting key name in the KMS.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    Configure a RecordEncryption type filter.

    +
    +
    Example Record Encryption filter configuration
    +
    +
    kms: <kms_service_name> (1)
    +kmsConfig:
    +  <kms_specific_config> (2)
    +  # ...
    +selector: <KEK-selector_service_name> (3)
    +selectorConfig:
    +  template: "KEK-$(topicName)" (4)
    +unresolvedKeyPolicy: PASSTHROUGH_UNENCRYPTED (5)
    +experimental:
    +  encryptionDekRefreshAfterWriteSeconds: 3600 (6)
    +  encryptionDekExpireAfterWriteSeconds: 7200 (7)
    +  maxEncryptionsPerDek: 5000000 (8)
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    1The KMS service name.
    2Configuration specific to the KMS provider.
    3The Key Encryption Key (KEK) selector to use. The $(topicName) is a literal understood by the proxy. For example, if using the TemplateKekSelector with the template KEK-$(topicName), create a key for every topic that is to be encrypted with the key name matching the topic name, prefixed by the string KEK-.
    4The template for deriving the KEK, based on a specific topic name.
    5Optional policy governing the behaviour when the KMS does not contain a key. The default is PASSTHROUGH_UNENCRYPTED which causes the record to be forwarded, unencrypted, to the target cluster. Users can alternatively specify REJECT which will cause the entire produce request to be rejected. This is a safer alternative if you know that all traffic sent to the Virtual Cluster should be encrypted because unencrypted data will never be forwarded.
    6How long after creation of a DEK before it becomes eligible for rotation. On the next encryption request, the cache will asynchronously create a new DEK. Encryption requests will continue to use the old DEK until the new DEK is ready.
    7How long after creation of a DEK until it is removed from the cache. This setting puts an upper bound on how long a DEK can remain cached.
    8The maximum number of records any DEK should be used to encrypt. After this limit is hit, that DEK will be destroyed and a new one created. +
    +

    encryptionDekRefreshAfterWriteSeconds and encryptionDekExpireAfterWriteSeconds properties govern the originator usage period of the DEK, which is the amount of time the DEK remains valid for encrypting records. Shortening this period helps limit the impact if the DEK key material is leaked. However, shorter periods increase the number of KMS API calls, which might affect produce and consume latency and raise KMS provider costs.

    +
    +
    +

    maxEncryptionsPerDek helps prevent key exhaustion by placing an upper limit of the amount of times that a DEK may be used to encrypt records.

    +
    +
    +
  2. +
  3. +

    Verify that the encryption has been applied to the specified topics by producing messages through the proxy and then consuming directly and indirectly from the Kafka cluster.

    +
  4. +
+
+
+ + + + + + + +
If the filter is unable to find the key in the KMS, the filter passes through the records belonging to that topic in the produce request without encrypting them.
+
+
+
+

3.6. Example proxy configuration file

+
+

If your instance of the Kroxylicious Proxy runs directly on an operating system, provide the filter configuration in the filterDefinitions list of your proxy configuration. Here’s a complete example of a filterDefinitions entry configured for record encryption with Vault KMS:

+
+
+
+ Example filterDefinitions configuration +
+
+
filterDefinitions:
+  - name: my-encryption-filter
+    type: RecordEncryption
+    config:
+      kms: VaultKmsService
+      kmsConfig:
+        vaultTransitEngineUrl: # ...
+        tls: # ...
+        vaultToken:
+          passwordFile: /opt/vault/token
+      selector: TemplateKekSelector
+      selectorConfig:
+        template: "KEK-$(topicName)"
+      unresolvedKeyPolicy: PASSTHROUGH_UNENCRYPTED
+      experimental:
+        encryptionDekRefreshAfterWriteSeconds: 3600
+        encryptionDekExpireAfterWriteSeconds: 7200
+        maxEncryptionsPerDek: 5000000
+
+
+
+

Refer to the Kroxylicious Proxy guide for more information about configuring the proxy.

+
+
+
+

3.7. Example KafkaProtocolFilter resource

+
+

If your instance of Kroxylicious runs on Kubernetes, you must use a KafkaProtocolFilter resource to contain the filter configuration.

+
+
+

Here’s a complete example of a KafkaProtocolFilter resource configured for record encryption with Vault KMS:

+
+
+
+ Example KafkaProtocolFilter resource +
+
+
kind: KafkaProtocolFilter
+metadata:
+  name: my-encryption-filter
+spec:
+  type: RecordEncryption
+  configTemplate:
+    kms: VaultKmsService
+    kmsConfig:
+      vaultTransitEngineUrl: # ...
+      tls: # ...
+      vaultToken:
+        passwordFile: ${secret:encryption-filter:vault-token}
+    selector: TemplateKekSelector
+    selectorConfig:
+      template: "KEK-$(topicName)"
+    unresolvedKeyPolicy: PASSTHROUGH_UNENCRYPTED
+    experimental:
+      encryptionDekRefreshAfterWriteSeconds: 3600
+      encryptionDekExpireAfterWriteSeconds: 7200
+      maxEncryptionsPerDek: 5000000
+
+
+
+

Refer to the Kroxylicious Operator for Kubernetes guide for more information about configuration on Kubernetes.

+
+
+
+
+
+

4. Creating Keys

+
+
+

This section assumes that you already have a supported KMS instance up and running and have configured the Record Encryption filter. It describes how to create KMS keys for encrypting records sent to topics.

+
+
+

4.1. Creating keys in HashiCorp Vault

+
+

To create a key in HashiCorp Vault for use with the Record Encryption filter, use the following procedure.

+
+
+

4.1.1. Creating HashiCorp Vault keys

+
+

This procedure describes how to create AES-256 symmetric keys for use with the Record Encryption filter. The procedure establishes a naming convention for keys, then uses the HashiCorp CLI to create a key with an optional rotation policy.

+
+
+
Prerequisites
+
    +
  • +

    Access to the HashiCorp Vault CLI with permissions to create keys.

    +
  • +
  • +

    Familiarity with basic HashiCorp Vault Transit Engine key management operations.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Establish a naming convention for keys to ensure that the filter’s keys remain separate from those used by other systems.

    +
    +

    In this example, a KEK- prefix is used for filter key names. Adjust the naming convention as needed.

    +
    +
  2. +
  3. +

    Create a symmetric key:

    +
    +
    +
    vault write -f transit/keys/KEK-trades type=aes256-gcm96 auto_rotate_period=90d
    +
    +
    +
    +
      +
    • +

      The key type must be aes256-gcm96, which is the default type for the Transit Engine.

      +
    • +
    • +

      (Optional) The auto_rotate_period parameter enables automatic 90-day key rotation. Adjust the rotation period if required.

      +
    • +
    +
    +
  4. +
+
+
+ + + + + + + +
It is recommended to use a key rotation policy.
+
+
+
+
+

4.2. Creating keys in AWS KMS

+
+

To create a key in AWS Key Management Service for use with the Record Encryption filter, use the following procedure.

+
+
+

You’ll need a privileged AWS user that is capable of creating keys.

+
+
+

4.2.1. Creating AWS KMS keys

+
+

This procedure describes how to create a Symmetric key with encrypt and decrypt usage for the Record Encryption filter. The procedure uses the AWS CLI to create a key and, optionally, apply a rotation policy.

+
+
+ + + + + + + +
Multi-region keys are supported.
+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    Create a key and apply the alias:

    +
    +
    +
    KEY_ALIAS="KEK-<name>"
    +KEY_ID=$(aws kms create-key | jq -r '.KeyMetadata.KeyId')
    +# the create key command will produce JSON output including the KeyId
    +aws kms create-alias --alias-name alias/${KEY_ALIAS} --target-key-id ${KEY_ID}
    +
    +
    +
    + + + + + + + +
    You cannot use keys from other AWS accounts. For more information on this limitation, see the issue for AWS KMS serde improvements.
    +
    +
  2. +
  3. +

    (Optional) Enable a key rotation policy:

    +
    +
    +
    aws kms enable-key-rotation --key-id ${KEY_ID} --rotation-period-in-days 180
    +
    +
    +
    + + + + + + + +
    It is recommended to use a key rotation policy.
    +
    +
  4. +
+
+
+
+
+

4.3. Creating keys in Azure Key Vault

+
+

To create a key in Azure Key Vault for use with the Record Encryption filter, use the following procedure.

+
+
+

You’ll need a privileged Azure user that is capable of creating key resources to perform the set-up.

+
+
+

4.3.1. Creating Azure Key Vault keys

+
+

This procedure describes how to create a key with wrapKey and unwrapKey operations enabled for use with the Record Encryption filter. The procedure uses the Azure CLI to create a key and, optionally, apply a rotation policy.

+
+
+
Prerequisites
+
    +
  • +

    Access to the Azure CLI.

    +
  • +
  • +

    A user with the Key Vault Crypto Officer role or equivalent RBAC permissions to manage keys in Azure Key Vault.

    +
  • +
  • +

    Familiarity with basic Azure Key Vault key management operations.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Establish a naming convention for keys within key vault for easy identification and use with the Record Encryption filter. Use separate key vaults per application, environment, and region. This ensures separation between the filter’s keys and those used by other systems.

    +
  2. +
  3. +

    Select a key type.

    +
    + + + + + + + +
    Available key types depend on your Azure Key Vault service tier. See the Azure Key Vault documentation for background information on key types.
    +
    +
    +

    The filter accepts the following key types and their associated wrapping algorithms:

    +
    +
    +
      +
    • +

      Symmetric Keys (oct or oct-HSM): Uses the quantum-resistant A256GCM (256-bit AES GCM) wrapping algorithm, which requires a Managed HSM subscription.

      +
    • +
    • +

      Asymmetric Keys (RSA or RSA-HSM): Uses the RSA-OAEP-256 (RSAES-OAEP with SHA-256 hash and MGF1/SHA-256 mask) wrapping algorithm, which is not quantum-resistant. This wrapping algorithm does not require a Managed HSM subscription to use (however, RSA-HSM is not available without a premium Azure Key Vault subscription).

      +
    • +
    +
    +
  4. +
  5. +

    Create a key with the Azure CLI:

    +
    +
    +
    KEY_VAULT_NAME="kroxylicious-key-vault"
    +KEY_NAME="KEK-<name>"
    +KEY_TYPE="rsa"
    +az keyvault key create --vault-name ${KEY_VAULT_NAME} --name ${KEY_NAME} --kty ${KEY_TYPE} --ops wrapKey unwrapKey
    +
    +
    +
    +
      +
    • +

      Change KEY_TYPE if you want to use a key type other than RSA.

      +
    • +
    • +

      The wrapKey and unwrapKey operations must be enabled.

      +
    • +
    +
    +
  6. +
  7. +

    (Optional) Enable a key rotation policy.

    +
    +
      +
    1. +

      Save your policy to a JSON file. You can refer to an example policy in the Azure CLI documentation.

      +
    2. +
    3. +

      Apply the rotation policy:

      +
      +
      +
      az keyvault key rotation-policy update --vault-name ${VAULT_NAME} --name ${KEY_NAME} --value path/to/my_policy.json
      +
      +
      +
      + + + + + + + +
      It is recommended to use a key rotation policy.
      +
      +
    4. +
    +
    +
  8. +
+
+ +
+
+
+

4.4. Creating keys in Fortanix Data Security Manager (DSM)

+
+

To create a key in Fortanix Data Security Manager (DSM) for use with the Record Encryption filter, use the following procedure.

+
+
+

4.4.1. Creating Fortanix DSM keys

+
+

This procedure describes how to create AES-256 symmetric keys for use with the Record Encryption filter. The procedure uses the Fortanix DSM CLI to create a key according to your naming convention and assign it to the required group.

+
+
+
Prerequisites
+
    +
  • +

    Access to the Fortanix DSM CLI with sufficient permissions to create keys and list groups.

    +
  • +
  • +

    The ID of the Fortanix DSM group that will contain the keys.

    +
  • +
  • +

    Familiarity with basic Fortanix DSM key management operations.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Identify the ID of the group to contain the keys:

    +
    +
    +
    GROUP_ID=$(sdkms-cli  --api-endpoint https://<region>.smartkey.io list-groups | grep topic-keks | awk '{print $1}')
    +
    +
    +
    +
      +
    • +

      This example extracts the ID of the group named topic-keks.

      +
    • +
    +
    +
  2. +
  3. +

    Create a key and associate it with the group:

    +
    +
    +
    KEY_NAME="KEK-<name>"
    +sdkms-cli  --api-endpoint https://<region>.smartkey.io create-key --obj-type AES --key-size 256 --group-id ${GROUP_ID} --name ${KEY_NAME} --key-ops ENCRYPT,DECRYPT,APPMANAGEABLE
    +
    +
    +
    +
      +
    • +

      Specify the key operations as ENCRYPT,DECRYPT,APPMANAGEABLE. These are the minimal permissions required for record encryption to function.

      +
    • +
    +
    +
  4. +
  5. +

    (Optional) Enable a key rotation policy. Details can be found in the Fortanix DSM documentation.

    +
  6. +
+
+
+
+
+
+
+

5. Monitoring the Record Encryption filter

+
+
+

This section describes how to monitor the Record Encryption filter.

+
+
+

5.1. Record Encryption filter metrics

+
+

The filter emits metrics that provide insights into its interactions with the configured KMS. They indicate the load the filter places on the KMS infrastructure and how often its interactions with the KMS fail.

+
+
+

The filter emits metrics that count the number of records that are being encrypted. This can help you verify that the filter is configured properly and encrypting specific topics as intended.

+
+
+

These metrics are made available automatically once metrics are enabled in the proxy.

+
+
+

5.1.1. KMS metrics

+
+

KMS metrics track and count the following types of interactions:

+
+
+
    +
  • +

    Generating DEK pairs

    +
  • +
  • +

    Decrypting EDEKs

    +
  • +
  • +

    Resolving KEK aliases

    +
  • +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. KMS metrics
Metric NameTypeLabelsDescription
+

kroxylicious_kms_operation_attempt_total

+
+

Counter

+
+

operation

+
+

Count of the number of KMS operations attempted.

+
+

kroxylicious_kms_operation_outcome_total

+
+

Counter

+
+

operation, outcome

+
+

Count of the number of KMS operations grouped by outcome.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Labels used on the KMS metrics
LabelDomainDescription
+

operation

+
+

generate_dek_pair, decrypt_edek, resolve_alias

+
+

Type of operation performed.

+
+

outcome

+
+

SUCCESS, EXCEPTION, NOT_FOUND

+
+

Result of the operation.

+
+
+
+

5.1.2. Encryption accounting metrics

+
+

Encryption accounting metrics count the number of records sent to topics that are encrypted and the number of records sent to topics that are not configured for encryption. These metrics are discriminated by topic name. Use these metrics to confirm you configuration is having the effect you desired.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3. Encryption accounting metrics
Metric NameTypeLabelsDescription
+

kroxylicious_filter_record_encryption_encrypted_records

+
+

Counter

+
+

topic_name

+
+

Count of the number of records encrypted by the filter.

+
+

kroxylicious_filter_record_encryption_plain_records

+
+

Counter

+
+

topic_name

+
+

Count of the number of records not encrypted by the filter.

+
+
+
+
+
+
+

6. Operations

+
+
+

This section documents the operational aspects of using the record encryption filter.

+
+
+

6.1. Handling lost KEKs

+
+

This section describes how to recover or mitigate the loss of a Key Encryption Key (KEK) required for decryption.

+
+
+

A KEK is considered lost if it is no longer usable for decryption even though the Key Management System (KMS) remains accessible to the proxy. For example, the key might be scheduled for deletion or in an invalid state.

+
+
+ + + + + + + +
Do not delete KEKs from your KMS. Determining which KEKs are still required for decryption is complex and error-prone. If a KEK is deleted while encrypted records still depend on it, those records become unrecoverable. As a result, consuming applications will encounter errors and stop processing unless additional action is taken. Only follow the procedures in this section if absolutely necessary.
+
+
+

When a consumer attempts to fetch a record that cannot be decrypted, the proxy returns an error. The exact error depends on the Kafka client library:

+
+
+
+
Apache Kafka client
+
+

Unexpected error code 91 while fetching at offset n from topic-partition <topic>-<partition>

+
+
librdkafka-based client
+
+

Fetch from broker 0 failed at offset n (leader epoch 0): Broker: Request illegally referred to resource that does not exist

+
+
+
+
+

These errors indicate that the KEK required for decryption is missing. Error code 91 (RESOURCE_NOT_FOUND) is returned by the Record Encryption filter when the KEK is unavailable.

+
+
+

To confirm the issue, check the proxy logs for entries like the following:

+
+
+
+
Failed to decrypt record in topic-partition <topic>-<partition> owing to key not found condition.
+This will be reported to the client as a RESOURCE_NOT_FOUND(91).
+Client may see a message like 'Unexpected error code 91 while fetching at offset' (java) or or 'Request illegally referred to resource that does not exist' (librdkafka).
+Cause message: key 'd691a642-d8b4-4445-b668-d390df7000bb' is not found (AWS error: ErrorResponse{type='KMSInvalidStateException', message='arn:aws:kms:us-east-1:000000000000:key/d691a642-d8b4-4445-b668-d390df7000bb is pending deletion.'}).
+Raise log level to DEBUG to see the stack.
+
+
+
+

If you confirm that a KEK is lost, take one of the following actions:

+
+
+
    +
  • +

    Cancel key deletion

    +
  • +
  • +

    Restore key from backup

    +
  • +
  • +

    Delete or skip affected records

    +
  • +
+
+
+

The actions are listed in recommended order to help restore record consumption. After applying any of the strategies, restart all proxy instances to resume consuming records.

+
+
+

6.1.1. Cancel key deletion

+
+

Some KMS providers schedule keys for deletion instead of deleting them immediately. During this time, the key appears unavailable but can still be recovered:

+
+
+
    +
  1. +

    Use your KMS console or API to check if the missing key is scheduled for deletion.

    +
  2. +
  3. +

    If so, cancel the deletion to restore the key.

    +
  4. +
+
+
+

Refer to the documentation of the KMS for more details.

+
+
+
+

6.1.2. Restore key from backup

+
+

If the key was backed up, restore it from the backup:

+
+
+
    +
  1. +

    Use your KMS’s backup and restore tools to recover the KEK.

    +
  2. +
  3. +

    Ensure that you also restore the original key metadata, such as the key identifier. The Record Encryption filter uses the identifier to reference the KEK in cipher text records.

    +
  4. +
+
+
+ + + + + + + +
Restoring the key material alone does not ensure compatibility with encrypted records. You must also recover related metadata, such as the key identifier, to resume successful decryption.
+
+
+
+

6.1.3. Delete or skip affected records

+
+

If the KEK cannot be recovered, you must do one of the following:

+
+
+
    +
  • +

    Delete the encrypted records

    +
  • +
  • +

    Advance consumer group offsets to skip the affected records

    +
  • +
+
+
+

The process is as follows:

+
+
+
    +
  1. +

    Identify the earliest offset after which all records can be successfully decrypted.

    +
    +

    Proxy instances may not switch to a new KEK at the same time, so records encrypted with different keys might appear together in the log. As a result, there may be no single offset where encryption clearly transitions from one KEK to the next.

    +
    +
    +

    Use kafka-console-consumer.sh with a binary search approach to find the lowest offset for each affected topic partition where decryption succeeds. Domain-specific knowledge can help narrow the search.

    +
    +
  2. +
  3. +

    Use the new starting offset for each affected topic partition to do one of the following:

    +
    +
      +
    • +

      Delete records using kafka-delete-records.sh +
      + This tool deletes all records up to the specified offset, including any that may still be readable.

      +
    • +
    • +

      Advance consumer group offsets using kafka-consumer-groups.sh +
      + You must reset offsets for every consumer group that must skip the records that cannot be decrypted.

      +
    • +
    +
    +
  4. +
+
+
+
+
+
+
+

7. Trademark notice

+
+
+
    +
  • +

    Apache Kafka is a registered trademark of The Apache Software Foundation.

    +
  • +
  • +

    Kubernetes is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Prometheus is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Strimzi is a trademark of The Linux Foundation.

    +
  • +
  • +

    Hashicorp Vault is a registered trademark of HashiCorp, Inc.

    +
  • +
  • +

    AWS Key Management Service is a trademark of Amazon.com, Inc. or its affiliates.

    +
  • +
  • +

    Microsoft, Azure, and Microsoft Entra are trademarks of the Microsoft group of companies.

    +
  • +
  • +

    Fortanix and Data Security Manager are trademarks of Fortanix, Inc.

    +
  • +
+
+
+
+
+

8. Glossary

+
+
+

Glossary of terms used in the Record Encryption guide.

+
+
+
+
DEK
+
+

Data Encryption Key, a secret key used to encrypt the kafka records

+
+
KEK
+
+

Key Encryption Key, a secret key that resides within the boundaries of a KMS.

+
+
KMS
+
+

Key Management System. A dedicated system for controlling access to cryptographic material, and providing operations which use that material.

+
+
+
+
+
+ + +{% endraw %} diff --git a/documentation/0.20.0/html/record-encryption-guide/index.html b/documentation/0.20.0/html/record-encryption-guide/index.html new file mode 100644 index 0000000..7d3b156 --- /dev/null +++ b/documentation/0.20.0/html/record-encryption-guide/index.html @@ -0,0 +1,12 @@ +--- +layout: guide +title: Record Encryption Guide +description: Using the record encryption filter to provide encryption-at-rest for + Apache Kafka®. +tags: + - security + - filter +rank: '020' +version: 0.20.0 +permalink: /documentation/0.20.0/html/record-encryption-guide/ +--- diff --git a/documentation/0.20.0/html/record-encryption-guide/toc.html b/documentation/0.20.0/html/record-encryption-guide/toc.html new file mode 100644 index 0000000..dd331bf --- /dev/null +++ b/documentation/0.20.0/html/record-encryption-guide/toc.html @@ -0,0 +1,49 @@ +{% raw %} +
+ +
+{% endraw %} diff --git a/documentation/0.20.0/html/record-encryption-quick-start/content.html b/documentation/0.20.0/html/record-encryption-quick-start/content.html new file mode 100644 index 0000000..fda1533 --- /dev/null +++ b/documentation/0.20.0/html/record-encryption-quick-start/content.html @@ -0,0 +1,433 @@ +{% raw %} + + + +
+
+
+

Are you looking for an encryption-at-rest solution for data stored in your Apache Kafka?

+
+
+

This quick start guide will show you how to do that on Kubernetes …​ from scratch …​ without external dependencies. You’ll be encrypting in a snap!

+
+
+
+
+

1. Objectives

+
+
+
    +
  • +

    Deploy a Kafka Cluster to a Kubernetes cluster.

    +
  • +
  • +

    Deploy a Key Management Service (KMS) - we’ll show you how, with either HashiCorp Vault or AWS Localstack.

    +
  • +
  • +

    Deploy Kroxylicious and configure it to proxy the cluster and apply Record Encryption.

    +
  • +
  • +

    Produce/consume records to Kafka via the proxy demonstrating the transparent encryption.

    +
  • +
  • +

    Verify that the records are encrypted on the broker.

    +
  • +
+
+
+ + + + + + + +
You really don’t want to use this quickstart to deploy an environment that will be used in production. The quickstart deliberately keeps things quick and simple…​ there’s no authentication, no TLS, no redundancy…​ Development purposes only - please! Refer to the documentation for Kroxylicious, Strimzi and your KMS for production best practices.
+
+
+
+
+

2. Overview

+
+
+

This diagram shows the important components that will be deployed by the quickstart. Arrows on the diagrams explain the important flows between them. The pods shown in yellow run the kafka console producer and kafka console consumers command line applications. These pods are used to demonstrate the record encryption in action.

+
+
+

The diagram omits the operators.

+
+
+
+ Diagram showing the important kubernetes resources deployed by the quickstart and the flows between them +
+
Figure 1. Important resources and the flows between them
+
+
+
+
+

3. Before you begin

+
+
+

You’ll need the following software installed:

+
+
+ +
+
+
+
+

4. Start Minikube

+
+
+

Let’s get the Kubernetes Cluster up and running. Minikube defaults work just fine for this quickstart.

+
+
+
+
$ minikube start
+
+
+
+
+
+

5. Install the software

+
+
+

5.1. Install a KMS

+
+

Record Encryption needs somewhere to store its encryption keys, so you need to provide a KMS. Use Helm to install either HashiCorp Vault or AWS LocalStack.

+
+
+ AWS LocalStack +
+
+

LocalStack is an AWS cloud service emulator that runs in a single container on your laptop or in your CI environment. It’s intended for developing and testing cloud & Serverless apps offline.

+
+
+
+
$ helm repo add --force-update localstack-repo https://helm.localstack.cloud
+$ helm upgrade --install localstack localstack-repo/localstack --namespace kms --create-namespace --version 0.6.27 --set image.tag=4.14.0@sha256:3ebc37595918b8accb852f8048fef2aff047d465167edd655528065b07bc364a --set service.type=ClusterIP --wait
+
+
+
+ + + + + + + +
After installation, the LocalStack Helm chart prompts you to "Get the application URL". For this quickstart, you can ignore these steps.
+
+
+
+
+ HashiCorp Vault +
+
+

HashiCorp Vault is available as a Cloud Service or standalone. In this guide, we take install it standalone on Minikube. Note that Record Encryption requires the Transit Secrets Engine, which must be enabled.

+
+
+
+
$ helm repo add --force-update hashicorp https://helm.releases.hashicorp.com
+$ helm upgrade --install vault hashicorp/vault --namespace kms --create-namespace --version 0.32.0 --set server.dev.enabled=true,server.dev.devRootToken=myroottoken --wait
+
+
+
+

And enable the Transit Secrets Engine.

+
+
+
+
$ kubectl wait -n kms --for=condition=Ready pod/vault-0 && kubectl exec -n kms statefulsets/vault -- vault secrets enable transit
+
+
+
+
+
+
+

5.2. Install the Strimzi Operator

+
+

We are going to use Strimzi to deploy the Kafka Cluster that will be proxied. Let’s install Strimzi next:

+
+
+
+
$ helm repo add --force-update strimzi https://strimzi.io/charts/
+$ helm upgrade --install strimzi-operator strimzi/strimzi-kafka-operator --namespace kafka --create-namespace --version 0.51.0
+
+
+
+
+

5.3. Install the Kroxylicious Operator

+
+

First, create a temporary directory for some working files. We use a directory called ko-install-nnnnn beneath /tmp, but you can use any name and location you like.

+
+
+
+
$ QUICKSTART_DIR=/tmp/ko-install-${RANDOM}
+$ mkdir -p ${QUICKSTART_DIR}
+$ cd ${QUICKSTART_DIR}
+
+
+
+

Now let’s download and unpack the Kroxylicious Operator

+
+
+
+
$ curl --fail --location --silent https://github.com/kroxylicious/kroxylicious/releases/download/v0.20.0/kroxylicious-operator-0.20.0.zip --output kroxylicious-operator.zip
+$ unzip -q kroxylicious-operator.zip
+
+
+
+

And install the Kroxylicious Operator

+
+
+
+
$ kubectl apply -f install
+$ kubectl wait --namespace kroxylicious-operator deployment/kroxylicious-operator --for=condition=Available=True --timeout=300s
+
+
+
+
+
+
+

6. Deploy the Kafka Cluster

+
+
+

Now we need a Kafka Cluster. This is the Kafka Cluster that will be proxied. We’ll just use one from the Strimzi Quickstart. It will create a cluster in the kafka namespace.

+
+
+
+
$ kubectl apply -n kafka -f https://raw.githubusercontent.com/strimzi/strimzi-kafka-operator/refs/tags/0.51.0/examples/kafka/kafka-single-node.yaml
+$ kubectl wait -n kafka kafka/my-cluster --for=condition=Ready --timeout=300s
+
+
+
+

We’ll need the boostrap server address of the kafka cluster later, so let’s assign a variable containing it now.

+
+
+
+
$ DIRECT_CLUSTER_BOOTSTRAP_SERVERS=$(kubectl get -n kafka kafka my-cluster -o=jsonpath='{.status.listeners[0].bootstrapServers}')
+
+
+
+
+
+

7. Deploy the Proxy with Record Encryption

+
+
+

Next, we’ll deploy a Kroxylicious proxy instance using the record encryption example included in the install zip you downloaded when you installed the operator

+
+
+

It will create an instance of Kroxylicious that will proxy the kafka cluster you created above. It will configure it to use the Record Encryption filter to encrypt as records are sent by producers and decrypt them as records get fetched by consumers. The proxy will be created the my-proxy namespace

+
+
+
+
$ kubectl apply -f examples/record-encryption/
+
+
+
+

You need to update the example to find keys in your chosen KMS.

+
+
+ AWS LocalStack +
+
+
+
$ kubectl patch -n my-proxy kafkaprotocolfilters.kroxylicious.io encryption --patch '{"spec":{"configTemplate":{"kms":"AwsKmsService","kmsConfig":{"longTermCredentials":{"accessKeyId":{"password":"unused"},"secretAccessKey": {"password":"unused"}},"endpointUrl":"http://localstack.kms.svc.cluster.local:4566/", "region" : "us-east-1"}, "selector" : "TemplateKekSelector", "selectorConfig" : {"template": "KEK-$(topicName)"}}}}' --type merge
+
+
+
+
+
+ HashiCorp Vault +
+
+
+
$ kubectl patch -n my-proxy kafkaprotocolfilters.kroxylicious.io encryption --patch '{"spec":{"configTemplate":{"kms":"VaultKmsService","kmsConfig":{"vaultToken":{"password":"myroottoken"},"vaultTransitEngineUrl":"http://vault.kms.svc.cluster.local:8200/v1/transit"}, "selector" : "TemplateKekSelector", "selectorConfig" : {"template": "KEK-$(topicName)"}}}}' --type merge
+
+
+
+
+
+

Let’s wait for the Proxy to be ready:

+
+
+
+
$ kubectl wait -n my-proxy kafkaproxy/simple --for=condition=Ready=True --timeout=300s
+
+
+
+

and wait for the virtual cluster to be ready for connections.

+
+
+
+
$ kubectl wait -n my-proxy virtualkafkacluster my-cluster --for=jsonpath='{.status.ingresses[?(@.name=="cluster-ip")]}'
+
+
+
+

Finally, let’s assign a variable containing the virtual cluster’s bootstrap address. We’ll use this later to produce and consumer records through the proxy.

+
+
+
+
$ PROXIED_CLUSTER_BOOTSTRAP_SERVER=$(kubectl get -n my-proxy virtualkafkacluster my-cluster -o=jsonpath='{.status.ingresses[?(@.name=="cluster-ip")].bootstrapServer}')
+
+
+
+
+
+

8. Create an encryption key in the KMS

+
+
+

Record Encryption needs an encryption key to use when encrypting the records produced to the topic. Let’s create an encryption key in our KMS now.

+
+
+

The filter is configured to expect a key to exist in the KMS with the name KEK-<topic name>. We are going to be using a topic called trades so we will create a key that can be referred to using the name KEK-trades.

+
+
+ AWS LocalStack +
+
+

With LocalStack, you need to create a key and an alias to that key.

+
+
+
+
$ KEY_ID=$(kubectl -n kms exec deployments/localstack --  awslocal kms create-key --query KeyMetadata.KeyId --output text)
+$ kubectl -n kms exec deployments/localstack -- awslocal kms create-alias --alias-name alias/KEK-trades --target-key-id ${KEY_ID}
+
+
+
+
+
+ HashiCorp Vault +
+
+
+
$ kubectl exec -n kms statefulsets/vault -- vault write -f transit/keys/KEK-trades
+
+
+
+
+
+
+
+

9. Produce some messages

+
+
+

Now let’s use Kafka’s console producer CLI to send a few records to a topic called trades. The Record Encryption filter will encrypt the records before they reach broker, but this is completely transparent to the console producer.

+
+
+ + + + + + + +
You can safely ignore the warning about the UNKNOWN_TOPIC_OR_PARTITION, the topic will be created automatically.
+
+
+
+
$ (echo 'IBM:100'; echo 'APPLE:99') | kubectl run -n my-proxy --quiet=true --stdin=true proxy-producer --image=quay.io/strimzi/kafka:0.51.0-kafka-4.2.0 --rm=true --restart=Never -- ./bin/kafka-console-producer.sh --bootstrap-server ${PROXIED_CLUSTER_BOOTSTRAP_SERVER} --topic trades
+
+
+
+
+
+

10. Consume the messages

+
+
+

Now let’s use Kafka’s console consumer to fetch the records. You’ll see the two records we sent above. The Record Encryption filter will decrypt the records before they reach consumer, but this is completely transparent to the console consumer.

+
+
+
+
$ kubectl run -n my-proxy --quiet=true --attach=true --stdin=false proxy-consumer --image=quay.io/strimzi/kafka:0.51.0-kafka-4.2.0 --rm=true --restart=Never -- ./bin/kafka-console-consumer.sh  --bootstrap-server ${PROXIED_CLUSTER_BOOTSTRAP_SERVER} --topic trades --from-beginning --max-messages 2
+
+
+
+
+
+

11. Verify that the records are encrypted on the broker

+
+
+

Consuming the same records we wrote is a bit underwhelming! And, in fact, it’s what we’d expect to see with a vanilla, unproxied, Kafka cluster. So how do we know the records really encrypted on the broker? Let’s use the console consumer again, but this time we’ll consume straight from the Kafka cluster, bypassing the proxy. We’ll get back the records, but they’ll contain ciphertext, rather than the plaintext.

+
+
+
+
$ kubectl run -n kafka --quiet=true --attach=true --stdin=false cluster-consumer --image=quay.io/strimzi/kafka:0.51.0-kafka-4.2.0 --rm=true --restart=Never -- ./bin/kafka-console-consumer.sh  --bootstrap-server ${DIRECT_CLUSTER_BOOTSTRAP_SERVERS} --topic trades --from-beginning --max-messages 2
+
+
+
+
+
+

12. Cleaning up

+
+
+

To clean up, remove the proxy and the kafka cluster

+
+
+
+
$ kubectl delete -f examples/record-encryption/
+$ kubectl delete -n kafka -f https://raw.githubusercontent.com/strimzi/strimzi-kafka-operator/refs/tags/0.51.0/examples/kafka/kafka-single-node.yaml
+
+
+
+

Remove the Kroxylicious and Strimzi Operator.

+
+
+
+
$ kubectl delete -f install
+$ helm uninstall -n kafka strimzi-operator --ignore-not-found
+
+
+
+

Remove the KMS.

+
+
+ AWS LocalStack +
+
+
+
$ helm uninstall -n kms localstack --ignore-not-found
+
+
+
+
+
+ HashiCorp Vault +
+
+
+
$ helm uninstall -n kms vault --ignore-not-found
+
+
+
+
+
+

And finally remove the namespaces.

+
+
+
+
$ kubectl delete ns kafka kms
+
+
+
+
+
+

13. What next?

+
+ +
+

You are also welcome to come talk to us. Chat with us in Slack or start a Github Discussion.

+
+
+
+ + +{% endraw %} diff --git a/documentation/0.20.0/html/record-encryption-quick-start/index.html b/documentation/0.20.0/html/record-encryption-quick-start/index.html new file mode 100644 index 0000000..6006da2 --- /dev/null +++ b/documentation/0.20.0/html/record-encryption-quick-start/index.html @@ -0,0 +1,11 @@ +--- +layout: guide +title: Record Encryption Quick Start +description: Start here for an encryption-at-rest solution for Apache Kafka®. +tags: + - security + - filter +rank: '011' +version: 0.20.0 +permalink: /documentation/0.20.0/html/record-encryption-quick-start/ +--- diff --git a/documentation/0.20.0/html/record-encryption-quick-start/toc.html b/documentation/0.20.0/html/record-encryption-quick-start/toc.html new file mode 100644 index 0000000..9ded3b0 --- /dev/null +++ b/documentation/0.20.0/html/record-encryption-quick-start/toc.html @@ -0,0 +1,24 @@ +{% raw %} +
+ +
+{% endraw %} diff --git a/documentation/0.20.0/html/record-validation-guide/content.html b/documentation/0.20.0/html/record-validation-guide/content.html new file mode 100644 index 0000000..509c329 --- /dev/null +++ b/documentation/0.20.0/html/record-validation-guide/content.html @@ -0,0 +1,438 @@ +{% raw %} + + + +
+
+

About this guide

+
+

This guide covers using the Kroxylicious Record Validation Filter to validate records sent by Kafka client to Kafka brokers. Refer to other Kroxylicious guides for information on running the proxy or for advanced topics such as plugin development.

+
+
+

The Record Validation filter validates records sent by a producer. Only records that pass the validation are sent to the broker. This filter can be used to prevent poison messages—such as those containing corrupted data or invalid formats—from entering the Kafka system, which may otherwise lead to consumer failure.

+
+
+

The filter currently supports three modes of operation:

+
+
+
    +
  1. +

    Schema Validation ensures the content of the record conforms to a schema stored in an Apicurio Registry.

    +
  2. +
  3. +

    JSON Syntax Validation ensures the content of the record contains syntactically valid JSON.

    +
  4. +
  5. +

    JWS Signature Validation ensures the configured Kafka header contains a valid JSON Web Signature (JWS) Signature.

    +
  6. +
+
+
+

Validation rules can be applied to check the content of the Kafka record key or value.

+
+
+

If the validation fails, the product request is rejected and the producing application receives an error response. The broker will not receive the rejected records.

+
+
+ + + + + + + +
This filter is currently in incubation and available as a preview. We would not recommend using it in a production environment.
+
+
+
+
+

1. (Preview) Setting up the Record Validation filter

+
+
+

This procedure describes how to set up the Record Validation filter. You provide the filter configuration and rules used to validate Kafka record keys and values.

+
+
+
Prerequisites
+
    +
  • +

    An instance of Kroxylicious. For information about deploying Kroxylicious, see the Kroxylicious Proxy guide or the Kroxylicious Operator for Kubernetes guide.

    +
  • +
  • +

    A ConfigMap for Kroxylicious that includes the configuration required to create a virtual cluster.

    +
  • +
  • +

    Apicurio Registry, if you want to use schema validation.

    +
  • +
+
+
+
Procedure
+
    +
  1. +

    Configure a filter of type RecordValidation.

    +
    + +
    +
  2. +
  3. +

    Replace the <rule definition> token in the YAML configuration with a validation rule that matches your requirements.

    +
    +

    Choose one of the following rule types:

    +
    +
    +
      +
    • +

      Schema validation, to validate record keys or values against a schema stored in an Apicurio Registry.

      +
    • +
    • +

      JSON syntax validation, to validate that record keys or values contain syntactically valid JSON.

      +
    • +
    • +

      JWS signature validation, to validate a JSON Web Signature (JWS) provided in a Kafka record header.

      +
      +

      The following examples show how to configure each rule type.

      +
      +
      +

      Example schema validation rule:

      +
      +
      +
      +
      +
      +
      schemaValidationConfig:
      +  apicurioId: 1001
      +  apicurioRegistryUrl: http://registry.local:8080
      +  tls:
      +    trust:
      +      storeFile: /opt/proxy/trust/ca.p12
      +      storePassword:
      +        passwordFile: /opt/proxy/trust/store.password
      +      storeType: PKCS12
      +  wireFormatVersion: V3
      +allowNulls: true
      +allowEmpty: true
      +
      +
      +
      +
        +
      • +

        apicurioId identifies the schema that the filter enforces. By default, this ID refers to the Apicurio Registry’s contentId. If the record key or value does not conform to the schema identified by this ID, the record is rejected. If a Kafka producer embeds a schema ID in the record (either in a header or magic bytes at the start of the record’s key or value), the filter validates it against this value. The record is rejected if the IDs do not match.

        +
      • +
      • +

        apicurioRegistryUrl specifies the endpoint URL for the Apicurio Registry.

        +
      • +
      • +

        tls specifies the optional TLS configuration used when connecting securely to the Apicurio Registry.

        +
        +
          +
        • +

          storeFile path to the truststore file that contains the trust anchors used to validate the server connection.

          +
        • +
        • +

          storePassword (Optional) password used to protect the truststore.

          +
        • +
        • +

          storeType truststore type. Supported values include PKCS12, JKS, and PEM.

          +
        • +
        +
        +
      • +
      • +

        wireFormatVersion controls whether the Apicurio client operates in V3 (default) or V2 (deprecated). In V3 mode, the apicurioId property identifies schema by content ID, and the filter expects the Kafka producer to use content IDs to identify schema. In V2 mode, the apicurioId property identifies schema by global ID, and the filter expects the Kafka producer to use global IDs to identify schema. V2 mode exists only for compatibility with older Apicurio configurations and is deprecated. For new applications, use V3.

        +
      • +
      • +

        allowNulls specifies whether the validator allows record keys or values to be null. The default is false.

        +
      • +
      • +

        allowEmpty specifies whether the validator allows record keys or values to be empty. The default is false.

        +
      • +
      +
      +
      +

      For more information about embedding the ID in a record, see the Apicurio documentation.

      +
      +
      +
      +
      + + + + + + + +
      Schema validation currently supports enforcing JSON schemas only (issue).
      +
      +
      +

      Example JSON syntax validation rule:

      +
      +
      +
      +
      +
      +
      syntacticallyCorrectJson:
      +  validateObjectKeysUnique: true
      +allowNulls: true
      +allowEmpty: true
      +
      +
      +
      +
        +
      • +

        syntacticallyCorrectJson.validateObjectKeysUnique specifies whether JSON object keys must be unique. The default is false.

        +
      • +
      • +

        allowNulls specifies whether the validator allows record keys or values to be null. The default is false.

        +
      • +
      • +

        allowEmpty specifies whether the validator allows record keys or values to be empty. The default is false.

        +
      • +
      +
      +
      +
      +
      +

      This rule rejects records that contain syntactically invalid JSON in the record key or value.

      +
      +
      +

      Example JWS signature validation rule:

      +
      +
      +
      +
      +
      +
      jwsSignatureValidation:
      +  trustedJsonWebKeySet: |
      +    {
      +      "keys": [
      +        {
      +          "kty": "RSA",
      +          "kid": "RSA JWK",
      +          "key_ops": [ "verify" ],
      +          "alg": "RS256",
      +          "n": "lx-5h_lkVJGc8-NxgKGkfxobBlM7DDCjqAloEieCf8c9KbPJ12V0Bm8arOX-lm0wRSLxmWzQ3NTM6S9pDbSc7fQt77THlMD1zEDMwIAJxfoMt3U_VrMHVdiOvO6YpU3jWBp7BfQNYHJjCSiaxIHqDPuDCh2GTflkU32Nfim7W3iLBuH4_K8ADYHz3QdeX29vzl49PDbUiiJEsjnEconsfuYjrFaN3uGn41mGzjedc7oxlcID8fDxq5bvZvOFBAIqdrxs5qPYw1QlVupB3LT0AMU1qKWOB_vkM1n54eDIxP9Xd__WnvX4wagYqA1OZ9LPBenhBX7_Rbnrap2QNQ58-Q",
      +          "e": "AQAB"
      +        },
      +        {
      +          "kty": "EC",
      +          "kid": "EC JWK",
      +          "key_ops": [ "verify" ],
      +          "crv": "P-256",
      +          "alg": "ES256",
      +          "x": "f83OJ3D2xF4h2Jm2VvZd7uKQ6GFDp4zQpN9qzZPJxG8",
      +          "y": "x_FEzRu9PZxC5H5KJ5-3HqWQX5J8V4a5j8nY1JvG9r0"
      +        }
      +      ]
      +    }
      +  algorithms:
      +    allowed:
      +      - ES256
      +      - RS256
      +  recordHeader:
      +    key: kroxylicious.io/jws
      +    required: true
      +  content:
      +    detached: false
      +
      +
      +
      +
        +
      • +

        jwsSignatureValidation.trustedJsonWebKeySet specifies the set of JSON Web Keys (JWK) used to verify JSON Web Signature (JWS) signatures.

        +
      • +
      • +

        The JWS signature validation rule verifies the JWS only and does not perform JSON Web Token (JWT) claim validation. Token claims such as expiration and issuer are not checked.

        +
      • +
      • +

        jwsSignatureValidation.algorithms.allowed and jwsSignatureValidation.algorithms.denied specify which signature algorithms are permitted.

        +
        +
          +
        • +

          If both allowed and denied are omitted or empty, all algorithms are blocked and JWS signature verification fails.

          +
        • +
        • +

          If only allowed is specified, only the algorithms listed in allowed are permitted.

          +
        • +
        • +

          If only denied is specified, all algorithms except those listed in denied are permitted.

          +
        • +
        • +

          If both allowed and denied are specified, only the algorithms listed in allowed are permitted.

          +
        • +
        +
        +
      • +
      • +

        jwsSignatureValidation.recordHeader.key specifies the Kafka record header key that contains the JWS. The default value is kroxylicious.io/jws.

        +
      • +
      • +

        jwsSignatureValidation.recordHeader.required specifies whether the JWS record header must be present. If set to false, validation is skipped when the header is missing.

        +
      • +
      • +

        jwsSignatureValidation.content.detached specifies whether the record buffer is used as the JWS payload (detached content, as defined in RFC 7515 Appendix F).

        +
      • +
      +
      +
      +
      +
    • +
    +
    +
  4. +
+
+
+

1.1. Example proxy configuration file

+
+

If your instance of the Kroxylicious Proxy runs directly on an operating system, provide the filter configuration in the filterDefinitions list of your proxy configuration. Here’s a complete example of a filterDefinitions entry configured for record validation:

+
+
+
+
filterDefinitions:
+  - name: my-record-validation
+    type: RecordValidation
+    config:
+        rules:
+        - topicNames:                                                  (1)
+            - <topic name>
+          keyRule:
+            <rule definition>                                          (2)
+          valueRule:
+            <rule definition>                                          (3)
+        defaultRule:                                                   (4)
+          keyRule:
+            <rule definition>                                          (2)
+          valueRule:
+            <rule definition>                                          (3)
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1List of topic names to which the validation rules will be applied.
2Validation rules that are applied to the record’s key.
3Validation rules that are applied to the record’s value.
4(Optional) Default rule that is applied to any topics for which there is no explict rule defined.
+
+
+

Refer to the Kroxylicious Proxy guide for more information about configuring the proxy.

+
+
+
+

1.2. Example KafkaProtocolFilter resource

+
+

If your instance of Kroxylicious runs on Kubernetes, you must use a KafkaProtocolFilter resource to contain the filter configuration.

+
+
+

Here’s a complete example of a KafkaProtocolFilter resource configured for record validation:

+
+
+
+ Example KafkaProtocolFilter resource for record validation +
+
+
kind: KafkaProtocolFilter
+metadata:
+  name: my-validation-filter
+spec:
+  type: RecordValidation
+  configTemplate:
+    rules:
+    - topicNames:                                                  (1)
+        - <topic name>
+      keyRule:
+        <rule definition>                                          (2)
+      valueRule:
+        <rule definition>                                          (3)
+    defaultRule:                                                   (4)
+      keyRule:
+        <rule definition>                                          (2)
+      valueRule:
+        <rule definition>                                          (3)
+
+
+
+ + + + + + + + + + + + + + + + + + + +
1List of topic names to which the validation rules will be applied.
2Validation rules that are applied to the record’s key.
3Validation rules that are applied to the record’s value.
4(Optional) Default rule that is applied to any topics for which there is no explict rule defined.
+
+
+

Refer to the Kroxylicious Operator for Kubernetes guide for more information about configuration on Kubernetes.

+
+
+
+
+
+

2. Trademark notice

+
+
+
    +
  • +

    Apache Kafka is a registered trademark of The Apache Software Foundation.

    +
  • +
  • +

    Kubernetes is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Prometheus is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Strimzi is a trademark of The Linux Foundation.

    +
  • +
  • +

    Hashicorp Vault is a registered trademark of HashiCorp, Inc.

    +
  • +
  • +

    AWS Key Management Service is a trademark of Amazon.com, Inc. or its affiliates.

    +
  • +
  • +

    Microsoft, Azure, and Microsoft Entra are trademarks of the Microsoft group of companies.

    +
  • +
  • +

    Fortanix and Data Security Manager are trademarks of Fortanix, Inc.

    +
  • +
+
+
+
+ + +{% endraw %} diff --git a/documentation/0.20.0/html/record-validation-guide/index.html b/documentation/0.20.0/html/record-validation-guide/index.html new file mode 100644 index 0000000..5bc4b7b --- /dev/null +++ b/documentation/0.20.0/html/record-validation-guide/index.html @@ -0,0 +1,12 @@ +--- +layout: guide +title: Record Validation Guide +description: "Using the record validation filter to ensure records follow certain\ + \ rules, including schema and signature validity." +tags: + - governance + - filter +rank: '021' +version: 0.20.0 +permalink: /documentation/0.20.0/html/record-validation-guide/ +--- diff --git a/documentation/0.20.0/html/record-validation-guide/toc.html b/documentation/0.20.0/html/record-validation-guide/toc.html new file mode 100644 index 0000000..452dd22 --- /dev/null +++ b/documentation/0.20.0/html/record-validation-guide/toc.html @@ -0,0 +1,12 @@ +{% raw %} +
+ +
+{% endraw %} diff --git a/documentation/0.20.0/html/sasl-inspection-guide/content.html b/documentation/0.20.0/html/sasl-inspection-guide/content.html new file mode 100644 index 0000000..73226f0 --- /dev/null +++ b/documentation/0.20.0/html/sasl-inspection-guide/content.html @@ -0,0 +1,406 @@ +{% raw %} + + + +
+
+

About this guide

+
+

This guide covers using the Kroxylicious SASL Inspection Filter. This filter extracts the authenticated principal from a successful SASL exchange between Kafka Client and Kafka Broker and makes it available to the other filters in the chain.

+
+
+

Refer to other Kroxylicious guides for information on running the proxy or for advanced topics such as plugin development.

+
+
+

This filter inspects the SASL exchange between Kafka Client and Broker and extracts the authorization ID. If the client’s authentication with the broker is successful, the filter uses the SASL subject builder to construct an authenticated subject. The subject is made available to the other filters in the chain, so that they may know on whose behalf they are acting.

+
+
+ + + + + + + +
The SASL Inspection Filter plays no part in deciding if the authentication is successful or not. That role remains the exclusive responsibility of the broker.
+
+
+

To use this filter, the Kafka Cluster’s listener must be configured to authenticate using SASL, and it must use a SASL mechanism that is enabled by this filter. If the Kafka Client is configured to use a SASL mechanism that is not supported by the proxy, or the proxy and Kafka Cluster do not have the same mechanism available, the client will be disconnected with an unsupported SASL mechanism error.

+
+
+

This filter supports the following SASL mechanisms:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Table of supported SASL mechanisms
SASL mechanismEnabled by default
+

PLAIN

+
+

No

+
+

SCRAM-SHA-256

+
+

Yes

+
+

SCRAM-SHA-512

+
+

Yes

+
+

OAUTHBEARER

+
+

Yes

+
+
+

Mechanisms that transmit credentials in plain text are disabled by default. This is done to avoid the plain-text passwords existing in the proxy’s memory. To use such a mechanism, you must enable it in the filter’s configuration.

+
+
+

For the OAUTHBEARER inspection, only JWT tokens that use signatures (JWS) are supported. JWT tokens that use encryption (JWE) are not supported. Unsigned JWT tokens are supported but not recommended for production use.

+
+
+

If an attempt is made to use an unsupported token type, the authentication will fail with a SASL error.

+
+
+
+ Sequence diagram showing SASL inspection. +
+
Figure 1. Sequence diagram showing the SASL inspection filter extracting an authenticated principal from an SASL negotiation.
+
+
+
+
+

1. Configuring the SASL inspection filter

+
+
+

This procedure describes how to set up the SASL Inspection filter by configuring it in Kroxylicious.

+
+
+
Prerequisites
+ +
+
+
Procedure
+
    +
  1. +

    Configure a SaslInspection type filter.

    +
    + +
    +
  2. +
+
+
+

1.1. Example proxy configuration file

+
+

If your instance of the Kroxylicious Proxy runs directly on an operating system, provide the filter configuration in the filterDefinitions list of your proxy configuration.

+
+
+

Here’s a complete example of a filterDefinitions entry configured for SASL inspection:

+
+
+
+
filterDefinitions:
+  - name: my-sasl-inspection-filter
+    type: SaslInspection
+    config:
+      enabledMechanisms: [ "OAUTHBEARER" ]
+      requireAuthentication: true
+      subjectBuilder: <class name>
+      subjectBuilderConfig: <object providing configuration for the subject builder>
+
+
+
+

where:

+
+
+
    +
  • +

    enabledMechanisms restricts the filter to the given SASL mechanism(s). Refer to SASL mechanism by its name given in the supported mechanisms table. If omitted, the SASL mechanisms SCRAM-SHA-256, SCRAM-SHA-512 and OAUTHBEARER will be enabled by default.

    +
  • +
  • +

    if requireAuthentication is true, a successful authentication is required before the filter forwards any requests other than those strictly required to perform SASL authentication. If false then the filter will forward all requests regardless of whether SASL authentication has been attempted or was successful. Defaults to false.

    +
  • +
  • +

    subjectBuilder is the name of a plugin class implementing io.kroxylicious.proxy.authentication.SaslSubjectBuilderService. If omitted, a default subject builder creates a principal with name matching the SASL authorized ID.

    +
  • +
  • +

    subjectBuilderConfig provides subject builder configuration.

    +
  • +
+
+
+

Refer to the Kroxylicious Proxy guide for more information about configuring the proxy.

+
+
+
+

1.2. Example KafkaProtocolFilter resource

+
+

If your instance of Kroxylicious runs on Kubernetes, you must use a KafkaProtocolFilter resource to contain the filter configuration.

+
+
+

Here’s a complete example of a KafkaProtocolFilter resource configured for SASL inspection:

+
+
+
+
kind: KafkaProtocolFilter
+metadata:
+  name: my-sasl-inspection-filter
+spec:
+  type: SaslInspection
+  configTemplate:
+    enabledMechanisms: [ "OAUTHBEARER" ]
+    requireAuthentication: true
+    subjectBuilder: <class name>
+    subjectBuilderConfig: <object providing configuration for the subject builder>
+
+
+
+

where:

+
+
+
    +
  • +

    enabledMechanisms restricts the filter to the given SASL mechanism(s). Refer to SASL mechanism by its name given in the supported mechanisms table. If omitted, the SASL mechanisms SCRAM-SHA-256, SCRAM-SHA-512 and OAUTHBEARER will be enabled by default.

    +
  • +
  • +

    if requireAuthentication is true, a successful authentication is required before the filter forwards any requests other than those strictly required to perform SASL authentication. If false then the filter will forward all requests regardless of whether SASL authentication has been attempted or was successful. Defaults to false.

    +
  • +
  • +

    subjectBuilder is the name of a plugin class implementing io.kroxylicious.proxy.authentication.SaslSubjectBuilderService. If omitted, a default subject builder creates a principal with name matching the SASL authorized ID.

    +
  • +
  • +

    subjectBuilderConfig provides subject builder configuration.

    +
  • +
+
+
+

Refer to the Kroxylicious Operator for Kubernetes guide for more information about configuration on Kubernetes.

+
+
+
+
+
+

2. Configuring SASL subject builder

+
+
+

By default, the SASL Inspection filter creates an authenticated subject with a principal that contains the SASL authorized ID. You can change this behavior by providing an alternative subject builder configuration.

+
+
+

2.1. Configuration

+
+

The following example shows configuration for the SASL subject builder:

+
+
+
+
# ...
+subjectBuilder: DefaultSaslSubjectBuilderService
+subjectBuilderConfig:
+    addPrincipals:
+      - from: <field name>
+        map:
+          - replaceMatch: <match replace flags 1>
+          - # ...
+          - replaceMatch: <match replace flags n>
+          - else: identity|anonymous
+        principalFactory: <principal factory>
+
+
+
+

where:

+
+
+
    +
  • +

    <field name> identifies the field to extract. Valid field names are listed in the Supported fields table.

    +
  • +
  • +

    <match replace flags 1>…​<match replace flags n> define a set of replacement matchers used to match and transform the field value.

    +
  • +
  • +

    else defines the behavior when none of the replacement matchers match the field value. identity generates a principal based on the original (unmapped) field value. anonymous generates an anonymous principal.

    +
  • +
  • +

    <principal factory> the name of a PrincipalFactory implementation. Currently, only UserFactory is supported.

    +
  • +
+
+
+

Field values are tested against the replacement matchers in the order they are configured. The first matcher that matches the field value generates the principal. After a successful match, remaining matchers for that field are ignored.

+
+
+

If no matcher matches, the outcome is defined by the else clause. If there is no match and no else cause is provided, no principal is generated for this field.

+
+
+ + + + + + + +
Currently, the subject builder is restricted to producing a subject containing at most one user principal.
+
+
+
+

2.2. Supported fields

+ + + + + + + + + + + + + + + + + +
Field nameDescription
+

saslAuthorizedId

+
+

The SASL authorized ID returned by the SASL authentication exchange.

+
+
+
+

2.3. Replacement matchers

+
+

Replacement matchers control how field values are matched and transformed. A replacement matcher is defined using this format:

+
+
+
+
/<matching regular expression>/<replacement>/<flags>
+
+
+
+

where:

+
+
+
    +
  • +

    <matching regular expression> is the regular expression used to test the field value.

    +
  • +
  • +

    <replacement> defines the replacement value to use when the regular expression is matched. The replacement can use back references ($1 etc) to refer to capturing groups defined within the regular expression.

    +
  • +
  • +

    <flags> (optional) can be either L or U for lower or upper-casing respectively. The case transformation is applied to the replacement value after any back reference resolution.

    +
  • +
+
+
+
+
+
+

3. Trademark notice

+
+
+
    +
  • +

    Apache Kafka is a registered trademark of The Apache Software Foundation.

    +
  • +
  • +

    Kubernetes is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Prometheus is a registered trademark of The Linux Foundation.

    +
  • +
  • +

    Strimzi is a trademark of The Linux Foundation.

    +
  • +
  • +

    Hashicorp Vault is a registered trademark of HashiCorp, Inc.

    +
  • +
  • +

    AWS Key Management Service is a trademark of Amazon.com, Inc. or its affiliates.

    +
  • +
  • +

    Microsoft, Azure, and Microsoft Entra are trademarks of the Microsoft group of companies.

    +
  • +
  • +

    Fortanix and Data Security Manager are trademarks of Fortanix, Inc.

    +
  • +
+
+
+
+
+

4. Glossary

+
+
+

Glossary of terms used in the SASL Inspection guide.

+
+
+
+
JWE
+
+

JSON Web Encryption is an IETF standard for exchanging encrypted data using JSON.

+
+
JWT
+
+

JSON Web Token is an IETF standard for securely transmitting information between parties as a JSON object.

+
+
JWS
+
+

JSON Web Signature is an IETF-proposed standard for signing arbitrary data.

+
+
Principal
+
+

A principal is a component of a subject.

+
+
SASL
+
+

Simple Authentication and Security Layer is an IETF framework for handling authentication.

+
+
Subject
+
+

A subject is the authenticated identity of a client.

+
+
+
+
+
+ + +{% endraw %} diff --git a/documentation/0.20.0/html/sasl-inspection-guide/index.html b/documentation/0.20.0/html/sasl-inspection-guide/index.html new file mode 100644 index 0000000..80b5943 --- /dev/null +++ b/documentation/0.20.0/html/sasl-inspection-guide/index.html @@ -0,0 +1,12 @@ +--- +layout: guide +title: SASL Inspection Guide +description: Using the SASL Inspection filter to infer the client's subject from its + successful authentication exchange with a broker. +tags: + - filter + - security +rank: '023' +version: 0.20.0 +permalink: /documentation/0.20.0/html/sasl-inspection-guide/ +--- diff --git a/documentation/0.20.0/html/sasl-inspection-guide/toc.html b/documentation/0.20.0/html/sasl-inspection-guide/toc.html new file mode 100644 index 0000000..9e5c8cd --- /dev/null +++ b/documentation/0.20.0/html/sasl-inspection-guide/toc.html @@ -0,0 +1,19 @@ +{% raw %} +
+ +
+{% endraw %} diff --git a/documentation/0.20.0/index.md b/documentation/0.20.0/index.md new file mode 100644 index 0000000..1f57444 --- /dev/null +++ b/documentation/0.20.0/index.md @@ -0,0 +1,6 @@ +--- +layout: released-documentation +title: Documentation +permalink: /documentation/0.20.0/ +--- + \ No newline at end of file diff --git a/documentation/0.20.0/javadoc/allclasses-index.html b/documentation/0.20.0/javadoc/allclasses-index.html new file mode 100644 index 0000000..23e0670 --- /dev/null +++ b/documentation/0.20.0/javadoc/allclasses-index.html @@ -0,0 +1,1077 @@ + + + + +All Classes and Interfaces (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

All Classes and Interfaces

+
+
+
+
+
+
Class
+
Description
+ +
+
An action encapsulates an operation on a given resource identified by a name.
+
+ +
+
A stateless filter for AddOffsetsToTxnRequests.
+
+ +
+
A stateless filter for AddOffsetsToTxnResponses.
+
+ +
+
A stateless filter for AddPartitionsToTxnRequests.
+
+ +
+
A stateless filter for AddPartitionsToTxnResponses.
+
+ +
+
A stateless filter for AddRaftVoterRequests.
+
+ +
+
A stateless filter for AddRaftVoterResponses.
+
+ +
+
A stateless filter for AllocateProducerIdsRequests.
+
+ +
+
A stateless filter for AllocateProducerIdsResponses.
+
+ +
+
Class to keep track of allow and deny lists meant for use when building context for SSLEngine.
+
+ +
+
A stateless filter for AlterClientQuotasRequests.
+
+ +
+
A stateless filter for AlterClientQuotasResponses.
+
+ +
+
A stateless filter for AlterConfigsRequests.
+
+ +
+
A stateless filter for AlterConfigsResponses.
+
+ +
+
A stateless filter for AlterPartitionReassignmentsRequests.
+
+ +
+
A stateless filter for AlterPartitionReassignmentsResponses.
+
+ +
+
A stateless filter for AlterPartitionRequests.
+
+ +
+
A stateless filter for AlterPartitionResponses.
+
+ +
+
A stateless filter for AlterReplicaLogDirsRequests.
+
+ +
+
A stateless filter for AlterReplicaLogDirsResponses.
+
+ +
+
A stateless filter for AlterShareGroupOffsetsRequests.
+
+ +
+
A stateless filter for AlterShareGroupOffsetsResponses.
+
+ +
+
A stateless filter for AlterUserScramCredentialsRequests.
+
+ +
+
A stateless filter for AlterUserScramCredentialsResponses.
+
+ +
+
A stateless filter for ApiVersionsRequests.
+
+ +
+
A stateless filter for ApiVersionsResponses.
+
+ +
+
A stateless filter for AssignReplicasToDirsRequests.
+
+ +
+
A stateless filter for AssignReplicasToDirsResponses.
+
+ +
+
Abstracts making an allow/deny decision about some Subject performing some Action on a resource.
+
+ + + +
+
An exception to be thrown if an Authorizer cannot be built, or is not able to make a decision.
+
+ +
+
Service interface for Authorizers.
+
+ +
+
A stateless filter for BeginQuorumEpochRequests.
+
+ +
+
A stateless filter for BeginQuorumEpochResponses.
+
+ +
+
A stateless filter for BrokerHeartbeatRequests.
+
+ +
+
A stateless filter for BrokerHeartbeatResponses.
+
+ +
+
A stateless filter for BrokerRegistrationRequests.
+
+ +
+
A stateless filter for BrokerRegistrationResponses.
+
+ +
+
Exposes SASL authentication information to plugins, for example using FilterContext.clientSaslContext().
+
+ +
+
Exposes TLS information about the client-to-proxy connection to plugins, for example using FilterContext.clientTlsContext().
+
+ +
+
Interface supporting the FilterResultBuilder fluent API.
+
+ +
+
Interface supporting the FilterResultBuilder fluent API.
+
+ +
+
A stateless filter for ConsumerGroupDescribeRequests.
+
+ +
+
A stateless filter for ConsumerGroupDescribeResponses.
+
+ +
+
A stateless filter for ConsumerGroupHeartbeatRequests.
+
+ +
+
A stateless filter for ConsumerGroupHeartbeatResponses.
+
+ +
+
A stateless filter for ControllerRegistrationRequests.
+
+ +
+
A stateless filter for ControllerRegistrationResponses.
+
+ +
+
A stateless filter for CreateAclsRequests.
+
+ +
+
A stateless filter for CreateAclsResponses.
+
+ +
+
A stateless filter for CreateDelegationTokenRequests.
+
+ +
+
A stateless filter for CreateDelegationTokenResponses.
+
+ +
+
A stateless filter for CreatePartitionsRequests.
+
+ +
+
A stateless filter for CreatePartitionsResponses.
+
+ +
+
A stateless filter for CreateTopicsRequests.
+
+ +
+
A stateless filter for CreateTopicsResponses.
+
+ +
+
An authorization decision about whether a particular subject is allowed to perform a + specific operation on a particular resource.
+
+ +
+
A Data Encryption Key as both plaintext and encrypted.
+
+ +
+
A stateless filter for DeleteAclsRequests.
+
+ +
+
A stateless filter for DeleteAclsResponses.
+
+ +
+
A stateless filter for DeleteGroupsRequests.
+
+ +
+
A stateless filter for DeleteGroupsResponses.
+
+ +
+
A stateless filter for DeleteRecordsRequests.
+
+ +
+
A stateless filter for DeleteRecordsResponses.
+
+ +
+
A stateless filter for DeleteShareGroupOffsetsRequests.
+
+ +
+
A stateless filter for DeleteShareGroupOffsetsResponses.
+
+ +
+
A stateless filter for DeleteShareGroupStateRequests.
+
+ +
+
A stateless filter for DeleteShareGroupStateResponses.
+
+ +
+
A stateless filter for DeleteTopicsRequests.
+
+ +
+
A stateless filter for DeleteTopicsResponses.
+
+ +
+
Annotates a @Plugin + implementation class whose + fully-qualified type name has been changed + and whose old name should no longer be used + to refer to it.
+
+ +
+
A stateless filter for DescribeAclsRequests.
+
+ +
+
A stateless filter for DescribeAclsResponses.
+
+ +
+
A stateless filter for DescribeClientQuotasRequests.
+
+ +
+
A stateless filter for DescribeClientQuotasResponses.
+
+ +
+
A stateless filter for DescribeClusterRequests.
+
+ +
+
A stateless filter for DescribeClusterResponses.
+
+ +
+
A stateless filter for DescribeConfigsRequests.
+
+ +
+
A stateless filter for DescribeConfigsResponses.
+
+ +
+
A stateless filter for DescribeDelegationTokenRequests.
+
+ +
+
A stateless filter for DescribeDelegationTokenResponses.
+
+ +
+
A stateless filter for DescribeGroupsRequests.
+
+ +
+
A stateless filter for DescribeGroupsResponses.
+
+ +
+
A stateless filter for DescribeLogDirsRequests.
+
+ +
+
A stateless filter for DescribeLogDirsResponses.
+
+ +
+
A stateless filter for DescribeProducersRequests.
+
+ +
+
A stateless filter for DescribeProducersResponses.
+
+ +
+
A stateless filter for DescribeQuorumRequests.
+
+ +
+
A stateless filter for DescribeQuorumResponses.
+
+ +
+
A stateless filter for DescribeShareGroupOffsetsRequests.
+
+ +
+
A stateless filter for DescribeShareGroupOffsetsResponses.
+
+ +
+
A stateless filter for DescribeTopicPartitionsRequests.
+
+ +
+
A stateless filter for DescribeTopicPartitionsResponses.
+
+ +
+
A stateless filter for DescribeTransactionsRequests.
+
+ +
+
A stateless filter for DescribeTransactionsResponses.
+
+ +
+
A stateless filter for DescribeUserScramCredentialsRequests.
+
+ +
+
A stateless filter for DescribeUserScramCredentialsResponses.
+
+ +
+
A SecretKey that has RAW encoding and can be destroyed + (unlike SecretKeySpec).
+
+ +
+
A stateless filter for ElectLeadersRequests.
+
+ +
+
A stateless filter for ElectLeadersResponses.
+
+ +
+
A stateless filter for EndQuorumEpochRequests.
+
+ +
+
A stateless filter for EndQuorumEpochResponses.
+
+ +
+
A stateless filter for EndTxnRequests.
+
+ +
+
A stateless filter for EndTxnResponses.
+
+ +
+
A stateless filter for EnvelopeRequests.
+
+ +
+
A stateless filter for EnvelopeResponses.
+
+ +
+
A stateless filter for ExpireDelegationTokenRequests.
+
+ +
+
A stateless filter for ExpireDelegationTokenResponses.
+
+ +
+
A stateless filter for FetchRequests.
+
+ +
+
A stateless filter for FetchResponses.
+
+ +
+
A stateless filter for FetchSnapshotRequests.
+
+ +
+
A stateless filter for FetchSnapshotResponses.
+
+ +
+
A reference to the file containing a nonempty plain text password in UTF-8 encoding.
+
+ +
+
Marker interface all Filter interfaces extend from
+
+ +
+
A context to allow filters to interact with other filters and the pipeline.
+
+ +
+
An Executor backed by the Filter Dispatch Thread.
+
+ +
+
A pluggable source of Filter instances.
+
+ +
+
Construction context for Filters.
+
+ +
+
The result of a filter request or response operation that encapsulates the request or response + to be forwarded to the next filter in the chain.
+
+ +
+
Fluent builder for filter results.
+
+ +
+
A stateless filter for FindCoordinatorRequests.
+
+ +
+
A stateless filter for FindCoordinatorResponses.
+
+ +
+
A stateless filter for GetTelemetrySubscriptionsRequests.
+
+ +
+
A stateless filter for GetTelemetrySubscriptionsResponses.
+
+ +
+
A stateless filter for HeartbeatRequests.
+
+ +
+
A stateless filter for HeartbeatResponses.
+
+ +
+
A stateless filter for IncrementalAlterConfigsRequests.
+
+ +
+
A stateless filter for IncrementalAlterConfigsResponses.
+
+ +
+
A stateless filter for InitializeShareGroupStateRequests.
+
+ +
+
A stateless filter for InitializeShareGroupStateResponses.
+
+ +
+
A stateless filter for InitProducerIdRequests.
+
+ +
+
A stateless filter for InitProducerIdResponses.
+
+ +
+
A password expressed directly in the model, in plain text.
+
+ +
+
A TrustProvider that allows the disabling trust verification.
+
+ +
+
Thrown when a KMS-managed key is passed to an operation that is incompatible with its allowed key usage.
+
+ +
+
A stateless filter for JoinGroupRequests.
+
+ +
+
A stateless filter for JoinGroupResponses.
+
+ +
+
A KeyProvider backed by a private-key/certificate pair expressed in PEM format.
+
+ +
+
A KeyProvider is a source of a TLS private-key/certificate pair and optionally intermediate certificate(s).
+
+ +
+
Visitor for implementations of KeyProvider
+
+ +
+
A KeyProvider backed by a Java Truststore.
+
+ +
+
Abstracts the KMS operations needed for Envelope Encryption
+
+ +
+
Represents problems interacting with a Key Management System.
+
+ +
+
Service interface for KMSs
+
+ +
+
A stateless filter for LeaveGroupRequests.
+
+ +
+
A stateless filter for LeaveGroupResponses.
+
+ +
+
A stateless filter for ListConfigResourcesRequests.
+
+ +
+
A stateless filter for ListConfigResourcesResponses.
+
+ +
+
A stateless filter for ListGroupsRequests.
+
+ +
+
A stateless filter for ListGroupsResponses.
+
+ +
+
A stateless filter for ListOffsetsRequests.
+
+ +
+
A stateless filter for ListOffsetsResponses.
+
+ +
+
A stateless filter for ListPartitionReassignmentsRequests.
+
+ +
+
A stateless filter for ListPartitionReassignmentsResponses.
+
+ +
+
A stateless filter for ListTransactionsRequests.
+
+ +
+
A stateless filter for ListTransactionsResponses.
+
+ +
+
A stateless filter for MetadataRequests.
+
+ +
+
A stateless filter for MetadataResponses.
+
+ +
+
A stateless filter for OffsetCommitRequests.
+
+ +
+
A stateless filter for OffsetCommitResponses.
+
+ +
+
A stateless filter for OffsetDeleteRequests.
+
+ +
+
A stateless filter for OffsetDeleteResponses.
+
+ +
+
A stateless filter for OffsetFetchRequests.
+
+ +
+
A stateless filter for OffsetFetchResponses.
+
+ +
+
A stateless filter for OffsetForLeaderEpochRequests.
+
+ +
+
A stateless filter for OffsetForLeaderEpochResponses.
+
+ +
+
A PasswordProvider is an abstract source of a password.
+
+ +
 
+ +
+
An annotation, on a plugin implementation class, that identifies the class of "config record" + consumed by that implementation.
+
+ +
+
Thrown when a plugin configuration is invalid
+
+ +
+
An annotation that identifies a plugin instance name at a plugin point within the configuration.
+
+ +
+
Annotates a property (within a "config record") that names a plugin implementation with the plugin interface.
+
+ +
 
+ +
+
An identifier held by a Subject.
+
+ +
 
+ +
+
A stateless filter for ProduceRequests.
+
+ +
+
A stateless filter for ProduceResponses.
+
+ +
+
A stateless filter for PushTelemetryRequests.
+
+ +
+
A stateless filter for PushTelemetryResponses.
+
+ +
+
A stateless filter for ReadShareGroupStateRequests.
+
+ +
+
A stateless filter for ReadShareGroupStateResponses.
+
+ +
+
A stateless filter for ReadShareGroupStateSummaryRequests.
+
+ +
+
A stateless filter for ReadShareGroupStateSummaryResponses.
+
+ +
+
A stateless filter for RemoveRaftVoterRequests.
+
+ +
+
A stateless filter for RemoveRaftVoterResponses.
+
+ +
+
A stateless filter for RenewDelegationTokenRequests.
+
+ +
+
A stateless filter for RenewDelegationTokenResponses.
+
+ +
+
A Filter that handles all request types, for example to modify the request headers.
+
+ +
+
A specialization of the FilterResult for request filters.
+
+ +
+
Builder for request filter results.
+
+ +
+
A ResourceType is an enum of the possible operations on a resource of a particular type.
+
+ +
+
A Filter that handles all response types.
+
+ +
+
A specialization of the FilterResult for response filters.
+
+ +
+
Builder for response filter results.
+
+ +
+
A stateless filter for SaslAuthenticateRequests.
+
+ +
+
A stateless filter for SaslAuthenticateResponses.
+
+ +
+
A stateless filter for SaslHandshakeRequests.
+
+ +
+
A stateless filter for SaslHandshakeResponses.
+
+ +
+
Builds a Subject based on information available from a successful SASL authentication.
+
+ +
+
The context that's passed to SaslSubjectBuilder.buildSaslSubject(Context).
+
+ +
 
+ +
+
ByteBuffer-sympathetic serialization and deserialization of objects.
+
+ +
+
Options that control TLS negotiation when in server mode.
+
+ +
+
A stateless filter for ShareAcknowledgeRequests.
+
+ +
+
A stateless filter for ShareAcknowledgeResponses.
+
+ +
+
A stateless filter for ShareFetchRequests.
+
+ +
+
A stateless filter for ShareFetchResponses.
+
+ +
+
A stateless filter for ShareGroupDescribeRequests.
+
+ +
+
A stateless filter for ShareGroupDescribeResponses.
+
+ +
+
A stateless filter for ShareGroupHeartbeatRequests.
+
+ +
+
A stateless filter for ShareGroupHeartbeatResponses.
+
+ +
+
A stateless filter for StreamsGroupDescribeRequests.
+
+ +
+
A stateless filter for StreamsGroupDescribeResponses.
+
+ +
+
A stateless filter for StreamsGroupHeartbeatRequests.
+
+ +
+
A stateless filter for StreamsGroupHeartbeatResponses.
+
+ +
+
Represents an actor in the system.
+
+ +
+
An exception to be thrown if a Subject cannot be built.
+
+ +
+
A stateless filter for SyncGroupRequests.
+
+ +
+
A stateless filter for SyncGroupResponses.
+
+ +
+
Interface supporting the FilterResultBuilder fluent API.
+
+ +
+
Provides TLS configuration for this peer.
+
+ +
 
+ +
+
Indicates that there was an Error set on a MetadataResponseData.MetadataResponseTopic.
+
+ +
+
The result of discovering the topic names for a collection of topic ids
+
+ +
+
Indicates there was some problem obtaining a name for a topic id
+
+ +
+
Indicates that there was an Error set at the top level of MetadataResponseData.
+
+ +
+
Builds a Subject based on information available at the transport layer, + before any requests have been received from the client.
+
+ +
 
+ +
+
The service interface used to construct a TransportSubjectBuilder.
+
+ +
 
+ +
+
A TrustProvider is a source of trust anchors used to determine whether a certificate present by a peer is trusted.
+
+ +
+
Visitor for implementations of TrustProvider
+
+ +
+
A TrustProvider backed by a Java Truststore.
+
+ +
+
A stateless filter for TxnOffsetCommitRequests.
+
+ +
+
A stateless filter for TxnOffsetCommitResponses.
+
+ +
+
Annotates implementations Principal which are only intended to + have a single instance present in a Subject's principals.
+
+ +
+
Thrown when a client tries to resolve a key with an alias which is not know to the KMS.
+
+ +
+
Thrown when a KMS instance is passed reference to key that it does not manage.
+
+ +
+
A reference to a plugin instance could not be resolved by the proxy runtime.
+
+ +
+
A stateless filter for UnregisterBrokerRequests.
+
+ +
+
A stateless filter for UnregisterBrokerResponses.
+
+ +
+
A stateless filter for UpdateFeaturesRequests.
+
+ +
+
A stateless filter for UpdateFeaturesResponses.
+
+ +
+
A stateless filter for UpdateRaftVoterRequests.
+
+ +
+
A stateless filter for UpdateRaftVoterResponses.
+
+ +
+
A principal identifying an authenticated client.
+
+ +
 
+ +
+
A stateless filter for VoteRequests.
+
+ +
+
A stateless filter for VoteResponses.
+
+ +
+
A stateless filter for WriteShareGroupStateRequests.
+
+ +
+
A stateless filter for WriteShareGroupStateResponses.
+
+ +
+
A stateless filter for WriteTxnMarkersRequests.
+
+ +
+
A stateless filter for WriteTxnMarkersResponses.
+
+
+
+
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/allpackages-index.html b/documentation/0.20.0/javadoc/allpackages-index.html new file mode 100644 index 0000000..3927091 --- /dev/null +++ b/documentation/0.20.0/javadoc/allpackages-index.html @@ -0,0 +1,108 @@ + + + + +All Packages (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

All Packages

+
+
Package Summary
+
+
Package
+
Description
+ +
+
An abstract API for making access control decisions about Subjects + wanting to perform Actions.
+
+ +
+
Abstracts Key Management System (KMS) operations necessary for the envelope encryption pattern using Data Encryption Keys (DEKs) and Key Encryption Keys (KEKs).
+
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+ +
+
Abstraction for providing passwords to proxy configuration.
+
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+ +
+
The protocol filter API.
+
+ +
+
Builder API for constructing filter results.
+
+ +
+
APIs for resolving topic IDs to topic names and handling metadata-related errors.
+
+ +
+
API for defining plugins within configuration.
+
+ +
+
APIs for plugins that are exposed to details of TLS connections between the proxy and its network peers.
+
+
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/constant-values.html b/documentation/0.20.0/javadoc/constant-values.html new file mode 100644 index 0000000..e5a4a34 --- /dev/null +++ b/documentation/0.20.0/javadoc/constant-values.html @@ -0,0 +1,84 @@ + + + + +Constant Field Values (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Constant Field Values

+
+
+

Contents

+ +
+
+

io.kroxylicious.*

+
    +
  • +
    io.kroxylicious.proxy.config.tls.Tls
    +
    +
    Modifier and Type
    +
    Constant Field
    +
    Value
    +
    public static final String
    + +
    "PEM"
    +
    +
  • +
+
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/copy.svg b/documentation/0.20.0/javadoc/copy.svg new file mode 100644 index 0000000..7c46ab1 --- /dev/null +++ b/documentation/0.20.0/javadoc/copy.svg @@ -0,0 +1,33 @@ + + + + + + + + diff --git a/documentation/0.20.0/javadoc/deprecated-list.html b/documentation/0.20.0/javadoc/deprecated-list.html new file mode 100644 index 0000000..4a2c006 --- /dev/null +++ b/documentation/0.20.0/javadoc/deprecated-list.html @@ -0,0 +1,126 @@ + + + + +Deprecated List (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Deprecated API

+
+

Contents

+ + + + +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/element-list b/documentation/0.20.0/javadoc/element-list new file mode 100644 index 0000000..37cfaee --- /dev/null +++ b/documentation/0.20.0/javadoc/element-list @@ -0,0 +1,10 @@ +io.kroxylicious.authorizer.service +io.kroxylicious.kms.service +io.kroxylicious.proxy.authentication +io.kroxylicious.proxy.config.secret +io.kroxylicious.proxy.config.tls +io.kroxylicious.proxy.filter +io.kroxylicious.proxy.filter.filterresultbuilder +io.kroxylicious.proxy.filter.metadata +io.kroxylicious.proxy.plugin +io.kroxylicious.proxy.tls diff --git a/documentation/0.20.0/javadoc/help-doc.html b/documentation/0.20.0/javadoc/help-doc.html new file mode 100644 index 0000000..965604f --- /dev/null +++ b/documentation/0.20.0/javadoc/help-doc.html @@ -0,0 +1,208 @@ + + + + +API Help (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+

JavaDoc Help

+ +
+
+

Navigation

+Starting from the Overview page, you can browse the documentation using the links in each page, and in the navigation bar at the top of each page. The Index and Search box allow you to navigate to specific declarations and summary pages, including: All Packages, All Classes and Interfaces + +
+
+
+

Kinds of Pages

+The following sections describe the different kinds of pages in this collection. +
+

Overview

+

The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

+
+
+

Package

+

Each package has a page that contains a list of its classes and interfaces, with a summary for each. These pages may contain the following categories:

+
    +
  • Interfaces
  • +
  • Classes
  • +
  • Enum Classes
  • +
  • Exception Classes
  • +
  • Annotation Interfaces
  • +
+
+
+

Class or Interface

+

Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a declaration and description, member summary tables, and detailed member descriptions. Entries in each of these sections are omitted if they are empty or not applicable.

+
    +
  • Class Inheritance Diagram
  • +
  • Direct Subclasses
  • +
  • All Known Subinterfaces
  • +
  • All Known Implementing Classes
  • +
  • Class or Interface Declaration
  • +
  • Class or Interface Description
  • +
+
+
    +
  • Nested Class Summary
  • +
  • Enum Constant Summary
  • +
  • Field Summary
  • +
  • Property Summary
  • +
  • Constructor Summary
  • +
  • Method Summary
  • +
  • Required Element Summary
  • +
  • Optional Element Summary
  • +
+
+
    +
  • Enum Constant Details
  • +
  • Field Details
  • +
  • Property Details
  • +
  • Constructor Details
  • +
  • Method Details
  • +
  • Element Details
  • +
+

Note: Annotation interfaces have required and optional elements, but not methods. Only enum classes have enum constants. The components of a record class are displayed as part of the declaration of the record class. Properties are a feature of JavaFX.

+

The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

+
+
+

Other Files

+

Packages and modules may contain pages with additional information related to the declarations nearby.

+
+
+

Use

+

Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the USE link in the navigation bar.

+
+
+

Tree (Class Hierarchy)

+

There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. Classes are organized by inheritance structure starting with java.lang.Object. Interfaces do not inherit from java.lang.Object.

+
    +
  • When viewing the Overview page, clicking on TREE displays the hierarchy for all packages.
  • +
  • When viewing a particular package, class or interface page, clicking on TREE displays the hierarchy for only that package.
  • +
+
+
+

Deprecated API

+

The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to shortcomings, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

+
+
+

Constant Field Values

+

The Constant Field Values page lists the static final fields and their values.

+
+
+

Serialized Form

+

Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to those who implement rather than use the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See Also" section of the class description.

+
+
+

All Packages

+

The All Packages page contains an alphabetic index of all packages contained in the documentation.

+
+
+

All Classes and Interfaces

+

The All Classes and Interfaces page contains an alphabetic index of all classes and interfaces contained in the documentation, including annotation interfaces, enum classes, and record classes.

+
+
+

Index

+

The Index contains an alphabetic index of all classes, interfaces, constructors, methods, and fields in the documentation, as well as summary pages such as All Packages, All Classes and Interfaces.

+
+
+
+This help file applies to API documentation generated by the standard doclet.
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/index-all.html b/documentation/0.20.0/javadoc/index-all.html new file mode 100644 index 0000000..6860342 --- /dev/null +++ b/documentation/0.20.0/javadoc/index-all.html @@ -0,0 +1,3875 @@ + + + + +Index (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Index

+
+A B C D E F G H I J K L M N O P R S T U V W 
All Classes and Interfaces|All Packages|Constant Field Values|Serialized Form +

A

+
+
accept(KeyProviderVisitor<T>) - Method in record class io.kroxylicious.proxy.config.tls.KeyPair
+
 
+
accept(KeyProviderVisitor<T>) - Method in interface io.kroxylicious.proxy.config.tls.KeyProvider
+
+
Visits the trust provider KeyProviderVisitor.
+
+
accept(KeyProviderVisitor<T>) - Method in record class io.kroxylicious.proxy.config.tls.KeyStore
+
 
+
accept(TrustProviderVisitor<T>) - Method in record class io.kroxylicious.proxy.config.tls.InsecureTls
+
 
+
accept(TrustProviderVisitor<T>) - Method in class io.kroxylicious.proxy.config.tls.PlatformTrustProvider
+
 
+
accept(TrustProviderVisitor<T>) - Method in interface io.kroxylicious.proxy.config.tls.TrustProvider
+
+
Visits the trust provider TrustProviderVisitor.
+
+
accept(TrustProviderVisitor<T>) - Method in record class io.kroxylicious.proxy.config.tls.TrustStore
+
 
+
Action - Record Class in io.kroxylicious.authorizer.service
+
+
An action encapsulates an operation on a given resource identified by a name.
+
+
Action(ResourceType<?>, String) - Constructor for record class io.kroxylicious.authorizer.service.Action
+
+
Creates an instance of a Action record class.
+
+
AddOffsetsToTxnRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AddOffsetsToTxnRequests.
+
+
AddOffsetsToTxnResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AddOffsetsToTxnResponses.
+
+
AddPartitionsToTxnRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AddPartitionsToTxnRequests.
+
+
AddPartitionsToTxnResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AddPartitionsToTxnResponses.
+
+
AddRaftVoterRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AddRaftVoterRequests.
+
+
AddRaftVoterResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AddRaftVoterResponses.
+
+
allFailures() - Method in interface io.kroxylicious.proxy.filter.metadata.TopicNameMapping
+
 
+
AllocateProducerIdsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AllocateProducerIdsRequests.
+
+
AllocateProducerIdsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AllocateProducerIdsResponses.
+
+
ALLOW - Enum constant in enum class io.kroxylicious.authorizer.service.Decision
+
+
The subject is allowed to perform the operation on the resource.
+
+
AllowDeny<T> - Record Class in io.kroxylicious.proxy.config.tls
+
+
Class to keep track of allow and deny lists meant for use when building context for SSLEngine.
+
+
AllowDeny(List<T>, Set<T>) - Constructor for record class io.kroxylicious.proxy.config.tls.AllowDeny
+
+
Creates an instance of a AllowDeny record class.
+
+
allowed() - Method in record class io.kroxylicious.authorizer.service.AuthorizeResult
+
+
Returns the value of the allowed record component.
+
+
allowed() - Method in record class io.kroxylicious.proxy.config.tls.AllowDeny
+
+
Returns the value of the allowed record component.
+
+
allowed(ResourceType<?>) - Method in record class io.kroxylicious.authorizer.service.AuthorizeResult
+
+
Returns a list of the names of all the resources which the AuthorizeResult.subject() + is allowed to perform the given operation on.
+
+
allPrincipalsOfType(Class<P>) - Method in record class io.kroxylicious.proxy.authentication.Subject
+
 
+
AlterClientQuotasRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AlterClientQuotasRequests.
+
+
AlterClientQuotasResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AlterClientQuotasResponses.
+
+
AlterConfigsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AlterConfigsRequests.
+
+
AlterConfigsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AlterConfigsResponses.
+
+
AlterPartitionReassignmentsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AlterPartitionReassignmentsRequests.
+
+
AlterPartitionReassignmentsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AlterPartitionReassignmentsResponses.
+
+
AlterPartitionRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AlterPartitionRequests.
+
+
AlterPartitionResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AlterPartitionResponses.
+
+
AlterReplicaLogDirsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AlterReplicaLogDirsRequests.
+
+
AlterReplicaLogDirsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AlterReplicaLogDirsResponses.
+
+
AlterShareGroupOffsetsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AlterShareGroupOffsetsRequests.
+
+
AlterShareGroupOffsetsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AlterShareGroupOffsetsResponses.
+
+
AlterUserScramCredentialsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AlterUserScramCredentialsRequests.
+
+
AlterUserScramCredentialsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AlterUserScramCredentialsResponses.
+
+
anonymous() - Static method in record class io.kroxylicious.proxy.authentication.Subject
+
 
+
anyFailures() - Method in interface io.kroxylicious.proxy.filter.metadata.TopicNameMapping
+
 
+
ApiVersionsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ApiVersionsRequests.
+
+
ApiVersionsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ApiVersionsResponses.
+
+
AssignReplicasToDirsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AssignReplicasToDirsRequests.
+
+
AssignReplicasToDirsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for AssignReplicasToDirsResponses.
+
+
authenticatedSubject() - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
Returns the client subject.
+
+
authorizationId() - Method in interface io.kroxylicious.proxy.authentication.ClientSaslContext
+
+
Returns the client's authorizationId that resulted from the SASL exchange.
+
+
authorize(Subject, List<Action>) - Method in interface io.kroxylicious.authorizer.service.Authorizer
+
+
Determines whether the given subject is allowed to perform the given actions.
+
+
Authorizer - Interface in io.kroxylicious.authorizer.service
+
+
Abstracts making an allow/deny decision about some Subject performing some Action on a resource.
+
+
AuthorizeResult - Record Class in io.kroxylicious.authorizer.service
+
+ +
+
AuthorizeResult(Subject, List<Action>, List<Action>) - Constructor for record class io.kroxylicious.authorizer.service.AuthorizeResult
+
+
It is the instantiator's responsibility to ensure that allowed and denied are disjoint.
+
+
AuthorizerException - Exception Class in io.kroxylicious.authorizer.service
+
+
An exception to be thrown if an Authorizer cannot be built, or is not able to make a decision.
+
+
AuthorizerException(String) - Constructor for exception class io.kroxylicious.authorizer.service.AuthorizerException
+
 
+
AuthorizerException(String, Throwable) - Constructor for exception class io.kroxylicious.authorizer.service.AuthorizerException
+
 
+
AuthorizerService<C> - Interface in io.kroxylicious.authorizer.service
+
+
Service interface for Authorizers.
+
+
+

B

+
+
BeginQuorumEpochRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for BeginQuorumEpochRequests.
+
+
BeginQuorumEpochResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for BeginQuorumEpochResponses.
+
+
BrokerHeartbeatRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for BrokerHeartbeatRequests.
+
+
BrokerHeartbeatResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for BrokerHeartbeatResponses.
+
+
BrokerRegistrationRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for BrokerRegistrationRequests.
+
+
BrokerRegistrationResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for BrokerRegistrationResponses.
+
+
build() - Method in interface io.kroxylicious.authorizer.service.AuthorizerService
+
+
Builds an Authorizer service.
+
+
build() - Method in interface io.kroxylicious.proxy.authentication.SaslSubjectBuilderService
+
 
+
build() - Method in interface io.kroxylicious.proxy.authentication.TransportSubjectBuilderService
+
 
+
build() - Method in interface io.kroxylicious.proxy.filter.filterresultbuilder.TerminalStage
+
+
Constructs the filter result.
+
+
buildKms() - Method in interface io.kroxylicious.kms.service.KmsService
+
+
Builds a KMS service.
+
+
buildSaslSubject(SaslSubjectBuilder.Context) - Method in interface io.kroxylicious.proxy.authentication.SaslSubjectBuilder
+
+
Returns an asynchronous result which completes with the Subject built + from the given context.
+
+
buildTransportSubject(TransportSubjectBuilder.Context) - Method in interface io.kroxylicious.proxy.authentication.TransportSubjectBuilder
+
+
Returns an asynchronous result which completes with the Subject built + from the given context.
+
+
+

C

+
+
certificateFile() - Method in record class io.kroxylicious.proxy.config.tls.KeyPair
+
+
Returns the value of the certificateFile record component.
+
+
Chained Computation stages - Search tag in io.kroxylicious.proxy.filter.FilterContext.sendRequest(RequestHeaderData, ApiMessage)
+
Section
+
Chained Computation stages - Search tag in io.kroxylicious.proxy.filter.FilterContext.topicNames(Collection<Uuid>)
+
Section
+
channelDescriptor() - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
A description of the downstream/client channel.
+
+
cipherSuites() - Method in record class io.kroxylicious.proxy.config.tls.Tls
+
+
Returns the value of the cipherSuites record component.
+
+
clientAuth() - Method in record class io.kroxylicious.proxy.config.tls.ServerOptions
+
+
Returns the value of the clientAuth record component.
+
+
clientCertificate() - Method in interface io.kroxylicious.proxy.tls.ClientTlsContext
+
 
+
clientSaslAuthenticationFailure(String, String, Exception) - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
Allows a filter (typically one which implements SaslAuthenticateRequestFilter) + to announce a failed authentication outcome with the Kafka client.
+
+
clientSaslAuthenticationSuccess(String, Subject) - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
Allows a filter (typically one which implements SaslAuthenticateRequestFilter) + to announce a successful authentication outcome with the Kafka client to other plugins.
+
+
clientSaslAuthenticationSuccess(String, String) - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
Deprecated. +
Callers should use FilterContext.clientSaslAuthenticationSuccess(String, Subject) + to announce authentication outcomes instead of this method. + When this method is used the result of FilterContext.authenticatedSubject() will be a non-empty Optional + with a Subject having a single User principal with the given authorizedId
+
+
+
clientSaslContext() - Method in interface io.kroxylicious.proxy.authentication.SaslSubjectBuilder.Context
+
 
+
clientSaslContext() - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
 
+
ClientSaslContext - Interface in io.kroxylicious.proxy.authentication
+
+
Exposes SASL authentication information to plugins, for example using FilterContext.clientSaslContext().
+
+
clientTlsContext() - Method in interface io.kroxylicious.proxy.authentication.SaslSubjectBuilder.Context
+
 
+
clientTlsContext() - Method in interface io.kroxylicious.proxy.authentication.TransportSubjectBuilder.Context
+
 
+
clientTlsContext() - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
 
+
ClientTlsContext - Interface in io.kroxylicious.proxy.tls
+
+
Exposes TLS information about the client-to-proxy connection to plugins, for example using FilterContext.clientTlsContext().
+
+
close() - Method in interface io.kroxylicious.authorizer.service.AuthorizerService
+
+
Closes the service.
+
+
close() - Method in interface io.kroxylicious.kms.service.KmsService
+
+
Closes the service.
+
+
close() - Method in interface io.kroxylicious.proxy.authentication.SaslSubjectBuilderService
+
 
+
close() - Method in interface io.kroxylicious.proxy.authentication.TransportSubjectBuilderService
+
 
+
close(I) - Method in interface io.kroxylicious.proxy.filter.FilterFactory
+
+
Called by the runtime to release any resources associated with the given initializationData.
+
+
closeConnection() - Method in interface io.kroxylicious.proxy.filter.FilterResult
+
+
signals the filter's wish that the connection will be closed. if the filter provides a + message it will be forwarded before the connection is closed.
+
+
CloseOrTerminalStage<R> - Interface in io.kroxylicious.proxy.filter.filterresultbuilder
+
+
Interface supporting the FilterResultBuilder fluent API.
+
+
CloseStage<R> - Interface in io.kroxylicious.proxy.filter.filterresultbuilder
+
+
Interface supporting the FilterResultBuilder fluent API.
+
+
completed() - Method in interface io.kroxylicious.proxy.filter.filterresultbuilder.TerminalStage
+
+
Produces the filter result contained within a completed CompletionStage.
+
+
completeOnFilterDispatchThread(CompletionStage<T>) - Method in interface io.kroxylicious.proxy.filter.FilterDispatchExecutor
+
+
Switches to this Filter Dispatch Thread.
+
+
configType() - Element in annotation interface io.kroxylicious.proxy.plugin.Plugin
+
 
+
ConsumerGroupDescribeRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ConsumerGroupDescribeRequests.
+
+
ConsumerGroupDescribeResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ConsumerGroupDescribeResponses.
+
+
ConsumerGroupHeartbeatRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ConsumerGroupHeartbeatRequests.
+
+
ConsumerGroupHeartbeatResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ConsumerGroupHeartbeatResponses.
+
+
ControllerRegistrationRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ControllerRegistrationRequests.
+
+
ControllerRegistrationResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ControllerRegistrationResponses.
+
+
CreateAclsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for CreateAclsRequests.
+
+
CreateAclsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for CreateAclsResponses.
+
+
createByteBufferOutputStream(int) - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
Create a ByteBufferOutputStream of the given capacity.
+
+
CreateDelegationTokenRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for CreateDelegationTokenRequests.
+
+
CreateDelegationTokenResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for CreateDelegationTokenResponses.
+
+
createFilter(FilterFactoryContext, I) - Method in interface io.kroxylicious.proxy.filter.FilterFactory
+
+
Creates an instance of the Filter.
+
+
CreatePartitionsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for CreatePartitionsRequests.
+
+
CreatePartitionsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for CreatePartitionsResponses.
+
+
CreateTopicsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for CreateTopicsRequests.
+
+
CreateTopicsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for CreateTopicsResponses.
+
+
Creating Filter Result objects - Search tag in package io.kroxylicious.proxy.filter
+
Section
+
+

D

+
+
decision(ResourceType<?>, String) - Method in record class io.kroxylicious.authorizer.service.AuthorizeResult
+
+
Returns the decision about whether the given AuthorizeResult.subject() is allowed to perform the given + operation on the resource with the given resourceName.
+
+
Decision - Enum Class in io.kroxylicious.authorizer.service
+
+
An authorization decision about whether a particular subject is allowed to perform a + specific operation on a particular resource.
+
+
decryptEdek(E) - Method in interface io.kroxylicious.kms.service.Kms
+
+
Asynchronously decrypts a data encryption key that was previously encrypted.
+
+
Deferring Forwards - Search tag in package io.kroxylicious.proxy.filter
+
Section
+
definesKey() - Method in record class io.kroxylicious.proxy.config.tls.Tls
+
 
+
dek() - Method in record class io.kroxylicious.kms.service.DekPair
+
+
Returns the value of the dek record component.
+
+
DekPair<E> - Record Class in io.kroxylicious.kms.service
+
+
A Data Encryption Key as both plaintext and encrypted.
+
+
DekPair(E, SecretKey) - Constructor for record class io.kroxylicious.kms.service.DekPair
+
+
Creates an instance of a DekPair record class.
+
+
DeleteAclsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DeleteAclsRequests.
+
+
DeleteAclsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DeleteAclsResponses.
+
+
DeleteGroupsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DeleteGroupsRequests.
+
+
DeleteGroupsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DeleteGroupsResponses.
+
+
DeleteRecordsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DeleteRecordsRequests.
+
+
DeleteRecordsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DeleteRecordsResponses.
+
+
DeleteShareGroupOffsetsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DeleteShareGroupOffsetsRequests.
+
+
DeleteShareGroupOffsetsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DeleteShareGroupOffsetsResponses.
+
+
DeleteShareGroupStateRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DeleteShareGroupStateRequests.
+
+
DeleteShareGroupStateResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DeleteShareGroupStateResponses.
+
+
DeleteTopicsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DeleteTopicsRequests.
+
+
DeleteTopicsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DeleteTopicsResponses.
+
+
denied() - Method in record class io.kroxylicious.authorizer.service.AuthorizeResult
+
+
Returns the value of the denied record component.
+
+
denied() - Method in record class io.kroxylicious.proxy.config.tls.AllowDeny
+
+
Returns the value of the denied record component.
+
+
denied(ResourceType<?>) - Method in record class io.kroxylicious.authorizer.service.AuthorizeResult
+
+
Returns a list of the names of all the resources which the AuthorizeResult.subject() + is denied from performing the given operation on.
+
+
DENY - Enum constant in enum class io.kroxylicious.authorizer.service.Decision
+
+
The subject is not allowed to perform the operation on the resource.
+
+
DeprecatedPluginName - Annotation Interface in io.kroxylicious.proxy.plugin
+
+
Annotates a @Plugin + implementation class whose + fully-qualified type name has been changed + and whose old name should no longer be used + to refer to it.
+
+
DescribeAclsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeAclsRequests.
+
+
DescribeAclsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeAclsResponses.
+
+
DescribeClientQuotasRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeClientQuotasRequests.
+
+
DescribeClientQuotasResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeClientQuotasResponses.
+
+
DescribeClusterRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeClusterRequests.
+
+
DescribeClusterResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeClusterResponses.
+
+
DescribeConfigsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeConfigsRequests.
+
+
DescribeConfigsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeConfigsResponses.
+
+
DescribeDelegationTokenRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeDelegationTokenRequests.
+
+
DescribeDelegationTokenResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeDelegationTokenResponses.
+
+
DescribeGroupsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeGroupsRequests.
+
+
DescribeGroupsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeGroupsResponses.
+
+
DescribeLogDirsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeLogDirsRequests.
+
+
DescribeLogDirsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeLogDirsResponses.
+
+
DescribeProducersRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeProducersRequests.
+
+
DescribeProducersResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeProducersResponses.
+
+
DescribeQuorumRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeQuorumRequests.
+
+
DescribeQuorumResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeQuorumResponses.
+
+
DescribeShareGroupOffsetsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeShareGroupOffsetsRequests.
+
+
DescribeShareGroupOffsetsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeShareGroupOffsetsResponses.
+
+
DescribeTopicPartitionsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeTopicPartitionsRequests.
+
+
DescribeTopicPartitionsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeTopicPartitionsResponses.
+
+
DescribeTransactionsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeTransactionsRequests.
+
+
DescribeTransactionsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeTransactionsResponses.
+
+
DescribeUserScramCredentialsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeUserScramCredentialsRequests.
+
+
DescribeUserScramCredentialsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for DescribeUserScramCredentialsResponses.
+
+
deserialize(ByteBuffer) - Method in interface io.kroxylicious.kms.service.Serde
+
+
Deserialize an instance of T from the given buffer.
+
+
destroy() - Method in class io.kroxylicious.kms.service.DestroyableRawSecretKey
+
 
+
DestroyableRawSecretKey - Class in io.kroxylicious.kms.service
+
+
A SecretKey that has RAW encoding and can be destroyed + (unlike SecretKeySpec).
+
+
drop() - Method in interface io.kroxylicious.proxy.filter.FilterResult
+
+
signals the filter's wish that message is dropped i.e. not forwarded to the next filter + in the chain.
+
+
drop() - Method in interface io.kroxylicious.proxy.filter.FilterResultBuilder
+
+
Signals the filter's wish that the message is dropped i.e. not forwarded to the next filter + in the chain.
+
+
+

E

+
+
edek() - Method in record class io.kroxylicious.kms.service.DekPair
+
+
Returns the value of the edek record component.
+
+
edekSerde() - Method in interface io.kroxylicious.kms.service.Kms
+
+
Get a serializer for encrypted DEKs.
+
+
ElectLeadersRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ElectLeadersRequests.
+
+
ElectLeadersResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ElectLeadersResponses.
+
+
EMPTY - Static variable in interface io.kroxylicious.proxy.filter.metadata.TopicNameMapping
+
 
+
EndQuorumEpochRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for EndQuorumEpochRequests.
+
+
EndQuorumEpochResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for EndQuorumEpochResponses.
+
+
EndTxnRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for EndTxnRequests.
+
+
EndTxnResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for EndTxnResponses.
+
+
EnvelopeRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for EnvelopeRequests.
+
+
EnvelopeResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for EnvelopeResponses.
+
+
equals(Object) - Method in record class io.kroxylicious.authorizer.service.Action
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class io.kroxylicious.authorizer.service.AuthorizeResult
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class io.kroxylicious.kms.service.DekPair
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class io.kroxylicious.proxy.authentication.Subject
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class io.kroxylicious.proxy.authentication.User
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class io.kroxylicious.proxy.config.secret.FilePassword
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class io.kroxylicious.proxy.config.secret.InlinePassword
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class io.kroxylicious.proxy.config.tls.AllowDeny
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class io.kroxylicious.proxy.config.tls.InsecureTls
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class io.kroxylicious.proxy.config.tls.KeyPair
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class io.kroxylicious.proxy.config.tls.KeyStore
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class io.kroxylicious.proxy.config.tls.ServerOptions
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class io.kroxylicious.proxy.config.tls.Tls
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class io.kroxylicious.proxy.config.tls.TrustStore
+
+
Indicates whether some other object is "equal to" this one.
+
+
errorResponse(RequestHeaderData, ApiMessage, ApiException) - Method in interface io.kroxylicious.proxy.filter.RequestFilterResultBuilder
+
+
Generate a short-circuit error response towards the client.
+
+
ExpireDelegationTokenRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ExpireDelegationTokenRequests.
+
+
ExpireDelegationTokenResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ExpireDelegationTokenResponses.
+
+
+

F

+
+
failures() - Method in interface io.kroxylicious.proxy.filter.metadata.TopicNameMapping
+
+
Describes the reason for every failed mapping.
+
+
FetchRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for FetchRequests.
+
+
FetchResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for FetchResponses.
+
+
FetchSnapshotRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for FetchSnapshotRequests.
+
+
FetchSnapshotResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for FetchSnapshotResponses.
+
+
FilePassword - Record Class in io.kroxylicious.proxy.config.secret
+
+
A reference to the file containing a nonempty plain text password in UTF-8 encoding.
+
+
FilePassword(String) - Constructor for record class io.kroxylicious.proxy.config.secret.FilePassword
+
+
Creates an instance of a FilePassword record class.
+
+
Filter - Interface in io.kroxylicious.proxy.filter
+
+
Marker interface all Filter interfaces extend from
+
+
FilterContext - Interface in io.kroxylicious.proxy.filter
+
+
A context to allow filters to interact with other filters and the pipeline.
+
+
filterDispatchExecutor() - Method in interface io.kroxylicious.proxy.filter.FilterFactoryContext
+
+
An executor backed by the single Thread responsible for dispatching + work to a Filter instance for a channel.
+
+
FilterDispatchExecutor - Interface in io.kroxylicious.proxy.filter
+
+
An Executor backed by the Filter Dispatch Thread.
+
+
FilterFactory<C,I> - Interface in io.kroxylicious.proxy.filter
+
+
A pluggable source of Filter instances.
+
+
FilterFactoryContext - Interface in io.kroxylicious.proxy.filter
+
+
Construction context for Filters.
+
+
Filtering - Search tag in io.kroxylicious.proxy.filter.FilterContext.sendRequest(RequestHeaderData, ApiMessage)
+
Section
+
FilterResult - Interface in io.kroxylicious.proxy.filter
+
+
The result of a filter request or response operation that encapsulates the request or response + to be forwarded to the next filter in the chain.
+
+
FilterResultBuilder<H,R> - Interface in io.kroxylicious.proxy.filter
+
+
Fluent builder for filter results.
+
+
Filter Results - Search tag in package io.kroxylicious.proxy.filter
+
Section
+
FindCoordinatorRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for FindCoordinatorRequests.
+
+
FindCoordinatorResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for FindCoordinatorResponses.
+
+
forClient() - Method in record class io.kroxylicious.proxy.config.tls.ServerOptions
+
 
+
forClient() - Method in interface io.kroxylicious.proxy.config.tls.TrustOptions
+
 
+
forward(H, ApiMessage) - Method in interface io.kroxylicious.proxy.filter.FilterResultBuilder
+
+
A forward of a request or response message to the next filter in the chain.
+
+
forwardRequest(RequestHeaderData, ApiMessage) - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
Generates a completed filter results containing the given header and request.
+
+
forwardResponse(ResponseHeaderData, ApiMessage) - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
Generates a completed filter results containing the given header and response.
+
+
+

G

+
+
generateDekPair(K) - Method in interface io.kroxylicious.kms.service.Kms
+
+
Asynchronously generates a new Data Encryption Key (DEK) and returns it together with the same DEK wrapped by the Key Encryption Key (KEK) given + by the kekRef, + The returned encrypted DEK can later be decrypted with Kms.decryptEdek(Object).
+
+
getAlgorithm() - Method in class io.kroxylicious.kms.service.DestroyableRawSecretKey
+
 
+
getEncoded() - Method in class io.kroxylicious.kms.service.DestroyableRawSecretKey
+
+
Returns the RAW-encoded key.
+
+
getError() - Method in exception class io.kroxylicious.proxy.filter.metadata.TopicNameMappingException
+
 
+
getFormat() - Method in class io.kroxylicious.kms.service.DestroyableRawSecretKey
+
 
+
getProvidedPassword() - Method in record class io.kroxylicious.proxy.config.secret.FilePassword
+
 
+
getProvidedPassword() - Method in record class io.kroxylicious.proxy.config.secret.InlinePassword
+
 
+
getProvidedPassword() - Method in interface io.kroxylicious.proxy.config.secret.PasswordProvider
+
 
+
getStoreTypeOrPlatformDefault(String) - Static method in record class io.kroxylicious.proxy.config.tls.Tls
+
 
+
GetTelemetrySubscriptionsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for GetTelemetrySubscriptionsRequests.
+
+
GetTelemetrySubscriptionsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for GetTelemetrySubscriptionsResponses.
+
+
getType() - Method in record class io.kroxylicious.proxy.config.tls.KeyStore
+
 
+
getType() - Method in record class io.kroxylicious.proxy.config.tls.TrustStore
+
 
+
getUnsignedByte(ByteBuffer) - Static method in interface io.kroxylicious.kms.service.Serde
+
+
Read a single byte from the buffer's position and return it as a value in the range 0-255.
+
+
getVirtualClusterName() - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
Allows the filter to identify which cluster it is processing a request for
+
+
+

H

+
+
hashCode() - Method in record class io.kroxylicious.authorizer.service.Action
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class io.kroxylicious.authorizer.service.AuthorizeResult
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class io.kroxylicious.kms.service.DekPair
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class io.kroxylicious.proxy.authentication.Subject
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class io.kroxylicious.proxy.authentication.User
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class io.kroxylicious.proxy.config.secret.FilePassword
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class io.kroxylicious.proxy.config.secret.InlinePassword
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class io.kroxylicious.proxy.config.tls.AllowDeny
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class io.kroxylicious.proxy.config.tls.InsecureTls
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class io.kroxylicious.proxy.config.tls.KeyPair
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class io.kroxylicious.proxy.config.tls.KeyStore
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class io.kroxylicious.proxy.config.tls.ServerOptions
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class io.kroxylicious.proxy.config.tls.Tls
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class io.kroxylicious.proxy.config.tls.TrustStore
+
+
Returns a hash code value for this object.
+
+
header() - Method in interface io.kroxylicious.proxy.filter.FilterResult
+
+
the header to be forwarded to the next filter in the chain.
+
+
Header - Search tag in io.kroxylicious.proxy.filter.FilterContext.sendRequest(RequestHeaderData, ApiMessage)
+
Section
+
HeartbeatRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for HeartbeatRequests.
+
+
HeartbeatResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for HeartbeatResponses.
+
+
+

I

+
+
Implementing a plugin - Search tag in package io.kroxylicious.proxy.plugin
+
Section
+
Implementing Filters - Search tag in package io.kroxylicious.proxy.filter
+
Section
+
implies() - Method in interface io.kroxylicious.authorizer.service.ResourceType
+
+
Returns a set of operations that are implied by this operation.
+
+
implNameProperty() - Element in annotation interface io.kroxylicious.proxy.plugin.PluginImplConfig
+
 
+
Important facts about the Kafka protocol - Search tag in package io.kroxylicious.proxy.filter
+
Section
+
IncrementalAlterConfigsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for IncrementalAlterConfigsRequests.
+
+
IncrementalAlterConfigsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for IncrementalAlterConfigsResponses.
+
+
initialize(C) - Method in interface io.kroxylicious.authorizer.service.AuthorizerService
+
+
Initialises the service.
+
+
initialize(C) - Method in interface io.kroxylicious.kms.service.KmsService
+
+
Initialises the service.
+
+
initialize(C) - Method in interface io.kroxylicious.proxy.authentication.SaslSubjectBuilderService
+
 
+
initialize(C) - Method in interface io.kroxylicious.proxy.authentication.TransportSubjectBuilderService
+
 
+
initialize(FilterFactoryContext, C) - Method in interface io.kroxylicious.proxy.filter.FilterFactory
+
+
Initializes the factory with the specified configuration.
+
+
InitializeShareGroupStateRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for InitializeShareGroupStateRequests.
+
+
InitializeShareGroupStateResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for InitializeShareGroupStateResponses.
+
+
InitProducerIdRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for InitProducerIdRequests.
+
+
InitProducerIdResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for InitProducerIdResponses.
+
+
InlinePassword - Record Class in io.kroxylicious.proxy.config.secret
+
+
A password expressed directly in the model, in plain text.
+
+
InlinePassword(String) - Constructor for record class io.kroxylicious.proxy.config.secret.InlinePassword
+
+
Creates an instance of a InlinePassword record class.
+
+
insecure() - Method in record class io.kroxylicious.proxy.config.tls.InsecureTls
+
+
Returns the value of the insecure record component.
+
+
InsecureTls - Record Class in io.kroxylicious.proxy.config.tls
+
+
A TrustProvider that allows the disabling trust verification.
+
+
InsecureTls(boolean) - Constructor for record class io.kroxylicious.proxy.config.tls.InsecureTls
+
+
Creates an instance of a InsecureTls record class.
+
+
INSTANCE - Static variable in class io.kroxylicious.proxy.config.tls.PlatformTrustProvider
+
 
+
InvalidKeyUsageException - Exception Class in io.kroxylicious.kms.service
+
+
Thrown when a KMS-managed key is passed to an operation that is incompatible with its allowed key usage.
+
+
InvalidKeyUsageException() - Constructor for exception class io.kroxylicious.kms.service.InvalidKeyUsageException
+
+
Initializes a new instance.
+
+
io.kroxylicious.authorizer.service - package io.kroxylicious.authorizer.service
+
+
An abstract API for making access control decisions about Subjects + wanting to perform Actions.
+
+
io.kroxylicious.kms.service - package io.kroxylicious.kms.service
+
+
Abstracts Key Management System (KMS) operations necessary for the envelope encryption pattern using Data Encryption Keys (DEKs) and Key Encryption Keys (KEKs).
+
+
io.kroxylicious.proxy.authentication - package io.kroxylicious.proxy.authentication
+
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+
io.kroxylicious.proxy.config.secret - package io.kroxylicious.proxy.config.secret
+
+
Abstraction for providing passwords to proxy configuration.
+
+
io.kroxylicious.proxy.config.tls - package io.kroxylicious.proxy.config.tls
+
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
io.kroxylicious.proxy.filter - package io.kroxylicious.proxy.filter
+
+
The protocol filter API.
+
+
io.kroxylicious.proxy.filter.filterresultbuilder - package io.kroxylicious.proxy.filter.filterresultbuilder
+
+
Builder API for constructing filter results.
+
+
io.kroxylicious.proxy.filter.metadata - package io.kroxylicious.proxy.filter.metadata
+
+
APIs for resolving topic IDs to topic names and handling metadata-related errors.
+
+
io.kroxylicious.proxy.plugin - package io.kroxylicious.proxy.plugin
+
+
API for defining plugins within configuration.
+
+
io.kroxylicious.proxy.tls - package io.kroxylicious.proxy.tls
+
+
APIs for plugins that are exposed to details of TLS connections between the proxy and its network peers.
+
+
isAnonymous() - Method in record class io.kroxylicious.proxy.authentication.Subject
+
 
+
isDestroyed() - Method in class io.kroxylicious.kms.service.DestroyableRawSecretKey
+
 
+
isInFilterDispatchThread() - Method in interface io.kroxylicious.proxy.filter.FilterDispatchExecutor
+
 
+
isPemType() - Method in record class io.kroxylicious.proxy.config.tls.KeyStore
+
 
+
isPemType() - Method in record class io.kroxylicious.proxy.config.tls.TrustStore
+
 
+
+

J

+
+
JoinGroupRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for JoinGroupRequests.
+
+
JoinGroupResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for JoinGroupResponses.
+
+
+

K

+
+
key() - Method in record class io.kroxylicious.proxy.config.tls.Tls
+
+
Returns the value of the key record component.
+
+
KeyPair - Record Class in io.kroxylicious.proxy.config.tls
+
+
A KeyProvider backed by a private-key/certificate pair expressed in PEM format.
+
+
KeyPair(String, String, PasswordProvider) - Constructor for record class io.kroxylicious.proxy.config.tls.KeyPair
+
+
Creates an instance of a KeyPair record class.
+
+
keyPasswordProvider() - Method in record class io.kroxylicious.proxy.config.tls.KeyPair
+
+
Returns the value of the keyPasswordProvider record component.
+
+
keyPasswordProvider() - Method in record class io.kroxylicious.proxy.config.tls.KeyStore
+
+
Returns the value of the keyPasswordProvider record component.
+
+
KeyProvider - Interface in io.kroxylicious.proxy.config.tls
+
+
A KeyProvider is a source of a TLS private-key/certificate pair and optionally intermediate certificate(s).
+
+
KeyProviderVisitor<T> - Interface in io.kroxylicious.proxy.config.tls
+
+
Visitor for implementations of KeyProvider
+
+
KeyStore - Record Class in io.kroxylicious.proxy.config.tls
+
+
A KeyProvider backed by a Java Truststore.
+
+
KeyStore(String, PasswordProvider, PasswordProvider, String) - Constructor for record class io.kroxylicious.proxy.config.tls.KeyStore
+
+
Creates an instance of a KeyStore record class.
+
+
Kms<K,E> - Interface in io.kroxylicious.kms.service
+
+
Abstracts the KMS operations needed for Envelope Encryption
+
+
KmsException - Exception Class in io.kroxylicious.kms.service
+
+
Represents problems interacting with a Key Management System.
+
+
KmsException() - Constructor for exception class io.kroxylicious.kms.service.KmsException
+
 
+
KmsException(String) - Constructor for exception class io.kroxylicious.kms.service.KmsException
+
 
+
KmsException(String, Throwable) - Constructor for exception class io.kroxylicious.kms.service.KmsException
+
 
+
KmsException(Throwable) - Constructor for exception class io.kroxylicious.kms.service.KmsException
+
 
+
KmsService<C,K,E> - Interface in io.kroxylicious.kms.service
+
+
Service interface for KMSs
+
+
+

L

+
+
LeaveGroupRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for LeaveGroupRequests.
+
+
LeaveGroupResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for LeaveGroupResponses.
+
+
ListConfigResourcesRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ListConfigResourcesRequests.
+
+
ListConfigResourcesResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ListConfigResourcesResponses.
+
+
ListGroupsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ListGroupsRequests.
+
+
ListGroupsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ListGroupsResponses.
+
+
ListOffsetsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ListOffsetsRequests.
+
+
ListOffsetsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ListOffsetsResponses.
+
+
ListPartitionReassignmentsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ListPartitionReassignmentsRequests.
+
+
ListPartitionReassignmentsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ListPartitionReassignmentsResponses.
+
+
ListTransactionsRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ListTransactionsRequests.
+
+
ListTransactionsResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ListTransactionsResponses.
+
+
Local view - Search tag in package io.kroxylicious.proxy.filter
+
Section
+
+

M

+
+
mechanismName() - Method in interface io.kroxylicious.proxy.authentication.ClientSaslContext
+
+
The name of the SASL mechanism used.
+
+
message() - Method in interface io.kroxylicious.proxy.filter.FilterResult
+
+
the message to be forwarded to the next filter in the chain.
+
+
MetadataRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for MetadataRequests.
+
+
MetadataResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for MetadataResponses.
+
+
+

N

+
+
name() - Method in interface io.kroxylicious.proxy.authentication.Principal
+
 
+
name() - Method in record class io.kroxylicious.proxy.authentication.User
+
+
Returns the value of the name record component.
+
+
newPrincipal(String) - Method in interface io.kroxylicious.proxy.authentication.PrincipalFactory
+
 
+
newPrincipal(String) - Method in class io.kroxylicious.proxy.authentication.UserFactory
+
 
+
NONE - Enum constant in enum class io.kroxylicious.proxy.config.tls.TlsClientAuth
+
 
+
numKeyBits() - Method in class io.kroxylicious.kms.service.DestroyableRawSecretKey
+
 
+
+

O

+
+
OffsetCommitRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for OffsetCommitRequests.
+
+
OffsetCommitResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for OffsetCommitResponses.
+
+
OffsetDeleteRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for OffsetDeleteRequests.
+
+
OffsetDeleteResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for OffsetDeleteResponses.
+
+
OffsetFetchRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for OffsetFetchRequests.
+
+
OffsetFetchResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for OffsetFetchResponses.
+
+
OffsetForLeaderEpochRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for OffsetForLeaderEpochRequests.
+
+
OffsetForLeaderEpochResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for OffsetForLeaderEpochResponses.
+
+
oldName() - Element in annotation interface io.kroxylicious.proxy.plugin.DeprecatedPluginName
+
+
The fully qualified class name by which this plugin was previously known.
+
+
onAddOffsetsToTxnRequest(short, RequestHeaderData, AddOffsetsToTxnRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AddOffsetsToTxnRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onAddOffsetsToTxnResponse(short, ResponseHeaderData, AddOffsetsToTxnResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AddOffsetsToTxnResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onAddPartitionsToTxnRequest(short, RequestHeaderData, AddPartitionsToTxnRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AddPartitionsToTxnRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onAddPartitionsToTxnResponse(short, ResponseHeaderData, AddPartitionsToTxnResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AddPartitionsToTxnResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onAddRaftVoterRequest(short, RequestHeaderData, AddRaftVoterRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AddRaftVoterRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onAddRaftVoterResponse(short, ResponseHeaderData, AddRaftVoterResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AddRaftVoterResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onAllocateProducerIdsRequest(short, RequestHeaderData, AllocateProducerIdsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AllocateProducerIdsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onAllocateProducerIdsResponse(short, ResponseHeaderData, AllocateProducerIdsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AllocateProducerIdsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onAlterClientQuotasRequest(short, RequestHeaderData, AlterClientQuotasRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AlterClientQuotasRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onAlterClientQuotasResponse(short, ResponseHeaderData, AlterClientQuotasResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AlterClientQuotasResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onAlterConfigsRequest(short, RequestHeaderData, AlterConfigsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AlterConfigsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onAlterConfigsResponse(short, ResponseHeaderData, AlterConfigsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AlterConfigsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onAlterPartitionReassignmentsRequest(short, RequestHeaderData, AlterPartitionReassignmentsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AlterPartitionReassignmentsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onAlterPartitionReassignmentsResponse(short, ResponseHeaderData, AlterPartitionReassignmentsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AlterPartitionReassignmentsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onAlterPartitionRequest(short, RequestHeaderData, AlterPartitionRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AlterPartitionRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onAlterPartitionResponse(short, ResponseHeaderData, AlterPartitionResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AlterPartitionResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onAlterReplicaLogDirsRequest(short, RequestHeaderData, AlterReplicaLogDirsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AlterReplicaLogDirsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onAlterReplicaLogDirsResponse(short, ResponseHeaderData, AlterReplicaLogDirsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AlterReplicaLogDirsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onAlterShareGroupOffsetsRequest(short, RequestHeaderData, AlterShareGroupOffsetsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AlterShareGroupOffsetsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onAlterShareGroupOffsetsResponse(short, ResponseHeaderData, AlterShareGroupOffsetsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AlterShareGroupOffsetsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onAlterUserScramCredentialsRequest(short, RequestHeaderData, AlterUserScramCredentialsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AlterUserScramCredentialsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onAlterUserScramCredentialsResponse(short, ResponseHeaderData, AlterUserScramCredentialsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AlterUserScramCredentialsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onApiVersionsRequest(short, RequestHeaderData, ApiVersionsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ApiVersionsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onApiVersionsResponse(short, ResponseHeaderData, ApiVersionsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ApiVersionsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onAssignReplicasToDirsRequest(short, RequestHeaderData, AssignReplicasToDirsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AssignReplicasToDirsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onAssignReplicasToDirsResponse(short, ResponseHeaderData, AssignReplicasToDirsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.AssignReplicasToDirsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onBeginQuorumEpochRequest(short, RequestHeaderData, BeginQuorumEpochRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.BeginQuorumEpochRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onBeginQuorumEpochResponse(short, ResponseHeaderData, BeginQuorumEpochResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.BeginQuorumEpochResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onBrokerHeartbeatRequest(short, RequestHeaderData, BrokerHeartbeatRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.BrokerHeartbeatRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onBrokerHeartbeatResponse(short, ResponseHeaderData, BrokerHeartbeatResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.BrokerHeartbeatResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onBrokerRegistrationRequest(short, RequestHeaderData, BrokerRegistrationRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.BrokerRegistrationRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onBrokerRegistrationResponse(short, ResponseHeaderData, BrokerRegistrationResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.BrokerRegistrationResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onConsumerGroupDescribeRequest(short, RequestHeaderData, ConsumerGroupDescribeRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ConsumerGroupDescribeRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onConsumerGroupDescribeResponse(short, ResponseHeaderData, ConsumerGroupDescribeResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ConsumerGroupDescribeResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onConsumerGroupHeartbeatRequest(short, RequestHeaderData, ConsumerGroupHeartbeatRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ConsumerGroupHeartbeatRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onConsumerGroupHeartbeatResponse(short, ResponseHeaderData, ConsumerGroupHeartbeatResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ConsumerGroupHeartbeatResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onControllerRegistrationRequest(short, RequestHeaderData, ControllerRegistrationRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ControllerRegistrationRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onControllerRegistrationResponse(short, ResponseHeaderData, ControllerRegistrationResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ControllerRegistrationResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onCreateAclsRequest(short, RequestHeaderData, CreateAclsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.CreateAclsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onCreateAclsResponse(short, ResponseHeaderData, CreateAclsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.CreateAclsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onCreateDelegationTokenRequest(short, RequestHeaderData, CreateDelegationTokenRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.CreateDelegationTokenRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onCreateDelegationTokenResponse(short, ResponseHeaderData, CreateDelegationTokenResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.CreateDelegationTokenResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onCreatePartitionsRequest(short, RequestHeaderData, CreatePartitionsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.CreatePartitionsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onCreatePartitionsResponse(short, ResponseHeaderData, CreatePartitionsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.CreatePartitionsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onCreateTopicsRequest(short, RequestHeaderData, CreateTopicsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.CreateTopicsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onCreateTopicsResponse(short, ResponseHeaderData, CreateTopicsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.CreateTopicsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDeleteAclsRequest(short, RequestHeaderData, DeleteAclsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DeleteAclsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDeleteAclsResponse(short, ResponseHeaderData, DeleteAclsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DeleteAclsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDeleteGroupsRequest(short, RequestHeaderData, DeleteGroupsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DeleteGroupsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDeleteGroupsResponse(short, ResponseHeaderData, DeleteGroupsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DeleteGroupsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDeleteRecordsRequest(short, RequestHeaderData, DeleteRecordsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DeleteRecordsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDeleteRecordsResponse(short, ResponseHeaderData, DeleteRecordsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DeleteRecordsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDeleteShareGroupOffsetsRequest(short, RequestHeaderData, DeleteShareGroupOffsetsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DeleteShareGroupOffsetsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDeleteShareGroupOffsetsResponse(short, ResponseHeaderData, DeleteShareGroupOffsetsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DeleteShareGroupOffsetsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDeleteShareGroupStateRequest(short, RequestHeaderData, DeleteShareGroupStateRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DeleteShareGroupStateRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDeleteShareGroupStateResponse(short, ResponseHeaderData, DeleteShareGroupStateResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DeleteShareGroupStateResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDeleteTopicsRequest(short, RequestHeaderData, DeleteTopicsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DeleteTopicsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDeleteTopicsResponse(short, ResponseHeaderData, DeleteTopicsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DeleteTopicsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDescribeAclsRequest(short, RequestHeaderData, DescribeAclsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeAclsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDescribeAclsResponse(short, ResponseHeaderData, DescribeAclsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeAclsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDescribeClientQuotasRequest(short, RequestHeaderData, DescribeClientQuotasRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeClientQuotasRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDescribeClientQuotasResponse(short, ResponseHeaderData, DescribeClientQuotasResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeClientQuotasResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDescribeClusterRequest(short, RequestHeaderData, DescribeClusterRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeClusterRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDescribeClusterResponse(short, ResponseHeaderData, DescribeClusterResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeClusterResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDescribeConfigsRequest(short, RequestHeaderData, DescribeConfigsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeConfigsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDescribeConfigsResponse(short, ResponseHeaderData, DescribeConfigsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeConfigsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDescribeDelegationTokenRequest(short, RequestHeaderData, DescribeDelegationTokenRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeDelegationTokenRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDescribeDelegationTokenResponse(short, ResponseHeaderData, DescribeDelegationTokenResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeDelegationTokenResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDescribeGroupsRequest(short, RequestHeaderData, DescribeGroupsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeGroupsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDescribeGroupsResponse(short, ResponseHeaderData, DescribeGroupsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeGroupsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDescribeLogDirsRequest(short, RequestHeaderData, DescribeLogDirsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeLogDirsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDescribeLogDirsResponse(short, ResponseHeaderData, DescribeLogDirsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeLogDirsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDescribeProducersRequest(short, RequestHeaderData, DescribeProducersRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeProducersRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDescribeProducersResponse(short, ResponseHeaderData, DescribeProducersResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeProducersResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDescribeQuorumRequest(short, RequestHeaderData, DescribeQuorumRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeQuorumRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDescribeQuorumResponse(short, ResponseHeaderData, DescribeQuorumResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeQuorumResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDescribeShareGroupOffsetsRequest(short, RequestHeaderData, DescribeShareGroupOffsetsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeShareGroupOffsetsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDescribeShareGroupOffsetsResponse(short, ResponseHeaderData, DescribeShareGroupOffsetsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeShareGroupOffsetsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDescribeTopicPartitionsRequest(short, RequestHeaderData, DescribeTopicPartitionsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeTopicPartitionsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDescribeTopicPartitionsResponse(short, ResponseHeaderData, DescribeTopicPartitionsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeTopicPartitionsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDescribeTransactionsRequest(short, RequestHeaderData, DescribeTransactionsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeTransactionsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDescribeTransactionsResponse(short, ResponseHeaderData, DescribeTransactionsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeTransactionsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onDescribeUserScramCredentialsRequest(short, RequestHeaderData, DescribeUserScramCredentialsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeUserScramCredentialsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onDescribeUserScramCredentialsResponse(short, ResponseHeaderData, DescribeUserScramCredentialsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.DescribeUserScramCredentialsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onElectLeadersRequest(short, RequestHeaderData, ElectLeadersRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ElectLeadersRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onElectLeadersResponse(short, ResponseHeaderData, ElectLeadersResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ElectLeadersResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onEndQuorumEpochRequest(short, RequestHeaderData, EndQuorumEpochRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.EndQuorumEpochRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onEndQuorumEpochResponse(short, ResponseHeaderData, EndQuorumEpochResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.EndQuorumEpochResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onEndTxnRequest(short, RequestHeaderData, EndTxnRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.EndTxnRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onEndTxnResponse(short, ResponseHeaderData, EndTxnResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.EndTxnResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onEnvelopeRequest(short, RequestHeaderData, EnvelopeRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.EnvelopeRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onEnvelopeResponse(short, ResponseHeaderData, EnvelopeResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.EnvelopeResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onExpireDelegationTokenRequest(short, RequestHeaderData, ExpireDelegationTokenRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ExpireDelegationTokenRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onExpireDelegationTokenResponse(short, ResponseHeaderData, ExpireDelegationTokenResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ExpireDelegationTokenResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onFetchRequest(short, RequestHeaderData, FetchRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.FetchRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onFetchResponse(short, ResponseHeaderData, FetchResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.FetchResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onFetchSnapshotRequest(short, RequestHeaderData, FetchSnapshotRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.FetchSnapshotRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onFetchSnapshotResponse(short, ResponseHeaderData, FetchSnapshotResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.FetchSnapshotResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onFindCoordinatorRequest(short, RequestHeaderData, FindCoordinatorRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.FindCoordinatorRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onFindCoordinatorResponse(short, ResponseHeaderData, FindCoordinatorResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.FindCoordinatorResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onGetTelemetrySubscriptionsRequest(short, RequestHeaderData, GetTelemetrySubscriptionsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.GetTelemetrySubscriptionsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onGetTelemetrySubscriptionsResponse(short, ResponseHeaderData, GetTelemetrySubscriptionsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.GetTelemetrySubscriptionsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onHeartbeatRequest(short, RequestHeaderData, HeartbeatRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.HeartbeatRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onHeartbeatResponse(short, ResponseHeaderData, HeartbeatResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.HeartbeatResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onIncrementalAlterConfigsRequest(short, RequestHeaderData, IncrementalAlterConfigsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.IncrementalAlterConfigsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onIncrementalAlterConfigsResponse(short, ResponseHeaderData, IncrementalAlterConfigsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.IncrementalAlterConfigsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onInitializeShareGroupStateRequest(short, RequestHeaderData, InitializeShareGroupStateRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.InitializeShareGroupStateRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onInitializeShareGroupStateResponse(short, ResponseHeaderData, InitializeShareGroupStateResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.InitializeShareGroupStateResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onInitProducerIdRequest(short, RequestHeaderData, InitProducerIdRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.InitProducerIdRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onInitProducerIdResponse(short, ResponseHeaderData, InitProducerIdResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.InitProducerIdResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onJoinGroupRequest(short, RequestHeaderData, JoinGroupRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.JoinGroupRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onJoinGroupResponse(short, ResponseHeaderData, JoinGroupResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.JoinGroupResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onLeaveGroupRequest(short, RequestHeaderData, LeaveGroupRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.LeaveGroupRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onLeaveGroupResponse(short, ResponseHeaderData, LeaveGroupResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.LeaveGroupResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onListConfigResourcesRequest(short, RequestHeaderData, ListConfigResourcesRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ListConfigResourcesRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onListConfigResourcesResponse(short, ResponseHeaderData, ListConfigResourcesResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ListConfigResourcesResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onListGroupsRequest(short, RequestHeaderData, ListGroupsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ListGroupsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onListGroupsResponse(short, ResponseHeaderData, ListGroupsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ListGroupsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onListOffsetsRequest(short, RequestHeaderData, ListOffsetsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ListOffsetsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onListOffsetsResponse(short, ResponseHeaderData, ListOffsetsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ListOffsetsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onListPartitionReassignmentsRequest(short, RequestHeaderData, ListPartitionReassignmentsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ListPartitionReassignmentsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onListPartitionReassignmentsResponse(short, ResponseHeaderData, ListPartitionReassignmentsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ListPartitionReassignmentsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onListTransactionsRequest(short, RequestHeaderData, ListTransactionsRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ListTransactionsRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onListTransactionsResponse(short, ResponseHeaderData, ListTransactionsResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ListTransactionsResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onMetadataRequest(short, RequestHeaderData, MetadataRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.MetadataRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onMetadataResponse(short, ResponseHeaderData, MetadataResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.MetadataResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onOffsetCommitRequest(short, RequestHeaderData, OffsetCommitRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.OffsetCommitRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onOffsetCommitResponse(short, ResponseHeaderData, OffsetCommitResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.OffsetCommitResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onOffsetDeleteRequest(short, RequestHeaderData, OffsetDeleteRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.OffsetDeleteRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onOffsetDeleteResponse(short, ResponseHeaderData, OffsetDeleteResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.OffsetDeleteResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onOffsetFetchRequest(short, RequestHeaderData, OffsetFetchRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.OffsetFetchRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onOffsetFetchResponse(short, ResponseHeaderData, OffsetFetchResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.OffsetFetchResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onOffsetForLeaderEpochRequest(short, RequestHeaderData, OffsetForLeaderEpochRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.OffsetForLeaderEpochRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onOffsetForLeaderEpochResponse(short, ResponseHeaderData, OffsetForLeaderEpochResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.OffsetForLeaderEpochResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onProduceRequest(short, RequestHeaderData, ProduceRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ProduceRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onProduceResponse(short, ResponseHeaderData, ProduceResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ProduceResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onPushTelemetryRequest(short, RequestHeaderData, PushTelemetryRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.PushTelemetryRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onPushTelemetryResponse(short, ResponseHeaderData, PushTelemetryResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.PushTelemetryResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onReadShareGroupStateRequest(short, RequestHeaderData, ReadShareGroupStateRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ReadShareGroupStateRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onReadShareGroupStateResponse(short, ResponseHeaderData, ReadShareGroupStateResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ReadShareGroupStateResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onReadShareGroupStateSummaryRequest(short, RequestHeaderData, ReadShareGroupStateSummaryRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ReadShareGroupStateSummaryRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onReadShareGroupStateSummaryResponse(short, ResponseHeaderData, ReadShareGroupStateSummaryResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ReadShareGroupStateSummaryResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onRemoveRaftVoterRequest(short, RequestHeaderData, RemoveRaftVoterRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.RemoveRaftVoterRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onRemoveRaftVoterResponse(short, ResponseHeaderData, RemoveRaftVoterResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.RemoveRaftVoterResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onRenewDelegationTokenRequest(short, RequestHeaderData, RenewDelegationTokenRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.RenewDelegationTokenRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onRenewDelegationTokenResponse(short, ResponseHeaderData, RenewDelegationTokenResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.RenewDelegationTokenResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onRequest(ApiKeys, short, RequestHeaderData, ApiMessage, FilterContext) - Method in interface io.kroxylicious.proxy.filter.RequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onRequest(ApiKeys, RequestHeaderData, ApiMessage, FilterContext) - Method in interface io.kroxylicious.proxy.filter.RequestFilter
+
+
Deprecated, for removal: This API element is subject to removal in a future version. + +
+
+
onResponse(ApiKeys, short, ResponseHeaderData, ApiMessage, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onResponse(ApiKeys, ResponseHeaderData, ApiMessage, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ResponseFilter
+
+
Deprecated, for removal: This API element is subject to removal in a future version. + +
+
+
onSaslAuthenticateRequest(short, RequestHeaderData, SaslAuthenticateRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.SaslAuthenticateRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onSaslAuthenticateResponse(short, ResponseHeaderData, SaslAuthenticateResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.SaslAuthenticateResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onSaslHandshakeRequest(short, RequestHeaderData, SaslHandshakeRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.SaslHandshakeRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onSaslHandshakeResponse(short, ResponseHeaderData, SaslHandshakeResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.SaslHandshakeResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onShareAcknowledgeRequest(short, RequestHeaderData, ShareAcknowledgeRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ShareAcknowledgeRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onShareAcknowledgeResponse(short, ResponseHeaderData, ShareAcknowledgeResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ShareAcknowledgeResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onShareFetchRequest(short, RequestHeaderData, ShareFetchRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ShareFetchRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onShareFetchResponse(short, ResponseHeaderData, ShareFetchResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ShareFetchResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onShareGroupDescribeRequest(short, RequestHeaderData, ShareGroupDescribeRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ShareGroupDescribeRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onShareGroupDescribeResponse(short, ResponseHeaderData, ShareGroupDescribeResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ShareGroupDescribeResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onShareGroupHeartbeatRequest(short, RequestHeaderData, ShareGroupHeartbeatRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ShareGroupHeartbeatRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onShareGroupHeartbeatResponse(short, ResponseHeaderData, ShareGroupHeartbeatResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.ShareGroupHeartbeatResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onStreamsGroupDescribeRequest(short, RequestHeaderData, StreamsGroupDescribeRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.StreamsGroupDescribeRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onStreamsGroupDescribeResponse(short, ResponseHeaderData, StreamsGroupDescribeResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.StreamsGroupDescribeResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onStreamsGroupHeartbeatRequest(short, RequestHeaderData, StreamsGroupHeartbeatRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.StreamsGroupHeartbeatRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onStreamsGroupHeartbeatResponse(short, ResponseHeaderData, StreamsGroupHeartbeatResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.StreamsGroupHeartbeatResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onSyncGroupRequest(short, RequestHeaderData, SyncGroupRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.SyncGroupRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onSyncGroupResponse(short, ResponseHeaderData, SyncGroupResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.SyncGroupResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onTxnOffsetCommitRequest(short, RequestHeaderData, TxnOffsetCommitRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.TxnOffsetCommitRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onTxnOffsetCommitResponse(short, ResponseHeaderData, TxnOffsetCommitResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.TxnOffsetCommitResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onUnregisterBrokerRequest(short, RequestHeaderData, UnregisterBrokerRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.UnregisterBrokerRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onUnregisterBrokerResponse(short, ResponseHeaderData, UnregisterBrokerResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.UnregisterBrokerResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onUpdateFeaturesRequest(short, RequestHeaderData, UpdateFeaturesRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.UpdateFeaturesRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onUpdateFeaturesResponse(short, ResponseHeaderData, UpdateFeaturesResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.UpdateFeaturesResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onUpdateRaftVoterRequest(short, RequestHeaderData, UpdateRaftVoterRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.UpdateRaftVoterRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onUpdateRaftVoterResponse(short, ResponseHeaderData, UpdateRaftVoterResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.UpdateRaftVoterResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onVoteRequest(short, RequestHeaderData, VoteRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.VoteRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onVoteResponse(short, ResponseHeaderData, VoteResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.VoteResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onWriteShareGroupStateRequest(short, RequestHeaderData, WriteShareGroupStateRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.WriteShareGroupStateRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onWriteShareGroupStateResponse(short, ResponseHeaderData, WriteShareGroupStateResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.WriteShareGroupStateResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
onWriteTxnMarkersRequest(short, RequestHeaderData, WriteTxnMarkersRequestData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.WriteTxnMarkersRequestFilter
+
+
Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
+
+
onWriteTxnMarkersResponse(short, ResponseHeaderData, WriteTxnMarkersResponseData, FilterContext) - Method in interface io.kroxylicious.proxy.filter.WriteTxnMarkersResponseFilter
+
+
Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
+
+
operation() - Method in record class io.kroxylicious.authorizer.service.Action
+
+
Returns the value of the operation record component.
+
+
Ordering - Search tag in package io.kroxylicious.proxy.filter
+
Section
+
+

P

+
+
partition(Collection<T>, ResourceType<?>, Function<T, String>) - Method in record class io.kroxylicious.authorizer.service.AuthorizeResult
+
+
Partitions the given items, whose names can be obtained via the given toName function, into two lists + based on whether the AuthorizeResult.subject() is allowed to perform the given operation on them.
+
+
password() - Method in record class io.kroxylicious.proxy.config.secret.InlinePassword
+
+
Returns the value of the password record component.
+
+
passwordFile() - Method in record class io.kroxylicious.proxy.config.secret.FilePassword
+
+
Returns the value of the passwordFile record component.
+
+
PasswordProvider - Interface in io.kroxylicious.proxy.config.secret
+
+
A PasswordProvider is an abstract source of a password.
+
+
PEM - Static variable in record class io.kroxylicious.proxy.config.tls.Tls
+
 
+
Pipelining - Search tag in package io.kroxylicious.proxy.filter
+
Section
+
PlatformTrustProvider - Class in io.kroxylicious.proxy.config.tls
+
 
+
Plugin - Annotation Interface in io.kroxylicious.proxy.plugin
+
+
An annotation, on a plugin implementation class, that identifies the class of "config record" + consumed by that implementation.
+
+
PluginConfigurationException - Exception Class in io.kroxylicious.proxy.plugin
+
+
Thrown when a plugin configuration is invalid
+
+
PluginConfigurationException(String) - Constructor for exception class io.kroxylicious.proxy.plugin.PluginConfigurationException
+
+
Initializes a new instance
+
+
PluginConfigurationException(String, Throwable) - Constructor for exception class io.kroxylicious.proxy.plugin.PluginConfigurationException
+
+
Initializes a new instance
+
+
PluginImplConfig - Annotation Interface in io.kroxylicious.proxy.plugin
+
+
An annotation that identifies a plugin instance name at a plugin point within the configuration.
+
+
pluginImplementationNames(Class<P>) - Method in interface io.kroxylicious.proxy.filter.FilterFactoryContext
+
+
Returns the implementation names of the registered instances of this plugin.
+
+
PluginImplName - Annotation Interface in io.kroxylicious.proxy.plugin
+
+
Annotates a property (within a "config record") that names a plugin implementation with the plugin interface.
+
+
pluginInstance(Class<P>, String) - Method in interface io.kroxylicious.proxy.filter.FilterFactoryContext
+
+
Gets a plugin instance for the given plugin type and name
+
+
Plugins - Class in io.kroxylicious.proxy.plugin
+
 
+
Principal - Interface in io.kroxylicious.proxy.authentication
+
+
An identifier held by a Subject.
+
+
PrincipalFactory<P> - Interface in io.kroxylicious.proxy.authentication
+
 
+
principals() - Method in record class io.kroxylicious.proxy.authentication.Subject
+
+
Returns the value of the principals record component.
+
+
privateKeyFile() - Method in record class io.kroxylicious.proxy.config.tls.KeyPair
+
+
Returns the value of the privateKeyFile record component.
+
+
ProduceRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ProduceRequests.
+
+
ProduceResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ProduceResponses.
+
+
protocols() - Method in record class io.kroxylicious.proxy.config.tls.Tls
+
+
Returns the value of the protocols record component.
+
+
proxyServerCertificate() - Method in interface io.kroxylicious.proxy.tls.ClientTlsContext
+
 
+
PushTelemetryRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for PushTelemetryRequests.
+
+
PushTelemetryResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for PushTelemetryResponses.
+
+
putUnsignedByte(ByteBuffer, int) - Static method in interface io.kroxylicious.kms.service.Serde
+
+
Write a value in the range 0-255 as a single byte at the buffer's current Buffer.position().
+
+
+

R

+
+
ReadShareGroupStateRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ReadShareGroupStateRequests.
+
+
ReadShareGroupStateResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ReadShareGroupStateResponses.
+
+
ReadShareGroupStateSummaryRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ReadShareGroupStateSummaryRequests.
+
+
ReadShareGroupStateSummaryResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ReadShareGroupStateSummaryResponses.
+
+
RemoveRaftVoterRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for RemoveRaftVoterRequests.
+
+
RemoveRaftVoterResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for RemoveRaftVoterResponses.
+
+
RenewDelegationTokenRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for RenewDelegationTokenRequests.
+
+
RenewDelegationTokenResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for RenewDelegationTokenResponses.
+
+
REQUESTED - Enum constant in enum class io.kroxylicious.proxy.config.tls.TlsClientAuth
+
 
+
RequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A Filter that handles all request types, for example to modify the request headers.
+
+
RequestFilterResult - Interface in io.kroxylicious.proxy.filter
+
+
A specialization of the FilterResult for request filters.
+
+
requestFilterResultBuilder() - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
Creates a builder for a request filter result objects.
+
+
RequestFilterResultBuilder - Interface in io.kroxylicious.proxy.filter
+
+
Builder for request filter results.
+
+
requireConfig(Object, C) - Static method in class io.kroxylicious.proxy.plugin.Plugins
+
+
Checks that the given config is not null, throwing PluginConfigurationException if it is.
+
+
REQUIRED - Enum constant in enum class io.kroxylicious.proxy.config.tls.TlsClientAuth
+
 
+
resolveAlias(String) - Method in interface io.kroxylicious.kms.service.Kms
+
+
Asynchronously resolve an alias to a key id
+
+
resourceName() - Method in record class io.kroxylicious.authorizer.service.Action
+
+
Returns the value of the resourceName record component.
+
+
ResourceType<S> - Interface in io.kroxylicious.authorizer.service
+
+
A ResourceType is an enum of the possible operations on a resource of a particular type.
+
+
resourceTypeClass() - Method in record class io.kroxylicious.authorizer.service.Action
+
 
+
ResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A Filter that handles all response types.
+
+
ResponseFilterResult - Interface in io.kroxylicious.proxy.filter
+
+
A specialization of the FilterResult for response filters.
+
+
responseFilterResultBuilder() - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
Creates a builder for a request filter result objects.
+
+
ResponseFilterResultBuilder - Interface in io.kroxylicious.proxy.filter
+
+
Builder for response filter results.
+
+
+

S

+
+
SaslAuthenticateRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for SaslAuthenticateRequests.
+
+
SaslAuthenticateResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for SaslAuthenticateResponses.
+
+
SaslHandshakeRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for SaslHandshakeRequests.
+
+
SaslHandshakeResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for SaslHandshakeResponses.
+
+
SaslSubjectBuilder - Interface in io.kroxylicious.proxy.authentication
+
+
Builds a Subject based on information available from a successful SASL authentication.
+
+
SaslSubjectBuilder.Context - Interface in io.kroxylicious.proxy.authentication
+
+
The context that's passed to SaslSubjectBuilder.buildSaslSubject(Context).
+
+
SaslSubjectBuilderService<C> - Interface in io.kroxylicious.proxy.authentication
+
 
+
sendRequest(RequestHeaderData, ApiMessage) - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
Send a request from a filter towards the broker.
+
+
Serde<T> - Interface in io.kroxylicious.kms.service
+
+
ByteBuffer-sympathetic serialization and deserialization of objects.
+
+
serialize(T, ByteBuffer) - Method in interface io.kroxylicious.kms.service.Serde
+
+
Serializes the given object to the given buffer.
+
+
ServerOptions - Record Class in io.kroxylicious.proxy.config.tls
+
+
Options that control TLS negotiation when in server mode.
+
+
ServerOptions(TlsClientAuth) - Constructor for record class io.kroxylicious.proxy.config.tls.ServerOptions
+
+
Creates an instance of a ServerOptions record class.
+
+
sessionId() - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
An id which uniquely identifies the connection with the client in both time and space.
+
+
ShareAcknowledgeRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ShareAcknowledgeRequests.
+
+
ShareAcknowledgeResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ShareAcknowledgeResponses.
+
+
ShareFetchRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ShareFetchRequests.
+
+
ShareFetchResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ShareFetchResponses.
+
+
ShareGroupDescribeRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ShareGroupDescribeRequests.
+
+
ShareGroupDescribeResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ShareGroupDescribeResponses.
+
+
ShareGroupHeartbeatRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ShareGroupHeartbeatRequests.
+
+
ShareGroupHeartbeatResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for ShareGroupHeartbeatResponses.
+
+
shortCircuitResponse() - Method in interface io.kroxylicious.proxy.filter.RequestFilterResult
+
+
If true, the request is carrying a short circuit response.
+
+
shortCircuitResponse(ResponseHeaderData, ApiMessage) - Method in interface io.kroxylicious.proxy.filter.RequestFilterResultBuilder
+
+
A short-circuit response towards the client.
+
+
shortCircuitResponse(ApiMessage) - Method in interface io.kroxylicious.proxy.filter.RequestFilterResultBuilder
+
+
A short-circuit response towards the client.
+
+
shouldHandleAddOffsetsToTxnRequest(short) - Method in interface io.kroxylicious.proxy.filter.AddOffsetsToTxnRequestFilter
+
+
Determine if a request message of type AddOffsetsToTxnRequest should be handled by + this filter implementation.
+
+
shouldHandleAddOffsetsToTxnResponse(short) - Method in interface io.kroxylicious.proxy.filter.AddOffsetsToTxnResponseFilter
+
+
Determine if a response message of type AddOffsetsToTxnResponse should be handled by + this filter implementation.
+
+
shouldHandleAddPartitionsToTxnRequest(short) - Method in interface io.kroxylicious.proxy.filter.AddPartitionsToTxnRequestFilter
+
+
Determine if a request message of type AddPartitionsToTxnRequest should be handled by + this filter implementation.
+
+
shouldHandleAddPartitionsToTxnResponse(short) - Method in interface io.kroxylicious.proxy.filter.AddPartitionsToTxnResponseFilter
+
+
Determine if a response message of type AddPartitionsToTxnResponse should be handled by + this filter implementation.
+
+
shouldHandleAddRaftVoterRequest(short) - Method in interface io.kroxylicious.proxy.filter.AddRaftVoterRequestFilter
+
+
Determine if a request message of type AddRaftVoterRequest should be handled by + this filter implementation.
+
+
shouldHandleAddRaftVoterResponse(short) - Method in interface io.kroxylicious.proxy.filter.AddRaftVoterResponseFilter
+
+
Determine if a response message of type AddRaftVoterResponse should be handled by + this filter implementation.
+
+
shouldHandleAllocateProducerIdsRequest(short) - Method in interface io.kroxylicious.proxy.filter.AllocateProducerIdsRequestFilter
+
+
Determine if a request message of type AllocateProducerIdsRequest should be handled by + this filter implementation.
+
+
shouldHandleAllocateProducerIdsResponse(short) - Method in interface io.kroxylicious.proxy.filter.AllocateProducerIdsResponseFilter
+
+
Determine if a response message of type AllocateProducerIdsResponse should be handled by + this filter implementation.
+
+
shouldHandleAlterClientQuotasRequest(short) - Method in interface io.kroxylicious.proxy.filter.AlterClientQuotasRequestFilter
+
+
Determine if a request message of type AlterClientQuotasRequest should be handled by + this filter implementation.
+
+
shouldHandleAlterClientQuotasResponse(short) - Method in interface io.kroxylicious.proxy.filter.AlterClientQuotasResponseFilter
+
+
Determine if a response message of type AlterClientQuotasResponse should be handled by + this filter implementation.
+
+
shouldHandleAlterConfigsRequest(short) - Method in interface io.kroxylicious.proxy.filter.AlterConfigsRequestFilter
+
+
Determine if a request message of type AlterConfigsRequest should be handled by + this filter implementation.
+
+
shouldHandleAlterConfigsResponse(short) - Method in interface io.kroxylicious.proxy.filter.AlterConfigsResponseFilter
+
+
Determine if a response message of type AlterConfigsResponse should be handled by + this filter implementation.
+
+
shouldHandleAlterPartitionReassignmentsRequest(short) - Method in interface io.kroxylicious.proxy.filter.AlterPartitionReassignmentsRequestFilter
+
+
Determine if a request message of type AlterPartitionReassignmentsRequest should be handled by + this filter implementation.
+
+
shouldHandleAlterPartitionReassignmentsResponse(short) - Method in interface io.kroxylicious.proxy.filter.AlterPartitionReassignmentsResponseFilter
+
+
Determine if a response message of type AlterPartitionReassignmentsResponse should be handled by + this filter implementation.
+
+
shouldHandleAlterPartitionRequest(short) - Method in interface io.kroxylicious.proxy.filter.AlterPartitionRequestFilter
+
+
Determine if a request message of type AlterPartitionRequest should be handled by + this filter implementation.
+
+
shouldHandleAlterPartitionResponse(short) - Method in interface io.kroxylicious.proxy.filter.AlterPartitionResponseFilter
+
+
Determine if a response message of type AlterPartitionResponse should be handled by + this filter implementation.
+
+
shouldHandleAlterReplicaLogDirsRequest(short) - Method in interface io.kroxylicious.proxy.filter.AlterReplicaLogDirsRequestFilter
+
+
Determine if a request message of type AlterReplicaLogDirsRequest should be handled by + this filter implementation.
+
+
shouldHandleAlterReplicaLogDirsResponse(short) - Method in interface io.kroxylicious.proxy.filter.AlterReplicaLogDirsResponseFilter
+
+
Determine if a response message of type AlterReplicaLogDirsResponse should be handled by + this filter implementation.
+
+
shouldHandleAlterShareGroupOffsetsRequest(short) - Method in interface io.kroxylicious.proxy.filter.AlterShareGroupOffsetsRequestFilter
+
+
Determine if a request message of type AlterShareGroupOffsetsRequest should be handled by + this filter implementation.
+
+
shouldHandleAlterShareGroupOffsetsResponse(short) - Method in interface io.kroxylicious.proxy.filter.AlterShareGroupOffsetsResponseFilter
+
+
Determine if a response message of type AlterShareGroupOffsetsResponse should be handled by + this filter implementation.
+
+
shouldHandleAlterUserScramCredentialsRequest(short) - Method in interface io.kroxylicious.proxy.filter.AlterUserScramCredentialsRequestFilter
+
+
Determine if a request message of type AlterUserScramCredentialsRequest should be handled by + this filter implementation.
+
+
shouldHandleAlterUserScramCredentialsResponse(short) - Method in interface io.kroxylicious.proxy.filter.AlterUserScramCredentialsResponseFilter
+
+
Determine if a response message of type AlterUserScramCredentialsResponse should be handled by + this filter implementation.
+
+
shouldHandleApiVersionsRequest(short) - Method in interface io.kroxylicious.proxy.filter.ApiVersionsRequestFilter
+
+
Determine if a request message of type ApiVersionsRequest should be handled by + this filter implementation.
+
+
shouldHandleApiVersionsResponse(short) - Method in interface io.kroxylicious.proxy.filter.ApiVersionsResponseFilter
+
+
Determine if a response message of type ApiVersionsResponse should be handled by + this filter implementation.
+
+
shouldHandleAssignReplicasToDirsRequest(short) - Method in interface io.kroxylicious.proxy.filter.AssignReplicasToDirsRequestFilter
+
+
Determine if a request message of type AssignReplicasToDirsRequest should be handled by + this filter implementation.
+
+
shouldHandleAssignReplicasToDirsResponse(short) - Method in interface io.kroxylicious.proxy.filter.AssignReplicasToDirsResponseFilter
+
+
Determine if a response message of type AssignReplicasToDirsResponse should be handled by + this filter implementation.
+
+
shouldHandleBeginQuorumEpochRequest(short) - Method in interface io.kroxylicious.proxy.filter.BeginQuorumEpochRequestFilter
+
+
Determine if a request message of type BeginQuorumEpochRequest should be handled by + this filter implementation.
+
+
shouldHandleBeginQuorumEpochResponse(short) - Method in interface io.kroxylicious.proxy.filter.BeginQuorumEpochResponseFilter
+
+
Determine if a response message of type BeginQuorumEpochResponse should be handled by + this filter implementation.
+
+
shouldHandleBrokerHeartbeatRequest(short) - Method in interface io.kroxylicious.proxy.filter.BrokerHeartbeatRequestFilter
+
+
Determine if a request message of type BrokerHeartbeatRequest should be handled by + this filter implementation.
+
+
shouldHandleBrokerHeartbeatResponse(short) - Method in interface io.kroxylicious.proxy.filter.BrokerHeartbeatResponseFilter
+
+
Determine if a response message of type BrokerHeartbeatResponse should be handled by + this filter implementation.
+
+
shouldHandleBrokerRegistrationRequest(short) - Method in interface io.kroxylicious.proxy.filter.BrokerRegistrationRequestFilter
+
+
Determine if a request message of type BrokerRegistrationRequest should be handled by + this filter implementation.
+
+
shouldHandleBrokerRegistrationResponse(short) - Method in interface io.kroxylicious.proxy.filter.BrokerRegistrationResponseFilter
+
+
Determine if a response message of type BrokerRegistrationResponse should be handled by + this filter implementation.
+
+
shouldHandleConsumerGroupDescribeRequest(short) - Method in interface io.kroxylicious.proxy.filter.ConsumerGroupDescribeRequestFilter
+
+
Determine if a request message of type ConsumerGroupDescribeRequest should be handled by + this filter implementation.
+
+
shouldHandleConsumerGroupDescribeResponse(short) - Method in interface io.kroxylicious.proxy.filter.ConsumerGroupDescribeResponseFilter
+
+
Determine if a response message of type ConsumerGroupDescribeResponse should be handled by + this filter implementation.
+
+
shouldHandleConsumerGroupHeartbeatRequest(short) - Method in interface io.kroxylicious.proxy.filter.ConsumerGroupHeartbeatRequestFilter
+
+
Determine if a request message of type ConsumerGroupHeartbeatRequest should be handled by + this filter implementation.
+
+
shouldHandleConsumerGroupHeartbeatResponse(short) - Method in interface io.kroxylicious.proxy.filter.ConsumerGroupHeartbeatResponseFilter
+
+
Determine if a response message of type ConsumerGroupHeartbeatResponse should be handled by + this filter implementation.
+
+
shouldHandleControllerRegistrationRequest(short) - Method in interface io.kroxylicious.proxy.filter.ControllerRegistrationRequestFilter
+
+
Determine if a request message of type ControllerRegistrationRequest should be handled by + this filter implementation.
+
+
shouldHandleControllerRegistrationResponse(short) - Method in interface io.kroxylicious.proxy.filter.ControllerRegistrationResponseFilter
+
+
Determine if a response message of type ControllerRegistrationResponse should be handled by + this filter implementation.
+
+
shouldHandleCreateAclsRequest(short) - Method in interface io.kroxylicious.proxy.filter.CreateAclsRequestFilter
+
+
Determine if a request message of type CreateAclsRequest should be handled by + this filter implementation.
+
+
shouldHandleCreateAclsResponse(short) - Method in interface io.kroxylicious.proxy.filter.CreateAclsResponseFilter
+
+
Determine if a response message of type CreateAclsResponse should be handled by + this filter implementation.
+
+
shouldHandleCreateDelegationTokenRequest(short) - Method in interface io.kroxylicious.proxy.filter.CreateDelegationTokenRequestFilter
+
+
Determine if a request message of type CreateDelegationTokenRequest should be handled by + this filter implementation.
+
+
shouldHandleCreateDelegationTokenResponse(short) - Method in interface io.kroxylicious.proxy.filter.CreateDelegationTokenResponseFilter
+
+
Determine if a response message of type CreateDelegationTokenResponse should be handled by + this filter implementation.
+
+
shouldHandleCreatePartitionsRequest(short) - Method in interface io.kroxylicious.proxy.filter.CreatePartitionsRequestFilter
+
+
Determine if a request message of type CreatePartitionsRequest should be handled by + this filter implementation.
+
+
shouldHandleCreatePartitionsResponse(short) - Method in interface io.kroxylicious.proxy.filter.CreatePartitionsResponseFilter
+
+
Determine if a response message of type CreatePartitionsResponse should be handled by + this filter implementation.
+
+
shouldHandleCreateTopicsRequest(short) - Method in interface io.kroxylicious.proxy.filter.CreateTopicsRequestFilter
+
+
Determine if a request message of type CreateTopicsRequest should be handled by + this filter implementation.
+
+
shouldHandleCreateTopicsResponse(short) - Method in interface io.kroxylicious.proxy.filter.CreateTopicsResponseFilter
+
+
Determine if a response message of type CreateTopicsResponse should be handled by + this filter implementation.
+
+
shouldHandleDeleteAclsRequest(short) - Method in interface io.kroxylicious.proxy.filter.DeleteAclsRequestFilter
+
+
Determine if a request message of type DeleteAclsRequest should be handled by + this filter implementation.
+
+
shouldHandleDeleteAclsResponse(short) - Method in interface io.kroxylicious.proxy.filter.DeleteAclsResponseFilter
+
+
Determine if a response message of type DeleteAclsResponse should be handled by + this filter implementation.
+
+
shouldHandleDeleteGroupsRequest(short) - Method in interface io.kroxylicious.proxy.filter.DeleteGroupsRequestFilter
+
+
Determine if a request message of type DeleteGroupsRequest should be handled by + this filter implementation.
+
+
shouldHandleDeleteGroupsResponse(short) - Method in interface io.kroxylicious.proxy.filter.DeleteGroupsResponseFilter
+
+
Determine if a response message of type DeleteGroupsResponse should be handled by + this filter implementation.
+
+
shouldHandleDeleteRecordsRequest(short) - Method in interface io.kroxylicious.proxy.filter.DeleteRecordsRequestFilter
+
+
Determine if a request message of type DeleteRecordsRequest should be handled by + this filter implementation.
+
+
shouldHandleDeleteRecordsResponse(short) - Method in interface io.kroxylicious.proxy.filter.DeleteRecordsResponseFilter
+
+
Determine if a response message of type DeleteRecordsResponse should be handled by + this filter implementation.
+
+
shouldHandleDeleteShareGroupOffsetsRequest(short) - Method in interface io.kroxylicious.proxy.filter.DeleteShareGroupOffsetsRequestFilter
+
+
Determine if a request message of type DeleteShareGroupOffsetsRequest should be handled by + this filter implementation.
+
+
shouldHandleDeleteShareGroupOffsetsResponse(short) - Method in interface io.kroxylicious.proxy.filter.DeleteShareGroupOffsetsResponseFilter
+
+
Determine if a response message of type DeleteShareGroupOffsetsResponse should be handled by + this filter implementation.
+
+
shouldHandleDeleteShareGroupStateRequest(short) - Method in interface io.kroxylicious.proxy.filter.DeleteShareGroupStateRequestFilter
+
+
Determine if a request message of type DeleteShareGroupStateRequest should be handled by + this filter implementation.
+
+
shouldHandleDeleteShareGroupStateResponse(short) - Method in interface io.kroxylicious.proxy.filter.DeleteShareGroupStateResponseFilter
+
+
Determine if a response message of type DeleteShareGroupStateResponse should be handled by + this filter implementation.
+
+
shouldHandleDeleteTopicsRequest(short) - Method in interface io.kroxylicious.proxy.filter.DeleteTopicsRequestFilter
+
+
Determine if a request message of type DeleteTopicsRequest should be handled by + this filter implementation.
+
+
shouldHandleDeleteTopicsResponse(short) - Method in interface io.kroxylicious.proxy.filter.DeleteTopicsResponseFilter
+
+
Determine if a response message of type DeleteTopicsResponse should be handled by + this filter implementation.
+
+
shouldHandleDescribeAclsRequest(short) - Method in interface io.kroxylicious.proxy.filter.DescribeAclsRequestFilter
+
+
Determine if a request message of type DescribeAclsRequest should be handled by + this filter implementation.
+
+
shouldHandleDescribeAclsResponse(short) - Method in interface io.kroxylicious.proxy.filter.DescribeAclsResponseFilter
+
+
Determine if a response message of type DescribeAclsResponse should be handled by + this filter implementation.
+
+
shouldHandleDescribeClientQuotasRequest(short) - Method in interface io.kroxylicious.proxy.filter.DescribeClientQuotasRequestFilter
+
+
Determine if a request message of type DescribeClientQuotasRequest should be handled by + this filter implementation.
+
+
shouldHandleDescribeClientQuotasResponse(short) - Method in interface io.kroxylicious.proxy.filter.DescribeClientQuotasResponseFilter
+
+
Determine if a response message of type DescribeClientQuotasResponse should be handled by + this filter implementation.
+
+
shouldHandleDescribeClusterRequest(short) - Method in interface io.kroxylicious.proxy.filter.DescribeClusterRequestFilter
+
+
Determine if a request message of type DescribeClusterRequest should be handled by + this filter implementation.
+
+
shouldHandleDescribeClusterResponse(short) - Method in interface io.kroxylicious.proxy.filter.DescribeClusterResponseFilter
+
+
Determine if a response message of type DescribeClusterResponse should be handled by + this filter implementation.
+
+
shouldHandleDescribeConfigsRequest(short) - Method in interface io.kroxylicious.proxy.filter.DescribeConfigsRequestFilter
+
+
Determine if a request message of type DescribeConfigsRequest should be handled by + this filter implementation.
+
+
shouldHandleDescribeConfigsResponse(short) - Method in interface io.kroxylicious.proxy.filter.DescribeConfigsResponseFilter
+
+
Determine if a response message of type DescribeConfigsResponse should be handled by + this filter implementation.
+
+
shouldHandleDescribeDelegationTokenRequest(short) - Method in interface io.kroxylicious.proxy.filter.DescribeDelegationTokenRequestFilter
+
+
Determine if a request message of type DescribeDelegationTokenRequest should be handled by + this filter implementation.
+
+
shouldHandleDescribeDelegationTokenResponse(short) - Method in interface io.kroxylicious.proxy.filter.DescribeDelegationTokenResponseFilter
+
+
Determine if a response message of type DescribeDelegationTokenResponse should be handled by + this filter implementation.
+
+
shouldHandleDescribeGroupsRequest(short) - Method in interface io.kroxylicious.proxy.filter.DescribeGroupsRequestFilter
+
+
Determine if a request message of type DescribeGroupsRequest should be handled by + this filter implementation.
+
+
shouldHandleDescribeGroupsResponse(short) - Method in interface io.kroxylicious.proxy.filter.DescribeGroupsResponseFilter
+
+
Determine if a response message of type DescribeGroupsResponse should be handled by + this filter implementation.
+
+
shouldHandleDescribeLogDirsRequest(short) - Method in interface io.kroxylicious.proxy.filter.DescribeLogDirsRequestFilter
+
+
Determine if a request message of type DescribeLogDirsRequest should be handled by + this filter implementation.
+
+
shouldHandleDescribeLogDirsResponse(short) - Method in interface io.kroxylicious.proxy.filter.DescribeLogDirsResponseFilter
+
+
Determine if a response message of type DescribeLogDirsResponse should be handled by + this filter implementation.
+
+
shouldHandleDescribeProducersRequest(short) - Method in interface io.kroxylicious.proxy.filter.DescribeProducersRequestFilter
+
+
Determine if a request message of type DescribeProducersRequest should be handled by + this filter implementation.
+
+
shouldHandleDescribeProducersResponse(short) - Method in interface io.kroxylicious.proxy.filter.DescribeProducersResponseFilter
+
+
Determine if a response message of type DescribeProducersResponse should be handled by + this filter implementation.
+
+
shouldHandleDescribeQuorumRequest(short) - Method in interface io.kroxylicious.proxy.filter.DescribeQuorumRequestFilter
+
+
Determine if a request message of type DescribeQuorumRequest should be handled by + this filter implementation.
+
+
shouldHandleDescribeQuorumResponse(short) - Method in interface io.kroxylicious.proxy.filter.DescribeQuorumResponseFilter
+
+
Determine if a response message of type DescribeQuorumResponse should be handled by + this filter implementation.
+
+
shouldHandleDescribeShareGroupOffsetsRequest(short) - Method in interface io.kroxylicious.proxy.filter.DescribeShareGroupOffsetsRequestFilter
+
+
Determine if a request message of type DescribeShareGroupOffsetsRequest should be handled by + this filter implementation.
+
+
shouldHandleDescribeShareGroupOffsetsResponse(short) - Method in interface io.kroxylicious.proxy.filter.DescribeShareGroupOffsetsResponseFilter
+
+
Determine if a response message of type DescribeShareGroupOffsetsResponse should be handled by + this filter implementation.
+
+
shouldHandleDescribeTopicPartitionsRequest(short) - Method in interface io.kroxylicious.proxy.filter.DescribeTopicPartitionsRequestFilter
+
+
Determine if a request message of type DescribeTopicPartitionsRequest should be handled by + this filter implementation.
+
+
shouldHandleDescribeTopicPartitionsResponse(short) - Method in interface io.kroxylicious.proxy.filter.DescribeTopicPartitionsResponseFilter
+
+
Determine if a response message of type DescribeTopicPartitionsResponse should be handled by + this filter implementation.
+
+
shouldHandleDescribeTransactionsRequest(short) - Method in interface io.kroxylicious.proxy.filter.DescribeTransactionsRequestFilter
+
+
Determine if a request message of type DescribeTransactionsRequest should be handled by + this filter implementation.
+
+
shouldHandleDescribeTransactionsResponse(short) - Method in interface io.kroxylicious.proxy.filter.DescribeTransactionsResponseFilter
+
+
Determine if a response message of type DescribeTransactionsResponse should be handled by + this filter implementation.
+
+
shouldHandleDescribeUserScramCredentialsRequest(short) - Method in interface io.kroxylicious.proxy.filter.DescribeUserScramCredentialsRequestFilter
+
+
Determine if a request message of type DescribeUserScramCredentialsRequest should be handled by + this filter implementation.
+
+
shouldHandleDescribeUserScramCredentialsResponse(short) - Method in interface io.kroxylicious.proxy.filter.DescribeUserScramCredentialsResponseFilter
+
+
Determine if a response message of type DescribeUserScramCredentialsResponse should be handled by + this filter implementation.
+
+
shouldHandleElectLeadersRequest(short) - Method in interface io.kroxylicious.proxy.filter.ElectLeadersRequestFilter
+
+
Determine if a request message of type ElectLeadersRequest should be handled by + this filter implementation.
+
+
shouldHandleElectLeadersResponse(short) - Method in interface io.kroxylicious.proxy.filter.ElectLeadersResponseFilter
+
+
Determine if a response message of type ElectLeadersResponse should be handled by + this filter implementation.
+
+
shouldHandleEndQuorumEpochRequest(short) - Method in interface io.kroxylicious.proxy.filter.EndQuorumEpochRequestFilter
+
+
Determine if a request message of type EndQuorumEpochRequest should be handled by + this filter implementation.
+
+
shouldHandleEndQuorumEpochResponse(short) - Method in interface io.kroxylicious.proxy.filter.EndQuorumEpochResponseFilter
+
+
Determine if a response message of type EndQuorumEpochResponse should be handled by + this filter implementation.
+
+
shouldHandleEndTxnRequest(short) - Method in interface io.kroxylicious.proxy.filter.EndTxnRequestFilter
+
+
Determine if a request message of type EndTxnRequest should be handled by + this filter implementation.
+
+
shouldHandleEndTxnResponse(short) - Method in interface io.kroxylicious.proxy.filter.EndTxnResponseFilter
+
+
Determine if a response message of type EndTxnResponse should be handled by + this filter implementation.
+
+
shouldHandleEnvelopeRequest(short) - Method in interface io.kroxylicious.proxy.filter.EnvelopeRequestFilter
+
+
Determine if a request message of type EnvelopeRequest should be handled by + this filter implementation.
+
+
shouldHandleEnvelopeResponse(short) - Method in interface io.kroxylicious.proxy.filter.EnvelopeResponseFilter
+
+
Determine if a response message of type EnvelopeResponse should be handled by + this filter implementation.
+
+
shouldHandleExpireDelegationTokenRequest(short) - Method in interface io.kroxylicious.proxy.filter.ExpireDelegationTokenRequestFilter
+
+
Determine if a request message of type ExpireDelegationTokenRequest should be handled by + this filter implementation.
+
+
shouldHandleExpireDelegationTokenResponse(short) - Method in interface io.kroxylicious.proxy.filter.ExpireDelegationTokenResponseFilter
+
+
Determine if a response message of type ExpireDelegationTokenResponse should be handled by + this filter implementation.
+
+
shouldHandleFetchRequest(short) - Method in interface io.kroxylicious.proxy.filter.FetchRequestFilter
+
+
Determine if a request message of type FetchRequest should be handled by + this filter implementation.
+
+
shouldHandleFetchResponse(short) - Method in interface io.kroxylicious.proxy.filter.FetchResponseFilter
+
+
Determine if a response message of type FetchResponse should be handled by + this filter implementation.
+
+
shouldHandleFetchSnapshotRequest(short) - Method in interface io.kroxylicious.proxy.filter.FetchSnapshotRequestFilter
+
+
Determine if a request message of type FetchSnapshotRequest should be handled by + this filter implementation.
+
+
shouldHandleFetchSnapshotResponse(short) - Method in interface io.kroxylicious.proxy.filter.FetchSnapshotResponseFilter
+
+
Determine if a response message of type FetchSnapshotResponse should be handled by + this filter implementation.
+
+
shouldHandleFindCoordinatorRequest(short) - Method in interface io.kroxylicious.proxy.filter.FindCoordinatorRequestFilter
+
+
Determine if a request message of type FindCoordinatorRequest should be handled by + this filter implementation.
+
+
shouldHandleFindCoordinatorResponse(short) - Method in interface io.kroxylicious.proxy.filter.FindCoordinatorResponseFilter
+
+
Determine if a response message of type FindCoordinatorResponse should be handled by + this filter implementation.
+
+
shouldHandleGetTelemetrySubscriptionsRequest(short) - Method in interface io.kroxylicious.proxy.filter.GetTelemetrySubscriptionsRequestFilter
+
+
Determine if a request message of type GetTelemetrySubscriptionsRequest should be handled by + this filter implementation.
+
+
shouldHandleGetTelemetrySubscriptionsResponse(short) - Method in interface io.kroxylicious.proxy.filter.GetTelemetrySubscriptionsResponseFilter
+
+
Determine if a response message of type GetTelemetrySubscriptionsResponse should be handled by + this filter implementation.
+
+
shouldHandleHeartbeatRequest(short) - Method in interface io.kroxylicious.proxy.filter.HeartbeatRequestFilter
+
+
Determine if a request message of type HeartbeatRequest should be handled by + this filter implementation.
+
+
shouldHandleHeartbeatResponse(short) - Method in interface io.kroxylicious.proxy.filter.HeartbeatResponseFilter
+
+
Determine if a response message of type HeartbeatResponse should be handled by + this filter implementation.
+
+
shouldHandleIncrementalAlterConfigsRequest(short) - Method in interface io.kroxylicious.proxy.filter.IncrementalAlterConfigsRequestFilter
+
+
Determine if a request message of type IncrementalAlterConfigsRequest should be handled by + this filter implementation.
+
+
shouldHandleIncrementalAlterConfigsResponse(short) - Method in interface io.kroxylicious.proxy.filter.IncrementalAlterConfigsResponseFilter
+
+
Determine if a response message of type IncrementalAlterConfigsResponse should be handled by + this filter implementation.
+
+
shouldHandleInitializeShareGroupStateRequest(short) - Method in interface io.kroxylicious.proxy.filter.InitializeShareGroupStateRequestFilter
+
+
Determine if a request message of type InitializeShareGroupStateRequest should be handled by + this filter implementation.
+
+
shouldHandleInitializeShareGroupStateResponse(short) - Method in interface io.kroxylicious.proxy.filter.InitializeShareGroupStateResponseFilter
+
+
Determine if a response message of type InitializeShareGroupStateResponse should be handled by + this filter implementation.
+
+
shouldHandleInitProducerIdRequest(short) - Method in interface io.kroxylicious.proxy.filter.InitProducerIdRequestFilter
+
+
Determine if a request message of type InitProducerIdRequest should be handled by + this filter implementation.
+
+
shouldHandleInitProducerIdResponse(short) - Method in interface io.kroxylicious.proxy.filter.InitProducerIdResponseFilter
+
+
Determine if a response message of type InitProducerIdResponse should be handled by + this filter implementation.
+
+
shouldHandleJoinGroupRequest(short) - Method in interface io.kroxylicious.proxy.filter.JoinGroupRequestFilter
+
+
Determine if a request message of type JoinGroupRequest should be handled by + this filter implementation.
+
+
shouldHandleJoinGroupResponse(short) - Method in interface io.kroxylicious.proxy.filter.JoinGroupResponseFilter
+
+
Determine if a response message of type JoinGroupResponse should be handled by + this filter implementation.
+
+
shouldHandleLeaveGroupRequest(short) - Method in interface io.kroxylicious.proxy.filter.LeaveGroupRequestFilter
+
+
Determine if a request message of type LeaveGroupRequest should be handled by + this filter implementation.
+
+
shouldHandleLeaveGroupResponse(short) - Method in interface io.kroxylicious.proxy.filter.LeaveGroupResponseFilter
+
+
Determine if a response message of type LeaveGroupResponse should be handled by + this filter implementation.
+
+
shouldHandleListConfigResourcesRequest(short) - Method in interface io.kroxylicious.proxy.filter.ListConfigResourcesRequestFilter
+
+
Determine if a request message of type ListConfigResourcesRequest should be handled by + this filter implementation.
+
+
shouldHandleListConfigResourcesResponse(short) - Method in interface io.kroxylicious.proxy.filter.ListConfigResourcesResponseFilter
+
+
Determine if a response message of type ListConfigResourcesResponse should be handled by + this filter implementation.
+
+
shouldHandleListGroupsRequest(short) - Method in interface io.kroxylicious.proxy.filter.ListGroupsRequestFilter
+
+
Determine if a request message of type ListGroupsRequest should be handled by + this filter implementation.
+
+
shouldHandleListGroupsResponse(short) - Method in interface io.kroxylicious.proxy.filter.ListGroupsResponseFilter
+
+
Determine if a response message of type ListGroupsResponse should be handled by + this filter implementation.
+
+
shouldHandleListOffsetsRequest(short) - Method in interface io.kroxylicious.proxy.filter.ListOffsetsRequestFilter
+
+
Determine if a request message of type ListOffsetsRequest should be handled by + this filter implementation.
+
+
shouldHandleListOffsetsResponse(short) - Method in interface io.kroxylicious.proxy.filter.ListOffsetsResponseFilter
+
+
Determine if a response message of type ListOffsetsResponse should be handled by + this filter implementation.
+
+
shouldHandleListPartitionReassignmentsRequest(short) - Method in interface io.kroxylicious.proxy.filter.ListPartitionReassignmentsRequestFilter
+
+
Determine if a request message of type ListPartitionReassignmentsRequest should be handled by + this filter implementation.
+
+
shouldHandleListPartitionReassignmentsResponse(short) - Method in interface io.kroxylicious.proxy.filter.ListPartitionReassignmentsResponseFilter
+
+
Determine if a response message of type ListPartitionReassignmentsResponse should be handled by + this filter implementation.
+
+
shouldHandleListTransactionsRequest(short) - Method in interface io.kroxylicious.proxy.filter.ListTransactionsRequestFilter
+
+
Determine if a request message of type ListTransactionsRequest should be handled by + this filter implementation.
+
+
shouldHandleListTransactionsResponse(short) - Method in interface io.kroxylicious.proxy.filter.ListTransactionsResponseFilter
+
+
Determine if a response message of type ListTransactionsResponse should be handled by + this filter implementation.
+
+
shouldHandleMetadataRequest(short) - Method in interface io.kroxylicious.proxy.filter.MetadataRequestFilter
+
+
Determine if a request message of type MetadataRequest should be handled by + this filter implementation.
+
+
shouldHandleMetadataResponse(short) - Method in interface io.kroxylicious.proxy.filter.MetadataResponseFilter
+
+
Determine if a response message of type MetadataResponse should be handled by + this filter implementation.
+
+
shouldHandleOffsetCommitRequest(short) - Method in interface io.kroxylicious.proxy.filter.OffsetCommitRequestFilter
+
+
Determine if a request message of type OffsetCommitRequest should be handled by + this filter implementation.
+
+
shouldHandleOffsetCommitResponse(short) - Method in interface io.kroxylicious.proxy.filter.OffsetCommitResponseFilter
+
+
Determine if a response message of type OffsetCommitResponse should be handled by + this filter implementation.
+
+
shouldHandleOffsetDeleteRequest(short) - Method in interface io.kroxylicious.proxy.filter.OffsetDeleteRequestFilter
+
+
Determine if a request message of type OffsetDeleteRequest should be handled by + this filter implementation.
+
+
shouldHandleOffsetDeleteResponse(short) - Method in interface io.kroxylicious.proxy.filter.OffsetDeleteResponseFilter
+
+
Determine if a response message of type OffsetDeleteResponse should be handled by + this filter implementation.
+
+
shouldHandleOffsetFetchRequest(short) - Method in interface io.kroxylicious.proxy.filter.OffsetFetchRequestFilter
+
+
Determine if a request message of type OffsetFetchRequest should be handled by + this filter implementation.
+
+
shouldHandleOffsetFetchResponse(short) - Method in interface io.kroxylicious.proxy.filter.OffsetFetchResponseFilter
+
+
Determine if a response message of type OffsetFetchResponse should be handled by + this filter implementation.
+
+
shouldHandleOffsetForLeaderEpochRequest(short) - Method in interface io.kroxylicious.proxy.filter.OffsetForLeaderEpochRequestFilter
+
+
Determine if a request message of type OffsetForLeaderEpochRequest should be handled by + this filter implementation.
+
+
shouldHandleOffsetForLeaderEpochResponse(short) - Method in interface io.kroxylicious.proxy.filter.OffsetForLeaderEpochResponseFilter
+
+
Determine if a response message of type OffsetForLeaderEpochResponse should be handled by + this filter implementation.
+
+
shouldHandleProduceRequest(short) - Method in interface io.kroxylicious.proxy.filter.ProduceRequestFilter
+
+
Determine if a request message of type ProduceRequest should be handled by + this filter implementation.
+
+
shouldHandleProduceResponse(short) - Method in interface io.kroxylicious.proxy.filter.ProduceResponseFilter
+
+
Determine if a response message of type ProduceResponse should be handled by + this filter implementation.
+
+
shouldHandlePushTelemetryRequest(short) - Method in interface io.kroxylicious.proxy.filter.PushTelemetryRequestFilter
+
+
Determine if a request message of type PushTelemetryRequest should be handled by + this filter implementation.
+
+
shouldHandlePushTelemetryResponse(short) - Method in interface io.kroxylicious.proxy.filter.PushTelemetryResponseFilter
+
+
Determine if a response message of type PushTelemetryResponse should be handled by + this filter implementation.
+
+
shouldHandleReadShareGroupStateRequest(short) - Method in interface io.kroxylicious.proxy.filter.ReadShareGroupStateRequestFilter
+
+
Determine if a request message of type ReadShareGroupStateRequest should be handled by + this filter implementation.
+
+
shouldHandleReadShareGroupStateResponse(short) - Method in interface io.kroxylicious.proxy.filter.ReadShareGroupStateResponseFilter
+
+
Determine if a response message of type ReadShareGroupStateResponse should be handled by + this filter implementation.
+
+
shouldHandleReadShareGroupStateSummaryRequest(short) - Method in interface io.kroxylicious.proxy.filter.ReadShareGroupStateSummaryRequestFilter
+
+
Determine if a request message of type ReadShareGroupStateSummaryRequest should be handled by + this filter implementation.
+
+
shouldHandleReadShareGroupStateSummaryResponse(short) - Method in interface io.kroxylicious.proxy.filter.ReadShareGroupStateSummaryResponseFilter
+
+
Determine if a response message of type ReadShareGroupStateSummaryResponse should be handled by + this filter implementation.
+
+
shouldHandleRemoveRaftVoterRequest(short) - Method in interface io.kroxylicious.proxy.filter.RemoveRaftVoterRequestFilter
+
+
Determine if a request message of type RemoveRaftVoterRequest should be handled by + this filter implementation.
+
+
shouldHandleRemoveRaftVoterResponse(short) - Method in interface io.kroxylicious.proxy.filter.RemoveRaftVoterResponseFilter
+
+
Determine if a response message of type RemoveRaftVoterResponse should be handled by + this filter implementation.
+
+
shouldHandleRenewDelegationTokenRequest(short) - Method in interface io.kroxylicious.proxy.filter.RenewDelegationTokenRequestFilter
+
+
Determine if a request message of type RenewDelegationTokenRequest should be handled by + this filter implementation.
+
+
shouldHandleRenewDelegationTokenResponse(short) - Method in interface io.kroxylicious.proxy.filter.RenewDelegationTokenResponseFilter
+
+
Determine if a response message of type RenewDelegationTokenResponse should be handled by + this filter implementation.
+
+
shouldHandleRequest(ApiKeys, short) - Method in interface io.kroxylicious.proxy.filter.RequestFilter
+
+
Does this filter implementation want to handle a request.
+
+
shouldHandleResponse(ApiKeys, short) - Method in interface io.kroxylicious.proxy.filter.ResponseFilter
+
+
Does this filter implementation want to handle a response.
+
+
shouldHandleSaslAuthenticateRequest(short) - Method in interface io.kroxylicious.proxy.filter.SaslAuthenticateRequestFilter
+
+
Determine if a request message of type SaslAuthenticateRequest should be handled by + this filter implementation.
+
+
shouldHandleSaslAuthenticateResponse(short) - Method in interface io.kroxylicious.proxy.filter.SaslAuthenticateResponseFilter
+
+
Determine if a response message of type SaslAuthenticateResponse should be handled by + this filter implementation.
+
+
shouldHandleSaslHandshakeRequest(short) - Method in interface io.kroxylicious.proxy.filter.SaslHandshakeRequestFilter
+
+
Determine if a request message of type SaslHandshakeRequest should be handled by + this filter implementation.
+
+
shouldHandleSaslHandshakeResponse(short) - Method in interface io.kroxylicious.proxy.filter.SaslHandshakeResponseFilter
+
+
Determine if a response message of type SaslHandshakeResponse should be handled by + this filter implementation.
+
+
shouldHandleShareAcknowledgeRequest(short) - Method in interface io.kroxylicious.proxy.filter.ShareAcknowledgeRequestFilter
+
+
Determine if a request message of type ShareAcknowledgeRequest should be handled by + this filter implementation.
+
+
shouldHandleShareAcknowledgeResponse(short) - Method in interface io.kroxylicious.proxy.filter.ShareAcknowledgeResponseFilter
+
+
Determine if a response message of type ShareAcknowledgeResponse should be handled by + this filter implementation.
+
+
shouldHandleShareFetchRequest(short) - Method in interface io.kroxylicious.proxy.filter.ShareFetchRequestFilter
+
+
Determine if a request message of type ShareFetchRequest should be handled by + this filter implementation.
+
+
shouldHandleShareFetchResponse(short) - Method in interface io.kroxylicious.proxy.filter.ShareFetchResponseFilter
+
+
Determine if a response message of type ShareFetchResponse should be handled by + this filter implementation.
+
+
shouldHandleShareGroupDescribeRequest(short) - Method in interface io.kroxylicious.proxy.filter.ShareGroupDescribeRequestFilter
+
+
Determine if a request message of type ShareGroupDescribeRequest should be handled by + this filter implementation.
+
+
shouldHandleShareGroupDescribeResponse(short) - Method in interface io.kroxylicious.proxy.filter.ShareGroupDescribeResponseFilter
+
+
Determine if a response message of type ShareGroupDescribeResponse should be handled by + this filter implementation.
+
+
shouldHandleShareGroupHeartbeatRequest(short) - Method in interface io.kroxylicious.proxy.filter.ShareGroupHeartbeatRequestFilter
+
+
Determine if a request message of type ShareGroupHeartbeatRequest should be handled by + this filter implementation.
+
+
shouldHandleShareGroupHeartbeatResponse(short) - Method in interface io.kroxylicious.proxy.filter.ShareGroupHeartbeatResponseFilter
+
+
Determine if a response message of type ShareGroupHeartbeatResponse should be handled by + this filter implementation.
+
+
shouldHandleStreamsGroupDescribeRequest(short) - Method in interface io.kroxylicious.proxy.filter.StreamsGroupDescribeRequestFilter
+
+
Determine if a request message of type StreamsGroupDescribeRequest should be handled by + this filter implementation.
+
+
shouldHandleStreamsGroupDescribeResponse(short) - Method in interface io.kroxylicious.proxy.filter.StreamsGroupDescribeResponseFilter
+
+
Determine if a response message of type StreamsGroupDescribeResponse should be handled by + this filter implementation.
+
+
shouldHandleStreamsGroupHeartbeatRequest(short) - Method in interface io.kroxylicious.proxy.filter.StreamsGroupHeartbeatRequestFilter
+
+
Determine if a request message of type StreamsGroupHeartbeatRequest should be handled by + this filter implementation.
+
+
shouldHandleStreamsGroupHeartbeatResponse(short) - Method in interface io.kroxylicious.proxy.filter.StreamsGroupHeartbeatResponseFilter
+
+
Determine if a response message of type StreamsGroupHeartbeatResponse should be handled by + this filter implementation.
+
+
shouldHandleSyncGroupRequest(short) - Method in interface io.kroxylicious.proxy.filter.SyncGroupRequestFilter
+
+
Determine if a request message of type SyncGroupRequest should be handled by + this filter implementation.
+
+
shouldHandleSyncGroupResponse(short) - Method in interface io.kroxylicious.proxy.filter.SyncGroupResponseFilter
+
+
Determine if a response message of type SyncGroupResponse should be handled by + this filter implementation.
+
+
shouldHandleTxnOffsetCommitRequest(short) - Method in interface io.kroxylicious.proxy.filter.TxnOffsetCommitRequestFilter
+
+
Determine if a request message of type TxnOffsetCommitRequest should be handled by + this filter implementation.
+
+
shouldHandleTxnOffsetCommitResponse(short) - Method in interface io.kroxylicious.proxy.filter.TxnOffsetCommitResponseFilter
+
+
Determine if a response message of type TxnOffsetCommitResponse should be handled by + this filter implementation.
+
+
shouldHandleUnregisterBrokerRequest(short) - Method in interface io.kroxylicious.proxy.filter.UnregisterBrokerRequestFilter
+
+
Determine if a request message of type UnregisterBrokerRequest should be handled by + this filter implementation.
+
+
shouldHandleUnregisterBrokerResponse(short) - Method in interface io.kroxylicious.proxy.filter.UnregisterBrokerResponseFilter
+
+
Determine if a response message of type UnregisterBrokerResponse should be handled by + this filter implementation.
+
+
shouldHandleUpdateFeaturesRequest(short) - Method in interface io.kroxylicious.proxy.filter.UpdateFeaturesRequestFilter
+
+
Determine if a request message of type UpdateFeaturesRequest should be handled by + this filter implementation.
+
+
shouldHandleUpdateFeaturesResponse(short) - Method in interface io.kroxylicious.proxy.filter.UpdateFeaturesResponseFilter
+
+
Determine if a response message of type UpdateFeaturesResponse should be handled by + this filter implementation.
+
+
shouldHandleUpdateRaftVoterRequest(short) - Method in interface io.kroxylicious.proxy.filter.UpdateRaftVoterRequestFilter
+
+
Determine if a request message of type UpdateRaftVoterRequest should be handled by + this filter implementation.
+
+
shouldHandleUpdateRaftVoterResponse(short) - Method in interface io.kroxylicious.proxy.filter.UpdateRaftVoterResponseFilter
+
+
Determine if a response message of type UpdateRaftVoterResponse should be handled by + this filter implementation.
+
+
shouldHandleVoteRequest(short) - Method in interface io.kroxylicious.proxy.filter.VoteRequestFilter
+
+
Determine if a request message of type VoteRequest should be handled by + this filter implementation.
+
+
shouldHandleVoteResponse(short) - Method in interface io.kroxylicious.proxy.filter.VoteResponseFilter
+
+
Determine if a response message of type VoteResponse should be handled by + this filter implementation.
+
+
shouldHandleWriteShareGroupStateRequest(short) - Method in interface io.kroxylicious.proxy.filter.WriteShareGroupStateRequestFilter
+
+
Determine if a request message of type WriteShareGroupStateRequest should be handled by + this filter implementation.
+
+
shouldHandleWriteShareGroupStateResponse(short) - Method in interface io.kroxylicious.proxy.filter.WriteShareGroupStateResponseFilter
+
+
Determine if a response message of type WriteShareGroupStateResponse should be handled by + this filter implementation.
+
+
shouldHandleWriteTxnMarkersRequest(short) - Method in interface io.kroxylicious.proxy.filter.WriteTxnMarkersRequestFilter
+
+
Determine if a request message of type WriteTxnMarkersRequest should be handled by + this filter implementation.
+
+
shouldHandleWriteTxnMarkersResponse(short) - Method in interface io.kroxylicious.proxy.filter.WriteTxnMarkersResponseFilter
+
+
Determine if a response message of type WriteTxnMarkersResponse should be handled by + this filter implementation.
+
+
since() - Element in annotation interface io.kroxylicious.proxy.plugin.DeprecatedPluginName
+
+
Returns the version in which the name became deprecated.
+
+
sizeOf(T) - Method in interface io.kroxylicious.kms.service.Serde
+
+
Returns the number of bytes required to serialize the given object.
+
+
sniHostname() - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
The SNI hostname provided by the client, if any.
+
+
storeFile() - Method in record class io.kroxylicious.proxy.config.tls.KeyStore
+
+
Returns the value of the storeFile record component.
+
+
storeFile() - Method in record class io.kroxylicious.proxy.config.tls.TrustStore
+
+
Returns the value of the storeFile record component.
+
+
storePasswordProvider() - Method in record class io.kroxylicious.proxy.config.tls.KeyStore
+
+
Returns the value of the storePasswordProvider record component.
+
+
storePasswordProvider() - Method in record class io.kroxylicious.proxy.config.tls.TrustStore
+
+
Returns the value of the storePasswordProvider record component.
+
+
storeType() - Method in record class io.kroxylicious.proxy.config.tls.KeyStore
+
+
Returns the value of the storeType record component.
+
+
storeType() - Method in record class io.kroxylicious.proxy.config.tls.TrustStore
+
+
Returns the value of the storeType record component.
+
+
StreamsGroupDescribeRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for StreamsGroupDescribeRequests.
+
+
StreamsGroupDescribeResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for StreamsGroupDescribeResponses.
+
+
StreamsGroupHeartbeatRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for StreamsGroupHeartbeatRequests.
+
+
StreamsGroupHeartbeatResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for StreamsGroupHeartbeatResponses.
+
+
subject() - Method in record class io.kroxylicious.authorizer.service.AuthorizeResult
+
+
Returns the value of the subject record component.
+
+
Subject - Record Class in io.kroxylicious.proxy.authentication
+
+
Represents an actor in the system.
+
+
Subject(Principal...) - Constructor for record class io.kroxylicious.proxy.authentication.Subject
+
 
+
Subject(Set<Principal>) - Constructor for record class io.kroxylicious.proxy.authentication.Subject
+
+
Creates an instance of a Subject record class.
+
+
SubjectBuildingException - Exception Class in io.kroxylicious.proxy.authentication
+
+
An exception to be thrown if a Subject cannot be built.
+
+
SubjectBuildingException(String) - Constructor for exception class io.kroxylicious.proxy.authentication.SubjectBuildingException
+
 
+
SubjectBuildingException(String, Throwable) - Constructor for exception class io.kroxylicious.proxy.authentication.SubjectBuildingException
+
 
+
supportedResourceTypes() - Method in interface io.kroxylicious.authorizer.service.Authorizer
+
+
Returns the types of resource that this authorizer is able to make decisions about.
+
+
SyncGroupRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for SyncGroupRequests.
+
+
SyncGroupResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for SyncGroupResponses.
+
+
+

T

+
+
takeCopyOf(byte[], String) - Static method in class io.kroxylicious.kms.service.DestroyableRawSecretKey
+
+
Create a new key by creating a copy of the given key material.
+
+
takeOwnershipOf(byte[], String) - Static method in class io.kroxylicious.kms.service.DestroyableRawSecretKey
+
+
Create a new key by becoming owner of the given key material.
+
+
TerminalStage<R> - Interface in io.kroxylicious.proxy.filter.filterresultbuilder
+
+
Interface supporting the FilterResultBuilder fluent API.
+
+
Terminology - Search tag in package io.kroxylicious.proxy.plugin
+
Section
+
Thread Safety - Search tag in package io.kroxylicious.proxy.filter
+
Section
+
Tls - Record Class in io.kroxylicious.proxy.config.tls
+
+
Provides TLS configuration for this peer.
+
+
Tls(KeyProvider, TrustProvider, AllowDeny<String>, AllowDeny<String>) - Constructor for record class io.kroxylicious.proxy.config.tls.Tls
+
+
Creates an instance of a Tls record class.
+
+
TlsClientAuth - Enum Class in io.kroxylicious.proxy.config.tls
+
 
+
toDestroyableKey(SecretKey) - Static method in class io.kroxylicious.kms.service.DestroyableRawSecretKey
+
+
Convert the given key to a destroyable key, attempting to destroy the given key.
+
+
TopicLevelMetadataErrorException - Exception Class in io.kroxylicious.proxy.filter.metadata
+
+
Indicates that there was an Error set on a MetadataResponseData.MetadataResponseTopic.
+
+
TopicLevelMetadataErrorException(Errors) - Constructor for exception class io.kroxylicious.proxy.filter.metadata.TopicLevelMetadataErrorException
+
 
+
TopicNameMapping - Interface in io.kroxylicious.proxy.filter.metadata
+
+
The result of discovering the topic names for a collection of topic ids
+
+
TopicNameMappingException - Exception Class in io.kroxylicious.proxy.filter.metadata
+
+
Indicates there was some problem obtaining a name for a topic id
+
+
TopicNameMappingException(Errors) - Constructor for exception class io.kroxylicious.proxy.filter.metadata.TopicNameMappingException
+
 
+
TopicNameMappingException(Errors, String) - Constructor for exception class io.kroxylicious.proxy.filter.metadata.TopicNameMappingException
+
 
+
TopicNameMappingException(Errors, String, Throwable) - Constructor for exception class io.kroxylicious.proxy.filter.metadata.TopicNameMappingException
+
 
+
topicNames() - Method in interface io.kroxylicious.proxy.filter.metadata.TopicNameMapping
+
 
+
topicNames(Collection<Uuid>) - Method in interface io.kroxylicious.proxy.filter.FilterContext
+
+
Attempts to map all the given topicIds to the current corresponding topic names.
+
+
TopLevelMetadataErrorException - Exception Class in io.kroxylicious.proxy.filter.metadata
+
+
Indicates that there was an Error set at the top level of MetadataResponseData.
+
+
TopLevelMetadataErrorException(Errors) - Constructor for exception class io.kroxylicious.proxy.filter.metadata.TopLevelMetadataErrorException
+
 
+
toString() - Method in record class io.kroxylicious.authorizer.service.Action
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class io.kroxylicious.authorizer.service.AuthorizeResult
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class io.kroxylicious.kms.service.DekPair
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class io.kroxylicious.proxy.authentication.Subject
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class io.kroxylicious.proxy.authentication.User
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class io.kroxylicious.proxy.config.secret.FilePassword
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class io.kroxylicious.proxy.config.secret.InlinePassword
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class io.kroxylicious.proxy.config.tls.AllowDeny
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class io.kroxylicious.proxy.config.tls.InsecureTls
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class io.kroxylicious.proxy.config.tls.KeyPair
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class io.kroxylicious.proxy.config.tls.KeyStore
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class io.kroxylicious.proxy.config.tls.ServerOptions
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class io.kroxylicious.proxy.config.tls.Tls
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class io.kroxylicious.proxy.config.tls.TrustStore
+
+
Returns a string representation of this record class.
+
+
TransportSubjectBuilder - Interface in io.kroxylicious.proxy.authentication
+
+
Builds a Subject based on information available at the transport layer, + before any requests have been received from the client.
+
+
TransportSubjectBuilder.Context - Interface in io.kroxylicious.proxy.authentication
+
 
+
TransportSubjectBuilderService<C> - Interface in io.kroxylicious.proxy.authentication
+
+
The service interface used to construct a TransportSubjectBuilder.
+
+
trust() - Method in record class io.kroxylicious.proxy.config.tls.Tls
+
+
Returns the value of the trust record component.
+
+
trustOptions() - Method in interface io.kroxylicious.proxy.config.tls.TrustProvider
+
+
Trust options that apply to this TLS peer..
+
+
trustOptions() - Method in record class io.kroxylicious.proxy.config.tls.TrustStore
+
+
Returns the value of the trustOptions record component.
+
+
TrustOptions - Interface in io.kroxylicious.proxy.config.tls
+
 
+
TrustProvider - Interface in io.kroxylicious.proxy.config.tls
+
+
A TrustProvider is a source of trust anchors used to determine whether a certificate present by a peer is trusted.
+
+
TrustProviderVisitor<T> - Interface in io.kroxylicious.proxy.config.tls
+
+
Visitor for implementations of TrustProvider
+
+
TrustStore - Record Class in io.kroxylicious.proxy.config.tls
+
+
A TrustProvider backed by a Java Truststore.
+
+
TrustStore(String, PasswordProvider, String) - Constructor for record class io.kroxylicious.proxy.config.tls.TrustStore
+
+
A TrustProvider backed by a Java Truststore.
+
+
TrustStore(String, PasswordProvider, String, TrustOptions) - Constructor for record class io.kroxylicious.proxy.config.tls.TrustStore
+
+
Creates an instance of a TrustStore record class.
+
+
TxnOffsetCommitRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for TxnOffsetCommitRequests.
+
+
TxnOffsetCommitResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for TxnOffsetCommitResponses.
+
+
+

U

+
+
Unique - Annotation Interface in io.kroxylicious.proxy.authentication
+
+
Annotates implementations Principal which are only intended to + have a single instance present in a Subject's principals.
+
+
uniquePrincipalOfType(Class<P>) - Method in record class io.kroxylicious.proxy.authentication.Subject
+
 
+
UnknownAliasException - Exception Class in io.kroxylicious.kms.service
+
+
Thrown when a client tries to resolve a key with an alias which is not know to the KMS.
+
+
UnknownAliasException(String) - Constructor for exception class io.kroxylicious.kms.service.UnknownAliasException
+
 
+
UnknownKeyException - Exception Class in io.kroxylicious.kms.service
+
+
Thrown when a KMS instance is passed reference to key that it does not manage.
+
+
UnknownKeyException() - Constructor for exception class io.kroxylicious.kms.service.UnknownKeyException
+
 
+
UnknownKeyException(String) - Constructor for exception class io.kroxylicious.kms.service.UnknownKeyException
+
 
+
UnknownPluginInstanceException - Exception Class in io.kroxylicious.proxy.plugin
+
+
A reference to a plugin instance could not be resolved by the proxy runtime.
+
+
UnknownPluginInstanceException(String) - Constructor for exception class io.kroxylicious.proxy.plugin.UnknownPluginInstanceException
+
 
+
UnknownPluginInstanceException(String, Throwable) - Constructor for exception class io.kroxylicious.proxy.plugin.UnknownPluginInstanceException
+
 
+
UnregisterBrokerRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for UnregisterBrokerRequests.
+
+
UnregisterBrokerResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for UnregisterBrokerResponses.
+
+
UpdateFeaturesRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for UpdateFeaturesRequests.
+
+
UpdateFeaturesResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for UpdateFeaturesResponses.
+
+
UpdateRaftVoterRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for UpdateRaftVoterRequests.
+
+
UpdateRaftVoterResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for UpdateRaftVoterResponses.
+
+
User - Record Class in io.kroxylicious.proxy.authentication
+
+
A principal identifying an authenticated client.
+
+
User(String) - Constructor for record class io.kroxylicious.proxy.authentication.User
+
+
Creates an instance of a User record class.
+
+
UserFactory - Class in io.kroxylicious.proxy.authentication
+
 
+
UserFactory() - Constructor for class io.kroxylicious.proxy.authentication.UserFactory
+
 
+
Using a plugin implementation - Search tag in package io.kroxylicious.proxy.plugin
+
Section
+
+

V

+
+
value() - Element in annotation interface io.kroxylicious.proxy.plugin.PluginImplName
+
+
The class reflecting the plugin interface (e.g.
+
+
valueOf(String) - Static method in enum class io.kroxylicious.authorizer.service.Decision
+
+
Returns the enum constant of this class with the specified name.
+
+
valueOf(String) - Static method in enum class io.kroxylicious.proxy.config.tls.TlsClientAuth
+
+
Returns the enum constant of this class with the specified name.
+
+
values() - Static method in enum class io.kroxylicious.authorizer.service.Decision
+
+
Returns an array containing the constants of this enum class, in +the order they are declared.
+
+
values() - Static method in enum class io.kroxylicious.proxy.config.tls.TlsClientAuth
+
+
Returns an array containing the constants of this enum class, in +the order they are declared.
+
+
visit(InsecureTls) - Method in interface io.kroxylicious.proxy.config.tls.TrustProviderVisitor
+
 
+
visit(KeyPair) - Method in interface io.kroxylicious.proxy.config.tls.KeyProviderVisitor
+
 
+
visit(KeyStore) - Method in interface io.kroxylicious.proxy.config.tls.KeyProviderVisitor
+
 
+
visit(PlatformTrustProvider) - Method in interface io.kroxylicious.proxy.config.tls.TrustProviderVisitor
+
 
+
visit(TrustStore) - Method in interface io.kroxylicious.proxy.config.tls.TrustProviderVisitor
+
 
+
VoteRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for VoteRequests.
+
+
VoteResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for VoteResponses.
+
+
+

W

+
+
withCloseConnection() - Method in interface io.kroxylicious.proxy.filter.filterresultbuilder.CloseStage
+
+
Signals the desire of the filter that the connection is closed.
+
+
WriteShareGroupStateRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for WriteShareGroupStateRequests.
+
+
WriteShareGroupStateResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for WriteShareGroupStateResponses.
+
+
WriteTxnMarkersRequestFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for WriteTxnMarkersRequests.
+
+
WriteTxnMarkersResponseFilter - Interface in io.kroxylicious.proxy.filter
+
+
A stateless filter for WriteTxnMarkersResponses.
+
+
+A B C D E F G H I J K L M N O P R S T U V W 
All Classes and Interfaces|All Packages|Constant Field Values|Serialized Form
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/index.html b/documentation/0.20.0/javadoc/index.html new file mode 100644 index 0000000..4e7a4ac --- /dev/null +++ b/documentation/0.20.0/javadoc/index.html @@ -0,0 +1,110 @@ + + + + +Overview (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Kroxylicious API Javadoc 0.20.0 API

+
+
+
Packages
+
+
Package
+
Description
+ +
+
An abstract API for making access control decisions about Subjects + wanting to perform Actions.
+
+ +
+
Abstracts Key Management System (KMS) operations necessary for the envelope encryption pattern using Data Encryption Keys (DEKs) and Key Encryption Keys (KEKs).
+
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+ +
+
Abstraction for providing passwords to proxy configuration.
+
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+ +
+
The protocol filter API.
+
+ +
+
Builder API for constructing filter results.
+
+ +
+
APIs for resolving topic IDs to topic names and handling metadata-related errors.
+
+ +
+
API for defining plugins within configuration.
+
+ +
+
APIs for plugins that are exposed to details of TLS connections between the proxy and its network peers.
+
+
+
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/Action.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/Action.html new file mode 100644 index 0000000..5c3595d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/Action.html @@ -0,0 +1,283 @@ + + + + +Action (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class Action

+
+
java.lang.Object +
java.lang.Record +
io.kroxylicious.authorizer.service.Action
+
+
+
+
+
Record Components:
+
operation - The operation (and the resource type)
+
resourceName - The resource name
+
+
+
public record Action(ResourceType<?> operation, String resourceName) +extends Record
+
An action encapsulates an operation on a given resource identified by a name.
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      Action

      +
      public Action(ResourceType<?> operation, + String resourceName)
      +
      Creates an instance of a Action record class.
      +
      +
      Parameters:
      +
      operation - the value for the operation record component
      +
      resourceName - the value for the resourceName record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      resourceTypeClass

      +
      public Class<? extends ResourceType<?>> resourceTypeClass()
      +
      +
    • +
    • +
      +

      toString

      +
      public String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      operation

      +
      public ResourceType<?> operation()
      +
      Returns the value of the operation record component.
      +
      +
      Returns:
      +
      the value of the operation record component
      +
      +
      +
    • +
    • +
      +

      resourceName

      +
      public String resourceName()
      +
      Returns the value of the resourceName record component.
      +
      +
      Returns:
      +
      the value of the resourceName record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/AuthorizeResult.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/AuthorizeResult.html new file mode 100644 index 0000000..3ec11c7 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/AuthorizeResult.html @@ -0,0 +1,386 @@ + + + + +AuthorizeResult (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class AuthorizeResult

+
+
java.lang.Object +
java.lang.Record +
io.kroxylicious.authorizer.service.AuthorizeResult
+
+
+
+
+
Record Components:
+
subject - The subject.
+
allowed - The allowed actions.
+
denied - The denied actions.
+
+
+
public record AuthorizeResult(Subject subject, List<Action> allowed, List<Action> denied) +extends Record
+ +
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      AuthorizeResult

      +
      public AuthorizeResult(Subject subject, + List<Action> allowed, + List<Action> denied)
      +
      It is the instantiator's responsibility to ensure that allowed and denied are disjoint.
      +
      +
      Parameters:
      +
      subject - The subject.
      +
      allowed - The allowed actions.
      +
      denied - The denied actions.
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      allowed

      +
      public List<String> allowed(ResourceType<?> operation)
      +
      Returns a list of the names of all the resources which the subject() + is allowed to perform the given operation on.
      +
      +
      Parameters:
      +
      operation - The operation.
      +
      Returns:
      +
      The names of the allowed resources.
      +
      +
      +
    • +
    • +
      +

      denied

      +
      public List<String> denied(ResourceType<?> operation)
      +
      Returns a list of the names of all the resources which the subject() + is denied from performing the given operation on.
      +
      +
      Parameters:
      +
      operation - The operation.
      +
      Returns:
      +
      The names of the denied resources.
      +
      +
      +
    • +
    • +
      +

      decision

      +
      public Decision decision(ResourceType<?> operation, + String resourceName)
      +
      Returns the decision about whether the given subject() is allowed to perform the given + operation on the resource with the given resourceName.
      +
      +
      Parameters:
      +
      operation - The operation that would be performed on the resource.
      +
      resourceName - The name of the resource that the operation would be performed on.
      +
      Returns:
      +
      The decision.
      +
      +
      +
    • +
    • +
      +

      partition

      +
      public <T> Map<Decision,List<T>> partition(Collection<T> items, + ResourceType<?> operation, + Function<T,String> toName)
      +
      Partitions the given items, whose names can be obtained via the given toName function, into two lists + based on whether the subject() is allowed to perform the given operation on them.
      +
      +
      Type Parameters:
      +
      T - The type of item.
      +
      Parameters:
      +
      items - The items to partition
      +
      operation - The operation
      +
      toName - A function that returns the name of each item.
      +
      Returns:
      +
      A pair of lists of the items which the subject is allowed to, or denied from, performing the operation on. + It is guaranteed that there is always an entry for both ALLOW and DENY in the returned map.
      +
      +
      +
    • +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      subject

      +
      public Subject subject()
      +
      Returns the value of the subject record component.
      +
      +
      Returns:
      +
      the value of the subject record component
      +
      +
      +
    • +
    • +
      +

      allowed

      +
      public List<Action> allowed()
      +
      Returns the value of the allowed record component.
      +
      +
      Returns:
      +
      the value of the allowed record component
      +
      +
      +
    • +
    • +
      +

      denied

      +
      public List<Action> denied()
      +
      Returns the value of the denied record component.
      +
      +
      Returns:
      +
      the value of the denied record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/Authorizer.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/Authorizer.html new file mode 100644 index 0000000..892c39e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/Authorizer.html @@ -0,0 +1,185 @@ + + + + +Authorizer (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Authorizer

+
+
+
+
public interface Authorizer
+

Abstracts making an allow/deny decision about some Subject performing some Action on a resource. + In other words, this is an access control policy decision point.

+ +

Authorizer is a flexible abstraction, while it assumes that resources have names, it + doesn't prescribe any specific kinds of resource or operations. Instead, resource kinds and the operations they support + are represented as subclasses of ResourceType.

+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      authorize

      +
      CompletionStage<AuthorizeResult> authorize(Subject subject, + List<Action> actions)
      +
      Determines whether the given subject is allowed to perform the given actions. + The implementation must ensure that the returned authorization partitions all the given actions + between AuthorizeResult.allowed() and AuthorizeResult.denied().
      +
      +
      Parameters:
      +
      subject - The subject.
      +
      actions - The actions.
      +
      Returns:
      +
      The outcome. The returned stage should fail with an AuthorizerException if the authorizer was not able to + make a decision.
      +
      +
      +
    • +
    • +
      +

      supportedResourceTypes

      +
      Optional<Set<Class<? extends ResourceType<?>>>> supportedResourceTypes()
      +

      Returns the types of resource that this authorizer is able to make decisions about. + If this is not known to the implementation it should return an empty Optional.

      + +

      This is provided so that an access control policy enforcement point can confirm that it + is capable of providing access control to all the resource types in the access control policy + backing this authorizer.

      +
      +
      Returns:
      +
      the types of resource that this authorizer is able to make decisions about.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/AuthorizerException.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/AuthorizerException.html new file mode 100644 index 0000000..5e51768 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/AuthorizerException.html @@ -0,0 +1,182 @@ + + + + +AuthorizerException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class AuthorizerException

+
+
java.lang.Object +
java.lang.Throwable +
java.lang.Exception +
java.lang.RuntimeException +
io.kroxylicious.authorizer.service.AuthorizerException
+
+
+
+
+
+
+
All Implemented Interfaces:
+
Serializable
+
+
+
public class AuthorizerException +extends RuntimeException
+
An exception to be thrown if an Authorizer cannot be built, or is not able to make a decision.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      AuthorizerException

      +
      public AuthorizerException(String message)
      +
      +
    • +
    • +
      +

      AuthorizerException

      +
      public AuthorizerException(String message, + Throwable cause)
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/AuthorizerService.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/AuthorizerService.html new file mode 100644 index 0000000..8d69da0 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/AuthorizerService.html @@ -0,0 +1,201 @@ + + + + +AuthorizerService (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AuthorizerService<C>

+
+
+
+
Type Parameters:
+
C - The config type
+
+
+
@ThreadSafe +public interface AuthorizerService<C>
+
Service interface for Authorizers.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
    +
    Builds an Authorizer service.
    +
    +
    default void
    + +
    +
    Closes the service.
    +
    +
    void
    +
    initialize(C config)
    +
    +
    Initialises the service.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      initialize

      +
      void initialize(@UnknownNullness + C config)
      +
      Initialises the service. This method must be invoked exactly once + before build() is called.
      +
      +
      Parameters:
      +
      config - Service configuration
      +
      Throws:
      +
      AuthorizerException - If the service could not be initialized
      +
      +
      +
    • +
    • +
      +

      build

      +
      @NonNull +Authorizer build() + throws IllegalStateException
      +
      Builds an Authorizer service. + initialize(C) must have been called before this method is invoked.
      +
      +
      Returns:
      +
      the authorizer
      +
      Throws:
      +
      IllegalStateException - if the service has not been initialised or the service is closed.
      +
      AuthorizerException - If the authorizer could not be built
      +
      +
      +
    • +
    • +
      +

      close

      +
      default void close()
      +
      Closes the service. Once the service is closed, the building of new instances or the + continued use of previously built instances is not allowed. The effect using an instance + after the service that created it is closed is undefined. +
      + Implementations of this method must be idempotent. +
      + Close implementations must tolerate the closing of service that has not been initialized or + one for which initialization did not fully complete without further exception.
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/Decision.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/Decision.html new file mode 100644 index 0000000..64f2412 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/Decision.html @@ -0,0 +1,244 @@ + + + + +Decision (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Enum Class Decision

+
+
java.lang.Object +
java.lang.Enum<Decision> +
io.kroxylicious.authorizer.service.Decision
+
+
+
+
+
All Implemented Interfaces:
+
Serializable, Comparable<Decision>, Constable
+
+
+
public enum Decision +extends Enum<Decision>
+
An authorization decision about whether a particular subject is allowed to perform a + specific operation on a particular resource.
+
+
+ +
+
+
    + +
  • +
    +

    Enum Constant Details

    +
      +
    • +
      +

      ALLOW

      +
      public static final Decision ALLOW
      +
      The subject is allowed to perform the operation on the resource.
      +
      +
    • +
    • +
      +

      DENY

      +
      public static final Decision DENY
      +
      The subject is not allowed to perform the operation on the resource.
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      values

      +
      public static Decision[] values()
      +
      Returns an array containing the constants of this enum class, in +the order they are declared.
      +
      +
      Returns:
      +
      an array containing the constants of this enum class, in the order they are declared
      +
      +
      +
    • +
    • +
      +

      valueOf

      +
      public static Decision valueOf(String name)
      +
      Returns the enum constant of this class with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this class. (Extraneous whitespace characters are +not permitted.)
      +
      +
      Parameters:
      +
      name - the name of the enum constant to be returned.
      +
      Returns:
      +
      the enum constant with the specified name
      +
      Throws:
      +
      IllegalArgumentException - if this enum class has no constant with the specified name
      +
      NullPointerException - if the argument is null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/ResourceType.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/ResourceType.html new file mode 100644 index 0000000..f5da8e0 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/ResourceType.html @@ -0,0 +1,165 @@ + + + + +ResourceType (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ResourceType<S extends Enum<S> & ResourceType<S>>

+
+
+
+
Type Parameters:
+
S - The self type.
+
+
+
public interface ResourceType<S extends Enum<S> & ResourceType<S>>
+
A ResourceType is an enum of the possible operations on a resource of a particular type. + We use a one-enum-per-resource-type pattern so that the Class an implementation also + serves to identify the resource type. + For this reason, implementations of this interface should be named for the type of resource + (for example Topic, or ConsumerGroup) rather than the operations + enumerated (so not TopicOperations or ConsumerGroupOperations). + The elements of the enumeration are typically verbs, such as READ, + WRITE, DELETE, CREATE, and so on.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    default Set<S>
    + +
    +
    Returns a set of operations that are implied by this operation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      implies

      +
      default Set<S> implies()
      +
      Returns a set of operations that are implied by this operation. + This must return the complete transitive closure of all such implied operations. + In other words, if logically speaking A implies B, and B implies C then + programmatically speaking A.implies() must contain both B and C.
      +
      +
      Returns:
      +
      The operations that are implied by this operation.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/Action.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/Action.html new file mode 100644 index 0000000..2b9d172 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/Action.html @@ -0,0 +1,122 @@ + + + + +Uses of Record Class io.kroxylicious.authorizer.service.Action (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
io.kroxylicious.authorizer.service.Action

+
+
Packages that use Action
+
+
Package
+
Description
+ +
+
An abstract API for making access control decisions about Subjects + wanting to perform Actions.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/AuthorizeResult.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/AuthorizeResult.html new file mode 100644 index 0000000..b0820ea --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/AuthorizeResult.html @@ -0,0 +1,93 @@ + + + + +Uses of Record Class io.kroxylicious.authorizer.service.AuthorizeResult (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
io.kroxylicious.authorizer.service.AuthorizeResult

+
+
Packages that use AuthorizeResult
+
+
Package
+
Description
+ +
+
An abstract API for making access control decisions about Subjects + wanting to perform Actions.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/Authorizer.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/Authorizer.html new file mode 100644 index 0000000..63d8eba --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/Authorizer.html @@ -0,0 +1,92 @@ + + + + +Uses of Interface io.kroxylicious.authorizer.service.Authorizer (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.authorizer.service.Authorizer

+
+
Packages that use Authorizer
+
+
Package
+
Description
+ +
+
An abstract API for making access control decisions about Subjects + wanting to perform Actions.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/AuthorizerException.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/AuthorizerException.html new file mode 100644 index 0000000..959f6ee --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/AuthorizerException.html @@ -0,0 +1,62 @@ + + + + +Uses of Class io.kroxylicious.authorizer.service.AuthorizerException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.authorizer.service.AuthorizerException

+
+No usage of io.kroxylicious.authorizer.service.AuthorizerException
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/AuthorizerService.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/AuthorizerService.html new file mode 100644 index 0000000..b24c155 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/AuthorizerService.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.authorizer.service.AuthorizerService (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.authorizer.service.AuthorizerService

+
+No usage of io.kroxylicious.authorizer.service.AuthorizerService
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/Decision.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/Decision.html new file mode 100644 index 0000000..17c7781 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/Decision.html @@ -0,0 +1,119 @@ + + + + +Uses of Enum Class io.kroxylicious.authorizer.service.Decision (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Enum Class
io.kroxylicious.authorizer.service.Decision

+
+
Packages that use Decision
+
+
Package
+
Description
+ +
+
An abstract API for making access control decisions about Subjects + wanting to perform Actions.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/ResourceType.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/ResourceType.html new file mode 100644 index 0000000..9dccae1 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/class-use/ResourceType.html @@ -0,0 +1,162 @@ + + + + +Uses of Interface io.kroxylicious.authorizer.service.ResourceType (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.authorizer.service.ResourceType

+
+
Packages that use ResourceType
+
+
Package
+
Description
+ +
+
An abstract API for making access control decisions about Subjects + wanting to perform Actions.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/package-summary.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/package-summary.html new file mode 100644 index 0000000..69bc968 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/package-summary.html @@ -0,0 +1,137 @@ + + + + +io.kroxylicious.authorizer.service (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Package io.kroxylicious.authorizer.service

+
+
+
@ReturnValuesAreNonnullByDefault +@DefaultAnnotationForParameters(edu.umd.cs.findbugs.annotations.NonNull.class) +@DefaultAnnotation(edu.umd.cs.findbugs.annotations.NonNull.class) +package io.kroxylicious.authorizer.service
+
+

An abstract API for making access control decisions about Subjects + wanting to perform Actions.

+ +

The AuthorizerService interface is implemented by + service providers using the ServiceLoader mechanism. + An instance of AuthorizerService is a factory for + an Authorizer, which makes the access control decision.

+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/package-tree.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/package-tree.html new file mode 100644 index 0000000..47ae052 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/package-tree.html @@ -0,0 +1,125 @@ + + + + +io.kroxylicious.authorizer.service Class Hierarchy (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package io.kroxylicious.authorizer.service

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Interface Hierarchy

+ +
+
+

Enum Class Hierarchy

+ +
+
+

Record Class Hierarchy

+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/package-use.html b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/package-use.html new file mode 100644 index 0000000..5fa7260 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/authorizer/service/package-use.html @@ -0,0 +1,106 @@ + + + + +Uses of Package io.kroxylicious.authorizer.service (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
io.kroxylicious.authorizer.service

+
+ +
+
Package
+
Description
+ +
+
An abstract API for making access control decisions about Subjects + wanting to perform Actions.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/DekPair.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/DekPair.html new file mode 100644 index 0000000..e03b60c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/DekPair.html @@ -0,0 +1,284 @@ + + + + +DekPair (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class DekPair<E>

+
+
java.lang.Object +
java.lang.Record +
io.kroxylicious.kms.service.DekPair<E>
+
+
+
+
+
Type Parameters:
+
E - The type of encrypted DEK.
+
Record Components:
+
edek - The encrypted DEK.
+
dek - The plaintext DEK.
+
+
+
public record DekPair<E>(E edek, SecretKey dek) +extends Record
+

A Data Encryption Key as both plaintext and encrypted.

+ +

Note: It is strongly recommended that the implementation of SecretKey used for + dek overrides Destroyable.destroy() to actually destroy the key material. + DestroyableRawSecretKey provides such an implementation for use by implementers.

+
+
+
    + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    DekPair(E edek, + SecretKey dek)
    +
    +
    Creates an instance of a DekPair record class.
    +
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    dek()
    +
    +
    Returns the value of the dek record component.
    +
    + + +
    +
    Returns the value of the edek record component.
    +
    +
    final boolean
    + +
    +
    Indicates whether some other object is "equal to" this one.
    +
    +
    final int
    + +
    +
    Returns a hash code value for this object.
    +
    +
    final String
    + +
    +
    Returns a string representation of this record class.
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      DekPair

      +
      public DekPair(@NonNull + E edek, + @NonNull + SecretKey dek)
      +
      Creates an instance of a DekPair record class.
      +
      +
      Parameters:
      +
      edek - the value for the edek record component
      +
      dek - the value for the dek record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      edek

      +
      @NonNull +public E edek()
      +
      Returns the value of the edek record component.
      +
      +
      Returns:
      +
      the value of the edek record component
      +
      +
      +
    • +
    • +
      +

      dek

      +
      @NonNull +public SecretKey dek()
      +
      Returns the value of the dek record component.
      +
      +
      Returns:
      +
      the value of the dek record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/DestroyableRawSecretKey.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/DestroyableRawSecretKey.html new file mode 100644 index 0000000..8c7f4b5 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/DestroyableRawSecretKey.html @@ -0,0 +1,325 @@ + + + + +DestroyableRawSecretKey (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class DestroyableRawSecretKey

+
+
java.lang.Object +
io.kroxylicious.kms.service.DestroyableRawSecretKey
+
+
+
+
All Implemented Interfaces:
+
Serializable, Key, SecretKey, Destroyable
+
+
+
@NotThreadSafe +public final class DestroyableRawSecretKey +extends Object +implements SecretKey
+
A SecretKey that has RAW encoding and can be destroyed + (unlike SecretKeySpec).
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      numKeyBits

      +
      public int numKeyBits()
      +
      +
      Returns:
      +
      The number of bits in this key
      +
      +
      +
    • +
    • +
      +

      takeOwnershipOf

      +
      @NonNull +public static DestroyableRawSecretKey takeOwnershipOf(@NonNull + byte[] bytes, + @NonNull + String algorithm)
      +
      Create a new key by becoming owner of the given key material. + The caller should not modify the given bytes after calling this method.
      +
      +
      Parameters:
      +
      bytes - The key material
      +
      algorithm - The key algorithm
      +
      Returns:
      +
      The new key
      +
      +
      +
    • +
    • +
      +

      takeCopyOf

      +
      @NonNull +public static DestroyableRawSecretKey takeCopyOf(@NonNull + byte[] bytes, + @NonNull + String algorithm)
      +
      Create a new key by creating a copy of the given key material.
      +
      +
      Parameters:
      +
      bytes - The key material
      +
      algorithm - The key algorithm
      +
      Returns:
      +
      The new key
      +
      +
      +
    • +
    • +
      +

      toDestroyableKey

      +
      @NonNull +public static DestroyableRawSecretKey toDestroyableKey(@NonNull + SecretKey source)
      +
      Convert the given key to a destroyable key, attempting to destroy the given key.
      +
      +
      Parameters:
      +
      source - The key to convert
      +
      Returns:
      +
      The new destroyable key.
      +
      +
      +
    • +
    • +
      +

      getAlgorithm

      +
      @NonNull +public String getAlgorithm()
      +
      +
      Specified by:
      +
      getAlgorithm in interface Key
      +
      +
      +
    • +
    • +
      +

      getFormat

      +
      @NonNull +public String getFormat()
      +
      +
      Specified by:
      +
      getFormat in interface Key
      +
      +
      +
    • +
    • +
      +

      getEncoded

      +
      @NonNull +public byte[] getEncoded()
      +
      Returns the RAW-encoded key. + This is a copy the key. It is the caller's responsibility to destroy this key material + when it's no longer needed.
      +
      +
      Specified by:
      +
      getEncoded in interface Key
      +
      Returns:
      +
      The RAW-encoded key.
      +
      Throws:
      +
      IllegalStateException - if the key has been destroyed
      +
      +
      +
    • +
    • +
      +

      destroy

      +
      public void destroy()
      +
      +
      Specified by:
      +
      destroy in interface Destroyable
      +
      +
      +
    • +
    • +
      +

      isDestroyed

      +
      public boolean isDestroyed()
      +
      +
      Specified by:
      +
      isDestroyed in interface Destroyable
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/InvalidKeyUsageException.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/InvalidKeyUsageException.html new file mode 100644 index 0000000..3b59da5 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/InvalidKeyUsageException.html @@ -0,0 +1,178 @@ + + + + +InvalidKeyUsageException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class InvalidKeyUsageException

+
+ +
+
+
All Implemented Interfaces:
+
Serializable
+
+
+
public class InvalidKeyUsageException +extends KmsException
+
Thrown when a KMS-managed key is passed to an operation that is incompatible with its allowed key usage. + E.g. when a key intended to be used for signing/verifying key, is passed used in a key wrapping operation.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      InvalidKeyUsageException

      +
      public InvalidKeyUsageException()
      +
      Initializes a new instance.
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/Kms.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/Kms.html new file mode 100644 index 0000000..cf2e1ef --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/Kms.html @@ -0,0 +1,238 @@ + + + + +Kms (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Kms<K,E>

+
+
+
+
Type Parameters:
+
K - The type of Key Encryption Key id.
+
E - The type of encrypted Data Encryption Key.
+
+
+
public interface Kms<K,E>
+
Abstracts the KMS operations needed for Envelope Encryption
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      generateDekPair

      +
      @NonNull +CompletionStage<DekPair<E>> generateDekPair(@NonNull + K kekRef)
      +
      Asynchronously generates a new Data Encryption Key (DEK) and returns it together with the same DEK wrapped by the Key Encryption Key (KEK) given + by the kekRef, + The returned encrypted DEK can later be decrypted with decryptEdek(Object). It is expected that + the returned EDEK contains everything required for decryption including an immutable reference to the KEK
      +
      +
      Parameters:
      +
      kekRef - The key encryption key used to encrypt the generated data encryption key.
      +
      Returns:
      +
      A completion stage for the wrapped data encryption key.
      +
      Throws:
      +
      UnknownKeyException - If the kek was not known to this KMS.
      +
      InvalidKeyUsageException - If the given kek was not intended for key wrapping.
      +
      KmsException - For other exceptions.
      +
      +
      +
    • +
    • +
      +

      decryptEdek

      +
      @NonNull +CompletionStage<SecretKey> decryptEdek(@NonNull + E edek)
      +

      Asynchronously decrypts a data encryption key that was previously encrypted.

      + +

      Note: It is strongly recommended that the implementation of SecretKey returned in the CompletionStage + overrides Destroyable.destroy() to actually destroy the key material. + DestroyableRawSecretKey provides such an implementation for use by implementers.

      +
      +
      Parameters:
      +
      edek - The encrypted data encryption key.
      +
      Returns:
      +
      A completion stage for the data encryption key
      +
      Throws:
      +
      UnknownKeyException - If the edek was not encrypted by a KEK known to this KMS.
      +
      InvalidKeyUsageException - If the edek refers to a kek that was not intended for key wrapping.
      +
      KmsException - For other exceptions
      +
      +
      +
    • +
    • +
      +

      edekSerde

      +
      @NonNull +Serde<E> edekSerde()
      +
      Get a serializer for encrypted DEKs. + It is required that deserialize(serialize(edek)).equals(edek).
      +
      +
      Returns:
      +
      a serializer for encrypted DEKs.
      +
      +
      +
    • +
    • +
      +

      resolveAlias

      +
      @NonNull +CompletionStage<K> resolveAlias(@NonNull + String alias)
      +
      Asynchronously resolve an alias to a key id
      +
      +
      Parameters:
      +
      alias - The alias
      +
      Returns:
      +
      A completion stage for the key id.
      +
      Throws:
      +
      UnknownAliasException - If the alias does not resolve to a key in this KMS.
      +
      KmsException - For other exceptions.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/KmsException.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/KmsException.html new file mode 100644 index 0000000..63e6953 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/KmsException.html @@ -0,0 +1,202 @@ + + + + +KmsException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class KmsException

+
+
java.lang.Object +
java.lang.Throwable +
java.lang.Exception +
java.lang.RuntimeException +
io.kroxylicious.kms.service.KmsException
+
+
+
+
+
+
+
All Implemented Interfaces:
+
Serializable
+
+
+
Direct Known Subclasses:
+
InvalidKeyUsageException, UnknownAliasException, UnknownKeyException
+
+
+
public class KmsException +extends RuntimeException
+
Represents problems interacting with a Key Management System.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      KmsException

      +
      public KmsException()
      +
      +
    • +
    • +
      +

      KmsException

      +
      public KmsException(Throwable cause)
      +
      +
    • +
    • +
      +

      KmsException

      +
      public KmsException(String message)
      +
      +
    • +
    • +
      +

      KmsException

      +
      public KmsException(String message, + Throwable cause)
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/KmsService.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/KmsService.html new file mode 100644 index 0000000..2c83157 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/KmsService.html @@ -0,0 +1,208 @@ + + + + +KmsService (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface KmsService<C,K,E>

+
+
+
+
Type Parameters:
+
C - The config type
+
K - The key reference
+
E - The type of encrypted DEK
+
+
+
All Superinterfaces:
+
AutoCloseable
+
+
+
@ThreadSafe +public interface KmsService<C,K,E> +extends AutoCloseable
+
Service interface for KMSs
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
    +
    Builds a KMS service.
    +
    +
    default void
    + +
    +
    Closes the service.
    +
    +
    void
    +
    initialize(C config)
    +
    +
    Initialises the service.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      initialize

      +
      void initialize(C config)
      +
      Initialises the service. This method must be invoked exactly once + before buildKms() is called.
      +
      +
      Parameters:
      +
      config - KMS service configuration
      +
      +
      +
    • +
    • +
      +

      buildKms

      +
      @NonNull +Kms<K,E> buildKms() + throws IllegalStateException
      +
      Builds a KMS service. + initialize(C) must have been called before this method is invoked.
      +
      +
      Returns:
      +
      the KMS.
      +
      Throws:
      +
      IllegalStateException - if the KMS Service has not been initialised or the KMS service is closed.
      +
      +
      +
    • +
    • +
      +

      close

      +
      default void close()
      +
      Closes the service. Once the service is closed, the building of new Kms or the + continued use of previously built Kmss is not allowed. The affect using a Kms + after the service that created it is closed is undefined. +
      + Implementations of this method must be idempotent. +
      + Close implementations must tolerate the closing of service that has not been initialized or + one for which initialization did not fully complete without further exception.
      +
      +
      Specified by:
      +
      close in interface AutoCloseable
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/Serde.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/Serde.html new file mode 100644 index 0000000..2189ab5 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/Serde.html @@ -0,0 +1,260 @@ + + + + +Serde (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Serde<T>

+
+
+
+
Type Parameters:
+
T - The type of the object that can be (de)serialized.
+
+
+
public interface Serde<T>
+
ByteBuffer-sympathetic serialization and deserialization of objects.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
    +
    Deserialize an instance of T from the given buffer.
    +
    +
    static short
    + +
    +
    Read a single byte from the buffer's position and return it as a value in the range 0-255.
    +
    +
    static void
    +
    putUnsignedByte(ByteBuffer buffer, + int unsignedByte)
    +
    +
    Write a value in the range 0-255 as a single byte at the buffer's current Buffer.position().
    +
    +
    void
    +
    serialize(T object, + ByteBuffer buffer)
    +
    +
    Serializes the given object to the given buffer.
    +
    +
    int
    +
    sizeOf(T object)
    +
    +
    Returns the number of bytes required to serialize the given object.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      putUnsignedByte

      +
      static void putUnsignedByte(@NonNull + ByteBuffer buffer, + int unsignedByte)
      +
      Write a value in the range 0-255 as a single byte at the buffer's current Buffer.position(). + The buffer's position will be incremented by 1.
      +
      +
      Parameters:
      +
      buffer - The buffer to write to
      +
      unsignedByte - The value, which must be in the range [0, 255], which is not checked by this method.
      +
      Throws:
      +
      BufferOverflowException - If this buffer's current position is not smaller than its limit.
      +
      ReadOnlyBufferException - If this buffer is read-only.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      sizeOf

      +
      int sizeOf(T object)
      +
      Returns the number of bytes required to serialize the given object.
      +
      +
      Parameters:
      +
      object - The object to be serialized.
      +
      Returns:
      +
      the number of bytes required to serialize the given object.
      +
      +
      +
    • +
    • +
      +

      serialize

      +
      void serialize(T object, + @NonNull + ByteBuffer buffer)
      +
      Serializes the given object to the given buffer.
      +
      +
      Parameters:
      +
      object - The object to be serialized.
      +
      buffer - the buffer to serialize the object to.
      +
      Throws:
      +
      BufferOverflowException - If this buffer's current position is not smaller than its limit. + This should never be the case if the buffer has at least sizeOf(object) bytes remaining.
      +
      ReadOnlyBufferException - If this buffer is read-only.
      +
      +
      +
    • +
    • +
      +

      getUnsignedByte

      +
      static short getUnsignedByte(@NonNull + ByteBuffer buffer)
      +
      Read a single byte from the buffer's position and return it as a value in the range 0-255. + The buffer's position will be incremented by 1.
      +
      +
      Parameters:
      +
      buffer - The buffer to read from.
      +
      Returns:
      +
      The value, which will be in the range [0, 255].
      +
      Throws:
      +
      BufferUnderflowException - If the buffer's current position is not smaller than its limit.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      deserialize

      +
      T deserialize(@NonNull + ByteBuffer buffer)
      +
      Deserialize an instance of T from the given buffer.
      +
      +
      Parameters:
      +
      buffer - The buffer.
      +
      Returns:
      +
      The instance, which in general could be null.
      +
      Throws:
      +
      BufferUnderflowException - If the buffer's current position is not smaller than its limit..
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/UnknownAliasException.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/UnknownAliasException.html new file mode 100644 index 0000000..bcbf89a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/UnknownAliasException.html @@ -0,0 +1,174 @@ + + + + +UnknownAliasException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class UnknownAliasException

+
+ +
+
+
All Implemented Interfaces:
+
Serializable
+
+
+
public class UnknownAliasException +extends KmsException
+
Thrown when a client tries to resolve a key with an alias which is not know to the KMS.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      UnknownAliasException

      +
      public UnknownAliasException(String alias)
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/UnknownKeyException.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/UnknownKeyException.html new file mode 100644 index 0000000..522ce13 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/UnknownKeyException.html @@ -0,0 +1,182 @@ + + + + +UnknownKeyException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class UnknownKeyException

+
+ +
+
+
All Implemented Interfaces:
+
Serializable
+
+
+
public class UnknownKeyException +extends KmsException
+
Thrown when a KMS instance is passed reference to key that it does not manage.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      UnknownKeyException

      +
      public UnknownKeyException()
      +
      +
    • +
    • +
      +

      UnknownKeyException

      +
      public UnknownKeyException(String message)
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/DekPair.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/DekPair.html new file mode 100644 index 0000000..8ee53a4 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/DekPair.html @@ -0,0 +1,93 @@ + + + + +Uses of Record Class io.kroxylicious.kms.service.DekPair (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
io.kroxylicious.kms.service.DekPair

+
+
Packages that use DekPair
+
+
Package
+
Description
+ +
+
Abstracts Key Management System (KMS) operations necessary for the envelope encryption pattern using Data Encryption Keys (DEKs) and Key Encryption Keys (KEKs).
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/DestroyableRawSecretKey.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/DestroyableRawSecretKey.html new file mode 100644 index 0000000..7677a69 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/DestroyableRawSecretKey.html @@ -0,0 +1,103 @@ + + + + +Uses of Class io.kroxylicious.kms.service.DestroyableRawSecretKey (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.kms.service.DestroyableRawSecretKey

+
+
Packages that use DestroyableRawSecretKey
+
+
Package
+
Description
+ +
+
Abstracts Key Management System (KMS) operations necessary for the envelope encryption pattern using Data Encryption Keys (DEKs) and Key Encryption Keys (KEKs).
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/InvalidKeyUsageException.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/InvalidKeyUsageException.html new file mode 100644 index 0000000..fe05163 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/InvalidKeyUsageException.html @@ -0,0 +1,62 @@ + + + + +Uses of Class io.kroxylicious.kms.service.InvalidKeyUsageException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.kms.service.InvalidKeyUsageException

+
+No usage of io.kroxylicious.kms.service.InvalidKeyUsageException
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/Kms.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/Kms.html new file mode 100644 index 0000000..142487a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/Kms.html @@ -0,0 +1,91 @@ + + + + +Uses of Interface io.kroxylicious.kms.service.Kms (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.kms.service.Kms

+
+
Packages that use Kms
+
+
Package
+
Description
+ +
+
Abstracts Key Management System (KMS) operations necessary for the envelope encryption pattern using Data Encryption Keys (DEKs) and Key Encryption Keys (KEKs).
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/KmsException.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/KmsException.html new file mode 100644 index 0000000..bc06b81 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/KmsException.html @@ -0,0 +1,101 @@ + + + + +Uses of Class io.kroxylicious.kms.service.KmsException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.kms.service.KmsException

+
+
Packages that use KmsException
+
+
Package
+
Description
+ +
+
Abstracts Key Management System (KMS) operations necessary for the envelope encryption pattern using Data Encryption Keys (DEKs) and Key Encryption Keys (KEKs).
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/KmsService.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/KmsService.html new file mode 100644 index 0000000..ab925c1 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/KmsService.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.kms.service.KmsService (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.kms.service.KmsService

+
+No usage of io.kroxylicious.kms.service.KmsService
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/Serde.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/Serde.html new file mode 100644 index 0000000..83f9366 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/Serde.html @@ -0,0 +1,91 @@ + + + + +Uses of Interface io.kroxylicious.kms.service.Serde (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.kms.service.Serde

+
+
Packages that use Serde
+
+
Package
+
Description
+ +
+
Abstracts Key Management System (KMS) operations necessary for the envelope encryption pattern using Data Encryption Keys (DEKs) and Key Encryption Keys (KEKs).
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/UnknownAliasException.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/UnknownAliasException.html new file mode 100644 index 0000000..be703e7 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/UnknownAliasException.html @@ -0,0 +1,62 @@ + + + + +Uses of Class io.kroxylicious.kms.service.UnknownAliasException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.kms.service.UnknownAliasException

+
+No usage of io.kroxylicious.kms.service.UnknownAliasException
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/UnknownKeyException.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/UnknownKeyException.html new file mode 100644 index 0000000..d716ac9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/class-use/UnknownKeyException.html @@ -0,0 +1,62 @@ + + + + +Uses of Class io.kroxylicious.kms.service.UnknownKeyException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.kms.service.UnknownKeyException

+
+No usage of io.kroxylicious.kms.service.UnknownKeyException
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/package-summary.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/package-summary.html new file mode 100644 index 0000000..78c96d3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/package-summary.html @@ -0,0 +1,141 @@ + + + + +io.kroxylicious.kms.service (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Package io.kroxylicious.kms.service

+
+
+
@ReturnValuesAreNonnullByDefault +@DefaultAnnotationForParameters(edu.umd.cs.findbugs.annotations.NonNull.class) +@DefaultAnnotation(edu.umd.cs.findbugs.annotations.NonNull.class) +package io.kroxylicious.kms.service
+
+

Abstracts Key Management System (KMS) operations necessary for the envelope encryption pattern using Data Encryption Keys (DEKs) and Key Encryption Keys (KEKs).

+

The Kms interface provides methods for generating DEKs, + encrypting them with KEKs, and later decrypting encrypted DEKs (edeks).

+
+
+
    +
  • +
    +
    +
    +
    +
    Class
    +
    Description
    + +
    +
    A Data Encryption Key as both plaintext and encrypted.
    +
    + +
    +
    A SecretKey that has RAW encoding and can be destroyed + (unlike SecretKeySpec).
    +
    + +
    +
    Thrown when a KMS-managed key is passed to an operation that is incompatible with its allowed key usage.
    +
    +
    Kms<K,E>
    +
    +
    Abstracts the KMS operations needed for Envelope Encryption
    +
    + +
    +
    Represents problems interacting with a Key Management System.
    +
    +
    KmsService<C,K,E>
    +
    +
    Service interface for KMSs
    +
    + +
    +
    ByteBuffer-sympathetic serialization and deserialization of objects.
    +
    + +
    +
    Thrown when a client tries to resolve a key with an alias which is not know to the KMS.
    +
    + +
    +
    Thrown when a KMS instance is passed reference to key that it does not manage.
    +
    +
    +
    +
    +
  • +
+
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/package-tree.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/package-tree.html new file mode 100644 index 0000000..02162a4 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/package-tree.html @@ -0,0 +1,121 @@ + + + + +io.kroxylicious.kms.service Class Hierarchy (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package io.kroxylicious.kms.service

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Interface Hierarchy

+
    +
  • java.lang.AutoCloseable + +
  • +
  • io.kroxylicious.kms.service.Kms<K,E>
  • +
  • io.kroxylicious.kms.service.Serde<T>
  • +
+
+
+

Record Class Hierarchy

+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/package-use.html b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/package-use.html new file mode 100644 index 0000000..8228620 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/kms/service/package-use.html @@ -0,0 +1,105 @@ + + + + +Uses of Package io.kroxylicious.kms.service (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
io.kroxylicious.kms.service

+
+
Packages that use io.kroxylicious.kms.service
+
+
Package
+
Description
+ +
+
Abstracts Key Management System (KMS) operations necessary for the envelope encryption pattern using Data Encryption Keys (DEKs) and Key Encryption Keys (KEKs).
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/ClientSaslContext.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/ClientSaslContext.html new file mode 100644 index 0000000..43689af --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/ClientSaslContext.html @@ -0,0 +1,168 @@ + + + + +ClientSaslContext (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ClientSaslContext

+
+
+
+
public interface ClientSaslContext
+
Exposes SASL authentication information to plugins, for example using FilterContext.clientSaslContext(). + This is implemented by the runtime for use by plugins.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
    +
    Returns the client's authorizationId that resulted from the SASL exchange.
    +
    + + +
    +
    The name of the SASL mechanism used.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      mechanismName

      +
      String mechanismName()
      +
      The name of the SASL mechanism used.
      +
      +
      Returns:
      +
      The name of the SASL mechanism used.
      +
      +
      +
    • +
    • +
      +

      authorizationId

      +
      String authorizationId()
      +
      Returns the client's authorizationId that resulted from the SASL exchange.
      +
      +
      Returns:
      +
      the client's authorizationId.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/Principal.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/Principal.html new file mode 100644 index 0000000..20df872 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/Principal.html @@ -0,0 +1,152 @@ + + + + +Principal (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Principal

+
+
+
+
All Known Implementing Classes:
+
User
+
+
+
public interface Principal
+

An identifier held by a Subject.

+ +

Implementations must override hashCode() and equals(Object) such + instances are equal if, and only if, they have the same implementation class and their names that are the same + (according to equals()). One easy way to achieve this is to use a record class with a single name component.

+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      name

      +
      String name()
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/PrincipalFactory.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/PrincipalFactory.html new file mode 100644 index 0000000..9662445 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/PrincipalFactory.html @@ -0,0 +1,147 @@ + + + + +PrincipalFactory (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface PrincipalFactory<P extends Principal>

+
+
+
+
All Known Implementing Classes:
+
UserFactory
+
+
+
public interface PrincipalFactory<P extends Principal>
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      newPrincipal

      +
      P newPrincipal(String name)
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/SaslSubjectBuilder.Context.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/SaslSubjectBuilder.Context.html new file mode 100644 index 0000000..45cfef0 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/SaslSubjectBuilder.Context.html @@ -0,0 +1,165 @@ + + + + +SaslSubjectBuilder.Context (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface SaslSubjectBuilder.Context

+
+
+
+
Enclosing interface:
+
SaslSubjectBuilder
+
+
+
public static interface SaslSubjectBuilder.Context
+
The context that's passed to SaslSubjectBuilder.buildSaslSubject(Context).
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      clientTlsContext

      +
      Optional<ClientTlsContext> clientTlsContext()
      +
      +
      Returns:
      +
      The TLS context for the client connection, or empty if the client connection is not TLS.
      +
      +
      +
    • +
    • +
      +

      clientSaslContext

      +
      ClientSaslContext clientSaslContext()
      +
      +
      Returns:
      +
      The SASL context for the client connection.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/SaslSubjectBuilder.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/SaslSubjectBuilder.html new file mode 100644 index 0000000..8a7102d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/SaslSubjectBuilder.html @@ -0,0 +1,188 @@ + + + + +SaslSubjectBuilder (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface SaslSubjectBuilder

+
+
+
+
public interface SaslSubjectBuilder
+

Builds a Subject based on information available from a successful SASL authentication.

+ +

A SaslSubjectBuilder instance is constructed by a SaslSubjectBuilderService.

+ +

A SASL-authenticating Filter + may use a SaslSubjectBuilder in order to construct the + Subject with which it calls + FilterContext.clientSaslAuthenticationSuccess(String, Subject). + As such, SaslSubjectBuilder is an opt-in way of decoupling the building of Subjects + from the mechanism of SASL authentication. + SASL-authenticating filters are not obliged to use this abstraction.

+ +

TransportSubjectBuilder is a similar interface use for building a + Subject based on transport-layer information. + However, note that a SaslSubjectBuilder is not specified directly + on a virtual cluster as a TransportSubjectBuilder is.

+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      buildSaslSubject

      + +
      Returns an asynchronous result which completes with the Subject built + from the given context.
      +
      +
      Parameters:
      +
      context - The context of a successful SASL authentication.
      +
      Returns:
      +
      The Subject. The returned stage should fail with an SubjectBuildingException if the builder was not able to + build a subject.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/SaslSubjectBuilderService.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/SaslSubjectBuilderService.html new file mode 100644 index 0000000..bce40ba --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/SaslSubjectBuilderService.html @@ -0,0 +1,170 @@ + + + + +SaslSubjectBuilderService (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface SaslSubjectBuilderService<C>

+
+
+
+
All Superinterfaces:
+
AutoCloseable
+
+
+
public interface SaslSubjectBuilderService<C> +extends AutoCloseable
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
     
    +
    default void
    + +
     
    +
    void
    +
    initialize(C config)
    +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      initialize

      +
      void initialize(C config)
      +
      +
    • +
    • +
      +

      build

      + +
      +
    • +
    • +
      +

      close

      +
      default void close()
      +
      +
      Specified by:
      +
      close in interface AutoCloseable
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/Subject.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/Subject.html new file mode 100644 index 0000000..2665683 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/Subject.html @@ -0,0 +1,309 @@ + + + + +Subject (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class Subject

+
+
java.lang.Object +
java.lang.Record +
io.kroxylicious.proxy.authentication.Subject
+
+
+
+
+
Record Components:
+
principals -
+
+
+
public record Subject(Set<Principal> principals) +extends Record
+

Represents an actor in the system. + Subjects are composed of a possibly-empty set of identifiers represented as Principal instances. + An anonymous actor is represented by a Subject with an empty set of principals. + As a convenience, anonymous() returns such a subject. +

+ +

The principals included in a subject might comprise the following:

+
    +
  • information proven by a client, such as a SASL authorized id,
  • +
  • information known about the client, such as the remote peer's IP address,
  • +
  • information obtained about the client from a trusted source, such as lookup up role or group information from a directory.
  • +
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      Subject

      +
      public Subject(Principal... principals)
      +
      +
    • +
    • +
      +

      Subject

      +
      public Subject(Set<Principal> principals)
      +
      Creates an instance of a Subject record class.
      +
      +
      Parameters:
      +
      principals - the value for the principals record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      anonymous

      +
      public static Subject anonymous()
      +
      +
    • +
    • +
      +

      uniquePrincipalOfType

      +
      public <P extends Principal> Optional<P> uniquePrincipalOfType(Class<P> uniquePrincipalType)
      +
      +
    • +
    • +
      +

      isAnonymous

      +
      public boolean isAnonymous()
      +
      +
    • +
    • +
      +

      allPrincipalsOfType

      +
      public <P extends Principal> Set<P> allPrincipalsOfType(Class<P> principalType)
      +
      +
    • +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      principals

      +
      public Set<Principal> principals()
      +
      Returns the value of the principals record component.
      +
      +
      Returns:
      +
      the value of the principals record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/SubjectBuildingException.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/SubjectBuildingException.html new file mode 100644 index 0000000..555178e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/SubjectBuildingException.html @@ -0,0 +1,182 @@ + + + + +SubjectBuildingException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class SubjectBuildingException

+
+
java.lang.Object +
java.lang.Throwable +
java.lang.Exception +
java.lang.RuntimeException +
io.kroxylicious.proxy.authentication.SubjectBuildingException
+
+
+
+
+
+
+
All Implemented Interfaces:
+
Serializable
+
+
+
public class SubjectBuildingException +extends RuntimeException
+
An exception to be thrown if a Subject cannot be built.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      SubjectBuildingException

      +
      public SubjectBuildingException(String message)
      +
      +
    • +
    • +
      +

      SubjectBuildingException

      +
      public SubjectBuildingException(String message, + Throwable cause)
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/TransportSubjectBuilder.Context.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/TransportSubjectBuilder.Context.html new file mode 100644 index 0000000..d4143d9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/TransportSubjectBuilder.Context.html @@ -0,0 +1,151 @@ + + + + +TransportSubjectBuilder.Context (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface TransportSubjectBuilder.Context

+
+
+
+
Enclosing interface:
+
TransportSubjectBuilder
+
+
+
public static interface TransportSubjectBuilder.Context
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      clientTlsContext

      +
      Optional<ClientTlsContext> clientTlsContext()
      +
      +
      Returns:
      +
      The TLS context for the client connection, or empty if the client connection is not TLS.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/TransportSubjectBuilder.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/TransportSubjectBuilder.html new file mode 100644 index 0000000..29e7166 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/TransportSubjectBuilder.html @@ -0,0 +1,177 @@ + + + + +TransportSubjectBuilder (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface TransportSubjectBuilder

+
+
+
+
public interface TransportSubjectBuilder
+

Builds a Subject based on information available at the transport layer, + before any requests have been received from the client.

+ +

A TransportSubjectBuilder instance is constructed by a TransportSubjectBuilderService, + which in turn is specified on a virtual cluster.

+ +

See SaslSubjectBuilder for a similar interface use for building a Subject based on SASL authentication.

+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      buildTransportSubject

      +
      CompletionStage<Subject> buildTransportSubject(TransportSubjectBuilder.Context context)
      +
      Returns an asynchronous result which completes with the Subject built + from the given context.
      +
      +
      Parameters:
      +
      context - The context of the connection.
      +
      Returns:
      +
      The Subject. The returned stage should fail with an SubjectBuildingException if the builder was not able to + build a subject.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/TransportSubjectBuilderService.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/TransportSubjectBuilderService.html new file mode 100644 index 0000000..df78390 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/TransportSubjectBuilderService.html @@ -0,0 +1,176 @@ + + + + +TransportSubjectBuilderService (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface TransportSubjectBuilderService<C>

+
+
+
+
Type Parameters:
+
C - The configuration type consumed by the particular TransportSubjectBuilder implementation.
+
+
+
All Superinterfaces:
+
AutoCloseable
+
+
+
public interface TransportSubjectBuilderService<C> +extends AutoCloseable
+
The service interface used to construct a TransportSubjectBuilder.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
     
    +
    default void
    + +
     
    +
    void
    +
    initialize(C config)
    +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      initialize

      +
      void initialize(@UnknownNullness + C config)
      +
      +
    • +
    • +
      +

      build

      + +
      +
    • +
    • +
      +

      close

      +
      default void close()
      +
      +
      Specified by:
      +
      close in interface AutoCloseable
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/Unique.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/Unique.html new file mode 100644 index 0000000..85c81a4 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/Unique.html @@ -0,0 +1,105 @@ + + + + +Unique (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Annotation Interface Unique

+
+
+
+
@Retention(RUNTIME) +@Target(TYPE) +public @interface Unique
+

Annotates implementations Principal which are only intended to + have a single instance present in a Subject's principals.

+ +

Annotated classes may then be used with Subject.uniquePrincipalOfType(Class).

+
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/User.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/User.html new file mode 100644 index 0000000..0558a92 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/User.html @@ -0,0 +1,263 @@ + + + + +User (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class User

+
+
java.lang.Object +
java.lang.Record +
io.kroxylicious.proxy.authentication.User
+
+
+
+
+
Record Components:
+
name - The name of the user.
+
+
+
All Implemented Interfaces:
+
Principal
+
+
+
public record User(String name) +extends Record +implements Principal
+
A principal identifying an authenticated client. + It is currently required to use this principal to represent clients that have authenticated via + TLS or SASL.
+
+
+
    + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    User(String name)
    +
    +
    Creates an instance of a User record class.
    +
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    final boolean
    + +
    +
    Indicates whether some other object is "equal to" this one.
    +
    +
    final int
    + +
    +
    Returns a hash code value for this object.
    +
    + + +
    +
    Returns the value of the name record component.
    +
    +
    final String
    + +
    +
    Returns a string representation of this record class.
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      User

      +
      public User(String name)
      +
      Creates an instance of a User record class.
      +
      +
      Parameters:
      +
      name - the value for the name record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      name

      +
      public String name()
      +
      Returns the value of the name record component.
      +
      +
      Specified by:
      +
      name in interface Principal
      +
      Returns:
      +
      the value of the name record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/UserFactory.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/UserFactory.html new file mode 100644 index 0000000..70a17ab --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/UserFactory.html @@ -0,0 +1,186 @@ + + + + +UserFactory (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class UserFactory

+
+
java.lang.Object +
io.kroxylicious.proxy.authentication.UserFactory
+
+
+
+
All Implemented Interfaces:
+
PrincipalFactory<User>
+
+
+
public class UserFactory +extends Object +implements PrincipalFactory<User>
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      UserFactory

      +
      public UserFactory()
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    + +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/ClientSaslContext.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/ClientSaslContext.html new file mode 100644 index 0000000..3217cdd --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/ClientSaslContext.html @@ -0,0 +1,107 @@ + + + + +Uses of Interface io.kroxylicious.proxy.authentication.ClientSaslContext (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.authentication.ClientSaslContext

+
+
Packages that use ClientSaslContext
+
+
Package
+
Description
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+ +
+
The protocol filter API.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/Principal.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/Principal.html new file mode 100644 index 0000000..5413c7c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/Principal.html @@ -0,0 +1,143 @@ + + + + +Uses of Interface io.kroxylicious.proxy.authentication.Principal (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.authentication.Principal

+
+
Packages that use Principal
+
+
Package
+
Description
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/PrincipalFactory.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/PrincipalFactory.html new file mode 100644 index 0000000..19a30e4 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/PrincipalFactory.html @@ -0,0 +1,89 @@ + + + + +Uses of Interface io.kroxylicious.proxy.authentication.PrincipalFactory (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.authentication.PrincipalFactory

+
+
Packages that use PrincipalFactory
+
+
Package
+
Description
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/SaslSubjectBuilder.Context.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/SaslSubjectBuilder.Context.html new file mode 100644 index 0000000..b60ec0d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/SaslSubjectBuilder.Context.html @@ -0,0 +1,92 @@ + + + + +Uses of Interface io.kroxylicious.proxy.authentication.SaslSubjectBuilder.Context (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.authentication.SaslSubjectBuilder.Context

+
+
Packages that use SaslSubjectBuilder.Context
+
+
Package
+
Description
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/SaslSubjectBuilder.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/SaslSubjectBuilder.html new file mode 100644 index 0000000..c7b818b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/SaslSubjectBuilder.html @@ -0,0 +1,89 @@ + + + + +Uses of Interface io.kroxylicious.proxy.authentication.SaslSubjectBuilder (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.authentication.SaslSubjectBuilder

+
+
Packages that use SaslSubjectBuilder
+
+
Package
+
Description
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/SaslSubjectBuilderService.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/SaslSubjectBuilderService.html new file mode 100644 index 0000000..e5797d1 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/SaslSubjectBuilderService.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.authentication.SaslSubjectBuilderService (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.authentication.SaslSubjectBuilderService

+
+No usage of io.kroxylicious.proxy.authentication.SaslSubjectBuilderService
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/Subject.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/Subject.html new file mode 100644 index 0000000..08c1a0d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/Subject.html @@ -0,0 +1,186 @@ + + + + +Uses of Record Class io.kroxylicious.proxy.authentication.Subject (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
io.kroxylicious.proxy.authentication.Subject

+
+
Packages that use Subject
+
+
Package
+
Description
+ +
+
An abstract API for making access control decisions about Subjects + wanting to perform Actions.
+
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+ +
+
The protocol filter API.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/SubjectBuildingException.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/SubjectBuildingException.html new file mode 100644 index 0000000..39b6ce1 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/SubjectBuildingException.html @@ -0,0 +1,62 @@ + + + + +Uses of Class io.kroxylicious.proxy.authentication.SubjectBuildingException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.proxy.authentication.SubjectBuildingException

+
+No usage of io.kroxylicious.proxy.authentication.SubjectBuildingException
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/TransportSubjectBuilder.Context.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/TransportSubjectBuilder.Context.html new file mode 100644 index 0000000..b60b089 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/TransportSubjectBuilder.Context.html @@ -0,0 +1,92 @@ + + + + +Uses of Interface io.kroxylicious.proxy.authentication.TransportSubjectBuilder.Context (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.authentication.TransportSubjectBuilder.Context

+
+ +
+
Package
+
Description
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/TransportSubjectBuilder.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/TransportSubjectBuilder.html new file mode 100644 index 0000000..6acab81 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/TransportSubjectBuilder.html @@ -0,0 +1,89 @@ + + + + +Uses of Interface io.kroxylicious.proxy.authentication.TransportSubjectBuilder (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.authentication.TransportSubjectBuilder

+
+
Packages that use TransportSubjectBuilder
+
+
Package
+
Description
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/TransportSubjectBuilderService.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/TransportSubjectBuilderService.html new file mode 100644 index 0000000..1e28285 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/TransportSubjectBuilderService.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.authentication.TransportSubjectBuilderService (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.authentication.TransportSubjectBuilderService

+
+No usage of io.kroxylicious.proxy.authentication.TransportSubjectBuilderService
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/Unique.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/Unique.html new file mode 100644 index 0000000..80aba70 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/Unique.html @@ -0,0 +1,91 @@ + + + + +Uses of Annotation Interface io.kroxylicious.proxy.authentication.Unique (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Annotation Interface
io.kroxylicious.proxy.authentication.Unique

+
+
Packages that use Unique
+
+
Package
+
Description
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/User.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/User.html new file mode 100644 index 0000000..b953a91 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/User.html @@ -0,0 +1,89 @@ + + + + +Uses of Record Class io.kroxylicious.proxy.authentication.User (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
io.kroxylicious.proxy.authentication.User

+
+
Packages that use User
+
+
Package
+
Description
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/UserFactory.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/UserFactory.html new file mode 100644 index 0000000..488f814 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/class-use/UserFactory.html @@ -0,0 +1,62 @@ + + + + +Uses of Class io.kroxylicious.proxy.authentication.UserFactory (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.proxy.authentication.UserFactory

+
+No usage of io.kroxylicious.proxy.authentication.UserFactory
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/package-summary.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/package-summary.html new file mode 100644 index 0000000..7384f52 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/package-summary.html @@ -0,0 +1,152 @@ + + + + +io.kroxylicious.proxy.authentication (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Package io.kroxylicious.proxy.authentication

+
+
+
@ReturnValuesAreNonnullByDefault +@DefaultAnnotationForParameters(edu.umd.cs.findbugs.annotations.NonNull.class) +@DefaultAnnotation(edu.umd.cs.findbugs.annotations.NonNull.class) +package io.kroxylicious.proxy.authentication
+
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/package-tree.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/package-tree.html new file mode 100644 index 0000000..19b0949 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/package-tree.html @@ -0,0 +1,128 @@ + + + + +io.kroxylicious.proxy.authentication Class Hierarchy (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package io.kroxylicious.proxy.authentication

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Interface Hierarchy

+ +
+
+

Annotation Interface Hierarchy

+
    +
  • io.kroxylicious.proxy.authentication.Unique (implements java.lang.annotation.Annotation)
  • +
+
+
+

Record Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • java.lang.Record +
        +
      • io.kroxylicious.proxy.authentication.Subject
      • +
      • io.kroxylicious.proxy.authentication.User (implements io.kroxylicious.proxy.authentication.Principal)
      • +
      +
    • +
    +
  • +
+
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/package-use.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/package-use.html new file mode 100644 index 0000000..bf79bc3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/authentication/package-use.html @@ -0,0 +1,161 @@ + + + + +Uses of Package io.kroxylicious.proxy.authentication (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
io.kroxylicious.proxy.authentication

+
+ +
+
Package
+
Description
+ +
+
An abstract API for making access control decisions about Subjects + wanting to perform Actions.
+
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+ +
+
The protocol filter API.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/FilePassword.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/FilePassword.html new file mode 100644 index 0000000..61c11ab --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/FilePassword.html @@ -0,0 +1,274 @@ + + + + +FilePassword (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class FilePassword

+
+
java.lang.Object +
java.lang.Record +
io.kroxylicious.proxy.config.secret.FilePassword
+
+
+
+
+
Record Components:
+
passwordFile - file containing the password.
+
+
+
All Implemented Interfaces:
+
PasswordProvider
+
+
+
public record FilePassword(String passwordFile) +extends Record +implements PasswordProvider
+
A reference to the file containing a nonempty plain text password in UTF-8 encoding. If the password file + contains more than one line, only the characters of the first line are taken to be the password, + excluding the line ending. Subsequent lines are ignored.
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      FilePassword

      +
      public FilePassword(String passwordFile)
      +
      Creates an instance of a FilePassword record class.
      +
      +
      Parameters:
      +
      passwordFile - the value for the passwordFile record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getProvidedPassword

      +
      public String getProvidedPassword()
      +
      +
      Specified by:
      +
      getProvidedPassword in interface PasswordProvider
      +
      +
      +
    • +
    • +
      +

      toString

      +
      public String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      passwordFile

      +
      public String passwordFile()
      +
      Returns the value of the passwordFile record component.
      +
      +
      Returns:
      +
      the value of the passwordFile record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/InlinePassword.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/InlinePassword.html new file mode 100644 index 0000000..9bf88f3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/InlinePassword.html @@ -0,0 +1,273 @@ + + + + +InlinePassword (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class InlinePassword

+
+
java.lang.Object +
java.lang.Record +
io.kroxylicious.proxy.config.secret.InlinePassword
+
+
+
+
+
Record Components:
+
password - the password
+
+
+
All Implemented Interfaces:
+
PasswordProvider
+
+
+
public record InlinePassword(String password) +extends Record +implements PasswordProvider
+
A password expressed directly in the model, in plain text. + Not recommended for production use.
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      InlinePassword

      +
      public InlinePassword(String password)
      +
      Creates an instance of a InlinePassword record class.
      +
      +
      Parameters:
      +
      password - the value for the password record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getProvidedPassword

      +
      public String getProvidedPassword()
      +
      +
      Specified by:
      +
      getProvidedPassword in interface PasswordProvider
      +
      +
      +
    • +
    • +
      +

      toString

      +
      public String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      password

      +
      public String password()
      +
      Returns the value of the password record component.
      +
      +
      Returns:
      +
      the value of the password record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/PasswordProvider.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/PasswordProvider.html new file mode 100644 index 0000000..7c8fc72 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/PasswordProvider.html @@ -0,0 +1,148 @@ + + + + +PasswordProvider (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface PasswordProvider

+
+
+
+
All Known Implementing Classes:
+
FilePassword, InlinePassword
+
+
+
public interface PasswordProvider
+
A PasswordProvider is an abstract source of a password.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getProvidedPassword

      +
      String getProvidedPassword()
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/class-use/FilePassword.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/class-use/FilePassword.html new file mode 100644 index 0000000..47db389 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/class-use/FilePassword.html @@ -0,0 +1,62 @@ + + + + +Uses of Record Class io.kroxylicious.proxy.config.secret.FilePassword (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
io.kroxylicious.proxy.config.secret.FilePassword

+
+No usage of io.kroxylicious.proxy.config.secret.FilePassword
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/class-use/InlinePassword.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/class-use/InlinePassword.html new file mode 100644 index 0000000..9e8e9d9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/class-use/InlinePassword.html @@ -0,0 +1,62 @@ + + + + +Uses of Record Class io.kroxylicious.proxy.config.secret.InlinePassword (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
io.kroxylicious.proxy.config.secret.InlinePassword

+
+No usage of io.kroxylicious.proxy.config.secret.InlinePassword
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/class-use/PasswordProvider.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/class-use/PasswordProvider.html new file mode 100644 index 0000000..a193f73 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/class-use/PasswordProvider.html @@ -0,0 +1,167 @@ + + + + +Uses of Interface io.kroxylicious.proxy.config.secret.PasswordProvider (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.config.secret.PasswordProvider

+
+
Packages that use PasswordProvider
+
+
Package
+
Description
+ +
+
Abstraction for providing passwords to proxy configuration.
+
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/package-summary.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/package-summary.html new file mode 100644 index 0000000..ad6de04 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/package-summary.html @@ -0,0 +1,117 @@ + + + + +io.kroxylicious.proxy.config.secret (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Package io.kroxylicious.proxy.config.secret

+
+
+
@ReturnValuesAreNonnullByDefault +@DefaultAnnotationForParameters(edu.umd.cs.findbugs.annotations.NonNull.class) +@DefaultAnnotation(edu.umd.cs.findbugs.annotations.NonNull.class) +package io.kroxylicious.proxy.config.secret
+
+

Abstraction for providing passwords to proxy configuration.

+

PasswordProvider implementations allow + passwords to be sourced from different locations (inline in configuration, external files). + This enables separation of sensitive data from configuration files.

+
+
+
    +
  • +
    +
    +
    +
    +
    Class
    +
    Description
    + +
    +
    A reference to the file containing a nonempty plain text password in UTF-8 encoding.
    +
    + +
    +
    A password expressed directly in the model, in plain text.
    +
    + +
    +
    A PasswordProvider is an abstract source of a password.
    +
    +
    +
    +
    +
  • +
+
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/package-tree.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/package-tree.html new file mode 100644 index 0000000..24fa6de --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/package-tree.html @@ -0,0 +1,87 @@ + + + + +io.kroxylicious.proxy.config.secret Class Hierarchy (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package io.kroxylicious.proxy.config.secret

+
+Package Hierarchies: + +
+

Interface Hierarchy

+ +
+
+

Record Class Hierarchy

+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/package-use.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/package-use.html new file mode 100644 index 0000000..c30fac6 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/secret/package-use.html @@ -0,0 +1,105 @@ + + + + +Uses of Package io.kroxylicious.proxy.config.secret (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
io.kroxylicious.proxy.config.secret

+
+ +
+
Package
+
Description
+ +
+
Abstraction for providing passwords to proxy configuration.
+
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/AllowDeny.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/AllowDeny.html new file mode 100644 index 0000000..1e8458f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/AllowDeny.html @@ -0,0 +1,278 @@ + + + + +AllowDeny (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class AllowDeny<T>

+
+
java.lang.Object +
java.lang.Record +
io.kroxylicious.proxy.config.tls.AllowDeny<T>
+
+
+
+
+
Record Components:
+
allowed - specifies a list of allowed objects ordered by preference.
+
denied - specifies a set of denied objects.
+
+
+
public record AllowDeny<T>(List<T> allowed, Set<T> denied) +extends Record
+
Class to keep track of allow and deny lists meant for use when building context for SSLEngine.
+
+
+
    + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    AllowDeny(List<T> allowed, + Set<T> denied)
    +
    +
    Creates an instance of a AllowDeny record class.
    +
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
    +
    Returns the value of the allowed record component.
    +
    + + +
    +
    Returns the value of the denied record component.
    +
    +
    final boolean
    + +
    +
    Indicates whether some other object is "equal to" this one.
    +
    +
    final int
    + +
    +
    Returns a hash code value for this object.
    +
    +
    final String
    + +
    +
    Returns a string representation of this record class.
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      AllowDeny

      +
      public AllowDeny(@Nullable + List<T> allowed, + @Nullable + Set<T> denied)
      +
      Creates an instance of a AllowDeny record class.
      +
      +
      Parameters:
      +
      allowed - the value for the allowed record component
      +
      denied - the value for the denied record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      allowed

      +
      @Nullable +public List<T> allowed()
      +
      Returns the value of the allowed record component.
      +
      +
      Returns:
      +
      the value of the allowed record component
      +
      +
      +
    • +
    • +
      +

      denied

      +
      @Nullable +public Set<T> denied()
      +
      Returns the value of the denied record component.
      +
      +
      Returns:
      +
      the value of the denied record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/InsecureTls.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/InsecureTls.html new file mode 100644 index 0000000..fa00439 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/InsecureTls.html @@ -0,0 +1,282 @@ + + + + +InsecureTls (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class InsecureTls

+
+
java.lang.Object +
java.lang.Record +
io.kroxylicious.proxy.config.tls.InsecureTls
+
+
+
+
+
Record Components:
+
insecure - true if trust is disabled. If false, platform trust is used.
+
+
+
All Implemented Interfaces:
+
TrustProvider
+
+
+
public record InsecureTls(boolean insecure) +extends Record +implements TrustProvider
+
A TrustProvider that allows the disabling trust verification. + Not recommended for production use.
+
+
+
    + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    InsecureTls(boolean insecure)
    +
    +
    Creates an instance of a InsecureTls record class.
    +
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    <T> T
    + +
    +
    Visits the trust provider TrustProviderVisitor.
    +
    +
    final boolean
    + +
    +
    Indicates whether some other object is "equal to" this one.
    +
    +
    final int
    + +
    +
    Returns a hash code value for this object.
    +
    +
    boolean
    + +
    +
    Returns the value of the insecure record component.
    +
    +
    final String
    + +
    +
    Returns a string representation of this record class.
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    +
    +

    Methods inherited from interface io.kroxylicious.proxy.config.tls.TrustProvider

    +trustOptions
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      InsecureTls

      +
      public InsecureTls(boolean insecure)
      +
      Creates an instance of a InsecureTls record class.
      +
      +
      Parameters:
      +
      insecure - the value for the insecure record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      accept

      +
      public <T> T accept(TrustProviderVisitor<T> visitor)
      +
      Description copied from interface: TrustProvider
      +
      Visits the trust provider TrustProviderVisitor. Implementor should call one `visit` method on visitor.
      +
      +
      Specified by:
      +
      accept in interface TrustProvider
      +
      Parameters:
      +
      visitor - visitor.
      +
      +
      +
    • +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with '=='.
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      insecure

      +
      public boolean insecure()
      +
      Returns the value of the insecure record component.
      +
      +
      Returns:
      +
      the value of the insecure record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/KeyPair.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/KeyPair.html new file mode 100644 index 0000000..7fda66d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/KeyPair.html @@ -0,0 +1,323 @@ + + + + +KeyPair (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class KeyPair

+
+
java.lang.Object +
java.lang.Record +
io.kroxylicious.proxy.config.tls.KeyPair
+
+
+
+
+
Record Components:
+
privateKeyFile - location of a file containing the private key.
+
certificateFile - location of a file containing the certificate and intermediates.
+
keyPasswordProvider - provider for the privateKeyFile password or null if key does not require a password
+
+
+
All Implemented Interfaces:
+
KeyProvider
+
+
+
public record KeyPair(String privateKeyFile, String certificateFile, PasswordProvider keyPasswordProvider) +extends Record +implements KeyProvider
+
A KeyProvider backed by a private-key/certificate pair expressed in PEM format. +
+ Note that support for PKCS-8 private keys is derived from the JDK. PKCS-1 private keys are only supported if Bouncy Castle + is available on the classpath.
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      KeyPair

      +
      public KeyPair(String privateKeyFile, + String certificateFile, + @Nullable + PasswordProvider keyPasswordProvider)
      +
      Creates an instance of a KeyPair record class.
      +
      +
      Parameters:
      +
      privateKeyFile - the value for the privateKeyFile record component
      +
      certificateFile - the value for the certificateFile record component
      +
      keyPasswordProvider - the value for the keyPasswordProvider record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      accept

      +
      public <T> T accept(KeyProviderVisitor<T> visitor)
      +
      Description copied from interface: KeyProvider
      +
      Visits the trust provider KeyProviderVisitor. Implementor should call one `visit` method on visitor.
      +
      +
      Specified by:
      +
      accept in interface KeyProvider
      +
      Parameters:
      +
      visitor - visitor.
      +
      +
      +
    • +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      privateKeyFile

      +
      public String privateKeyFile()
      +
      Returns the value of the privateKeyFile record component.
      +
      +
      Returns:
      +
      the value of the privateKeyFile record component
      +
      +
      +
    • +
    • +
      +

      certificateFile

      +
      public String certificateFile()
      +
      Returns the value of the certificateFile record component.
      +
      +
      Returns:
      +
      the value of the certificateFile record component
      +
      +
      +
    • +
    • +
      +

      keyPasswordProvider

      +
      @Nullable +public PasswordProvider keyPasswordProvider()
      +
      Returns the value of the keyPasswordProvider record component.
      +
      +
      Returns:
      +
      the value of the keyPasswordProvider record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/KeyProvider.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/KeyProvider.html new file mode 100644 index 0000000..055454c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/KeyProvider.html @@ -0,0 +1,161 @@ + + + + +KeyProvider (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface KeyProvider

+
+
+
+
All Known Implementing Classes:
+
KeyPair, KeyStore
+
+
+
public interface KeyProvider
+
A KeyProvider is a source of a TLS private-key/certificate pair and optionally intermediate certificate(s). +
    +
  • In the TLS server role, it is used to provide the certificate presented by the TLS server. + In the server role a KeyProvider is mandatory.
  • +
  • In the TLS client role, it is used for TLS client authentication so that the client can + identify itself to the server.
  • +
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    <T> T
    + +
    +
    Visits the trust provider KeyProviderVisitor.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      accept

      +
      <T> T accept(KeyProviderVisitor<T> visitor)
      +
      Visits the trust provider KeyProviderVisitor. Implementor should call one `visit` method on visitor.
      +
      +
      Parameters:
      +
      visitor - visitor.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/KeyProviderVisitor.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/KeyProviderVisitor.html new file mode 100644 index 0000000..8ac9e48 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/KeyProviderVisitor.html @@ -0,0 +1,157 @@ + + + + +KeyProviderVisitor (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface KeyProviderVisitor<T>

+
+
+
+
Type Parameters:
+
T - result type of the visit
+
+
+
public interface KeyProviderVisitor<T>
+
Visitor for implementations of KeyProvider
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    visit(KeyPair keyPair)
    +
     
    + +
    visit(KeyStore keyStore)
    +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      visit

      +
      T visit(KeyPair keyPair)
      +
      +
    • +
    • +
      +

      visit

      +
      T visit(KeyStore keyStore)
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/KeyStore.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/KeyStore.html new file mode 100644 index 0000000..e472dbf --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/KeyStore.html @@ -0,0 +1,361 @@ + + + + +KeyStore (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class KeyStore

+
+
java.lang.Object +
java.lang.Record +
io.kroxylicious.proxy.config.tls.KeyStore
+
+
+
+
+
Record Components:
+
storeFile - location of a key store, or reference to a PEM file containing both private-key and certificate/intermediates.
+
storePasswordProvider - provider for the store password or null if store does not require a password.
+
keyPasswordProvider - provider for the key password. if null the password obtained from the storePasswordProvider will be used to decrypt the key.
+
storeType - specifies the server key type. Legal values are those types supported by the platform KeyStore, + and PEM (for X-509 certificates express in PEM format).
+
+
+
All Implemented Interfaces:
+
KeyProvider
+
+
+
public record KeyStore(String storeFile, PasswordProvider storePasswordProvider, PasswordProvider keyPasswordProvider, String storeType) +extends Record +implements KeyProvider
+
A KeyProvider backed by a Java Truststore.
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      KeyStore

      +
      public KeyStore(String storeFile, + @Nullable + PasswordProvider storePasswordProvider, + @Nullable + PasswordProvider keyPasswordProvider, + String storeType)
      +
      Creates an instance of a KeyStore record class.
      +
      +
      Parameters:
      +
      storeFile - the value for the storeFile record component
      +
      storePasswordProvider - the value for the storePasswordProvider record component
      +
      keyPasswordProvider - the value for the keyPasswordProvider record component
      +
      storeType - the value for the storeType record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getType

      +
      public String getType()
      +
      +
    • +
    • +
      +

      isPemType

      +
      public boolean isPemType()
      +
      +
    • +
    • +
      +

      accept

      +
      public <T> T accept(KeyProviderVisitor<T> visitor)
      +
      Description copied from interface: KeyProvider
      +
      Visits the trust provider KeyProviderVisitor. Implementor should call one `visit` method on visitor.
      +
      +
      Specified by:
      +
      accept in interface KeyProvider
      +
      Parameters:
      +
      visitor - visitor.
      +
      +
      +
    • +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      storeFile

      +
      public String storeFile()
      +
      Returns the value of the storeFile record component.
      +
      +
      Returns:
      +
      the value of the storeFile record component
      +
      +
      +
    • +
    • +
      +

      storePasswordProvider

      +
      @Nullable +public PasswordProvider storePasswordProvider()
      +
      Returns the value of the storePasswordProvider record component.
      +
      +
      Returns:
      +
      the value of the storePasswordProvider record component
      +
      +
      +
    • +
    • +
      +

      keyPasswordProvider

      +
      @Nullable +public PasswordProvider keyPasswordProvider()
      +
      Returns the value of the keyPasswordProvider record component.
      +
      +
      Returns:
      +
      the value of the keyPasswordProvider record component
      +
      +
      +
    • +
    • +
      +

      storeType

      +
      public String storeType()
      +
      Returns the value of the storeType record component.
      +
      +
      Returns:
      +
      the value of the storeType record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/PlatformTrustProvider.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/PlatformTrustProvider.html new file mode 100644 index 0000000..254e1d6 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/PlatformTrustProvider.html @@ -0,0 +1,197 @@ + + + + +PlatformTrustProvider (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class PlatformTrustProvider

+
+
java.lang.Object +
io.kroxylicious.proxy.config.tls.PlatformTrustProvider
+
+
+
+
All Implemented Interfaces:
+
TrustProvider
+
+
+
public class PlatformTrustProvider +extends Object +implements TrustProvider
+
+
+ +
+
+ +
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/ServerOptions.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/ServerOptions.html new file mode 100644 index 0000000..0e27390 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/ServerOptions.html @@ -0,0 +1,270 @@ + + + + +ServerOptions (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class ServerOptions

+
+
java.lang.Object +
java.lang.Record +
io.kroxylicious.proxy.config.tls.ServerOptions
+
+
+
+
+
All Implemented Interfaces:
+
TrustOptions
+
+
+
public record ServerOptions(TlsClientAuth clientAuth) +extends Record +implements TrustOptions
+
Options that control TLS negotiation when in server mode.
+
+
+
    + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    + +
    +
    Creates an instance of a ServerOptions record class.
    +
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
    +
    Returns the value of the clientAuth record component.
    +
    +
    final boolean
    + +
    +
    Indicates whether some other object is "equal to" this one.
    +
    +
    boolean
    + +
     
    +
    final int
    + +
    +
    Returns a hash code value for this object.
    +
    +
    final String
    + +
    +
    Returns a string representation of this record class.
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      ServerOptions

      +
      public ServerOptions(@Nullable + TlsClientAuth clientAuth)
      +
      Creates an instance of a ServerOptions record class.
      +
      +
      Parameters:
      +
      clientAuth - the value for the clientAuth record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      forClient

      +
      public boolean forClient()
      +
      +
      Specified by:
      +
      forClient in interface TrustOptions
      +
      +
      +
    • +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      clientAuth

      +
      @Nullable +public TlsClientAuth clientAuth()
      +
      Returns the value of the clientAuth record component.
      +
      +
      Returns:
      +
      the value of the clientAuth record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/Tls.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/Tls.html new file mode 100644 index 0000000..f8d4c19 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/Tls.html @@ -0,0 +1,378 @@ + + + + +Tls (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class Tls

+
+
java.lang.Object +
java.lang.Record +
io.kroxylicious.proxy.config.tls.Tls
+
+
+
+
+
Record Components:
+
key - specifies a key provider that provides the certificate/key used to identify this peer.
+
trust - specifies a trust provider used by this peer to determine whether to trust the peer. If omitted platform trust is used instead.
+
cipherSuites - specifies a custom object which contains details of allowed and denied cipher suites
+
protocols - specifies a custom object which contains details of allowed and denied tls protocols
+
+
+
public record Tls(KeyProvider key, TrustProvider trust, AllowDeny<String> cipherSuites, AllowDeny<String> protocols) +extends Record
+
Provides TLS configuration for this peer. This class is designed to be used for both TLS server and client roles.
+
+
+ +
+
+
    + +
  • +
    +

    Field Details

    + +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      Tls

      +
      public Tls(@Nullable + KeyProvider key, + @Nullable + TrustProvider trust, + @Nullable + AllowDeny<String> cipherSuites, + @Nullable + AllowDeny<String> protocols)
      +
      Creates an instance of a Tls record class.
      +
      +
      Parameters:
      +
      key - the value for the key record component
      +
      trust - the value for the trust record component
      +
      cipherSuites - the value for the cipherSuites record component
      +
      protocols - the value for the protocols record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getStoreTypeOrPlatformDefault

      +
      public static String getStoreTypeOrPlatformDefault(@Nullable + String storeType)
      +
      +
    • +
    • +
      +

      definesKey

      +
      public boolean definesKey()
      +
      +
    • +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      key

      +
      @Nullable +public KeyProvider key()
      +
      Returns the value of the key record component.
      +
      +
      Returns:
      +
      the value of the key record component
      +
      +
      +
    • +
    • +
      +

      trust

      +
      @Nullable +public TrustProvider trust()
      +
      Returns the value of the trust record component.
      +
      +
      Returns:
      +
      the value of the trust record component
      +
      +
      +
    • +
    • +
      +

      cipherSuites

      +
      @Nullable +public AllowDeny<String> cipherSuites()
      +
      Returns the value of the cipherSuites record component.
      +
      +
      Returns:
      +
      the value of the cipherSuites record component
      +
      +
      +
    • +
    • +
      +

      protocols

      +
      @Nullable +public AllowDeny<String> protocols()
      +
      Returns the value of the protocols record component.
      +
      +
      Returns:
      +
      the value of the protocols record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TlsClientAuth.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TlsClientAuth.html new file mode 100644 index 0000000..bfc04cd --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TlsClientAuth.html @@ -0,0 +1,244 @@ + + + + +TlsClientAuth (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Enum Class TlsClientAuth

+
+
java.lang.Object +
java.lang.Enum<TlsClientAuth> +
io.kroxylicious.proxy.config.tls.TlsClientAuth
+
+
+
+
+
All Implemented Interfaces:
+
Serializable, Comparable<TlsClientAuth>, Constable
+
+
+
public enum TlsClientAuth +extends Enum<TlsClientAuth>
+
+
+ +
+
+
    + +
  • +
    +

    Enum Constant Details

    + +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      values

      +
      public static TlsClientAuth[] values()
      +
      Returns an array containing the constants of this enum class, in +the order they are declared.
      +
      +
      Returns:
      +
      an array containing the constants of this enum class, in the order they are declared
      +
      +
      +
    • +
    • +
      +

      valueOf

      +
      public static TlsClientAuth valueOf(String name)
      +
      Returns the enum constant of this class with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this class. (Extraneous whitespace characters are +not permitted.)
      +
      +
      Parameters:
      +
      name - the name of the enum constant to be returned.
      +
      Returns:
      +
      the enum constant with the specified name
      +
      Throws:
      +
      IllegalArgumentException - if this enum class has no constant with the specified name
      +
      NullPointerException - if the argument is null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TrustOptions.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TrustOptions.html new file mode 100644 index 0000000..38d4c7b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TrustOptions.html @@ -0,0 +1,147 @@ + + + + +TrustOptions (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface TrustOptions

+
+
+
+
All Known Implementing Classes:
+
ServerOptions
+
+
+
public interface TrustOptions
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    boolean
    + +
     
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      forClient

      +
      boolean forClient()
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TrustProvider.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TrustProvider.html new file mode 100644 index 0000000..f320d26 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TrustProvider.html @@ -0,0 +1,178 @@ + + + + +TrustProvider (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface TrustProvider

+
+
+
+
All Known Implementing Classes:
+
InsecureTls, PlatformTrustProvider, TrustStore
+
+
+
public interface TrustProvider
+
A TrustProvider is a source of trust anchors used to determine whether a certificate present by a peer is trusted. +
    +
  • In the TLS client role, it is used to validate that the server's certificate is trusted. If the + trust provider is omitted platform trust is used instead.
  • +
  • In the TLS server role, when the TLS client authentication is in use, it is used by the server to + ensure that the client's certificate is known.
  • +
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      accept

      +
      <T> T accept(TrustProviderVisitor<T> visitor)
      +
      Visits the trust provider TrustProviderVisitor. Implementor should call one `visit` method on visitor.
      +
      +
      Parameters:
      +
      visitor - visitor.
      +
      +
      +
    • +
    • +
      +

      trustOptions

      +
      @Nullable +default TrustOptions trustOptions()
      +
      Trust options that apply to this TLS peer..
      +
      +
      Returns:
      +
      trust options
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TrustProviderVisitor.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TrustProviderVisitor.html new file mode 100644 index 0000000..540263a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TrustProviderVisitor.html @@ -0,0 +1,166 @@ + + + + +TrustProviderVisitor (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface TrustProviderVisitor<T>

+
+
+
+
Type Parameters:
+
T - result type of the visit
+
+
+
public interface TrustProviderVisitor<T>
+
Visitor for implementations of TrustProvider
+
+
+ +
+
+ +
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TrustStore.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TrustStore.html new file mode 100644 index 0000000..3cc2926 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/TrustStore.html @@ -0,0 +1,387 @@ + + + + +TrustStore (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Record Class TrustStore

+
+
java.lang.Object +
java.lang.Record +
io.kroxylicious.proxy.config.tls.TrustStore
+
+
+
+
+
Record Components:
+
storeFile - location of a key store, or reference to a PEM file containing both private-key/certificate/intermediates.
+
storePasswordProvider - provider for the store password or null if store does not require a password.
+
storeType - specifies the server key type. Legal values are those types supported by the platform KeyStore, + and PEM (for X-509 certificates express in PEM format).
+
trustOptions - the trust options that will be applied to this peer.
+
+
+
All Implemented Interfaces:
+
TrustProvider
+
+
+
public record TrustStore(String storeFile, PasswordProvider storePasswordProvider, String storeType, TrustOptions trustOptions) +extends Record +implements TrustProvider
+
A TrustProvider backed by a Java Truststore.
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      TrustStore

      +
      public TrustStore(String storeFile, + @Nullable + PasswordProvider storePasswordProvider, + @Nullable + String storeType, + @Nullable + TrustOptions trustOptions)
      +
      Creates an instance of a TrustStore record class.
      +
      +
      Parameters:
      +
      storeFile - the value for the storeFile record component
      +
      storePasswordProvider - the value for the storePasswordProvider record component
      +
      storeType - the value for the storeType record component
      +
      trustOptions - the value for the trustOptions record component
      +
      +
      +
    • +
    • +
      +

      TrustStore

      +
      public TrustStore(String storeFile, + PasswordProvider storePasswordProvider, + String storeType)
      +
      A TrustProvider backed by a Java Truststore.
      +
      +
      Parameters:
      +
      storeFile - location of a key store, or reference to a PEM file containing both private-key/certificate/intermediates.
      +
      storePasswordProvider - provider for the store password or null if store does not require a password.
      +
      storeType - specifies the server key type. Legal values are those types supported by the platform KeyStore, + and PEM (for X-509 certificates express in PEM format).
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getType

      +
      public String getType()
      +
      +
    • +
    • +
      +

      isPemType

      +
      public boolean isPemType()
      +
      +
    • +
    • +
      +

      accept

      +
      public <T> T accept(TrustProviderVisitor<T> visitor)
      +
      Description copied from interface: TrustProvider
      +
      Visits the trust provider TrustProviderVisitor. Implementor should call one `visit` method on visitor.
      +
      +
      Specified by:
      +
      accept in interface TrustProvider
      +
      Parameters:
      +
      visitor - visitor.
      +
      +
      +
    • +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      storeFile

      +
      public String storeFile()
      +
      Returns the value of the storeFile record component.
      +
      +
      Returns:
      +
      the value of the storeFile record component
      +
      +
      +
    • +
    • +
      +

      storePasswordProvider

      +
      @Nullable +public PasswordProvider storePasswordProvider()
      +
      Returns the value of the storePasswordProvider record component.
      +
      +
      Returns:
      +
      the value of the storePasswordProvider record component
      +
      +
      +
    • +
    • +
      +

      storeType

      +
      @Nullable +public String storeType()
      +
      Returns the value of the storeType record component.
      +
      +
      Returns:
      +
      the value of the storeType record component
      +
      +
      +
    • +
    • +
      +

      trustOptions

      +
      @Nullable +public TrustOptions trustOptions()
      +
      Returns the value of the trustOptions record component.
      +
      +
      Specified by:
      +
      trustOptions in interface TrustProvider
      +
      Returns:
      +
      the value of the trustOptions record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/AllowDeny.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/AllowDeny.html new file mode 100644 index 0000000..615f229 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/AllowDeny.html @@ -0,0 +1,110 @@ + + + + +Uses of Record Class io.kroxylicious.proxy.config.tls.AllowDeny (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
io.kroxylicious.proxy.config.tls.AllowDeny

+
+
Packages that use AllowDeny
+
+
Package
+
Description
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/InsecureTls.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/InsecureTls.html new file mode 100644 index 0000000..4e91627 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/InsecureTls.html @@ -0,0 +1,89 @@ + + + + +Uses of Record Class io.kroxylicious.proxy.config.tls.InsecureTls (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
io.kroxylicious.proxy.config.tls.InsecureTls

+
+
Packages that use InsecureTls
+
+
Package
+
Description
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/KeyPair.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/KeyPair.html new file mode 100644 index 0000000..d572cf1 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/KeyPair.html @@ -0,0 +1,89 @@ + + + + +Uses of Record Class io.kroxylicious.proxy.config.tls.KeyPair (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
io.kroxylicious.proxy.config.tls.KeyPair

+
+
Packages that use KeyPair
+
+
Package
+
Description
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/KeyProvider.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/KeyProvider.html new file mode 100644 index 0000000..1f36069 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/KeyProvider.html @@ -0,0 +1,121 @@ + + + + +Uses of Interface io.kroxylicious.proxy.config.tls.KeyProvider (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.config.tls.KeyProvider

+
+
Packages that use KeyProvider
+
+
Package
+
Description
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/KeyProviderVisitor.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/KeyProviderVisitor.html new file mode 100644 index 0000000..b61c448 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/KeyProviderVisitor.html @@ -0,0 +1,97 @@ + + + + +Uses of Interface io.kroxylicious.proxy.config.tls.KeyProviderVisitor (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.config.tls.KeyProviderVisitor

+
+
Packages that use KeyProviderVisitor
+
+
Package
+
Description
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/KeyStore.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/KeyStore.html new file mode 100644 index 0000000..1c4ef9f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/KeyStore.html @@ -0,0 +1,89 @@ + + + + +Uses of Record Class io.kroxylicious.proxy.config.tls.KeyStore (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
io.kroxylicious.proxy.config.tls.KeyStore

+
+
Packages that use KeyStore
+
+
Package
+
Description
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/PlatformTrustProvider.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/PlatformTrustProvider.html new file mode 100644 index 0000000..309c954 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/PlatformTrustProvider.html @@ -0,0 +1,98 @@ + + + + +Uses of Class io.kroxylicious.proxy.config.tls.PlatformTrustProvider (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.proxy.config.tls.PlatformTrustProvider

+
+
Packages that use PlatformTrustProvider
+
+
Package
+
Description
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/ServerOptions.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/ServerOptions.html new file mode 100644 index 0000000..b4a8f47 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/ServerOptions.html @@ -0,0 +1,62 @@ + + + + +Uses of Record Class io.kroxylicious.proxy.config.tls.ServerOptions (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
io.kroxylicious.proxy.config.tls.ServerOptions

+
+No usage of io.kroxylicious.proxy.config.tls.ServerOptions
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/Tls.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/Tls.html new file mode 100644 index 0000000..3902404 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/Tls.html @@ -0,0 +1,62 @@ + + + + +Uses of Record Class io.kroxylicious.proxy.config.tls.Tls (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
io.kroxylicious.proxy.config.tls.Tls

+
+No usage of io.kroxylicious.proxy.config.tls.Tls
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TlsClientAuth.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TlsClientAuth.html new file mode 100644 index 0000000..054bcec --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TlsClientAuth.html @@ -0,0 +1,113 @@ + + + + +Uses of Enum Class io.kroxylicious.proxy.config.tls.TlsClientAuth (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Enum Class
io.kroxylicious.proxy.config.tls.TlsClientAuth

+
+
Packages that use TlsClientAuth
+
+
Package
+
Description
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TrustOptions.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TrustOptions.html new file mode 100644 index 0000000..9ef4703 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TrustOptions.html @@ -0,0 +1,121 @@ + + + + +Uses of Interface io.kroxylicious.proxy.config.tls.TrustOptions (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.config.tls.TrustOptions

+
+
Packages that use TrustOptions
+
+
Package
+
Description
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TrustProvider.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TrustProvider.html new file mode 100644 index 0000000..ad62e42 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TrustProvider.html @@ -0,0 +1,124 @@ + + + + +Uses of Interface io.kroxylicious.proxy.config.tls.TrustProvider (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.config.tls.TrustProvider

+
+
Packages that use TrustProvider
+
+
Package
+
Description
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TrustProviderVisitor.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TrustProviderVisitor.html new file mode 100644 index 0000000..7392c94 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TrustProviderVisitor.html @@ -0,0 +1,100 @@ + + + + +Uses of Interface io.kroxylicious.proxy.config.tls.TrustProviderVisitor (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.config.tls.TrustProviderVisitor

+
+
Packages that use TrustProviderVisitor
+
+
Package
+
Description
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TrustStore.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TrustStore.html new file mode 100644 index 0000000..fa7a429 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/class-use/TrustStore.html @@ -0,0 +1,89 @@ + + + + +Uses of Record Class io.kroxylicious.proxy.config.tls.TrustStore (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Record Class
io.kroxylicious.proxy.config.tls.TrustStore

+
+
Packages that use TrustStore
+
+
Package
+
Description
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/package-summary.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/package-summary.html new file mode 100644 index 0000000..d4fc681 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/package-summary.html @@ -0,0 +1,154 @@ + + + + +io.kroxylicious.proxy.config.tls (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Package io.kroxylicious.proxy.config.tls

+
+
+
@ReturnValuesAreNonnullByDefault +@DefaultAnnotationForParameters(edu.umd.cs.findbugs.annotations.NonNull.class) +@DefaultAnnotation(edu.umd.cs.findbugs.annotations.NonNull.class) +package io.kroxylicious.proxy.config.tls
+
+

TLS configuration for proxy connections to clients and upstream clusters.

+

These configuration classes define keystores, trust stores, and TLS options + for both server-side (client connections) and client-side (upstream cluster connections) TLS.

+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/package-tree.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/package-tree.html new file mode 100644 index 0000000..b2a7366 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/package-tree.html @@ -0,0 +1,120 @@ + + + + +io.kroxylicious.proxy.config.tls Class Hierarchy (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package io.kroxylicious.proxy.config.tls

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Interface Hierarchy

+ +
+
+

Enum Class Hierarchy

+ +
+
+

Record Class Hierarchy

+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/package-use.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/package-use.html new file mode 100644 index 0000000..58d4274 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/config/tls/package-use.html @@ -0,0 +1,126 @@ + + + + +Uses of Package io.kroxylicious.proxy.config.tls (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
io.kroxylicious.proxy.config.tls

+
+ +
+
Package
+
Description
+ +
+
TLS configuration for proxy connections to clients and upstream clusters.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddOffsetsToTxnRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddOffsetsToTxnRequestFilter.html new file mode 100644 index 0000000..bf226c5 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddOffsetsToTxnRequestFilter.html @@ -0,0 +1,202 @@ + + + + +AddOffsetsToTxnRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AddOffsetsToTxnRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AddOffsetsToTxnRequestFilter +extends Filter
+
A stateless filter for AddOffsetsToTxnRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAddOffsetsToTxnRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AddOffsetsToTxnRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type AddOffsetsToTxnRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAddOffsetsToTxnRequest

      +
      default boolean shouldHandleAddOffsetsToTxnRequest(short apiVersion)
      +
      Determine if a request message of type AddOffsetsToTxnRequest should be handled by + this filter implementation. + returns true then onAddOffsetsToTxnRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAddOffsetsToTxnRequest

      +
      CompletionStage<RequestFilterResult> onAddOffsetsToTxnRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AddOffsetsToTxnRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddOffsetsToTxnResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddOffsetsToTxnResponseFilter.html new file mode 100644 index 0000000..c3502af --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddOffsetsToTxnResponseFilter.html @@ -0,0 +1,202 @@ + + + + +AddOffsetsToTxnResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AddOffsetsToTxnResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AddOffsetsToTxnResponseFilter +extends Filter
+
A stateless filter for AddOffsetsToTxnResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAddOffsetsToTxnResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AddOffsetsToTxnResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type AddOffsetsToTxnResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAddOffsetsToTxnResponse

      +
      default boolean shouldHandleAddOffsetsToTxnResponse(short apiVersion)
      +
      Determine if a response message of type AddOffsetsToTxnResponse should be handled by + this filter implementation. + returns true then onAddOffsetsToTxnResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAddOffsetsToTxnResponse

      +
      CompletionStage<ResponseFilterResult> onAddOffsetsToTxnResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AddOffsetsToTxnResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddPartitionsToTxnRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddPartitionsToTxnRequestFilter.html new file mode 100644 index 0000000..6d040c9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddPartitionsToTxnRequestFilter.html @@ -0,0 +1,202 @@ + + + + +AddPartitionsToTxnRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AddPartitionsToTxnRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AddPartitionsToTxnRequestFilter +extends Filter
+
A stateless filter for AddPartitionsToTxnRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAddPartitionsToTxnRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AddPartitionsToTxnRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type AddPartitionsToTxnRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAddPartitionsToTxnRequest

      +
      default boolean shouldHandleAddPartitionsToTxnRequest(short apiVersion)
      +
      Determine if a request message of type AddPartitionsToTxnRequest should be handled by + this filter implementation. + returns true then onAddPartitionsToTxnRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAddPartitionsToTxnRequest

      +
      CompletionStage<RequestFilterResult> onAddPartitionsToTxnRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AddPartitionsToTxnRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddPartitionsToTxnResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddPartitionsToTxnResponseFilter.html new file mode 100644 index 0000000..36485cf --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddPartitionsToTxnResponseFilter.html @@ -0,0 +1,202 @@ + + + + +AddPartitionsToTxnResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AddPartitionsToTxnResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AddPartitionsToTxnResponseFilter +extends Filter
+
A stateless filter for AddPartitionsToTxnResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAddPartitionsToTxnResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AddPartitionsToTxnResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type AddPartitionsToTxnResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAddPartitionsToTxnResponse

      +
      default boolean shouldHandleAddPartitionsToTxnResponse(short apiVersion)
      +
      Determine if a response message of type AddPartitionsToTxnResponse should be handled by + this filter implementation. + returns true then onAddPartitionsToTxnResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAddPartitionsToTxnResponse

      +
      CompletionStage<ResponseFilterResult> onAddPartitionsToTxnResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AddPartitionsToTxnResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddRaftVoterRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddRaftVoterRequestFilter.html new file mode 100644 index 0000000..213a2d9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddRaftVoterRequestFilter.html @@ -0,0 +1,202 @@ + + + + +AddRaftVoterRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AddRaftVoterRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AddRaftVoterRequestFilter +extends Filter
+
A stateless filter for AddRaftVoterRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAddRaftVoterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AddRaftVoterRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type AddRaftVoterRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAddRaftVoterRequest

      +
      default boolean shouldHandleAddRaftVoterRequest(short apiVersion)
      +
      Determine if a request message of type AddRaftVoterRequest should be handled by + this filter implementation. + returns true then onAddRaftVoterRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAddRaftVoterRequest

      +
      CompletionStage<RequestFilterResult> onAddRaftVoterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AddRaftVoterRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddRaftVoterResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddRaftVoterResponseFilter.html new file mode 100644 index 0000000..cdc9b65 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AddRaftVoterResponseFilter.html @@ -0,0 +1,202 @@ + + + + +AddRaftVoterResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AddRaftVoterResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AddRaftVoterResponseFilter +extends Filter
+
A stateless filter for AddRaftVoterResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAddRaftVoterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AddRaftVoterResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type AddRaftVoterResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAddRaftVoterResponse

      +
      default boolean shouldHandleAddRaftVoterResponse(short apiVersion)
      +
      Determine if a response message of type AddRaftVoterResponse should be handled by + this filter implementation. + returns true then onAddRaftVoterResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAddRaftVoterResponse

      +
      CompletionStage<ResponseFilterResult> onAddRaftVoterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AddRaftVoterResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AllocateProducerIdsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AllocateProducerIdsRequestFilter.html new file mode 100644 index 0000000..11d795e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AllocateProducerIdsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +AllocateProducerIdsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AllocateProducerIdsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AllocateProducerIdsRequestFilter +extends Filter
+
A stateless filter for AllocateProducerIdsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAllocateProducerIdsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AllocateProducerIdsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type AllocateProducerIdsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAllocateProducerIdsRequest

      +
      default boolean shouldHandleAllocateProducerIdsRequest(short apiVersion)
      +
      Determine if a request message of type AllocateProducerIdsRequest should be handled by + this filter implementation. + returns true then onAllocateProducerIdsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAllocateProducerIdsRequest

      +
      CompletionStage<RequestFilterResult> onAllocateProducerIdsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AllocateProducerIdsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AllocateProducerIdsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AllocateProducerIdsResponseFilter.html new file mode 100644 index 0000000..3997942 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AllocateProducerIdsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +AllocateProducerIdsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AllocateProducerIdsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AllocateProducerIdsResponseFilter +extends Filter
+
A stateless filter for AllocateProducerIdsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAllocateProducerIdsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AllocateProducerIdsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type AllocateProducerIdsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAllocateProducerIdsResponse

      +
      default boolean shouldHandleAllocateProducerIdsResponse(short apiVersion)
      +
      Determine if a response message of type AllocateProducerIdsResponse should be handled by + this filter implementation. + returns true then onAllocateProducerIdsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAllocateProducerIdsResponse

      +
      CompletionStage<ResponseFilterResult> onAllocateProducerIdsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AllocateProducerIdsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterClientQuotasRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterClientQuotasRequestFilter.html new file mode 100644 index 0000000..efdd815 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterClientQuotasRequestFilter.html @@ -0,0 +1,202 @@ + + + + +AlterClientQuotasRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AlterClientQuotasRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AlterClientQuotasRequestFilter +extends Filter
+
A stateless filter for AlterClientQuotasRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAlterClientQuotasRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterClientQuotasRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type AlterClientQuotasRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAlterClientQuotasRequest

      +
      default boolean shouldHandleAlterClientQuotasRequest(short apiVersion)
      +
      Determine if a request message of type AlterClientQuotasRequest should be handled by + this filter implementation. + returns true then onAlterClientQuotasRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAlterClientQuotasRequest

      +
      CompletionStage<RequestFilterResult> onAlterClientQuotasRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterClientQuotasRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterClientQuotasResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterClientQuotasResponseFilter.html new file mode 100644 index 0000000..0046724 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterClientQuotasResponseFilter.html @@ -0,0 +1,202 @@ + + + + +AlterClientQuotasResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AlterClientQuotasResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AlterClientQuotasResponseFilter +extends Filter
+
A stateless filter for AlterClientQuotasResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAlterClientQuotasResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterClientQuotasResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type AlterClientQuotasResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAlterClientQuotasResponse

      +
      default boolean shouldHandleAlterClientQuotasResponse(short apiVersion)
      +
      Determine if a response message of type AlterClientQuotasResponse should be handled by + this filter implementation. + returns true then onAlterClientQuotasResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAlterClientQuotasResponse

      +
      CompletionStage<ResponseFilterResult> onAlterClientQuotasResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterClientQuotasResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterConfigsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterConfigsRequestFilter.html new file mode 100644 index 0000000..7f1cd98 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterConfigsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +AlterConfigsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AlterConfigsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AlterConfigsRequestFilter +extends Filter
+
A stateless filter for AlterConfigsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAlterConfigsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterConfigsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type AlterConfigsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAlterConfigsRequest

      +
      default boolean shouldHandleAlterConfigsRequest(short apiVersion)
      +
      Determine if a request message of type AlterConfigsRequest should be handled by + this filter implementation. + returns true then onAlterConfigsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAlterConfigsRequest

      +
      CompletionStage<RequestFilterResult> onAlterConfigsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterConfigsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterConfigsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterConfigsResponseFilter.html new file mode 100644 index 0000000..0ebbfff --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterConfigsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +AlterConfigsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AlterConfigsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AlterConfigsResponseFilter +extends Filter
+
A stateless filter for AlterConfigsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAlterConfigsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterConfigsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type AlterConfigsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAlterConfigsResponse

      +
      default boolean shouldHandleAlterConfigsResponse(short apiVersion)
      +
      Determine if a response message of type AlterConfigsResponse should be handled by + this filter implementation. + returns true then onAlterConfigsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAlterConfigsResponse

      +
      CompletionStage<ResponseFilterResult> onAlterConfigsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterConfigsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterPartitionReassignmentsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterPartitionReassignmentsRequestFilter.html new file mode 100644 index 0000000..95377c8 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterPartitionReassignmentsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +AlterPartitionReassignmentsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AlterPartitionReassignmentsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AlterPartitionReassignmentsRequestFilter +extends Filter
+
A stateless filter for AlterPartitionReassignmentsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAlterPartitionReassignmentsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterPartitionReassignmentsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type AlterPartitionReassignmentsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAlterPartitionReassignmentsRequest

      +
      default boolean shouldHandleAlterPartitionReassignmentsRequest(short apiVersion)
      +
      Determine if a request message of type AlterPartitionReassignmentsRequest should be handled by + this filter implementation. + returns true then onAlterPartitionReassignmentsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAlterPartitionReassignmentsRequest

      +
      CompletionStage<RequestFilterResult> onAlterPartitionReassignmentsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterPartitionReassignmentsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterPartitionReassignmentsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterPartitionReassignmentsResponseFilter.html new file mode 100644 index 0000000..4591e95 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterPartitionReassignmentsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +AlterPartitionReassignmentsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AlterPartitionReassignmentsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AlterPartitionReassignmentsResponseFilter +extends Filter
+
A stateless filter for AlterPartitionReassignmentsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAlterPartitionReassignmentsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterPartitionReassignmentsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type AlterPartitionReassignmentsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAlterPartitionReassignmentsResponse

      +
      default boolean shouldHandleAlterPartitionReassignmentsResponse(short apiVersion)
      +
      Determine if a response message of type AlterPartitionReassignmentsResponse should be handled by + this filter implementation. + returns true then onAlterPartitionReassignmentsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAlterPartitionReassignmentsResponse

      +
      CompletionStage<ResponseFilterResult> onAlterPartitionReassignmentsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterPartitionReassignmentsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterPartitionRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterPartitionRequestFilter.html new file mode 100644 index 0000000..7b1551b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterPartitionRequestFilter.html @@ -0,0 +1,202 @@ + + + + +AlterPartitionRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AlterPartitionRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AlterPartitionRequestFilter +extends Filter
+
A stateless filter for AlterPartitionRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAlterPartitionRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterPartitionRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type AlterPartitionRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAlterPartitionRequest

      +
      default boolean shouldHandleAlterPartitionRequest(short apiVersion)
      +
      Determine if a request message of type AlterPartitionRequest should be handled by + this filter implementation. + returns true then onAlterPartitionRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAlterPartitionRequest

      +
      CompletionStage<RequestFilterResult> onAlterPartitionRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterPartitionRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterPartitionResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterPartitionResponseFilter.html new file mode 100644 index 0000000..01b7d4e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterPartitionResponseFilter.html @@ -0,0 +1,202 @@ + + + + +AlterPartitionResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AlterPartitionResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AlterPartitionResponseFilter +extends Filter
+
A stateless filter for AlterPartitionResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAlterPartitionResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterPartitionResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type AlterPartitionResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAlterPartitionResponse

      +
      default boolean shouldHandleAlterPartitionResponse(short apiVersion)
      +
      Determine if a response message of type AlterPartitionResponse should be handled by + this filter implementation. + returns true then onAlterPartitionResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAlterPartitionResponse

      +
      CompletionStage<ResponseFilterResult> onAlterPartitionResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterPartitionResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterReplicaLogDirsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterReplicaLogDirsRequestFilter.html new file mode 100644 index 0000000..7da7a51 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterReplicaLogDirsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +AlterReplicaLogDirsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AlterReplicaLogDirsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AlterReplicaLogDirsRequestFilter +extends Filter
+
A stateless filter for AlterReplicaLogDirsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAlterReplicaLogDirsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterReplicaLogDirsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type AlterReplicaLogDirsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAlterReplicaLogDirsRequest

      +
      default boolean shouldHandleAlterReplicaLogDirsRequest(short apiVersion)
      +
      Determine if a request message of type AlterReplicaLogDirsRequest should be handled by + this filter implementation. + returns true then onAlterReplicaLogDirsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAlterReplicaLogDirsRequest

      +
      CompletionStage<RequestFilterResult> onAlterReplicaLogDirsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterReplicaLogDirsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterReplicaLogDirsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterReplicaLogDirsResponseFilter.html new file mode 100644 index 0000000..4b6274b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterReplicaLogDirsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +AlterReplicaLogDirsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AlterReplicaLogDirsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AlterReplicaLogDirsResponseFilter +extends Filter
+
A stateless filter for AlterReplicaLogDirsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAlterReplicaLogDirsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterReplicaLogDirsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type AlterReplicaLogDirsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAlterReplicaLogDirsResponse

      +
      default boolean shouldHandleAlterReplicaLogDirsResponse(short apiVersion)
      +
      Determine if a response message of type AlterReplicaLogDirsResponse should be handled by + this filter implementation. + returns true then onAlterReplicaLogDirsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAlterReplicaLogDirsResponse

      +
      CompletionStage<ResponseFilterResult> onAlterReplicaLogDirsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterReplicaLogDirsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterShareGroupOffsetsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterShareGroupOffsetsRequestFilter.html new file mode 100644 index 0000000..5891323 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterShareGroupOffsetsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +AlterShareGroupOffsetsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AlterShareGroupOffsetsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AlterShareGroupOffsetsRequestFilter +extends Filter
+
A stateless filter for AlterShareGroupOffsetsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAlterShareGroupOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterShareGroupOffsetsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type AlterShareGroupOffsetsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAlterShareGroupOffsetsRequest

      +
      default boolean shouldHandleAlterShareGroupOffsetsRequest(short apiVersion)
      +
      Determine if a request message of type AlterShareGroupOffsetsRequest should be handled by + this filter implementation. + returns true then onAlterShareGroupOffsetsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAlterShareGroupOffsetsRequest

      +
      CompletionStage<RequestFilterResult> onAlterShareGroupOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterShareGroupOffsetsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterShareGroupOffsetsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterShareGroupOffsetsResponseFilter.html new file mode 100644 index 0000000..1405b7c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterShareGroupOffsetsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +AlterShareGroupOffsetsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AlterShareGroupOffsetsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AlterShareGroupOffsetsResponseFilter +extends Filter
+
A stateless filter for AlterShareGroupOffsetsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAlterShareGroupOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterShareGroupOffsetsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type AlterShareGroupOffsetsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAlterShareGroupOffsetsResponse

      +
      default boolean shouldHandleAlterShareGroupOffsetsResponse(short apiVersion)
      +
      Determine if a response message of type AlterShareGroupOffsetsResponse should be handled by + this filter implementation. + returns true then onAlterShareGroupOffsetsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAlterShareGroupOffsetsResponse

      +
      CompletionStage<ResponseFilterResult> onAlterShareGroupOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterShareGroupOffsetsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterUserScramCredentialsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterUserScramCredentialsRequestFilter.html new file mode 100644 index 0000000..b58f7c6 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterUserScramCredentialsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +AlterUserScramCredentialsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AlterUserScramCredentialsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AlterUserScramCredentialsRequestFilter +extends Filter
+
A stateless filter for AlterUserScramCredentialsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAlterUserScramCredentialsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterUserScramCredentialsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type AlterUserScramCredentialsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAlterUserScramCredentialsRequest

      +
      default boolean shouldHandleAlterUserScramCredentialsRequest(short apiVersion)
      +
      Determine if a request message of type AlterUserScramCredentialsRequest should be handled by + this filter implementation. + returns true then onAlterUserScramCredentialsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAlterUserScramCredentialsRequest

      +
      CompletionStage<RequestFilterResult> onAlterUserScramCredentialsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterUserScramCredentialsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterUserScramCredentialsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterUserScramCredentialsResponseFilter.html new file mode 100644 index 0000000..097e5e3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AlterUserScramCredentialsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +AlterUserScramCredentialsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AlterUserScramCredentialsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AlterUserScramCredentialsResponseFilter +extends Filter
+
A stateless filter for AlterUserScramCredentialsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAlterUserScramCredentialsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterUserScramCredentialsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type AlterUserScramCredentialsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAlterUserScramCredentialsResponse

      +
      default boolean shouldHandleAlterUserScramCredentialsResponse(short apiVersion)
      +
      Determine if a response message of type AlterUserScramCredentialsResponse should be handled by + this filter implementation. + returns true then onAlterUserScramCredentialsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAlterUserScramCredentialsResponse

      +
      CompletionStage<ResponseFilterResult> onAlterUserScramCredentialsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterUserScramCredentialsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ApiVersionsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ApiVersionsRequestFilter.html new file mode 100644 index 0000000..4fb2d89 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ApiVersionsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ApiVersionsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ApiVersionsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ApiVersionsRequestFilter +extends Filter
+
A stateless filter for ApiVersionsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onApiVersionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ApiVersionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ApiVersionsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleApiVersionsRequest

      +
      default boolean shouldHandleApiVersionsRequest(short apiVersion)
      +
      Determine if a request message of type ApiVersionsRequest should be handled by + this filter implementation. + returns true then onApiVersionsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onApiVersionsRequest

      +
      CompletionStage<RequestFilterResult> onApiVersionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ApiVersionsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ApiVersionsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ApiVersionsResponseFilter.html new file mode 100644 index 0000000..29b7161 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ApiVersionsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ApiVersionsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ApiVersionsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ApiVersionsResponseFilter +extends Filter
+
A stateless filter for ApiVersionsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onApiVersionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ApiVersionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ApiVersionsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleApiVersionsResponse

      +
      default boolean shouldHandleApiVersionsResponse(short apiVersion)
      +
      Determine if a response message of type ApiVersionsResponse should be handled by + this filter implementation. + returns true then onApiVersionsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onApiVersionsResponse

      +
      CompletionStage<ResponseFilterResult> onApiVersionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ApiVersionsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AssignReplicasToDirsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AssignReplicasToDirsRequestFilter.html new file mode 100644 index 0000000..399bfcc --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AssignReplicasToDirsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +AssignReplicasToDirsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AssignReplicasToDirsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AssignReplicasToDirsRequestFilter +extends Filter
+
A stateless filter for AssignReplicasToDirsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAssignReplicasToDirsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AssignReplicasToDirsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type AssignReplicasToDirsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAssignReplicasToDirsRequest

      +
      default boolean shouldHandleAssignReplicasToDirsRequest(short apiVersion)
      +
      Determine if a request message of type AssignReplicasToDirsRequest should be handled by + this filter implementation. + returns true then onAssignReplicasToDirsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAssignReplicasToDirsRequest

      +
      CompletionStage<RequestFilterResult> onAssignReplicasToDirsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AssignReplicasToDirsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AssignReplicasToDirsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AssignReplicasToDirsResponseFilter.html new file mode 100644 index 0000000..62355f7 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/AssignReplicasToDirsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +AssignReplicasToDirsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface AssignReplicasToDirsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface AssignReplicasToDirsResponseFilter +extends Filter
+
A stateless filter for AssignReplicasToDirsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onAssignReplicasToDirsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AssignReplicasToDirsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type AssignReplicasToDirsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleAssignReplicasToDirsResponse

      +
      default boolean shouldHandleAssignReplicasToDirsResponse(short apiVersion)
      +
      Determine if a response message of type AssignReplicasToDirsResponse should be handled by + this filter implementation. + returns true then onAssignReplicasToDirsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onAssignReplicasToDirsResponse

      +
      CompletionStage<ResponseFilterResult> onAssignReplicasToDirsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AssignReplicasToDirsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BeginQuorumEpochRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BeginQuorumEpochRequestFilter.html new file mode 100644 index 0000000..f8ddef0 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BeginQuorumEpochRequestFilter.html @@ -0,0 +1,202 @@ + + + + +BeginQuorumEpochRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface BeginQuorumEpochRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface BeginQuorumEpochRequestFilter +extends Filter
+
A stateless filter for BeginQuorumEpochRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onBeginQuorumEpochRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.BeginQuorumEpochRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type BeginQuorumEpochRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleBeginQuorumEpochRequest

      +
      default boolean shouldHandleBeginQuorumEpochRequest(short apiVersion)
      +
      Determine if a request message of type BeginQuorumEpochRequest should be handled by + this filter implementation. + returns true then onBeginQuorumEpochRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onBeginQuorumEpochRequest

      +
      CompletionStage<RequestFilterResult> onBeginQuorumEpochRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.BeginQuorumEpochRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BeginQuorumEpochResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BeginQuorumEpochResponseFilter.html new file mode 100644 index 0000000..3cf0b5a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BeginQuorumEpochResponseFilter.html @@ -0,0 +1,202 @@ + + + + +BeginQuorumEpochResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface BeginQuorumEpochResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface BeginQuorumEpochResponseFilter +extends Filter
+
A stateless filter for BeginQuorumEpochResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onBeginQuorumEpochResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.BeginQuorumEpochResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type BeginQuorumEpochResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleBeginQuorumEpochResponse

      +
      default boolean shouldHandleBeginQuorumEpochResponse(short apiVersion)
      +
      Determine if a response message of type BeginQuorumEpochResponse should be handled by + this filter implementation. + returns true then onBeginQuorumEpochResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onBeginQuorumEpochResponse

      +
      CompletionStage<ResponseFilterResult> onBeginQuorumEpochResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.BeginQuorumEpochResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BrokerHeartbeatRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BrokerHeartbeatRequestFilter.html new file mode 100644 index 0000000..b6d6025 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BrokerHeartbeatRequestFilter.html @@ -0,0 +1,202 @@ + + + + +BrokerHeartbeatRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface BrokerHeartbeatRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface BrokerHeartbeatRequestFilter +extends Filter
+
A stateless filter for BrokerHeartbeatRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onBrokerHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.BrokerHeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type BrokerHeartbeatRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleBrokerHeartbeatRequest

      +
      default boolean shouldHandleBrokerHeartbeatRequest(short apiVersion)
      +
      Determine if a request message of type BrokerHeartbeatRequest should be handled by + this filter implementation. + returns true then onBrokerHeartbeatRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onBrokerHeartbeatRequest

      +
      CompletionStage<RequestFilterResult> onBrokerHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.BrokerHeartbeatRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BrokerHeartbeatResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BrokerHeartbeatResponseFilter.html new file mode 100644 index 0000000..4b3bc74 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BrokerHeartbeatResponseFilter.html @@ -0,0 +1,202 @@ + + + + +BrokerHeartbeatResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface BrokerHeartbeatResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface BrokerHeartbeatResponseFilter +extends Filter
+
A stateless filter for BrokerHeartbeatResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onBrokerHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.BrokerHeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type BrokerHeartbeatResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleBrokerHeartbeatResponse

      +
      default boolean shouldHandleBrokerHeartbeatResponse(short apiVersion)
      +
      Determine if a response message of type BrokerHeartbeatResponse should be handled by + this filter implementation. + returns true then onBrokerHeartbeatResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onBrokerHeartbeatResponse

      +
      CompletionStage<ResponseFilterResult> onBrokerHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.BrokerHeartbeatResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BrokerRegistrationRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BrokerRegistrationRequestFilter.html new file mode 100644 index 0000000..57aa6d0 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BrokerRegistrationRequestFilter.html @@ -0,0 +1,202 @@ + + + + +BrokerRegistrationRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface BrokerRegistrationRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface BrokerRegistrationRequestFilter +extends Filter
+
A stateless filter for BrokerRegistrationRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onBrokerRegistrationRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.BrokerRegistrationRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type BrokerRegistrationRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleBrokerRegistrationRequest

      +
      default boolean shouldHandleBrokerRegistrationRequest(short apiVersion)
      +
      Determine if a request message of type BrokerRegistrationRequest should be handled by + this filter implementation. + returns true then onBrokerRegistrationRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onBrokerRegistrationRequest

      +
      CompletionStage<RequestFilterResult> onBrokerRegistrationRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.BrokerRegistrationRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BrokerRegistrationResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BrokerRegistrationResponseFilter.html new file mode 100644 index 0000000..36a781f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/BrokerRegistrationResponseFilter.html @@ -0,0 +1,202 @@ + + + + +BrokerRegistrationResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface BrokerRegistrationResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface BrokerRegistrationResponseFilter +extends Filter
+
A stateless filter for BrokerRegistrationResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onBrokerRegistrationResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.BrokerRegistrationResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type BrokerRegistrationResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleBrokerRegistrationResponse

      +
      default boolean shouldHandleBrokerRegistrationResponse(short apiVersion)
      +
      Determine if a response message of type BrokerRegistrationResponse should be handled by + this filter implementation. + returns true then onBrokerRegistrationResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onBrokerRegistrationResponse

      +
      CompletionStage<ResponseFilterResult> onBrokerRegistrationResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.BrokerRegistrationResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ConsumerGroupDescribeRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ConsumerGroupDescribeRequestFilter.html new file mode 100644 index 0000000..5c04b17 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ConsumerGroupDescribeRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ConsumerGroupDescribeRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ConsumerGroupDescribeRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ConsumerGroupDescribeRequestFilter +extends Filter
+
A stateless filter for ConsumerGroupDescribeRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onConsumerGroupDescribeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ConsumerGroupDescribeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ConsumerGroupDescribeRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleConsumerGroupDescribeRequest

      +
      default boolean shouldHandleConsumerGroupDescribeRequest(short apiVersion)
      +
      Determine if a request message of type ConsumerGroupDescribeRequest should be handled by + this filter implementation. + returns true then onConsumerGroupDescribeRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onConsumerGroupDescribeRequest

      +
      CompletionStage<RequestFilterResult> onConsumerGroupDescribeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ConsumerGroupDescribeRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ConsumerGroupDescribeResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ConsumerGroupDescribeResponseFilter.html new file mode 100644 index 0000000..8f219d7 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ConsumerGroupDescribeResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ConsumerGroupDescribeResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ConsumerGroupDescribeResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ConsumerGroupDescribeResponseFilter +extends Filter
+
A stateless filter for ConsumerGroupDescribeResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onConsumerGroupDescribeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ConsumerGroupDescribeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ConsumerGroupDescribeResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleConsumerGroupDescribeResponse

      +
      default boolean shouldHandleConsumerGroupDescribeResponse(short apiVersion)
      +
      Determine if a response message of type ConsumerGroupDescribeResponse should be handled by + this filter implementation. + returns true then onConsumerGroupDescribeResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onConsumerGroupDescribeResponse

      +
      CompletionStage<ResponseFilterResult> onConsumerGroupDescribeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ConsumerGroupDescribeResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ConsumerGroupHeartbeatRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ConsumerGroupHeartbeatRequestFilter.html new file mode 100644 index 0000000..531eaa9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ConsumerGroupHeartbeatRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ConsumerGroupHeartbeatRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ConsumerGroupHeartbeatRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ConsumerGroupHeartbeatRequestFilter +extends Filter
+
A stateless filter for ConsumerGroupHeartbeatRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onConsumerGroupHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ConsumerGroupHeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ConsumerGroupHeartbeatRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleConsumerGroupHeartbeatRequest

      +
      default boolean shouldHandleConsumerGroupHeartbeatRequest(short apiVersion)
      +
      Determine if a request message of type ConsumerGroupHeartbeatRequest should be handled by + this filter implementation. + returns true then onConsumerGroupHeartbeatRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onConsumerGroupHeartbeatRequest

      +
      CompletionStage<RequestFilterResult> onConsumerGroupHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ConsumerGroupHeartbeatRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ConsumerGroupHeartbeatResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ConsumerGroupHeartbeatResponseFilter.html new file mode 100644 index 0000000..952783b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ConsumerGroupHeartbeatResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ConsumerGroupHeartbeatResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ConsumerGroupHeartbeatResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ConsumerGroupHeartbeatResponseFilter +extends Filter
+
A stateless filter for ConsumerGroupHeartbeatResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onConsumerGroupHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ConsumerGroupHeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ConsumerGroupHeartbeatResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleConsumerGroupHeartbeatResponse

      +
      default boolean shouldHandleConsumerGroupHeartbeatResponse(short apiVersion)
      +
      Determine if a response message of type ConsumerGroupHeartbeatResponse should be handled by + this filter implementation. + returns true then onConsumerGroupHeartbeatResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onConsumerGroupHeartbeatResponse

      +
      CompletionStage<ResponseFilterResult> onConsumerGroupHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ConsumerGroupHeartbeatResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ControllerRegistrationRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ControllerRegistrationRequestFilter.html new file mode 100644 index 0000000..3159d11 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ControllerRegistrationRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ControllerRegistrationRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ControllerRegistrationRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ControllerRegistrationRequestFilter +extends Filter
+
A stateless filter for ControllerRegistrationRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onControllerRegistrationRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ControllerRegistrationRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ControllerRegistrationRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleControllerRegistrationRequest

      +
      default boolean shouldHandleControllerRegistrationRequest(short apiVersion)
      +
      Determine if a request message of type ControllerRegistrationRequest should be handled by + this filter implementation. + returns true then onControllerRegistrationRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onControllerRegistrationRequest

      +
      CompletionStage<RequestFilterResult> onControllerRegistrationRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ControllerRegistrationRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ControllerRegistrationResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ControllerRegistrationResponseFilter.html new file mode 100644 index 0000000..3976b9e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ControllerRegistrationResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ControllerRegistrationResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ControllerRegistrationResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ControllerRegistrationResponseFilter +extends Filter
+
A stateless filter for ControllerRegistrationResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onControllerRegistrationResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ControllerRegistrationResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ControllerRegistrationResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleControllerRegistrationResponse

      +
      default boolean shouldHandleControllerRegistrationResponse(short apiVersion)
      +
      Determine if a response message of type ControllerRegistrationResponse should be handled by + this filter implementation. + returns true then onControllerRegistrationResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onControllerRegistrationResponse

      +
      CompletionStage<ResponseFilterResult> onControllerRegistrationResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ControllerRegistrationResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateAclsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateAclsRequestFilter.html new file mode 100644 index 0000000..f90f628 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateAclsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +CreateAclsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface CreateAclsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface CreateAclsRequestFilter +extends Filter
+
A stateless filter for CreateAclsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onCreateAclsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreateAclsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type CreateAclsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleCreateAclsRequest

      +
      default boolean shouldHandleCreateAclsRequest(short apiVersion)
      +
      Determine if a request message of type CreateAclsRequest should be handled by + this filter implementation. + returns true then onCreateAclsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onCreateAclsRequest

      +
      CompletionStage<RequestFilterResult> onCreateAclsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreateAclsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateAclsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateAclsResponseFilter.html new file mode 100644 index 0000000..9fe5b71 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateAclsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +CreateAclsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface CreateAclsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface CreateAclsResponseFilter +extends Filter
+
A stateless filter for CreateAclsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onCreateAclsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreateAclsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type CreateAclsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleCreateAclsResponse

      +
      default boolean shouldHandleCreateAclsResponse(short apiVersion)
      +
      Determine if a response message of type CreateAclsResponse should be handled by + this filter implementation. + returns true then onCreateAclsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onCreateAclsResponse

      +
      CompletionStage<ResponseFilterResult> onCreateAclsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreateAclsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateDelegationTokenRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateDelegationTokenRequestFilter.html new file mode 100644 index 0000000..da55c1a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateDelegationTokenRequestFilter.html @@ -0,0 +1,202 @@ + + + + +CreateDelegationTokenRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface CreateDelegationTokenRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface CreateDelegationTokenRequestFilter +extends Filter
+
A stateless filter for CreateDelegationTokenRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onCreateDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreateDelegationTokenRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type CreateDelegationTokenRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleCreateDelegationTokenRequest

      +
      default boolean shouldHandleCreateDelegationTokenRequest(short apiVersion)
      +
      Determine if a request message of type CreateDelegationTokenRequest should be handled by + this filter implementation. + returns true then onCreateDelegationTokenRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onCreateDelegationTokenRequest

      +
      CompletionStage<RequestFilterResult> onCreateDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreateDelegationTokenRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateDelegationTokenResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateDelegationTokenResponseFilter.html new file mode 100644 index 0000000..d6cf9e4 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateDelegationTokenResponseFilter.html @@ -0,0 +1,202 @@ + + + + +CreateDelegationTokenResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface CreateDelegationTokenResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface CreateDelegationTokenResponseFilter +extends Filter
+
A stateless filter for CreateDelegationTokenResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onCreateDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreateDelegationTokenResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type CreateDelegationTokenResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleCreateDelegationTokenResponse

      +
      default boolean shouldHandleCreateDelegationTokenResponse(short apiVersion)
      +
      Determine if a response message of type CreateDelegationTokenResponse should be handled by + this filter implementation. + returns true then onCreateDelegationTokenResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onCreateDelegationTokenResponse

      +
      CompletionStage<ResponseFilterResult> onCreateDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreateDelegationTokenResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreatePartitionsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreatePartitionsRequestFilter.html new file mode 100644 index 0000000..01a4716 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreatePartitionsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +CreatePartitionsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface CreatePartitionsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface CreatePartitionsRequestFilter +extends Filter
+
A stateless filter for CreatePartitionsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onCreatePartitionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreatePartitionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type CreatePartitionsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleCreatePartitionsRequest

      +
      default boolean shouldHandleCreatePartitionsRequest(short apiVersion)
      +
      Determine if a request message of type CreatePartitionsRequest should be handled by + this filter implementation. + returns true then onCreatePartitionsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onCreatePartitionsRequest

      +
      CompletionStage<RequestFilterResult> onCreatePartitionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreatePartitionsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreatePartitionsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreatePartitionsResponseFilter.html new file mode 100644 index 0000000..d441b09 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreatePartitionsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +CreatePartitionsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface CreatePartitionsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface CreatePartitionsResponseFilter +extends Filter
+
A stateless filter for CreatePartitionsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onCreatePartitionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreatePartitionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type CreatePartitionsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleCreatePartitionsResponse

      +
      default boolean shouldHandleCreatePartitionsResponse(short apiVersion)
      +
      Determine if a response message of type CreatePartitionsResponse should be handled by + this filter implementation. + returns true then onCreatePartitionsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onCreatePartitionsResponse

      +
      CompletionStage<ResponseFilterResult> onCreatePartitionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreatePartitionsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateTopicsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateTopicsRequestFilter.html new file mode 100644 index 0000000..f81a295 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateTopicsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +CreateTopicsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface CreateTopicsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface CreateTopicsRequestFilter +extends Filter
+
A stateless filter for CreateTopicsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onCreateTopicsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreateTopicsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type CreateTopicsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleCreateTopicsRequest

      +
      default boolean shouldHandleCreateTopicsRequest(short apiVersion)
      +
      Determine if a request message of type CreateTopicsRequest should be handled by + this filter implementation. + returns true then onCreateTopicsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onCreateTopicsRequest

      +
      CompletionStage<RequestFilterResult> onCreateTopicsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreateTopicsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateTopicsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateTopicsResponseFilter.html new file mode 100644 index 0000000..2a1eb6e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/CreateTopicsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +CreateTopicsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface CreateTopicsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface CreateTopicsResponseFilter +extends Filter
+
A stateless filter for CreateTopicsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onCreateTopicsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreateTopicsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type CreateTopicsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleCreateTopicsResponse

      +
      default boolean shouldHandleCreateTopicsResponse(short apiVersion)
      +
      Determine if a response message of type CreateTopicsResponse should be handled by + this filter implementation. + returns true then onCreateTopicsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onCreateTopicsResponse

      +
      CompletionStage<ResponseFilterResult> onCreateTopicsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreateTopicsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteAclsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteAclsRequestFilter.html new file mode 100644 index 0000000..24a11b0 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteAclsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DeleteAclsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DeleteAclsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DeleteAclsRequestFilter +extends Filter
+
A stateless filter for DeleteAclsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDeleteAclsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteAclsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DeleteAclsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDeleteAclsRequest

      +
      default boolean shouldHandleDeleteAclsRequest(short apiVersion)
      +
      Determine if a request message of type DeleteAclsRequest should be handled by + this filter implementation. + returns true then onDeleteAclsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDeleteAclsRequest

      +
      CompletionStage<RequestFilterResult> onDeleteAclsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteAclsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteAclsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteAclsResponseFilter.html new file mode 100644 index 0000000..3bbc7cc --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteAclsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DeleteAclsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DeleteAclsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DeleteAclsResponseFilter +extends Filter
+
A stateless filter for DeleteAclsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDeleteAclsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteAclsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DeleteAclsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDeleteAclsResponse

      +
      default boolean shouldHandleDeleteAclsResponse(short apiVersion)
      +
      Determine if a response message of type DeleteAclsResponse should be handled by + this filter implementation. + returns true then onDeleteAclsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDeleteAclsResponse

      +
      CompletionStage<ResponseFilterResult> onDeleteAclsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteAclsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteGroupsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteGroupsRequestFilter.html new file mode 100644 index 0000000..e7e7855 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteGroupsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DeleteGroupsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DeleteGroupsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DeleteGroupsRequestFilter +extends Filter
+
A stateless filter for DeleteGroupsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDeleteGroupsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteGroupsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DeleteGroupsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDeleteGroupsRequest

      +
      default boolean shouldHandleDeleteGroupsRequest(short apiVersion)
      +
      Determine if a request message of type DeleteGroupsRequest should be handled by + this filter implementation. + returns true then onDeleteGroupsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDeleteGroupsRequest

      +
      CompletionStage<RequestFilterResult> onDeleteGroupsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteGroupsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteGroupsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteGroupsResponseFilter.html new file mode 100644 index 0000000..9deebb4 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteGroupsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DeleteGroupsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DeleteGroupsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DeleteGroupsResponseFilter +extends Filter
+
A stateless filter for DeleteGroupsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDeleteGroupsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteGroupsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DeleteGroupsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDeleteGroupsResponse

      +
      default boolean shouldHandleDeleteGroupsResponse(short apiVersion)
      +
      Determine if a response message of type DeleteGroupsResponse should be handled by + this filter implementation. + returns true then onDeleteGroupsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDeleteGroupsResponse

      +
      CompletionStage<ResponseFilterResult> onDeleteGroupsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteGroupsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteRecordsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteRecordsRequestFilter.html new file mode 100644 index 0000000..73ad4be --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteRecordsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DeleteRecordsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DeleteRecordsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DeleteRecordsRequestFilter +extends Filter
+
A stateless filter for DeleteRecordsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDeleteRecordsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteRecordsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DeleteRecordsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDeleteRecordsRequest

      +
      default boolean shouldHandleDeleteRecordsRequest(short apiVersion)
      +
      Determine if a request message of type DeleteRecordsRequest should be handled by + this filter implementation. + returns true then onDeleteRecordsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDeleteRecordsRequest

      +
      CompletionStage<RequestFilterResult> onDeleteRecordsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteRecordsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteRecordsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteRecordsResponseFilter.html new file mode 100644 index 0000000..24daaba --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteRecordsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DeleteRecordsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DeleteRecordsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DeleteRecordsResponseFilter +extends Filter
+
A stateless filter for DeleteRecordsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDeleteRecordsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteRecordsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DeleteRecordsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDeleteRecordsResponse

      +
      default boolean shouldHandleDeleteRecordsResponse(short apiVersion)
      +
      Determine if a response message of type DeleteRecordsResponse should be handled by + this filter implementation. + returns true then onDeleteRecordsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDeleteRecordsResponse

      +
      CompletionStage<ResponseFilterResult> onDeleteRecordsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteRecordsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteShareGroupOffsetsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteShareGroupOffsetsRequestFilter.html new file mode 100644 index 0000000..fc9ce69 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteShareGroupOffsetsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DeleteShareGroupOffsetsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DeleteShareGroupOffsetsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DeleteShareGroupOffsetsRequestFilter +extends Filter
+
A stateless filter for DeleteShareGroupOffsetsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDeleteShareGroupOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupOffsetsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DeleteShareGroupOffsetsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDeleteShareGroupOffsetsRequest

      +
      default boolean shouldHandleDeleteShareGroupOffsetsRequest(short apiVersion)
      +
      Determine if a request message of type DeleteShareGroupOffsetsRequest should be handled by + this filter implementation. + returns true then onDeleteShareGroupOffsetsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDeleteShareGroupOffsetsRequest

      +
      CompletionStage<RequestFilterResult> onDeleteShareGroupOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupOffsetsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteShareGroupOffsetsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteShareGroupOffsetsResponseFilter.html new file mode 100644 index 0000000..6237321 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteShareGroupOffsetsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DeleteShareGroupOffsetsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DeleteShareGroupOffsetsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DeleteShareGroupOffsetsResponseFilter +extends Filter
+
A stateless filter for DeleteShareGroupOffsetsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDeleteShareGroupOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupOffsetsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DeleteShareGroupOffsetsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDeleteShareGroupOffsetsResponse

      +
      default boolean shouldHandleDeleteShareGroupOffsetsResponse(short apiVersion)
      +
      Determine if a response message of type DeleteShareGroupOffsetsResponse should be handled by + this filter implementation. + returns true then onDeleteShareGroupOffsetsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDeleteShareGroupOffsetsResponse

      +
      CompletionStage<ResponseFilterResult> onDeleteShareGroupOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupOffsetsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteShareGroupStateRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteShareGroupStateRequestFilter.html new file mode 100644 index 0000000..f7d3492 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteShareGroupStateRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DeleteShareGroupStateRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DeleteShareGroupStateRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DeleteShareGroupStateRequestFilter +extends Filter
+
A stateless filter for DeleteShareGroupStateRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDeleteShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupStateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DeleteShareGroupStateRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDeleteShareGroupStateRequest

      +
      default boolean shouldHandleDeleteShareGroupStateRequest(short apiVersion)
      +
      Determine if a request message of type DeleteShareGroupStateRequest should be handled by + this filter implementation. + returns true then onDeleteShareGroupStateRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDeleteShareGroupStateRequest

      +
      CompletionStage<RequestFilterResult> onDeleteShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupStateRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteShareGroupStateResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteShareGroupStateResponseFilter.html new file mode 100644 index 0000000..3d5d6a1 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteShareGroupStateResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DeleteShareGroupStateResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DeleteShareGroupStateResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DeleteShareGroupStateResponseFilter +extends Filter
+
A stateless filter for DeleteShareGroupStateResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDeleteShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupStateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DeleteShareGroupStateResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDeleteShareGroupStateResponse

      +
      default boolean shouldHandleDeleteShareGroupStateResponse(short apiVersion)
      +
      Determine if a response message of type DeleteShareGroupStateResponse should be handled by + this filter implementation. + returns true then onDeleteShareGroupStateResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDeleteShareGroupStateResponse

      +
      CompletionStage<ResponseFilterResult> onDeleteShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupStateResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteTopicsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteTopicsRequestFilter.html new file mode 100644 index 0000000..fccdf93 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteTopicsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DeleteTopicsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DeleteTopicsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DeleteTopicsRequestFilter +extends Filter
+
A stateless filter for DeleteTopicsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDeleteTopicsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteTopicsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DeleteTopicsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDeleteTopicsRequest

      +
      default boolean shouldHandleDeleteTopicsRequest(short apiVersion)
      +
      Determine if a request message of type DeleteTopicsRequest should be handled by + this filter implementation. + returns true then onDeleteTopicsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDeleteTopicsRequest

      +
      CompletionStage<RequestFilterResult> onDeleteTopicsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteTopicsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteTopicsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteTopicsResponseFilter.html new file mode 100644 index 0000000..eedce3e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DeleteTopicsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DeleteTopicsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DeleteTopicsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DeleteTopicsResponseFilter +extends Filter
+
A stateless filter for DeleteTopicsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDeleteTopicsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteTopicsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DeleteTopicsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDeleteTopicsResponse

      +
      default boolean shouldHandleDeleteTopicsResponse(short apiVersion)
      +
      Determine if a response message of type DeleteTopicsResponse should be handled by + this filter implementation. + returns true then onDeleteTopicsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDeleteTopicsResponse

      +
      CompletionStage<ResponseFilterResult> onDeleteTopicsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteTopicsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeAclsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeAclsRequestFilter.html new file mode 100644 index 0000000..d9ba1c6 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeAclsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeAclsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeAclsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeAclsRequestFilter +extends Filter
+
A stateless filter for DescribeAclsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeAclsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeAclsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DescribeAclsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeAclsRequest

      +
      default boolean shouldHandleDescribeAclsRequest(short apiVersion)
      +
      Determine if a request message of type DescribeAclsRequest should be handled by + this filter implementation. + returns true then onDescribeAclsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeAclsRequest

      +
      CompletionStage<RequestFilterResult> onDescribeAclsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeAclsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeAclsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeAclsResponseFilter.html new file mode 100644 index 0000000..07a15c3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeAclsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeAclsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeAclsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeAclsResponseFilter +extends Filter
+
A stateless filter for DescribeAclsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeAclsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeAclsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DescribeAclsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeAclsResponse

      +
      default boolean shouldHandleDescribeAclsResponse(short apiVersion)
      +
      Determine if a response message of type DescribeAclsResponse should be handled by + this filter implementation. + returns true then onDescribeAclsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeAclsResponse

      +
      CompletionStage<ResponseFilterResult> onDescribeAclsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeAclsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeClientQuotasRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeClientQuotasRequestFilter.html new file mode 100644 index 0000000..f241d06 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeClientQuotasRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeClientQuotasRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeClientQuotasRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeClientQuotasRequestFilter +extends Filter
+
A stateless filter for DescribeClientQuotasRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeClientQuotasRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeClientQuotasRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DescribeClientQuotasRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeClientQuotasRequest

      +
      default boolean shouldHandleDescribeClientQuotasRequest(short apiVersion)
      +
      Determine if a request message of type DescribeClientQuotasRequest should be handled by + this filter implementation. + returns true then onDescribeClientQuotasRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeClientQuotasRequest

      +
      CompletionStage<RequestFilterResult> onDescribeClientQuotasRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeClientQuotasRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeClientQuotasResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeClientQuotasResponseFilter.html new file mode 100644 index 0000000..7fb7b0b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeClientQuotasResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeClientQuotasResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeClientQuotasResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeClientQuotasResponseFilter +extends Filter
+
A stateless filter for DescribeClientQuotasResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeClientQuotasResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeClientQuotasResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DescribeClientQuotasResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeClientQuotasResponse

      +
      default boolean shouldHandleDescribeClientQuotasResponse(short apiVersion)
      +
      Determine if a response message of type DescribeClientQuotasResponse should be handled by + this filter implementation. + returns true then onDescribeClientQuotasResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeClientQuotasResponse

      +
      CompletionStage<ResponseFilterResult> onDescribeClientQuotasResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeClientQuotasResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeClusterRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeClusterRequestFilter.html new file mode 100644 index 0000000..57f2694 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeClusterRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeClusterRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeClusterRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeClusterRequestFilter +extends Filter
+
A stateless filter for DescribeClusterRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeClusterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeClusterRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DescribeClusterRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeClusterRequest

      +
      default boolean shouldHandleDescribeClusterRequest(short apiVersion)
      +
      Determine if a request message of type DescribeClusterRequest should be handled by + this filter implementation. + returns true then onDescribeClusterRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeClusterRequest

      +
      CompletionStage<RequestFilterResult> onDescribeClusterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeClusterRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeClusterResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeClusterResponseFilter.html new file mode 100644 index 0000000..546793c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeClusterResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeClusterResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeClusterResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeClusterResponseFilter +extends Filter
+
A stateless filter for DescribeClusterResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeClusterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeClusterResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DescribeClusterResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeClusterResponse

      +
      default boolean shouldHandleDescribeClusterResponse(short apiVersion)
      +
      Determine if a response message of type DescribeClusterResponse should be handled by + this filter implementation. + returns true then onDescribeClusterResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeClusterResponse

      +
      CompletionStage<ResponseFilterResult> onDescribeClusterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeClusterResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeConfigsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeConfigsRequestFilter.html new file mode 100644 index 0000000..4b022ce --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeConfigsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeConfigsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeConfigsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeConfigsRequestFilter +extends Filter
+
A stateless filter for DescribeConfigsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeConfigsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeConfigsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DescribeConfigsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeConfigsRequest

      +
      default boolean shouldHandleDescribeConfigsRequest(short apiVersion)
      +
      Determine if a request message of type DescribeConfigsRequest should be handled by + this filter implementation. + returns true then onDescribeConfigsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeConfigsRequest

      +
      CompletionStage<RequestFilterResult> onDescribeConfigsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeConfigsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeConfigsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeConfigsResponseFilter.html new file mode 100644 index 0000000..a28cd40 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeConfigsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeConfigsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeConfigsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeConfigsResponseFilter +extends Filter
+
A stateless filter for DescribeConfigsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeConfigsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeConfigsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DescribeConfigsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeConfigsResponse

      +
      default boolean shouldHandleDescribeConfigsResponse(short apiVersion)
      +
      Determine if a response message of type DescribeConfigsResponse should be handled by + this filter implementation. + returns true then onDescribeConfigsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeConfigsResponse

      +
      CompletionStage<ResponseFilterResult> onDescribeConfigsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeConfigsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeDelegationTokenRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeDelegationTokenRequestFilter.html new file mode 100644 index 0000000..69f8023 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeDelegationTokenRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeDelegationTokenRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeDelegationTokenRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeDelegationTokenRequestFilter +extends Filter
+
A stateless filter for DescribeDelegationTokenRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeDelegationTokenRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DescribeDelegationTokenRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeDelegationTokenRequest

      +
      default boolean shouldHandleDescribeDelegationTokenRequest(short apiVersion)
      +
      Determine if a request message of type DescribeDelegationTokenRequest should be handled by + this filter implementation. + returns true then onDescribeDelegationTokenRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeDelegationTokenRequest

      +
      CompletionStage<RequestFilterResult> onDescribeDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeDelegationTokenRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeDelegationTokenResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeDelegationTokenResponseFilter.html new file mode 100644 index 0000000..9874cb1 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeDelegationTokenResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeDelegationTokenResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeDelegationTokenResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeDelegationTokenResponseFilter +extends Filter
+
A stateless filter for DescribeDelegationTokenResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeDelegationTokenResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DescribeDelegationTokenResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeDelegationTokenResponse

      +
      default boolean shouldHandleDescribeDelegationTokenResponse(short apiVersion)
      +
      Determine if a response message of type DescribeDelegationTokenResponse should be handled by + this filter implementation. + returns true then onDescribeDelegationTokenResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeDelegationTokenResponse

      +
      CompletionStage<ResponseFilterResult> onDescribeDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeDelegationTokenResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeGroupsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeGroupsRequestFilter.html new file mode 100644 index 0000000..384522e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeGroupsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeGroupsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeGroupsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeGroupsRequestFilter +extends Filter
+
A stateless filter for DescribeGroupsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeGroupsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeGroupsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DescribeGroupsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeGroupsRequest

      +
      default boolean shouldHandleDescribeGroupsRequest(short apiVersion)
      +
      Determine if a request message of type DescribeGroupsRequest should be handled by + this filter implementation. + returns true then onDescribeGroupsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeGroupsRequest

      +
      CompletionStage<RequestFilterResult> onDescribeGroupsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeGroupsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeGroupsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeGroupsResponseFilter.html new file mode 100644 index 0000000..e245e45 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeGroupsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeGroupsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeGroupsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeGroupsResponseFilter +extends Filter
+
A stateless filter for DescribeGroupsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeGroupsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeGroupsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DescribeGroupsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeGroupsResponse

      +
      default boolean shouldHandleDescribeGroupsResponse(short apiVersion)
      +
      Determine if a response message of type DescribeGroupsResponse should be handled by + this filter implementation. + returns true then onDescribeGroupsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeGroupsResponse

      +
      CompletionStage<ResponseFilterResult> onDescribeGroupsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeGroupsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeLogDirsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeLogDirsRequestFilter.html new file mode 100644 index 0000000..fccfa41 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeLogDirsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeLogDirsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeLogDirsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeLogDirsRequestFilter +extends Filter
+
A stateless filter for DescribeLogDirsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeLogDirsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeLogDirsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DescribeLogDirsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeLogDirsRequest

      +
      default boolean shouldHandleDescribeLogDirsRequest(short apiVersion)
      +
      Determine if a request message of type DescribeLogDirsRequest should be handled by + this filter implementation. + returns true then onDescribeLogDirsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeLogDirsRequest

      +
      CompletionStage<RequestFilterResult> onDescribeLogDirsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeLogDirsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeLogDirsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeLogDirsResponseFilter.html new file mode 100644 index 0000000..29b2492 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeLogDirsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeLogDirsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeLogDirsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeLogDirsResponseFilter +extends Filter
+
A stateless filter for DescribeLogDirsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeLogDirsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeLogDirsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DescribeLogDirsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeLogDirsResponse

      +
      default boolean shouldHandleDescribeLogDirsResponse(short apiVersion)
      +
      Determine if a response message of type DescribeLogDirsResponse should be handled by + this filter implementation. + returns true then onDescribeLogDirsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeLogDirsResponse

      +
      CompletionStage<ResponseFilterResult> onDescribeLogDirsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeLogDirsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeProducersRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeProducersRequestFilter.html new file mode 100644 index 0000000..7f9ccba --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeProducersRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeProducersRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeProducersRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeProducersRequestFilter +extends Filter
+
A stateless filter for DescribeProducersRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeProducersRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeProducersRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DescribeProducersRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeProducersRequest

      +
      default boolean shouldHandleDescribeProducersRequest(short apiVersion)
      +
      Determine if a request message of type DescribeProducersRequest should be handled by + this filter implementation. + returns true then onDescribeProducersRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeProducersRequest

      +
      CompletionStage<RequestFilterResult> onDescribeProducersRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeProducersRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeProducersResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeProducersResponseFilter.html new file mode 100644 index 0000000..68c4c9e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeProducersResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeProducersResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeProducersResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeProducersResponseFilter +extends Filter
+
A stateless filter for DescribeProducersResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeProducersResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeProducersResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DescribeProducersResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeProducersResponse

      +
      default boolean shouldHandleDescribeProducersResponse(short apiVersion)
      +
      Determine if a response message of type DescribeProducersResponse should be handled by + this filter implementation. + returns true then onDescribeProducersResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeProducersResponse

      +
      CompletionStage<ResponseFilterResult> onDescribeProducersResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeProducersResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeQuorumRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeQuorumRequestFilter.html new file mode 100644 index 0000000..3ebe402 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeQuorumRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeQuorumRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeQuorumRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeQuorumRequestFilter +extends Filter
+
A stateless filter for DescribeQuorumRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeQuorumRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeQuorumRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DescribeQuorumRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeQuorumRequest

      +
      default boolean shouldHandleDescribeQuorumRequest(short apiVersion)
      +
      Determine if a request message of type DescribeQuorumRequest should be handled by + this filter implementation. + returns true then onDescribeQuorumRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeQuorumRequest

      +
      CompletionStage<RequestFilterResult> onDescribeQuorumRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeQuorumRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeQuorumResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeQuorumResponseFilter.html new file mode 100644 index 0000000..958c11e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeQuorumResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeQuorumResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeQuorumResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeQuorumResponseFilter +extends Filter
+
A stateless filter for DescribeQuorumResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeQuorumResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeQuorumResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DescribeQuorumResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeQuorumResponse

      +
      default boolean shouldHandleDescribeQuorumResponse(short apiVersion)
      +
      Determine if a response message of type DescribeQuorumResponse should be handled by + this filter implementation. + returns true then onDescribeQuorumResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeQuorumResponse

      +
      CompletionStage<ResponseFilterResult> onDescribeQuorumResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeQuorumResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeShareGroupOffsetsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeShareGroupOffsetsRequestFilter.html new file mode 100644 index 0000000..a965ff4 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeShareGroupOffsetsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeShareGroupOffsetsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeShareGroupOffsetsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeShareGroupOffsetsRequestFilter +extends Filter
+
A stateless filter for DescribeShareGroupOffsetsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeShareGroupOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeShareGroupOffsetsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DescribeShareGroupOffsetsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeShareGroupOffsetsRequest

      +
      default boolean shouldHandleDescribeShareGroupOffsetsRequest(short apiVersion)
      +
      Determine if a request message of type DescribeShareGroupOffsetsRequest should be handled by + this filter implementation. + returns true then onDescribeShareGroupOffsetsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeShareGroupOffsetsRequest

      +
      CompletionStage<RequestFilterResult> onDescribeShareGroupOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeShareGroupOffsetsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeShareGroupOffsetsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeShareGroupOffsetsResponseFilter.html new file mode 100644 index 0000000..d9c5239 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeShareGroupOffsetsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeShareGroupOffsetsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeShareGroupOffsetsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeShareGroupOffsetsResponseFilter +extends Filter
+
A stateless filter for DescribeShareGroupOffsetsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeShareGroupOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeShareGroupOffsetsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DescribeShareGroupOffsetsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeShareGroupOffsetsResponse

      +
      default boolean shouldHandleDescribeShareGroupOffsetsResponse(short apiVersion)
      +
      Determine if a response message of type DescribeShareGroupOffsetsResponse should be handled by + this filter implementation. + returns true then onDescribeShareGroupOffsetsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeShareGroupOffsetsResponse

      +
      CompletionStage<ResponseFilterResult> onDescribeShareGroupOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeShareGroupOffsetsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeTopicPartitionsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeTopicPartitionsRequestFilter.html new file mode 100644 index 0000000..d5c002b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeTopicPartitionsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeTopicPartitionsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeTopicPartitionsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeTopicPartitionsRequestFilter +extends Filter
+
A stateless filter for DescribeTopicPartitionsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeTopicPartitionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeTopicPartitionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DescribeTopicPartitionsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeTopicPartitionsRequest

      +
      default boolean shouldHandleDescribeTopicPartitionsRequest(short apiVersion)
      +
      Determine if a request message of type DescribeTopicPartitionsRequest should be handled by + this filter implementation. + returns true then onDescribeTopicPartitionsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeTopicPartitionsRequest

      +
      CompletionStage<RequestFilterResult> onDescribeTopicPartitionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeTopicPartitionsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeTopicPartitionsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeTopicPartitionsResponseFilter.html new file mode 100644 index 0000000..885367a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeTopicPartitionsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeTopicPartitionsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeTopicPartitionsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeTopicPartitionsResponseFilter +extends Filter
+
A stateless filter for DescribeTopicPartitionsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeTopicPartitionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeTopicPartitionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DescribeTopicPartitionsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeTopicPartitionsResponse

      +
      default boolean shouldHandleDescribeTopicPartitionsResponse(short apiVersion)
      +
      Determine if a response message of type DescribeTopicPartitionsResponse should be handled by + this filter implementation. + returns true then onDescribeTopicPartitionsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeTopicPartitionsResponse

      +
      CompletionStage<ResponseFilterResult> onDescribeTopicPartitionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeTopicPartitionsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeTransactionsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeTransactionsRequestFilter.html new file mode 100644 index 0000000..b67a98d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeTransactionsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeTransactionsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeTransactionsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeTransactionsRequestFilter +extends Filter
+
A stateless filter for DescribeTransactionsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeTransactionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeTransactionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DescribeTransactionsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeTransactionsRequest

      +
      default boolean shouldHandleDescribeTransactionsRequest(short apiVersion)
      +
      Determine if a request message of type DescribeTransactionsRequest should be handled by + this filter implementation. + returns true then onDescribeTransactionsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeTransactionsRequest

      +
      CompletionStage<RequestFilterResult> onDescribeTransactionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeTransactionsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeTransactionsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeTransactionsResponseFilter.html new file mode 100644 index 0000000..3caac6c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeTransactionsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeTransactionsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeTransactionsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeTransactionsResponseFilter +extends Filter
+
A stateless filter for DescribeTransactionsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeTransactionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeTransactionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DescribeTransactionsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeTransactionsResponse

      +
      default boolean shouldHandleDescribeTransactionsResponse(short apiVersion)
      +
      Determine if a response message of type DescribeTransactionsResponse should be handled by + this filter implementation. + returns true then onDescribeTransactionsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeTransactionsResponse

      +
      CompletionStage<ResponseFilterResult> onDescribeTransactionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeTransactionsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeUserScramCredentialsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeUserScramCredentialsRequestFilter.html new file mode 100644 index 0000000..1c24968 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeUserScramCredentialsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeUserScramCredentialsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeUserScramCredentialsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeUserScramCredentialsRequestFilter +extends Filter
+
A stateless filter for DescribeUserScramCredentialsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeUserScramCredentialsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeUserScramCredentialsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type DescribeUserScramCredentialsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeUserScramCredentialsRequest

      +
      default boolean shouldHandleDescribeUserScramCredentialsRequest(short apiVersion)
      +
      Determine if a request message of type DescribeUserScramCredentialsRequest should be handled by + this filter implementation. + returns true then onDescribeUserScramCredentialsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeUserScramCredentialsRequest

      +
      CompletionStage<RequestFilterResult> onDescribeUserScramCredentialsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeUserScramCredentialsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeUserScramCredentialsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeUserScramCredentialsResponseFilter.html new file mode 100644 index 0000000..c681568 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/DescribeUserScramCredentialsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +DescribeUserScramCredentialsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface DescribeUserScramCredentialsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface DescribeUserScramCredentialsResponseFilter +extends Filter
+
A stateless filter for DescribeUserScramCredentialsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onDescribeUserScramCredentialsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeUserScramCredentialsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type DescribeUserScramCredentialsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleDescribeUserScramCredentialsResponse

      +
      default boolean shouldHandleDescribeUserScramCredentialsResponse(short apiVersion)
      +
      Determine if a response message of type DescribeUserScramCredentialsResponse should be handled by + this filter implementation. + returns true then onDescribeUserScramCredentialsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onDescribeUserScramCredentialsResponse

      +
      CompletionStage<ResponseFilterResult> onDescribeUserScramCredentialsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeUserScramCredentialsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ElectLeadersRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ElectLeadersRequestFilter.html new file mode 100644 index 0000000..75a05b8 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ElectLeadersRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ElectLeadersRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ElectLeadersRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ElectLeadersRequestFilter +extends Filter
+
A stateless filter for ElectLeadersRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onElectLeadersRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ElectLeadersRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ElectLeadersRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleElectLeadersRequest

      +
      default boolean shouldHandleElectLeadersRequest(short apiVersion)
      +
      Determine if a request message of type ElectLeadersRequest should be handled by + this filter implementation. + returns true then onElectLeadersRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onElectLeadersRequest

      +
      CompletionStage<RequestFilterResult> onElectLeadersRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ElectLeadersRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ElectLeadersResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ElectLeadersResponseFilter.html new file mode 100644 index 0000000..1a679fe --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ElectLeadersResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ElectLeadersResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ElectLeadersResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ElectLeadersResponseFilter +extends Filter
+
A stateless filter for ElectLeadersResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onElectLeadersResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ElectLeadersResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ElectLeadersResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleElectLeadersResponse

      +
      default boolean shouldHandleElectLeadersResponse(short apiVersion)
      +
      Determine if a response message of type ElectLeadersResponse should be handled by + this filter implementation. + returns true then onElectLeadersResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onElectLeadersResponse

      +
      CompletionStage<ResponseFilterResult> onElectLeadersResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ElectLeadersResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EndQuorumEpochRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EndQuorumEpochRequestFilter.html new file mode 100644 index 0000000..b66543a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EndQuorumEpochRequestFilter.html @@ -0,0 +1,202 @@ + + + + +EndQuorumEpochRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface EndQuorumEpochRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface EndQuorumEpochRequestFilter +extends Filter
+
A stateless filter for EndQuorumEpochRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onEndQuorumEpochRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.EndQuorumEpochRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type EndQuorumEpochRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleEndQuorumEpochRequest

      +
      default boolean shouldHandleEndQuorumEpochRequest(short apiVersion)
      +
      Determine if a request message of type EndQuorumEpochRequest should be handled by + this filter implementation. + returns true then onEndQuorumEpochRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onEndQuorumEpochRequest

      +
      CompletionStage<RequestFilterResult> onEndQuorumEpochRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.EndQuorumEpochRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EndQuorumEpochResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EndQuorumEpochResponseFilter.html new file mode 100644 index 0000000..0c96da9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EndQuorumEpochResponseFilter.html @@ -0,0 +1,202 @@ + + + + +EndQuorumEpochResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface EndQuorumEpochResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface EndQuorumEpochResponseFilter +extends Filter
+
A stateless filter for EndQuorumEpochResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onEndQuorumEpochResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.EndQuorumEpochResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type EndQuorumEpochResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleEndQuorumEpochResponse

      +
      default boolean shouldHandleEndQuorumEpochResponse(short apiVersion)
      +
      Determine if a response message of type EndQuorumEpochResponse should be handled by + this filter implementation. + returns true then onEndQuorumEpochResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onEndQuorumEpochResponse

      +
      CompletionStage<ResponseFilterResult> onEndQuorumEpochResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.EndQuorumEpochResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EndTxnRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EndTxnRequestFilter.html new file mode 100644 index 0000000..5b28899 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EndTxnRequestFilter.html @@ -0,0 +1,202 @@ + + + + +EndTxnRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface EndTxnRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface EndTxnRequestFilter +extends Filter
+
A stateless filter for EndTxnRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onEndTxnRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.EndTxnRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    +
    shouldHandleEndTxnRequest(short apiVersion)
    +
    +
    Determine if a request message of type EndTxnRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleEndTxnRequest

      +
      default boolean shouldHandleEndTxnRequest(short apiVersion)
      +
      Determine if a request message of type EndTxnRequest should be handled by + this filter implementation. + returns true then onEndTxnRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onEndTxnRequest

      +
      CompletionStage<RequestFilterResult> onEndTxnRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.EndTxnRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EndTxnResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EndTxnResponseFilter.html new file mode 100644 index 0000000..e67175a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EndTxnResponseFilter.html @@ -0,0 +1,202 @@ + + + + +EndTxnResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface EndTxnResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface EndTxnResponseFilter +extends Filter
+
A stateless filter for EndTxnResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onEndTxnResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.EndTxnResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    +
    shouldHandleEndTxnResponse(short apiVersion)
    +
    +
    Determine if a response message of type EndTxnResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleEndTxnResponse

      +
      default boolean shouldHandleEndTxnResponse(short apiVersion)
      +
      Determine if a response message of type EndTxnResponse should be handled by + this filter implementation. + returns true then onEndTxnResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onEndTxnResponse

      +
      CompletionStage<ResponseFilterResult> onEndTxnResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.EndTxnResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EnvelopeRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EnvelopeRequestFilter.html new file mode 100644 index 0000000..ef1c661 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EnvelopeRequestFilter.html @@ -0,0 +1,202 @@ + + + + +EnvelopeRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface EnvelopeRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface EnvelopeRequestFilter +extends Filter
+
A stateless filter for EnvelopeRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onEnvelopeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.EnvelopeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    +
    shouldHandleEnvelopeRequest(short apiVersion)
    +
    +
    Determine if a request message of type EnvelopeRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleEnvelopeRequest

      +
      default boolean shouldHandleEnvelopeRequest(short apiVersion)
      +
      Determine if a request message of type EnvelopeRequest should be handled by + this filter implementation. + returns true then onEnvelopeRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onEnvelopeRequest

      +
      CompletionStage<RequestFilterResult> onEnvelopeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.EnvelopeRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EnvelopeResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EnvelopeResponseFilter.html new file mode 100644 index 0000000..cf2e25b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/EnvelopeResponseFilter.html @@ -0,0 +1,202 @@ + + + + +EnvelopeResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface EnvelopeResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface EnvelopeResponseFilter +extends Filter
+
A stateless filter for EnvelopeResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onEnvelopeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.EnvelopeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    +
    shouldHandleEnvelopeResponse(short apiVersion)
    +
    +
    Determine if a response message of type EnvelopeResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleEnvelopeResponse

      +
      default boolean shouldHandleEnvelopeResponse(short apiVersion)
      +
      Determine if a response message of type EnvelopeResponse should be handled by + this filter implementation. + returns true then onEnvelopeResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onEnvelopeResponse

      +
      CompletionStage<ResponseFilterResult> onEnvelopeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.EnvelopeResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ExpireDelegationTokenRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ExpireDelegationTokenRequestFilter.html new file mode 100644 index 0000000..f497be2 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ExpireDelegationTokenRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ExpireDelegationTokenRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ExpireDelegationTokenRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ExpireDelegationTokenRequestFilter +extends Filter
+
A stateless filter for ExpireDelegationTokenRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onExpireDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ExpireDelegationTokenRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ExpireDelegationTokenRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleExpireDelegationTokenRequest

      +
      default boolean shouldHandleExpireDelegationTokenRequest(short apiVersion)
      +
      Determine if a request message of type ExpireDelegationTokenRequest should be handled by + this filter implementation. + returns true then onExpireDelegationTokenRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onExpireDelegationTokenRequest

      +
      CompletionStage<RequestFilterResult> onExpireDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ExpireDelegationTokenRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ExpireDelegationTokenResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ExpireDelegationTokenResponseFilter.html new file mode 100644 index 0000000..95577e1 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ExpireDelegationTokenResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ExpireDelegationTokenResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ExpireDelegationTokenResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ExpireDelegationTokenResponseFilter +extends Filter
+
A stateless filter for ExpireDelegationTokenResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onExpireDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ExpireDelegationTokenResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ExpireDelegationTokenResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleExpireDelegationTokenResponse

      +
      default boolean shouldHandleExpireDelegationTokenResponse(short apiVersion)
      +
      Determine if a response message of type ExpireDelegationTokenResponse should be handled by + this filter implementation. + returns true then onExpireDelegationTokenResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onExpireDelegationTokenResponse

      +
      CompletionStage<ResponseFilterResult> onExpireDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ExpireDelegationTokenResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FetchRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FetchRequestFilter.html new file mode 100644 index 0000000..a02ab17 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FetchRequestFilter.html @@ -0,0 +1,202 @@ + + + + +FetchRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface FetchRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface FetchRequestFilter +extends Filter
+
A stateless filter for FetchRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onFetchRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.FetchRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    +
    shouldHandleFetchRequest(short apiVersion)
    +
    +
    Determine if a request message of type FetchRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleFetchRequest

      +
      default boolean shouldHandleFetchRequest(short apiVersion)
      +
      Determine if a request message of type FetchRequest should be handled by + this filter implementation. + returns true then onFetchRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onFetchRequest

      +
      CompletionStage<RequestFilterResult> onFetchRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.FetchRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FetchResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FetchResponseFilter.html new file mode 100644 index 0000000..f0a480c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FetchResponseFilter.html @@ -0,0 +1,202 @@ + + + + +FetchResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface FetchResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface FetchResponseFilter +extends Filter
+
A stateless filter for FetchResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onFetchResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.FetchResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    +
    shouldHandleFetchResponse(short apiVersion)
    +
    +
    Determine if a response message of type FetchResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleFetchResponse

      +
      default boolean shouldHandleFetchResponse(short apiVersion)
      +
      Determine if a response message of type FetchResponse should be handled by + this filter implementation. + returns true then onFetchResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onFetchResponse

      +
      CompletionStage<ResponseFilterResult> onFetchResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.FetchResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FetchSnapshotRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FetchSnapshotRequestFilter.html new file mode 100644 index 0000000..4ea35e1 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FetchSnapshotRequestFilter.html @@ -0,0 +1,202 @@ + + + + +FetchSnapshotRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface FetchSnapshotRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface FetchSnapshotRequestFilter +extends Filter
+
A stateless filter for FetchSnapshotRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onFetchSnapshotRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.FetchSnapshotRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type FetchSnapshotRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleFetchSnapshotRequest

      +
      default boolean shouldHandleFetchSnapshotRequest(short apiVersion)
      +
      Determine if a request message of type FetchSnapshotRequest should be handled by + this filter implementation. + returns true then onFetchSnapshotRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onFetchSnapshotRequest

      +
      CompletionStage<RequestFilterResult> onFetchSnapshotRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.FetchSnapshotRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FetchSnapshotResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FetchSnapshotResponseFilter.html new file mode 100644 index 0000000..6b3ed2a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FetchSnapshotResponseFilter.html @@ -0,0 +1,202 @@ + + + + +FetchSnapshotResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface FetchSnapshotResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface FetchSnapshotResponseFilter +extends Filter
+
A stateless filter for FetchSnapshotResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onFetchSnapshotResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.FetchSnapshotResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type FetchSnapshotResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleFetchSnapshotResponse

      +
      default boolean shouldHandleFetchSnapshotResponse(short apiVersion)
      +
      Determine if a response message of type FetchSnapshotResponse should be handled by + this filter implementation. + returns true then onFetchSnapshotResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onFetchSnapshotResponse

      +
      CompletionStage<ResponseFilterResult> onFetchSnapshotResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.FetchSnapshotResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/Filter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/Filter.html new file mode 100644 index 0000000..3bdbf97 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/Filter.html @@ -0,0 +1,107 @@ + + + + +Filter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface Filter

+
+
+
+
All Known Subinterfaces:
+
AddOffsetsToTxnRequestFilter, AddOffsetsToTxnResponseFilter, AddPartitionsToTxnRequestFilter, AddPartitionsToTxnResponseFilter, AddRaftVoterRequestFilter, AddRaftVoterResponseFilter, AllocateProducerIdsRequestFilter, AllocateProducerIdsResponseFilter, AlterClientQuotasRequestFilter, AlterClientQuotasResponseFilter, AlterConfigsRequestFilter, AlterConfigsResponseFilter, AlterPartitionReassignmentsRequestFilter, AlterPartitionReassignmentsResponseFilter, AlterPartitionRequestFilter, AlterPartitionResponseFilter, AlterReplicaLogDirsRequestFilter, AlterReplicaLogDirsResponseFilter, AlterShareGroupOffsetsRequestFilter, AlterShareGroupOffsetsResponseFilter, AlterUserScramCredentialsRequestFilter, AlterUserScramCredentialsResponseFilter, ApiVersionsRequestFilter, ApiVersionsResponseFilter, AssignReplicasToDirsRequestFilter, AssignReplicasToDirsResponseFilter, BeginQuorumEpochRequestFilter, BeginQuorumEpochResponseFilter, BrokerHeartbeatRequestFilter, BrokerHeartbeatResponseFilter, BrokerRegistrationRequestFilter, BrokerRegistrationResponseFilter, ConsumerGroupDescribeRequestFilter, ConsumerGroupDescribeResponseFilter, ConsumerGroupHeartbeatRequestFilter, ConsumerGroupHeartbeatResponseFilter, ControllerRegistrationRequestFilter, ControllerRegistrationResponseFilter, CreateAclsRequestFilter, CreateAclsResponseFilter, CreateDelegationTokenRequestFilter, CreateDelegationTokenResponseFilter, CreatePartitionsRequestFilter, CreatePartitionsResponseFilter, CreateTopicsRequestFilter, CreateTopicsResponseFilter, DeleteAclsRequestFilter, DeleteAclsResponseFilter, DeleteGroupsRequestFilter, DeleteGroupsResponseFilter, DeleteRecordsRequestFilter, DeleteRecordsResponseFilter, DeleteShareGroupOffsetsRequestFilter, DeleteShareGroupOffsetsResponseFilter, DeleteShareGroupStateRequestFilter, DeleteShareGroupStateResponseFilter, DeleteTopicsRequestFilter, DeleteTopicsResponseFilter, DescribeAclsRequestFilter, DescribeAclsResponseFilter, DescribeClientQuotasRequestFilter, DescribeClientQuotasResponseFilter, DescribeClusterRequestFilter, DescribeClusterResponseFilter, DescribeConfigsRequestFilter, DescribeConfigsResponseFilter, DescribeDelegationTokenRequestFilter, DescribeDelegationTokenResponseFilter, DescribeGroupsRequestFilter, DescribeGroupsResponseFilter, DescribeLogDirsRequestFilter, DescribeLogDirsResponseFilter, DescribeProducersRequestFilter, DescribeProducersResponseFilter, DescribeQuorumRequestFilter, DescribeQuorumResponseFilter, DescribeShareGroupOffsetsRequestFilter, DescribeShareGroupOffsetsResponseFilter, DescribeTopicPartitionsRequestFilter, DescribeTopicPartitionsResponseFilter, DescribeTransactionsRequestFilter, DescribeTransactionsResponseFilter, DescribeUserScramCredentialsRequestFilter, DescribeUserScramCredentialsResponseFilter, ElectLeadersRequestFilter, ElectLeadersResponseFilter, EndQuorumEpochRequestFilter, EndQuorumEpochResponseFilter, EndTxnRequestFilter, EndTxnResponseFilter, EnvelopeRequestFilter, EnvelopeResponseFilter, ExpireDelegationTokenRequestFilter, ExpireDelegationTokenResponseFilter, FetchRequestFilter, FetchResponseFilter, FetchSnapshotRequestFilter, FetchSnapshotResponseFilter, FindCoordinatorRequestFilter, FindCoordinatorResponseFilter, GetTelemetrySubscriptionsRequestFilter, GetTelemetrySubscriptionsResponseFilter, HeartbeatRequestFilter, HeartbeatResponseFilter, IncrementalAlterConfigsRequestFilter, IncrementalAlterConfigsResponseFilter, InitializeShareGroupStateRequestFilter, InitializeShareGroupStateResponseFilter, InitProducerIdRequestFilter, InitProducerIdResponseFilter, JoinGroupRequestFilter, JoinGroupResponseFilter, LeaveGroupRequestFilter, LeaveGroupResponseFilter, ListConfigResourcesRequestFilter, ListConfigResourcesResponseFilter, ListGroupsRequestFilter, ListGroupsResponseFilter, ListOffsetsRequestFilter, ListOffsetsResponseFilter, ListPartitionReassignmentsRequestFilter, ListPartitionReassignmentsResponseFilter, ListTransactionsRequestFilter, ListTransactionsResponseFilter, MetadataRequestFilter, MetadataResponseFilter, OffsetCommitRequestFilter, OffsetCommitResponseFilter, OffsetDeleteRequestFilter, OffsetDeleteResponseFilter, OffsetFetchRequestFilter, OffsetFetchResponseFilter, OffsetForLeaderEpochRequestFilter, OffsetForLeaderEpochResponseFilter, ProduceRequestFilter, ProduceResponseFilter, PushTelemetryRequestFilter, PushTelemetryResponseFilter, ReadShareGroupStateRequestFilter, ReadShareGroupStateResponseFilter, ReadShareGroupStateSummaryRequestFilter, ReadShareGroupStateSummaryResponseFilter, RemoveRaftVoterRequestFilter, RemoveRaftVoterResponseFilter, RenewDelegationTokenRequestFilter, RenewDelegationTokenResponseFilter, RequestFilter, ResponseFilter, SaslAuthenticateRequestFilter, SaslAuthenticateResponseFilter, SaslHandshakeRequestFilter, SaslHandshakeResponseFilter, ShareAcknowledgeRequestFilter, ShareAcknowledgeResponseFilter, ShareFetchRequestFilter, ShareFetchResponseFilter, ShareGroupDescribeRequestFilter, ShareGroupDescribeResponseFilter, ShareGroupHeartbeatRequestFilter, ShareGroupHeartbeatResponseFilter, StreamsGroupDescribeRequestFilter, StreamsGroupDescribeResponseFilter, StreamsGroupHeartbeatRequestFilter, StreamsGroupHeartbeatResponseFilter, SyncGroupRequestFilter, SyncGroupResponseFilter, TxnOffsetCommitRequestFilter, TxnOffsetCommitResponseFilter, UnregisterBrokerRequestFilter, UnregisterBrokerResponseFilter, UpdateFeaturesRequestFilter, UpdateFeaturesResponseFilter, UpdateRaftVoterRequestFilter, UpdateRaftVoterResponseFilter, VoteRequestFilter, VoteResponseFilter, WriteShareGroupStateRequestFilter, WriteShareGroupStateResponseFilter, WriteTxnMarkersRequestFilter, WriteTxnMarkersResponseFilter
+
+
+
public interface Filter
+
Marker interface all Filter interfaces extend from
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterContext.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterContext.html new file mode 100644 index 0000000..c3fe863 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterContext.html @@ -0,0 +1,564 @@ + + + + +FilterContext (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface FilterContext

+
+
+
+
public interface FilterContext
+
A context to allow filters to interact with other filters and the pipeline.
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      channelDescriptor

      +
      String channelDescriptor()
      +
      A description of the downstream/client channel.
      +
      +
      Returns:
      +
      A description of this channel (typically used for logging).
      +
      +
      +
    • +
    • +
      +

      sessionId

      +
      String sessionId()
      +
      An id which uniquely identifies the connection with the client in both time and space. + In other words this will have a different value even if a client re-establishes a + TCP connection from the same IP address and source port.
      +
      +
      Returns:
      +
      the ID allocated to this client session.
      +
      +
      +
    • +
    • +
      +

      createByteBufferOutputStream

      +
      org.apache.kafka.common.utils.ByteBufferOutputStream createByteBufferOutputStream(int initialCapacity)
      +
      Create a ByteBufferOutputStream of the given capacity. + The backing buffer will be deallocated when the request processing is completed
      +
      +
      Parameters:
      +
      initialCapacity - The initial capacity of the buffer.
      +
      Returns:
      +
      The allocated ByteBufferOutputStream
      +
      +
      +
    • +
    • +
      +

      sniHostname

      +
      @Nullable +String sniHostname()
      +
      The SNI hostname provided by the client, if any.
      +
      +
      Returns:
      +
      the SNI hostname provided by the client. Will be null if the client is + using a non-TLS connection or the TLS client hello didn't provide one.
      +
      +
      +
    • +
    • +
      +

      requestFilterResultBuilder

      +
      RequestFilterResultBuilder requestFilterResultBuilder()
      +
      Creates a builder for a request filter result objects. This object encapsulates + the request to forward and optionally orders for actions such as closing + the connection or dropping the request. +
      + The builder returns either CompletionStage<RequestFilterResult> object + ready to be returned by the request filter, or a ResponseFilterResult object. + The latter facilitates asynchronous programming patterns where requests must be + forwarded after other work has completed.
      +
      +
      Returns:
      +
      builder
      +
      +
      +
    • +
    • +
      +

      forwardRequest

      +
      CompletionStage<RequestFilterResult> forwardRequest(org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.protocol.ApiMessage request)
      +
      Generates a completed filter results containing the given header and request. When + request filters implementations return this result, the request will be sent towards + the broker, invoking upstream filters. +
      + Invoking this method is identical to invoking: + requestFilterResultBuilder.forward(header, request).complete()
      +
      +
      Parameters:
      +
      header - The header to forward to the broker.
      +
      request - The request to forward to the broker.
      +
      Returns:
      +
      completed filter results.
      +
      +
      +
    • +
    • +
      +

      sendRequest

      +
      <M extends org.apache.kafka.common.protocol.ApiMessage> +CompletionStage<M> sendRequest(org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.protocol.ApiMessage request)
      +
      Send a request from a filter towards the broker. The response to the request will be made available to the + filter asynchronously, by way of the CompletionStage. The CompletionStage will contain the response + object, or null of the request does not have a response. +

      Header

      +

      The caller is required to provide a RequestHeaderData. It is recommended that the + caller specify the RequestHeaderData.requestApiVersion(). This can be done conveniently + with forms such as:

      +
      new RequestHeaderData().setRequestApiVersion(4)
      +

      The caller may also provide a RequestHeaderData.clientId() an + RequestHeaderData.unknownTaggedFields(). +

      Kroxylicious will automatically set the RequestHeaderData.requestApiKey() to be consistent + with the request. RequestHeaderData.correlationId() is ignored.

      +

      Filtering

      +

      The request will pass through all filters upstream of the filter that invoked the operation, + invoking them. Similarly, the response will pass through all filters upstream + of the filter that invoked the operation, invoking them, but not itself. The response does not + pass through filters downstream. +

      +

      Chained Computation stages

      +

      Default and asynchronous default computation stages chained to the returned + CompletionStage are guaranteed to be executed by the thread associated with the + connection. See io.kroxylicious.proxy.filter for more details. +

      +
      +
      Type Parameters:
      +
      M - The type of the response
      +
      Parameters:
      +
      header - The request header.
      +
      request - The request data.
      +
      Returns:
      +
      CompletionStage that will yield the response.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      topicNames

      + +
      Attempts to map all the given topicIds to the current corresponding topic names.
      +
      +
      Parameters:
      +
      topicIds - topic ids to map to names
      +
      Returns:
      +
      a CompletionStage that will be completed with a complete mapping, with every requested topic id mapped to either an + TopicNameMappingException or a name. All failure modes should complete the stage with a TopicNameMapping, with the + TopicNameMapping used to convey the reason for failure, rather than failing the Stage. +

      Chained Computation stages

      +

      Default and asynchronous default computation stages chained to the returned + CompletionStage are guaranteed to be executed by the thread + associated with the connection. See io.kroxylicious.proxy.filter for more details. +

      +
      +
      +
    • +
    • +
      +

      forwardResponse

      +
      CompletionStage<ResponseFilterResult> forwardResponse(org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.protocol.ApiMessage response)
      +
      Generates a completed filter results containing the given header and response. When + response filters implementations return this result, the response will be sent towards + the client, invoking downstream filters. +
      + Invoking this method is identical to invoking: + responseFilterResultBuilder.forward(header, response).complete()
      +
      +
      Parameters:
      +
      header - The header to forward to the broker.
      +
      response - The request to forward to the broker.
      +
      Returns:
      +
      completed filter results.
      +
      +
      +
    • +
    • +
      +

      responseFilterResultBuilder

      +
      ResponseFilterResultBuilder responseFilterResultBuilder()
      +
      Creates a builder for a request filter result objects. This object encapsulates + the response to forward and optionally orders for actions such as closing + the connection or dropping the response. +
      + The builder returns either CompletionStage<ResponseFilterResult> object + ready to be returned by the response filter, or a ResponseFilterResult object. + The latter facilitates asynchronous programming patterns where responses must be + forwarded after other work has completed.
      +
      +
      Returns:
      +
      builder
      +
      +
      +
    • +
    • +
      +

      getVirtualClusterName

      +
      String getVirtualClusterName()
      +
      Allows the filter to identify which cluster it is processing a request for
      +
      +
      Returns:
      +
      virtual cluster name
      +
      +
      +
    • +
    • +
      +

      clientTlsContext

      +
      Optional<ClientTlsContext> clientTlsContext()
      +
      +
      Returns:
      +
      The TLS context for the client connection, or empty if the client connection is not TLS.
      +
      +
      +
    • +
    • +
      +

      clientSaslAuthenticationSuccess

      +
      @Deprecated(since="0.18") +void clientSaslAuthenticationSuccess(String mechanism, + String authorizedId)
      +
      Deprecated. +
      Callers should use clientSaslAuthenticationSuccess(String, Subject) + to announce authentication outcomes instead of this method. + When this method is used the result of authenticatedSubject() will be a non-empty Optional + with a Subject having a single User principal with the given authorizedId
      +
      +
      Allows a filter (typically one which implements SaslAuthenticateRequestFilter) + to announce a successful authentication outcome with the Kafka client to other plugins. + After calling this method the results of clientSaslContext() + and authenticatedSubject() will both be non-empty for this and other filters. + + In order to support reauthentication, calls to this method and + clientSaslAuthenticationFailure(String, String, Exception) + may be arbitrarily interleaved during the lifetime of a given filter instance.
      +
      +
      Parameters:
      +
      mechanism - The SASL mechanism used
      +
      authorizedId - The authorizedId
      +
      +
      +
    • +
    • +
      +

      clientSaslAuthenticationSuccess

      +
      void clientSaslAuthenticationSuccess(String mechanism, + Subject subject)
      +
      Allows a filter (typically one which implements SaslAuthenticateRequestFilter) + to announce a successful authentication outcome with the Kafka client to other plugins. + After calling this method the results of clientSaslContext() + and authenticatedSubject() will both be non-empty for this and other filters. + + In order to support reauthentication, calls to this method and + clientSaslAuthenticationFailure(String, String, Exception) + may be arbitrarily interleaved during the lifetime of a given filter instance.
      +
      +
      Parameters:
      +
      mechanism - The SASL mechanism used
      +
      subject - The subject
      +
      +
      +
    • +
    • +
      +

      clientSaslAuthenticationFailure

      +
      void clientSaslAuthenticationFailure(@Nullable + String mechanism, + @Nullable + String authorizedId, + Exception exception)
      +
      Allows a filter (typically one which implements SaslAuthenticateRequestFilter) + to announce a failed authentication outcome with the Kafka client. + After calling this method the result of clientSaslContext() will + be empty for this and other filters. + It is the filter's responsibility to return the right error response to a client, and/or disconnect. + + In order to support reauthentication, calls to this method and + clientSaslAuthenticationSuccess(String, String) + may be arbitrarily interleaved during the lifetime of a given filter instance.
      +
      +
      Parameters:
      +
      mechanism - The SASL mechanism used, or null if this is not known.
      +
      authorizedId - The authorizedId, or null if this is not known.
      +
      exception - An exception describing the authentication failure.
      +
      +
      +
    • +
    • +
      +

      clientSaslContext

      +
      Optional<ClientSaslContext> clientSaslContext()
      +
      +
      Returns:
      +
      The SASL context for the client connection, or empty if the client + has not successfully authenticated using SASL.
      +
      +
      +
    • +
    • +
      +

      authenticatedSubject

      +
      Subject authenticatedSubject()
      +

      Returns the client subject.

      + +

      Depending on configuration, the subject can be based on network-level or Kafka protocol-level information (or both):

      +
        +
      • This will return an + anonymous Subject (one with an empty principals set) when + no authentication is configured, or the transport layer cannot provide authentication (e.g. TCP or non-mutual TLS transports).
      • +
      • When client mutual TLS authentication is configured this will + initially return a non-anonymous Subject based on the TLS certificate presented by the client.
      • +
      • At any point, if a filter invokes clientSaslAuthenticationSuccess(String, Subject) then that subject + will override the existing subject.
      • +
      • Because of the possibility of reauthentication it is also possible for the + subject to change even after then initial SASL reauthentication.
      • +
      + +

      Because the subject can change, callers are advised to be careful to avoid + caching subjects, or decisions derived from them.

      + +

      Which principals are present in the returned subject, and what their names look like, + depends on the configuration of network + and/or clientSaslAuthenticationSuccess(String, Subject)-calling filters. + In general, filters should be configurable with respect to the principal type when interrogating the returned + subject.

      +
      +
      Returns:
      +
      The client subject
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterDispatchExecutor.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterDispatchExecutor.html new file mode 100644 index 0000000..4c85527 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterDispatchExecutor.html @@ -0,0 +1,205 @@ + + + + +FilterDispatchExecutor (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface FilterDispatchExecutor

+
+
+
+
All Superinterfaces:
+
Executor, ExecutorService, ScheduledExecutorService
+
+
+
public interface FilterDispatchExecutor +extends ScheduledExecutorService
+
An Executor backed by the Filter Dispatch Thread. That is the single thread associated with the Channel for + a Filter Instance. All invocations of that instance's methods are made by the Filter Dispatch Thread. +

+ If all accesses/mutations of Filter Members happen on the Filter Dispatch Thread, then those interactions are + serial and threadsafe. This executor enables Authors to do work in uncontrolled threads and then return to + the Filter Dispatch Thread to take advantage of this convenient threading guarantee. +

+

+ Note that implementations of FilterDispatchExecutor will not honour the shut-down methods ExecutorService.shutdown() + and ExecutorService.shutdownNow() and will throw a RuntimeException if those methods are called, as the client is + not allowed to shut down the Filter Dispatch Thread. +

+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      isInFilterDispatchThread

      +
      boolean isInFilterDispatchThread()
      +
      +
      Returns:
      +
      Return true if Thread.currentThread() is this Filter Dispatch Thread, false otherwise
      +
      +
      +
    • +
    • +
      +

      completeOnFilterDispatchThread

      +
      <T> CompletionStage<T> completeOnFilterDispatchThread(CompletionStage<T> stage)
      +
      Switches to this Filter Dispatch Thread. The CompletionStage returned is an implementation + that discourages blocking work and will throw if the client attempts to call + CompletionStage.toCompletableFuture(). Any async work chained onto the + result CompletionStage using methods like CompletionStage.thenApplyAsync(Function) + will also be executed on the Filter Dispatch Thread.
      +
      +
      Type Parameters:
      +
      T - stage value type
      +
      Parameters:
      +
      stage - input stage
      +
      Returns:
      +
      a stage completed (both exceptionally and normally) by this Filter Dispatch Thread
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterFactory.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterFactory.html new file mode 100644 index 0000000..3d7ca58 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterFactory.html @@ -0,0 +1,232 @@ + + + + +FilterFactory (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface FilterFactory<C,I>

+
+
+
+
Type Parameters:
+
C - the type of configuration used to create the Filter. Use Void if the Filter is not configurable.
+
I - The type of the initialization data
+
+
+
public interface FilterFactory<C,I>
+

A pluggable source of Filter instances.

+

FilterFactories are:

+
    +
  • service implementations provided by filter authors
  • +
  • called by the proxy runtime to create filter instances
  • +
+ +

The proxy runtime guarantees that:

+
    +
  1. instances will be initialized before any attempt to create filter instances,
  2. +
  3. instances will eventually be close(Object) closed} if and only if they were successfully initialized,
  4. +
  5. no attempts to create filter instances will be made once a FilterFactory instance is closed,
  6. +
  7. instances will be initialized and closed on the same thread.
  8. +
+

Filter instance creation can happen on a different thread than initialization or cleanup. + It is suggested to pass state using via the return value from createFilter(FilterFactoryContext, Object) rather than + relying on synchronization within a filter factory implementation.

+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    default void
    +
    close(I initializationData)
    +
    +
    Called by the runtime to release any resources associated with the given initializationData.
    +
    + +
    createFilter(FilterFactoryContext context, + I initializationData)
    +
    +
    Creates an instance of the Filter.
    +
    + +
    initialize(FilterFactoryContext context, + C config)
    +
    +
    Initializes the factory with the specified configuration.
    +
    +
    +
    +
    +
    +
  • +
+
+
+ +
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterFactoryContext.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterFactoryContext.html new file mode 100644 index 0000000..55cfc6b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterFactoryContext.html @@ -0,0 +1,202 @@ + + + + +FilterFactoryContext (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface FilterFactoryContext

+
+
+
+
public interface FilterFactoryContext
+
Construction context for Filters. Used to pass the filter configuration and environmental resources + to the FilterFactory when it is creating a new instance of the Filter. see FilterFactory.createFilter(FilterFactoryContext, Object)
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
    +
    An executor backed by the single Thread responsible for dispatching + work to a Filter instance for a channel.
    +
    +
    <P> Set<String>
    + +
    +
    Returns the implementation names of the registered instances of this plugin.
    +
    +
    <P> P
    +
    pluginInstance(Class<P> pluginClass, + String implementationName)
    +
    +
    Gets a plugin instance for the given plugin type and name
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      filterDispatchExecutor

      +
      FilterDispatchExecutor filterDispatchExecutor()
      +
      An executor backed by the single Thread responsible for dispatching + work to a Filter instance for a channel. + It is safe to mutate Filter members from this executor.
      +
      +
      Returns:
      +
      executor
      +
      Throws:
      +
      IllegalStateException - if the factory is not bound to a channel yet.
      +
      +
      +
    • +
    • +
      +

      pluginInstance

      +
      <P> P pluginInstance(Class<P> pluginClass, + String implementationName)
      +
      Gets a plugin instance for the given plugin type and name
      +
      +
      Type Parameters:
      +
      P - The plugin manager type
      +
      Parameters:
      +
      pluginClass - The plugin type
      +
      implementationName - The plugin implementation name
      +
      Returns:
      +
      The plugin instance
      +
      Throws:
      +
      UnknownPluginInstanceException - the plugin with given implementation name is unknown
      +
      +
      +
    • +
    • +
      +

      pluginImplementationNames

      +
      <P> Set<String> pluginImplementationNames(Class<P> pluginClass)
      +
      Returns the implementation names of the registered instances of this plugin.
      +
      +
      Type Parameters:
      +
      P - The plugin manager type
      +
      Parameters:
      +
      pluginClass - The plugin type
      +
      Returns:
      +
      set of known implementation names registered for the given plugin class.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterResult.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterResult.html new file mode 100644 index 0000000..0e0cc42 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterResult.html @@ -0,0 +1,219 @@ + + + + +FilterResult (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface FilterResult

+
+
+
+
All Known Subinterfaces:
+
RequestFilterResult, ResponseFilterResult
+
+
+
public interface FilterResult
+
The result of a filter request or response operation that encapsulates the request or response + to be forwarded to the next filter in the chain. Optionally it carries orders for actions such + as close the connection or drop the message.
+
+
See Also:
+
+ +
+
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    boolean
    + +
    +
    signals the filter's wish that the connection will be closed. if the filter provides a + message it will be forwarded before the connection is closed.
    +
    +
    boolean
    + +
    +
    signals the filter's wish that message is dropped i.e. not forwarded to the next filter + in the chain.
    +
    +
    org.apache.kafka.common.protocol.ApiMessage
    + +
    +
    the header to be forwarded to the next filter in the chain.
    +
    +
    org.apache.kafka.common.protocol.ApiMessage
    + +
    +
    the message to be forwarded to the next filter in the chain.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      header

      +
      @Nullable +org.apache.kafka.common.protocol.ApiMessage header()
      +
      the header to be forwarded to the next filter in the chain.
      +
      +
      Returns:
      +
      header.
      +
      +
      +
    • +
    • +
      +

      message

      +
      @Nullable +org.apache.kafka.common.protocol.ApiMessage message()
      +
      the message to be forwarded to the next filter in the chain.
      +
      +
      Returns:
      +
      header.
      +
      +
      +
    • +
    • +
      +

      closeConnection

      +
      boolean closeConnection()
      +
      signals the filter's wish that the connection will be closed. if the filter provides a + message it will be forwarded before the connection is closed.
      +
      +
      Returns:
      +
      true if the connection is to be closed.
      +
      +
      +
    • +
    • +
      +

      drop

      +
      boolean drop()
      +
      signals the filter's wish that message is dropped i.e. not forwarded to the next filter + in the chain.
      +
      +
      Returns:
      +
      true if message is to be dropped.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterResultBuilder.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterResultBuilder.html new file mode 100644 index 0000000..d1b76ec --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FilterResultBuilder.html @@ -0,0 +1,196 @@ + + + + +FilterResultBuilder (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface FilterResultBuilder<H extends org.apache.kafka.common.protocol.ApiMessage,R extends FilterResult>

+
+
+
+
Type Parameters:
+
H - kafka api message header class
+
R - filter result
+
+
+
All Superinterfaces:
+
CloseStage<R>
+
+
+
All Known Subinterfaces:
+
RequestFilterResultBuilder, ResponseFilterResultBuilder
+
+
+
public interface FilterResultBuilder<H extends org.apache.kafka.common.protocol.ApiMessage,R extends FilterResult> +extends CloseStage<R>
+
Fluent builder for filter results.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
    +
    Signals the filter's wish that the message is dropped i.e. not forwarded to the next filter + in the chain.
    +
    + +
    forward(H header, + org.apache.kafka.common.protocol.ApiMessage message)
    +
    +
    A forward of a request or response message to the next filter in the chain.
    +
    +
    +
    +
    +
    +

    Methods inherited from interface io.kroxylicious.proxy.filter.filterresultbuilder.CloseStage

    +withCloseConnection
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      forward

      +
      CloseOrTerminalStage<R> forward(H header, + org.apache.kafka.common.protocol.ApiMessage message) + throws IllegalArgumentException
      +
      A forward of a request or response message to the next filter in the chain.
      +
      +
      Parameters:
      +
      header - message header. May not be null.
      +
      message - api message. May not be null. for request messages the class must have a name + that that ends with RequestData. for response messages the class must have one + that ends with ResponseData.
      +
      Returns:
      +
      next stage in the fluent builder API
      +
      Throws:
      +
      IllegalArgumentException - header or message do not meet criteria described above.
      +
      +
      +
    • +
    • +
      +

      drop

      +
      TerminalStage<R> drop()
      +
      Signals the filter's wish that the message is dropped i.e. not forwarded to the next filter + in the chain.
      +
      +
      Returns:
      +
      last stage in the fluent API.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FindCoordinatorRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FindCoordinatorRequestFilter.html new file mode 100644 index 0000000..23204d0 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FindCoordinatorRequestFilter.html @@ -0,0 +1,202 @@ + + + + +FindCoordinatorRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface FindCoordinatorRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface FindCoordinatorRequestFilter +extends Filter
+
A stateless filter for FindCoordinatorRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onFindCoordinatorRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.FindCoordinatorRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type FindCoordinatorRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleFindCoordinatorRequest

      +
      default boolean shouldHandleFindCoordinatorRequest(short apiVersion)
      +
      Determine if a request message of type FindCoordinatorRequest should be handled by + this filter implementation. + returns true then onFindCoordinatorRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onFindCoordinatorRequest

      +
      CompletionStage<RequestFilterResult> onFindCoordinatorRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.FindCoordinatorRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FindCoordinatorResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FindCoordinatorResponseFilter.html new file mode 100644 index 0000000..3c7274d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/FindCoordinatorResponseFilter.html @@ -0,0 +1,202 @@ + + + + +FindCoordinatorResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface FindCoordinatorResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface FindCoordinatorResponseFilter +extends Filter
+
A stateless filter for FindCoordinatorResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onFindCoordinatorResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.FindCoordinatorResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type FindCoordinatorResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleFindCoordinatorResponse

      +
      default boolean shouldHandleFindCoordinatorResponse(short apiVersion)
      +
      Determine if a response message of type FindCoordinatorResponse should be handled by + this filter implementation. + returns true then onFindCoordinatorResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onFindCoordinatorResponse

      +
      CompletionStage<ResponseFilterResult> onFindCoordinatorResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.FindCoordinatorResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/GetTelemetrySubscriptionsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/GetTelemetrySubscriptionsRequestFilter.html new file mode 100644 index 0000000..0ad281f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/GetTelemetrySubscriptionsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +GetTelemetrySubscriptionsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface GetTelemetrySubscriptionsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface GetTelemetrySubscriptionsRequestFilter +extends Filter
+
A stateless filter for GetTelemetrySubscriptionsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onGetTelemetrySubscriptionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.GetTelemetrySubscriptionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type GetTelemetrySubscriptionsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleGetTelemetrySubscriptionsRequest

      +
      default boolean shouldHandleGetTelemetrySubscriptionsRequest(short apiVersion)
      +
      Determine if a request message of type GetTelemetrySubscriptionsRequest should be handled by + this filter implementation. + returns true then onGetTelemetrySubscriptionsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onGetTelemetrySubscriptionsRequest

      +
      CompletionStage<RequestFilterResult> onGetTelemetrySubscriptionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.GetTelemetrySubscriptionsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/GetTelemetrySubscriptionsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/GetTelemetrySubscriptionsResponseFilter.html new file mode 100644 index 0000000..3d3aa0e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/GetTelemetrySubscriptionsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +GetTelemetrySubscriptionsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface GetTelemetrySubscriptionsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface GetTelemetrySubscriptionsResponseFilter +extends Filter
+
A stateless filter for GetTelemetrySubscriptionsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onGetTelemetrySubscriptionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.GetTelemetrySubscriptionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type GetTelemetrySubscriptionsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleGetTelemetrySubscriptionsResponse

      +
      default boolean shouldHandleGetTelemetrySubscriptionsResponse(short apiVersion)
      +
      Determine if a response message of type GetTelemetrySubscriptionsResponse should be handled by + this filter implementation. + returns true then onGetTelemetrySubscriptionsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onGetTelemetrySubscriptionsResponse

      +
      CompletionStage<ResponseFilterResult> onGetTelemetrySubscriptionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.GetTelemetrySubscriptionsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/HeartbeatRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/HeartbeatRequestFilter.html new file mode 100644 index 0000000..8dfe59b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/HeartbeatRequestFilter.html @@ -0,0 +1,202 @@ + + + + +HeartbeatRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface HeartbeatRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface HeartbeatRequestFilter +extends Filter
+
A stateless filter for HeartbeatRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.HeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    +
    shouldHandleHeartbeatRequest(short apiVersion)
    +
    +
    Determine if a request message of type HeartbeatRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleHeartbeatRequest

      +
      default boolean shouldHandleHeartbeatRequest(short apiVersion)
      +
      Determine if a request message of type HeartbeatRequest should be handled by + this filter implementation. + returns true then onHeartbeatRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onHeartbeatRequest

      +
      CompletionStage<RequestFilterResult> onHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.HeartbeatRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/HeartbeatResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/HeartbeatResponseFilter.html new file mode 100644 index 0000000..fcf690d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/HeartbeatResponseFilter.html @@ -0,0 +1,202 @@ + + + + +HeartbeatResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface HeartbeatResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface HeartbeatResponseFilter +extends Filter
+
A stateless filter for HeartbeatResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.HeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type HeartbeatResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleHeartbeatResponse

      +
      default boolean shouldHandleHeartbeatResponse(short apiVersion)
      +
      Determine if a response message of type HeartbeatResponse should be handled by + this filter implementation. + returns true then onHeartbeatResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onHeartbeatResponse

      +
      CompletionStage<ResponseFilterResult> onHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.HeartbeatResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/IncrementalAlterConfigsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/IncrementalAlterConfigsRequestFilter.html new file mode 100644 index 0000000..9e5055a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/IncrementalAlterConfigsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +IncrementalAlterConfigsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface IncrementalAlterConfigsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface IncrementalAlterConfigsRequestFilter +extends Filter
+
A stateless filter for IncrementalAlterConfigsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onIncrementalAlterConfigsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.IncrementalAlterConfigsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type IncrementalAlterConfigsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleIncrementalAlterConfigsRequest

      +
      default boolean shouldHandleIncrementalAlterConfigsRequest(short apiVersion)
      +
      Determine if a request message of type IncrementalAlterConfigsRequest should be handled by + this filter implementation. + returns true then onIncrementalAlterConfigsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onIncrementalAlterConfigsRequest

      +
      CompletionStage<RequestFilterResult> onIncrementalAlterConfigsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.IncrementalAlterConfigsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/IncrementalAlterConfigsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/IncrementalAlterConfigsResponseFilter.html new file mode 100644 index 0000000..c362fea --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/IncrementalAlterConfigsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +IncrementalAlterConfigsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface IncrementalAlterConfigsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface IncrementalAlterConfigsResponseFilter +extends Filter
+
A stateless filter for IncrementalAlterConfigsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onIncrementalAlterConfigsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.IncrementalAlterConfigsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type IncrementalAlterConfigsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleIncrementalAlterConfigsResponse

      +
      default boolean shouldHandleIncrementalAlterConfigsResponse(short apiVersion)
      +
      Determine if a response message of type IncrementalAlterConfigsResponse should be handled by + this filter implementation. + returns true then onIncrementalAlterConfigsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onIncrementalAlterConfigsResponse

      +
      CompletionStage<ResponseFilterResult> onIncrementalAlterConfigsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.IncrementalAlterConfigsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/InitProducerIdRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/InitProducerIdRequestFilter.html new file mode 100644 index 0000000..d29f6b6 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/InitProducerIdRequestFilter.html @@ -0,0 +1,202 @@ + + + + +InitProducerIdRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface InitProducerIdRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface InitProducerIdRequestFilter +extends Filter
+
A stateless filter for InitProducerIdRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onInitProducerIdRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.InitProducerIdRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type InitProducerIdRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleInitProducerIdRequest

      +
      default boolean shouldHandleInitProducerIdRequest(short apiVersion)
      +
      Determine if a request message of type InitProducerIdRequest should be handled by + this filter implementation. + returns true then onInitProducerIdRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onInitProducerIdRequest

      +
      CompletionStage<RequestFilterResult> onInitProducerIdRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.InitProducerIdRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/InitProducerIdResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/InitProducerIdResponseFilter.html new file mode 100644 index 0000000..cd3092d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/InitProducerIdResponseFilter.html @@ -0,0 +1,202 @@ + + + + +InitProducerIdResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface InitProducerIdResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface InitProducerIdResponseFilter +extends Filter
+
A stateless filter for InitProducerIdResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onInitProducerIdResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.InitProducerIdResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type InitProducerIdResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleInitProducerIdResponse

      +
      default boolean shouldHandleInitProducerIdResponse(short apiVersion)
      +
      Determine if a response message of type InitProducerIdResponse should be handled by + this filter implementation. + returns true then onInitProducerIdResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onInitProducerIdResponse

      +
      CompletionStage<ResponseFilterResult> onInitProducerIdResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.InitProducerIdResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/InitializeShareGroupStateRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/InitializeShareGroupStateRequestFilter.html new file mode 100644 index 0000000..a80877b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/InitializeShareGroupStateRequestFilter.html @@ -0,0 +1,202 @@ + + + + +InitializeShareGroupStateRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface InitializeShareGroupStateRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface InitializeShareGroupStateRequestFilter +extends Filter
+
A stateless filter for InitializeShareGroupStateRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onInitializeShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.InitializeShareGroupStateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type InitializeShareGroupStateRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleInitializeShareGroupStateRequest

      +
      default boolean shouldHandleInitializeShareGroupStateRequest(short apiVersion)
      +
      Determine if a request message of type InitializeShareGroupStateRequest should be handled by + this filter implementation. + returns true then onInitializeShareGroupStateRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onInitializeShareGroupStateRequest

      +
      CompletionStage<RequestFilterResult> onInitializeShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.InitializeShareGroupStateRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/InitializeShareGroupStateResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/InitializeShareGroupStateResponseFilter.html new file mode 100644 index 0000000..26f0fa1 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/InitializeShareGroupStateResponseFilter.html @@ -0,0 +1,202 @@ + + + + +InitializeShareGroupStateResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface InitializeShareGroupStateResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface InitializeShareGroupStateResponseFilter +extends Filter
+
A stateless filter for InitializeShareGroupStateResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onInitializeShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.InitializeShareGroupStateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type InitializeShareGroupStateResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleInitializeShareGroupStateResponse

      +
      default boolean shouldHandleInitializeShareGroupStateResponse(short apiVersion)
      +
      Determine if a response message of type InitializeShareGroupStateResponse should be handled by + this filter implementation. + returns true then onInitializeShareGroupStateResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onInitializeShareGroupStateResponse

      +
      CompletionStage<ResponseFilterResult> onInitializeShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.InitializeShareGroupStateResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/JoinGroupRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/JoinGroupRequestFilter.html new file mode 100644 index 0000000..118aeb3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/JoinGroupRequestFilter.html @@ -0,0 +1,202 @@ + + + + +JoinGroupRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface JoinGroupRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface JoinGroupRequestFilter +extends Filter
+
A stateless filter for JoinGroupRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onJoinGroupRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.JoinGroupRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    +
    shouldHandleJoinGroupRequest(short apiVersion)
    +
    +
    Determine if a request message of type JoinGroupRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleJoinGroupRequest

      +
      default boolean shouldHandleJoinGroupRequest(short apiVersion)
      +
      Determine if a request message of type JoinGroupRequest should be handled by + this filter implementation. + returns true then onJoinGroupRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onJoinGroupRequest

      +
      CompletionStage<RequestFilterResult> onJoinGroupRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.JoinGroupRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/JoinGroupResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/JoinGroupResponseFilter.html new file mode 100644 index 0000000..6252513 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/JoinGroupResponseFilter.html @@ -0,0 +1,202 @@ + + + + +JoinGroupResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface JoinGroupResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface JoinGroupResponseFilter +extends Filter
+
A stateless filter for JoinGroupResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onJoinGroupResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.JoinGroupResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type JoinGroupResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleJoinGroupResponse

      +
      default boolean shouldHandleJoinGroupResponse(short apiVersion)
      +
      Determine if a response message of type JoinGroupResponse should be handled by + this filter implementation. + returns true then onJoinGroupResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onJoinGroupResponse

      +
      CompletionStage<ResponseFilterResult> onJoinGroupResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.JoinGroupResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/LeaveGroupRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/LeaveGroupRequestFilter.html new file mode 100644 index 0000000..44b6e25 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/LeaveGroupRequestFilter.html @@ -0,0 +1,202 @@ + + + + +LeaveGroupRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface LeaveGroupRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface LeaveGroupRequestFilter +extends Filter
+
A stateless filter for LeaveGroupRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onLeaveGroupRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.LeaveGroupRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type LeaveGroupRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleLeaveGroupRequest

      +
      default boolean shouldHandleLeaveGroupRequest(short apiVersion)
      +
      Determine if a request message of type LeaveGroupRequest should be handled by + this filter implementation. + returns true then onLeaveGroupRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onLeaveGroupRequest

      +
      CompletionStage<RequestFilterResult> onLeaveGroupRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.LeaveGroupRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/LeaveGroupResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/LeaveGroupResponseFilter.html new file mode 100644 index 0000000..c4f94d0 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/LeaveGroupResponseFilter.html @@ -0,0 +1,202 @@ + + + + +LeaveGroupResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface LeaveGroupResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface LeaveGroupResponseFilter +extends Filter
+
A stateless filter for LeaveGroupResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onLeaveGroupResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.LeaveGroupResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type LeaveGroupResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleLeaveGroupResponse

      +
      default boolean shouldHandleLeaveGroupResponse(short apiVersion)
      +
      Determine if a response message of type LeaveGroupResponse should be handled by + this filter implementation. + returns true then onLeaveGroupResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onLeaveGroupResponse

      +
      CompletionStage<ResponseFilterResult> onLeaveGroupResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.LeaveGroupResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListConfigResourcesRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListConfigResourcesRequestFilter.html new file mode 100644 index 0000000..4459980 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListConfigResourcesRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ListConfigResourcesRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ListConfigResourcesRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ListConfigResourcesRequestFilter +extends Filter
+
A stateless filter for ListConfigResourcesRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onListConfigResourcesRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListConfigResourcesRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ListConfigResourcesRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleListConfigResourcesRequest

      +
      default boolean shouldHandleListConfigResourcesRequest(short apiVersion)
      +
      Determine if a request message of type ListConfigResourcesRequest should be handled by + this filter implementation. + returns true then onListConfigResourcesRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onListConfigResourcesRequest

      +
      CompletionStage<RequestFilterResult> onListConfigResourcesRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListConfigResourcesRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListConfigResourcesResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListConfigResourcesResponseFilter.html new file mode 100644 index 0000000..03c6bc7 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListConfigResourcesResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ListConfigResourcesResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ListConfigResourcesResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ListConfigResourcesResponseFilter +extends Filter
+
A stateless filter for ListConfigResourcesResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onListConfigResourcesResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListConfigResourcesResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ListConfigResourcesResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleListConfigResourcesResponse

      +
      default boolean shouldHandleListConfigResourcesResponse(short apiVersion)
      +
      Determine if a response message of type ListConfigResourcesResponse should be handled by + this filter implementation. + returns true then onListConfigResourcesResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onListConfigResourcesResponse

      +
      CompletionStage<ResponseFilterResult> onListConfigResourcesResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListConfigResourcesResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListGroupsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListGroupsRequestFilter.html new file mode 100644 index 0000000..6398a3c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListGroupsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ListGroupsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ListGroupsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ListGroupsRequestFilter +extends Filter
+
A stateless filter for ListGroupsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onListGroupsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListGroupsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ListGroupsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleListGroupsRequest

      +
      default boolean shouldHandleListGroupsRequest(short apiVersion)
      +
      Determine if a request message of type ListGroupsRequest should be handled by + this filter implementation. + returns true then onListGroupsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onListGroupsRequest

      +
      CompletionStage<RequestFilterResult> onListGroupsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListGroupsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListGroupsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListGroupsResponseFilter.html new file mode 100644 index 0000000..f535071 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListGroupsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ListGroupsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ListGroupsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ListGroupsResponseFilter +extends Filter
+
A stateless filter for ListGroupsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onListGroupsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListGroupsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ListGroupsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleListGroupsResponse

      +
      default boolean shouldHandleListGroupsResponse(short apiVersion)
      +
      Determine if a response message of type ListGroupsResponse should be handled by + this filter implementation. + returns true then onListGroupsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onListGroupsResponse

      +
      CompletionStage<ResponseFilterResult> onListGroupsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListGroupsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListOffsetsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListOffsetsRequestFilter.html new file mode 100644 index 0000000..e77f0fc --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListOffsetsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ListOffsetsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ListOffsetsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ListOffsetsRequestFilter +extends Filter
+
A stateless filter for ListOffsetsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onListOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListOffsetsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ListOffsetsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleListOffsetsRequest

      +
      default boolean shouldHandleListOffsetsRequest(short apiVersion)
      +
      Determine if a request message of type ListOffsetsRequest should be handled by + this filter implementation. + returns true then onListOffsetsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onListOffsetsRequest

      +
      CompletionStage<RequestFilterResult> onListOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListOffsetsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListOffsetsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListOffsetsResponseFilter.html new file mode 100644 index 0000000..44f0a7c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListOffsetsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ListOffsetsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ListOffsetsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ListOffsetsResponseFilter +extends Filter
+
A stateless filter for ListOffsetsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onListOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListOffsetsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ListOffsetsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleListOffsetsResponse

      +
      default boolean shouldHandleListOffsetsResponse(short apiVersion)
      +
      Determine if a response message of type ListOffsetsResponse should be handled by + this filter implementation. + returns true then onListOffsetsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onListOffsetsResponse

      +
      CompletionStage<ResponseFilterResult> onListOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListOffsetsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListPartitionReassignmentsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListPartitionReassignmentsRequestFilter.html new file mode 100644 index 0000000..eee71a0 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListPartitionReassignmentsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ListPartitionReassignmentsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ListPartitionReassignmentsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ListPartitionReassignmentsRequestFilter +extends Filter
+
A stateless filter for ListPartitionReassignmentsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onListPartitionReassignmentsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListPartitionReassignmentsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ListPartitionReassignmentsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleListPartitionReassignmentsRequest

      +
      default boolean shouldHandleListPartitionReassignmentsRequest(short apiVersion)
      +
      Determine if a request message of type ListPartitionReassignmentsRequest should be handled by + this filter implementation. + returns true then onListPartitionReassignmentsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onListPartitionReassignmentsRequest

      +
      CompletionStage<RequestFilterResult> onListPartitionReassignmentsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListPartitionReassignmentsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListPartitionReassignmentsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListPartitionReassignmentsResponseFilter.html new file mode 100644 index 0000000..6afabe1 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListPartitionReassignmentsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ListPartitionReassignmentsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ListPartitionReassignmentsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ListPartitionReassignmentsResponseFilter +extends Filter
+
A stateless filter for ListPartitionReassignmentsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onListPartitionReassignmentsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListPartitionReassignmentsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ListPartitionReassignmentsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleListPartitionReassignmentsResponse

      +
      default boolean shouldHandleListPartitionReassignmentsResponse(short apiVersion)
      +
      Determine if a response message of type ListPartitionReassignmentsResponse should be handled by + this filter implementation. + returns true then onListPartitionReassignmentsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onListPartitionReassignmentsResponse

      +
      CompletionStage<ResponseFilterResult> onListPartitionReassignmentsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListPartitionReassignmentsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListTransactionsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListTransactionsRequestFilter.html new file mode 100644 index 0000000..05659f6 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListTransactionsRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ListTransactionsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ListTransactionsRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ListTransactionsRequestFilter +extends Filter
+
A stateless filter for ListTransactionsRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onListTransactionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListTransactionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ListTransactionsRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleListTransactionsRequest

      +
      default boolean shouldHandleListTransactionsRequest(short apiVersion)
      +
      Determine if a request message of type ListTransactionsRequest should be handled by + this filter implementation. + returns true then onListTransactionsRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onListTransactionsRequest

      +
      CompletionStage<RequestFilterResult> onListTransactionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListTransactionsRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListTransactionsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListTransactionsResponseFilter.html new file mode 100644 index 0000000..23542ff --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ListTransactionsResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ListTransactionsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ListTransactionsResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ListTransactionsResponseFilter +extends Filter
+
A stateless filter for ListTransactionsResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onListTransactionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListTransactionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ListTransactionsResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleListTransactionsResponse

      +
      default boolean shouldHandleListTransactionsResponse(short apiVersion)
      +
      Determine if a response message of type ListTransactionsResponse should be handled by + this filter implementation. + returns true then onListTransactionsResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onListTransactionsResponse

      +
      CompletionStage<ResponseFilterResult> onListTransactionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListTransactionsResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/MetadataRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/MetadataRequestFilter.html new file mode 100644 index 0000000..958108e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/MetadataRequestFilter.html @@ -0,0 +1,202 @@ + + + + +MetadataRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface MetadataRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface MetadataRequestFilter +extends Filter
+
A stateless filter for MetadataRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onMetadataRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.MetadataRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    +
    shouldHandleMetadataRequest(short apiVersion)
    +
    +
    Determine if a request message of type MetadataRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleMetadataRequest

      +
      default boolean shouldHandleMetadataRequest(short apiVersion)
      +
      Determine if a request message of type MetadataRequest should be handled by + this filter implementation. + returns true then onMetadataRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onMetadataRequest

      +
      CompletionStage<RequestFilterResult> onMetadataRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.MetadataRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/MetadataResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/MetadataResponseFilter.html new file mode 100644 index 0000000..6ec4252 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/MetadataResponseFilter.html @@ -0,0 +1,202 @@ + + + + +MetadataResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface MetadataResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface MetadataResponseFilter +extends Filter
+
A stateless filter for MetadataResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onMetadataResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.MetadataResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    +
    shouldHandleMetadataResponse(short apiVersion)
    +
    +
    Determine if a response message of type MetadataResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleMetadataResponse

      +
      default boolean shouldHandleMetadataResponse(short apiVersion)
      +
      Determine if a response message of type MetadataResponse should be handled by + this filter implementation. + returns true then onMetadataResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onMetadataResponse

      +
      CompletionStage<ResponseFilterResult> onMetadataResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.MetadataResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetCommitRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetCommitRequestFilter.html new file mode 100644 index 0000000..2318da3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetCommitRequestFilter.html @@ -0,0 +1,202 @@ + + + + +OffsetCommitRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface OffsetCommitRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface OffsetCommitRequestFilter +extends Filter
+
A stateless filter for OffsetCommitRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onOffsetCommitRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetCommitRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type OffsetCommitRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleOffsetCommitRequest

      +
      default boolean shouldHandleOffsetCommitRequest(short apiVersion)
      +
      Determine if a request message of type OffsetCommitRequest should be handled by + this filter implementation. + returns true then onOffsetCommitRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onOffsetCommitRequest

      +
      CompletionStage<RequestFilterResult> onOffsetCommitRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetCommitRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetCommitResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetCommitResponseFilter.html new file mode 100644 index 0000000..57c8cca --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetCommitResponseFilter.html @@ -0,0 +1,202 @@ + + + + +OffsetCommitResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface OffsetCommitResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface OffsetCommitResponseFilter +extends Filter
+
A stateless filter for OffsetCommitResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onOffsetCommitResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetCommitResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type OffsetCommitResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleOffsetCommitResponse

      +
      default boolean shouldHandleOffsetCommitResponse(short apiVersion)
      +
      Determine if a response message of type OffsetCommitResponse should be handled by + this filter implementation. + returns true then onOffsetCommitResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onOffsetCommitResponse

      +
      CompletionStage<ResponseFilterResult> onOffsetCommitResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetCommitResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetDeleteRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetDeleteRequestFilter.html new file mode 100644 index 0000000..eed2b51 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetDeleteRequestFilter.html @@ -0,0 +1,202 @@ + + + + +OffsetDeleteRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface OffsetDeleteRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface OffsetDeleteRequestFilter +extends Filter
+
A stateless filter for OffsetDeleteRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onOffsetDeleteRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetDeleteRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type OffsetDeleteRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleOffsetDeleteRequest

      +
      default boolean shouldHandleOffsetDeleteRequest(short apiVersion)
      +
      Determine if a request message of type OffsetDeleteRequest should be handled by + this filter implementation. + returns true then onOffsetDeleteRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onOffsetDeleteRequest

      +
      CompletionStage<RequestFilterResult> onOffsetDeleteRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetDeleteRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetDeleteResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetDeleteResponseFilter.html new file mode 100644 index 0000000..d2c1ce4 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetDeleteResponseFilter.html @@ -0,0 +1,202 @@ + + + + +OffsetDeleteResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface OffsetDeleteResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface OffsetDeleteResponseFilter +extends Filter
+
A stateless filter for OffsetDeleteResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onOffsetDeleteResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetDeleteResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type OffsetDeleteResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleOffsetDeleteResponse

      +
      default boolean shouldHandleOffsetDeleteResponse(short apiVersion)
      +
      Determine if a response message of type OffsetDeleteResponse should be handled by + this filter implementation. + returns true then onOffsetDeleteResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onOffsetDeleteResponse

      +
      CompletionStage<ResponseFilterResult> onOffsetDeleteResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetDeleteResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetFetchRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetFetchRequestFilter.html new file mode 100644 index 0000000..08fecf6 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetFetchRequestFilter.html @@ -0,0 +1,202 @@ + + + + +OffsetFetchRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface OffsetFetchRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface OffsetFetchRequestFilter +extends Filter
+
A stateless filter for OffsetFetchRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onOffsetFetchRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetFetchRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type OffsetFetchRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleOffsetFetchRequest

      +
      default boolean shouldHandleOffsetFetchRequest(short apiVersion)
      +
      Determine if a request message of type OffsetFetchRequest should be handled by + this filter implementation. + returns true then onOffsetFetchRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onOffsetFetchRequest

      +
      CompletionStage<RequestFilterResult> onOffsetFetchRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetFetchRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetFetchResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetFetchResponseFilter.html new file mode 100644 index 0000000..e188935 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetFetchResponseFilter.html @@ -0,0 +1,202 @@ + + + + +OffsetFetchResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface OffsetFetchResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface OffsetFetchResponseFilter +extends Filter
+
A stateless filter for OffsetFetchResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onOffsetFetchResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetFetchResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type OffsetFetchResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleOffsetFetchResponse

      +
      default boolean shouldHandleOffsetFetchResponse(short apiVersion)
      +
      Determine if a response message of type OffsetFetchResponse should be handled by + this filter implementation. + returns true then onOffsetFetchResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onOffsetFetchResponse

      +
      CompletionStage<ResponseFilterResult> onOffsetFetchResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetFetchResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetForLeaderEpochRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetForLeaderEpochRequestFilter.html new file mode 100644 index 0000000..53bd5e5 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetForLeaderEpochRequestFilter.html @@ -0,0 +1,202 @@ + + + + +OffsetForLeaderEpochRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface OffsetForLeaderEpochRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface OffsetForLeaderEpochRequestFilter +extends Filter
+
A stateless filter for OffsetForLeaderEpochRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onOffsetForLeaderEpochRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetForLeaderEpochRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type OffsetForLeaderEpochRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleOffsetForLeaderEpochRequest

      +
      default boolean shouldHandleOffsetForLeaderEpochRequest(short apiVersion)
      +
      Determine if a request message of type OffsetForLeaderEpochRequest should be handled by + this filter implementation. + returns true then onOffsetForLeaderEpochRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onOffsetForLeaderEpochRequest

      +
      CompletionStage<RequestFilterResult> onOffsetForLeaderEpochRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetForLeaderEpochRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetForLeaderEpochResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetForLeaderEpochResponseFilter.html new file mode 100644 index 0000000..5c754fe --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/OffsetForLeaderEpochResponseFilter.html @@ -0,0 +1,202 @@ + + + + +OffsetForLeaderEpochResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface OffsetForLeaderEpochResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface OffsetForLeaderEpochResponseFilter +extends Filter
+
A stateless filter for OffsetForLeaderEpochResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onOffsetForLeaderEpochResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetForLeaderEpochResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type OffsetForLeaderEpochResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleOffsetForLeaderEpochResponse

      +
      default boolean shouldHandleOffsetForLeaderEpochResponse(short apiVersion)
      +
      Determine if a response message of type OffsetForLeaderEpochResponse should be handled by + this filter implementation. + returns true then onOffsetForLeaderEpochResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onOffsetForLeaderEpochResponse

      +
      CompletionStage<ResponseFilterResult> onOffsetForLeaderEpochResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetForLeaderEpochResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ProduceRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ProduceRequestFilter.html new file mode 100644 index 0000000..a253e38 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ProduceRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ProduceRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ProduceRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ProduceRequestFilter +extends Filter
+
A stateless filter for ProduceRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onProduceRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ProduceRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    +
    shouldHandleProduceRequest(short apiVersion)
    +
    +
    Determine if a request message of type ProduceRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleProduceRequest

      +
      default boolean shouldHandleProduceRequest(short apiVersion)
      +
      Determine if a request message of type ProduceRequest should be handled by + this filter implementation. + returns true then onProduceRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onProduceRequest

      +
      CompletionStage<RequestFilterResult> onProduceRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ProduceRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ProduceResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ProduceResponseFilter.html new file mode 100644 index 0000000..13c9239 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ProduceResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ProduceResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ProduceResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ProduceResponseFilter +extends Filter
+
A stateless filter for ProduceResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onProduceResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ProduceResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    +
    shouldHandleProduceResponse(short apiVersion)
    +
    +
    Determine if a response message of type ProduceResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleProduceResponse

      +
      default boolean shouldHandleProduceResponse(short apiVersion)
      +
      Determine if a response message of type ProduceResponse should be handled by + this filter implementation. + returns true then onProduceResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onProduceResponse

      +
      CompletionStage<ResponseFilterResult> onProduceResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ProduceResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/PushTelemetryRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/PushTelemetryRequestFilter.html new file mode 100644 index 0000000..aada087 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/PushTelemetryRequestFilter.html @@ -0,0 +1,202 @@ + + + + +PushTelemetryRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface PushTelemetryRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface PushTelemetryRequestFilter +extends Filter
+
A stateless filter for PushTelemetryRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onPushTelemetryRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.PushTelemetryRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type PushTelemetryRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandlePushTelemetryRequest

      +
      default boolean shouldHandlePushTelemetryRequest(short apiVersion)
      +
      Determine if a request message of type PushTelemetryRequest should be handled by + this filter implementation. + returns true then onPushTelemetryRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onPushTelemetryRequest

      +
      CompletionStage<RequestFilterResult> onPushTelemetryRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.PushTelemetryRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/PushTelemetryResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/PushTelemetryResponseFilter.html new file mode 100644 index 0000000..312d600 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/PushTelemetryResponseFilter.html @@ -0,0 +1,202 @@ + + + + +PushTelemetryResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface PushTelemetryResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface PushTelemetryResponseFilter +extends Filter
+
A stateless filter for PushTelemetryResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onPushTelemetryResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.PushTelemetryResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type PushTelemetryResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandlePushTelemetryResponse

      +
      default boolean shouldHandlePushTelemetryResponse(short apiVersion)
      +
      Determine if a response message of type PushTelemetryResponse should be handled by + this filter implementation. + returns true then onPushTelemetryResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onPushTelemetryResponse

      +
      CompletionStage<ResponseFilterResult> onPushTelemetryResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.PushTelemetryResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ReadShareGroupStateRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ReadShareGroupStateRequestFilter.html new file mode 100644 index 0000000..cbdb559 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ReadShareGroupStateRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ReadShareGroupStateRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ReadShareGroupStateRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ReadShareGroupStateRequestFilter +extends Filter
+
A stateless filter for ReadShareGroupStateRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onReadShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ReadShareGroupStateRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleReadShareGroupStateRequest

      +
      default boolean shouldHandleReadShareGroupStateRequest(short apiVersion)
      +
      Determine if a request message of type ReadShareGroupStateRequest should be handled by + this filter implementation. + returns true then onReadShareGroupStateRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onReadShareGroupStateRequest

      +
      CompletionStage<RequestFilterResult> onReadShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ReadShareGroupStateResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ReadShareGroupStateResponseFilter.html new file mode 100644 index 0000000..c2e1edf --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ReadShareGroupStateResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ReadShareGroupStateResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ReadShareGroupStateResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ReadShareGroupStateResponseFilter +extends Filter
+
A stateless filter for ReadShareGroupStateResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onReadShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ReadShareGroupStateResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleReadShareGroupStateResponse

      +
      default boolean shouldHandleReadShareGroupStateResponse(short apiVersion)
      +
      Determine if a response message of type ReadShareGroupStateResponse should be handled by + this filter implementation. + returns true then onReadShareGroupStateResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onReadShareGroupStateResponse

      +
      CompletionStage<ResponseFilterResult> onReadShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ReadShareGroupStateSummaryRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ReadShareGroupStateSummaryRequestFilter.html new file mode 100644 index 0000000..2bf8def --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ReadShareGroupStateSummaryRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ReadShareGroupStateSummaryRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ReadShareGroupStateSummaryRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ReadShareGroupStateSummaryRequestFilter +extends Filter
+
A stateless filter for ReadShareGroupStateSummaryRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onReadShareGroupStateSummaryRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateSummaryRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ReadShareGroupStateSummaryRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleReadShareGroupStateSummaryRequest

      +
      default boolean shouldHandleReadShareGroupStateSummaryRequest(short apiVersion)
      +
      Determine if a request message of type ReadShareGroupStateSummaryRequest should be handled by + this filter implementation. + returns true then onReadShareGroupStateSummaryRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onReadShareGroupStateSummaryRequest

      +
      CompletionStage<RequestFilterResult> onReadShareGroupStateSummaryRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateSummaryRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ReadShareGroupStateSummaryResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ReadShareGroupStateSummaryResponseFilter.html new file mode 100644 index 0000000..10b31bf --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ReadShareGroupStateSummaryResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ReadShareGroupStateSummaryResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ReadShareGroupStateSummaryResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ReadShareGroupStateSummaryResponseFilter +extends Filter
+
A stateless filter for ReadShareGroupStateSummaryResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onReadShareGroupStateSummaryResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateSummaryResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ReadShareGroupStateSummaryResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleReadShareGroupStateSummaryResponse

      +
      default boolean shouldHandleReadShareGroupStateSummaryResponse(short apiVersion)
      +
      Determine if a response message of type ReadShareGroupStateSummaryResponse should be handled by + this filter implementation. + returns true then onReadShareGroupStateSummaryResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onReadShareGroupStateSummaryResponse

      +
      CompletionStage<ResponseFilterResult> onReadShareGroupStateSummaryResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateSummaryResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RemoveRaftVoterRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RemoveRaftVoterRequestFilter.html new file mode 100644 index 0000000..bef0989 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RemoveRaftVoterRequestFilter.html @@ -0,0 +1,202 @@ + + + + +RemoveRaftVoterRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface RemoveRaftVoterRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface RemoveRaftVoterRequestFilter +extends Filter
+
A stateless filter for RemoveRaftVoterRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onRemoveRaftVoterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.RemoveRaftVoterRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type RemoveRaftVoterRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleRemoveRaftVoterRequest

      +
      default boolean shouldHandleRemoveRaftVoterRequest(short apiVersion)
      +
      Determine if a request message of type RemoveRaftVoterRequest should be handled by + this filter implementation. + returns true then onRemoveRaftVoterRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onRemoveRaftVoterRequest

      +
      CompletionStage<RequestFilterResult> onRemoveRaftVoterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.RemoveRaftVoterRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RemoveRaftVoterResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RemoveRaftVoterResponseFilter.html new file mode 100644 index 0000000..7345b3d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RemoveRaftVoterResponseFilter.html @@ -0,0 +1,202 @@ + + + + +RemoveRaftVoterResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface RemoveRaftVoterResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface RemoveRaftVoterResponseFilter +extends Filter
+
A stateless filter for RemoveRaftVoterResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onRemoveRaftVoterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.RemoveRaftVoterResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type RemoveRaftVoterResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleRemoveRaftVoterResponse

      +
      default boolean shouldHandleRemoveRaftVoterResponse(short apiVersion)
      +
      Determine if a response message of type RemoveRaftVoterResponse should be handled by + this filter implementation. + returns true then onRemoveRaftVoterResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onRemoveRaftVoterResponse

      +
      CompletionStage<ResponseFilterResult> onRemoveRaftVoterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.RemoveRaftVoterResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RenewDelegationTokenRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RenewDelegationTokenRequestFilter.html new file mode 100644 index 0000000..b06543f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RenewDelegationTokenRequestFilter.html @@ -0,0 +1,202 @@ + + + + +RenewDelegationTokenRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface RenewDelegationTokenRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface RenewDelegationTokenRequestFilter +extends Filter
+
A stateless filter for RenewDelegationTokenRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onRenewDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.RenewDelegationTokenRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type RenewDelegationTokenRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleRenewDelegationTokenRequest

      +
      default boolean shouldHandleRenewDelegationTokenRequest(short apiVersion)
      +
      Determine if a request message of type RenewDelegationTokenRequest should be handled by + this filter implementation. + returns true then onRenewDelegationTokenRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onRenewDelegationTokenRequest

      +
      CompletionStage<RequestFilterResult> onRenewDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.RenewDelegationTokenRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RenewDelegationTokenResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RenewDelegationTokenResponseFilter.html new file mode 100644 index 0000000..567690c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RenewDelegationTokenResponseFilter.html @@ -0,0 +1,202 @@ + + + + +RenewDelegationTokenResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface RenewDelegationTokenResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface RenewDelegationTokenResponseFilter +extends Filter
+
A stateless filter for RenewDelegationTokenResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onRenewDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.RenewDelegationTokenResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type RenewDelegationTokenResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleRenewDelegationTokenResponse

      +
      default boolean shouldHandleRenewDelegationTokenResponse(short apiVersion)
      +
      Determine if a response message of type RenewDelegationTokenResponse should be handled by + this filter implementation. + returns true then onRenewDelegationTokenResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onRenewDelegationTokenResponse

      +
      CompletionStage<ResponseFilterResult> onRenewDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.RenewDelegationTokenResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RequestFilter.html new file mode 100644 index 0000000..e27fcfb --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RequestFilter.html @@ -0,0 +1,259 @@ + + + + +RequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface RequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface RequestFilter +extends Filter
+

A Filter that handles all request types, for example to modify the request headers.

+ +

When a Filter implements RequestFilter:

+
    +
  • it must not also implement any of the message-specific *RequestFilter interfaces like ApiVersionsRequestFilter.
  • +
  • it may also implement either ResponseFilter or any of the message-specific *ResponseFilter interfaces, but not both.
  • +
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onRequest(org.apache.kafka.common.protocol.ApiKeys apiKey, + short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.protocol.ApiMessage request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    onRequest(org.apache.kafka.common.protocol.ApiKeys apiKey, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.protocol.ApiMessage request, + FilterContext context)
    +
    +
    Deprecated, for removal: This API element is subject to removal in a future version. + +
    +
    +
    default boolean
    +
    shouldHandleRequest(org.apache.kafka.common.protocol.ApiKeys apiKey, + short apiVersion)
    +
    +
    Does this filter implementation want to handle a request.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleRequest

      +
      default boolean shouldHandleRequest(org.apache.kafka.common.protocol.ApiKeys apiKey, + short apiVersion)
      +
      Does this filter implementation want to handle a request. If so, the + onRequest(ApiKeys, short, RequestHeaderData, ApiMessage, FilterContext) method + will be eligible to be called with the deserialized request data (if the + message reaches this filter in the filter chain).
      +
      +
      Parameters:
      +
      apiKey - the api key of the message
      +
      apiVersion - the api version of the message
      +
      Returns:
      +
      true if this filter wants to handle the request
      +
      +
      +
    • +
    • +
      +

      onRequest

      +
      @Deprecated(forRemoval=true, + since="0.19.0") +default CompletionStage<RequestFilterResult> onRequest(org.apache.kafka.common.protocol.ApiKeys apiKey, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.protocol.ApiMessage request, + FilterContext context)
      +
      Deprecated, for removal: This API element is subject to removal in a future version. + +
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiKey - key of the request
      +
      header - header of the request
      +
      request - body of the request
      +
      context - context containing methods to continue the filter chain and other contextual data
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      onRequest

      +
      default CompletionStage<RequestFilterResult> onRequest(org.apache.kafka.common.protocol.ApiKeys apiKey, + short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.protocol.ApiMessage request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiKey - key of the request
      +
      apiVersion - api version of the request
      +
      header - header of the request
      +
      request - body of the request
      +
      context - context containing methods to continue the filter chain and other contextual data
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RequestFilterResult.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RequestFilterResult.html new file mode 100644 index 0000000..396f24d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RequestFilterResult.html @@ -0,0 +1,163 @@ + + + + +RequestFilterResult (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface RequestFilterResult

+
+
+
+
All Superinterfaces:
+
FilterResult
+
+
+
public interface RequestFilterResult +extends FilterResult
+
A specialization of the FilterResult for request filters. +
+ A request filter may, rather than forwarding a request towards the broker, opt to + send a response towards the client instead. This is called a short circuit response. It + is useful for implementing validating filters.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    boolean
    + +
    +
    If true, the request is carrying a short circuit response.
    +
    +
    +
    +
    +
    +

    Methods inherited from interface io.kroxylicious.proxy.filter.FilterResult

    +closeConnection, drop, header, message
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shortCircuitResponse

      +
      boolean shortCircuitResponse()
      +
      If true, the request is carrying a short circuit response.
      +
      +
      Returns:
      +
      true if carrying a short circuit response.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RequestFilterResultBuilder.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RequestFilterResultBuilder.html new file mode 100644 index 0000000..6ac638f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/RequestFilterResultBuilder.html @@ -0,0 +1,224 @@ + + + + +RequestFilterResultBuilder (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface RequestFilterResultBuilder

+
+
+
+
All Superinterfaces:
+
CloseStage<RequestFilterResult>, FilterResultBuilder<org.apache.kafka.common.message.RequestHeaderData,RequestFilterResult>
+
+
+
public interface RequestFilterResultBuilder +extends FilterResultBuilder<org.apache.kafka.common.message.RequestHeaderData,RequestFilterResult>
+
Builder for request filter results. +
+ See RequestFilterResult for a description of short-circuit responses.
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shortCircuitResponse

      +
      CloseOrTerminalStage<RequestFilterResult> shortCircuitResponse(@Nullable + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.protocol.ApiMessage message) + throws IllegalArgumentException
      +
      A short-circuit response towards the client.
      +
      +
      Parameters:
      +
      header - response header. May be null.
      +
      message - response message. May not be null. the response messages the class must have one + that ends with ResponseData.
      +
      Returns:
      +
      next stage in the fluent builder API
      +
      Throws:
      +
      IllegalArgumentException - header or message do not meet criteria described above.
      +
      +
      +
    • +
    • +
      +

      shortCircuitResponse

      +
      CloseOrTerminalStage<RequestFilterResult> shortCircuitResponse(org.apache.kafka.common.protocol.ApiMessage message) + throws IllegalArgumentException
      +
      A short-circuit response towards the client.
      +
      +
      Parameters:
      +
      message - response message. May not be null. the response messages the class must have one + that ends with ResponseData.
      +
      Returns:
      +
      next stage in the fluent builder API
      +
      Throws:
      +
      IllegalArgumentException - header or message do not meet criteria described above.
      +
      +
      +
    • +
    • +
      +

      errorResponse

      +
      CloseOrTerminalStage<RequestFilterResult> errorResponse(org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.protocol.ApiMessage requestMessage, + ApiException apiException) + throws IllegalArgumentException
      +
      Generate a short-circuit error response towards the client. + The generated error response is API-specific, and add an error code (corresponding to the ApiException), and possibly error message (from the message of the ApiException), either at the top level of the response (if the API for the response has a global error code), or for all entities given in the request (if the API for the response has only-per entity error codes).
      +
      +
      Parameters:
      +
      header - the headers from the request
      +
      requestMessage - the API request message to generate an error in response too.
      +
      apiException - the exception that triggered the error response. Note Kafka will map the exception to an using so callers may wish to supply choose their exception to trigger the appropriate error code
      +
      Returns:
      +
      next stage in the fluent builder API
      +
      Throws:
      +
      IllegalArgumentException - header or message do not meet criteria described above.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ResponseFilter.html new file mode 100644 index 0000000..d664385 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ResponseFilter.html @@ -0,0 +1,259 @@ + + + + +ResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ResponseFilter +extends Filter
+

A Filter that handles all response types.

+ +

When a Filter implements ResponseFilter:

+
    +
  • it must not also implement any of the message-specific *ResponseFilter interfaces like ApiVersionsResponseFilter.
  • +
  • it may also implement either RequestFilter or any of the message-specific *RequestFilter interfaces, but not both.
  • +
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onResponse(org.apache.kafka.common.protocol.ApiKeys apiKey, + short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.protocol.ApiMessage response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    onResponse(org.apache.kafka.common.protocol.ApiKeys apiKey, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.protocol.ApiMessage response, + FilterContext context)
    +
    +
    Deprecated, for removal: This API element is subject to removal in a future version. + +
    +
    +
    default boolean
    +
    shouldHandleResponse(org.apache.kafka.common.protocol.ApiKeys apiKey, + short apiVersion)
    +
    +
    Does this filter implementation want to handle a response.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleResponse

      +
      default boolean shouldHandleResponse(org.apache.kafka.common.protocol.ApiKeys apiKey, + short apiVersion)
      +
      Does this filter implementation want to handle a response. If so, the + onResponse(ApiKeys, short, ResponseHeaderData, ApiMessage, FilterContext) method + will be eligible to be called with the deserialized response data (if the + message reaches this filter in the filter chain).
      +
      +
      Parameters:
      +
      apiKey - the api key of the message
      +
      apiVersion - the api version of the message
      +
      Returns:
      +
      true if this filter wants to handle the response
      +
      +
      +
    • +
    • +
      +

      onResponse

      +
      @Deprecated(forRemoval=true, + since="0.19.0") +default CompletionStage<ResponseFilterResult> onResponse(org.apache.kafka.common.protocol.ApiKeys apiKey, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.protocol.ApiMessage response, + FilterContext context)
      +
      Deprecated, for removal: This API element is subject to removal in a future version. + +
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiKey - key of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      onResponse

      +
      default CompletionStage<ResponseFilterResult> onResponse(org.apache.kafka.common.protocol.ApiKeys apiKey, + short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.protocol.ApiMessage response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiKey - key of the response
      +
      apiVersion - api version of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ResponseFilterResult.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ResponseFilterResult.html new file mode 100644 index 0000000..2e05f1a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ResponseFilterResult.html @@ -0,0 +1,121 @@ + + + + +ResponseFilterResult (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ResponseFilterResult

+
+
+
+
All Superinterfaces:
+
FilterResult
+
+
+
public interface ResponseFilterResult +extends FilterResult
+
A specialization of the FilterResult for response filters.
+
+
+ +
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ResponseFilterResultBuilder.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ResponseFilterResultBuilder.html new file mode 100644 index 0000000..a9b20d9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ResponseFilterResultBuilder.html @@ -0,0 +1,124 @@ + + + + +ResponseFilterResultBuilder (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ResponseFilterResultBuilder

+
+
+
+
All Superinterfaces:
+
CloseStage<ResponseFilterResult>, FilterResultBuilder<org.apache.kafka.common.message.ResponseHeaderData,ResponseFilterResult>
+
+
+
public interface ResponseFilterResultBuilder +extends FilterResultBuilder<org.apache.kafka.common.message.ResponseHeaderData,ResponseFilterResult>
+
Builder for response filter results.
+
+
+ +
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SaslAuthenticateRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SaslAuthenticateRequestFilter.html new file mode 100644 index 0000000..8233f5a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SaslAuthenticateRequestFilter.html @@ -0,0 +1,202 @@ + + + + +SaslAuthenticateRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface SaslAuthenticateRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface SaslAuthenticateRequestFilter +extends Filter
+
A stateless filter for SaslAuthenticateRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onSaslAuthenticateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.SaslAuthenticateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type SaslAuthenticateRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleSaslAuthenticateRequest

      +
      default boolean shouldHandleSaslAuthenticateRequest(short apiVersion)
      +
      Determine if a request message of type SaslAuthenticateRequest should be handled by + this filter implementation. + returns true then onSaslAuthenticateRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onSaslAuthenticateRequest

      +
      CompletionStage<RequestFilterResult> onSaslAuthenticateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.SaslAuthenticateRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SaslAuthenticateResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SaslAuthenticateResponseFilter.html new file mode 100644 index 0000000..f083011 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SaslAuthenticateResponseFilter.html @@ -0,0 +1,202 @@ + + + + +SaslAuthenticateResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface SaslAuthenticateResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface SaslAuthenticateResponseFilter +extends Filter
+
A stateless filter for SaslAuthenticateResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onSaslAuthenticateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.SaslAuthenticateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type SaslAuthenticateResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleSaslAuthenticateResponse

      +
      default boolean shouldHandleSaslAuthenticateResponse(short apiVersion)
      +
      Determine if a response message of type SaslAuthenticateResponse should be handled by + this filter implementation. + returns true then onSaslAuthenticateResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onSaslAuthenticateResponse

      +
      CompletionStage<ResponseFilterResult> onSaslAuthenticateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.SaslAuthenticateResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SaslHandshakeRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SaslHandshakeRequestFilter.html new file mode 100644 index 0000000..8dcfd5d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SaslHandshakeRequestFilter.html @@ -0,0 +1,202 @@ + + + + +SaslHandshakeRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface SaslHandshakeRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface SaslHandshakeRequestFilter +extends Filter
+
A stateless filter for SaslHandshakeRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onSaslHandshakeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.SaslHandshakeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type SaslHandshakeRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleSaslHandshakeRequest

      +
      default boolean shouldHandleSaslHandshakeRequest(short apiVersion)
      +
      Determine if a request message of type SaslHandshakeRequest should be handled by + this filter implementation. + returns true then onSaslHandshakeRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onSaslHandshakeRequest

      +
      CompletionStage<RequestFilterResult> onSaslHandshakeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.SaslHandshakeRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SaslHandshakeResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SaslHandshakeResponseFilter.html new file mode 100644 index 0000000..e267ae6 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SaslHandshakeResponseFilter.html @@ -0,0 +1,202 @@ + + + + +SaslHandshakeResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface SaslHandshakeResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface SaslHandshakeResponseFilter +extends Filter
+
A stateless filter for SaslHandshakeResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onSaslHandshakeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.SaslHandshakeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type SaslHandshakeResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleSaslHandshakeResponse

      +
      default boolean shouldHandleSaslHandshakeResponse(short apiVersion)
      +
      Determine if a response message of type SaslHandshakeResponse should be handled by + this filter implementation. + returns true then onSaslHandshakeResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onSaslHandshakeResponse

      +
      CompletionStage<ResponseFilterResult> onSaslHandshakeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.SaslHandshakeResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareAcknowledgeRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareAcknowledgeRequestFilter.html new file mode 100644 index 0000000..cb44872 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareAcknowledgeRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ShareAcknowledgeRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ShareAcknowledgeRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ShareAcknowledgeRequestFilter +extends Filter
+
A stateless filter for ShareAcknowledgeRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onShareAcknowledgeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareAcknowledgeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ShareAcknowledgeRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleShareAcknowledgeRequest

      +
      default boolean shouldHandleShareAcknowledgeRequest(short apiVersion)
      +
      Determine if a request message of type ShareAcknowledgeRequest should be handled by + this filter implementation. + returns true then onShareAcknowledgeRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onShareAcknowledgeRequest

      +
      CompletionStage<RequestFilterResult> onShareAcknowledgeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareAcknowledgeRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareAcknowledgeResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareAcknowledgeResponseFilter.html new file mode 100644 index 0000000..bf5c084 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareAcknowledgeResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ShareAcknowledgeResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ShareAcknowledgeResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ShareAcknowledgeResponseFilter +extends Filter
+
A stateless filter for ShareAcknowledgeResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onShareAcknowledgeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareAcknowledgeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ShareAcknowledgeResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleShareAcknowledgeResponse

      +
      default boolean shouldHandleShareAcknowledgeResponse(short apiVersion)
      +
      Determine if a response message of type ShareAcknowledgeResponse should be handled by + this filter implementation. + returns true then onShareAcknowledgeResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onShareAcknowledgeResponse

      +
      CompletionStage<ResponseFilterResult> onShareAcknowledgeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareAcknowledgeResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareFetchRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareFetchRequestFilter.html new file mode 100644 index 0000000..b82d1af --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareFetchRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ShareFetchRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ShareFetchRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ShareFetchRequestFilter +extends Filter
+
A stateless filter for ShareFetchRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onShareFetchRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareFetchRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ShareFetchRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleShareFetchRequest

      +
      default boolean shouldHandleShareFetchRequest(short apiVersion)
      +
      Determine if a request message of type ShareFetchRequest should be handled by + this filter implementation. + returns true then onShareFetchRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onShareFetchRequest

      +
      CompletionStage<RequestFilterResult> onShareFetchRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareFetchRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareFetchResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareFetchResponseFilter.html new file mode 100644 index 0000000..c9c409d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareFetchResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ShareFetchResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ShareFetchResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ShareFetchResponseFilter +extends Filter
+
A stateless filter for ShareFetchResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onShareFetchResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareFetchResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ShareFetchResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleShareFetchResponse

      +
      default boolean shouldHandleShareFetchResponse(short apiVersion)
      +
      Determine if a response message of type ShareFetchResponse should be handled by + this filter implementation. + returns true then onShareFetchResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onShareFetchResponse

      +
      CompletionStage<ResponseFilterResult> onShareFetchResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareFetchResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareGroupDescribeRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareGroupDescribeRequestFilter.html new file mode 100644 index 0000000..8d45682 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareGroupDescribeRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ShareGroupDescribeRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ShareGroupDescribeRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ShareGroupDescribeRequestFilter +extends Filter
+
A stateless filter for ShareGroupDescribeRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onShareGroupDescribeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareGroupDescribeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ShareGroupDescribeRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleShareGroupDescribeRequest

      +
      default boolean shouldHandleShareGroupDescribeRequest(short apiVersion)
      +
      Determine if a request message of type ShareGroupDescribeRequest should be handled by + this filter implementation. + returns true then onShareGroupDescribeRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onShareGroupDescribeRequest

      +
      CompletionStage<RequestFilterResult> onShareGroupDescribeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareGroupDescribeRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareGroupDescribeResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareGroupDescribeResponseFilter.html new file mode 100644 index 0000000..4bcec35 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareGroupDescribeResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ShareGroupDescribeResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ShareGroupDescribeResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ShareGroupDescribeResponseFilter +extends Filter
+
A stateless filter for ShareGroupDescribeResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onShareGroupDescribeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareGroupDescribeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ShareGroupDescribeResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleShareGroupDescribeResponse

      +
      default boolean shouldHandleShareGroupDescribeResponse(short apiVersion)
      +
      Determine if a response message of type ShareGroupDescribeResponse should be handled by + this filter implementation. + returns true then onShareGroupDescribeResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onShareGroupDescribeResponse

      +
      CompletionStage<ResponseFilterResult> onShareGroupDescribeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareGroupDescribeResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareGroupHeartbeatRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareGroupHeartbeatRequestFilter.html new file mode 100644 index 0000000..7d92667 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareGroupHeartbeatRequestFilter.html @@ -0,0 +1,202 @@ + + + + +ShareGroupHeartbeatRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ShareGroupHeartbeatRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ShareGroupHeartbeatRequestFilter +extends Filter
+
A stateless filter for ShareGroupHeartbeatRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onShareGroupHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareGroupHeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type ShareGroupHeartbeatRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleShareGroupHeartbeatRequest

      +
      default boolean shouldHandleShareGroupHeartbeatRequest(short apiVersion)
      +
      Determine if a request message of type ShareGroupHeartbeatRequest should be handled by + this filter implementation. + returns true then onShareGroupHeartbeatRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onShareGroupHeartbeatRequest

      +
      CompletionStage<RequestFilterResult> onShareGroupHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareGroupHeartbeatRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareGroupHeartbeatResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareGroupHeartbeatResponseFilter.html new file mode 100644 index 0000000..4babe5f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/ShareGroupHeartbeatResponseFilter.html @@ -0,0 +1,202 @@ + + + + +ShareGroupHeartbeatResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ShareGroupHeartbeatResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface ShareGroupHeartbeatResponseFilter +extends Filter
+
A stateless filter for ShareGroupHeartbeatResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onShareGroupHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareGroupHeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type ShareGroupHeartbeatResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleShareGroupHeartbeatResponse

      +
      default boolean shouldHandleShareGroupHeartbeatResponse(short apiVersion)
      +
      Determine if a response message of type ShareGroupHeartbeatResponse should be handled by + this filter implementation. + returns true then onShareGroupHeartbeatResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onShareGroupHeartbeatResponse

      +
      CompletionStage<ResponseFilterResult> onShareGroupHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareGroupHeartbeatResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/StreamsGroupDescribeRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/StreamsGroupDescribeRequestFilter.html new file mode 100644 index 0000000..10a1c01 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/StreamsGroupDescribeRequestFilter.html @@ -0,0 +1,202 @@ + + + + +StreamsGroupDescribeRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface StreamsGroupDescribeRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface StreamsGroupDescribeRequestFilter +extends Filter
+
A stateless filter for StreamsGroupDescribeRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onStreamsGroupDescribeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.StreamsGroupDescribeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type StreamsGroupDescribeRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleStreamsGroupDescribeRequest

      +
      default boolean shouldHandleStreamsGroupDescribeRequest(short apiVersion)
      +
      Determine if a request message of type StreamsGroupDescribeRequest should be handled by + this filter implementation. + returns true then onStreamsGroupDescribeRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onStreamsGroupDescribeRequest

      +
      CompletionStage<RequestFilterResult> onStreamsGroupDescribeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.StreamsGroupDescribeRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/StreamsGroupDescribeResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/StreamsGroupDescribeResponseFilter.html new file mode 100644 index 0000000..03fdc75 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/StreamsGroupDescribeResponseFilter.html @@ -0,0 +1,202 @@ + + + + +StreamsGroupDescribeResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface StreamsGroupDescribeResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface StreamsGroupDescribeResponseFilter +extends Filter
+
A stateless filter for StreamsGroupDescribeResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onStreamsGroupDescribeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.StreamsGroupDescribeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type StreamsGroupDescribeResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleStreamsGroupDescribeResponse

      +
      default boolean shouldHandleStreamsGroupDescribeResponse(short apiVersion)
      +
      Determine if a response message of type StreamsGroupDescribeResponse should be handled by + this filter implementation. + returns true then onStreamsGroupDescribeResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onStreamsGroupDescribeResponse

      +
      CompletionStage<ResponseFilterResult> onStreamsGroupDescribeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.StreamsGroupDescribeResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/StreamsGroupHeartbeatRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/StreamsGroupHeartbeatRequestFilter.html new file mode 100644 index 0000000..3723824 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/StreamsGroupHeartbeatRequestFilter.html @@ -0,0 +1,202 @@ + + + + +StreamsGroupHeartbeatRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface StreamsGroupHeartbeatRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface StreamsGroupHeartbeatRequestFilter +extends Filter
+
A stateless filter for StreamsGroupHeartbeatRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onStreamsGroupHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.StreamsGroupHeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type StreamsGroupHeartbeatRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleStreamsGroupHeartbeatRequest

      +
      default boolean shouldHandleStreamsGroupHeartbeatRequest(short apiVersion)
      +
      Determine if a request message of type StreamsGroupHeartbeatRequest should be handled by + this filter implementation. + returns true then onStreamsGroupHeartbeatRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onStreamsGroupHeartbeatRequest

      +
      CompletionStage<RequestFilterResult> onStreamsGroupHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.StreamsGroupHeartbeatRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/StreamsGroupHeartbeatResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/StreamsGroupHeartbeatResponseFilter.html new file mode 100644 index 0000000..56ea870 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/StreamsGroupHeartbeatResponseFilter.html @@ -0,0 +1,202 @@ + + + + +StreamsGroupHeartbeatResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface StreamsGroupHeartbeatResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface StreamsGroupHeartbeatResponseFilter +extends Filter
+
A stateless filter for StreamsGroupHeartbeatResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onStreamsGroupHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.StreamsGroupHeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type StreamsGroupHeartbeatResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleStreamsGroupHeartbeatResponse

      +
      default boolean shouldHandleStreamsGroupHeartbeatResponse(short apiVersion)
      +
      Determine if a response message of type StreamsGroupHeartbeatResponse should be handled by + this filter implementation. + returns true then onStreamsGroupHeartbeatResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onStreamsGroupHeartbeatResponse

      +
      CompletionStage<ResponseFilterResult> onStreamsGroupHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.StreamsGroupHeartbeatResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SyncGroupRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SyncGroupRequestFilter.html new file mode 100644 index 0000000..fe2de61 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SyncGroupRequestFilter.html @@ -0,0 +1,202 @@ + + + + +SyncGroupRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface SyncGroupRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface SyncGroupRequestFilter +extends Filter
+
A stateless filter for SyncGroupRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onSyncGroupRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.SyncGroupRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    +
    shouldHandleSyncGroupRequest(short apiVersion)
    +
    +
    Determine if a request message of type SyncGroupRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleSyncGroupRequest

      +
      default boolean shouldHandleSyncGroupRequest(short apiVersion)
      +
      Determine if a request message of type SyncGroupRequest should be handled by + this filter implementation. + returns true then onSyncGroupRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onSyncGroupRequest

      +
      CompletionStage<RequestFilterResult> onSyncGroupRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.SyncGroupRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SyncGroupResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SyncGroupResponseFilter.html new file mode 100644 index 0000000..8fc9002 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/SyncGroupResponseFilter.html @@ -0,0 +1,202 @@ + + + + +SyncGroupResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface SyncGroupResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface SyncGroupResponseFilter +extends Filter
+
A stateless filter for SyncGroupResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onSyncGroupResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.SyncGroupResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type SyncGroupResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleSyncGroupResponse

      +
      default boolean shouldHandleSyncGroupResponse(short apiVersion)
      +
      Determine if a response message of type SyncGroupResponse should be handled by + this filter implementation. + returns true then onSyncGroupResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onSyncGroupResponse

      +
      CompletionStage<ResponseFilterResult> onSyncGroupResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.SyncGroupResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/TxnOffsetCommitRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/TxnOffsetCommitRequestFilter.html new file mode 100644 index 0000000..1aef63d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/TxnOffsetCommitRequestFilter.html @@ -0,0 +1,202 @@ + + + + +TxnOffsetCommitRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface TxnOffsetCommitRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface TxnOffsetCommitRequestFilter +extends Filter
+
A stateless filter for TxnOffsetCommitRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onTxnOffsetCommitRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.TxnOffsetCommitRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type TxnOffsetCommitRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleTxnOffsetCommitRequest

      +
      default boolean shouldHandleTxnOffsetCommitRequest(short apiVersion)
      +
      Determine if a request message of type TxnOffsetCommitRequest should be handled by + this filter implementation. + returns true then onTxnOffsetCommitRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onTxnOffsetCommitRequest

      +
      CompletionStage<RequestFilterResult> onTxnOffsetCommitRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.TxnOffsetCommitRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/TxnOffsetCommitResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/TxnOffsetCommitResponseFilter.html new file mode 100644 index 0000000..2fca040 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/TxnOffsetCommitResponseFilter.html @@ -0,0 +1,202 @@ + + + + +TxnOffsetCommitResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface TxnOffsetCommitResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface TxnOffsetCommitResponseFilter +extends Filter
+
A stateless filter for TxnOffsetCommitResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onTxnOffsetCommitResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.TxnOffsetCommitResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type TxnOffsetCommitResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleTxnOffsetCommitResponse

      +
      default boolean shouldHandleTxnOffsetCommitResponse(short apiVersion)
      +
      Determine if a response message of type TxnOffsetCommitResponse should be handled by + this filter implementation. + returns true then onTxnOffsetCommitResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onTxnOffsetCommitResponse

      +
      CompletionStage<ResponseFilterResult> onTxnOffsetCommitResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.TxnOffsetCommitResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UnregisterBrokerRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UnregisterBrokerRequestFilter.html new file mode 100644 index 0000000..6b6495f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UnregisterBrokerRequestFilter.html @@ -0,0 +1,202 @@ + + + + +UnregisterBrokerRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface UnregisterBrokerRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface UnregisterBrokerRequestFilter +extends Filter
+
A stateless filter for UnregisterBrokerRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onUnregisterBrokerRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.UnregisterBrokerRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type UnregisterBrokerRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleUnregisterBrokerRequest

      +
      default boolean shouldHandleUnregisterBrokerRequest(short apiVersion)
      +
      Determine if a request message of type UnregisterBrokerRequest should be handled by + this filter implementation. + returns true then onUnregisterBrokerRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onUnregisterBrokerRequest

      +
      CompletionStage<RequestFilterResult> onUnregisterBrokerRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.UnregisterBrokerRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UnregisterBrokerResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UnregisterBrokerResponseFilter.html new file mode 100644 index 0000000..31872e2 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UnregisterBrokerResponseFilter.html @@ -0,0 +1,202 @@ + + + + +UnregisterBrokerResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface UnregisterBrokerResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface UnregisterBrokerResponseFilter +extends Filter
+
A stateless filter for UnregisterBrokerResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onUnregisterBrokerResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.UnregisterBrokerResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type UnregisterBrokerResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleUnregisterBrokerResponse

      +
      default boolean shouldHandleUnregisterBrokerResponse(short apiVersion)
      +
      Determine if a response message of type UnregisterBrokerResponse should be handled by + this filter implementation. + returns true then onUnregisterBrokerResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onUnregisterBrokerResponse

      +
      CompletionStage<ResponseFilterResult> onUnregisterBrokerResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.UnregisterBrokerResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UpdateFeaturesRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UpdateFeaturesRequestFilter.html new file mode 100644 index 0000000..0492368 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UpdateFeaturesRequestFilter.html @@ -0,0 +1,202 @@ + + + + +UpdateFeaturesRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface UpdateFeaturesRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface UpdateFeaturesRequestFilter +extends Filter
+
A stateless filter for UpdateFeaturesRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onUpdateFeaturesRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.UpdateFeaturesRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type UpdateFeaturesRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleUpdateFeaturesRequest

      +
      default boolean shouldHandleUpdateFeaturesRequest(short apiVersion)
      +
      Determine if a request message of type UpdateFeaturesRequest should be handled by + this filter implementation. + returns true then onUpdateFeaturesRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onUpdateFeaturesRequest

      +
      CompletionStage<RequestFilterResult> onUpdateFeaturesRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.UpdateFeaturesRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UpdateFeaturesResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UpdateFeaturesResponseFilter.html new file mode 100644 index 0000000..224a804 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UpdateFeaturesResponseFilter.html @@ -0,0 +1,202 @@ + + + + +UpdateFeaturesResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface UpdateFeaturesResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface UpdateFeaturesResponseFilter +extends Filter
+
A stateless filter for UpdateFeaturesResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onUpdateFeaturesResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.UpdateFeaturesResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type UpdateFeaturesResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleUpdateFeaturesResponse

      +
      default boolean shouldHandleUpdateFeaturesResponse(short apiVersion)
      +
      Determine if a response message of type UpdateFeaturesResponse should be handled by + this filter implementation. + returns true then onUpdateFeaturesResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onUpdateFeaturesResponse

      +
      CompletionStage<ResponseFilterResult> onUpdateFeaturesResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.UpdateFeaturesResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UpdateRaftVoterRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UpdateRaftVoterRequestFilter.html new file mode 100644 index 0000000..9b41436 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UpdateRaftVoterRequestFilter.html @@ -0,0 +1,202 @@ + + + + +UpdateRaftVoterRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface UpdateRaftVoterRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface UpdateRaftVoterRequestFilter +extends Filter
+
A stateless filter for UpdateRaftVoterRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onUpdateRaftVoterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.UpdateRaftVoterRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type UpdateRaftVoterRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleUpdateRaftVoterRequest

      +
      default boolean shouldHandleUpdateRaftVoterRequest(short apiVersion)
      +
      Determine if a request message of type UpdateRaftVoterRequest should be handled by + this filter implementation. + returns true then onUpdateRaftVoterRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onUpdateRaftVoterRequest

      +
      CompletionStage<RequestFilterResult> onUpdateRaftVoterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.UpdateRaftVoterRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UpdateRaftVoterResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UpdateRaftVoterResponseFilter.html new file mode 100644 index 0000000..e2690c7 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/UpdateRaftVoterResponseFilter.html @@ -0,0 +1,202 @@ + + + + +UpdateRaftVoterResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface UpdateRaftVoterResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface UpdateRaftVoterResponseFilter +extends Filter
+
A stateless filter for UpdateRaftVoterResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onUpdateRaftVoterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.UpdateRaftVoterResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type UpdateRaftVoterResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleUpdateRaftVoterResponse

      +
      default boolean shouldHandleUpdateRaftVoterResponse(short apiVersion)
      +
      Determine if a response message of type UpdateRaftVoterResponse should be handled by + this filter implementation. + returns true then onUpdateRaftVoterResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onUpdateRaftVoterResponse

      +
      CompletionStage<ResponseFilterResult> onUpdateRaftVoterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.UpdateRaftVoterResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/VoteRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/VoteRequestFilter.html new file mode 100644 index 0000000..a35a7a3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/VoteRequestFilter.html @@ -0,0 +1,202 @@ + + + + +VoteRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface VoteRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface VoteRequestFilter +extends Filter
+
A stateless filter for VoteRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onVoteRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.VoteRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    +
    shouldHandleVoteRequest(short apiVersion)
    +
    +
    Determine if a request message of type VoteRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleVoteRequest

      +
      default boolean shouldHandleVoteRequest(short apiVersion)
      +
      Determine if a request message of type VoteRequest should be handled by + this filter implementation. + returns true then onVoteRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onVoteRequest

      +
      CompletionStage<RequestFilterResult> onVoteRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.VoteRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/VoteResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/VoteResponseFilter.html new file mode 100644 index 0000000..316e003 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/VoteResponseFilter.html @@ -0,0 +1,202 @@ + + + + +VoteResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface VoteResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface VoteResponseFilter +extends Filter
+
A stateless filter for VoteResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onVoteResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.VoteResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    +
    shouldHandleVoteResponse(short apiVersion)
    +
    +
    Determine if a response message of type VoteResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleVoteResponse

      +
      default boolean shouldHandleVoteResponse(short apiVersion)
      +
      Determine if a response message of type VoteResponse should be handled by + this filter implementation. + returns true then onVoteResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onVoteResponse

      +
      CompletionStage<ResponseFilterResult> onVoteResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.VoteResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/WriteShareGroupStateRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/WriteShareGroupStateRequestFilter.html new file mode 100644 index 0000000..c2c103d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/WriteShareGroupStateRequestFilter.html @@ -0,0 +1,202 @@ + + + + +WriteShareGroupStateRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface WriteShareGroupStateRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface WriteShareGroupStateRequestFilter +extends Filter
+
A stateless filter for WriteShareGroupStateRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onWriteShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.WriteShareGroupStateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type WriteShareGroupStateRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleWriteShareGroupStateRequest

      +
      default boolean shouldHandleWriteShareGroupStateRequest(short apiVersion)
      +
      Determine if a request message of type WriteShareGroupStateRequest should be handled by + this filter implementation. + returns true then onWriteShareGroupStateRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onWriteShareGroupStateRequest

      +
      CompletionStage<RequestFilterResult> onWriteShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.WriteShareGroupStateRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/WriteShareGroupStateResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/WriteShareGroupStateResponseFilter.html new file mode 100644 index 0000000..a5185b7 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/WriteShareGroupStateResponseFilter.html @@ -0,0 +1,202 @@ + + + + +WriteShareGroupStateResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface WriteShareGroupStateResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface WriteShareGroupStateResponseFilter +extends Filter
+
A stateless filter for WriteShareGroupStateResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onWriteShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.WriteShareGroupStateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type WriteShareGroupStateResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleWriteShareGroupStateResponse

      +
      default boolean shouldHandleWriteShareGroupStateResponse(short apiVersion)
      +
      Determine if a response message of type WriteShareGroupStateResponse should be handled by + this filter implementation. + returns true then onWriteShareGroupStateResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onWriteShareGroupStateResponse

      +
      CompletionStage<ResponseFilterResult> onWriteShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.WriteShareGroupStateResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/WriteTxnMarkersRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/WriteTxnMarkersRequestFilter.html new file mode 100644 index 0000000..e1641c6 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/WriteTxnMarkersRequestFilter.html @@ -0,0 +1,202 @@ + + + + +WriteTxnMarkersRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface WriteTxnMarkersRequestFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface WriteTxnMarkersRequestFilter +extends Filter
+
A stateless filter for WriteTxnMarkersRequests.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onWriteTxnMarkersRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.WriteTxnMarkersRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a request message of type WriteTxnMarkersRequest should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleWriteTxnMarkersRequest

      +
      default boolean shouldHandleWriteTxnMarkersRequest(short apiVersion)
      +
      Determine if a request message of type WriteTxnMarkersRequest should be handled by + this filter implementation. + returns true then onWriteTxnMarkersRequest is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onWriteTxnMarkersRequest

      +
      CompletionStage<RequestFilterResult> onWriteTxnMarkersRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.WriteTxnMarkersRequestData request, + FilterContext context)
      +
      Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult. +
      + The implementation may modify the given header and request in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the request
      +
      header - request header.
      +
      request - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a RequestFilterResult containing the + request to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/WriteTxnMarkersResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/WriteTxnMarkersResponseFilter.html new file mode 100644 index 0000000..64a3e85 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/WriteTxnMarkersResponseFilter.html @@ -0,0 +1,202 @@ + + + + +WriteTxnMarkersResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface WriteTxnMarkersResponseFilter

+
+
+
+
All Superinterfaces:
+
Filter
+
+
+
public interface WriteTxnMarkersResponseFilter +extends Filter
+
A stateless filter for WriteTxnMarkersResponses.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    onWriteTxnMarkersResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.WriteTxnMarkersResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    default boolean
    + +
    +
    Determine if a response message of type WriteTxnMarkersResponse should be handled by + this filter implementation.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      shouldHandleWriteTxnMarkersResponse

      +
      default boolean shouldHandleWriteTxnMarkersResponse(short apiVersion)
      +
      Determine if a response message of type WriteTxnMarkersResponse should be handled by + this filter implementation. + returns true then onWriteTxnMarkersResponse is eligible to be invoked with + deserialized data, if the message reaches this filter in the chain.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the message
      +
      Returns:
      +
      true if it should be handled
      +
      +
      +
    • +
    • +
      +

      onWriteTxnMarkersResponse

      +
      CompletionStage<ResponseFilterResult> onWriteTxnMarkersResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.WriteTxnMarkersResponseData response, + FilterContext context)
      +
      Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult. +
      + The implementation may modify the given header and response in-place, or instantiate a + new instances.
      +
      +
      Parameters:
      +
      apiVersion - the apiVersion of the response
      +
      header - response header.
      +
      response - The body to handle.
      +
      context - The context.
      +
      Returns:
      +
      a non-null CompletionStage that, when complete, will yield a ResponseFilterResult containing the + response to be forwarded.
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddOffsetsToTxnRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddOffsetsToTxnRequestFilter.html new file mode 100644 index 0000000..c9eeec8 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddOffsetsToTxnRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AddOffsetsToTxnRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AddOffsetsToTxnRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.AddOffsetsToTxnRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddOffsetsToTxnResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddOffsetsToTxnResponseFilter.html new file mode 100644 index 0000000..2c8b906 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddOffsetsToTxnResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AddOffsetsToTxnResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AddOffsetsToTxnResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.AddOffsetsToTxnResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddPartitionsToTxnRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddPartitionsToTxnRequestFilter.html new file mode 100644 index 0000000..1362408 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddPartitionsToTxnRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AddPartitionsToTxnRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AddPartitionsToTxnRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.AddPartitionsToTxnRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddPartitionsToTxnResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddPartitionsToTxnResponseFilter.html new file mode 100644 index 0000000..d3da3d3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddPartitionsToTxnResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AddPartitionsToTxnResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AddPartitionsToTxnResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.AddPartitionsToTxnResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddRaftVoterRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddRaftVoterRequestFilter.html new file mode 100644 index 0000000..a1d7ae4 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddRaftVoterRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AddRaftVoterRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AddRaftVoterRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.AddRaftVoterRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddRaftVoterResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddRaftVoterResponseFilter.html new file mode 100644 index 0000000..d159075 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AddRaftVoterResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AddRaftVoterResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AddRaftVoterResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.AddRaftVoterResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AllocateProducerIdsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AllocateProducerIdsRequestFilter.html new file mode 100644 index 0000000..4253a8c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AllocateProducerIdsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AllocateProducerIdsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AllocateProducerIdsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.AllocateProducerIdsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AllocateProducerIdsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AllocateProducerIdsResponseFilter.html new file mode 100644 index 0000000..7cecb3a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AllocateProducerIdsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AllocateProducerIdsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AllocateProducerIdsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.AllocateProducerIdsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterClientQuotasRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterClientQuotasRequestFilter.html new file mode 100644 index 0000000..9dc5b1c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterClientQuotasRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AlterClientQuotasRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AlterClientQuotasRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.AlterClientQuotasRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterClientQuotasResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterClientQuotasResponseFilter.html new file mode 100644 index 0000000..67cea6a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterClientQuotasResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AlterClientQuotasResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AlterClientQuotasResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.AlterClientQuotasResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterConfigsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterConfigsRequestFilter.html new file mode 100644 index 0000000..7422d5a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterConfigsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AlterConfigsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AlterConfigsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.AlterConfigsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterConfigsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterConfigsResponseFilter.html new file mode 100644 index 0000000..94f7987 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterConfigsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AlterConfigsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AlterConfigsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.AlterConfigsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterPartitionReassignmentsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterPartitionReassignmentsRequestFilter.html new file mode 100644 index 0000000..a00c820 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterPartitionReassignmentsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AlterPartitionReassignmentsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AlterPartitionReassignmentsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.AlterPartitionReassignmentsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterPartitionReassignmentsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterPartitionReassignmentsResponseFilter.html new file mode 100644 index 0000000..9d33184 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterPartitionReassignmentsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AlterPartitionReassignmentsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AlterPartitionReassignmentsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.AlterPartitionReassignmentsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterPartitionRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterPartitionRequestFilter.html new file mode 100644 index 0000000..8e5a85c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterPartitionRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AlterPartitionRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AlterPartitionRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.AlterPartitionRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterPartitionResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterPartitionResponseFilter.html new file mode 100644 index 0000000..13e26e2 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterPartitionResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AlterPartitionResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AlterPartitionResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.AlterPartitionResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterReplicaLogDirsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterReplicaLogDirsRequestFilter.html new file mode 100644 index 0000000..1cbb146 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterReplicaLogDirsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AlterReplicaLogDirsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AlterReplicaLogDirsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.AlterReplicaLogDirsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterReplicaLogDirsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterReplicaLogDirsResponseFilter.html new file mode 100644 index 0000000..111173a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterReplicaLogDirsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AlterReplicaLogDirsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AlterReplicaLogDirsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.AlterReplicaLogDirsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterShareGroupOffsetsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterShareGroupOffsetsRequestFilter.html new file mode 100644 index 0000000..5a31ead --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterShareGroupOffsetsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AlterShareGroupOffsetsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AlterShareGroupOffsetsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.AlterShareGroupOffsetsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterShareGroupOffsetsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterShareGroupOffsetsResponseFilter.html new file mode 100644 index 0000000..0343ac5 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterShareGroupOffsetsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AlterShareGroupOffsetsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AlterShareGroupOffsetsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.AlterShareGroupOffsetsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterUserScramCredentialsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterUserScramCredentialsRequestFilter.html new file mode 100644 index 0000000..beaa2c1 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterUserScramCredentialsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AlterUserScramCredentialsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AlterUserScramCredentialsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.AlterUserScramCredentialsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterUserScramCredentialsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterUserScramCredentialsResponseFilter.html new file mode 100644 index 0000000..3ab6439 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AlterUserScramCredentialsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AlterUserScramCredentialsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AlterUserScramCredentialsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.AlterUserScramCredentialsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ApiVersionsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ApiVersionsRequestFilter.html new file mode 100644 index 0000000..e403e99 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ApiVersionsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ApiVersionsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ApiVersionsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ApiVersionsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ApiVersionsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ApiVersionsResponseFilter.html new file mode 100644 index 0000000..2acd0a9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ApiVersionsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ApiVersionsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ApiVersionsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ApiVersionsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AssignReplicasToDirsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AssignReplicasToDirsRequestFilter.html new file mode 100644 index 0000000..5215df2 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AssignReplicasToDirsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AssignReplicasToDirsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AssignReplicasToDirsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.AssignReplicasToDirsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AssignReplicasToDirsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AssignReplicasToDirsResponseFilter.html new file mode 100644 index 0000000..5621b10 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/AssignReplicasToDirsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.AssignReplicasToDirsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.AssignReplicasToDirsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.AssignReplicasToDirsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BeginQuorumEpochRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BeginQuorumEpochRequestFilter.html new file mode 100644 index 0000000..dfcbe80 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BeginQuorumEpochRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.BeginQuorumEpochRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.BeginQuorumEpochRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.BeginQuorumEpochRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BeginQuorumEpochResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BeginQuorumEpochResponseFilter.html new file mode 100644 index 0000000..dbd025c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BeginQuorumEpochResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.BeginQuorumEpochResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.BeginQuorumEpochResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.BeginQuorumEpochResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BrokerHeartbeatRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BrokerHeartbeatRequestFilter.html new file mode 100644 index 0000000..5891f44 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BrokerHeartbeatRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.BrokerHeartbeatRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.BrokerHeartbeatRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.BrokerHeartbeatRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BrokerHeartbeatResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BrokerHeartbeatResponseFilter.html new file mode 100644 index 0000000..6e2af17 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BrokerHeartbeatResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.BrokerHeartbeatResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.BrokerHeartbeatResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.BrokerHeartbeatResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BrokerRegistrationRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BrokerRegistrationRequestFilter.html new file mode 100644 index 0000000..19379b4 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BrokerRegistrationRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.BrokerRegistrationRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.BrokerRegistrationRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.BrokerRegistrationRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BrokerRegistrationResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BrokerRegistrationResponseFilter.html new file mode 100644 index 0000000..d48b98d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/BrokerRegistrationResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.BrokerRegistrationResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.BrokerRegistrationResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.BrokerRegistrationResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ConsumerGroupDescribeRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ConsumerGroupDescribeRequestFilter.html new file mode 100644 index 0000000..719ad5b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ConsumerGroupDescribeRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ConsumerGroupDescribeRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ConsumerGroupDescribeRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ConsumerGroupDescribeRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ConsumerGroupDescribeResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ConsumerGroupDescribeResponseFilter.html new file mode 100644 index 0000000..bfe9a98 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ConsumerGroupDescribeResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ConsumerGroupDescribeResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ConsumerGroupDescribeResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ConsumerGroupDescribeResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ConsumerGroupHeartbeatRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ConsumerGroupHeartbeatRequestFilter.html new file mode 100644 index 0000000..c464c76 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ConsumerGroupHeartbeatRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ConsumerGroupHeartbeatRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ConsumerGroupHeartbeatRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ConsumerGroupHeartbeatRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ConsumerGroupHeartbeatResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ConsumerGroupHeartbeatResponseFilter.html new file mode 100644 index 0000000..948d635 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ConsumerGroupHeartbeatResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ConsumerGroupHeartbeatResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ConsumerGroupHeartbeatResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ConsumerGroupHeartbeatResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ControllerRegistrationRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ControllerRegistrationRequestFilter.html new file mode 100644 index 0000000..3c02cd6 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ControllerRegistrationRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ControllerRegistrationRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ControllerRegistrationRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ControllerRegistrationRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ControllerRegistrationResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ControllerRegistrationResponseFilter.html new file mode 100644 index 0000000..454c112 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ControllerRegistrationResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ControllerRegistrationResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ControllerRegistrationResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ControllerRegistrationResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateAclsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateAclsRequestFilter.html new file mode 100644 index 0000000..0fe557f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateAclsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.CreateAclsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.CreateAclsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.CreateAclsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateAclsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateAclsResponseFilter.html new file mode 100644 index 0000000..10b5a7b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateAclsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.CreateAclsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.CreateAclsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.CreateAclsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateDelegationTokenRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateDelegationTokenRequestFilter.html new file mode 100644 index 0000000..d1962bc --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateDelegationTokenRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.CreateDelegationTokenRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.CreateDelegationTokenRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.CreateDelegationTokenRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateDelegationTokenResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateDelegationTokenResponseFilter.html new file mode 100644 index 0000000..6a07eaf --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateDelegationTokenResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.CreateDelegationTokenResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.CreateDelegationTokenResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.CreateDelegationTokenResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreatePartitionsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreatePartitionsRequestFilter.html new file mode 100644 index 0000000..7b1182c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreatePartitionsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.CreatePartitionsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.CreatePartitionsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.CreatePartitionsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreatePartitionsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreatePartitionsResponseFilter.html new file mode 100644 index 0000000..375371a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreatePartitionsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.CreatePartitionsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.CreatePartitionsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.CreatePartitionsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateTopicsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateTopicsRequestFilter.html new file mode 100644 index 0000000..612dd11 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateTopicsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.CreateTopicsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.CreateTopicsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.CreateTopicsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateTopicsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateTopicsResponseFilter.html new file mode 100644 index 0000000..b6546a7 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/CreateTopicsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.CreateTopicsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.CreateTopicsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.CreateTopicsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteAclsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteAclsRequestFilter.html new file mode 100644 index 0000000..9ab095f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteAclsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DeleteAclsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DeleteAclsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DeleteAclsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteAclsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteAclsResponseFilter.html new file mode 100644 index 0000000..f0193d8 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteAclsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DeleteAclsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DeleteAclsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DeleteAclsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteGroupsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteGroupsRequestFilter.html new file mode 100644 index 0000000..35cfdf9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteGroupsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DeleteGroupsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DeleteGroupsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DeleteGroupsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteGroupsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteGroupsResponseFilter.html new file mode 100644 index 0000000..23cd869 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteGroupsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DeleteGroupsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DeleteGroupsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DeleteGroupsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteRecordsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteRecordsRequestFilter.html new file mode 100644 index 0000000..2a766ac --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteRecordsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DeleteRecordsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DeleteRecordsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DeleteRecordsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteRecordsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteRecordsResponseFilter.html new file mode 100644 index 0000000..a362ada --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteRecordsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DeleteRecordsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DeleteRecordsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DeleteRecordsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteShareGroupOffsetsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteShareGroupOffsetsRequestFilter.html new file mode 100644 index 0000000..5fbf0b8 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteShareGroupOffsetsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DeleteShareGroupOffsetsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DeleteShareGroupOffsetsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DeleteShareGroupOffsetsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteShareGroupOffsetsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteShareGroupOffsetsResponseFilter.html new file mode 100644 index 0000000..b6e63ef --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteShareGroupOffsetsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DeleteShareGroupOffsetsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DeleteShareGroupOffsetsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DeleteShareGroupOffsetsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteShareGroupStateRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteShareGroupStateRequestFilter.html new file mode 100644 index 0000000..1c95722 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteShareGroupStateRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DeleteShareGroupStateRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DeleteShareGroupStateRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DeleteShareGroupStateRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteShareGroupStateResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteShareGroupStateResponseFilter.html new file mode 100644 index 0000000..5311942 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteShareGroupStateResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DeleteShareGroupStateResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DeleteShareGroupStateResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DeleteShareGroupStateResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteTopicsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteTopicsRequestFilter.html new file mode 100644 index 0000000..20c5383 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteTopicsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DeleteTopicsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DeleteTopicsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DeleteTopicsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteTopicsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteTopicsResponseFilter.html new file mode 100644 index 0000000..7bbe3df --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DeleteTopicsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DeleteTopicsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DeleteTopicsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DeleteTopicsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeAclsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeAclsRequestFilter.html new file mode 100644 index 0000000..7c2758e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeAclsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeAclsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeAclsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeAclsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeAclsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeAclsResponseFilter.html new file mode 100644 index 0000000..8f13c86 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeAclsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeAclsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeAclsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeAclsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeClientQuotasRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeClientQuotasRequestFilter.html new file mode 100644 index 0000000..c294422 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeClientQuotasRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeClientQuotasRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeClientQuotasRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeClientQuotasRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeClientQuotasResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeClientQuotasResponseFilter.html new file mode 100644 index 0000000..451d56f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeClientQuotasResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeClientQuotasResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeClientQuotasResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeClientQuotasResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeClusterRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeClusterRequestFilter.html new file mode 100644 index 0000000..923d93e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeClusterRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeClusterRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeClusterRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeClusterRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeClusterResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeClusterResponseFilter.html new file mode 100644 index 0000000..d324ea5 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeClusterResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeClusterResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeClusterResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeClusterResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeConfigsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeConfigsRequestFilter.html new file mode 100644 index 0000000..c93ac4d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeConfigsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeConfigsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeConfigsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeConfigsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeConfigsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeConfigsResponseFilter.html new file mode 100644 index 0000000..ac915a0 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeConfigsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeConfigsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeConfigsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeConfigsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeDelegationTokenRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeDelegationTokenRequestFilter.html new file mode 100644 index 0000000..262d036 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeDelegationTokenRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeDelegationTokenRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeDelegationTokenRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeDelegationTokenRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeDelegationTokenResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeDelegationTokenResponseFilter.html new file mode 100644 index 0000000..4872a6c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeDelegationTokenResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeDelegationTokenResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeDelegationTokenResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeDelegationTokenResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeGroupsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeGroupsRequestFilter.html new file mode 100644 index 0000000..8ae341f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeGroupsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeGroupsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeGroupsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeGroupsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeGroupsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeGroupsResponseFilter.html new file mode 100644 index 0000000..4805653 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeGroupsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeGroupsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeGroupsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeGroupsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeLogDirsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeLogDirsRequestFilter.html new file mode 100644 index 0000000..f4ffa69 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeLogDirsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeLogDirsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeLogDirsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeLogDirsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeLogDirsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeLogDirsResponseFilter.html new file mode 100644 index 0000000..6317eb9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeLogDirsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeLogDirsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeLogDirsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeLogDirsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeProducersRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeProducersRequestFilter.html new file mode 100644 index 0000000..bd4e953 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeProducersRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeProducersRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeProducersRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeProducersRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeProducersResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeProducersResponseFilter.html new file mode 100644 index 0000000..2723aa8 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeProducersResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeProducersResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeProducersResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeProducersResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeQuorumRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeQuorumRequestFilter.html new file mode 100644 index 0000000..8ff111c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeQuorumRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeQuorumRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeQuorumRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeQuorumRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeQuorumResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeQuorumResponseFilter.html new file mode 100644 index 0000000..7d78ec3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeQuorumResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeQuorumResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeQuorumResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeQuorumResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeShareGroupOffsetsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeShareGroupOffsetsRequestFilter.html new file mode 100644 index 0000000..a67d1fa --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeShareGroupOffsetsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeShareGroupOffsetsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeShareGroupOffsetsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeShareGroupOffsetsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeShareGroupOffsetsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeShareGroupOffsetsResponseFilter.html new file mode 100644 index 0000000..ba26c15 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeShareGroupOffsetsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeShareGroupOffsetsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeShareGroupOffsetsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeShareGroupOffsetsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeTopicPartitionsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeTopicPartitionsRequestFilter.html new file mode 100644 index 0000000..1278679 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeTopicPartitionsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeTopicPartitionsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeTopicPartitionsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeTopicPartitionsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeTopicPartitionsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeTopicPartitionsResponseFilter.html new file mode 100644 index 0000000..a3d79d6 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeTopicPartitionsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeTopicPartitionsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeTopicPartitionsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeTopicPartitionsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeTransactionsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeTransactionsRequestFilter.html new file mode 100644 index 0000000..4d47062 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeTransactionsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeTransactionsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeTransactionsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeTransactionsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeTransactionsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeTransactionsResponseFilter.html new file mode 100644 index 0000000..74ac002 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeTransactionsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeTransactionsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeTransactionsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeTransactionsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeUserScramCredentialsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeUserScramCredentialsRequestFilter.html new file mode 100644 index 0000000..7f7c110 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeUserScramCredentialsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeUserScramCredentialsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeUserScramCredentialsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeUserScramCredentialsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeUserScramCredentialsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeUserScramCredentialsResponseFilter.html new file mode 100644 index 0000000..13fa19a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/DescribeUserScramCredentialsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.DescribeUserScramCredentialsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.DescribeUserScramCredentialsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.DescribeUserScramCredentialsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ElectLeadersRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ElectLeadersRequestFilter.html new file mode 100644 index 0000000..94fc124 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ElectLeadersRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ElectLeadersRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ElectLeadersRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ElectLeadersRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ElectLeadersResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ElectLeadersResponseFilter.html new file mode 100644 index 0000000..af9ecc6 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ElectLeadersResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ElectLeadersResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ElectLeadersResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ElectLeadersResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EndQuorumEpochRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EndQuorumEpochRequestFilter.html new file mode 100644 index 0000000..1e4469d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EndQuorumEpochRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.EndQuorumEpochRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.EndQuorumEpochRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.EndQuorumEpochRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EndQuorumEpochResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EndQuorumEpochResponseFilter.html new file mode 100644 index 0000000..1c37727 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EndQuorumEpochResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.EndQuorumEpochResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.EndQuorumEpochResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.EndQuorumEpochResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EndTxnRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EndTxnRequestFilter.html new file mode 100644 index 0000000..fb67931 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EndTxnRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.EndTxnRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.EndTxnRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.EndTxnRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EndTxnResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EndTxnResponseFilter.html new file mode 100644 index 0000000..e88f811 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EndTxnResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.EndTxnResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.EndTxnResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.EndTxnResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EnvelopeRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EnvelopeRequestFilter.html new file mode 100644 index 0000000..8b86bce --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EnvelopeRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.EnvelopeRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.EnvelopeRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.EnvelopeRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EnvelopeResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EnvelopeResponseFilter.html new file mode 100644 index 0000000..1275c37 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/EnvelopeResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.EnvelopeResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.EnvelopeResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.EnvelopeResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ExpireDelegationTokenRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ExpireDelegationTokenRequestFilter.html new file mode 100644 index 0000000..a3b7ba8 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ExpireDelegationTokenRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ExpireDelegationTokenRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ExpireDelegationTokenRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ExpireDelegationTokenRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ExpireDelegationTokenResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ExpireDelegationTokenResponseFilter.html new file mode 100644 index 0000000..10acd72 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ExpireDelegationTokenResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ExpireDelegationTokenResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ExpireDelegationTokenResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ExpireDelegationTokenResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FetchRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FetchRequestFilter.html new file mode 100644 index 0000000..64d20df --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FetchRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.FetchRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.FetchRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.FetchRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FetchResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FetchResponseFilter.html new file mode 100644 index 0000000..b6fae5e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FetchResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.FetchResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.FetchResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.FetchResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FetchSnapshotRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FetchSnapshotRequestFilter.html new file mode 100644 index 0000000..7e40092 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FetchSnapshotRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.FetchSnapshotRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.FetchSnapshotRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.FetchSnapshotRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FetchSnapshotResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FetchSnapshotResponseFilter.html new file mode 100644 index 0000000..f6e78e8 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FetchSnapshotResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.FetchSnapshotResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.FetchSnapshotResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.FetchSnapshotResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/Filter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/Filter.html new file mode 100644 index 0000000..56daace --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/Filter.html @@ -0,0 +1,998 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.Filter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.Filter

+
+
Packages that use Filter
+
+
Package
+
Description
+ +
+
The protocol filter API.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterContext.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterContext.html new file mode 100644 index 0000000..c6ed9aa --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterContext.html @@ -0,0 +1,1728 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.FilterContext (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.FilterContext

+
+
Packages that use FilterContext
+
+
Package
+
Description
+ +
+
The protocol filter API.
+
+
+
+
    +
  • +
    +

    Uses of FilterContext in io.kroxylicious.proxy.filter

    +
    Methods in io.kroxylicious.proxy.filter with parameters of type FilterContext
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    AddOffsetsToTxnRequestFilter.onAddOffsetsToTxnRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AddOffsetsToTxnRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AddOffsetsToTxnResponseFilter.onAddOffsetsToTxnResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AddOffsetsToTxnResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AddPartitionsToTxnRequestFilter.onAddPartitionsToTxnRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AddPartitionsToTxnRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AddPartitionsToTxnResponseFilter.onAddPartitionsToTxnResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AddPartitionsToTxnResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AddRaftVoterRequestFilter.onAddRaftVoterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AddRaftVoterRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AddRaftVoterResponseFilter.onAddRaftVoterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AddRaftVoterResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AllocateProducerIdsRequestFilter.onAllocateProducerIdsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AllocateProducerIdsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AllocateProducerIdsResponseFilter.onAllocateProducerIdsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AllocateProducerIdsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AlterClientQuotasRequestFilter.onAlterClientQuotasRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterClientQuotasRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AlterClientQuotasResponseFilter.onAlterClientQuotasResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterClientQuotasResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AlterConfigsRequestFilter.onAlterConfigsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterConfigsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AlterConfigsResponseFilter.onAlterConfigsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterConfigsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AlterPartitionReassignmentsRequestFilter.onAlterPartitionReassignmentsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterPartitionReassignmentsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AlterPartitionReassignmentsResponseFilter.onAlterPartitionReassignmentsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterPartitionReassignmentsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AlterPartitionRequestFilter.onAlterPartitionRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterPartitionRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AlterPartitionResponseFilter.onAlterPartitionResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterPartitionResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AlterReplicaLogDirsRequestFilter.onAlterReplicaLogDirsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterReplicaLogDirsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AlterReplicaLogDirsResponseFilter.onAlterReplicaLogDirsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterReplicaLogDirsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AlterShareGroupOffsetsRequestFilter.onAlterShareGroupOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterShareGroupOffsetsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AlterShareGroupOffsetsResponseFilter.onAlterShareGroupOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterShareGroupOffsetsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AlterUserScramCredentialsRequestFilter.onAlterUserScramCredentialsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterUserScramCredentialsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AlterUserScramCredentialsResponseFilter.onAlterUserScramCredentialsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterUserScramCredentialsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ApiVersionsRequestFilter.onApiVersionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ApiVersionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ApiVersionsResponseFilter.onApiVersionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ApiVersionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AssignReplicasToDirsRequestFilter.onAssignReplicasToDirsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AssignReplicasToDirsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AssignReplicasToDirsResponseFilter.onAssignReplicasToDirsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AssignReplicasToDirsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    BeginQuorumEpochRequestFilter.onBeginQuorumEpochRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.BeginQuorumEpochRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    BeginQuorumEpochResponseFilter.onBeginQuorumEpochResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.BeginQuorumEpochResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    BrokerHeartbeatRequestFilter.onBrokerHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.BrokerHeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    BrokerHeartbeatResponseFilter.onBrokerHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.BrokerHeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    BrokerRegistrationRequestFilter.onBrokerRegistrationRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.BrokerRegistrationRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    BrokerRegistrationResponseFilter.onBrokerRegistrationResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.BrokerRegistrationResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ConsumerGroupDescribeRequestFilter.onConsumerGroupDescribeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ConsumerGroupDescribeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ConsumerGroupDescribeResponseFilter.onConsumerGroupDescribeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ConsumerGroupDescribeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ConsumerGroupHeartbeatRequestFilter.onConsumerGroupHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ConsumerGroupHeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ConsumerGroupHeartbeatResponseFilter.onConsumerGroupHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ConsumerGroupHeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ControllerRegistrationRequestFilter.onControllerRegistrationRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ControllerRegistrationRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ControllerRegistrationResponseFilter.onControllerRegistrationResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ControllerRegistrationResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    CreateAclsRequestFilter.onCreateAclsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreateAclsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    CreateAclsResponseFilter.onCreateAclsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreateAclsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    CreateDelegationTokenRequestFilter.onCreateDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreateDelegationTokenRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    CreateDelegationTokenResponseFilter.onCreateDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreateDelegationTokenResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    CreatePartitionsRequestFilter.onCreatePartitionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreatePartitionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    CreatePartitionsResponseFilter.onCreatePartitionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreatePartitionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    CreateTopicsRequestFilter.onCreateTopicsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreateTopicsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    CreateTopicsResponseFilter.onCreateTopicsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreateTopicsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DeleteAclsRequestFilter.onDeleteAclsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteAclsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DeleteAclsResponseFilter.onDeleteAclsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteAclsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DeleteGroupsRequestFilter.onDeleteGroupsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteGroupsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DeleteGroupsResponseFilter.onDeleteGroupsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteGroupsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DeleteRecordsRequestFilter.onDeleteRecordsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteRecordsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DeleteRecordsResponseFilter.onDeleteRecordsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteRecordsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DeleteShareGroupOffsetsRequestFilter.onDeleteShareGroupOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupOffsetsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DeleteShareGroupOffsetsResponseFilter.onDeleteShareGroupOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupOffsetsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DeleteShareGroupStateRequestFilter.onDeleteShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupStateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DeleteShareGroupStateResponseFilter.onDeleteShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupStateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DeleteTopicsRequestFilter.onDeleteTopicsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteTopicsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DeleteTopicsResponseFilter.onDeleteTopicsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteTopicsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeAclsRequestFilter.onDescribeAclsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeAclsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeAclsResponseFilter.onDescribeAclsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeAclsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeClientQuotasRequestFilter.onDescribeClientQuotasRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeClientQuotasRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeClientQuotasResponseFilter.onDescribeClientQuotasResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeClientQuotasResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeClusterRequestFilter.onDescribeClusterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeClusterRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeClusterResponseFilter.onDescribeClusterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeClusterResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeConfigsRequestFilter.onDescribeConfigsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeConfigsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeConfigsResponseFilter.onDescribeConfigsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeConfigsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeDelegationTokenRequestFilter.onDescribeDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeDelegationTokenRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeDelegationTokenResponseFilter.onDescribeDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeDelegationTokenResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeGroupsRequestFilter.onDescribeGroupsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeGroupsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeGroupsResponseFilter.onDescribeGroupsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeGroupsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeLogDirsRequestFilter.onDescribeLogDirsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeLogDirsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeLogDirsResponseFilter.onDescribeLogDirsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeLogDirsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeProducersRequestFilter.onDescribeProducersRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeProducersRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeProducersResponseFilter.onDescribeProducersResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeProducersResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeQuorumRequestFilter.onDescribeQuorumRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeQuorumRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeQuorumResponseFilter.onDescribeQuorumResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeQuorumResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeShareGroupOffsetsRequestFilter.onDescribeShareGroupOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeShareGroupOffsetsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeShareGroupOffsetsResponseFilter.onDescribeShareGroupOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeShareGroupOffsetsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeTopicPartitionsRequestFilter.onDescribeTopicPartitionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeTopicPartitionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeTopicPartitionsResponseFilter.onDescribeTopicPartitionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeTopicPartitionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeTransactionsRequestFilter.onDescribeTransactionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeTransactionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeTransactionsResponseFilter.onDescribeTransactionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeTransactionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeUserScramCredentialsRequestFilter.onDescribeUserScramCredentialsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeUserScramCredentialsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeUserScramCredentialsResponseFilter.onDescribeUserScramCredentialsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeUserScramCredentialsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ElectLeadersRequestFilter.onElectLeadersRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ElectLeadersRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ElectLeadersResponseFilter.onElectLeadersResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ElectLeadersResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    EndQuorumEpochRequestFilter.onEndQuorumEpochRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.EndQuorumEpochRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    EndQuorumEpochResponseFilter.onEndQuorumEpochResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.EndQuorumEpochResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    EndTxnRequestFilter.onEndTxnRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.EndTxnRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    EndTxnResponseFilter.onEndTxnResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.EndTxnResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    EnvelopeRequestFilter.onEnvelopeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.EnvelopeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    EnvelopeResponseFilter.onEnvelopeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.EnvelopeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ExpireDelegationTokenRequestFilter.onExpireDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ExpireDelegationTokenRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ExpireDelegationTokenResponseFilter.onExpireDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ExpireDelegationTokenResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    FetchRequestFilter.onFetchRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.FetchRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    FetchResponseFilter.onFetchResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.FetchResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    FetchSnapshotRequestFilter.onFetchSnapshotRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.FetchSnapshotRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    FetchSnapshotResponseFilter.onFetchSnapshotResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.FetchSnapshotResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    FindCoordinatorRequestFilter.onFindCoordinatorRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.FindCoordinatorRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    FindCoordinatorResponseFilter.onFindCoordinatorResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.FindCoordinatorResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    GetTelemetrySubscriptionsRequestFilter.onGetTelemetrySubscriptionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.GetTelemetrySubscriptionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    GetTelemetrySubscriptionsResponseFilter.onGetTelemetrySubscriptionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.GetTelemetrySubscriptionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    HeartbeatRequestFilter.onHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.HeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    HeartbeatResponseFilter.onHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.HeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    IncrementalAlterConfigsRequestFilter.onIncrementalAlterConfigsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.IncrementalAlterConfigsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    IncrementalAlterConfigsResponseFilter.onIncrementalAlterConfigsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.IncrementalAlterConfigsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    InitializeShareGroupStateRequestFilter.onInitializeShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.InitializeShareGroupStateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    InitializeShareGroupStateResponseFilter.onInitializeShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.InitializeShareGroupStateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    InitProducerIdRequestFilter.onInitProducerIdRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.InitProducerIdRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    InitProducerIdResponseFilter.onInitProducerIdResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.InitProducerIdResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    JoinGroupRequestFilter.onJoinGroupRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.JoinGroupRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    JoinGroupResponseFilter.onJoinGroupResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.JoinGroupResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    LeaveGroupRequestFilter.onLeaveGroupRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.LeaveGroupRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    LeaveGroupResponseFilter.onLeaveGroupResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.LeaveGroupResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ListConfigResourcesRequestFilter.onListConfigResourcesRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListConfigResourcesRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ListConfigResourcesResponseFilter.onListConfigResourcesResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListConfigResourcesResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ListGroupsRequestFilter.onListGroupsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListGroupsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ListGroupsResponseFilter.onListGroupsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListGroupsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ListOffsetsRequestFilter.onListOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListOffsetsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ListOffsetsResponseFilter.onListOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListOffsetsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ListPartitionReassignmentsRequestFilter.onListPartitionReassignmentsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListPartitionReassignmentsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ListPartitionReassignmentsResponseFilter.onListPartitionReassignmentsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListPartitionReassignmentsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ListTransactionsRequestFilter.onListTransactionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListTransactionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ListTransactionsResponseFilter.onListTransactionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListTransactionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    MetadataRequestFilter.onMetadataRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.MetadataRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    MetadataResponseFilter.onMetadataResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.MetadataResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    OffsetCommitRequestFilter.onOffsetCommitRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetCommitRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    OffsetCommitResponseFilter.onOffsetCommitResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetCommitResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    OffsetDeleteRequestFilter.onOffsetDeleteRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetDeleteRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    OffsetDeleteResponseFilter.onOffsetDeleteResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetDeleteResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    OffsetFetchRequestFilter.onOffsetFetchRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetFetchRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    OffsetFetchResponseFilter.onOffsetFetchResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetFetchResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    OffsetForLeaderEpochRequestFilter.onOffsetForLeaderEpochRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetForLeaderEpochRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    OffsetForLeaderEpochResponseFilter.onOffsetForLeaderEpochResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetForLeaderEpochResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ProduceRequestFilter.onProduceRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ProduceRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ProduceResponseFilter.onProduceResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ProduceResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    PushTelemetryRequestFilter.onPushTelemetryRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.PushTelemetryRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    PushTelemetryResponseFilter.onPushTelemetryResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.PushTelemetryResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ReadShareGroupStateRequestFilter.onReadShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ReadShareGroupStateResponseFilter.onReadShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ReadShareGroupStateSummaryRequestFilter.onReadShareGroupStateSummaryRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateSummaryRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ReadShareGroupStateSummaryResponseFilter.onReadShareGroupStateSummaryResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateSummaryResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    RemoveRaftVoterRequestFilter.onRemoveRaftVoterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.RemoveRaftVoterRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    RemoveRaftVoterResponseFilter.onRemoveRaftVoterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.RemoveRaftVoterResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    RenewDelegationTokenRequestFilter.onRenewDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.RenewDelegationTokenRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    RenewDelegationTokenResponseFilter.onRenewDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.RenewDelegationTokenResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    RequestFilter.onRequest(org.apache.kafka.common.protocol.ApiKeys apiKey, + short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.protocol.ApiMessage request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    RequestFilter.onRequest(org.apache.kafka.common.protocol.ApiKeys apiKey, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.protocol.ApiMessage request, + FilterContext context)
    +
    +
    Deprecated, for removal: This API element is subject to removal in a future version. + +
    +
    + +
    ResponseFilter.onResponse(org.apache.kafka.common.protocol.ApiKeys apiKey, + short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.protocol.ApiMessage response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ResponseFilter.onResponse(org.apache.kafka.common.protocol.ApiKeys apiKey, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.protocol.ApiMessage response, + FilterContext context)
    +
    +
    Deprecated, for removal: This API element is subject to removal in a future version. + +
    +
    + +
    SaslAuthenticateRequestFilter.onSaslAuthenticateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.SaslAuthenticateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    SaslAuthenticateResponseFilter.onSaslAuthenticateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.SaslAuthenticateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    SaslHandshakeRequestFilter.onSaslHandshakeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.SaslHandshakeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    SaslHandshakeResponseFilter.onSaslHandshakeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.SaslHandshakeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ShareAcknowledgeRequestFilter.onShareAcknowledgeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareAcknowledgeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ShareAcknowledgeResponseFilter.onShareAcknowledgeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareAcknowledgeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ShareFetchRequestFilter.onShareFetchRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareFetchRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ShareFetchResponseFilter.onShareFetchResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareFetchResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ShareGroupDescribeRequestFilter.onShareGroupDescribeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareGroupDescribeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ShareGroupDescribeResponseFilter.onShareGroupDescribeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareGroupDescribeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ShareGroupHeartbeatRequestFilter.onShareGroupHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareGroupHeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ShareGroupHeartbeatResponseFilter.onShareGroupHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareGroupHeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    StreamsGroupDescribeRequestFilter.onStreamsGroupDescribeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.StreamsGroupDescribeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    StreamsGroupDescribeResponseFilter.onStreamsGroupDescribeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.StreamsGroupDescribeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    StreamsGroupHeartbeatRequestFilter.onStreamsGroupHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.StreamsGroupHeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    StreamsGroupHeartbeatResponseFilter.onStreamsGroupHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.StreamsGroupHeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    SyncGroupRequestFilter.onSyncGroupRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.SyncGroupRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    SyncGroupResponseFilter.onSyncGroupResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.SyncGroupResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    TxnOffsetCommitRequestFilter.onTxnOffsetCommitRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.TxnOffsetCommitRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    TxnOffsetCommitResponseFilter.onTxnOffsetCommitResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.TxnOffsetCommitResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    UnregisterBrokerRequestFilter.onUnregisterBrokerRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.UnregisterBrokerRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    UnregisterBrokerResponseFilter.onUnregisterBrokerResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.UnregisterBrokerResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    UpdateFeaturesRequestFilter.onUpdateFeaturesRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.UpdateFeaturesRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    UpdateFeaturesResponseFilter.onUpdateFeaturesResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.UpdateFeaturesResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    UpdateRaftVoterRequestFilter.onUpdateRaftVoterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.UpdateRaftVoterRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    UpdateRaftVoterResponseFilter.onUpdateRaftVoterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.UpdateRaftVoterResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    VoteRequestFilter.onVoteRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.VoteRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    VoteResponseFilter.onVoteResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.VoteResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    WriteShareGroupStateRequestFilter.onWriteShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.WriteShareGroupStateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    WriteShareGroupStateResponseFilter.onWriteShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.WriteShareGroupStateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    WriteTxnMarkersRequestFilter.onWriteTxnMarkersRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.WriteTxnMarkersRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    WriteTxnMarkersResponseFilter.onWriteTxnMarkersResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.WriteTxnMarkersResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    +
    +
  • +
+
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterDispatchExecutor.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterDispatchExecutor.html new file mode 100644 index 0000000..37744c4 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterDispatchExecutor.html @@ -0,0 +1,92 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.FilterDispatchExecutor (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.FilterDispatchExecutor

+
+
Packages that use FilterDispatchExecutor
+
+
Package
+
Description
+ +
+
The protocol filter API.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterFactory.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterFactory.html new file mode 100644 index 0000000..dc88852 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterFactory.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.FilterFactory (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.FilterFactory

+
+No usage of io.kroxylicious.proxy.filter.FilterFactory
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterFactoryContext.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterFactoryContext.html new file mode 100644 index 0000000..026c396 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterFactoryContext.html @@ -0,0 +1,98 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.FilterFactoryContext (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.FilterFactoryContext

+
+
Packages that use FilterFactoryContext
+
+
Package
+
Description
+ +
+
The protocol filter API.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterResult.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterResult.html new file mode 100644 index 0000000..051c468 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterResult.html @@ -0,0 +1,137 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.FilterResult (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.FilterResult

+
+
Packages that use FilterResult
+
+
Package
+
Description
+ +
+
The protocol filter API.
+
+ +
+
Builder API for constructing filter results.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterResultBuilder.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterResultBuilder.html new file mode 100644 index 0000000..1be2f1c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FilterResultBuilder.html @@ -0,0 +1,96 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.FilterResultBuilder (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.FilterResultBuilder

+
+
Packages that use FilterResultBuilder
+
+
Package
+
Description
+ +
+
The protocol filter API.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FindCoordinatorRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FindCoordinatorRequestFilter.html new file mode 100644 index 0000000..590a5ad --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FindCoordinatorRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.FindCoordinatorRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.FindCoordinatorRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.FindCoordinatorRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FindCoordinatorResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FindCoordinatorResponseFilter.html new file mode 100644 index 0000000..345679a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/FindCoordinatorResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.FindCoordinatorResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.FindCoordinatorResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.FindCoordinatorResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/GetTelemetrySubscriptionsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/GetTelemetrySubscriptionsRequestFilter.html new file mode 100644 index 0000000..35d525e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/GetTelemetrySubscriptionsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.GetTelemetrySubscriptionsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.GetTelemetrySubscriptionsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.GetTelemetrySubscriptionsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/GetTelemetrySubscriptionsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/GetTelemetrySubscriptionsResponseFilter.html new file mode 100644 index 0000000..86e99a5 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/GetTelemetrySubscriptionsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.GetTelemetrySubscriptionsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.GetTelemetrySubscriptionsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.GetTelemetrySubscriptionsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/HeartbeatRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/HeartbeatRequestFilter.html new file mode 100644 index 0000000..6309602 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/HeartbeatRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.HeartbeatRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.HeartbeatRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.HeartbeatRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/HeartbeatResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/HeartbeatResponseFilter.html new file mode 100644 index 0000000..df7db54 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/HeartbeatResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.HeartbeatResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.HeartbeatResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.HeartbeatResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/IncrementalAlterConfigsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/IncrementalAlterConfigsRequestFilter.html new file mode 100644 index 0000000..03769da --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/IncrementalAlterConfigsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.IncrementalAlterConfigsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.IncrementalAlterConfigsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.IncrementalAlterConfigsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/IncrementalAlterConfigsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/IncrementalAlterConfigsResponseFilter.html new file mode 100644 index 0000000..f4e35d7 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/IncrementalAlterConfigsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.IncrementalAlterConfigsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.IncrementalAlterConfigsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.IncrementalAlterConfigsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/InitProducerIdRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/InitProducerIdRequestFilter.html new file mode 100644 index 0000000..190f4ec --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/InitProducerIdRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.InitProducerIdRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.InitProducerIdRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.InitProducerIdRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/InitProducerIdResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/InitProducerIdResponseFilter.html new file mode 100644 index 0000000..a52265d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/InitProducerIdResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.InitProducerIdResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.InitProducerIdResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.InitProducerIdResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/InitializeShareGroupStateRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/InitializeShareGroupStateRequestFilter.html new file mode 100644 index 0000000..2b57b52 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/InitializeShareGroupStateRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.InitializeShareGroupStateRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.InitializeShareGroupStateRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.InitializeShareGroupStateRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/InitializeShareGroupStateResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/InitializeShareGroupStateResponseFilter.html new file mode 100644 index 0000000..a0dd57b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/InitializeShareGroupStateResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.InitializeShareGroupStateResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.InitializeShareGroupStateResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.InitializeShareGroupStateResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/JoinGroupRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/JoinGroupRequestFilter.html new file mode 100644 index 0000000..3ab08b8 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/JoinGroupRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.JoinGroupRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.JoinGroupRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.JoinGroupRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/JoinGroupResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/JoinGroupResponseFilter.html new file mode 100644 index 0000000..7803079 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/JoinGroupResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.JoinGroupResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.JoinGroupResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.JoinGroupResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/LeaveGroupRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/LeaveGroupRequestFilter.html new file mode 100644 index 0000000..5417bef --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/LeaveGroupRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.LeaveGroupRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.LeaveGroupRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.LeaveGroupRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/LeaveGroupResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/LeaveGroupResponseFilter.html new file mode 100644 index 0000000..c909bff --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/LeaveGroupResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.LeaveGroupResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.LeaveGroupResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.LeaveGroupResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListConfigResourcesRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListConfigResourcesRequestFilter.html new file mode 100644 index 0000000..e524069 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListConfigResourcesRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ListConfigResourcesRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ListConfigResourcesRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ListConfigResourcesRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListConfigResourcesResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListConfigResourcesResponseFilter.html new file mode 100644 index 0000000..d72f5d2 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListConfigResourcesResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ListConfigResourcesResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ListConfigResourcesResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ListConfigResourcesResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListGroupsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListGroupsRequestFilter.html new file mode 100644 index 0000000..2ee2361 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListGroupsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ListGroupsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ListGroupsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ListGroupsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListGroupsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListGroupsResponseFilter.html new file mode 100644 index 0000000..16555fb --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListGroupsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ListGroupsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ListGroupsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ListGroupsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListOffsetsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListOffsetsRequestFilter.html new file mode 100644 index 0000000..c2d0a1f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListOffsetsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ListOffsetsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ListOffsetsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ListOffsetsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListOffsetsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListOffsetsResponseFilter.html new file mode 100644 index 0000000..1aae490 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListOffsetsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ListOffsetsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ListOffsetsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ListOffsetsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListPartitionReassignmentsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListPartitionReassignmentsRequestFilter.html new file mode 100644 index 0000000..c5c848e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListPartitionReassignmentsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ListPartitionReassignmentsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ListPartitionReassignmentsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ListPartitionReassignmentsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListPartitionReassignmentsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListPartitionReassignmentsResponseFilter.html new file mode 100644 index 0000000..76b39b1 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListPartitionReassignmentsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ListPartitionReassignmentsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ListPartitionReassignmentsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ListPartitionReassignmentsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListTransactionsRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListTransactionsRequestFilter.html new file mode 100644 index 0000000..3b601df --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListTransactionsRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ListTransactionsRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ListTransactionsRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ListTransactionsRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListTransactionsResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListTransactionsResponseFilter.html new file mode 100644 index 0000000..ae28d17 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ListTransactionsResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ListTransactionsResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ListTransactionsResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ListTransactionsResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/MetadataRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/MetadataRequestFilter.html new file mode 100644 index 0000000..a404e05 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/MetadataRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.MetadataRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.MetadataRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.MetadataRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/MetadataResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/MetadataResponseFilter.html new file mode 100644 index 0000000..4736098 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/MetadataResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.MetadataResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.MetadataResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.MetadataResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetCommitRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetCommitRequestFilter.html new file mode 100644 index 0000000..88835db --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetCommitRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.OffsetCommitRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.OffsetCommitRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.OffsetCommitRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetCommitResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetCommitResponseFilter.html new file mode 100644 index 0000000..0e3a67b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetCommitResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.OffsetCommitResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.OffsetCommitResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.OffsetCommitResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetDeleteRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetDeleteRequestFilter.html new file mode 100644 index 0000000..68fc148 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetDeleteRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.OffsetDeleteRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.OffsetDeleteRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.OffsetDeleteRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetDeleteResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetDeleteResponseFilter.html new file mode 100644 index 0000000..825b167 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetDeleteResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.OffsetDeleteResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.OffsetDeleteResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.OffsetDeleteResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetFetchRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetFetchRequestFilter.html new file mode 100644 index 0000000..eb2a87e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetFetchRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.OffsetFetchRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.OffsetFetchRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.OffsetFetchRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetFetchResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetFetchResponseFilter.html new file mode 100644 index 0000000..27866c4 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetFetchResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.OffsetFetchResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.OffsetFetchResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.OffsetFetchResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetForLeaderEpochRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetForLeaderEpochRequestFilter.html new file mode 100644 index 0000000..2065b73 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetForLeaderEpochRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.OffsetForLeaderEpochRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.OffsetForLeaderEpochRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.OffsetForLeaderEpochRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetForLeaderEpochResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetForLeaderEpochResponseFilter.html new file mode 100644 index 0000000..d463e3a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/OffsetForLeaderEpochResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.OffsetForLeaderEpochResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.OffsetForLeaderEpochResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.OffsetForLeaderEpochResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ProduceRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ProduceRequestFilter.html new file mode 100644 index 0000000..407b5e8 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ProduceRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ProduceRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ProduceRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ProduceRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ProduceResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ProduceResponseFilter.html new file mode 100644 index 0000000..0df403c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ProduceResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ProduceResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ProduceResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ProduceResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/PushTelemetryRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/PushTelemetryRequestFilter.html new file mode 100644 index 0000000..fcc5a7e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/PushTelemetryRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.PushTelemetryRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.PushTelemetryRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.PushTelemetryRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/PushTelemetryResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/PushTelemetryResponseFilter.html new file mode 100644 index 0000000..a4c2400 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/PushTelemetryResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.PushTelemetryResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.PushTelemetryResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.PushTelemetryResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ReadShareGroupStateRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ReadShareGroupStateRequestFilter.html new file mode 100644 index 0000000..799c0a6 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ReadShareGroupStateRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ReadShareGroupStateRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ReadShareGroupStateRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ReadShareGroupStateRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ReadShareGroupStateResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ReadShareGroupStateResponseFilter.html new file mode 100644 index 0000000..b77970e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ReadShareGroupStateResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ReadShareGroupStateResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ReadShareGroupStateResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ReadShareGroupStateResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ReadShareGroupStateSummaryRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ReadShareGroupStateSummaryRequestFilter.html new file mode 100644 index 0000000..54f6bc4 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ReadShareGroupStateSummaryRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ReadShareGroupStateSummaryRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ReadShareGroupStateSummaryRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ReadShareGroupStateSummaryRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ReadShareGroupStateSummaryResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ReadShareGroupStateSummaryResponseFilter.html new file mode 100644 index 0000000..2885adf --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ReadShareGroupStateSummaryResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ReadShareGroupStateSummaryResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ReadShareGroupStateSummaryResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ReadShareGroupStateSummaryResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RemoveRaftVoterRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RemoveRaftVoterRequestFilter.html new file mode 100644 index 0000000..cd4741c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RemoveRaftVoterRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.RemoveRaftVoterRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.RemoveRaftVoterRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.RemoveRaftVoterRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RemoveRaftVoterResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RemoveRaftVoterResponseFilter.html new file mode 100644 index 0000000..f81ae09 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RemoveRaftVoterResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.RemoveRaftVoterResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.RemoveRaftVoterResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.RemoveRaftVoterResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RenewDelegationTokenRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RenewDelegationTokenRequestFilter.html new file mode 100644 index 0000000..4061cf5 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RenewDelegationTokenRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.RenewDelegationTokenRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.RenewDelegationTokenRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.RenewDelegationTokenRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RenewDelegationTokenResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RenewDelegationTokenResponseFilter.html new file mode 100644 index 0000000..42ff4e3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RenewDelegationTokenResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.RenewDelegationTokenResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.RenewDelegationTokenResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.RenewDelegationTokenResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RequestFilter.html new file mode 100644 index 0000000..b1b2636 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.RequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.RequestFilter

+
+No usage of io.kroxylicious.proxy.filter.RequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RequestFilterResult.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RequestFilterResult.html new file mode 100644 index 0000000..8b067c5 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RequestFilterResult.html @@ -0,0 +1,931 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.RequestFilterResult (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.RequestFilterResult

+
+
Packages that use RequestFilterResult
+
+
Package
+
Description
+ +
+
The protocol filter API.
+
+
+
+
    +
  • +
    +

    Uses of RequestFilterResult in io.kroxylicious.proxy.filter

    +
    Methods in io.kroxylicious.proxy.filter that return types with arguments of type RequestFilterResult
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    RequestFilterResultBuilder.errorResponse(org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.protocol.ApiMessage requestMessage, + ApiException apiException)
    +
    +
    Generate a short-circuit error response towards the client.
    +
    + +
    FilterContext.forwardRequest(org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.protocol.ApiMessage request)
    +
    +
    Generates a completed filter results containing the given header and request.
    +
    + +
    AddOffsetsToTxnRequestFilter.onAddOffsetsToTxnRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AddOffsetsToTxnRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AddPartitionsToTxnRequestFilter.onAddPartitionsToTxnRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AddPartitionsToTxnRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AddRaftVoterRequestFilter.onAddRaftVoterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AddRaftVoterRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AllocateProducerIdsRequestFilter.onAllocateProducerIdsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AllocateProducerIdsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AlterClientQuotasRequestFilter.onAlterClientQuotasRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterClientQuotasRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AlterConfigsRequestFilter.onAlterConfigsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterConfigsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AlterPartitionReassignmentsRequestFilter.onAlterPartitionReassignmentsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterPartitionReassignmentsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AlterPartitionRequestFilter.onAlterPartitionRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterPartitionRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AlterReplicaLogDirsRequestFilter.onAlterReplicaLogDirsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterReplicaLogDirsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AlterShareGroupOffsetsRequestFilter.onAlterShareGroupOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterShareGroupOffsetsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AlterUserScramCredentialsRequestFilter.onAlterUserScramCredentialsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AlterUserScramCredentialsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ApiVersionsRequestFilter.onApiVersionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ApiVersionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    AssignReplicasToDirsRequestFilter.onAssignReplicasToDirsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.AssignReplicasToDirsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    BeginQuorumEpochRequestFilter.onBeginQuorumEpochRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.BeginQuorumEpochRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    BrokerHeartbeatRequestFilter.onBrokerHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.BrokerHeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    BrokerRegistrationRequestFilter.onBrokerRegistrationRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.BrokerRegistrationRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ConsumerGroupDescribeRequestFilter.onConsumerGroupDescribeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ConsumerGroupDescribeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ConsumerGroupHeartbeatRequestFilter.onConsumerGroupHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ConsumerGroupHeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ControllerRegistrationRequestFilter.onControllerRegistrationRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ControllerRegistrationRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    CreateAclsRequestFilter.onCreateAclsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreateAclsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    CreateDelegationTokenRequestFilter.onCreateDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreateDelegationTokenRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    CreatePartitionsRequestFilter.onCreatePartitionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreatePartitionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    CreateTopicsRequestFilter.onCreateTopicsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.CreateTopicsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DeleteAclsRequestFilter.onDeleteAclsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteAclsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DeleteGroupsRequestFilter.onDeleteGroupsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteGroupsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DeleteRecordsRequestFilter.onDeleteRecordsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteRecordsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DeleteShareGroupOffsetsRequestFilter.onDeleteShareGroupOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupOffsetsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DeleteShareGroupStateRequestFilter.onDeleteShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupStateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DeleteTopicsRequestFilter.onDeleteTopicsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DeleteTopicsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeAclsRequestFilter.onDescribeAclsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeAclsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeClientQuotasRequestFilter.onDescribeClientQuotasRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeClientQuotasRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeClusterRequestFilter.onDescribeClusterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeClusterRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeConfigsRequestFilter.onDescribeConfigsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeConfigsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeDelegationTokenRequestFilter.onDescribeDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeDelegationTokenRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeGroupsRequestFilter.onDescribeGroupsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeGroupsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeLogDirsRequestFilter.onDescribeLogDirsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeLogDirsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeProducersRequestFilter.onDescribeProducersRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeProducersRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeQuorumRequestFilter.onDescribeQuorumRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeQuorumRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeShareGroupOffsetsRequestFilter.onDescribeShareGroupOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeShareGroupOffsetsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeTopicPartitionsRequestFilter.onDescribeTopicPartitionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeTopicPartitionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeTransactionsRequestFilter.onDescribeTransactionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeTransactionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    DescribeUserScramCredentialsRequestFilter.onDescribeUserScramCredentialsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.DescribeUserScramCredentialsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ElectLeadersRequestFilter.onElectLeadersRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ElectLeadersRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    EndQuorumEpochRequestFilter.onEndQuorumEpochRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.EndQuorumEpochRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    EndTxnRequestFilter.onEndTxnRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.EndTxnRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    EnvelopeRequestFilter.onEnvelopeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.EnvelopeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ExpireDelegationTokenRequestFilter.onExpireDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ExpireDelegationTokenRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    FetchRequestFilter.onFetchRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.FetchRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    FetchSnapshotRequestFilter.onFetchSnapshotRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.FetchSnapshotRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    FindCoordinatorRequestFilter.onFindCoordinatorRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.FindCoordinatorRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    GetTelemetrySubscriptionsRequestFilter.onGetTelemetrySubscriptionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.GetTelemetrySubscriptionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    HeartbeatRequestFilter.onHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.HeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    IncrementalAlterConfigsRequestFilter.onIncrementalAlterConfigsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.IncrementalAlterConfigsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    InitializeShareGroupStateRequestFilter.onInitializeShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.InitializeShareGroupStateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    InitProducerIdRequestFilter.onInitProducerIdRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.InitProducerIdRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    JoinGroupRequestFilter.onJoinGroupRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.JoinGroupRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    LeaveGroupRequestFilter.onLeaveGroupRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.LeaveGroupRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ListConfigResourcesRequestFilter.onListConfigResourcesRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListConfigResourcesRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ListGroupsRequestFilter.onListGroupsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListGroupsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ListOffsetsRequestFilter.onListOffsetsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListOffsetsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ListPartitionReassignmentsRequestFilter.onListPartitionReassignmentsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListPartitionReassignmentsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ListTransactionsRequestFilter.onListTransactionsRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ListTransactionsRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    MetadataRequestFilter.onMetadataRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.MetadataRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    OffsetCommitRequestFilter.onOffsetCommitRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetCommitRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    OffsetDeleteRequestFilter.onOffsetDeleteRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetDeleteRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    OffsetFetchRequestFilter.onOffsetFetchRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetFetchRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    OffsetForLeaderEpochRequestFilter.onOffsetForLeaderEpochRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.OffsetForLeaderEpochRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ProduceRequestFilter.onProduceRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ProduceRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    PushTelemetryRequestFilter.onPushTelemetryRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.PushTelemetryRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ReadShareGroupStateRequestFilter.onReadShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ReadShareGroupStateSummaryRequestFilter.onReadShareGroupStateSummaryRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateSummaryRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    RemoveRaftVoterRequestFilter.onRemoveRaftVoterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.RemoveRaftVoterRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    RenewDelegationTokenRequestFilter.onRenewDelegationTokenRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.RenewDelegationTokenRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    RequestFilter.onRequest(org.apache.kafka.common.protocol.ApiKeys apiKey, + short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.protocol.ApiMessage request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    RequestFilter.onRequest(org.apache.kafka.common.protocol.ApiKeys apiKey, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.protocol.ApiMessage request, + FilterContext context)
    +
    +
    Deprecated, for removal: This API element is subject to removal in a future version. + +
    +
    + +
    SaslAuthenticateRequestFilter.onSaslAuthenticateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.SaslAuthenticateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    SaslHandshakeRequestFilter.onSaslHandshakeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.SaslHandshakeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ShareAcknowledgeRequestFilter.onShareAcknowledgeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareAcknowledgeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ShareFetchRequestFilter.onShareFetchRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareFetchRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ShareGroupDescribeRequestFilter.onShareGroupDescribeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareGroupDescribeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    ShareGroupHeartbeatRequestFilter.onShareGroupHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.ShareGroupHeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    StreamsGroupDescribeRequestFilter.onStreamsGroupDescribeRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.StreamsGroupDescribeRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    StreamsGroupHeartbeatRequestFilter.onStreamsGroupHeartbeatRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.StreamsGroupHeartbeatRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    SyncGroupRequestFilter.onSyncGroupRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.SyncGroupRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    TxnOffsetCommitRequestFilter.onTxnOffsetCommitRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.TxnOffsetCommitRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    UnregisterBrokerRequestFilter.onUnregisterBrokerRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.UnregisterBrokerRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    UpdateFeaturesRequestFilter.onUpdateFeaturesRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.UpdateFeaturesRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    UpdateRaftVoterRequestFilter.onUpdateRaftVoterRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.UpdateRaftVoterRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    VoteRequestFilter.onVoteRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.VoteRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    WriteShareGroupStateRequestFilter.onWriteShareGroupStateRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.WriteShareGroupStateRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    WriteTxnMarkersRequestFilter.onWriteTxnMarkersRequest(short apiVersion, + org.apache.kafka.common.message.RequestHeaderData header, + org.apache.kafka.common.message.WriteTxnMarkersRequestData request, + FilterContext context)
    +
    +
    Handle the given header and request pair, returning the header and request + pair to be passed to the next filter using the RequestFilterResult.
    +
    + +
    RequestFilterResultBuilder.shortCircuitResponse(org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.protocol.ApiMessage message)
    +
    +
    A short-circuit response towards the client.
    +
    + +
    RequestFilterResultBuilder.shortCircuitResponse(org.apache.kafka.common.protocol.ApiMessage message)
    +
    +
    A short-circuit response towards the client.
    +
    +
    +
    +
  • +
+
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RequestFilterResultBuilder.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RequestFilterResultBuilder.html new file mode 100644 index 0000000..ecca13b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/RequestFilterResultBuilder.html @@ -0,0 +1,91 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.RequestFilterResultBuilder (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.RequestFilterResultBuilder

+
+
Packages that use RequestFilterResultBuilder
+
+
Package
+
Description
+ +
+
The protocol filter API.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ResponseFilter.html new file mode 100644 index 0000000..8a4fb2c --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ResponseFilterResult.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ResponseFilterResult.html new file mode 100644 index 0000000..d832deb --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ResponseFilterResult.html @@ -0,0 +1,913 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ResponseFilterResult (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ResponseFilterResult

+
+
Packages that use ResponseFilterResult
+
+
Package
+
Description
+ +
+
The protocol filter API.
+
+
+
+
    +
  • +
    +

    Uses of ResponseFilterResult in io.kroxylicious.proxy.filter

    +
    Methods in io.kroxylicious.proxy.filter that return types with arguments of type ResponseFilterResult
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    FilterContext.forwardResponse(org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.protocol.ApiMessage response)
    +
    +
    Generates a completed filter results containing the given header and response.
    +
    + +
    AddOffsetsToTxnResponseFilter.onAddOffsetsToTxnResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AddOffsetsToTxnResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AddPartitionsToTxnResponseFilter.onAddPartitionsToTxnResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AddPartitionsToTxnResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AddRaftVoterResponseFilter.onAddRaftVoterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AddRaftVoterResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AllocateProducerIdsResponseFilter.onAllocateProducerIdsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AllocateProducerIdsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AlterClientQuotasResponseFilter.onAlterClientQuotasResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterClientQuotasResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AlterConfigsResponseFilter.onAlterConfigsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterConfigsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AlterPartitionReassignmentsResponseFilter.onAlterPartitionReassignmentsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterPartitionReassignmentsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AlterPartitionResponseFilter.onAlterPartitionResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterPartitionResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AlterReplicaLogDirsResponseFilter.onAlterReplicaLogDirsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterReplicaLogDirsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AlterShareGroupOffsetsResponseFilter.onAlterShareGroupOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterShareGroupOffsetsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AlterUserScramCredentialsResponseFilter.onAlterUserScramCredentialsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AlterUserScramCredentialsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ApiVersionsResponseFilter.onApiVersionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ApiVersionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    AssignReplicasToDirsResponseFilter.onAssignReplicasToDirsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.AssignReplicasToDirsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    BeginQuorumEpochResponseFilter.onBeginQuorumEpochResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.BeginQuorumEpochResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    BrokerHeartbeatResponseFilter.onBrokerHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.BrokerHeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    BrokerRegistrationResponseFilter.onBrokerRegistrationResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.BrokerRegistrationResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ConsumerGroupDescribeResponseFilter.onConsumerGroupDescribeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ConsumerGroupDescribeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ConsumerGroupHeartbeatResponseFilter.onConsumerGroupHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ConsumerGroupHeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ControllerRegistrationResponseFilter.onControllerRegistrationResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ControllerRegistrationResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    CreateAclsResponseFilter.onCreateAclsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreateAclsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    CreateDelegationTokenResponseFilter.onCreateDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreateDelegationTokenResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    CreatePartitionsResponseFilter.onCreatePartitionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreatePartitionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    CreateTopicsResponseFilter.onCreateTopicsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.CreateTopicsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DeleteAclsResponseFilter.onDeleteAclsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteAclsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DeleteGroupsResponseFilter.onDeleteGroupsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteGroupsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DeleteRecordsResponseFilter.onDeleteRecordsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteRecordsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DeleteShareGroupOffsetsResponseFilter.onDeleteShareGroupOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupOffsetsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DeleteShareGroupStateResponseFilter.onDeleteShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteShareGroupStateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DeleteTopicsResponseFilter.onDeleteTopicsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DeleteTopicsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeAclsResponseFilter.onDescribeAclsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeAclsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeClientQuotasResponseFilter.onDescribeClientQuotasResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeClientQuotasResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeClusterResponseFilter.onDescribeClusterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeClusterResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeConfigsResponseFilter.onDescribeConfigsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeConfigsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeDelegationTokenResponseFilter.onDescribeDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeDelegationTokenResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeGroupsResponseFilter.onDescribeGroupsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeGroupsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeLogDirsResponseFilter.onDescribeLogDirsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeLogDirsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeProducersResponseFilter.onDescribeProducersResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeProducersResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeQuorumResponseFilter.onDescribeQuorumResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeQuorumResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeShareGroupOffsetsResponseFilter.onDescribeShareGroupOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeShareGroupOffsetsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeTopicPartitionsResponseFilter.onDescribeTopicPartitionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeTopicPartitionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeTransactionsResponseFilter.onDescribeTransactionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeTransactionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    DescribeUserScramCredentialsResponseFilter.onDescribeUserScramCredentialsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.DescribeUserScramCredentialsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ElectLeadersResponseFilter.onElectLeadersResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ElectLeadersResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    EndQuorumEpochResponseFilter.onEndQuorumEpochResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.EndQuorumEpochResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    EndTxnResponseFilter.onEndTxnResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.EndTxnResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    EnvelopeResponseFilter.onEnvelopeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.EnvelopeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ExpireDelegationTokenResponseFilter.onExpireDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ExpireDelegationTokenResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    FetchResponseFilter.onFetchResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.FetchResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    FetchSnapshotResponseFilter.onFetchSnapshotResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.FetchSnapshotResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    FindCoordinatorResponseFilter.onFindCoordinatorResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.FindCoordinatorResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    GetTelemetrySubscriptionsResponseFilter.onGetTelemetrySubscriptionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.GetTelemetrySubscriptionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    HeartbeatResponseFilter.onHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.HeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    IncrementalAlterConfigsResponseFilter.onIncrementalAlterConfigsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.IncrementalAlterConfigsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    InitializeShareGroupStateResponseFilter.onInitializeShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.InitializeShareGroupStateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    InitProducerIdResponseFilter.onInitProducerIdResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.InitProducerIdResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    JoinGroupResponseFilter.onJoinGroupResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.JoinGroupResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    LeaveGroupResponseFilter.onLeaveGroupResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.LeaveGroupResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ListConfigResourcesResponseFilter.onListConfigResourcesResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListConfigResourcesResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ListGroupsResponseFilter.onListGroupsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListGroupsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ListOffsetsResponseFilter.onListOffsetsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListOffsetsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ListPartitionReassignmentsResponseFilter.onListPartitionReassignmentsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListPartitionReassignmentsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ListTransactionsResponseFilter.onListTransactionsResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ListTransactionsResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    MetadataResponseFilter.onMetadataResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.MetadataResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    OffsetCommitResponseFilter.onOffsetCommitResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetCommitResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    OffsetDeleteResponseFilter.onOffsetDeleteResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetDeleteResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    OffsetFetchResponseFilter.onOffsetFetchResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetFetchResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    OffsetForLeaderEpochResponseFilter.onOffsetForLeaderEpochResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.OffsetForLeaderEpochResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ProduceResponseFilter.onProduceResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ProduceResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    PushTelemetryResponseFilter.onPushTelemetryResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.PushTelemetryResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ReadShareGroupStateResponseFilter.onReadShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ReadShareGroupStateSummaryResponseFilter.onReadShareGroupStateSummaryResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ReadShareGroupStateSummaryResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    RemoveRaftVoterResponseFilter.onRemoveRaftVoterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.RemoveRaftVoterResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    RenewDelegationTokenResponseFilter.onRenewDelegationTokenResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.RenewDelegationTokenResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ResponseFilter.onResponse(org.apache.kafka.common.protocol.ApiKeys apiKey, + short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.protocol.ApiMessage response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ResponseFilter.onResponse(org.apache.kafka.common.protocol.ApiKeys apiKey, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.protocol.ApiMessage response, + FilterContext context)
    +
    +
    Deprecated, for removal: This API element is subject to removal in a future version. + +
    +
    + +
    SaslAuthenticateResponseFilter.onSaslAuthenticateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.SaslAuthenticateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    SaslHandshakeResponseFilter.onSaslHandshakeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.SaslHandshakeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ShareAcknowledgeResponseFilter.onShareAcknowledgeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareAcknowledgeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ShareFetchResponseFilter.onShareFetchResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareFetchResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ShareGroupDescribeResponseFilter.onShareGroupDescribeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareGroupDescribeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    ShareGroupHeartbeatResponseFilter.onShareGroupHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.ShareGroupHeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    StreamsGroupDescribeResponseFilter.onStreamsGroupDescribeResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.StreamsGroupDescribeResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    StreamsGroupHeartbeatResponseFilter.onStreamsGroupHeartbeatResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.StreamsGroupHeartbeatResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    SyncGroupResponseFilter.onSyncGroupResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.SyncGroupResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    TxnOffsetCommitResponseFilter.onTxnOffsetCommitResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.TxnOffsetCommitResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    UnregisterBrokerResponseFilter.onUnregisterBrokerResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.UnregisterBrokerResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    UpdateFeaturesResponseFilter.onUpdateFeaturesResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.UpdateFeaturesResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    UpdateRaftVoterResponseFilter.onUpdateRaftVoterResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.UpdateRaftVoterResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    VoteResponseFilter.onVoteResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.VoteResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    WriteShareGroupStateResponseFilter.onWriteShareGroupStateResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.WriteShareGroupStateResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    + +
    WriteTxnMarkersResponseFilter.onWriteTxnMarkersResponse(short apiVersion, + org.apache.kafka.common.message.ResponseHeaderData header, + org.apache.kafka.common.message.WriteTxnMarkersResponseData response, + FilterContext context)
    +
    +
    Handle the given header and response pair, returning the header and response + pair to be passed to the next filter using the ResponseFilterResult.
    +
    +
    +
    +
  • +
+
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ResponseFilterResultBuilder.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ResponseFilterResultBuilder.html new file mode 100644 index 0000000..b278234 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ResponseFilterResultBuilder.html @@ -0,0 +1,91 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ResponseFilterResultBuilder (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ResponseFilterResultBuilder

+
+
Packages that use ResponseFilterResultBuilder
+
+
Package
+
Description
+ +
+
The protocol filter API.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SaslAuthenticateRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SaslAuthenticateRequestFilter.html new file mode 100644 index 0000000..165e8d8 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SaslAuthenticateRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.SaslAuthenticateRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.SaslAuthenticateRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.SaslAuthenticateRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SaslAuthenticateResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SaslAuthenticateResponseFilter.html new file mode 100644 index 0000000..48e91b4 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SaslAuthenticateResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.SaslAuthenticateResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.SaslAuthenticateResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.SaslAuthenticateResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SaslHandshakeRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SaslHandshakeRequestFilter.html new file mode 100644 index 0000000..ae4b5b7 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SaslHandshakeRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.SaslHandshakeRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.SaslHandshakeRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.SaslHandshakeRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SaslHandshakeResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SaslHandshakeResponseFilter.html new file mode 100644 index 0000000..7ef73de --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SaslHandshakeResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.SaslHandshakeResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.SaslHandshakeResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.SaslHandshakeResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareAcknowledgeRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareAcknowledgeRequestFilter.html new file mode 100644 index 0000000..654a144 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareAcknowledgeRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ShareAcknowledgeRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ShareAcknowledgeRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ShareAcknowledgeRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareAcknowledgeResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareAcknowledgeResponseFilter.html new file mode 100644 index 0000000..48ff6e9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareAcknowledgeResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ShareAcknowledgeResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ShareAcknowledgeResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ShareAcknowledgeResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareFetchRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareFetchRequestFilter.html new file mode 100644 index 0000000..b0cadee --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareFetchRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ShareFetchRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ShareFetchRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ShareFetchRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareFetchResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareFetchResponseFilter.html new file mode 100644 index 0000000..3e103c7 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareFetchResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ShareFetchResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ShareFetchResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ShareFetchResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareGroupDescribeRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareGroupDescribeRequestFilter.html new file mode 100644 index 0000000..79dd264 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareGroupDescribeRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ShareGroupDescribeRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ShareGroupDescribeRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ShareGroupDescribeRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareGroupDescribeResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareGroupDescribeResponseFilter.html new file mode 100644 index 0000000..536e9c9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareGroupDescribeResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ShareGroupDescribeResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ShareGroupDescribeResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ShareGroupDescribeResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareGroupHeartbeatRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareGroupHeartbeatRequestFilter.html new file mode 100644 index 0000000..4d07a6a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareGroupHeartbeatRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ShareGroupHeartbeatRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ShareGroupHeartbeatRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.ShareGroupHeartbeatRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareGroupHeartbeatResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareGroupHeartbeatResponseFilter.html new file mode 100644 index 0000000..a882c3b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/ShareGroupHeartbeatResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.ShareGroupHeartbeatResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.ShareGroupHeartbeatResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.ShareGroupHeartbeatResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/StreamsGroupDescribeRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/StreamsGroupDescribeRequestFilter.html new file mode 100644 index 0000000..8d8cd36 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/StreamsGroupDescribeRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.StreamsGroupDescribeRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.StreamsGroupDescribeRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.StreamsGroupDescribeRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/StreamsGroupDescribeResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/StreamsGroupDescribeResponseFilter.html new file mode 100644 index 0000000..3734cc1 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/StreamsGroupDescribeResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.StreamsGroupDescribeResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.StreamsGroupDescribeResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.StreamsGroupDescribeResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/StreamsGroupHeartbeatRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/StreamsGroupHeartbeatRequestFilter.html new file mode 100644 index 0000000..3f1dd14 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/StreamsGroupHeartbeatRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.StreamsGroupHeartbeatRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.StreamsGroupHeartbeatRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.StreamsGroupHeartbeatRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/StreamsGroupHeartbeatResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/StreamsGroupHeartbeatResponseFilter.html new file mode 100644 index 0000000..dd2706f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/StreamsGroupHeartbeatResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.StreamsGroupHeartbeatResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.StreamsGroupHeartbeatResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.StreamsGroupHeartbeatResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SyncGroupRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SyncGroupRequestFilter.html new file mode 100644 index 0000000..5f39c44 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SyncGroupRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.SyncGroupRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.SyncGroupRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.SyncGroupRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SyncGroupResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SyncGroupResponseFilter.html new file mode 100644 index 0000000..5a90c52 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/SyncGroupResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.SyncGroupResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.SyncGroupResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.SyncGroupResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/TxnOffsetCommitRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/TxnOffsetCommitRequestFilter.html new file mode 100644 index 0000000..5186c0e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/TxnOffsetCommitRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.TxnOffsetCommitRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.TxnOffsetCommitRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.TxnOffsetCommitRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/TxnOffsetCommitResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/TxnOffsetCommitResponseFilter.html new file mode 100644 index 0000000..27ddaff --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/TxnOffsetCommitResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.TxnOffsetCommitResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.TxnOffsetCommitResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.TxnOffsetCommitResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UnregisterBrokerRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UnregisterBrokerRequestFilter.html new file mode 100644 index 0000000..352f393 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UnregisterBrokerRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.UnregisterBrokerRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.UnregisterBrokerRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.UnregisterBrokerRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UnregisterBrokerResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UnregisterBrokerResponseFilter.html new file mode 100644 index 0000000..99f1761 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UnregisterBrokerResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.UnregisterBrokerResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.UnregisterBrokerResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.UnregisterBrokerResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UpdateFeaturesRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UpdateFeaturesRequestFilter.html new file mode 100644 index 0000000..cd81529 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UpdateFeaturesRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.UpdateFeaturesRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.UpdateFeaturesRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.UpdateFeaturesRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UpdateFeaturesResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UpdateFeaturesResponseFilter.html new file mode 100644 index 0000000..8a0e996 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UpdateFeaturesResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.UpdateFeaturesResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.UpdateFeaturesResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.UpdateFeaturesResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UpdateRaftVoterRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UpdateRaftVoterRequestFilter.html new file mode 100644 index 0000000..a5d2129 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UpdateRaftVoterRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.UpdateRaftVoterRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.UpdateRaftVoterRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.UpdateRaftVoterRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UpdateRaftVoterResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UpdateRaftVoterResponseFilter.html new file mode 100644 index 0000000..5dd8e96 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/UpdateRaftVoterResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.UpdateRaftVoterResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.UpdateRaftVoterResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.UpdateRaftVoterResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/VoteRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/VoteRequestFilter.html new file mode 100644 index 0000000..62d1570 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/VoteRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.VoteRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.VoteRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.VoteRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/VoteResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/VoteResponseFilter.html new file mode 100644 index 0000000..5229e7f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/VoteResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.VoteResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.VoteResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.VoteResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/WriteShareGroupStateRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/WriteShareGroupStateRequestFilter.html new file mode 100644 index 0000000..d406c6b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/WriteShareGroupStateRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.WriteShareGroupStateRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.WriteShareGroupStateRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.WriteShareGroupStateRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/WriteShareGroupStateResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/WriteShareGroupStateResponseFilter.html new file mode 100644 index 0000000..308edef --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/WriteShareGroupStateResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.WriteShareGroupStateResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.WriteShareGroupStateResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.WriteShareGroupStateResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/WriteTxnMarkersRequestFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/WriteTxnMarkersRequestFilter.html new file mode 100644 index 0000000..15128d5 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/WriteTxnMarkersRequestFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.WriteTxnMarkersRequestFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.WriteTxnMarkersRequestFilter

+
+No usage of io.kroxylicious.proxy.filter.WriteTxnMarkersRequestFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/WriteTxnMarkersResponseFilter.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/WriteTxnMarkersResponseFilter.html new file mode 100644 index 0000000..ed3d866 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/class-use/WriteTxnMarkersResponseFilter.html @@ -0,0 +1,62 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.WriteTxnMarkersResponseFilter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.WriteTxnMarkersResponseFilter

+
+No usage of io.kroxylicious.proxy.filter.WriteTxnMarkersResponseFilter
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/CloseOrTerminalStage.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/CloseOrTerminalStage.html new file mode 100644 index 0000000..5a16a13 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/CloseOrTerminalStage.html @@ -0,0 +1,128 @@ + + + + +CloseOrTerminalStage (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface CloseOrTerminalStage<R extends FilterResult>

+
+
+
+
Type Parameters:
+
R - filter result
+
+
+
All Superinterfaces:
+
CloseStage<R>, TerminalStage<R>
+
+
+
public interface CloseOrTerminalStage<R extends FilterResult> +extends TerminalStage<R>, CloseStage<R>
+
Interface supporting the FilterResultBuilder fluent API.
+
+
+ +
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/CloseStage.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/CloseStage.html new file mode 100644 index 0000000..c2912ee --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/CloseStage.html @@ -0,0 +1,159 @@ + + + + +CloseStage (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface CloseStage<R extends FilterResult>

+
+
+
+
Type Parameters:
+
R - filter result
+
+
+
All Known Subinterfaces:
+
CloseOrTerminalStage<R>, FilterResultBuilder<H,R>, RequestFilterResultBuilder, ResponseFilterResultBuilder
+
+
+
public interface CloseStage<R extends FilterResult>
+
Interface supporting the FilterResultBuilder fluent API.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
    +
    Signals the desire of the filter that the connection is closed.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      withCloseConnection

      +
      TerminalStage<R> withCloseConnection()
      +
      Signals the desire of the filter that the connection is closed.
      +
      +
      Returns:
      +
      next stage in the fluent API.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/TerminalStage.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/TerminalStage.html new file mode 100644 index 0000000..2a19a0a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/TerminalStage.html @@ -0,0 +1,175 @@ + + + + +TerminalStage (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface TerminalStage<R extends FilterResult>

+
+
+
+
Type Parameters:
+
R - filter result
+
+
+
All Known Subinterfaces:
+
CloseOrTerminalStage<R>
+
+
+
public interface TerminalStage<R extends FilterResult>
+
Interface supporting the FilterResultBuilder fluent API.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + + +
    +
    Constructs the filter result.
    +
    + + +
    +
    Produces the filter result contained within a completed CompletionStage.
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      build

      +
      R build()
      +
      Constructs the filter result.
      +
      +
      Returns:
      +
      filter result
      +
      +
      +
    • +
    • +
      +

      completed

      +
      CompletionStage<R> completed()
      +
      Produces the filter result contained within a completed CompletionStage.
      +
      +
      Returns:
      +
      completion stage contain the filter result.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/class-use/CloseOrTerminalStage.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/class-use/CloseOrTerminalStage.html new file mode 100644 index 0000000..686c5d5 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/class-use/CloseOrTerminalStage.html @@ -0,0 +1,110 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.filterresultbuilder.CloseOrTerminalStage (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.filterresultbuilder.CloseOrTerminalStage

+
+
Packages that use CloseOrTerminalStage
+
+
Package
+
Description
+ +
+
The protocol filter API.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/class-use/CloseStage.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/class-use/CloseStage.html new file mode 100644 index 0000000..8d54714 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/class-use/CloseStage.html @@ -0,0 +1,121 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.filterresultbuilder.CloseStage (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.filterresultbuilder.CloseStage

+
+
Packages that use CloseStage
+
+
Package
+
Description
+ +
+
The protocol filter API.
+
+ +
+
Builder API for constructing filter results.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/class-use/TerminalStage.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/class-use/TerminalStage.html new file mode 100644 index 0000000..e696b81 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/class-use/TerminalStage.html @@ -0,0 +1,123 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.filterresultbuilder.TerminalStage (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.filterresultbuilder.TerminalStage

+
+
Packages that use TerminalStage
+
+
Package
+
Description
+ +
+
The protocol filter API.
+
+ +
+
Builder API for constructing filter results.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/package-summary.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/package-summary.html new file mode 100644 index 0000000..42c6078 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/package-summary.html @@ -0,0 +1,132 @@ + + + + +io.kroxylicious.proxy.filter.filterresultbuilder (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Package io.kroxylicious.proxy.filter.filterresultbuilder

+
+
+
@ReturnValuesAreNonnullByDefault +@DefaultAnnotationForParameters(edu.umd.cs.findbugs.annotations.NonNull.class) +@DefaultAnnotation(edu.umd.cs.findbugs.annotations.NonNull.class) +package io.kroxylicious.proxy.filter.filterresultbuilder
+
+

Builder API for constructing filter results.

+

Filters use these builders (obtained from FilterContext) + to construct FilterResult instances that control + message forwarding, dropping, short-circuiting, and connection management.

+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/package-tree.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/package-tree.html new file mode 100644 index 0000000..29ef405 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/package-tree.html @@ -0,0 +1,81 @@ + + + + +io.kroxylicious.proxy.filter.filterresultbuilder Class Hierarchy (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package io.kroxylicious.proxy.filter.filterresultbuilder

+
+Package Hierarchies: + +
+

Interface Hierarchy

+
    +
  • io.kroxylicious.proxy.filter.filterresultbuilder.CloseStage<R> + +
  • +
  • io.kroxylicious.proxy.filter.filterresultbuilder.TerminalStage<R> +
      +
    • io.kroxylicious.proxy.filter.filterresultbuilder.CloseOrTerminalStage<R> (also extends io.kroxylicious.proxy.filter.filterresultbuilder.CloseStage<R>)
    • +
    +
  • +
+
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/package-use.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/package-use.html new file mode 100644 index 0000000..6cc6d36 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/filterresultbuilder/package-use.html @@ -0,0 +1,117 @@ + + + + +Uses of Package io.kroxylicious.proxy.filter.filterresultbuilder (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
io.kroxylicious.proxy.filter.filterresultbuilder

+
+ +
+
Package
+
Description
+ +
+
The protocol filter API.
+
+ +
+
Builder API for constructing filter results.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/TopLevelMetadataErrorException.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/TopLevelMetadataErrorException.html new file mode 100644 index 0000000..255e83a --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/TopLevelMetadataErrorException.html @@ -0,0 +1,177 @@ + + + + +TopLevelMetadataErrorException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class TopLevelMetadataErrorException

+
+ +
+
+
All Implemented Interfaces:
+
Serializable
+
+
+
public class TopLevelMetadataErrorException +extends TopicNameMappingException
+
Indicates that there was an Error set at the top level of MetadataResponseData.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      TopLevelMetadataErrorException

      +
      public TopLevelMetadataErrorException(org.apache.kafka.common.protocol.Errors error)
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/TopicLevelMetadataErrorException.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/TopicLevelMetadataErrorException.html new file mode 100644 index 0000000..7f09fa3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/TopicLevelMetadataErrorException.html @@ -0,0 +1,177 @@ + + + + +TopicLevelMetadataErrorException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class TopicLevelMetadataErrorException

+
+ +
+
+
All Implemented Interfaces:
+
Serializable
+
+
+
public class TopicLevelMetadataErrorException +extends TopicNameMappingException
+
Indicates that there was an Error set on a MetadataResponseData.MetadataResponseTopic.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      TopicLevelMetadataErrorException

      +
      public TopicLevelMetadataErrorException(org.apache.kafka.common.protocol.Errors error)
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/TopicNameMapping.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/TopicNameMapping.html new file mode 100644 index 0000000..bb1a06b --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/TopicNameMapping.html @@ -0,0 +1,227 @@ + + + + +TopicNameMapping (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface TopicNameMapping

+
+
+
+
public interface TopicNameMapping
+
The result of discovering the topic names for a collection of topic ids
+
+
+ +
+
+
    + +
  • +
    +

    Field Details

    + +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      anyFailures

      +
      boolean anyFailures()
      +
      +
      Returns:
      +
      true if there are any failures
      +
      +
      +
    • +
    • +
      +

      allFailures

      +
      default boolean allFailures()
      +
      +
      Returns:
      +
      true if all name mappings failed
      +
      +
      +
    • +
    • +
      +

      topicNames

      +
      Map<Uuid,String> topicNames()
      +
      +
      Returns:
      +
      immutable map from topic id to successfully mapped topic name
      +
      +
      +
    • +
    • +
      +

      failures

      + +
      Describes the reason for every failed mapping. Expected exception types are: + + All the exception types offer TopicNameMappingException.getError() for conveniently determining the cause. Unhandled + exceptions will be mapped to an Errors.UNKNOWN_SERVER_ERROR. Callers will be able to use this to detect expected + cases like Errors.UNKNOWN_TOPIC_ID.
      +
      +
      Returns:
      +
      immutable map from topic id to kafka server error
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/TopicNameMappingException.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/TopicNameMappingException.html new file mode 100644 index 0000000..57429ea --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/TopicNameMappingException.html @@ -0,0 +1,225 @@ + + + + +TopicNameMappingException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class TopicNameMappingException

+
+
java.lang.Object +
java.lang.Throwable +
java.lang.Exception +
java.lang.RuntimeException +
io.kroxylicious.proxy.filter.metadata.TopicNameMappingException
+
+
+
+
+
+
+
All Implemented Interfaces:
+
Serializable
+
+
+
Direct Known Subclasses:
+
TopicLevelMetadataErrorException, TopLevelMetadataErrorException
+
+
+
public class TopicNameMappingException +extends RuntimeException
+
Indicates there was some problem obtaining a name for a topic id
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      TopicNameMappingException

      +
      public TopicNameMappingException(org.apache.kafka.common.protocol.Errors error)
      +
      +
    • +
    • +
      +

      TopicNameMappingException

      +
      public TopicNameMappingException(org.apache.kafka.common.protocol.Errors error, + String message)
      +
      +
    • +
    • +
      +

      TopicNameMappingException

      +
      public TopicNameMappingException(org.apache.kafka.common.protocol.Errors error, + String message, + Throwable cause)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getError

      +
      public org.apache.kafka.common.protocol.Errors getError()
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/class-use/TopLevelMetadataErrorException.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/class-use/TopLevelMetadataErrorException.html new file mode 100644 index 0000000..42fc2fc --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/class-use/TopLevelMetadataErrorException.html @@ -0,0 +1,62 @@ + + + + +Uses of Class io.kroxylicious.proxy.filter.metadata.TopLevelMetadataErrorException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.proxy.filter.metadata.TopLevelMetadataErrorException

+
+No usage of io.kroxylicious.proxy.filter.metadata.TopLevelMetadataErrorException
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/class-use/TopicLevelMetadataErrorException.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/class-use/TopicLevelMetadataErrorException.html new file mode 100644 index 0000000..bf5475f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/class-use/TopicLevelMetadataErrorException.html @@ -0,0 +1,62 @@ + + + + +Uses of Class io.kroxylicious.proxy.filter.metadata.TopicLevelMetadataErrorException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.proxy.filter.metadata.TopicLevelMetadataErrorException

+
+No usage of io.kroxylicious.proxy.filter.metadata.TopicLevelMetadataErrorException
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/class-use/TopicNameMapping.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/class-use/TopicNameMapping.html new file mode 100644 index 0000000..6e2db95 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/class-use/TopicNameMapping.html @@ -0,0 +1,109 @@ + + + + +Uses of Interface io.kroxylicious.proxy.filter.metadata.TopicNameMapping (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.filter.metadata.TopicNameMapping

+
+
Packages that use TopicNameMapping
+
+
Package
+
Description
+ +
+
The protocol filter API.
+
+ +
+
APIs for resolving topic IDs to topic names and handling metadata-related errors.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/class-use/TopicNameMappingException.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/class-use/TopicNameMappingException.html new file mode 100644 index 0000000..81adff9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/class-use/TopicNameMappingException.html @@ -0,0 +1,107 @@ + + + + +Uses of Class io.kroxylicious.proxy.filter.metadata.TopicNameMappingException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.proxy.filter.metadata.TopicNameMappingException

+
+
Packages that use TopicNameMappingException
+
+
Package
+
Description
+ +
+
APIs for resolving topic IDs to topic names and handling metadata-related errors.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/package-summary.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/package-summary.html new file mode 100644 index 0000000..56d8122 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/package-summary.html @@ -0,0 +1,138 @@ + + + + +io.kroxylicious.proxy.filter.metadata (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Package io.kroxylicious.proxy.filter.metadata

+
+
+
@ReturnValuesAreNonnullByDefault +@DefaultAnnotationForParameters(edu.umd.cs.findbugs.annotations.NonNull.class) +@DefaultAnnotation(edu.umd.cs.findbugs.annotations.NonNull.class) +package io.kroxylicious.proxy.filter.metadata
+
+

APIs for resolving topic IDs to topic names and handling metadata-related errors.

+

Filters that need to translate topic IDs (e.g., from Fetch requests) to topic names + can use TopicNameMapping to represent + the results of such resolution, including handling of partial failures.

+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/package-tree.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/package-tree.html new file mode 100644 index 0000000..d029ab3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/package-tree.html @@ -0,0 +1,99 @@ + + + + +io.kroxylicious.proxy.filter.metadata Class Hierarchy (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package io.kroxylicious.proxy.filter.metadata

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Interface Hierarchy

+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/package-use.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/package-use.html new file mode 100644 index 0000000..191d2c0 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/metadata/package-use.html @@ -0,0 +1,109 @@ + + + + +Uses of Package io.kroxylicious.proxy.filter.metadata (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
io.kroxylicious.proxy.filter.metadata

+
+ +
+
Package
+
Description
+ +
+
The protocol filter API.
+
+ +
+
APIs for resolving topic IDs to topic names and handling metadata-related errors.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/package-summary.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/package-summary.html new file mode 100644 index 0000000..8314824 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/package-summary.html @@ -0,0 +1,968 @@ + + + + +io.kroxylicious.proxy.filter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Package io.kroxylicious.proxy.filter

+
+
+
@ReturnValuesAreNonnullByDefault +@DefaultAnnotationForParameters(edu.umd.cs.findbugs.annotations.NonNull.class) +@DefaultAnnotation(edu.umd.cs.findbugs.annotations.NonNull.class) +package io.kroxylicious.proxy.filter
+
+

The protocol filter API.

+ +

An interface is provided for each kind of request and response in the Kafka protocol, e.g. ProduceRequestFilter. + Protocol Filter implementations inherit whichever of the per-RPC interfaces they need to intercept. + They can inherit multiple interfaces if necessary. + For filters which needs to intercept most or all of the protocol it is more convenient to inherit + RequestFilter and/or ResponseFilter.

+ +

Important facts about the Kafka protocol

+ +

Pipelining

+

The Kafka protocol supports pipelining (meaning a client can send multiple requests, + before getting a response for any of them). Therefore when writing a filter implementation + do not assume you won't see multiple requests before seeing any corresponding responses.

+ +

Ordering

+

A broker does not, in general, send responses in the same order as it receives requests. + Therefore when writing a filter implementation do not assume ordering.

+ +

Local view

+

A client may obtain information from one broker in a cluster and use it to interact with other + brokers in the cluster (or the same broker, but on a different connection, and therefore a different + channel and filter chain). A classic example would + be a producer or consumer making a metadata connection and Metadata request to a broker and + then connecting to a partition leader to producer/consume records (Produce and Fetch requests).

+ +

So although your filter + implementation might intercept both Metadata and Produce request/response + (for example), those requests will not pass through the same instance of your filter + implementation. Therefore it is incorrect, in general, to assume your filter has a global view of + the communication between the client and broker.

+ +

Implementing Filters

+ +

Filter Results

+

Filter implementation must return a CompletionStage containing a + FilterResult object. It is the job of FilterResult to convey what + message is to be forwarded to the next filter in the chain (or client/broker if at the chain's beginning + or end). It is also used to carry instructions such as indicating that the connection must be closed, + or a message dropped.

+

If the filter returns a CompletionStage that is already completed normally, Kroxylicious will immediately + perform the action described by the FilterResult.

+

If the CompletionStage completes exceptionally, the connection is closed. This also applies if the + CompletionStage does not complete within a timeout (20000 milliseconds).

+

Deferring Forwards

+

The filter may return a CompletionStage that is not yet completed. When this happens, Kroxylicious will pause + reading from the downstream (the Client writes will eventually block), and it begins to queue up in-flight + requests/responses arriving at the filter. This is done so that message order is maintained. Once the + CompletionStage completes, the action described by the FilterResult is performed, reading from the downstream + resumes and any queued up requests/responses are processed.

+

IMPORTANT: The pausing of reads from the downstream is a relatively costly operation. To maintain optimal performance + filter implementations should minimise the occasions on which an incomplete CompletionStage is returned.

+

Creating Filter Result objects

+

The FilterContext is the factory for the FilterResult objects.

+

There are two convenience methods that simply allow a filter to immediately forward a result:

+ +

To access richer features, use the filter result builders:

+ +

Thread Safety

+

+ The Filter API provides the following thread-safety guarantees: +

+
    +
  1. There is a single thread associated with each connection and this association lasts for the lifetime of connection..
  2. +
  3. Each filter instance is associated with exactly one connection.
  4. +
  5. Construction of the filter instance and dispatch of the filter methods onXxxRequest and + onXxxResponse takes place on that same thread.
  6. +
  7. Any computation stages chained to the CompletionStage returned by + FilterContext.sendRequest(org.apache.kafka.common.message.RequestHeaderData, org.apache.kafka.common.protocol.ApiMessage) + using the default execution methods (using methods without the suffix async) or default asynchronous execution + (using methods with suffix async that employ the stage's default asynchronous execution facility) + are guaranteed to be performed by that same thread. Computation stages chained using custom asynchronous + execution (using methods with suffix async that take an Executor argument) do not get this guarantee.
  8. +
+

Filter implementations are free to rely on these guarantees to safely maintain state within fields + of the Filter without employing additional synchronization.

+

If a Filter needs to do some asynchronous work and mutate members of the Filter, they can access + the thread for the connection via FilterFactoryContext.filterDispatchExecutor(), + which is available in FilterFactory.createFilter(FilterFactoryContext, java.lang.Object) + when it is creating an instance of a Filter. Ensure that any work executes quickly as this is the IO thread for potentially + many connections.

+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/package-tree.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/package-tree.html new file mode 100644 index 0000000..af77265 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/package-tree.html @@ -0,0 +1,287 @@ + + + + +io.kroxylicious.proxy.filter Class Hierarchy (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package io.kroxylicious.proxy.filter

+
+Package Hierarchies: + +
+

Interface Hierarchy

+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/package-use.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/package-use.html new file mode 100644 index 0000000..a932fd3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/filter/package-use.html @@ -0,0 +1,143 @@ + + + + +Uses of Package io.kroxylicious.proxy.filter (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
io.kroxylicious.proxy.filter

+
+ +
+
Package
+
Description
+ +
+
The protocol filter API.
+
+ +
+
Builder API for constructing filter results.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/DeprecatedPluginName.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/DeprecatedPluginName.html new file mode 100644 index 0000000..ef729f9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/DeprecatedPluginName.html @@ -0,0 +1,190 @@ + + + + +DeprecatedPluginName (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Annotation Interface DeprecatedPluginName

+
+
+
+
@Retention(RUNTIME) +@Target(TYPE) +public @interface DeprecatedPluginName
+

Annotates a @Plugin + implementation class whose + fully-qualified type name has been changed + and whose old name should no longer be used + to refer to it.

+ +

Plugin implementations should ideally have a single, + canonical name (the fully-qualified class name), so + this annotation is not intended to provide a general purpose + plugin aliasing facility. + Instead, it is provided as a way of "renaming a plugin" + while maintaining backwards compatibility with + configuration files that continue to use the old + implementation class name. + When a plugin implementation is instantiated using the old name + a warning will be logged prompting the + end user to update their configuration to use + the new name.

+ +

If a plugin implementation class itself is deprecated then + the @Deprecated + annotation should be used on that class instead.

+
+
+
    + +
  • +
    +

    Required Element Summary

    +
    Required Elements
    +
    +
    Modifier and Type
    +
    Required Element
    +
    Description
    + + +
    +
    The fully qualified class name by which this plugin was previously known.
    +
    +
    +
    +
  • + +
  • +
    +

    Optional Element Summary

    +
    Optional Elements
    +
    +
    Modifier and Type
    +
    Optional Element
    +
    Description
    + + +
    +
    Returns the version in which the name became deprecated.
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Element Details

    +
      +
    • +
      +

      oldName

      +
      String oldName
      +
      The fully qualified class name by which this plugin was previously known.
      +
      +
    • +
    • +
      +

      since

      +
      String since
      +
      Returns the version in which the name became deprecated.
      +
      +
      Default:
      +
      ""
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/Plugin.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/Plugin.html new file mode 100644 index 0000000..59f3dfd --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/Plugin.html @@ -0,0 +1,152 @@ + + + + +Plugin (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Annotation Interface Plugin

+
+
+
+
@Retention(RUNTIME) +@Target(TYPE) +public @interface Plugin
+
An annotation, on a plugin implementation class, that identifies the class of "config record" + consumed by that implementation. + Use @Plugin(configType=Void.class) if a plugin implementation class doesn't require configuration.
+
+
See Also:
+
+ +
+
+
+
+
    + +
  • +
    +

    Required Element Summary

    +
    Required Elements
    +
    +
    Modifier and Type
    +
    Required Element
    +
    Description
    + + +
     
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Element Details

    +
      +
    • +
      +

      configType

      +
      Class<?> configType
      +
      +
      Returns:
      +
      The type of configuration associated with the plugin implementation.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/PluginConfigurationException.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/PluginConfigurationException.html new file mode 100644 index 0000000..e307348 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/PluginConfigurationException.html @@ -0,0 +1,197 @@ + + + + +PluginConfigurationException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class PluginConfigurationException

+
+
java.lang.Object +
java.lang.Throwable +
java.lang.Exception +
java.lang.RuntimeException +
io.kroxylicious.proxy.plugin.PluginConfigurationException
+
+
+
+
+
+
+
All Implemented Interfaces:
+
Serializable
+
+
+
public class PluginConfigurationException +extends RuntimeException
+
Thrown when a plugin configuration is invalid
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      PluginConfigurationException

      +
      public PluginConfigurationException(String message)
      +
      Initializes a new instance
      +
      +
      Parameters:
      +
      message - message
      +
      +
      +
    • +
    • +
      +

      PluginConfigurationException

      +
      public PluginConfigurationException(String message, + Throwable cause)
      +
      Initializes a new instance
      +
      +
      Parameters:
      +
      message - message
      +
      cause - cause
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/PluginImplConfig.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/PluginImplConfig.html new file mode 100644 index 0000000..ebdcce3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/PluginImplConfig.html @@ -0,0 +1,152 @@ + + + + +PluginImplConfig (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Annotation Interface PluginImplConfig

+
+
+
+
@Target(PARAMETER) +@Retention(RUNTIME) +public @interface PluginImplConfig
+
An annotation that identifies a plugin instance name at a plugin point within the configuration. + This should be applied to the property of the class representing the plugin point, and should name the + corresponding @PluginImplName-annotated sibling property.
+
+
See Also:
+
+ +
+
+
+
+
    + +
  • +
    +

    Required Element Summary

    +
    Required Elements
    +
    +
    Modifier and Type
    +
    Required Element
    +
    Description
    + + +
     
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Element Details

    +
      +
    • +
      +

      implNameProperty

      +
      String implNameProperty
      +
      +
      Returns:
      +
      The name of the @PluginImplName-annotated sibling property.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/PluginImplName.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/PluginImplName.html new file mode 100644 index 0000000..0a56648 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/PluginImplName.html @@ -0,0 +1,153 @@ + + + + +PluginImplName (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Annotation Interface PluginImplName

+
+
+
+
@Retention(RUNTIME) +@Target(PARAMETER) +public @interface PluginImplName
+
Annotates a property (within a "config record") that names a plugin implementation with the plugin interface.
+
+
See Also:
+
+ +
+
+
+
+
    + +
  • +
    +

    Required Element Summary

    +
    Required Elements
    +
    +
    Modifier and Type
    +
    Required Element
    +
    Description
    + + +
    +
    The class reflecting the plugin interface (e.g.
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Element Details

    +
      +
    • +
      +

      value

      +
      Class<?> value
      +
      The class reflecting the plugin interface (e.g. FilterFactory).
      +
      +
      Returns:
      +
      The class reflecting the plugin interface
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/Plugins.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/Plugins.html new file mode 100644 index 0000000..36fc784 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/Plugins.html @@ -0,0 +1,165 @@ + + + + +Plugins (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class Plugins

+
+
java.lang.Object +
io.kroxylicious.proxy.plugin.Plugins
+
+
+
+
public class Plugins +extends Object
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      requireConfig

      +
      public static <C> C requireConfig(Object pluginImpl, + @Nullable + C config)
      +
      Checks that the given config is not null, throwing PluginConfigurationException if it is.
      +
      +
      Type Parameters:
      +
      C - The type of the config
      +
      Parameters:
      +
      pluginImpl - The plugin consuming the config
      +
      config - The possibly null config
      +
      Returns:
      +
      The non-null config
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/UnknownPluginInstanceException.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/UnknownPluginInstanceException.html new file mode 100644 index 0000000..d762686 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/UnknownPluginInstanceException.html @@ -0,0 +1,182 @@ + + + + +UnknownPluginInstanceException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Class UnknownPluginInstanceException

+
+
java.lang.Object +
java.lang.Throwable +
java.lang.Exception +
java.lang.RuntimeException +
io.kroxylicious.proxy.plugin.UnknownPluginInstanceException
+
+
+
+
+
+
+
All Implemented Interfaces:
+
Serializable
+
+
+
public class UnknownPluginInstanceException +extends RuntimeException
+
A reference to a plugin instance could not be resolved by the proxy runtime.
+
+
See Also:
+
+ +
+
+
+
+ +
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      UnknownPluginInstanceException

      +
      public UnknownPluginInstanceException(String message)
      +
      +
    • +
    • +
      +

      UnknownPluginInstanceException

      +
      public UnknownPluginInstanceException(String message, + Throwable cause)
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/DeprecatedPluginName.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/DeprecatedPluginName.html new file mode 100644 index 0000000..5d6b872 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/DeprecatedPluginName.html @@ -0,0 +1,62 @@ + + + + +Uses of Annotation Interface io.kroxylicious.proxy.plugin.DeprecatedPluginName (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Annotation Interface
io.kroxylicious.proxy.plugin.DeprecatedPluginName

+
+No usage of io.kroxylicious.proxy.plugin.DeprecatedPluginName
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/Plugin.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/Plugin.html new file mode 100644 index 0000000..b61ae39 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/Plugin.html @@ -0,0 +1,62 @@ + + + + +Uses of Annotation Interface io.kroxylicious.proxy.plugin.Plugin (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Annotation Interface
io.kroxylicious.proxy.plugin.Plugin

+
+No usage of io.kroxylicious.proxy.plugin.Plugin
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/PluginConfigurationException.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/PluginConfigurationException.html new file mode 100644 index 0000000..47a6644 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/PluginConfigurationException.html @@ -0,0 +1,92 @@ + + + + +Uses of Class io.kroxylicious.proxy.plugin.PluginConfigurationException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.proxy.plugin.PluginConfigurationException

+
+ +
+
Package
+
Description
+ +
+
The protocol filter API.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/PluginImplConfig.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/PluginImplConfig.html new file mode 100644 index 0000000..c717a08 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/PluginImplConfig.html @@ -0,0 +1,62 @@ + + + + +Uses of Annotation Interface io.kroxylicious.proxy.plugin.PluginImplConfig (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Annotation Interface
io.kroxylicious.proxy.plugin.PluginImplConfig

+
+No usage of io.kroxylicious.proxy.plugin.PluginImplConfig
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/PluginImplName.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/PluginImplName.html new file mode 100644 index 0000000..cabd2a8 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/PluginImplName.html @@ -0,0 +1,62 @@ + + + + +Uses of Annotation Interface io.kroxylicious.proxy.plugin.PluginImplName (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Annotation Interface
io.kroxylicious.proxy.plugin.PluginImplName

+
+No usage of io.kroxylicious.proxy.plugin.PluginImplName
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/Plugins.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/Plugins.html new file mode 100644 index 0000000..ec84de9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/Plugins.html @@ -0,0 +1,62 @@ + + + + +Uses of Class io.kroxylicious.proxy.plugin.Plugins (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.proxy.plugin.Plugins

+
+No usage of io.kroxylicious.proxy.plugin.Plugins
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/UnknownPluginInstanceException.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/UnknownPluginInstanceException.html new file mode 100644 index 0000000..751321e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/class-use/UnknownPluginInstanceException.html @@ -0,0 +1,62 @@ + + + + +Uses of Class io.kroxylicious.proxy.plugin.UnknownPluginInstanceException (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Class
io.kroxylicious.proxy.plugin.UnknownPluginInstanceException

+
+No usage of io.kroxylicious.proxy.plugin.UnknownPluginInstanceException
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/package-summary.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/package-summary.html new file mode 100644 index 0000000..cf4d86f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/package-summary.html @@ -0,0 +1,220 @@ + + + + +io.kroxylicious.proxy.plugin (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Package io.kroxylicious.proxy.plugin

+
+
+
@ReturnValuesAreNonnullByDefault +@DefaultAnnotationForParameters(edu.umd.cs.findbugs.annotations.NonNull.class) +@DefaultAnnotation(edu.umd.cs.findbugs.annotations.NonNull.class) +package io.kroxylicious.proxy.plugin
+
+
API for defining plugins within configuration. + +

Terminology

+

A plugin interface is a Java interface (or possibly a class) that can be used + in the implementation of a component of the proxy. + FilterFactory is one example of a plugin interface.

+ +

A plugin implementation provides a concrete behaviour by implementing the plugin interface + (or extending the class). + There will usually be more than one plugin implementation for a given plugin interface. + Plugin implementations can be referenced in a configuration file by their + fully qualified class name, or by their unqualified class name if that is unambiguous. + Such references are known as plugin implementation names. + Any class that implements FilterFactory is an example of a + plugin implementation. + +

Plugin implementations often require some configuration to be provided in the configuration. + The configuration is represented in Java using a "config record", or "config class". + Different plugin implementations will generally use different config records.

+ +

Using a plugin implementation

+ +

The author of a FooFilter that wants to use a HttpGetter to make an HTTP GET request, + but doesn't want to depend directly on any particular HTTP client. HttpGetter is the plugin interface.

+ +

+ interface HttpGetter<C> {
+     void configure(C config);
+     String get(String url);
+ }
+ 
+ +

Note that this plugin interface doesn't know the concrete type of the configuration that an implementation requires. + In this case it is using a type parameter C to represent that.

+ +

The config record for FooFilter would express its dependence on a HttpGetter, and also + provide a property to hold the HttpGetter implementation's own configuration, like this

+ +

+ record FooFilterConfig(
+   @PluginImplName(HttpGetter.class)
+   String httpGetterPluginImplName,
+   @PluginImplConfig(implNameProperty="httpGetterPluginImplName")
+   Object httpGetterConfig
+ ) { }
+ 
+ +

The PluginImplConfig.implNameProperty() names the property of the config object that holds the + plugin implementation name. In practice the author of FooFilter might want to chose config property names which are intuitive to someone + writing a configuration file, such as httpImpl and httpConfig.

+ +

The FooFilter author can then get an instance of the plugin implementation configured by the user using the + FilterFactoryContext, like this:

+

+ class FooFilterFactory implements FilterFactory<FooFilterConfig, Void> {
+     Void initialize(FilterFactoryContext context, FooFilterConfig config) {
+       // get the configured HttpGetter
+       this.httpGetter = context.pluginInstance(HttpGetter.class, config.httpGetterPluginImplName());
+       // initialize it
+       this.httpGetter.configure(config.httpGetterConfig());
+       return null;
+     }
+     Filter createFilter(FilterFactoryContext context, Void v) {
+         return new Filter() {
+           // use the httpGetter
+         };
+     }
+ }
+ 
+ +

Implementing a plugin

+ +

Someone can write an implementation of HttpGetter using Netty. They need to annotate their + implementation with @Plugin to indicate + the type of configuration it uses.

+ +

+ @Plugin(configType=NettyConfig.class)
+ class NettyHttpGetter implements HttpGetter<NettyConfig> {
+     // ...
+ }
+ 
+ +

and provide a record for that config:

+ +

+ record NettyConfig(String trustStore) { }
+ 
+
+
+
    +
  • +
    +
    +
    +
    +
    Class
    +
    Description
    + +
    +
    Annotates a @Plugin + implementation class whose + fully-qualified type name has been changed + and whose old name should no longer be used + to refer to it.
    +
    + +
    +
    An annotation, on a plugin implementation class, that identifies the class of "config record" + consumed by that implementation.
    +
    + +
    +
    Thrown when a plugin configuration is invalid
    +
    + +
    +
    An annotation that identifies a plugin instance name at a plugin point within the configuration.
    +
    + +
    +
    Annotates a property (within a "config record") that names a plugin implementation with the plugin interface.
    +
    + +
     
    + +
    +
    A reference to a plugin instance could not be resolved by the proxy runtime.
    +
    +
    +
    +
    +
  • +
+
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/package-tree.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/package-tree.html new file mode 100644 index 0000000..0f369fa --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/package-tree.html @@ -0,0 +1,99 @@ + + + + +io.kroxylicious.proxy.plugin Class Hierarchy (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package io.kroxylicious.proxy.plugin

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Annotation Interface Hierarchy

+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/package-use.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/package-use.html new file mode 100644 index 0000000..57bf7f3 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/plugin/package-use.html @@ -0,0 +1,88 @@ + + + + +Uses of Package io.kroxylicious.proxy.plugin (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
io.kroxylicious.proxy.plugin

+
+ +
+
Package
+
Description
+ +
+
The protocol filter API.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/ClientTlsContext.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/ClientTlsContext.html new file mode 100644 index 0000000..f29fa9e --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/ClientTlsContext.html @@ -0,0 +1,162 @@ + + + + +ClientTlsContext (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+ +
+ +

Interface ClientTlsContext

+
+
+
+
public interface ClientTlsContext
+
Exposes TLS information about the client-to-proxy connection to plugins, for example using FilterContext.clientTlsContext(). + This is implemented by the runtime for use by plugins.
+
+
+ +
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      proxyServerCertificate

      +
      X509Certificate proxyServerCertificate()
      +
      +
      Returns:
      +
      The TLS server certificate that the proxy presented to the client during TLS handshake.
      +
      +
      +
    • +
    • +
      +

      clientCertificate

      +
      Optional<X509Certificate> clientCertificate()
      +
      +
      Returns:
      +
      the client's certificate, or empty if no TLS client certificate was presented during TLS handshake.
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/class-use/ClientTlsContext.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/class-use/ClientTlsContext.html new file mode 100644 index 0000000..2b0105f --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/class-use/ClientTlsContext.html @@ -0,0 +1,110 @@ + + + + +Uses of Interface io.kroxylicious.proxy.tls.ClientTlsContext (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Interface
io.kroxylicious.proxy.tls.ClientTlsContext

+
+
Packages that use ClientTlsContext
+
+
Package
+
Description
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+ +
+
The protocol filter API.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/package-summary.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/package-summary.html new file mode 100644 index 0000000..86f71c9 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/package-summary.html @@ -0,0 +1,104 @@ + + + + +io.kroxylicious.proxy.tls (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Package io.kroxylicious.proxy.tls

+
+
+
@ReturnValuesAreNonnullByDefault +@DefaultAnnotationForParameters(edu.umd.cs.findbugs.annotations.NonNull.class) +@DefaultAnnotation(edu.umd.cs.findbugs.annotations.NonNull.class) +package io.kroxylicious.proxy.tls
+
+
APIs for plugins that are exposed to details of TLS connections between the proxy and its network peers.
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/package-tree.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/package-tree.html new file mode 100644 index 0000000..d34bf33 --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/package-tree.html @@ -0,0 +1,72 @@ + + + + +io.kroxylicious.proxy.tls Class Hierarchy (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package io.kroxylicious.proxy.tls

+
+Package Hierarchies: + +
+

Interface Hierarchy

+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/package-use.html b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/package-use.html new file mode 100644 index 0000000..831e60d --- /dev/null +++ b/documentation/0.20.0/javadoc/io/kroxylicious/proxy/tls/package-use.html @@ -0,0 +1,105 @@ + + + + +Uses of Package io.kroxylicious.proxy.tls (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Uses of Package
io.kroxylicious.proxy.tls

+
+
Packages that use io.kroxylicious.proxy.tls
+
+
Package
+
Description
+ +
+
APIs for plugins that provide or consume SASL authentication outcomes.
+
+ +
+
The protocol filter API.
+
+
+
+ +
+
+ +
+
+ + diff --git a/documentation/0.20.0/javadoc/legal/ADDITIONAL_LICENSE_INFO b/documentation/0.20.0/javadoc/legal/ADDITIONAL_LICENSE_INFO new file mode 100644 index 0000000..ff700cd --- /dev/null +++ b/documentation/0.20.0/javadoc/legal/ADDITIONAL_LICENSE_INFO @@ -0,0 +1,37 @@ + ADDITIONAL INFORMATION ABOUT LICENSING + +Certain files distributed by Oracle America, Inc. and/or its affiliates are +subject to the following clarification and special exception to the GPLv2, +based on the GNU Project exception for its Classpath libraries, known as the +GNU Classpath Exception. + +Note that Oracle includes multiple, independent programs in this software +package. Some of those programs are provided under licenses deemed +incompatible with the GPLv2 by the Free Software Foundation and others. +For example, the package includes programs licensed under the Apache +License, Version 2.0 and may include FreeType. Such programs are licensed +to you under their original licenses. + +Oracle facilitates your further distribution of this package by adding the +Classpath Exception to the necessary parts of its GPLv2 code, which permits +you to use that code in combination with other independent modules not +licensed under the GPLv2. However, note that this would not permit you to +commingle code under an incompatible license with Oracle's GPLv2 licensed +code by, for example, cutting and pasting such code into a file also +containing Oracle's GPLv2 licensed code and then distributing the result. + +Additionally, if you were to remove the Classpath Exception from any of the +files to which it applies and distribute the result, you would likely be +required to license some or all of the other code in that distribution under +the GPLv2 as well, and since the GPLv2 is incompatible with the license terms +of some items included in the distribution by Oracle, removing the Classpath +Exception could therefore effectively compromise your ability to further +distribute the package. + +Failing to distribute notices associated with some files may also create +unexpected legal consequences. + +Proceed with caution and we recommend that you obtain the advice of a lawyer +skilled in open source matters before removing the Classpath Exception or +making modifications to this package which may subsequently be redistributed +and/or involve the use of third party software. diff --git a/documentation/0.20.0/javadoc/legal/ASSEMBLY_EXCEPTION b/documentation/0.20.0/javadoc/legal/ASSEMBLY_EXCEPTION new file mode 100644 index 0000000..4296666 --- /dev/null +++ b/documentation/0.20.0/javadoc/legal/ASSEMBLY_EXCEPTION @@ -0,0 +1,27 @@ + +OPENJDK ASSEMBLY EXCEPTION + +The OpenJDK source code made available by Oracle America, Inc. (Oracle) at +openjdk.org ("OpenJDK Code") is distributed under the terms of the GNU +General Public License version 2 +only ("GPL2"), with the following clarification and special exception. + + Linking this OpenJDK Code statically or dynamically with other code + is making a combined work based on this library. Thus, the terms + and conditions of GPL2 cover the whole combination. + + As a special exception, Oracle gives you permission to link this + OpenJDK Code with certain code licensed by Oracle as indicated at + https://openjdk.org/legal/exception-modules-2007-05-08.html + ("Designated Exception Modules") to produce an executable, + regardless of the license terms of the Designated Exception Modules, + and to copy and distribute the resulting executable under GPL2, + provided that the Designated Exception Modules continue to be + governed by the licenses under which they were offered by Oracle. + +As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code +to build an executable that includes those portions of necessary code that +Oracle could not provide under GPL2 (or that Oracle has provided under GPL2 +with the Classpath exception). If you modify or add to the OpenJDK code, +that new GPL2 code may still be combined with Designated Exception Modules +if the new code is made subject to this exception by its copyright holder. diff --git a/documentation/0.20.0/javadoc/legal/LICENSE b/documentation/0.20.0/javadoc/legal/LICENSE new file mode 100644 index 0000000..8b400c7 --- /dev/null +++ b/documentation/0.20.0/javadoc/legal/LICENSE @@ -0,0 +1,347 @@ +The GNU General Public License (GPL) + +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to +most of the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for this service if you wish), +that you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you know you +can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny +you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for +a fee, you must give the recipients all the rights that you have. You must +make sure that they, too, receive or can get the source code. And you must +show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, distribute +and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced +by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We +wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program proprietary. +To prevent this, we have made it clear that any patent must be licensed for +everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms of +this General Public License. The "Program", below, refers to any such program +or work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or +translated into another language. (Hereinafter, translation is included +without limitation in the term "modification".) Each licensee is addressed as +"you". + +Activities other than copying, distribution and modification are not covered by +this License; they are outside its scope. The act of running the Program is +not restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made by +running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as +you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this License +and to the absence of any warranty; and give any other recipients of the +Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may +at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus +forming a work based on the Program, and copy and distribute such modifications +or work under the terms of Section 1 above, provided that you also meet all of +these conditions: + + a) You must cause the modified files to carry prominent notices stating + that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in whole or + in part contains or is derived from the Program or any part thereof, to be + licensed as a whole at no charge to all third parties under the terms of + this License. + + c) If the modified program normally reads commands interactively when run, + you must cause it, when started running for such interactive use in the + most ordinary way, to print or display an announcement including an + appropriate copyright notice and a notice that there is no warranty (or + else, saying that you provide a warranty) and that users may redistribute + the program under these conditions, and telling the user how to view a copy + of this License. (Exception: if the Program itself is interactive but does + not normally print such an announcement, your work based on the Program is + not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, and +its terms, do not apply to those sections when you distribute them as separate +works. But when you distribute the same sections as part of a whole which is a +work based on the Program, the distribution of the whole must be on the terms +of this License, whose permissions for other licensees extend to the entire +whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise the +right to control the distribution of derivative or collective works based on +the Program. + +In addition, mere aggregation of another work not based on the Program with the +Program (or with a work based on the Program) on a volume of a storage or +distribution medium does not bring the other work under the scope of this +License. + +3. You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 and +2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable source + code, which must be distributed under the terms of Sections 1 and 2 above + on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three years, to + give any third party, for a charge no more than your cost of physically + performing source distribution, a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed only + for noncommercial distribution and only if you received the program in + object code or executable form with such an offer, in accord with + Subsection b above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all +the source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and installation +of the executable. However, as a special exception, the source code +distributed need not include anything that is normally distributed (in either +source or binary form) with the major components (compiler, kernel, and so on) +of the operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the source +code from the same place counts as distribution of the source code, even though +third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, or +rights, from you under this License will not have their licenses terminated so +long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. +However, nothing else grants you permission to modify or distribute the Program +or its derivative works. These actions are prohibited by law if you do not +accept this License. Therefore, by modifying or distributing the Program (or +any work based on the Program), you indicate your acceptance of this License to +do so, and all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), +the recipient automatically receives a license from the original licensor to +copy, distribute or modify the Program subject to these terms and conditions. +You may not impose any further restrictions on the recipients' exercise of the +rights granted herein. You are not responsible for enforcing compliance by +third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), conditions +are imposed on you (whether by court order, agreement or otherwise) that +contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot distribute so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not distribute the Program at all. +For example, if a patent license would not permit royalty-free redistribution +of the Program by all those who receive copies directly or indirectly through +you, then the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and +the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or +other property right claims or to contest validity of any such claims; this +section has the sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license practices. Many +people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose that +choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original +copyright holder who places the Program under this License may add an explicit +geographical distribution limitation excluding those countries, so that +distribution is permitted only in or among countries not thus excluded. In +such case, this License incorporates the limitation as if written in the body +of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the +General Public License from time to time. Such new versions will be similar in +spirit to the present version, but may differ in detail to address new problems +or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any later +version", you have the option of following the terms and conditions either of +that version or of any later version published by the Free Software Foundation. +If the Program does not specify a version number of this License, you may +choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. +Our decision will be guided by the two goals of preserving the free status of +all derivatives of our free software and of promoting the sharing and reuse of +software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE +PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL +ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE +PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR +INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA +BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER +OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible +use to the public, the best way to achieve this is to make it free software +which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach +them to the start of each source file to most effectively convey the exclusion +of warranty; and each file should have at least the "copyright" line and a +pointer to where the full notice is found. + + One line to give the program's name and a brief idea of what it does. + + Copyright (C) + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when it +starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author Gnomovision comes + with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free + software, and you are welcome to redistribute it under certain conditions; + type 'show c' for details. + +The hypothetical commands 'show w' and 'show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may be +called something other than 'show w' and 'show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, +if any, to sign a "copyright disclaimer" for the program, if necessary. Here +is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + 'Gnomovision' (which makes passes at compilers) written by James Hacker. + + signature of Ty Coon, 1 April 1989 + + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General Public +License instead of this License. + + +"CLASSPATH" EXCEPTION TO THE GPL + +Certain source files distributed by Oracle America and/or its affiliates are +subject to the following clarification and special exception to the GPL, but +only where Oracle has expressly included in the particular source file's header +the words "Oracle designates this particular file as subject to the "Classpath" +exception as provided by Oracle in the LICENSE file that accompanied this code." + + Linking this library statically or dynamically with other modules is making + a combined work based on this library. Thus, the terms and conditions of + the GNU General Public License cover the whole combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules, + and to copy and distribute the resulting executable under terms of your + choice, provided that you also meet, for each linked independent module, + the terms and conditions of the license of that module. An independent + module is a module which is not derived from or based on this library. If + you modify this library, you may extend this exception to your version of + the library, but you are not obligated to do so. If you do not wish to do + so, delete this exception statement from your version. diff --git a/documentation/0.20.0/javadoc/legal/jquery.md b/documentation/0.20.0/javadoc/legal/jquery.md new file mode 100644 index 0000000..a763ec6 --- /dev/null +++ b/documentation/0.20.0/javadoc/legal/jquery.md @@ -0,0 +1,26 @@ +## jQuery v3.7.1 + +### jQuery License +``` +jQuery v 3.7.1 +Copyright OpenJS Foundation and other contributors, https://openjsf.org/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` diff --git a/documentation/0.20.0/javadoc/legal/jqueryUI.md b/documentation/0.20.0/javadoc/legal/jqueryUI.md new file mode 100644 index 0000000..46bfbaa --- /dev/null +++ b/documentation/0.20.0/javadoc/legal/jqueryUI.md @@ -0,0 +1,49 @@ +## jQuery UI v1.14.1 + +### jQuery UI License +``` +Copyright OpenJS Foundation and other contributors, https://openjsf.org/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/jquery-ui + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code contained within the demos directory. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. + +``` diff --git a/documentation/0.20.0/javadoc/link.svg b/documentation/0.20.0/javadoc/link.svg new file mode 100644 index 0000000..7ccc5ed --- /dev/null +++ b/documentation/0.20.0/javadoc/link.svg @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/documentation/0.20.0/javadoc/member-search-index.js b/documentation/0.20.0/javadoc/member-search-index.js new file mode 100644 index 0000000..fc3d3f3 --- /dev/null +++ b/documentation/0.20.0/javadoc/member-search-index.js @@ -0,0 +1 @@ +memberSearchIndex = [{"p":"io.kroxylicious.proxy.config.tls","c":"KeyPair","l":"accept(KeyProviderVisitor)","u":"accept(io.kroxylicious.proxy.config.tls.KeyProviderVisitor)"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyProvider","l":"accept(KeyProviderVisitor)","u":"accept(io.kroxylicious.proxy.config.tls.KeyProviderVisitor)"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyStore","l":"accept(KeyProviderVisitor)","u":"accept(io.kroxylicious.proxy.config.tls.KeyProviderVisitor)"},{"p":"io.kroxylicious.proxy.config.tls","c":"InsecureTls","l":"accept(TrustProviderVisitor)","u":"accept(io.kroxylicious.proxy.config.tls.TrustProviderVisitor)"},{"p":"io.kroxylicious.proxy.config.tls","c":"PlatformTrustProvider","l":"accept(TrustProviderVisitor)","u":"accept(io.kroxylicious.proxy.config.tls.TrustProviderVisitor)"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustProvider","l":"accept(TrustProviderVisitor)","u":"accept(io.kroxylicious.proxy.config.tls.TrustProviderVisitor)"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustStore","l":"accept(TrustProviderVisitor)","u":"accept(io.kroxylicious.proxy.config.tls.TrustProviderVisitor)"},{"p":"io.kroxylicious.authorizer.service","c":"Action","l":"Action(ResourceType, String)","u":"%3Cinit%3E(io.kroxylicious.authorizer.service.ResourceType,java.lang.String)"},{"p":"io.kroxylicious.proxy.filter.metadata","c":"TopicNameMapping","l":"allFailures()"},{"p":"io.kroxylicious.authorizer.service","c":"Decision","l":"ALLOW"},{"p":"io.kroxylicious.proxy.config.tls","c":"AllowDeny","l":"AllowDeny(List, Set)","u":"%3Cinit%3E(java.util.List,java.util.Set)"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizeResult","l":"allowed()"},{"p":"io.kroxylicious.proxy.config.tls","c":"AllowDeny","l":"allowed()"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizeResult","l":"allowed(ResourceType)","u":"allowed(io.kroxylicious.authorizer.service.ResourceType)"},{"p":"io.kroxylicious.proxy.authentication","c":"Subject","l":"allPrincipalsOfType(Class

)","u":"allPrincipalsOfType(java.lang.Class)"},{"p":"io.kroxylicious.proxy.authentication","c":"Subject","l":"anonymous()"},{"p":"io.kroxylicious.proxy.filter.metadata","c":"TopicNameMapping","l":"anyFailures()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"authenticatedSubject()"},{"p":"io.kroxylicious.proxy.authentication","c":"ClientSaslContext","l":"authorizationId()"},{"p":"io.kroxylicious.authorizer.service","c":"Authorizer","l":"authorize(Subject, List)","u":"authorize(io.kroxylicious.proxy.authentication.Subject,java.util.List)"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizeResult","l":"AuthorizeResult(Subject, List, List)","u":"%3Cinit%3E(io.kroxylicious.proxy.authentication.Subject,java.util.List,java.util.List)"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizerException","l":"AuthorizerException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizerException","l":"AuthorizerException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizerService","l":"build()"},{"p":"io.kroxylicious.proxy.authentication","c":"SaslSubjectBuilderService","l":"build()"},{"p":"io.kroxylicious.proxy.authentication","c":"TransportSubjectBuilderService","l":"build()"},{"p":"io.kroxylicious.proxy.filter.filterresultbuilder","c":"TerminalStage","l":"build()"},{"p":"io.kroxylicious.kms.service","c":"KmsService","l":"buildKms()"},{"p":"io.kroxylicious.proxy.authentication","c":"SaslSubjectBuilder","l":"buildSaslSubject(SaslSubjectBuilder.Context)","u":"buildSaslSubject(io.kroxylicious.proxy.authentication.SaslSubjectBuilder.Context)"},{"p":"io.kroxylicious.proxy.authentication","c":"TransportSubjectBuilder","l":"buildTransportSubject(TransportSubjectBuilder.Context)","u":"buildTransportSubject(io.kroxylicious.proxy.authentication.TransportSubjectBuilder.Context)"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyPair","l":"certificateFile()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"channelDescriptor()"},{"p":"io.kroxylicious.proxy.config.tls","c":"Tls","l":"cipherSuites()"},{"p":"io.kroxylicious.proxy.config.tls","c":"ServerOptions","l":"clientAuth()"},{"p":"io.kroxylicious.proxy.tls","c":"ClientTlsContext","l":"clientCertificate()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"clientSaslAuthenticationFailure(String, String, Exception)","u":"clientSaslAuthenticationFailure(java.lang.String,java.lang.String,java.lang.Exception)"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"clientSaslAuthenticationSuccess(String, String)","u":"clientSaslAuthenticationSuccess(java.lang.String,java.lang.String)"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"clientSaslAuthenticationSuccess(String, Subject)","u":"clientSaslAuthenticationSuccess(java.lang.String,io.kroxylicious.proxy.authentication.Subject)"},{"p":"io.kroxylicious.proxy.authentication","c":"SaslSubjectBuilder.Context","l":"clientSaslContext()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"clientSaslContext()"},{"p":"io.kroxylicious.proxy.authentication","c":"SaslSubjectBuilder.Context","l":"clientTlsContext()"},{"p":"io.kroxylicious.proxy.authentication","c":"TransportSubjectBuilder.Context","l":"clientTlsContext()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"clientTlsContext()"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizerService","l":"close()"},{"p":"io.kroxylicious.kms.service","c":"KmsService","l":"close()"},{"p":"io.kroxylicious.proxy.authentication","c":"SaslSubjectBuilderService","l":"close()"},{"p":"io.kroxylicious.proxy.authentication","c":"TransportSubjectBuilderService","l":"close()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterFactory","l":"close(I)"},{"p":"io.kroxylicious.proxy.filter","c":"FilterResult","l":"closeConnection()"},{"p":"io.kroxylicious.proxy.filter.filterresultbuilder","c":"TerminalStage","l":"completed()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterDispatchExecutor","l":"completeOnFilterDispatchThread(CompletionStage)","u":"completeOnFilterDispatchThread(java.util.concurrent.CompletionStage)"},{"p":"io.kroxylicious.proxy.plugin","c":"Plugin","l":"configType()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"createByteBufferOutputStream(int)"},{"p":"io.kroxylicious.proxy.filter","c":"FilterFactory","l":"createFilter(FilterFactoryContext, I)","u":"createFilter(io.kroxylicious.proxy.filter.FilterFactoryContext,I)"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizeResult","l":"decision(ResourceType, String)","u":"decision(io.kroxylicious.authorizer.service.ResourceType,java.lang.String)"},{"p":"io.kroxylicious.kms.service","c":"Kms","l":"decryptEdek(E)"},{"p":"io.kroxylicious.proxy.config.tls","c":"Tls","l":"definesKey()"},{"p":"io.kroxylicious.kms.service","c":"DekPair","l":"dek()"},{"p":"io.kroxylicious.kms.service","c":"DekPair","l":"DekPair(E, SecretKey)","u":"%3Cinit%3E(E,javax.crypto.SecretKey)"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizeResult","l":"denied()"},{"p":"io.kroxylicious.proxy.config.tls","c":"AllowDeny","l":"denied()"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizeResult","l":"denied(ResourceType)","u":"denied(io.kroxylicious.authorizer.service.ResourceType)"},{"p":"io.kroxylicious.authorizer.service","c":"Decision","l":"DENY"},{"p":"io.kroxylicious.kms.service","c":"Serde","l":"deserialize(ByteBuffer)","u":"deserialize(java.nio.ByteBuffer)"},{"p":"io.kroxylicious.kms.service","c":"DestroyableRawSecretKey","l":"destroy()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterResult","l":"drop()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterResultBuilder","l":"drop()"},{"p":"io.kroxylicious.kms.service","c":"DekPair","l":"edek()"},{"p":"io.kroxylicious.kms.service","c":"Kms","l":"edekSerde()"},{"p":"io.kroxylicious.proxy.filter.metadata","c":"TopicNameMapping","l":"EMPTY"},{"p":"io.kroxylicious.authorizer.service","c":"Action","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizeResult","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"io.kroxylicious.kms.service","c":"DekPair","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"io.kroxylicious.proxy.authentication","c":"Subject","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"io.kroxylicious.proxy.authentication","c":"User","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"io.kroxylicious.proxy.config.secret","c":"FilePassword","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"io.kroxylicious.proxy.config.secret","c":"InlinePassword","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"io.kroxylicious.proxy.config.tls","c":"AllowDeny","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"io.kroxylicious.proxy.config.tls","c":"InsecureTls","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyPair","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyStore","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"io.kroxylicious.proxy.config.tls","c":"ServerOptions","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"io.kroxylicious.proxy.config.tls","c":"Tls","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustStore","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"io.kroxylicious.proxy.filter","c":"RequestFilterResultBuilder","l":"errorResponse(RequestHeaderData, ApiMessage, ApiException)","u":"errorResponse(org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.protocol.ApiMessage,org.apache.kafka.common.errors.ApiException)"},{"p":"io.kroxylicious.proxy.filter.metadata","c":"TopicNameMapping","l":"failures()"},{"p":"io.kroxylicious.proxy.config.secret","c":"FilePassword","l":"FilePassword(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"io.kroxylicious.proxy.filter","c":"FilterFactoryContext","l":"filterDispatchExecutor()"},{"p":"io.kroxylicious.proxy.config.tls","c":"ServerOptions","l":"forClient()"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustOptions","l":"forClient()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterResultBuilder","l":"forward(H, ApiMessage)","u":"forward(H,org.apache.kafka.common.protocol.ApiMessage)"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"forwardRequest(RequestHeaderData, ApiMessage)","u":"forwardRequest(org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.protocol.ApiMessage)"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"forwardResponse(ResponseHeaderData, ApiMessage)","u":"forwardResponse(org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.protocol.ApiMessage)"},{"p":"io.kroxylicious.kms.service","c":"Kms","l":"generateDekPair(K)"},{"p":"io.kroxylicious.kms.service","c":"DestroyableRawSecretKey","l":"getAlgorithm()"},{"p":"io.kroxylicious.kms.service","c":"DestroyableRawSecretKey","l":"getEncoded()"},{"p":"io.kroxylicious.proxy.filter.metadata","c":"TopicNameMappingException","l":"getError()"},{"p":"io.kroxylicious.kms.service","c":"DestroyableRawSecretKey","l":"getFormat()"},{"p":"io.kroxylicious.proxy.config.secret","c":"FilePassword","l":"getProvidedPassword()"},{"p":"io.kroxylicious.proxy.config.secret","c":"InlinePassword","l":"getProvidedPassword()"},{"p":"io.kroxylicious.proxy.config.secret","c":"PasswordProvider","l":"getProvidedPassword()"},{"p":"io.kroxylicious.proxy.config.tls","c":"Tls","l":"getStoreTypeOrPlatformDefault(String)","u":"getStoreTypeOrPlatformDefault(java.lang.String)"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyStore","l":"getType()"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustStore","l":"getType()"},{"p":"io.kroxylicious.kms.service","c":"Serde","l":"getUnsignedByte(ByteBuffer)","u":"getUnsignedByte(java.nio.ByteBuffer)"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"getVirtualClusterName()"},{"p":"io.kroxylicious.authorizer.service","c":"Action","l":"hashCode()"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizeResult","l":"hashCode()"},{"p":"io.kroxylicious.kms.service","c":"DekPair","l":"hashCode()"},{"p":"io.kroxylicious.proxy.authentication","c":"Subject","l":"hashCode()"},{"p":"io.kroxylicious.proxy.authentication","c":"User","l":"hashCode()"},{"p":"io.kroxylicious.proxy.config.secret","c":"FilePassword","l":"hashCode()"},{"p":"io.kroxylicious.proxy.config.secret","c":"InlinePassword","l":"hashCode()"},{"p":"io.kroxylicious.proxy.config.tls","c":"AllowDeny","l":"hashCode()"},{"p":"io.kroxylicious.proxy.config.tls","c":"InsecureTls","l":"hashCode()"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyPair","l":"hashCode()"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyStore","l":"hashCode()"},{"p":"io.kroxylicious.proxy.config.tls","c":"ServerOptions","l":"hashCode()"},{"p":"io.kroxylicious.proxy.config.tls","c":"Tls","l":"hashCode()"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustStore","l":"hashCode()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterResult","l":"header()"},{"p":"io.kroxylicious.authorizer.service","c":"ResourceType","l":"implies()"},{"p":"io.kroxylicious.proxy.plugin","c":"PluginImplConfig","l":"implNameProperty()"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizerService","l":"initialize(C)"},{"p":"io.kroxylicious.kms.service","c":"KmsService","l":"initialize(C)"},{"p":"io.kroxylicious.proxy.authentication","c":"SaslSubjectBuilderService","l":"initialize(C)"},{"p":"io.kroxylicious.proxy.authentication","c":"TransportSubjectBuilderService","l":"initialize(C)"},{"p":"io.kroxylicious.proxy.filter","c":"FilterFactory","l":"initialize(FilterFactoryContext, C)","u":"initialize(io.kroxylicious.proxy.filter.FilterFactoryContext,C)"},{"p":"io.kroxylicious.proxy.config.secret","c":"InlinePassword","l":"InlinePassword(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"io.kroxylicious.proxy.config.tls","c":"InsecureTls","l":"insecure()"},{"p":"io.kroxylicious.proxy.config.tls","c":"InsecureTls","l":"InsecureTls(boolean)","u":"%3Cinit%3E(boolean)"},{"p":"io.kroxylicious.proxy.config.tls","c":"PlatformTrustProvider","l":"INSTANCE"},{"p":"io.kroxylicious.kms.service","c":"InvalidKeyUsageException","l":"InvalidKeyUsageException()","u":"%3Cinit%3E()"},{"p":"io.kroxylicious.proxy.authentication","c":"Subject","l":"isAnonymous()"},{"p":"io.kroxylicious.kms.service","c":"DestroyableRawSecretKey","l":"isDestroyed()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterDispatchExecutor","l":"isInFilterDispatchThread()"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyStore","l":"isPemType()"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustStore","l":"isPemType()"},{"p":"io.kroxylicious.proxy.config.tls","c":"Tls","l":"key()"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyPair","l":"KeyPair(String, String, PasswordProvider)","u":"%3Cinit%3E(java.lang.String,java.lang.String,io.kroxylicious.proxy.config.secret.PasswordProvider)"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyPair","l":"keyPasswordProvider()"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyStore","l":"keyPasswordProvider()"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyStore","l":"KeyStore(String, PasswordProvider, PasswordProvider, String)","u":"%3Cinit%3E(java.lang.String,io.kroxylicious.proxy.config.secret.PasswordProvider,io.kroxylicious.proxy.config.secret.PasswordProvider,java.lang.String)"},{"p":"io.kroxylicious.kms.service","c":"KmsException","l":"KmsException()","u":"%3Cinit%3E()"},{"p":"io.kroxylicious.kms.service","c":"KmsException","l":"KmsException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"io.kroxylicious.kms.service","c":"KmsException","l":"KmsException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"io.kroxylicious.kms.service","c":"KmsException","l":"KmsException(Throwable)","u":"%3Cinit%3E(java.lang.Throwable)"},{"p":"io.kroxylicious.proxy.authentication","c":"ClientSaslContext","l":"mechanismName()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterResult","l":"message()"},{"p":"io.kroxylicious.proxy.authentication","c":"Principal","l":"name()"},{"p":"io.kroxylicious.proxy.authentication","c":"User","l":"name()"},{"p":"io.kroxylicious.proxy.authentication","c":"PrincipalFactory","l":"newPrincipal(String)","u":"newPrincipal(java.lang.String)"},{"p":"io.kroxylicious.proxy.authentication","c":"UserFactory","l":"newPrincipal(String)","u":"newPrincipal(java.lang.String)"},{"p":"io.kroxylicious.proxy.config.tls","c":"TlsClientAuth","l":"NONE"},{"p":"io.kroxylicious.kms.service","c":"DestroyableRawSecretKey","l":"numKeyBits()"},{"p":"io.kroxylicious.proxy.plugin","c":"DeprecatedPluginName","l":"oldName()"},{"p":"io.kroxylicious.proxy.filter","c":"AddOffsetsToTxnRequestFilter","l":"onAddOffsetsToTxnRequest(short, RequestHeaderData, AddOffsetsToTxnRequestData, FilterContext)","u":"onAddOffsetsToTxnRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.AddOffsetsToTxnRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AddOffsetsToTxnResponseFilter","l":"onAddOffsetsToTxnResponse(short, ResponseHeaderData, AddOffsetsToTxnResponseData, FilterContext)","u":"onAddOffsetsToTxnResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.AddOffsetsToTxnResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AddPartitionsToTxnRequestFilter","l":"onAddPartitionsToTxnRequest(short, RequestHeaderData, AddPartitionsToTxnRequestData, FilterContext)","u":"onAddPartitionsToTxnRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.AddPartitionsToTxnRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AddPartitionsToTxnResponseFilter","l":"onAddPartitionsToTxnResponse(short, ResponseHeaderData, AddPartitionsToTxnResponseData, FilterContext)","u":"onAddPartitionsToTxnResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.AddPartitionsToTxnResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AddRaftVoterRequestFilter","l":"onAddRaftVoterRequest(short, RequestHeaderData, AddRaftVoterRequestData, FilterContext)","u":"onAddRaftVoterRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.AddRaftVoterRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AddRaftVoterResponseFilter","l":"onAddRaftVoterResponse(short, ResponseHeaderData, AddRaftVoterResponseData, FilterContext)","u":"onAddRaftVoterResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.AddRaftVoterResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AllocateProducerIdsRequestFilter","l":"onAllocateProducerIdsRequest(short, RequestHeaderData, AllocateProducerIdsRequestData, FilterContext)","u":"onAllocateProducerIdsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.AllocateProducerIdsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AllocateProducerIdsResponseFilter","l":"onAllocateProducerIdsResponse(short, ResponseHeaderData, AllocateProducerIdsResponseData, FilterContext)","u":"onAllocateProducerIdsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.AllocateProducerIdsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterClientQuotasRequestFilter","l":"onAlterClientQuotasRequest(short, RequestHeaderData, AlterClientQuotasRequestData, FilterContext)","u":"onAlterClientQuotasRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.AlterClientQuotasRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterClientQuotasResponseFilter","l":"onAlterClientQuotasResponse(short, ResponseHeaderData, AlterClientQuotasResponseData, FilterContext)","u":"onAlterClientQuotasResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.AlterClientQuotasResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterConfigsRequestFilter","l":"onAlterConfigsRequest(short, RequestHeaderData, AlterConfigsRequestData, FilterContext)","u":"onAlterConfigsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.AlterConfigsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterConfigsResponseFilter","l":"onAlterConfigsResponse(short, ResponseHeaderData, AlterConfigsResponseData, FilterContext)","u":"onAlterConfigsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.AlterConfigsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterPartitionReassignmentsRequestFilter","l":"onAlterPartitionReassignmentsRequest(short, RequestHeaderData, AlterPartitionReassignmentsRequestData, FilterContext)","u":"onAlterPartitionReassignmentsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.AlterPartitionReassignmentsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterPartitionReassignmentsResponseFilter","l":"onAlterPartitionReassignmentsResponse(short, ResponseHeaderData, AlterPartitionReassignmentsResponseData, FilterContext)","u":"onAlterPartitionReassignmentsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.AlterPartitionReassignmentsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterPartitionRequestFilter","l":"onAlterPartitionRequest(short, RequestHeaderData, AlterPartitionRequestData, FilterContext)","u":"onAlterPartitionRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.AlterPartitionRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterPartitionResponseFilter","l":"onAlterPartitionResponse(short, ResponseHeaderData, AlterPartitionResponseData, FilterContext)","u":"onAlterPartitionResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.AlterPartitionResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterReplicaLogDirsRequestFilter","l":"onAlterReplicaLogDirsRequest(short, RequestHeaderData, AlterReplicaLogDirsRequestData, FilterContext)","u":"onAlterReplicaLogDirsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.AlterReplicaLogDirsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterReplicaLogDirsResponseFilter","l":"onAlterReplicaLogDirsResponse(short, ResponseHeaderData, AlterReplicaLogDirsResponseData, FilterContext)","u":"onAlterReplicaLogDirsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.AlterReplicaLogDirsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterShareGroupOffsetsRequestFilter","l":"onAlterShareGroupOffsetsRequest(short, RequestHeaderData, AlterShareGroupOffsetsRequestData, FilterContext)","u":"onAlterShareGroupOffsetsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.AlterShareGroupOffsetsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterShareGroupOffsetsResponseFilter","l":"onAlterShareGroupOffsetsResponse(short, ResponseHeaderData, AlterShareGroupOffsetsResponseData, FilterContext)","u":"onAlterShareGroupOffsetsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.AlterShareGroupOffsetsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterUserScramCredentialsRequestFilter","l":"onAlterUserScramCredentialsRequest(short, RequestHeaderData, AlterUserScramCredentialsRequestData, FilterContext)","u":"onAlterUserScramCredentialsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.AlterUserScramCredentialsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterUserScramCredentialsResponseFilter","l":"onAlterUserScramCredentialsResponse(short, ResponseHeaderData, AlterUserScramCredentialsResponseData, FilterContext)","u":"onAlterUserScramCredentialsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.AlterUserScramCredentialsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ApiVersionsRequestFilter","l":"onApiVersionsRequest(short, RequestHeaderData, ApiVersionsRequestData, FilterContext)","u":"onApiVersionsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ApiVersionsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ApiVersionsResponseFilter","l":"onApiVersionsResponse(short, ResponseHeaderData, ApiVersionsResponseData, FilterContext)","u":"onApiVersionsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ApiVersionsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AssignReplicasToDirsRequestFilter","l":"onAssignReplicasToDirsRequest(short, RequestHeaderData, AssignReplicasToDirsRequestData, FilterContext)","u":"onAssignReplicasToDirsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.AssignReplicasToDirsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"AssignReplicasToDirsResponseFilter","l":"onAssignReplicasToDirsResponse(short, ResponseHeaderData, AssignReplicasToDirsResponseData, FilterContext)","u":"onAssignReplicasToDirsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.AssignReplicasToDirsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"BeginQuorumEpochRequestFilter","l":"onBeginQuorumEpochRequest(short, RequestHeaderData, BeginQuorumEpochRequestData, FilterContext)","u":"onBeginQuorumEpochRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.BeginQuorumEpochRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"BeginQuorumEpochResponseFilter","l":"onBeginQuorumEpochResponse(short, ResponseHeaderData, BeginQuorumEpochResponseData, FilterContext)","u":"onBeginQuorumEpochResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.BeginQuorumEpochResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"BrokerHeartbeatRequestFilter","l":"onBrokerHeartbeatRequest(short, RequestHeaderData, BrokerHeartbeatRequestData, FilterContext)","u":"onBrokerHeartbeatRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.BrokerHeartbeatRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"BrokerHeartbeatResponseFilter","l":"onBrokerHeartbeatResponse(short, ResponseHeaderData, BrokerHeartbeatResponseData, FilterContext)","u":"onBrokerHeartbeatResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.BrokerHeartbeatResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"BrokerRegistrationRequestFilter","l":"onBrokerRegistrationRequest(short, RequestHeaderData, BrokerRegistrationRequestData, FilterContext)","u":"onBrokerRegistrationRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.BrokerRegistrationRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"BrokerRegistrationResponseFilter","l":"onBrokerRegistrationResponse(short, ResponseHeaderData, BrokerRegistrationResponseData, FilterContext)","u":"onBrokerRegistrationResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.BrokerRegistrationResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ConsumerGroupDescribeRequestFilter","l":"onConsumerGroupDescribeRequest(short, RequestHeaderData, ConsumerGroupDescribeRequestData, FilterContext)","u":"onConsumerGroupDescribeRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ConsumerGroupDescribeRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ConsumerGroupDescribeResponseFilter","l":"onConsumerGroupDescribeResponse(short, ResponseHeaderData, ConsumerGroupDescribeResponseData, FilterContext)","u":"onConsumerGroupDescribeResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ConsumerGroupDescribeResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ConsumerGroupHeartbeatRequestFilter","l":"onConsumerGroupHeartbeatRequest(short, RequestHeaderData, ConsumerGroupHeartbeatRequestData, FilterContext)","u":"onConsumerGroupHeartbeatRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ConsumerGroupHeartbeatRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ConsumerGroupHeartbeatResponseFilter","l":"onConsumerGroupHeartbeatResponse(short, ResponseHeaderData, ConsumerGroupHeartbeatResponseData, FilterContext)","u":"onConsumerGroupHeartbeatResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ConsumerGroupHeartbeatResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ControllerRegistrationRequestFilter","l":"onControllerRegistrationRequest(short, RequestHeaderData, ControllerRegistrationRequestData, FilterContext)","u":"onControllerRegistrationRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ControllerRegistrationRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ControllerRegistrationResponseFilter","l":"onControllerRegistrationResponse(short, ResponseHeaderData, ControllerRegistrationResponseData, FilterContext)","u":"onControllerRegistrationResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ControllerRegistrationResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"CreateAclsRequestFilter","l":"onCreateAclsRequest(short, RequestHeaderData, CreateAclsRequestData, FilterContext)","u":"onCreateAclsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.CreateAclsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"CreateAclsResponseFilter","l":"onCreateAclsResponse(short, ResponseHeaderData, CreateAclsResponseData, FilterContext)","u":"onCreateAclsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.CreateAclsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"CreateDelegationTokenRequestFilter","l":"onCreateDelegationTokenRequest(short, RequestHeaderData, CreateDelegationTokenRequestData, FilterContext)","u":"onCreateDelegationTokenRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.CreateDelegationTokenRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"CreateDelegationTokenResponseFilter","l":"onCreateDelegationTokenResponse(short, ResponseHeaderData, CreateDelegationTokenResponseData, FilterContext)","u":"onCreateDelegationTokenResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.CreateDelegationTokenResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"CreatePartitionsRequestFilter","l":"onCreatePartitionsRequest(short, RequestHeaderData, CreatePartitionsRequestData, FilterContext)","u":"onCreatePartitionsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.CreatePartitionsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"CreatePartitionsResponseFilter","l":"onCreatePartitionsResponse(short, ResponseHeaderData, CreatePartitionsResponseData, FilterContext)","u":"onCreatePartitionsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.CreatePartitionsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"CreateTopicsRequestFilter","l":"onCreateTopicsRequest(short, RequestHeaderData, CreateTopicsRequestData, FilterContext)","u":"onCreateTopicsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.CreateTopicsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"CreateTopicsResponseFilter","l":"onCreateTopicsResponse(short, ResponseHeaderData, CreateTopicsResponseData, FilterContext)","u":"onCreateTopicsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.CreateTopicsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteAclsRequestFilter","l":"onDeleteAclsRequest(short, RequestHeaderData, DeleteAclsRequestData, FilterContext)","u":"onDeleteAclsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DeleteAclsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteAclsResponseFilter","l":"onDeleteAclsResponse(short, ResponseHeaderData, DeleteAclsResponseData, FilterContext)","u":"onDeleteAclsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DeleteAclsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteGroupsRequestFilter","l":"onDeleteGroupsRequest(short, RequestHeaderData, DeleteGroupsRequestData, FilterContext)","u":"onDeleteGroupsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DeleteGroupsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteGroupsResponseFilter","l":"onDeleteGroupsResponse(short, ResponseHeaderData, DeleteGroupsResponseData, FilterContext)","u":"onDeleteGroupsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DeleteGroupsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteRecordsRequestFilter","l":"onDeleteRecordsRequest(short, RequestHeaderData, DeleteRecordsRequestData, FilterContext)","u":"onDeleteRecordsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DeleteRecordsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteRecordsResponseFilter","l":"onDeleteRecordsResponse(short, ResponseHeaderData, DeleteRecordsResponseData, FilterContext)","u":"onDeleteRecordsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DeleteRecordsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteShareGroupOffsetsRequestFilter","l":"onDeleteShareGroupOffsetsRequest(short, RequestHeaderData, DeleteShareGroupOffsetsRequestData, FilterContext)","u":"onDeleteShareGroupOffsetsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DeleteShareGroupOffsetsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteShareGroupOffsetsResponseFilter","l":"onDeleteShareGroupOffsetsResponse(short, ResponseHeaderData, DeleteShareGroupOffsetsResponseData, FilterContext)","u":"onDeleteShareGroupOffsetsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DeleteShareGroupOffsetsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteShareGroupStateRequestFilter","l":"onDeleteShareGroupStateRequest(short, RequestHeaderData, DeleteShareGroupStateRequestData, FilterContext)","u":"onDeleteShareGroupStateRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DeleteShareGroupStateRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteShareGroupStateResponseFilter","l":"onDeleteShareGroupStateResponse(short, ResponseHeaderData, DeleteShareGroupStateResponseData, FilterContext)","u":"onDeleteShareGroupStateResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DeleteShareGroupStateResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteTopicsRequestFilter","l":"onDeleteTopicsRequest(short, RequestHeaderData, DeleteTopicsRequestData, FilterContext)","u":"onDeleteTopicsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DeleteTopicsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteTopicsResponseFilter","l":"onDeleteTopicsResponse(short, ResponseHeaderData, DeleteTopicsResponseData, FilterContext)","u":"onDeleteTopicsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DeleteTopicsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeAclsRequestFilter","l":"onDescribeAclsRequest(short, RequestHeaderData, DescribeAclsRequestData, FilterContext)","u":"onDescribeAclsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DescribeAclsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeAclsResponseFilter","l":"onDescribeAclsResponse(short, ResponseHeaderData, DescribeAclsResponseData, FilterContext)","u":"onDescribeAclsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DescribeAclsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeClientQuotasRequestFilter","l":"onDescribeClientQuotasRequest(short, RequestHeaderData, DescribeClientQuotasRequestData, FilterContext)","u":"onDescribeClientQuotasRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DescribeClientQuotasRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeClientQuotasResponseFilter","l":"onDescribeClientQuotasResponse(short, ResponseHeaderData, DescribeClientQuotasResponseData, FilterContext)","u":"onDescribeClientQuotasResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DescribeClientQuotasResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeClusterRequestFilter","l":"onDescribeClusterRequest(short, RequestHeaderData, DescribeClusterRequestData, FilterContext)","u":"onDescribeClusterRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DescribeClusterRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeClusterResponseFilter","l":"onDescribeClusterResponse(short, ResponseHeaderData, DescribeClusterResponseData, FilterContext)","u":"onDescribeClusterResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DescribeClusterResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeConfigsRequestFilter","l":"onDescribeConfigsRequest(short, RequestHeaderData, DescribeConfigsRequestData, FilterContext)","u":"onDescribeConfigsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DescribeConfigsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeConfigsResponseFilter","l":"onDescribeConfigsResponse(short, ResponseHeaderData, DescribeConfigsResponseData, FilterContext)","u":"onDescribeConfigsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DescribeConfigsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeDelegationTokenRequestFilter","l":"onDescribeDelegationTokenRequest(short, RequestHeaderData, DescribeDelegationTokenRequestData, FilterContext)","u":"onDescribeDelegationTokenRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DescribeDelegationTokenRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeDelegationTokenResponseFilter","l":"onDescribeDelegationTokenResponse(short, ResponseHeaderData, DescribeDelegationTokenResponseData, FilterContext)","u":"onDescribeDelegationTokenResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DescribeDelegationTokenResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeGroupsRequestFilter","l":"onDescribeGroupsRequest(short, RequestHeaderData, DescribeGroupsRequestData, FilterContext)","u":"onDescribeGroupsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DescribeGroupsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeGroupsResponseFilter","l":"onDescribeGroupsResponse(short, ResponseHeaderData, DescribeGroupsResponseData, FilterContext)","u":"onDescribeGroupsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DescribeGroupsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeLogDirsRequestFilter","l":"onDescribeLogDirsRequest(short, RequestHeaderData, DescribeLogDirsRequestData, FilterContext)","u":"onDescribeLogDirsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DescribeLogDirsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeLogDirsResponseFilter","l":"onDescribeLogDirsResponse(short, ResponseHeaderData, DescribeLogDirsResponseData, FilterContext)","u":"onDescribeLogDirsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DescribeLogDirsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeProducersRequestFilter","l":"onDescribeProducersRequest(short, RequestHeaderData, DescribeProducersRequestData, FilterContext)","u":"onDescribeProducersRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DescribeProducersRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeProducersResponseFilter","l":"onDescribeProducersResponse(short, ResponseHeaderData, DescribeProducersResponseData, FilterContext)","u":"onDescribeProducersResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DescribeProducersResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeQuorumRequestFilter","l":"onDescribeQuorumRequest(short, RequestHeaderData, DescribeQuorumRequestData, FilterContext)","u":"onDescribeQuorumRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DescribeQuorumRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeQuorumResponseFilter","l":"onDescribeQuorumResponse(short, ResponseHeaderData, DescribeQuorumResponseData, FilterContext)","u":"onDescribeQuorumResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DescribeQuorumResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeShareGroupOffsetsRequestFilter","l":"onDescribeShareGroupOffsetsRequest(short, RequestHeaderData, DescribeShareGroupOffsetsRequestData, FilterContext)","u":"onDescribeShareGroupOffsetsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DescribeShareGroupOffsetsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeShareGroupOffsetsResponseFilter","l":"onDescribeShareGroupOffsetsResponse(short, ResponseHeaderData, DescribeShareGroupOffsetsResponseData, FilterContext)","u":"onDescribeShareGroupOffsetsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DescribeShareGroupOffsetsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeTopicPartitionsRequestFilter","l":"onDescribeTopicPartitionsRequest(short, RequestHeaderData, DescribeTopicPartitionsRequestData, FilterContext)","u":"onDescribeTopicPartitionsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DescribeTopicPartitionsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeTopicPartitionsResponseFilter","l":"onDescribeTopicPartitionsResponse(short, ResponseHeaderData, DescribeTopicPartitionsResponseData, FilterContext)","u":"onDescribeTopicPartitionsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DescribeTopicPartitionsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeTransactionsRequestFilter","l":"onDescribeTransactionsRequest(short, RequestHeaderData, DescribeTransactionsRequestData, FilterContext)","u":"onDescribeTransactionsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DescribeTransactionsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeTransactionsResponseFilter","l":"onDescribeTransactionsResponse(short, ResponseHeaderData, DescribeTransactionsResponseData, FilterContext)","u":"onDescribeTransactionsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DescribeTransactionsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeUserScramCredentialsRequestFilter","l":"onDescribeUserScramCredentialsRequest(short, RequestHeaderData, DescribeUserScramCredentialsRequestData, FilterContext)","u":"onDescribeUserScramCredentialsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.DescribeUserScramCredentialsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeUserScramCredentialsResponseFilter","l":"onDescribeUserScramCredentialsResponse(short, ResponseHeaderData, DescribeUserScramCredentialsResponseData, FilterContext)","u":"onDescribeUserScramCredentialsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.DescribeUserScramCredentialsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ElectLeadersRequestFilter","l":"onElectLeadersRequest(short, RequestHeaderData, ElectLeadersRequestData, FilterContext)","u":"onElectLeadersRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ElectLeadersRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ElectLeadersResponseFilter","l":"onElectLeadersResponse(short, ResponseHeaderData, ElectLeadersResponseData, FilterContext)","u":"onElectLeadersResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ElectLeadersResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"EndQuorumEpochRequestFilter","l":"onEndQuorumEpochRequest(short, RequestHeaderData, EndQuorumEpochRequestData, FilterContext)","u":"onEndQuorumEpochRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.EndQuorumEpochRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"EndQuorumEpochResponseFilter","l":"onEndQuorumEpochResponse(short, ResponseHeaderData, EndQuorumEpochResponseData, FilterContext)","u":"onEndQuorumEpochResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.EndQuorumEpochResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"EndTxnRequestFilter","l":"onEndTxnRequest(short, RequestHeaderData, EndTxnRequestData, FilterContext)","u":"onEndTxnRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.EndTxnRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"EndTxnResponseFilter","l":"onEndTxnResponse(short, ResponseHeaderData, EndTxnResponseData, FilterContext)","u":"onEndTxnResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.EndTxnResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"EnvelopeRequestFilter","l":"onEnvelopeRequest(short, RequestHeaderData, EnvelopeRequestData, FilterContext)","u":"onEnvelopeRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.EnvelopeRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"EnvelopeResponseFilter","l":"onEnvelopeResponse(short, ResponseHeaderData, EnvelopeResponseData, FilterContext)","u":"onEnvelopeResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.EnvelopeResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ExpireDelegationTokenRequestFilter","l":"onExpireDelegationTokenRequest(short, RequestHeaderData, ExpireDelegationTokenRequestData, FilterContext)","u":"onExpireDelegationTokenRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ExpireDelegationTokenRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ExpireDelegationTokenResponseFilter","l":"onExpireDelegationTokenResponse(short, ResponseHeaderData, ExpireDelegationTokenResponseData, FilterContext)","u":"onExpireDelegationTokenResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ExpireDelegationTokenResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"FetchRequestFilter","l":"onFetchRequest(short, RequestHeaderData, FetchRequestData, FilterContext)","u":"onFetchRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.FetchRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"FetchResponseFilter","l":"onFetchResponse(short, ResponseHeaderData, FetchResponseData, FilterContext)","u":"onFetchResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.FetchResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"FetchSnapshotRequestFilter","l":"onFetchSnapshotRequest(short, RequestHeaderData, FetchSnapshotRequestData, FilterContext)","u":"onFetchSnapshotRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.FetchSnapshotRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"FetchSnapshotResponseFilter","l":"onFetchSnapshotResponse(short, ResponseHeaderData, FetchSnapshotResponseData, FilterContext)","u":"onFetchSnapshotResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.FetchSnapshotResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"FindCoordinatorRequestFilter","l":"onFindCoordinatorRequest(short, RequestHeaderData, FindCoordinatorRequestData, FilterContext)","u":"onFindCoordinatorRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.FindCoordinatorRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"FindCoordinatorResponseFilter","l":"onFindCoordinatorResponse(short, ResponseHeaderData, FindCoordinatorResponseData, FilterContext)","u":"onFindCoordinatorResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.FindCoordinatorResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"GetTelemetrySubscriptionsRequestFilter","l":"onGetTelemetrySubscriptionsRequest(short, RequestHeaderData, GetTelemetrySubscriptionsRequestData, FilterContext)","u":"onGetTelemetrySubscriptionsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.GetTelemetrySubscriptionsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"GetTelemetrySubscriptionsResponseFilter","l":"onGetTelemetrySubscriptionsResponse(short, ResponseHeaderData, GetTelemetrySubscriptionsResponseData, FilterContext)","u":"onGetTelemetrySubscriptionsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.GetTelemetrySubscriptionsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"HeartbeatRequestFilter","l":"onHeartbeatRequest(short, RequestHeaderData, HeartbeatRequestData, FilterContext)","u":"onHeartbeatRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.HeartbeatRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"HeartbeatResponseFilter","l":"onHeartbeatResponse(short, ResponseHeaderData, HeartbeatResponseData, FilterContext)","u":"onHeartbeatResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.HeartbeatResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"IncrementalAlterConfigsRequestFilter","l":"onIncrementalAlterConfigsRequest(short, RequestHeaderData, IncrementalAlterConfigsRequestData, FilterContext)","u":"onIncrementalAlterConfigsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.IncrementalAlterConfigsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"IncrementalAlterConfigsResponseFilter","l":"onIncrementalAlterConfigsResponse(short, ResponseHeaderData, IncrementalAlterConfigsResponseData, FilterContext)","u":"onIncrementalAlterConfigsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.IncrementalAlterConfigsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"InitializeShareGroupStateRequestFilter","l":"onInitializeShareGroupStateRequest(short, RequestHeaderData, InitializeShareGroupStateRequestData, FilterContext)","u":"onInitializeShareGroupStateRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.InitializeShareGroupStateRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"InitializeShareGroupStateResponseFilter","l":"onInitializeShareGroupStateResponse(short, ResponseHeaderData, InitializeShareGroupStateResponseData, FilterContext)","u":"onInitializeShareGroupStateResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.InitializeShareGroupStateResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"InitProducerIdRequestFilter","l":"onInitProducerIdRequest(short, RequestHeaderData, InitProducerIdRequestData, FilterContext)","u":"onInitProducerIdRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.InitProducerIdRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"InitProducerIdResponseFilter","l":"onInitProducerIdResponse(short, ResponseHeaderData, InitProducerIdResponseData, FilterContext)","u":"onInitProducerIdResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.InitProducerIdResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"JoinGroupRequestFilter","l":"onJoinGroupRequest(short, RequestHeaderData, JoinGroupRequestData, FilterContext)","u":"onJoinGroupRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.JoinGroupRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"JoinGroupResponseFilter","l":"onJoinGroupResponse(short, ResponseHeaderData, JoinGroupResponseData, FilterContext)","u":"onJoinGroupResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.JoinGroupResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"LeaveGroupRequestFilter","l":"onLeaveGroupRequest(short, RequestHeaderData, LeaveGroupRequestData, FilterContext)","u":"onLeaveGroupRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.LeaveGroupRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"LeaveGroupResponseFilter","l":"onLeaveGroupResponse(short, ResponseHeaderData, LeaveGroupResponseData, FilterContext)","u":"onLeaveGroupResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.LeaveGroupResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ListConfigResourcesRequestFilter","l":"onListConfigResourcesRequest(short, RequestHeaderData, ListConfigResourcesRequestData, FilterContext)","u":"onListConfigResourcesRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ListConfigResourcesRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ListConfigResourcesResponseFilter","l":"onListConfigResourcesResponse(short, ResponseHeaderData, ListConfigResourcesResponseData, FilterContext)","u":"onListConfigResourcesResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ListConfigResourcesResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ListGroupsRequestFilter","l":"onListGroupsRequest(short, RequestHeaderData, ListGroupsRequestData, FilterContext)","u":"onListGroupsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ListGroupsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ListGroupsResponseFilter","l":"onListGroupsResponse(short, ResponseHeaderData, ListGroupsResponseData, FilterContext)","u":"onListGroupsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ListGroupsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ListOffsetsRequestFilter","l":"onListOffsetsRequest(short, RequestHeaderData, ListOffsetsRequestData, FilterContext)","u":"onListOffsetsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ListOffsetsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ListOffsetsResponseFilter","l":"onListOffsetsResponse(short, ResponseHeaderData, ListOffsetsResponseData, FilterContext)","u":"onListOffsetsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ListOffsetsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ListPartitionReassignmentsRequestFilter","l":"onListPartitionReassignmentsRequest(short, RequestHeaderData, ListPartitionReassignmentsRequestData, FilterContext)","u":"onListPartitionReassignmentsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ListPartitionReassignmentsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ListPartitionReassignmentsResponseFilter","l":"onListPartitionReassignmentsResponse(short, ResponseHeaderData, ListPartitionReassignmentsResponseData, FilterContext)","u":"onListPartitionReassignmentsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ListPartitionReassignmentsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ListTransactionsRequestFilter","l":"onListTransactionsRequest(short, RequestHeaderData, ListTransactionsRequestData, FilterContext)","u":"onListTransactionsRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ListTransactionsRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ListTransactionsResponseFilter","l":"onListTransactionsResponse(short, ResponseHeaderData, ListTransactionsResponseData, FilterContext)","u":"onListTransactionsResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ListTransactionsResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"MetadataRequestFilter","l":"onMetadataRequest(short, RequestHeaderData, MetadataRequestData, FilterContext)","u":"onMetadataRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.MetadataRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"MetadataResponseFilter","l":"onMetadataResponse(short, ResponseHeaderData, MetadataResponseData, FilterContext)","u":"onMetadataResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.MetadataResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetCommitRequestFilter","l":"onOffsetCommitRequest(short, RequestHeaderData, OffsetCommitRequestData, FilterContext)","u":"onOffsetCommitRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.OffsetCommitRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetCommitResponseFilter","l":"onOffsetCommitResponse(short, ResponseHeaderData, OffsetCommitResponseData, FilterContext)","u":"onOffsetCommitResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.OffsetCommitResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetDeleteRequestFilter","l":"onOffsetDeleteRequest(short, RequestHeaderData, OffsetDeleteRequestData, FilterContext)","u":"onOffsetDeleteRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.OffsetDeleteRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetDeleteResponseFilter","l":"onOffsetDeleteResponse(short, ResponseHeaderData, OffsetDeleteResponseData, FilterContext)","u":"onOffsetDeleteResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.OffsetDeleteResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetFetchRequestFilter","l":"onOffsetFetchRequest(short, RequestHeaderData, OffsetFetchRequestData, FilterContext)","u":"onOffsetFetchRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.OffsetFetchRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetFetchResponseFilter","l":"onOffsetFetchResponse(short, ResponseHeaderData, OffsetFetchResponseData, FilterContext)","u":"onOffsetFetchResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.OffsetFetchResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetForLeaderEpochRequestFilter","l":"onOffsetForLeaderEpochRequest(short, RequestHeaderData, OffsetForLeaderEpochRequestData, FilterContext)","u":"onOffsetForLeaderEpochRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.OffsetForLeaderEpochRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetForLeaderEpochResponseFilter","l":"onOffsetForLeaderEpochResponse(short, ResponseHeaderData, OffsetForLeaderEpochResponseData, FilterContext)","u":"onOffsetForLeaderEpochResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.OffsetForLeaderEpochResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ProduceRequestFilter","l":"onProduceRequest(short, RequestHeaderData, ProduceRequestData, FilterContext)","u":"onProduceRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ProduceRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ProduceResponseFilter","l":"onProduceResponse(short, ResponseHeaderData, ProduceResponseData, FilterContext)","u":"onProduceResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ProduceResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"PushTelemetryRequestFilter","l":"onPushTelemetryRequest(short, RequestHeaderData, PushTelemetryRequestData, FilterContext)","u":"onPushTelemetryRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.PushTelemetryRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"PushTelemetryResponseFilter","l":"onPushTelemetryResponse(short, ResponseHeaderData, PushTelemetryResponseData, FilterContext)","u":"onPushTelemetryResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.PushTelemetryResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ReadShareGroupStateRequestFilter","l":"onReadShareGroupStateRequest(short, RequestHeaderData, ReadShareGroupStateRequestData, FilterContext)","u":"onReadShareGroupStateRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ReadShareGroupStateRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ReadShareGroupStateResponseFilter","l":"onReadShareGroupStateResponse(short, ResponseHeaderData, ReadShareGroupStateResponseData, FilterContext)","u":"onReadShareGroupStateResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ReadShareGroupStateResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ReadShareGroupStateSummaryRequestFilter","l":"onReadShareGroupStateSummaryRequest(short, RequestHeaderData, ReadShareGroupStateSummaryRequestData, FilterContext)","u":"onReadShareGroupStateSummaryRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ReadShareGroupStateSummaryRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ReadShareGroupStateSummaryResponseFilter","l":"onReadShareGroupStateSummaryResponse(short, ResponseHeaderData, ReadShareGroupStateSummaryResponseData, FilterContext)","u":"onReadShareGroupStateSummaryResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ReadShareGroupStateSummaryResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"RemoveRaftVoterRequestFilter","l":"onRemoveRaftVoterRequest(short, RequestHeaderData, RemoveRaftVoterRequestData, FilterContext)","u":"onRemoveRaftVoterRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.RemoveRaftVoterRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"RemoveRaftVoterResponseFilter","l":"onRemoveRaftVoterResponse(short, ResponseHeaderData, RemoveRaftVoterResponseData, FilterContext)","u":"onRemoveRaftVoterResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.RemoveRaftVoterResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"RenewDelegationTokenRequestFilter","l":"onRenewDelegationTokenRequest(short, RequestHeaderData, RenewDelegationTokenRequestData, FilterContext)","u":"onRenewDelegationTokenRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.RenewDelegationTokenRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"RenewDelegationTokenResponseFilter","l":"onRenewDelegationTokenResponse(short, ResponseHeaderData, RenewDelegationTokenResponseData, FilterContext)","u":"onRenewDelegationTokenResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.RenewDelegationTokenResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"RequestFilter","l":"onRequest(ApiKeys, RequestHeaderData, ApiMessage, FilterContext)","u":"onRequest(org.apache.kafka.common.protocol.ApiKeys,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.protocol.ApiMessage,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"RequestFilter","l":"onRequest(ApiKeys, short, RequestHeaderData, ApiMessage, FilterContext)","u":"onRequest(org.apache.kafka.common.protocol.ApiKeys,short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.protocol.ApiMessage,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ResponseFilter","l":"onResponse(ApiKeys, ResponseHeaderData, ApiMessage, FilterContext)","u":"onResponse(org.apache.kafka.common.protocol.ApiKeys,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.protocol.ApiMessage,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ResponseFilter","l":"onResponse(ApiKeys, short, ResponseHeaderData, ApiMessage, FilterContext)","u":"onResponse(org.apache.kafka.common.protocol.ApiKeys,short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.protocol.ApiMessage,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"SaslAuthenticateRequestFilter","l":"onSaslAuthenticateRequest(short, RequestHeaderData, SaslAuthenticateRequestData, FilterContext)","u":"onSaslAuthenticateRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.SaslAuthenticateRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"SaslAuthenticateResponseFilter","l":"onSaslAuthenticateResponse(short, ResponseHeaderData, SaslAuthenticateResponseData, FilterContext)","u":"onSaslAuthenticateResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.SaslAuthenticateResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"SaslHandshakeRequestFilter","l":"onSaslHandshakeRequest(short, RequestHeaderData, SaslHandshakeRequestData, FilterContext)","u":"onSaslHandshakeRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.SaslHandshakeRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"SaslHandshakeResponseFilter","l":"onSaslHandshakeResponse(short, ResponseHeaderData, SaslHandshakeResponseData, FilterContext)","u":"onSaslHandshakeResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.SaslHandshakeResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareAcknowledgeRequestFilter","l":"onShareAcknowledgeRequest(short, RequestHeaderData, ShareAcknowledgeRequestData, FilterContext)","u":"onShareAcknowledgeRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ShareAcknowledgeRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareAcknowledgeResponseFilter","l":"onShareAcknowledgeResponse(short, ResponseHeaderData, ShareAcknowledgeResponseData, FilterContext)","u":"onShareAcknowledgeResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ShareAcknowledgeResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareFetchRequestFilter","l":"onShareFetchRequest(short, RequestHeaderData, ShareFetchRequestData, FilterContext)","u":"onShareFetchRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ShareFetchRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareFetchResponseFilter","l":"onShareFetchResponse(short, ResponseHeaderData, ShareFetchResponseData, FilterContext)","u":"onShareFetchResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ShareFetchResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareGroupDescribeRequestFilter","l":"onShareGroupDescribeRequest(short, RequestHeaderData, ShareGroupDescribeRequestData, FilterContext)","u":"onShareGroupDescribeRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ShareGroupDescribeRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareGroupDescribeResponseFilter","l":"onShareGroupDescribeResponse(short, ResponseHeaderData, ShareGroupDescribeResponseData, FilterContext)","u":"onShareGroupDescribeResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ShareGroupDescribeResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareGroupHeartbeatRequestFilter","l":"onShareGroupHeartbeatRequest(short, RequestHeaderData, ShareGroupHeartbeatRequestData, FilterContext)","u":"onShareGroupHeartbeatRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.ShareGroupHeartbeatRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareGroupHeartbeatResponseFilter","l":"onShareGroupHeartbeatResponse(short, ResponseHeaderData, ShareGroupHeartbeatResponseData, FilterContext)","u":"onShareGroupHeartbeatResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.ShareGroupHeartbeatResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"StreamsGroupDescribeRequestFilter","l":"onStreamsGroupDescribeRequest(short, RequestHeaderData, StreamsGroupDescribeRequestData, FilterContext)","u":"onStreamsGroupDescribeRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.StreamsGroupDescribeRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"StreamsGroupDescribeResponseFilter","l":"onStreamsGroupDescribeResponse(short, ResponseHeaderData, StreamsGroupDescribeResponseData, FilterContext)","u":"onStreamsGroupDescribeResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.StreamsGroupDescribeResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"StreamsGroupHeartbeatRequestFilter","l":"onStreamsGroupHeartbeatRequest(short, RequestHeaderData, StreamsGroupHeartbeatRequestData, FilterContext)","u":"onStreamsGroupHeartbeatRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.StreamsGroupHeartbeatRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"StreamsGroupHeartbeatResponseFilter","l":"onStreamsGroupHeartbeatResponse(short, ResponseHeaderData, StreamsGroupHeartbeatResponseData, FilterContext)","u":"onStreamsGroupHeartbeatResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.StreamsGroupHeartbeatResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"SyncGroupRequestFilter","l":"onSyncGroupRequest(short, RequestHeaderData, SyncGroupRequestData, FilterContext)","u":"onSyncGroupRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.SyncGroupRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"SyncGroupResponseFilter","l":"onSyncGroupResponse(short, ResponseHeaderData, SyncGroupResponseData, FilterContext)","u":"onSyncGroupResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.SyncGroupResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"TxnOffsetCommitRequestFilter","l":"onTxnOffsetCommitRequest(short, RequestHeaderData, TxnOffsetCommitRequestData, FilterContext)","u":"onTxnOffsetCommitRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.TxnOffsetCommitRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"TxnOffsetCommitResponseFilter","l":"onTxnOffsetCommitResponse(short, ResponseHeaderData, TxnOffsetCommitResponseData, FilterContext)","u":"onTxnOffsetCommitResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.TxnOffsetCommitResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"UnregisterBrokerRequestFilter","l":"onUnregisterBrokerRequest(short, RequestHeaderData, UnregisterBrokerRequestData, FilterContext)","u":"onUnregisterBrokerRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.UnregisterBrokerRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"UnregisterBrokerResponseFilter","l":"onUnregisterBrokerResponse(short, ResponseHeaderData, UnregisterBrokerResponseData, FilterContext)","u":"onUnregisterBrokerResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.UnregisterBrokerResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"UpdateFeaturesRequestFilter","l":"onUpdateFeaturesRequest(short, RequestHeaderData, UpdateFeaturesRequestData, FilterContext)","u":"onUpdateFeaturesRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.UpdateFeaturesRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"UpdateFeaturesResponseFilter","l":"onUpdateFeaturesResponse(short, ResponseHeaderData, UpdateFeaturesResponseData, FilterContext)","u":"onUpdateFeaturesResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.UpdateFeaturesResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"UpdateRaftVoterRequestFilter","l":"onUpdateRaftVoterRequest(short, RequestHeaderData, UpdateRaftVoterRequestData, FilterContext)","u":"onUpdateRaftVoterRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.UpdateRaftVoterRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"UpdateRaftVoterResponseFilter","l":"onUpdateRaftVoterResponse(short, ResponseHeaderData, UpdateRaftVoterResponseData, FilterContext)","u":"onUpdateRaftVoterResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.UpdateRaftVoterResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"VoteRequestFilter","l":"onVoteRequest(short, RequestHeaderData, VoteRequestData, FilterContext)","u":"onVoteRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.VoteRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"VoteResponseFilter","l":"onVoteResponse(short, ResponseHeaderData, VoteResponseData, FilterContext)","u":"onVoteResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.VoteResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"WriteShareGroupStateRequestFilter","l":"onWriteShareGroupStateRequest(short, RequestHeaderData, WriteShareGroupStateRequestData, FilterContext)","u":"onWriteShareGroupStateRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.WriteShareGroupStateRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"WriteShareGroupStateResponseFilter","l":"onWriteShareGroupStateResponse(short, ResponseHeaderData, WriteShareGroupStateResponseData, FilterContext)","u":"onWriteShareGroupStateResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.WriteShareGroupStateResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"WriteTxnMarkersRequestFilter","l":"onWriteTxnMarkersRequest(short, RequestHeaderData, WriteTxnMarkersRequestData, FilterContext)","u":"onWriteTxnMarkersRequest(short,org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.message.WriteTxnMarkersRequestData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.proxy.filter","c":"WriteTxnMarkersResponseFilter","l":"onWriteTxnMarkersResponse(short, ResponseHeaderData, WriteTxnMarkersResponseData, FilterContext)","u":"onWriteTxnMarkersResponse(short,org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.message.WriteTxnMarkersResponseData,io.kroxylicious.proxy.filter.FilterContext)"},{"p":"io.kroxylicious.authorizer.service","c":"Action","l":"operation()"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizeResult","l":"partition(Collection, ResourceType, Function)","u":"partition(java.util.Collection,io.kroxylicious.authorizer.service.ResourceType,java.util.function.Function)"},{"p":"io.kroxylicious.proxy.config.secret","c":"InlinePassword","l":"password()"},{"p":"io.kroxylicious.proxy.config.secret","c":"FilePassword","l":"passwordFile()"},{"p":"io.kroxylicious.proxy.config.tls","c":"Tls","l":"PEM"},{"p":"io.kroxylicious.proxy.plugin","c":"PluginConfigurationException","l":"PluginConfigurationException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"io.kroxylicious.proxy.plugin","c":"PluginConfigurationException","l":"PluginConfigurationException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"io.kroxylicious.proxy.filter","c":"FilterFactoryContext","l":"pluginImplementationNames(Class

)","u":"pluginImplementationNames(java.lang.Class)"},{"p":"io.kroxylicious.proxy.filter","c":"FilterFactoryContext","l":"pluginInstance(Class

, String)","u":"pluginInstance(java.lang.Class,java.lang.String)"},{"p":"io.kroxylicious.proxy.authentication","c":"Subject","l":"principals()"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyPair","l":"privateKeyFile()"},{"p":"io.kroxylicious.proxy.config.tls","c":"Tls","l":"protocols()"},{"p":"io.kroxylicious.proxy.tls","c":"ClientTlsContext","l":"proxyServerCertificate()"},{"p":"io.kroxylicious.kms.service","c":"Serde","l":"putUnsignedByte(ByteBuffer, int)","u":"putUnsignedByte(java.nio.ByteBuffer,int)"},{"p":"io.kroxylicious.proxy.config.tls","c":"TlsClientAuth","l":"REQUESTED"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"requestFilterResultBuilder()"},{"p":"io.kroxylicious.proxy.plugin","c":"Plugins","l":"requireConfig(Object, C)","u":"requireConfig(java.lang.Object,C)"},{"p":"io.kroxylicious.proxy.config.tls","c":"TlsClientAuth","l":"REQUIRED"},{"p":"io.kroxylicious.kms.service","c":"Kms","l":"resolveAlias(String)","u":"resolveAlias(java.lang.String)"},{"p":"io.kroxylicious.authorizer.service","c":"Action","l":"resourceName()"},{"p":"io.kroxylicious.authorizer.service","c":"Action","l":"resourceTypeClass()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"responseFilterResultBuilder()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"sendRequest(RequestHeaderData, ApiMessage)","u":"sendRequest(org.apache.kafka.common.message.RequestHeaderData,org.apache.kafka.common.protocol.ApiMessage)"},{"p":"io.kroxylicious.kms.service","c":"Serde","l":"serialize(T, ByteBuffer)","u":"serialize(T,java.nio.ByteBuffer)"},{"p":"io.kroxylicious.proxy.config.tls","c":"ServerOptions","l":"ServerOptions(TlsClientAuth)","u":"%3Cinit%3E(io.kroxylicious.proxy.config.tls.TlsClientAuth)"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"sessionId()"},{"p":"io.kroxylicious.proxy.filter","c":"RequestFilterResult","l":"shortCircuitResponse()"},{"p":"io.kroxylicious.proxy.filter","c":"RequestFilterResultBuilder","l":"shortCircuitResponse(ApiMessage)","u":"shortCircuitResponse(org.apache.kafka.common.protocol.ApiMessage)"},{"p":"io.kroxylicious.proxy.filter","c":"RequestFilterResultBuilder","l":"shortCircuitResponse(ResponseHeaderData, ApiMessage)","u":"shortCircuitResponse(org.apache.kafka.common.message.ResponseHeaderData,org.apache.kafka.common.protocol.ApiMessage)"},{"p":"io.kroxylicious.proxy.filter","c":"AddOffsetsToTxnRequestFilter","l":"shouldHandleAddOffsetsToTxnRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AddOffsetsToTxnResponseFilter","l":"shouldHandleAddOffsetsToTxnResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AddPartitionsToTxnRequestFilter","l":"shouldHandleAddPartitionsToTxnRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AddPartitionsToTxnResponseFilter","l":"shouldHandleAddPartitionsToTxnResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AddRaftVoterRequestFilter","l":"shouldHandleAddRaftVoterRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AddRaftVoterResponseFilter","l":"shouldHandleAddRaftVoterResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AllocateProducerIdsRequestFilter","l":"shouldHandleAllocateProducerIdsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AllocateProducerIdsResponseFilter","l":"shouldHandleAllocateProducerIdsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterClientQuotasRequestFilter","l":"shouldHandleAlterClientQuotasRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterClientQuotasResponseFilter","l":"shouldHandleAlterClientQuotasResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterConfigsRequestFilter","l":"shouldHandleAlterConfigsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterConfigsResponseFilter","l":"shouldHandleAlterConfigsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterPartitionReassignmentsRequestFilter","l":"shouldHandleAlterPartitionReassignmentsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterPartitionReassignmentsResponseFilter","l":"shouldHandleAlterPartitionReassignmentsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterPartitionRequestFilter","l":"shouldHandleAlterPartitionRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterPartitionResponseFilter","l":"shouldHandleAlterPartitionResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterReplicaLogDirsRequestFilter","l":"shouldHandleAlterReplicaLogDirsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterReplicaLogDirsResponseFilter","l":"shouldHandleAlterReplicaLogDirsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterShareGroupOffsetsRequestFilter","l":"shouldHandleAlterShareGroupOffsetsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterShareGroupOffsetsResponseFilter","l":"shouldHandleAlterShareGroupOffsetsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterUserScramCredentialsRequestFilter","l":"shouldHandleAlterUserScramCredentialsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AlterUserScramCredentialsResponseFilter","l":"shouldHandleAlterUserScramCredentialsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ApiVersionsRequestFilter","l":"shouldHandleApiVersionsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ApiVersionsResponseFilter","l":"shouldHandleApiVersionsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AssignReplicasToDirsRequestFilter","l":"shouldHandleAssignReplicasToDirsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"AssignReplicasToDirsResponseFilter","l":"shouldHandleAssignReplicasToDirsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"BeginQuorumEpochRequestFilter","l":"shouldHandleBeginQuorumEpochRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"BeginQuorumEpochResponseFilter","l":"shouldHandleBeginQuorumEpochResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"BrokerHeartbeatRequestFilter","l":"shouldHandleBrokerHeartbeatRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"BrokerHeartbeatResponseFilter","l":"shouldHandleBrokerHeartbeatResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"BrokerRegistrationRequestFilter","l":"shouldHandleBrokerRegistrationRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"BrokerRegistrationResponseFilter","l":"shouldHandleBrokerRegistrationResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ConsumerGroupDescribeRequestFilter","l":"shouldHandleConsumerGroupDescribeRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ConsumerGroupDescribeResponseFilter","l":"shouldHandleConsumerGroupDescribeResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ConsumerGroupHeartbeatRequestFilter","l":"shouldHandleConsumerGroupHeartbeatRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ConsumerGroupHeartbeatResponseFilter","l":"shouldHandleConsumerGroupHeartbeatResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ControllerRegistrationRequestFilter","l":"shouldHandleControllerRegistrationRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ControllerRegistrationResponseFilter","l":"shouldHandleControllerRegistrationResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"CreateAclsRequestFilter","l":"shouldHandleCreateAclsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"CreateAclsResponseFilter","l":"shouldHandleCreateAclsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"CreateDelegationTokenRequestFilter","l":"shouldHandleCreateDelegationTokenRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"CreateDelegationTokenResponseFilter","l":"shouldHandleCreateDelegationTokenResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"CreatePartitionsRequestFilter","l":"shouldHandleCreatePartitionsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"CreatePartitionsResponseFilter","l":"shouldHandleCreatePartitionsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"CreateTopicsRequestFilter","l":"shouldHandleCreateTopicsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"CreateTopicsResponseFilter","l":"shouldHandleCreateTopicsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteAclsRequestFilter","l":"shouldHandleDeleteAclsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteAclsResponseFilter","l":"shouldHandleDeleteAclsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteGroupsRequestFilter","l":"shouldHandleDeleteGroupsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteGroupsResponseFilter","l":"shouldHandleDeleteGroupsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteRecordsRequestFilter","l":"shouldHandleDeleteRecordsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteRecordsResponseFilter","l":"shouldHandleDeleteRecordsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteShareGroupOffsetsRequestFilter","l":"shouldHandleDeleteShareGroupOffsetsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteShareGroupOffsetsResponseFilter","l":"shouldHandleDeleteShareGroupOffsetsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteShareGroupStateRequestFilter","l":"shouldHandleDeleteShareGroupStateRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteShareGroupStateResponseFilter","l":"shouldHandleDeleteShareGroupStateResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteTopicsRequestFilter","l":"shouldHandleDeleteTopicsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DeleteTopicsResponseFilter","l":"shouldHandleDeleteTopicsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeAclsRequestFilter","l":"shouldHandleDescribeAclsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeAclsResponseFilter","l":"shouldHandleDescribeAclsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeClientQuotasRequestFilter","l":"shouldHandleDescribeClientQuotasRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeClientQuotasResponseFilter","l":"shouldHandleDescribeClientQuotasResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeClusterRequestFilter","l":"shouldHandleDescribeClusterRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeClusterResponseFilter","l":"shouldHandleDescribeClusterResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeConfigsRequestFilter","l":"shouldHandleDescribeConfigsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeConfigsResponseFilter","l":"shouldHandleDescribeConfigsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeDelegationTokenRequestFilter","l":"shouldHandleDescribeDelegationTokenRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeDelegationTokenResponseFilter","l":"shouldHandleDescribeDelegationTokenResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeGroupsRequestFilter","l":"shouldHandleDescribeGroupsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeGroupsResponseFilter","l":"shouldHandleDescribeGroupsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeLogDirsRequestFilter","l":"shouldHandleDescribeLogDirsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeLogDirsResponseFilter","l":"shouldHandleDescribeLogDirsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeProducersRequestFilter","l":"shouldHandleDescribeProducersRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeProducersResponseFilter","l":"shouldHandleDescribeProducersResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeQuorumRequestFilter","l":"shouldHandleDescribeQuorumRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeQuorumResponseFilter","l":"shouldHandleDescribeQuorumResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeShareGroupOffsetsRequestFilter","l":"shouldHandleDescribeShareGroupOffsetsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeShareGroupOffsetsResponseFilter","l":"shouldHandleDescribeShareGroupOffsetsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeTopicPartitionsRequestFilter","l":"shouldHandleDescribeTopicPartitionsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeTopicPartitionsResponseFilter","l":"shouldHandleDescribeTopicPartitionsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeTransactionsRequestFilter","l":"shouldHandleDescribeTransactionsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeTransactionsResponseFilter","l":"shouldHandleDescribeTransactionsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeUserScramCredentialsRequestFilter","l":"shouldHandleDescribeUserScramCredentialsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"DescribeUserScramCredentialsResponseFilter","l":"shouldHandleDescribeUserScramCredentialsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ElectLeadersRequestFilter","l":"shouldHandleElectLeadersRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ElectLeadersResponseFilter","l":"shouldHandleElectLeadersResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"EndQuorumEpochRequestFilter","l":"shouldHandleEndQuorumEpochRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"EndQuorumEpochResponseFilter","l":"shouldHandleEndQuorumEpochResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"EndTxnRequestFilter","l":"shouldHandleEndTxnRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"EndTxnResponseFilter","l":"shouldHandleEndTxnResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"EnvelopeRequestFilter","l":"shouldHandleEnvelopeRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"EnvelopeResponseFilter","l":"shouldHandleEnvelopeResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ExpireDelegationTokenRequestFilter","l":"shouldHandleExpireDelegationTokenRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ExpireDelegationTokenResponseFilter","l":"shouldHandleExpireDelegationTokenResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"FetchRequestFilter","l":"shouldHandleFetchRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"FetchResponseFilter","l":"shouldHandleFetchResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"FetchSnapshotRequestFilter","l":"shouldHandleFetchSnapshotRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"FetchSnapshotResponseFilter","l":"shouldHandleFetchSnapshotResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"FindCoordinatorRequestFilter","l":"shouldHandleFindCoordinatorRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"FindCoordinatorResponseFilter","l":"shouldHandleFindCoordinatorResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"GetTelemetrySubscriptionsRequestFilter","l":"shouldHandleGetTelemetrySubscriptionsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"GetTelemetrySubscriptionsResponseFilter","l":"shouldHandleGetTelemetrySubscriptionsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"HeartbeatRequestFilter","l":"shouldHandleHeartbeatRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"HeartbeatResponseFilter","l":"shouldHandleHeartbeatResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"IncrementalAlterConfigsRequestFilter","l":"shouldHandleIncrementalAlterConfigsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"IncrementalAlterConfigsResponseFilter","l":"shouldHandleIncrementalAlterConfigsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"InitializeShareGroupStateRequestFilter","l":"shouldHandleInitializeShareGroupStateRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"InitializeShareGroupStateResponseFilter","l":"shouldHandleInitializeShareGroupStateResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"InitProducerIdRequestFilter","l":"shouldHandleInitProducerIdRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"InitProducerIdResponseFilter","l":"shouldHandleInitProducerIdResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"JoinGroupRequestFilter","l":"shouldHandleJoinGroupRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"JoinGroupResponseFilter","l":"shouldHandleJoinGroupResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"LeaveGroupRequestFilter","l":"shouldHandleLeaveGroupRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"LeaveGroupResponseFilter","l":"shouldHandleLeaveGroupResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ListConfigResourcesRequestFilter","l":"shouldHandleListConfigResourcesRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ListConfigResourcesResponseFilter","l":"shouldHandleListConfigResourcesResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ListGroupsRequestFilter","l":"shouldHandleListGroupsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ListGroupsResponseFilter","l":"shouldHandleListGroupsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ListOffsetsRequestFilter","l":"shouldHandleListOffsetsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ListOffsetsResponseFilter","l":"shouldHandleListOffsetsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ListPartitionReassignmentsRequestFilter","l":"shouldHandleListPartitionReassignmentsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ListPartitionReassignmentsResponseFilter","l":"shouldHandleListPartitionReassignmentsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ListTransactionsRequestFilter","l":"shouldHandleListTransactionsRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ListTransactionsResponseFilter","l":"shouldHandleListTransactionsResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"MetadataRequestFilter","l":"shouldHandleMetadataRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"MetadataResponseFilter","l":"shouldHandleMetadataResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetCommitRequestFilter","l":"shouldHandleOffsetCommitRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetCommitResponseFilter","l":"shouldHandleOffsetCommitResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetDeleteRequestFilter","l":"shouldHandleOffsetDeleteRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetDeleteResponseFilter","l":"shouldHandleOffsetDeleteResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetFetchRequestFilter","l":"shouldHandleOffsetFetchRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetFetchResponseFilter","l":"shouldHandleOffsetFetchResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetForLeaderEpochRequestFilter","l":"shouldHandleOffsetForLeaderEpochRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"OffsetForLeaderEpochResponseFilter","l":"shouldHandleOffsetForLeaderEpochResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ProduceRequestFilter","l":"shouldHandleProduceRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ProduceResponseFilter","l":"shouldHandleProduceResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"PushTelemetryRequestFilter","l":"shouldHandlePushTelemetryRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"PushTelemetryResponseFilter","l":"shouldHandlePushTelemetryResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ReadShareGroupStateRequestFilter","l":"shouldHandleReadShareGroupStateRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ReadShareGroupStateResponseFilter","l":"shouldHandleReadShareGroupStateResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ReadShareGroupStateSummaryRequestFilter","l":"shouldHandleReadShareGroupStateSummaryRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ReadShareGroupStateSummaryResponseFilter","l":"shouldHandleReadShareGroupStateSummaryResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"RemoveRaftVoterRequestFilter","l":"shouldHandleRemoveRaftVoterRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"RemoveRaftVoterResponseFilter","l":"shouldHandleRemoveRaftVoterResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"RenewDelegationTokenRequestFilter","l":"shouldHandleRenewDelegationTokenRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"RenewDelegationTokenResponseFilter","l":"shouldHandleRenewDelegationTokenResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"RequestFilter","l":"shouldHandleRequest(ApiKeys, short)","u":"shouldHandleRequest(org.apache.kafka.common.protocol.ApiKeys,short)"},{"p":"io.kroxylicious.proxy.filter","c":"ResponseFilter","l":"shouldHandleResponse(ApiKeys, short)","u":"shouldHandleResponse(org.apache.kafka.common.protocol.ApiKeys,short)"},{"p":"io.kroxylicious.proxy.filter","c":"SaslAuthenticateRequestFilter","l":"shouldHandleSaslAuthenticateRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"SaslAuthenticateResponseFilter","l":"shouldHandleSaslAuthenticateResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"SaslHandshakeRequestFilter","l":"shouldHandleSaslHandshakeRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"SaslHandshakeResponseFilter","l":"shouldHandleSaslHandshakeResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareAcknowledgeRequestFilter","l":"shouldHandleShareAcknowledgeRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareAcknowledgeResponseFilter","l":"shouldHandleShareAcknowledgeResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareFetchRequestFilter","l":"shouldHandleShareFetchRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareFetchResponseFilter","l":"shouldHandleShareFetchResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareGroupDescribeRequestFilter","l":"shouldHandleShareGroupDescribeRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareGroupDescribeResponseFilter","l":"shouldHandleShareGroupDescribeResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareGroupHeartbeatRequestFilter","l":"shouldHandleShareGroupHeartbeatRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"ShareGroupHeartbeatResponseFilter","l":"shouldHandleShareGroupHeartbeatResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"StreamsGroupDescribeRequestFilter","l":"shouldHandleStreamsGroupDescribeRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"StreamsGroupDescribeResponseFilter","l":"shouldHandleStreamsGroupDescribeResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"StreamsGroupHeartbeatRequestFilter","l":"shouldHandleStreamsGroupHeartbeatRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"StreamsGroupHeartbeatResponseFilter","l":"shouldHandleStreamsGroupHeartbeatResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"SyncGroupRequestFilter","l":"shouldHandleSyncGroupRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"SyncGroupResponseFilter","l":"shouldHandleSyncGroupResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"TxnOffsetCommitRequestFilter","l":"shouldHandleTxnOffsetCommitRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"TxnOffsetCommitResponseFilter","l":"shouldHandleTxnOffsetCommitResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"UnregisterBrokerRequestFilter","l":"shouldHandleUnregisterBrokerRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"UnregisterBrokerResponseFilter","l":"shouldHandleUnregisterBrokerResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"UpdateFeaturesRequestFilter","l":"shouldHandleUpdateFeaturesRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"UpdateFeaturesResponseFilter","l":"shouldHandleUpdateFeaturesResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"UpdateRaftVoterRequestFilter","l":"shouldHandleUpdateRaftVoterRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"UpdateRaftVoterResponseFilter","l":"shouldHandleUpdateRaftVoterResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"VoteRequestFilter","l":"shouldHandleVoteRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"VoteResponseFilter","l":"shouldHandleVoteResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"WriteShareGroupStateRequestFilter","l":"shouldHandleWriteShareGroupStateRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"WriteShareGroupStateResponseFilter","l":"shouldHandleWriteShareGroupStateResponse(short)"},{"p":"io.kroxylicious.proxy.filter","c":"WriteTxnMarkersRequestFilter","l":"shouldHandleWriteTxnMarkersRequest(short)"},{"p":"io.kroxylicious.proxy.filter","c":"WriteTxnMarkersResponseFilter","l":"shouldHandleWriteTxnMarkersResponse(short)"},{"p":"io.kroxylicious.proxy.plugin","c":"DeprecatedPluginName","l":"since()"},{"p":"io.kroxylicious.kms.service","c":"Serde","l":"sizeOf(T)"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"sniHostname()"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyStore","l":"storeFile()"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustStore","l":"storeFile()"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyStore","l":"storePasswordProvider()"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustStore","l":"storePasswordProvider()"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyStore","l":"storeType()"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustStore","l":"storeType()"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizeResult","l":"subject()"},{"p":"io.kroxylicious.proxy.authentication","c":"Subject","l":"Subject(Principal...)","u":"%3Cinit%3E(io.kroxylicious.proxy.authentication.Principal...)"},{"p":"io.kroxylicious.proxy.authentication","c":"Subject","l":"Subject(Set)","u":"%3Cinit%3E(java.util.Set)"},{"p":"io.kroxylicious.proxy.authentication","c":"SubjectBuildingException","l":"SubjectBuildingException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"io.kroxylicious.proxy.authentication","c":"SubjectBuildingException","l":"SubjectBuildingException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"io.kroxylicious.authorizer.service","c":"Authorizer","l":"supportedResourceTypes()"},{"p":"io.kroxylicious.kms.service","c":"DestroyableRawSecretKey","l":"takeCopyOf(byte[], String)","u":"takeCopyOf(byte[],java.lang.String)"},{"p":"io.kroxylicious.kms.service","c":"DestroyableRawSecretKey","l":"takeOwnershipOf(byte[], String)","u":"takeOwnershipOf(byte[],java.lang.String)"},{"p":"io.kroxylicious.proxy.config.tls","c":"Tls","l":"Tls(KeyProvider, TrustProvider, AllowDeny, AllowDeny)","u":"%3Cinit%3E(io.kroxylicious.proxy.config.tls.KeyProvider,io.kroxylicious.proxy.config.tls.TrustProvider,io.kroxylicious.proxy.config.tls.AllowDeny,io.kroxylicious.proxy.config.tls.AllowDeny)"},{"p":"io.kroxylicious.kms.service","c":"DestroyableRawSecretKey","l":"toDestroyableKey(SecretKey)","u":"toDestroyableKey(javax.crypto.SecretKey)"},{"p":"io.kroxylicious.proxy.filter.metadata","c":"TopicLevelMetadataErrorException","l":"TopicLevelMetadataErrorException(Errors)","u":"%3Cinit%3E(org.apache.kafka.common.protocol.Errors)"},{"p":"io.kroxylicious.proxy.filter.metadata","c":"TopicNameMappingException","l":"TopicNameMappingException(Errors)","u":"%3Cinit%3E(org.apache.kafka.common.protocol.Errors)"},{"p":"io.kroxylicious.proxy.filter.metadata","c":"TopicNameMappingException","l":"TopicNameMappingException(Errors, String)","u":"%3Cinit%3E(org.apache.kafka.common.protocol.Errors,java.lang.String)"},{"p":"io.kroxylicious.proxy.filter.metadata","c":"TopicNameMappingException","l":"TopicNameMappingException(Errors, String, Throwable)","u":"%3Cinit%3E(org.apache.kafka.common.protocol.Errors,java.lang.String,java.lang.Throwable)"},{"p":"io.kroxylicious.proxy.filter.metadata","c":"TopicNameMapping","l":"topicNames()"},{"p":"io.kroxylicious.proxy.filter","c":"FilterContext","l":"topicNames(Collection)","u":"topicNames(java.util.Collection)"},{"p":"io.kroxylicious.proxy.filter.metadata","c":"TopLevelMetadataErrorException","l":"TopLevelMetadataErrorException(Errors)","u":"%3Cinit%3E(org.apache.kafka.common.protocol.Errors)"},{"p":"io.kroxylicious.authorizer.service","c":"Action","l":"toString()"},{"p":"io.kroxylicious.authorizer.service","c":"AuthorizeResult","l":"toString()"},{"p":"io.kroxylicious.kms.service","c":"DekPair","l":"toString()"},{"p":"io.kroxylicious.proxy.authentication","c":"Subject","l":"toString()"},{"p":"io.kroxylicious.proxy.authentication","c":"User","l":"toString()"},{"p":"io.kroxylicious.proxy.config.secret","c":"FilePassword","l":"toString()"},{"p":"io.kroxylicious.proxy.config.secret","c":"InlinePassword","l":"toString()"},{"p":"io.kroxylicious.proxy.config.tls","c":"AllowDeny","l":"toString()"},{"p":"io.kroxylicious.proxy.config.tls","c":"InsecureTls","l":"toString()"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyPair","l":"toString()"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyStore","l":"toString()"},{"p":"io.kroxylicious.proxy.config.tls","c":"ServerOptions","l":"toString()"},{"p":"io.kroxylicious.proxy.config.tls","c":"Tls","l":"toString()"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustStore","l":"toString()"},{"p":"io.kroxylicious.proxy.config.tls","c":"Tls","l":"trust()"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustProvider","l":"trustOptions()"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustStore","l":"trustOptions()"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustStore","l":"TrustStore(String, PasswordProvider, String)","u":"%3Cinit%3E(java.lang.String,io.kroxylicious.proxy.config.secret.PasswordProvider,java.lang.String)"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustStore","l":"TrustStore(String, PasswordProvider, String, TrustOptions)","u":"%3Cinit%3E(java.lang.String,io.kroxylicious.proxy.config.secret.PasswordProvider,java.lang.String,io.kroxylicious.proxy.config.tls.TrustOptions)"},{"p":"io.kroxylicious.proxy.authentication","c":"Subject","l":"uniquePrincipalOfType(Class

)","u":"uniquePrincipalOfType(java.lang.Class)"},{"p":"io.kroxylicious.kms.service","c":"UnknownAliasException","l":"UnknownAliasException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"io.kroxylicious.kms.service","c":"UnknownKeyException","l":"UnknownKeyException()","u":"%3Cinit%3E()"},{"p":"io.kroxylicious.kms.service","c":"UnknownKeyException","l":"UnknownKeyException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"io.kroxylicious.proxy.plugin","c":"UnknownPluginInstanceException","l":"UnknownPluginInstanceException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"io.kroxylicious.proxy.plugin","c":"UnknownPluginInstanceException","l":"UnknownPluginInstanceException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"io.kroxylicious.proxy.authentication","c":"User","l":"User(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"io.kroxylicious.proxy.authentication","c":"UserFactory","l":"UserFactory()","u":"%3Cinit%3E()"},{"p":"io.kroxylicious.proxy.plugin","c":"PluginImplName","l":"value()"},{"p":"io.kroxylicious.authorizer.service","c":"Decision","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"io.kroxylicious.proxy.config.tls","c":"TlsClientAuth","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"io.kroxylicious.authorizer.service","c":"Decision","l":"values()"},{"p":"io.kroxylicious.proxy.config.tls","c":"TlsClientAuth","l":"values()"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustProviderVisitor","l":"visit(InsecureTls)","u":"visit(io.kroxylicious.proxy.config.tls.InsecureTls)"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyProviderVisitor","l":"visit(KeyPair)","u":"visit(io.kroxylicious.proxy.config.tls.KeyPair)"},{"p":"io.kroxylicious.proxy.config.tls","c":"KeyProviderVisitor","l":"visit(KeyStore)","u":"visit(io.kroxylicious.proxy.config.tls.KeyStore)"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustProviderVisitor","l":"visit(PlatformTrustProvider)","u":"visit(io.kroxylicious.proxy.config.tls.PlatformTrustProvider)"},{"p":"io.kroxylicious.proxy.config.tls","c":"TrustProviderVisitor","l":"visit(TrustStore)","u":"visit(io.kroxylicious.proxy.config.tls.TrustStore)"},{"p":"io.kroxylicious.proxy.filter.filterresultbuilder","c":"CloseStage","l":"withCloseConnection()"}];updateSearchResults(); \ No newline at end of file diff --git a/documentation/0.20.0/javadoc/module-search-index.js b/documentation/0.20.0/javadoc/module-search-index.js new file mode 100644 index 0000000..0d59754 --- /dev/null +++ b/documentation/0.20.0/javadoc/module-search-index.js @@ -0,0 +1 @@ +moduleSearchIndex = [];updateSearchResults(); \ No newline at end of file diff --git a/documentation/0.20.0/javadoc/overview-summary.html b/documentation/0.20.0/javadoc/overview-summary.html new file mode 100644 index 0000000..3cc5ae7 --- /dev/null +++ b/documentation/0.20.0/javadoc/overview-summary.html @@ -0,0 +1,25 @@ + + + + +Kroxylicious API Javadoc 0.20.0 API + + + + + + + + + + +

+ +

index.html

+
+ + diff --git a/documentation/0.20.0/javadoc/overview-tree.html b/documentation/0.20.0/javadoc/overview-tree.html new file mode 100644 index 0000000..5f9d188 --- /dev/null +++ b/documentation/0.20.0/javadoc/overview-tree.html @@ -0,0 +1,423 @@ + + + + +Class Hierarchy (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For All Packages

+
+Package Hierarchies: + +
+

Class Hierarchy

+ +
+
+

Interface Hierarchy

+ +
+
+

Annotation Interface Hierarchy

+ +
+
+

Enum Class Hierarchy

+ +
+
+

Record Class Hierarchy

+ +
+
+
+
+ +
+
+
+ + diff --git a/documentation/0.20.0/javadoc/package-search-index.js b/documentation/0.20.0/javadoc/package-search-index.js new file mode 100644 index 0000000..e18f614 --- /dev/null +++ b/documentation/0.20.0/javadoc/package-search-index.js @@ -0,0 +1 @@ +packageSearchIndex = [{"l":"All Packages","u":"allpackages-index.html"},{"l":"io.kroxylicious.authorizer.service"},{"l":"io.kroxylicious.kms.service"},{"l":"io.kroxylicious.proxy.authentication"},{"l":"io.kroxylicious.proxy.config.secret"},{"l":"io.kroxylicious.proxy.config.tls"},{"l":"io.kroxylicious.proxy.filter"},{"l":"io.kroxylicious.proxy.filter.filterresultbuilder"},{"l":"io.kroxylicious.proxy.filter.metadata"},{"l":"io.kroxylicious.proxy.plugin"},{"l":"io.kroxylicious.proxy.tls"}];updateSearchResults(); \ No newline at end of file diff --git a/documentation/0.20.0/javadoc/resources/glass.png b/documentation/0.20.0/javadoc/resources/glass.png new file mode 100644 index 0000000..a7f591f Binary files /dev/null and b/documentation/0.20.0/javadoc/resources/glass.png differ diff --git a/documentation/0.20.0/javadoc/resources/x.png b/documentation/0.20.0/javadoc/resources/x.png new file mode 100644 index 0000000..30548a7 Binary files /dev/null and b/documentation/0.20.0/javadoc/resources/x.png differ diff --git a/documentation/0.20.0/javadoc/script-dir/jquery-3.7.1.min.js b/documentation/0.20.0/javadoc/script-dir/jquery-3.7.1.min.js new file mode 100644 index 0000000..7f37b5d --- /dev/null +++ b/documentation/0.20.0/javadoc/script-dir/jquery-3.7.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0{"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(x){x.ui=x.ui||{};x.ui.version="1.14.1";var n,s,C,k,o,l,a,r,u,i,h=0,c=Array.prototype.hasOwnProperty,d=Array.prototype.slice;x.cleanData=(n=x.cleanData,function(t){for(var e,i,s=0;null!=(i=t[s]);s++)(e=x._data(i,"events"))&&e.remove&&x(i).triggerHandler("remove");n(t)}),x.widget=function(t,i,e){var s,n,o,l,a={},r=t.split(".")[0];return"__proto__"===(t=t.split(".")[1])||"constructor"===t?x.error("Invalid widget name: "+t):(l=r+"-"+t,e||(e=i,i=x.Widget),Array.isArray(e)&&(e=x.extend.apply(null,[{}].concat(e))),x.expr.pseudos[l.toLowerCase()]=function(t){return!!x.data(t,l)},x[r]=x[r]||{},s=x[r][t],n=x[r][t]=function(t,e){if(!this||!this._createWidget)return new n(t,e);arguments.length&&this._createWidget(t,e)},x.extend(n,s,{version:e.version,_proto:x.extend({},e),_childConstructors:[]}),(o=new i).options=x.widget.extend({},o.options),x.each(e,function(e,s){function n(){return i.prototype[e].apply(this,arguments)}function o(t){return i.prototype[e].apply(this,t)}a[e]="function"!=typeof s?s:function(){var t,e=this._super,i=this._superApply;return this._super=n,this._superApply=o,t=s.apply(this,arguments),this._super=e,this._superApply=i,t}}),n.prototype=x.widget.extend(o,{widgetEventPrefix:s&&o.widgetEventPrefix||t},a,{constructor:n,namespace:r,widgetName:t,widgetFullName:l}),s?(x.each(s._childConstructors,function(t,e){var i=e.prototype;x.widget(i.namespace+"."+i.widgetName,n,e._proto)}),delete s._childConstructors):i._childConstructors.push(n),x.widget.bridge(t,n),n)},x.widget.extend=function(t){for(var e,i,s=d.call(arguments,1),n=0,o=s.length;n",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=x(e||this.defaultElement||this)[0],this.element=x(e),this.uuid=h++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=x(),this.hoverable=x(),this.focusable=x(),this.classesElementLookup={},e!==this&&(x.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=x(e.style?e.ownerDocument:e.document||e),this.window=x(this.document[0].defaultView||this.document[0].parentWindow)),this.options=x.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:x.noop,_create:x.noop,_init:x.noop,destroy:function(){var i=this;this._destroy(),x.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:x.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return x.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=x.widget.extend({},this.options[t]),n=0;n{var i=[];n.element.each(function(t,e){x.map(l.classesElementLookup,function(t){return t}).some(function(t){return t.is(e)})||i.push(e)}),l._on(x(i),{remove:"_untrackClassesElement"})})(),x(x.uniqueSort(i.get().concat(n.element.get())))):x(i.not(n.element).get()),l.classesElementLookup[t[s]]=i,o.push(t[s]),e&&n.classes[t[s]]&&o.push(n.classes[t[s]])}return(n=x.extend({element:this.element,classes:this.options.classes||{}},n)).keys&&t(n.keys.match(/\S+/g)||[],!0),n.extra&&t(n.extra.match(/\S+/g)||[]),o.join(" ")},_untrackClassesElement:function(i){var s=this;x.each(s.classesElementLookup,function(t,e){-1!==x.inArray(i.target,e)&&(s.classesElementLookup[t]=x(e.not(i.target).get()))}),this._off(x(i.target))},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){var n="string"==typeof t||null===t,e={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s="boolean"==typeof s?s:i};return e.element.toggleClass(this._classes(e),s),this},_on:function(n,o,t){var l,a=this;"boolean"!=typeof n&&(t=o,o=n,n=!1),t?(o=l=x(o),this.bindings=this.bindings.add(o)):(t=o,o=this.element,l=this.widget()),x.each(t,function(t,e){function i(){if(n||!0!==a.options.disabled&&!x(this).hasClass("ui-state-disabled"))return("string"==typeof e?a[e]:e).apply(a,arguments)}"string"!=typeof e&&(i.guid=e.guid=e.guid||i.guid||x.guid++);var t=t.match(/^([\w:-]*)\s*(.*)$/),s=t[1]+a.eventNamespace,t=t[2];t?l.on(s,t,i):o.on(s,i)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.off(e),this.bindings=x(this.bindings.not(t).get()),this.focusable=x(this.focusable.not(t).get()),this.hoverable=x(this.hoverable.not(t).get())},_delay:function(t,e){var i=this;return setTimeout(function(){return("string"==typeof t?i[t]:t).apply(i,arguments)},e||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){this._addClass(x(t.currentTarget),null,"ui-state-hover")},mouseleave:function(t){this._removeClass(x(t.currentTarget),null,"ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){this._addClass(x(t.currentTarget),null,"ui-state-focus")},focusout:function(t){this._removeClass(x(t.currentTarget),null,"ui-state-focus")}})},_trigger:function(t,e,i){var s,n,o=this.options[t];if(i=i||{},(e=x.Event(e)).type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),e.target=this.element[0],n=e.originalEvent)for(s in n)s in e||(e[s]=n[s]);return this.element.trigger(e,i),!("function"==typeof o&&!1===o.apply(this.element[0],[e].concat(i))||e.isDefaultPrevented())}},x.each({show:"fadeIn",hide:"fadeOut"},function(o,l){x.Widget.prototype["_"+o]=function(e,t,i){var s,n=(t="string"==typeof t?{effect:t}:t)?!0!==t&&"number"!=typeof t&&t.effect||l:o;"number"==typeof(t=t||{})?t={duration:t}:!0===t&&(t={}),s=!x.isEmptyObject(t),t.complete=i,t.delay&&e.delay(t.delay),s&&x.effects&&x.effects.effect[n]?e[o](t):n!==o&&e[n]?e[n](t.duration,t.easing,i):e.queue(function(t){x(this)[o](),i&&i.call(e[0]),t()})}}),x.widget;function E(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function T(t,e){return parseInt(x.css(t,e),10)||0}function W(t){return null!=t&&t===t.window}C=Math.max,k=Math.abs,o=/left|center|right/,l=/top|center|bottom/,a=/[\+\-]\d+(\.[\d]+)?%?/,r=/^\w+/,u=/%$/,i=x.fn.position,x.position={scrollbarWidth:function(){var t,e,i;return void 0!==s?s:(i=(e=x("
")).children()[0],x("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i)},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthC(k(s),k(n))?o.important="horizontal":o.important="vertical",c.using.call(this,t,o)}),l.offset(x.extend(u,{using:t}))})):i.apply(this,arguments)},x.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,s=s.width,o=t.left-e.collisionPosition.marginLeft,l=n-o,a=o+e.collisionWidth-s-n;s",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.lastMousePosition={x:null,y:null},this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault(),this._activateItem(t)},"click .ui-menu-item":function(t){var e=x(t.target),i=x(this.document[0].activeElement);!this.mouseHandled&&e.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),e.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&i.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active)&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer))},"mouseenter .ui-menu-item":"_activateItem","mousemove .ui-menu-item":"_activateItem",mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this._menuItems().first();e||this.focus(t,i)},blur:function(t){this._delay(function(){x.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t,!0),this.mouseHandled=!1}})},_activateItem:function(t){var e,i;this.previousFilter||t.clientX===this.lastMousePosition.x&&t.clientY===this.lastMousePosition.y||(this.lastMousePosition={x:t.clientX,y:t.clientY},e=x(t.target).closest(".ui-menu-item"),i=x(t.currentTarget),e[0]!==i[0])||i.is(".ui-state-active")||(this._removeClass(i.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(t,i))},_destroy:function(){var t=this.element.find(".ui-menu-item").removeAttr("role aria-disabled").children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),t.children().each(function(){var t=x(this);t.data("ui-menu-submenu-caret")&&t.remove()})},_keydown:function(t){var e,i,s,n=!0;switch(t.keyCode){case x.ui.keyCode.PAGE_UP:this.previousPage(t);break;case x.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case x.ui.keyCode.HOME:this._move("first","first",t);break;case x.ui.keyCode.END:this._move("last","last",t);break;case x.ui.keyCode.UP:this.previous(t);break;case x.ui.keyCode.DOWN:this.next(t);break;case x.ui.keyCode.LEFT:this.collapse(t);break;case x.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case x.ui.keyCode.ENTER:case x.ui.keyCode.SPACE:this._activate(t);break;case x.ui.keyCode.ESCAPE:this.collapse(t);break;default:e=this.previousFilter||"",s=n=!1,i=96<=t.keyCode&&t.keyCode<=105?(t.keyCode-96).toString():String.fromCharCode(t.keyCode),clearTimeout(this.filterTimer),i===e?s=!0:i=e+i,e=this._filterMenuItems(i),(e=s&&-1!==e.index(this.active.next())?this.active.nextAll(".ui-menu-item"):e).length||(i=String.fromCharCode(t.keyCode),e=this._filterMenuItems(i)),e.length?(this.focus(t,e),this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}n&&t.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var t,e,s=this,n=this.options.icons.submenu,i=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),t=i.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=x(this),e=t.prev(),i=x("").data("ui-menu-submenu-caret",!0);s._addClass(i,"ui-menu-icon","ui-icon "+n),e.attr("aria-haspopup","true").prepend(i),t.attr("aria-labelledby",e.attr("id"))}),this._addClass(t,"ui-menu","ui-widget ui-widget-content ui-front"),(t=i.add(this.element).find(this.options.items)).not(".ui-menu-item").each(function(){var t=x(this);s._isDivider(t)&&s._addClass(t,"ui-menu-divider","ui-widget-content")}),e=(i=t.not(".ui-menu-item, .ui-menu-divider")).children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(i,"ui-menu-item")._addClass(e,"ui-menu-item-wrapper"),t.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!x.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){var i;"icons"===t&&(i=this.element.find(".ui-menu-icon"),this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",String(t)),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),i=this.active.children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",i.attr("id")),i=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),(i=e.children(".ui-menu")).length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(t){var e,i,s;this._hasScroll()&&(e=parseFloat(x.css(this.activeMenu[0],"borderTopWidth"))||0,i=parseFloat(x.css(this.activeMenu[0],"paddingTop"))||0,e=t.offset().top-this.activeMenu.offset().top-e-i,i=this.activeMenu.scrollTop(),s=this.activeMenu.height(),t=t.outerHeight(),e<0?this.activeMenu.scrollTop(i+e):s",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,liveRegionTimer:null,_create:function(){var i,s,n,t=this.element[0].nodeName.toLowerCase(),e="textarea"===t,t="input"===t;this.isMultiLine=e||!t&&"true"===this.element.prop("contentEditable"),this.valueMethod=this.element[e||t?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(t){if(this.element.prop("readOnly"))s=n=i=!0;else{s=n=i=!1;var e=x.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:i=!0,this._move("previousPage",t);break;case e.PAGE_DOWN:i=!0,this._move("nextPage",t);break;case e.UP:i=!0,this._keyEvent("previous",t);break;case e.DOWN:i=!0,this._keyEvent("next",t);break;case e.ENTER:this.menu.active&&(i=!0,t.preventDefault(),this.menu.select(t));break;case e.TAB:this.menu.active&&this.menu.select(t);break;case e.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(t),t.preventDefault());break;default:s=!0,this._searchTimeout(t)}}},keypress:function(t){if(i)i=!1,this.isMultiLine&&!this.menu.element.is(":visible")||t.preventDefault();else if(!s){var e=x.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:this._move("previousPage",t);break;case e.PAGE_DOWN:this._move("nextPage",t);break;case e.UP:this._keyEvent("previous",t);break;case e.DOWN:this._keyEvent("next",t)}}},input:function(t){n?(n=!1,t.preventDefault()):this._searchTimeout(t)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){clearTimeout(this.searching),this.close(t),this._change(t)}}),this._initSource(),this.menu=x("
    ").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault()},menufocus:function(t,e){var i,s;this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent)&&/^mouse/.test(t.originalEvent.type)?(this.menu.blur(),this.document.one("mousemove",function(){x(t.target).trigger(t.originalEvent)})):(s=e.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:s})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(s.value),(i=e.item.attr("aria-label")||s.value)&&String.prototype.trim.call(i).length&&(clearTimeout(this.liveRegionTimer),this.liveRegionTimer=this._delay(function(){this.liveRegion.html(x("
    ").text(i))},100)))},menuselect:function(t,e){var e=e.item.data("ui-autocomplete-item"),i=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.trigger("focus"),this.previous=i),!1!==this._trigger("select",t,{item:e})&&this._value(e.value),this.term=this._value(),this.close(t),this.selectedItem=e}}),this.liveRegion=x("
    ",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(t){var e=this.menu.element[0];return t.target===this.element[0]||t.target===e||x.contains(e,t.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var t=this.options.appendTo;return t=(t=(t=t&&(t.jquery||t.nodeType?x(t):this.document.find(t).eq(0)))&&t[0]?t:this.element.closest(".ui-front, dialog")).length?t:this.document[0].body},_initSource:function(){var i,s,n=this;Array.isArray(this.options.source)?(i=this.options.source,this.source=function(t,e){e(x.ui.autocomplete.filter(i,t.term))}):"string"==typeof this.options.source?(s=this.options.source,this.source=function(t,e){n.xhr&&n.xhr.abort(),n.xhr=x.ajax({url:s,data:t,dataType:"json",success:function(t){e(t)},error:function(){e([])}})}):this.source=this.options.source},_searchTimeout:function(s){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),e=this.menu.element.is(":visible"),i=s.altKey||s.ctrlKey||s.metaKey||s.shiftKey;t&&(e||i)||(this.selectedItem=null,this.search(null,s))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length").append(x("
    ").text(e.label)).appendTo(t)},_move:function(t,e){this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),this.menu.blur()):this.menu[t](e):this.search(null,e)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){this.isMultiLine&&!this.menu.element.is(":visible")||(this._move(t,e),e.preventDefault())}}),x.extend(x.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,e){var i=new RegExp(x.ui.autocomplete.escapeRegex(e),"i");return x.grep(t,function(t){return i.test(t.label||t.value||t)})}}),x.widget("ui.autocomplete",x.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(1").text(e))},100))}}),x.ui.autocomplete}); \ No newline at end of file diff --git a/documentation/0.20.0/javadoc/script.js b/documentation/0.20.0/javadoc/script.js new file mode 100644 index 0000000..bb9c8a2 --- /dev/null +++ b/documentation/0.20.0/javadoc/script.js @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +var moduleSearchIndex; +var packageSearchIndex; +var typeSearchIndex; +var memberSearchIndex; +var tagSearchIndex; + +var oddRowColor = "odd-row-color"; +var evenRowColor = "even-row-color"; +var sortAsc = "sort-asc"; +var sortDesc = "sort-desc"; +var tableTab = "table-tab"; +var activeTableTab = "active-table-tab"; + +function loadScripts(doc, tag) { + createElem(doc, tag, 'search.js'); + + createElem(doc, tag, 'module-search-index.js'); + createElem(doc, tag, 'package-search-index.js'); + createElem(doc, tag, 'type-search-index.js'); + createElem(doc, tag, 'member-search-index.js'); + createElem(doc, tag, 'tag-search-index.js'); +} + +function createElem(doc, tag, path) { + var script = doc.createElement(tag); + var scriptElement = doc.getElementsByTagName(tag)[0]; + script.src = pathtoroot + path; + scriptElement.parentNode.insertBefore(script, scriptElement); +} + +// Helper for making content containing release names comparable lexicographically +function makeComparable(s) { + return s.toLowerCase().replace(/(\d+)/g, + function(n, m) { + return ("000" + m).slice(-4); + }); +} + +// Switches between two styles depending on a condition +function toggleStyle(classList, condition, trueStyle, falseStyle) { + if (condition) { + classList.remove(falseStyle); + classList.add(trueStyle); + } else { + classList.remove(trueStyle); + classList.add(falseStyle); + } +} + +// Sorts the rows in a table lexicographically by the content of a specific column +function sortTable(header, columnIndex, columns) { + var container = header.parentElement; + var descending = header.classList.contains(sortAsc); + container.querySelectorAll("div.table-header").forEach( + function(header) { + header.classList.remove(sortAsc); + header.classList.remove(sortDesc); + } + ) + var cells = container.children; + var rows = []; + for (var i = columns; i < cells.length; i += columns) { + rows.push(Array.prototype.slice.call(cells, i, i + columns)); + } + var comparator = function(a, b) { + var ka = makeComparable(a[columnIndex].textContent); + var kb = makeComparable(b[columnIndex].textContent); + if (ka < kb) + return descending ? 1 : -1; + if (ka > kb) + return descending ? -1 : 1; + return 0; + }; + var sorted = rows.sort(comparator); + var visible = 0; + sorted.forEach(function(row) { + if (row[0].style.display !== 'none') { + var isEvenRow = visible++ % 2 === 0; + } + row.forEach(function(cell) { + toggleStyle(cell.classList, isEvenRow, evenRowColor, oddRowColor); + container.appendChild(cell); + }) + }); + toggleStyle(header.classList, descending, sortDesc, sortAsc); +} + +// Toggles the visibility of a table category in all tables in a page +function toggleGlobal(checkbox, selected, columns) { + var display = checkbox.checked ? '' : 'none'; + document.querySelectorAll("div.table-tabs").forEach(function(t) { + var id = t.parentElement.getAttribute("id"); + var selectedClass = id + "-tab" + selected; + // if selected is empty string it selects all uncategorized entries + var selectUncategorized = !Boolean(selected); + var visible = 0; + document.querySelectorAll('div.' + id) + .forEach(function(elem) { + if (selectUncategorized) { + if (elem.className.indexOf(selectedClass) === -1) { + elem.style.display = display; + } + } else if (elem.classList.contains(selectedClass)) { + elem.style.display = display; + } + if (elem.style.display === '') { + var isEvenRow = visible++ % (columns * 2) < columns; + toggleStyle(elem.classList, isEvenRow, evenRowColor, oddRowColor); + } + }); + var displaySection = visible === 0 ? 'none' : ''; + t.parentElement.style.display = displaySection; + document.querySelector("li#contents-" + id).style.display = displaySection; + }) +} + +// Shows the elements of a table belonging to a specific category +function show(tableId, selected, columns) { + if (tableId !== selected) { + document.querySelectorAll('div.' + tableId + ':not(.' + selected + ')') + .forEach(function(elem) { + elem.style.display = 'none'; + }); + } + document.querySelectorAll('div.' + selected) + .forEach(function(elem, index) { + elem.style.display = ''; + var isEvenRow = index % (columns * 2) < columns; + toggleStyle(elem.classList, isEvenRow, evenRowColor, oddRowColor); + }); + updateTabs(tableId, selected); +} + +function updateTabs(tableId, selected) { + document.getElementById(tableId + '.tabpanel') + .setAttribute('aria-labelledby', selected); + document.querySelectorAll('button[id^="' + tableId + '"]') + .forEach(function(tab, index) { + if (selected === tab.id || (tableId === selected && index === 0)) { + tab.className = activeTableTab; + tab.setAttribute('aria-selected', true); + tab.setAttribute('tabindex',0); + } else { + tab.className = tableTab; + tab.setAttribute('aria-selected', false); + tab.setAttribute('tabindex',-1); + } + }); +} + +function switchTab(e) { + var selected = document.querySelector('[aria-selected=true]'); + if (selected) { + if ((e.keyCode === 37 || e.keyCode === 38) && selected.previousSibling) { + // left or up arrow key pressed: move focus to previous tab + selected.previousSibling.click(); + selected.previousSibling.focus(); + e.preventDefault(); + } else if ((e.keyCode === 39 || e.keyCode === 40) && selected.nextSibling) { + // right or down arrow key pressed: move focus to next tab + selected.nextSibling.click(); + selected.nextSibling.focus(); + e.preventDefault(); + } + } +} + +var updateSearchResults = function() {}; + +function indexFilesLoaded() { + return moduleSearchIndex + && packageSearchIndex + && typeSearchIndex + && memberSearchIndex + && tagSearchIndex; +} +// Copy the contents of the local snippet to the clipboard +function copySnippet(button) { + copyToClipboard(button.nextElementSibling.innerText); + switchCopyLabel(button, button.firstElementChild); +} +function copyToClipboard(content) { + var textarea = document.createElement("textarea"); + textarea.style.height = 0; + document.body.appendChild(textarea); + textarea.value = content; + textarea.select(); + document.execCommand("copy"); + document.body.removeChild(textarea); +} +function switchCopyLabel(button, span) { + var copied = span.getAttribute("data-copied"); + button.classList.add("visible"); + var initialLabel = span.innerHTML; + span.innerHTML = copied; + setTimeout(function() { + button.classList.remove("visible"); + setTimeout(function() { + if (initialLabel !== copied) { + span.innerHTML = initialLabel; + } + }, 100); + }, 1900); +} +// Workaround for scroll position not being included in browser history (8249133) +document.addEventListener("DOMContentLoaded", function(e) { + var contentDiv = document.querySelector("div.flex-content"); + window.addEventListener("popstate", function(e) { + if (e.state !== null) { + contentDiv.scrollTop = e.state; + } + }); + window.addEventListener("hashchange", function(e) { + history.replaceState(contentDiv.scrollTop, document.title); + }); + var timeoutId; + contentDiv.addEventListener("scroll", function(e) { + if (timeoutId) { + clearTimeout(timeoutId); + } + timeoutId = setTimeout(function() { + history.replaceState(contentDiv.scrollTop, document.title); + }, 100); + }); + if (!location.hash) { + history.replaceState(contentDiv.scrollTop, document.title); + } +}); diff --git a/documentation/0.20.0/javadoc/search-page.js b/documentation/0.20.0/javadoc/search-page.js new file mode 100644 index 0000000..540c90f --- /dev/null +++ b/documentation/0.20.0/javadoc/search-page.js @@ -0,0 +1,284 @@ +/* + * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +"use strict"; +$(function() { + var copy = $("#page-search-copy"); + var expand = $("#page-search-expand"); + var searchLink = $("span#page-search-link"); + var redirect = $("input#search-redirect"); + function setSearchUrlTemplate() { + var href = document.location.href.split(/[#?]/)[0]; + href += "?q=" + "%s"; + if (redirect.is(":checked")) { + href += "&r=1"; + } + searchLink.html(href); + copy[0].onmouseenter(); + } + function copyLink(e) { + copyToClipboard(this.previousSibling.innerText); + switchCopyLabel(this, this.lastElementChild); + } + copy.click(copyLink); + copy[0].onmouseenter = function() {}; + redirect.click(setSearchUrlTemplate); + setSearchUrlTemplate(); + copy.prop("disabled", false); + redirect.prop("disabled", false); + expand.click(function (e) { + var searchInfo = $("div.page-search-info"); + if(this.parentElement.hasAttribute("open")) { + searchInfo.attr("style", "border-width: 0;"); + } else { + searchInfo.attr("style", "border-width: 1px;").height(searchInfo.prop("scrollHeight")); + } + }); +}); +$(window).on("load", function() { + var input = $("#page-search-input"); + var reset = $("#page-search-reset"); + var notify = $("#page-search-notify"); + var resultSection = $("div#result-section"); + var resultContainer = $("div#result-container"); + var searchTerm = ""; + var activeTab = ""; + var fixedTab = false; + var visibleTabs = []; + var feelingLucky = false; + function renderResults(result) { + if (!result.length) { + notify.html(messages.noResult); + } else if (result.length === 1) { + notify.html(messages.oneResult); + } else { + notify.html(messages.manyResults.replace("{0}", result.length)); + } + resultContainer.empty(); + var r = { + "types": [], + "members": [], + "packages": [], + "modules": [], + "searchTags": [] + }; + for (var i in result) { + var item = result[i]; + var arr = r[item.category]; + arr.push(item); + } + if (!activeTab || r[activeTab].length === 0 || !fixedTab) { + Object.keys(r).reduce(function(prev, curr) { + if (r[curr].length > 0 && r[curr][0].score > prev) { + activeTab = curr; + return r[curr][0].score; + } + return prev; + }, 0); + } + if (feelingLucky && activeTab) { + notify.html(messages.redirecting) + var firstItem = r[activeTab][0]; + window.location = getURL(firstItem.indexItem, firstItem.category); + return; + } + if (result.length > 20) { + if (searchTerm[searchTerm.length - 1] === ".") { + if (activeTab === "types" && r["members"].length > r["types"].length) { + activeTab = "members"; + } else if (activeTab === "packages" && r["types"].length > r["packages"].length) { + activeTab = "types"; + } + } + } + var categoryCount = Object.keys(r).reduce(function(prev, curr) { + return prev + (r[curr].length > 0 ? 1 : 0); + }, 0); + visibleTabs = []; + var tabContainer = $("
    ").appendTo(resultContainer); + for (var key in r) { + var id = "#result-tab-" + key.replace("searchTags", "search_tags"); + if (r[key].length) { + var count = r[key].length >= 1000 ? "999+" : r[key].length; + if (result.length > 20 && categoryCount > 1) { + var button = $("").appendTo(tabContainer); + button.click(key, function(e) { + fixedTab = true; + renderResult(e.data, $(this)); + }); + visibleTabs.push(key); + } else { + $("" + categories[key] + + " (" + count + ")").appendTo(tabContainer); + renderTable(key, r[key]).appendTo(resultContainer); + tabContainer = $("
    ").appendTo(resultContainer); + + } + } + } + if (activeTab && result.length > 20 && categoryCount > 1) { + $("button#result-tab-" + activeTab).addClass("active-table-tab"); + renderTable(activeTab, r[activeTab]).appendTo(resultContainer); + } + resultSection.show(); + function renderResult(category, button) { + activeTab = category; + setSearchUrl(); + resultContainer.find("div.summary-table").remove(); + renderTable(activeTab, r[activeTab]).appendTo(resultContainer); + button.siblings().removeClass("active-table-tab"); + button.addClass("active-table-tab"); + } + } + function selectTab(category) { + $("button#result-tab-" + category).click(); + } + function renderTable(category, items) { + var table = $("
    ") + .addClass(category === "modules" + ? "one-column-search-results" + : "two-column-search-results"); + var col1, col2; + if (category === "modules") { + col1 = "Module"; + } else if (category === "packages") { + col1 = "Module"; + col2 = "Package"; + } else if (category === "types") { + col1 = "Package"; + col2 = "Class" + } else if (category === "members") { + col1 = "Class"; + col2 = "Member"; + } else if (category === "searchTags") { + col1 = "Location"; + col2 = "Name"; + } + $("
    " + col1 + "
    ").appendTo(table); + if (category !== "modules") { + $("
    " + col2 + "
    ").appendTo(table); + } + $.each(items, function(index, item) { + var rowColor = index % 2 ? "odd-row-color" : "even-row-color"; + renderItem(item, table, rowColor); + }); + return table; + } + function renderItem(item, table, rowColor) { + var label = getHighlightedText(item.input, item.boundaries, item.prefix.length, item.input.length); + var link = $("") + .attr("href", getURL(item.indexItem, item.category)) + .attr("tabindex", "0") + .addClass("search-result-link") + .html(label); + var container = getHighlightedText(item.input, item.boundaries, 0, item.prefix.length - 1); + if (item.category === "searchTags") { + container = item.indexItem.h || ""; + } + if (item.category !== "modules") { + $("
    ").html(container).addClass("col-plain").addClass(rowColor).appendTo(table); + } + $("
    ").html(link).addClass("col-last").addClass(rowColor).appendTo(table); + } + var timeout; + function schedulePageSearch() { + if (timeout) { + clearTimeout(timeout); + } + timeout = setTimeout(function () { + doPageSearch() + }, 100); + } + function doPageSearch() { + setSearchUrl(); + var term = searchTerm = input.val().trim(); + if (term === "") { + notify.html(messages.enterTerm); + activeTab = ""; + fixedTab = false; + resultContainer.empty(); + resultSection.hide(); + } else { + notify.html(messages.searching); + doSearch({ term: term, maxResults: 1200 }, renderResults); + } + } + function setSearchUrl() { + var query = input.val().trim(); + var url = document.location.pathname; + if (query) { + url += "?q=" + encodeURI(query); + if (activeTab && fixedTab) { + url += "&c=" + activeTab; + } + } + history.replaceState({query: query}, "", url); + } + input.on("input", function(e) { + feelingLucky = false; + schedulePageSearch(); + }); + $(document).keydown(function(e) { + if ((e.ctrlKey || e.metaKey) && (e.key === "ArrowLeft" || e.key === "ArrowRight")) { + if (activeTab && visibleTabs.length > 1) { + var idx = visibleTabs.indexOf(activeTab); + idx += e.key === "ArrowLeft" ? visibleTabs.length - 1 : 1; + selectTab(visibleTabs[idx % visibleTabs.length]); + return false; + } + } + }); + reset.click(function() { + notify.html(messages.enterTerm); + resultSection.hide(); + activeTab = ""; + fixedTab = false; + resultContainer.empty(); + input.val('').focus(); + setSearchUrl(); + }); + input.prop("disabled", false); + reset.prop("disabled", false); + + var urlParams = new URLSearchParams(window.location.search); + if (urlParams.has("q")) { + input.val(urlParams.get("q")) + } + if (urlParams.has("c")) { + activeTab = urlParams.get("c"); + fixedTab = true; + } + if (urlParams.get("r")) { + feelingLucky = true; + } + if (input.val()) { + doPageSearch(); + } else { + notify.html(messages.enterTerm); + } + input.select().focus(); +}); diff --git a/documentation/0.20.0/javadoc/search.html b/documentation/0.20.0/javadoc/search.html new file mode 100644 index 0000000..23b6d1d --- /dev/null +++ b/documentation/0.20.0/javadoc/search.html @@ -0,0 +1,77 @@ + + + + +Search (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
    + +
    +
    +

    Search

    +
    + + +
    +Additional resources +
    +
    +
    +

    The help page provides an introduction to the scope and syntax of JavaDoc search.

    +

    You can use the <ctrl> or <cmd> keys in combination with the left and right arrow keys to switch between result tabs in this page.

    +

    The URL template below may be used to configure this page as a search engine in browsers that support this feature. It has been tested to work in Google Chrome and Mozilla Firefox. Note that other browsers may not support this feature or require a different URL format.

    +link +

    + +

    +
    +

    Loading search index...

    + +
    +
    +
    + +
    +
    +
    + + diff --git a/documentation/0.20.0/javadoc/search.js b/documentation/0.20.0/javadoc/search.js new file mode 100644 index 0000000..d398670 --- /dev/null +++ b/documentation/0.20.0/javadoc/search.js @@ -0,0 +1,458 @@ +/* + * Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +"use strict"; +const messages = { + enterTerm: "Enter a search term", + noResult: "No results found", + oneResult: "Found one result", + manyResults: "Found {0} results", + loading: "Loading search index...", + searching: "Searching...", + redirecting: "Redirecting to first result...", + linkIcon: "Link icon", + linkToSection: "Link to this section" +} +const categories = { + modules: "Modules", + packages: "Packages", + types: "Classes and Interfaces", + members: "Members", + searchTags: "Search Tags" +}; +const highlight = "$&"; +const NO_MATCH = {}; +const MAX_RESULTS = 300; +function checkUnnamed(name, separator) { + return name === "" || !name ? "" : name + separator; +} +function escapeHtml(str) { + return str.replace(//g, ">"); +} +function getHighlightedText(str, boundaries, from, to) { + var start = from; + var text = ""; + for (var i = 0; i < boundaries.length; i += 2) { + var b0 = boundaries[i]; + var b1 = boundaries[i + 1]; + if (b0 >= to || b1 <= from) { + continue; + } + text += escapeHtml(str.slice(start, Math.max(start, b0))); + text += ""; + text += escapeHtml(str.slice(Math.max(start, b0), Math.min(to, b1))); + text += ""; + start = Math.min(to, b1); + } + text += escapeHtml(str.slice(start, to)); + return text; +} +function getURLPrefix(item, category) { + var urlPrefix = ""; + var slash = "/"; + if (category === "modules") { + return item.l + slash; + } else if (category === "packages" && item.m) { + return item.m + slash; + } else if (category === "types" || category === "members") { + if (item.m) { + urlPrefix = item.m + slash; + } else { + $.each(packageSearchIndex, function(index, it) { + if (it.m && item.p === it.l) { + urlPrefix = it.m + slash; + } + }); + } + } + return urlPrefix; +} +function getURL(item, category) { + if (item.url) { + return item.url; + } + var url = getURLPrefix(item, category); + if (category === "modules") { + url += "module-summary.html"; + } else if (category === "packages") { + if (item.u) { + url = item.u; + } else { + url += item.l.replace(/\./g, '/') + "/package-summary.html"; + } + } else if (category === "types") { + if (item.u) { + url = item.u; + } else { + url += checkUnnamed(item.p, "/").replace(/\./g, '/') + item.l + ".html"; + } + } else if (category === "members") { + url += checkUnnamed(item.p, "/").replace(/\./g, '/') + item.c + ".html" + "#"; + if (item.u) { + url += item.u; + } else { + url += item.l; + } + } else if (category === "searchTags") { + url += item.u; + } + item.url = url; + return url; +} +function createMatcher(term, camelCase) { + if (camelCase && !isUpperCase(term)) { + return null; // no need for camel-case matcher for lower case query + } + var pattern = ""; + var upperCase = []; + term.trim().split(/\s+/).forEach(function(w, index, array) { + var tokens = w.split(/(?=[A-Z,.()<>?[\/])/); + for (var i = 0; i < tokens.length; i++) { + var s = tokens[i]; + // ',' and '?' are the only delimiters commonly followed by space in java signatures + pattern += "(" + $.ui.autocomplete.escapeRegex(s).replace(/[,?]/g, "$&\\s*?") + ")"; + upperCase.push(false); + var isWordToken = /\w$/.test(s); + if (isWordToken) { + if (i === tokens.length - 1 && index < array.length - 1) { + // space in query string matches all delimiters + pattern += "(.*?)"; + upperCase.push(isUpperCase(s[0])); + } else { + if (!camelCase && isUpperCase(s) && s.length === 1) { + pattern += "()"; + } else { + pattern += "([a-z0-9$<>?[\\]]*?)"; + } + upperCase.push(isUpperCase(s[0])); + } + } else { + pattern += "()"; + upperCase.push(false); + } + } + }); + var re = new RegExp(pattern, "gi"); + re.upperCase = upperCase; + return re; +} +function findMatch(matcher, input, startOfName, endOfName) { + var from = startOfName; + matcher.lastIndex = from; + var match = matcher.exec(input); + // Expand search area until we get a valid result or reach the beginning of the string + while (!match || match.index + match[0].length < startOfName || endOfName < match.index) { + if (from === 0) { + return NO_MATCH; + } + from = input.lastIndexOf(".", from - 2) + 1; + matcher.lastIndex = from; + match = matcher.exec(input); + } + var boundaries = []; + var matchEnd = match.index + match[0].length; + var score = 5; + var start = match.index; + var prevEnd = -1; + for (var i = 1; i < match.length; i += 2) { + var isUpper = isUpperCase(input[start]); + var isMatcherUpper = matcher.upperCase[i]; + // capturing groups come in pairs, match and non-match + boundaries.push(start, start + match[i].length); + // make sure groups are anchored on a left word boundary + var prevChar = input[start - 1] || ""; + var nextChar = input[start + 1] || ""; + if (start !== 0 && !/[\W_]/.test(prevChar) && !/[\W_]/.test(input[start])) { + if (isUpper && (isLowerCase(prevChar) || isLowerCase(nextChar))) { + score -= 0.1; + } else if (isMatcherUpper && start === prevEnd) { + score -= isUpper ? 0.1 : 1.0; + } else { + return NO_MATCH; + } + } + prevEnd = start + match[i].length; + start += match[i].length + match[i + 1].length; + + // lower score for parts of the name that are missing + if (match[i + 1] && prevEnd < endOfName) { + score -= rateNoise(match[i + 1]); + } + } + // lower score if a type name contains unmatched camel-case parts + if (input[matchEnd - 1] !== "." && endOfName > matchEnd) + score -= rateNoise(input.slice(matchEnd, endOfName)); + score -= rateNoise(input.slice(0, Math.max(startOfName, match.index))); + + if (score <= 0) { + return NO_MATCH; + } + return { + input: input, + score: score, + boundaries: boundaries + }; +} +function isUpperCase(s) { + return s !== s.toLowerCase(); +} +function isLowerCase(s) { + return s !== s.toUpperCase(); +} +function rateNoise(str) { + return (str.match(/([.(])/g) || []).length / 5 + + (str.match(/([A-Z]+)/g) || []).length / 10 + + str.length / 20; +} +function doSearch(request, response) { + var term = request.term.trim(); + var maxResults = request.maxResults || MAX_RESULTS; + if (term.length === 0) { + return this.close(); + } + var matcher = { + plainMatcher: createMatcher(term, false), + camelCaseMatcher: createMatcher(term, true) + } + var indexLoaded = indexFilesLoaded(); + + function getPrefix(item, category) { + switch (category) { + case "packages": + return checkUnnamed(item.m, "/"); + case "types": + return checkUnnamed(item.p, "."); + case "members": + return checkUnnamed(item.p, ".") + item.c + "."; + default: + return ""; + } + } + function useQualifiedName(category) { + switch (category) { + case "packages": + return /[\s/]/.test(term); + case "types": + case "members": + return /[\s.]/.test(term); + default: + return false; + } + } + function searchIndex(indexArray, category) { + var matches = []; + if (!indexArray) { + if (!indexLoaded) { + matches.push({ l: messages.loading, category: category }); + } + return matches; + } + $.each(indexArray, function (i, item) { + var prefix = getPrefix(item, category); + var simpleName = item.l; + var qualifiedName = prefix + simpleName; + var useQualified = useQualifiedName(category); + var input = useQualified ? qualifiedName : simpleName; + var startOfName = useQualified ? prefix.length : 0; + var endOfName = category === "members" && input.indexOf("(", startOfName) > -1 + ? input.indexOf("(", startOfName) : input.length; + var m = findMatch(matcher.plainMatcher, input, startOfName, endOfName); + if (m === NO_MATCH && matcher.camelCaseMatcher) { + m = findMatch(matcher.camelCaseMatcher, input, startOfName, endOfName); + } + if (m !== NO_MATCH) { + m.indexItem = item; + m.prefix = prefix; + m.category = category; + if (!useQualified) { + m.input = qualifiedName; + m.boundaries = m.boundaries.map(function(b) { + return b + prefix.length; + }); + } + matches.push(m); + } + return true; + }); + return matches.sort(function(e1, e2) { + return e2.score - e1.score; + }).slice(0, maxResults); + } + + var result = searchIndex(moduleSearchIndex, "modules") + .concat(searchIndex(packageSearchIndex, "packages")) + .concat(searchIndex(typeSearchIndex, "types")) + .concat(searchIndex(memberSearchIndex, "members")) + .concat(searchIndex(tagSearchIndex, "searchTags")); + + if (!indexLoaded) { + updateSearchResults = function() { + doSearch(request, response); + } + } else { + updateSearchResults = function() {}; + } + response(result); +} +// JQuery search menu implementation +$.widget("custom.catcomplete", $.ui.autocomplete, { + _create: function() { + this._super(); + this.widget().menu("option", "items", "> .result-item"); + // workaround for search result scrolling + this.menu._scrollIntoView = function _scrollIntoView( item ) { + var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight; + if ( this._hasScroll() ) { + borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0; + paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0; + offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop; + scroll = this.activeMenu.scrollTop(); + elementHeight = this.activeMenu.height() - 26; + itemHeight = item.outerHeight(); + + if ( offset < 0 ) { + this.activeMenu.scrollTop( scroll + offset ); + } else if ( offset + itemHeight > elementHeight ) { + this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight ); + } + } + }; + }, + _renderMenu: function(ul, items) { + var currentCategory = ""; + var widget = this; + widget.menu.bindings = $(); + $.each(items, function(index, item) { + if (item.category && item.category !== currentCategory) { + ul.append("
  • " + categories[item.category] + "
  • "); + currentCategory = item.category; + } + var li = widget._renderItemData(ul, item); + if (item.category) { + li.attr("aria-label", categories[item.category] + " : " + item.l); + } else { + li.attr("aria-label", item.l); + } + li.attr("class", "result-item"); + }); + ul.append(""); + }, + _renderItem: function(ul, item) { + var li = $("
  • ").appendTo(ul); + var div = $("
    ").appendTo(li); + var label = item.l + ? item.l + : getHighlightedText(item.input, item.boundaries, 0, item.input.length); + var idx = item.indexItem; + if (item.category === "searchTags" && idx && idx.h) { + if (idx.d) { + div.html(label + " (" + idx.h + ")
    " + + idx.d + "
    "); + } else { + div.html(label + " (" + idx.h + ")"); + } + } else { + div.html(label); + } + return li; + } +}); +$(function() { + var expanded = false; + var windowWidth; + function collapse() { + if (expanded) { + $("div#navbar-top").removeAttr("style"); + $("button#navbar-toggle-button") + .removeClass("expanded") + .attr("aria-expanded", "false"); + expanded = false; + } + } + $("button#navbar-toggle-button").click(function (e) { + if (expanded) { + collapse(); + } else { + var navbar = $("div#navbar-top"); + navbar.height(navbar.prop("scrollHeight")); + $("button#navbar-toggle-button") + .addClass("expanded") + .attr("aria-expanded", "true"); + expanded = true; + windowWidth = window.innerWidth; + } + }); + $("ul.sub-nav-list-small li a").click(collapse); + $("input#search-input").focus(collapse); + $("main").click(collapse); + $("section[id] > :header, :header[id], :header:has(a[id])").each(function(idx, el) { + // Create anchor links for headers with an associated id attribute + var hdr = $(el); + var id = hdr.attr("id") || hdr.parent("section").attr("id") || hdr.children("a").attr("id"); + if (id) { + hdr.append(" " + messages.linkIcon +""); + } + }); + $(window).on("orientationchange", collapse).on("resize", function(e) { + if (expanded && windowWidth !== window.innerWidth) collapse(); + }); + var search = $("#search-input"); + var reset = $("#reset-button"); + search.catcomplete({ + minLength: 1, + delay: 200, + source: doSearch, + response: function(event, ui) { + if (!ui.content.length) { + ui.content.push({ l: messages.noResult }); + } else { + $("#search-input").empty(); + } + }, + autoFocus: true, + focus: function(event, ui) { + return false; + }, + position: { + collision: "flip" + }, + select: function(event, ui) { + if (ui.item.indexItem) { + var url = getURL(ui.item.indexItem, ui.item.category); + window.location.href = pathtoroot + url; + $("#search-input").focus(); + } + } + }); + search.val(''); + search.prop("disabled", false); + reset.prop("disabled", false); + reset.click(function() { + search.val('').focus(); + }); + search.focus(); +}); diff --git a/documentation/0.20.0/javadoc/serialized-form.html b/documentation/0.20.0/javadoc/serialized-form.html new file mode 100644 index 0000000..631cb6f --- /dev/null +++ b/documentation/0.20.0/javadoc/serialized-form.html @@ -0,0 +1,205 @@ + + + + +Serialized Form (Kroxylicious API Javadoc 0.20.0 API) + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Serialized Form

    +
    + +
    +
    +
    + +
    +
    +
    + + diff --git a/documentation/0.20.0/javadoc/stylesheet.css b/documentation/0.20.0/javadoc/stylesheet.css new file mode 100644 index 0000000..f71489f --- /dev/null +++ b/documentation/0.20.0/javadoc/stylesheet.css @@ -0,0 +1,1272 @@ +/* + * Javadoc style sheet + */ + +@import url('resources/fonts/dejavu.css'); + +/* + * These CSS custom properties (variables) define the core color and font + * properties used in this stylesheet. + */ +:root { + /* body, block and code fonts */ + --body-font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif; + --block-font-family: 'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + --code-font-family: 'DejaVu Sans Mono', monospace; + /* Base font sizes for body and code elements */ + --body-font-size: 14px; + --code-font-size: 14px; + /* Text colors for body and block elements */ + --body-text-color: #353833; + --block-text-color: #474747; + /* Background colors for various structural elements */ + --body-background-color: #ffffff; + --section-background-color: #f8f8f8; + --detail-background-color: #ffffff; + /* Colors for navigation bar and table captions */ + --navbar-background-color: #4D7A97; + --navbar-text-color: #ffffff; + /* Background color for subnavigation and various headers */ + --subnav-background-color: #dee3e9; + /* Background and text colors for selected tabs and navigation items */ + --selected-background-color: #f8981d; + --selected-text-color: #253441; + --selected-link-color: #1f389c; + /* Background colors for generated tables */ + --even-row-color: #ffffff; + --odd-row-color: #eeeeef; + /* Text color for page title */ + --title-color: #2c4557; + /* Text colors for links */ + --link-color: #4A6782; + --link-color-active: #bb7a2a; + /* Snippet colors */ + --snippet-background-color: #ebecee; + --snippet-text-color: var(--block-text-color); + --snippet-highlight-color: #f7c590; + /* Border colors for structural elements and user defined tables */ + --border-color: #ededed; + --table-border-color: #000000; + /* Search input colors */ + --search-input-background-color: #ffffff; + --search-input-text-color: #000000; + --search-input-placeholder-color: #909090; + /* Highlight color for active search tag target */ + --search-tag-highlight-color: #ffff00; + /* Adjustments for icon and active background colors of copy-to-clipboard buttons */ + --copy-icon-brightness: 100%; + --copy-button-background-color-active: rgba(168, 168, 176, 0.3); + /* Colors for invalid tag notifications */ + --invalid-tag-background-color: #ffe6e6; + --invalid-tag-text-color: #000000; +} +/* + * Styles for individual HTML elements. + * + * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular + * HTML element throughout the page. + */ +body { + background-color:var(--body-background-color); + color:var(--body-text-color); + font-family:var(--body-font-family); + font-size:var(--body-font-size); + margin:0; + padding:0; + height:100%; + width:100%; +} +iframe { + margin:0; + padding:0; + height:100%; + width:100%; + overflow-y:scroll; + border:none; +} +a:link, a:visited { + text-decoration:none; + color:var(--link-color); +} +a[href]:hover, a[href]:focus { + text-decoration:none; + color:var(--link-color-active); +} +pre { + font-family:var(--code-font-family); + font-size:1em; +} +h1 { + font-size:1.428em; +} +h2 { + font-size:1.285em; +} +h3 { + font-size:1.14em; +} +h4 { + font-size:1.072em; +} +h5 { + font-size:1.001em; +} +h6 { + font-size:0.93em; +} +/* Disable font boosting for selected elements */ +h1, h2, h3, h4, h5, h6, div.member-signature { + max-height: 1000em; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:var(--code-font-family); +} +:not(h1, h2, h3, h4, h5, h6) > code, +:not(h1, h2, h3, h4, h5, h6) > tt { + font-size:var(--code-font-size); + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:var(--code-font-family); + font-size:1em; + padding-top:4px; +} +.summary-table dt code { + font-family:var(--code-font-family); + font-size:1em; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +button { + font-family: var(--body-font-family); + font-size: 1em; +} +/* + * Styles for HTML generated by javadoc. + * + * These are style classes that are used by the standard doclet to generate HTML documentation. + */ + +/* + * Styles for document title and copyright. + */ +.about-language { + float:right; + padding:0 21px 8px 8px; + font-size:0.915em; + margin-top:-9px; + height:2.9em; +} +.legal-copy { + margin-left:.5em; +} +/* + * Styles for navigation bar. + */ +@media screen { + div.flex-box { + position:fixed; + display:flex; + flex-direction:column; + height: 100%; + width: 100%; + } + header.flex-header { + flex: 0 0 auto; + } + div.flex-content { + flex: 1 1 auto; + overflow-y: auto; + } +} +.top-nav { + background-color:var(--navbar-background-color); + color:var(--navbar-text-color); + float:left; + width:100%; + clear:right; + min-height:2.8em; + padding:10px 0 0 0; + overflow:hidden; + font-size:0.857em; +} +button#navbar-toggle-button { + display:none; +} +ul.sub-nav-list-small { + display: none; +} +.sub-nav { + background-color:var(--subnav-background-color); + float:left; + width:100%; + overflow:hidden; + font-size:0.857em; +} +.sub-nav div { + clear:left; + float:left; + padding:6px; + text-transform:uppercase; +} +.sub-nav .sub-nav-list { + padding-top:4px; +} +ul.nav-list { + display:block; + margin:0 25px 0 0; + padding:0; +} +ul.sub-nav-list { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.nav-list li { + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +.sub-nav .nav-list-search { + float:right; + margin:0; + padding:6px; + clear:none; + text-align:right; + position:relative; +} +ul.sub-nav-list li { + list-style:none; + float:left; +} +.top-nav a:link, .top-nav a:active, .top-nav a:visited { + color:var(--navbar-text-color); + text-decoration:none; + text-transform:uppercase; +} +.top-nav a:hover { + color:var(--link-color-active); +} +.nav-bar-cell1-rev { + background-color:var(--selected-background-color); + color:var(--selected-text-color); + margin: auto 5px; +} +.skip-nav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* + * Hide navigation links and search box in print layout + */ +@media print { + ul.nav-list, div.sub-nav { + display:none; + } +} +/* + * Styles for page header. + */ +.title { + color:var(--title-color); + margin:10px 0; +} +.sub-title { + margin:5px 0 0 0; +} +ul.contents-list { + margin: 0 0 15px 0; + padding: 0; + list-style: none; +} +ul.contents-list li { + font-size:0.93em; +} +/* + * Styles for headings. + */ +body.class-declaration-page .summary h2, +body.class-declaration-page .details h2, +body.class-use-page h2, +body.module-declaration-page .block-list h2 { + font-style: italic; + padding:0; + margin:15px 0; +} +body.class-declaration-page .summary h3, +body.class-declaration-page .details h3, +body.class-declaration-page .summary .inherited-list h2 { + background-color:var(--subnav-background-color); + border:1px solid var(--border-color); + margin:0 0 6px -8px; + padding:7px 5px; +} +/* + * Styles for page layout containers. + */ +main { + clear:both; + padding:10px 20px; + position:relative; +} +dl.notes > dt { + font-family: var(--body-font-family); + font-size:0.856em; + font-weight:bold; + margin:10px 0 0 0; + color:var(--body-text-color); +} +dl.notes > dd { + margin:5px 10px 10px 0; + font-size:1em; + font-family:var(--block-font-family) +} +dl.name-value > dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +dl.name-value > dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* + * Styles for lists. + */ +li.circle { + list-style:circle; +} +ul.horizontal li { + display:inline; + font-size:0.9em; +} +div.inheritance { + margin:0; + padding:0; +} +div.inheritance div.inheritance { + margin-left:2em; +} +ul.block-list, +ul.details-list, +ul.member-list, +ul.summary-list { + margin:10px 0 10px 0; + padding:0; +} +ul.block-list > li, +ul.details-list > li, +ul.member-list > li, +ul.summary-list > li { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.ref-list { + padding:0; + margin:0; +} +ul.ref-list > li { + list-style:none; +} +.summary-table dl, .summary-table dl dt, .summary-table dl dd { + margin-top:0; + margin-bottom:1px; +} +ul.tag-list, ul.tag-list-long { + padding-left: 0; + list-style: none; +} +ul.tag-list li { + display: inline; +} +ul.tag-list li:not(:last-child):after, +ul.tag-list-long li:not(:last-child):after +{ + content: ", "; + white-space: pre-wrap; +} +ul.preview-feature-list { + list-style: none; + margin:0; + padding:0.1em; + line-height: 1.6em; +} +/* + * Styles for tables. + */ +.summary-table, .details-table { + width:100%; + border-spacing:0; + border:1px solid var(--border-color); + border-top:0; + padding:0; +} +.caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:var(--selected-text-color); + clear:none; + overflow:hidden; + padding: 10px 0 0 1px; + margin:0; +} +.caption a:link, .caption a:visited { + color:var(--selected-link-color); +} +.caption a:hover, +.caption a:active { + color:var(--navbar-text-color); +} +.caption span { + font-weight:bold; + white-space:nowrap; + padding:5px 12px 7px 12px; + display:inline-block; + float:left; + background-color:var(--selected-background-color); + border: none; + height:16px; +} +div.table-tabs { + padding:10px 0 0 1px; + margin:10px 0 0 0; +} +div.table-tabs > button { + border: none; + cursor: pointer; + padding: 5px 12px 7px 12px; + font-weight: bold; + margin-right: 8px; +} +div.table-tabs > .active-table-tab { + background: var(--selected-background-color); + color: var(--selected-text-color); +} +div.table-tabs > button.table-tab { + background: var(--navbar-background-color); + color: var(--navbar-text-color); +} +.two-column-search-results { + display: grid; + grid-template-columns: minmax(400px, max-content) minmax(400px, auto); +} +div.checkboxes { + line-height: 2em; +} +div.checkboxes > span { + margin-left: 10px; +} +div.checkboxes > label { + margin-left: 8px; + white-space: nowrap; +} +div.checkboxes > label > input { + margin: 0 2px; +} +.two-column-summary { + display: grid; + grid-template-columns: minmax(25%, max-content) minmax(25%, auto); +} +.three-column-summary { + display: grid; + grid-template-columns: minmax(15%, max-content) minmax(20%, max-content) minmax(20%, auto); +} +.three-column-release-summary { + display: grid; + grid-template-columns: minmax(40%, max-content) minmax(10%, max-content) minmax(40%, auto); +} +.four-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(15%, max-content) minmax(15%, max-content) minmax(15%, auto); +} +@media screen and (max-width: 1000px) { + .four-column-summary { + display: grid; + grid-template-columns: minmax(15%, max-content) minmax(15%, auto); + } +} +@media screen and (max-width: 800px) { + .two-column-search-results { + display: grid; + grid-template-columns: minmax(40%, max-content) minmax(40%, auto); + } + .three-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(25%, auto); + } + .three-column-release-summary { + display: grid; + grid-template-columns: minmax(70%, max-content) minmax(30%, max-content) + } + .three-column-summary .col-last, + .three-column-release-summary .col-last{ + grid-column-end: span 2; + } +} +@media screen and (max-width: 600px) { + .two-column-summary { + display: grid; + grid-template-columns: 1fr; + } +} +.summary-table > div, .details-table > div { + text-align:left; + padding: 8px 3px 3px 7px; + overflow-x: auto; + scrollbar-width: thin; +} +.col-first, .col-second, .col-last, .col-constructor-name, .col-summary-item-name { + vertical-align:top; + padding-right:0; + padding-top:8px; + padding-bottom:3px; +} +.table-header { + background:var(--subnav-background-color); + font-weight: bold; +} +/* Sortable table columns */ +.table-header[onclick] { + cursor: pointer; +} +.table-header[onclick]::after { + content:""; + display:inline-block; + background-image:url('data:image/svg+xml; utf8, \ + \ + '); + background-size:100% 100%; + width:9px; + height:14px; + margin-left:4px; + margin-bottom:-3px; +} +.table-header[onclick].sort-asc::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); + +} +.table-header[onclick].sort-desc::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); +} +.col-first, .col-first { + font-size:0.93em; +} +.col-second, .col-second, .col-last, .col-constructor-name, .col-summary-item-name, .col-last { + font-size:0.93em; +} +.col-first, .col-second, .col-constructor-name { + vertical-align:top; + overflow: auto; +} +.col-last { + white-space:normal; +} +.col-first a:link, .col-first a:visited, +.col-second a:link, .col-second a:visited, +.col-first a:link, .col-first a:visited, +.col-second a:link, .col-second a:visited, +.col-constructor-name a:link, .col-constructor-name a:visited, +.col-summary-item-name a:link, .col-summary-item-name a:visited { + font-weight:bold; +} +.even-row-color, .even-row-color .table-header { + background-color:var(--even-row-color); +} +.odd-row-color, .odd-row-color .table-header { + background-color:var(--odd-row-color); +} +/* + * Styles for contents. + */ +div.block { + font-size:var(--body-font-size); + font-family:var(--block-font-family); +} +.col-last div { + padding-top:0; +} +.col-last a { + padding-bottom:3px; +} +.module-signature, +.package-signature, +.type-signature, +.member-signature { + font-family:var(--code-font-family); + font-size:1em; + margin:14px 0; + white-space: pre-wrap; +} +.module-signature, +.package-signature, +.type-signature { + margin-top: 0; +} +.member-signature .type-parameters-long, +.member-signature .parameters, +.member-signature .exceptions { + display: inline-block; + vertical-align: top; + white-space: pre; +} +.member-signature .type-parameters { + white-space: normal; +} +/* + * Styles for formatting effect. + */ +.source-line-no { + /* Color of line numbers in source pages can be set via custom property below */ + color:var(--source-linenumber-color, green); + padding:0 30px 0 0; +} +.block { + display:block; + margin:0 10px 5px 0; + color:var(--block-text-color); +} +.deprecated-label, .description-from-type-label, .implementation-label, .member-name-link, +.module-label-in-package, .module-label-in-type, .package-label-in-type, +.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link, .preview-label { + font-weight:bold; +} +.deprecation-comment, .help-footnote, .preview-comment { + font-style:italic; +} +.deprecation-block { + font-size:1em; + font-family:var(--block-font-family); + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +.preview-block { + font-size:1em; + font-family:var(--block-font-family); + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +div.block div.deprecation-comment { + font-style:normal; +} +details.invalid-tag, span.invalid-tag { + font-size:1em; + font-family:var(--block-font-family); + color: var(--invalid-tag-text-color); + background: var(--invalid-tag-background-color); + border: thin solid var(--table-border-color); + border-radius:2px; + padding: 2px 4px; + display:inline-block; +} +details summary { + cursor: pointer; +} +/* + * Styles specific to HTML5 elements. + */ +main, nav, header, footer, section { + display:block; +} +/* + * Styles for javadoc search. + */ +.ui-state-active { + /* Overrides the color of selection used in jQuery UI */ + background: var(--selected-background-color); + border: 1px solid var(--selected-background-color); + color: var(--selected-text-color); +} +.ui-autocomplete-category { + font-weight:bold; + font-size:15px; + padding:7px 0 7px 3px; + background-color:var(--navbar-background-color); + color:var(--navbar-text-color); +} +.ui-autocomplete { + max-height:85%; + max-width:65%; + overflow-y:auto; + overflow-x:auto; + scrollbar-width: thin; + white-space:nowrap; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} +ul.ui-autocomplete { + position:fixed; + z-index:1; + background-color: var(--body-background-color); +} +ul.ui-autocomplete li { + float:left; + clear:both; + min-width:100%; +} +ul.ui-autocomplete li.ui-static-link { + position:sticky; + bottom:0; + left:0; + background: var(--subnav-background-color); + padding: 5px 0; + font-family: var(--body-font-family); + font-size: 0.93em; + font-weight: bolder; + z-index: 2; +} +li.ui-static-link a, li.ui-static-link a:visited { + text-decoration:none; + color:var(--link-color); + float:right; + margin-right:20px; +} +.ui-autocomplete .result-item { + font-size: inherit; +} +.ui-autocomplete .result-highlight { + font-weight:bold; +} +#search-input, #page-search-input { + background-image:url('resources/glass.png'); + background-size:13px; + background-repeat:no-repeat; + background-position:2px 3px; + background-color: var(--search-input-background-color); + color: var(--search-input-text-color); + border-color: var(--border-color); + padding-left:20px; + width: 250px; + margin: 0; +} +#search-input { + margin-left: 4px; +} +#reset-button { + background-color: transparent; + background-image:url('resources/x.png'); + background-repeat:no-repeat; + background-size:contain; + border:0; + border-radius:0; + width:12px; + height:12px; + position:absolute; + right:12px; + top:10px; + font-size:0; +} +::placeholder { + color:var(--search-input-placeholder-color); + opacity: 1; +} +.search-tag-desc-result { + font-style:italic; + font-size:11px; +} +.search-tag-holder-result { + font-style:italic; + font-size:12px; +} +.search-tag-result:target { + background-color:var(--search-tag-highlight-color); +} +details.page-search-details { + display: inline-block; +} +div#result-container { + font-size: 1em; +} +div#result-container a.search-result-link { + padding: 0; + margin: 4px 0; + width: 100%; +} +#result-container .result-highlight { + font-weight:bolder; +} +.page-search-info { + background-color: var(--subnav-background-color); + border-radius: 3px; + border: 0 solid var(--border-color); + padding: 0 8px; + overflow: hidden; + height: 0; + transition: all 0.2s ease; +} +div.table-tabs > button.table-tab { + background: var(--navbar-background-color); + color: var(--navbar-text-color); +} +.page-search-header { + padding: 5px 12px 7px 12px; + font-weight: bold; + margin-right: 3px; + background-color:var(--navbar-background-color); + color:var(--navbar-text-color); + display: inline-block; +} +button.page-search-header { + border: none; + cursor: pointer; +} +span#page-search-link { + text-decoration: underline; +} +.module-graph span, .sealed-graph span { + display:none; + position:absolute; +} +.module-graph:hover span, .sealed-graph:hover span { + display:block; + margin: -100px 0 0 100px; + z-index: 1; +} +.inherited-list { + margin: 10px 0 10px 0; +} +section.class-description { + line-height: 1.4; +} +.summary section[class$="-summary"], .details section[class$="-details"], +.class-uses .detail, .serialized-class-details { + padding: 0 20px 5px 10px; + border: 1px solid var(--border-color); + background-color: var(--section-background-color); +} +.inherited-list, section[class$="-details"] .detail { + padding:0 0 5px 8px; + background-color:var(--detail-background-color); + border:none; +} +.vertical-separator { + padding: 0 5px; +} +ul.help-section-list { + margin: 0; +} +ul.help-subtoc > li { + display: inline-block; + padding-right: 5px; + font-size: smaller; +} +ul.help-subtoc > li::before { + content: "\2022" ; + padding-right:2px; +} +.help-note { + font-style: italic; +} +/* + * Indicator icon for external links. + */ +main a[href*="://"]::after { + content:""; + display:inline-block; + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); + background-size:100% 100%; + width:7px; + height:7px; + margin-left:2px; + margin-bottom:4px; +} +main a[href*="://"]:hover::after, +main a[href*="://"]:focus::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); +} +/* + * Styles for header/section anchor links + */ +a.anchor-link { + opacity: 0; + transition: opacity 0.1s; +} +:hover > a.anchor-link { + opacity: 80%; +} +a.anchor-link:hover, +a.anchor-link:focus-visible, +a.anchor-link.visible { + opacity: 100%; +} +a.anchor-link > img { + width: 0.9em; + height: 0.9em; +} +/* + * Styles for copy-to-clipboard buttons + */ +button.copy { + opacity: 70%; + border: none; + border-radius: 3px; + position: relative; + background:none; + transition: opacity 0.3s; + cursor: pointer; +} +:hover > button.copy { + opacity: 80%; +} +button.copy:hover, +button.copy:active, +button.copy:focus-visible, +button.copy.visible { + opacity: 100%; +} +button.copy img { + position: relative; + background: none; + filter: brightness(var(--copy-icon-brightness)); +} +button.copy:active { + background-color: var(--copy-button-background-color-active); +} +button.copy span { + color: var(--body-text-color); + position: relative; + top: -0.1em; + transition: all 0.1s; + font-size: 0.76rem; + line-height: 1.2em; + opacity: 0; +} +button.copy:hover span, +button.copy:focus-visible span, +button.copy.visible span { + opacity: 100%; +} +/* search page copy button */ +button#page-search-copy { + margin-left: 0.4em; + padding:0.3em; + top:0.13em; +} +button#page-search-copy img { + width: 1.2em; + height: 1.2em; + padding: 0.01em 0; + top: 0.15em; +} +button#page-search-copy span { + color: var(--body-text-color); + line-height: 1.2em; + padding: 0.2em; + top: -0.18em; +} +div.page-search-info:hover button#page-search-copy span { + opacity: 100%; +} +/* snippet copy button */ +button.snippet-copy { + position: absolute; + top: 6px; + right: 6px; + height: 1.7em; + padding: 2px; +} +button.snippet-copy img { + width: 18px; + height: 18px; + padding: 0.05em 0; +} +button.snippet-copy span { + line-height: 1.2em; + padding: 0.2em; + position: relative; + top: -0.5em; +} +div.snippet-container:hover button.snippet-copy span { + opacity: 100%; +} +/* + * Styles for user-provided tables. + * + * borderless: + * No borders, vertical margins, styled caption. + * This style is provided for use with existing doc comments. + * In general, borderless tables should not be used for layout purposes. + * + * plain: + * Plain borders around table and cells, vertical margins, styled caption. + * Best for small tables or for complex tables for tables with cells that span + * rows and columns, when the "striped" style does not work well. + * + * striped: + * Borders around the table and vertical borders between cells, striped rows, + * vertical margins, styled caption. + * Best for tables that have a header row, and a body containing a series of simple rows. + */ + +table.borderless, +table.plain, +table.striped { + margin-top: 10px; + margin-bottom: 10px; +} +table.borderless > caption, +table.plain > caption, +table.striped > caption { + font-weight: bold; + font-size: smaller; +} +table.borderless th, table.borderless td, +table.plain th, table.plain td, +table.striped th, table.striped td { + padding: 2px 5px; +} +table.borderless, +table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th, +table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td { + border: none; +} +table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr { + background-color: transparent; +} +table.plain { + border-collapse: collapse; + border: 1px solid var(--table-border-color); +} +table.plain > thead > tr, table.plain > tbody tr, table.plain > tr { + background-color: transparent; +} +table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th, +table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td { + border: 1px solid var(--table-border-color); +} +table.striped { + border-collapse: collapse; + border: 1px solid var(--table-border-color); +} +table.striped > thead { + background-color: var(--subnav-background-color); +} +table.striped > thead > tr > th, table.striped > thead > tr > td { + border: 1px solid var(--table-border-color); +} +table.striped > tbody > tr:nth-child(even) { + background-color: var(--odd-row-color) +} +table.striped > tbody > tr:nth-child(odd) { + background-color: var(--even-row-color) +} +table.striped > tbody > tr > th, table.striped > tbody > tr > td { + border-left: 1px solid var(--table-border-color); + border-right: 1px solid var(--table-border-color); +} +table.striped > tbody > tr > th { + font-weight: normal; +} +/** + * Tweak style for small screens. + */ +@media screen and (max-width: 920px) { + header.flex-header { + max-height: 100vh; + overflow-y: auto; + } + div#navbar-top { + height: 2.8em; + transition: height 0.35s ease; + } + ul.nav-list { + display: block; + width: 40%; + float:left; + clear: left; + margin: 10px 0 0 0; + padding: 0; + } + ul.nav-list li { + float: none; + padding: 6px; + margin-left: 10px; + margin-top: 2px; + } + ul.sub-nav-list-small { + display:block; + height: 100%; + width: 50%; + float: right; + clear: right; + background-color: var(--subnav-background-color); + color: var(--body-text-color); + margin: 6px 0 0 0; + padding: 0; + } + ul.sub-nav-list-small ul { + padding-left: 20px; + } + ul.sub-nav-list-small a:link, ul.sub-nav-list-small a:visited { + color:var(--link-color); + } + ul.sub-nav-list-small a:hover { + color:var(--link-color-active); + } + ul.sub-nav-list-small li { + list-style:none; + float:none; + padding: 6px; + margin-top: 1px; + text-transform:uppercase; + } + ul.sub-nav-list-small > li { + margin-left: 10px; + } + ul.sub-nav-list-small li p { + margin: 5px 0; + } + div#navbar-sub-list { + display: none; + } + .top-nav a:link, .top-nav a:active, .top-nav a:visited { + display: block; + } + button#navbar-toggle-button { + width: 3.4em; + height: 2.8em; + background-color: transparent; + display: block; + float: left; + border: 0; + margin: 0 10px; + cursor: pointer; + font-size: 10px; + } + button#navbar-toggle-button .nav-bar-toggle-icon { + display: block; + width: 24px; + height: 3px; + margin: 1px 0 4px 0; + border-radius: 2px; + transition: all 0.1s; + background-color: var(--navbar-text-color); + } + button#navbar-toggle-button.expanded span.nav-bar-toggle-icon:nth-child(1) { + transform: rotate(45deg); + transform-origin: 10% 10%; + width: 26px; + } + button#navbar-toggle-button.expanded span.nav-bar-toggle-icon:nth-child(2) { + opacity: 0; + } + button#navbar-toggle-button.expanded span.nav-bar-toggle-icon:nth-child(3) { + transform: rotate(-45deg); + transform-origin: 10% 90%; + width: 26px; + } +} +@media screen and (max-width: 800px) { + .about-language { + padding-right: 16px; + } + ul.nav-list li { + margin-left: 5px; + } + ul.sub-nav-list-small > li { + margin-left: 5px; + } + main { + padding: 10px; + } + .summary section[class$="-summary"], .details section[class$="-details"], + .class-uses .detail, .serialized-class-details { + padding: 0 8px 5px 8px; + } + body { + -webkit-text-size-adjust: none; + } +} +@media screen and (max-width: 400px) { + .about-language { + font-size: 10px; + padding-right: 12px; + } +} +@media screen and (max-width: 400px) { + .nav-list-search { + width: 94%; + } + #search-input, #page-search-input { + width: 70%; + } +} +@media screen and (max-width: 320px) { + .nav-list-search > label { + display: none; + } + .nav-list-search { + width: 90%; + } + #search-input, #page-search-input { + width: 80%; + } +} + +pre.snippet { + background-color: var(--snippet-background-color); + color: var(--snippet-text-color); + padding: 10px; + margin: 12px 0; + overflow: auto; + white-space: pre; +} +div.snippet-container { + position: relative; +} +@media screen and (max-width: 800px) { + pre.snippet { + padding-top: 26px; + } + button.snippet-copy { + top: 4px; + right: 4px; + } +} +pre.snippet .italic { + font-style: italic; +} +pre.snippet .bold { + font-weight: bold; +} +pre.snippet .highlighted { + background-color: var(--snippet-highlight-color); + border-radius: 10%; +} diff --git a/documentation/0.20.0/javadoc/tag-search-index.js b/documentation/0.20.0/javadoc/tag-search-index.js new file mode 100644 index 0000000..b6c2358 --- /dev/null +++ b/documentation/0.20.0/javadoc/tag-search-index.js @@ -0,0 +1 @@ +tagSearchIndex = [{"l":"Chained Computation stages","h":"io.kroxylicious.proxy.filter.FilterContext.sendRequest(RequestHeaderData, ApiMessage)","d":"Section","u":"io/kroxylicious/proxy/filter/FilterContext.html#chained-computation-stages-heading"},{"l":"Chained Computation stages","h":"io.kroxylicious.proxy.filter.FilterContext.topicNames(Collection)","d":"Section","u":"io/kroxylicious/proxy/filter/FilterContext.html#chained-computation-stages-heading1"},{"l":"Constant Field Values","h":"","u":"constant-values.html"},{"l":"Creating Filter Result objects","h":"package io.kroxylicious.proxy.filter","d":"Section","u":"io/kroxylicious/proxy/filter/package-summary.html#implementing.createFilterResults"},{"l":"Deferring Forwards","h":"package io.kroxylicious.proxy.filter","d":"Section","u":"io/kroxylicious/proxy/filter/package-summary.html#implementing.deferringForward"},{"l":"Filtering","h":"io.kroxylicious.proxy.filter.FilterContext.sendRequest(RequestHeaderData, ApiMessage)","d":"Section","u":"io/kroxylicious/proxy/filter/FilterContext.html#filtering-heading"},{"l":"Filter Results","h":"package io.kroxylicious.proxy.filter","d":"Section","u":"io/kroxylicious/proxy/filter/package-summary.html#implementing.filterResults"},{"l":"Header","h":"io.kroxylicious.proxy.filter.FilterContext.sendRequest(RequestHeaderData, ApiMessage)","d":"Section","u":"io/kroxylicious/proxy/filter/FilterContext.html#header-heading"},{"l":"Implementing a plugin","h":"package io.kroxylicious.proxy.plugin","d":"Section","u":"io/kroxylicious/proxy/plugin/package-summary.html#implementing-a-plugin-heading"},{"l":"Implementing Filters","h":"package io.kroxylicious.proxy.filter","d":"Section","u":"io/kroxylicious/proxy/filter/package-summary.html#implementing"},{"l":"Important facts about the Kafka protocol","h":"package io.kroxylicious.proxy.filter","d":"Section","u":"io/kroxylicious/proxy/filter/package-summary.html#assumptions"},{"l":"Local view","h":"package io.kroxylicious.proxy.filter","d":"Section","u":"io/kroxylicious/proxy/filter/package-summary.html#local_view"},{"l":"Ordering","h":"package io.kroxylicious.proxy.filter","d":"Section","u":"io/kroxylicious/proxy/filter/package-summary.html#ordering"},{"l":"Pipelining","h":"package io.kroxylicious.proxy.filter","d":"Section","u":"io/kroxylicious/proxy/filter/package-summary.html#pipelining"},{"l":"Serialized Form","h":"","u":"serialized-form.html"},{"l":"Terminology","h":"package io.kroxylicious.proxy.plugin","d":"Section","u":"io/kroxylicious/proxy/plugin/package-summary.html#terminology-heading"},{"l":"Thread Safety","h":"package io.kroxylicious.proxy.filter","d":"Section","u":"io/kroxylicious/proxy/filter/package-summary.html#implementing.threadSafety"},{"l":"Using a plugin implementation","h":"package io.kroxylicious.proxy.plugin","d":"Section","u":"io/kroxylicious/proxy/plugin/package-summary.html#using-a-plugin-implementation-heading"}];updateSearchResults(); \ No newline at end of file diff --git a/documentation/0.20.0/javadoc/type-search-index.js b/documentation/0.20.0/javadoc/type-search-index.js new file mode 100644 index 0000000..8f5fdc6 --- /dev/null +++ b/documentation/0.20.0/javadoc/type-search-index.js @@ -0,0 +1 @@ +typeSearchIndex = [{"p":"io.kroxylicious.authorizer.service","l":"Action"},{"p":"io.kroxylicious.proxy.filter","l":"AddOffsetsToTxnRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AddOffsetsToTxnResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AddPartitionsToTxnRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AddPartitionsToTxnResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AddRaftVoterRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AddRaftVoterResponseFilter"},{"l":"All Classes and Interfaces","u":"allclasses-index.html"},{"p":"io.kroxylicious.proxy.filter","l":"AllocateProducerIdsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AllocateProducerIdsResponseFilter"},{"p":"io.kroxylicious.proxy.config.tls","l":"AllowDeny"},{"p":"io.kroxylicious.proxy.filter","l":"AlterClientQuotasRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AlterClientQuotasResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AlterConfigsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AlterConfigsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AlterPartitionReassignmentsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AlterPartitionReassignmentsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AlterPartitionRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AlterPartitionResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AlterReplicaLogDirsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AlterReplicaLogDirsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AlterShareGroupOffsetsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AlterShareGroupOffsetsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AlterUserScramCredentialsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AlterUserScramCredentialsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ApiVersionsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ApiVersionsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AssignReplicasToDirsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"AssignReplicasToDirsResponseFilter"},{"p":"io.kroxylicious.authorizer.service","l":"Authorizer"},{"p":"io.kroxylicious.authorizer.service","l":"AuthorizeResult"},{"p":"io.kroxylicious.authorizer.service","l":"AuthorizerException"},{"p":"io.kroxylicious.authorizer.service","l":"AuthorizerService"},{"p":"io.kroxylicious.proxy.filter","l":"BeginQuorumEpochRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"BeginQuorumEpochResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"BrokerHeartbeatRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"BrokerHeartbeatResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"BrokerRegistrationRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"BrokerRegistrationResponseFilter"},{"p":"io.kroxylicious.proxy.authentication","l":"ClientSaslContext"},{"p":"io.kroxylicious.proxy.tls","l":"ClientTlsContext"},{"p":"io.kroxylicious.proxy.filter.filterresultbuilder","l":"CloseOrTerminalStage"},{"p":"io.kroxylicious.proxy.filter.filterresultbuilder","l":"CloseStage"},{"p":"io.kroxylicious.proxy.filter","l":"ConsumerGroupDescribeRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ConsumerGroupDescribeResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ConsumerGroupHeartbeatRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ConsumerGroupHeartbeatResponseFilter"},{"p":"io.kroxylicious.proxy.authentication","l":"SaslSubjectBuilder.Context"},{"p":"io.kroxylicious.proxy.authentication","l":"TransportSubjectBuilder.Context"},{"p":"io.kroxylicious.proxy.filter","l":"ControllerRegistrationRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ControllerRegistrationResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"CreateAclsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"CreateAclsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"CreateDelegationTokenRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"CreateDelegationTokenResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"CreatePartitionsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"CreatePartitionsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"CreateTopicsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"CreateTopicsResponseFilter"},{"p":"io.kroxylicious.authorizer.service","l":"Decision"},{"p":"io.kroxylicious.kms.service","l":"DekPair"},{"p":"io.kroxylicious.proxy.filter","l":"DeleteAclsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DeleteAclsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DeleteGroupsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DeleteGroupsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DeleteRecordsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DeleteRecordsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DeleteShareGroupOffsetsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DeleteShareGroupOffsetsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DeleteShareGroupStateRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DeleteShareGroupStateResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DeleteTopicsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DeleteTopicsResponseFilter"},{"p":"io.kroxylicious.proxy.plugin","l":"DeprecatedPluginName"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeAclsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeAclsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeClientQuotasRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeClientQuotasResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeClusterRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeClusterResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeConfigsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeConfigsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeDelegationTokenRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeDelegationTokenResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeGroupsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeGroupsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeLogDirsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeLogDirsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeProducersRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeProducersResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeQuorumRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeQuorumResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeShareGroupOffsetsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeShareGroupOffsetsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeTopicPartitionsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeTopicPartitionsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeTransactionsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeTransactionsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeUserScramCredentialsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"DescribeUserScramCredentialsResponseFilter"},{"p":"io.kroxylicious.kms.service","l":"DestroyableRawSecretKey"},{"p":"io.kroxylicious.proxy.filter","l":"ElectLeadersRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ElectLeadersResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"EndQuorumEpochRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"EndQuorumEpochResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"EndTxnRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"EndTxnResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"EnvelopeRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"EnvelopeResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ExpireDelegationTokenRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ExpireDelegationTokenResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"FetchRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"FetchResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"FetchSnapshotRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"FetchSnapshotResponseFilter"},{"p":"io.kroxylicious.proxy.config.secret","l":"FilePassword"},{"p":"io.kroxylicious.proxy.filter","l":"Filter"},{"p":"io.kroxylicious.proxy.filter","l":"FilterContext"},{"p":"io.kroxylicious.proxy.filter","l":"FilterDispatchExecutor"},{"p":"io.kroxylicious.proxy.filter","l":"FilterFactory"},{"p":"io.kroxylicious.proxy.filter","l":"FilterFactoryContext"},{"p":"io.kroxylicious.proxy.filter","l":"FilterResult"},{"p":"io.kroxylicious.proxy.filter","l":"FilterResultBuilder"},{"p":"io.kroxylicious.proxy.filter","l":"FindCoordinatorRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"FindCoordinatorResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"GetTelemetrySubscriptionsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"GetTelemetrySubscriptionsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"HeartbeatRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"HeartbeatResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"IncrementalAlterConfigsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"IncrementalAlterConfigsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"InitializeShareGroupStateRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"InitializeShareGroupStateResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"InitProducerIdRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"InitProducerIdResponseFilter"},{"p":"io.kroxylicious.proxy.config.secret","l":"InlinePassword"},{"p":"io.kroxylicious.proxy.config.tls","l":"InsecureTls"},{"p":"io.kroxylicious.kms.service","l":"InvalidKeyUsageException"},{"p":"io.kroxylicious.proxy.filter","l":"JoinGroupRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"JoinGroupResponseFilter"},{"p":"io.kroxylicious.proxy.config.tls","l":"KeyPair"},{"p":"io.kroxylicious.proxy.config.tls","l":"KeyProvider"},{"p":"io.kroxylicious.proxy.config.tls","l":"KeyProviderVisitor"},{"p":"io.kroxylicious.proxy.config.tls","l":"KeyStore"},{"p":"io.kroxylicious.kms.service","l":"Kms"},{"p":"io.kroxylicious.kms.service","l":"KmsException"},{"p":"io.kroxylicious.kms.service","l":"KmsService"},{"p":"io.kroxylicious.proxy.filter","l":"LeaveGroupRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"LeaveGroupResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ListConfigResourcesRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ListConfigResourcesResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ListGroupsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ListGroupsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ListOffsetsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ListOffsetsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ListPartitionReassignmentsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ListPartitionReassignmentsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ListTransactionsRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ListTransactionsResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"MetadataRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"MetadataResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"OffsetCommitRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"OffsetCommitResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"OffsetDeleteRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"OffsetDeleteResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"OffsetFetchRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"OffsetFetchResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"OffsetForLeaderEpochRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"OffsetForLeaderEpochResponseFilter"},{"p":"io.kroxylicious.proxy.config.secret","l":"PasswordProvider"},{"p":"io.kroxylicious.proxy.config.tls","l":"PlatformTrustProvider"},{"p":"io.kroxylicious.proxy.plugin","l":"Plugin"},{"p":"io.kroxylicious.proxy.plugin","l":"PluginConfigurationException"},{"p":"io.kroxylicious.proxy.plugin","l":"PluginImplConfig"},{"p":"io.kroxylicious.proxy.plugin","l":"PluginImplName"},{"p":"io.kroxylicious.proxy.plugin","l":"Plugins"},{"p":"io.kroxylicious.proxy.authentication","l":"Principal"},{"p":"io.kroxylicious.proxy.authentication","l":"PrincipalFactory"},{"p":"io.kroxylicious.proxy.filter","l":"ProduceRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ProduceResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"PushTelemetryRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"PushTelemetryResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ReadShareGroupStateRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ReadShareGroupStateResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ReadShareGroupStateSummaryRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ReadShareGroupStateSummaryResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"RemoveRaftVoterRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"RemoveRaftVoterResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"RenewDelegationTokenRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"RenewDelegationTokenResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"RequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"RequestFilterResult"},{"p":"io.kroxylicious.proxy.filter","l":"RequestFilterResultBuilder"},{"p":"io.kroxylicious.authorizer.service","l":"ResourceType"},{"p":"io.kroxylicious.proxy.filter","l":"ResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ResponseFilterResult"},{"p":"io.kroxylicious.proxy.filter","l":"ResponseFilterResultBuilder"},{"p":"io.kroxylicious.proxy.filter","l":"SaslAuthenticateRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"SaslAuthenticateResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"SaslHandshakeRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"SaslHandshakeResponseFilter"},{"p":"io.kroxylicious.proxy.authentication","l":"SaslSubjectBuilder"},{"p":"io.kroxylicious.proxy.authentication","l":"SaslSubjectBuilderService"},{"p":"io.kroxylicious.kms.service","l":"Serde"},{"p":"io.kroxylicious.proxy.config.tls","l":"ServerOptions"},{"p":"io.kroxylicious.proxy.filter","l":"ShareAcknowledgeRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ShareAcknowledgeResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ShareFetchRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ShareFetchResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ShareGroupDescribeRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ShareGroupDescribeResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ShareGroupHeartbeatRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"ShareGroupHeartbeatResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"StreamsGroupDescribeRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"StreamsGroupDescribeResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"StreamsGroupHeartbeatRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"StreamsGroupHeartbeatResponseFilter"},{"p":"io.kroxylicious.proxy.authentication","l":"Subject"},{"p":"io.kroxylicious.proxy.authentication","l":"SubjectBuildingException"},{"p":"io.kroxylicious.proxy.filter","l":"SyncGroupRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"SyncGroupResponseFilter"},{"p":"io.kroxylicious.proxy.filter.filterresultbuilder","l":"TerminalStage"},{"p":"io.kroxylicious.proxy.config.tls","l":"Tls"},{"p":"io.kroxylicious.proxy.config.tls","l":"TlsClientAuth"},{"p":"io.kroxylicious.proxy.filter.metadata","l":"TopicLevelMetadataErrorException"},{"p":"io.kroxylicious.proxy.filter.metadata","l":"TopicNameMapping"},{"p":"io.kroxylicious.proxy.filter.metadata","l":"TopicNameMappingException"},{"p":"io.kroxylicious.proxy.filter.metadata","l":"TopLevelMetadataErrorException"},{"p":"io.kroxylicious.proxy.authentication","l":"TransportSubjectBuilder"},{"p":"io.kroxylicious.proxy.authentication","l":"TransportSubjectBuilderService"},{"p":"io.kroxylicious.proxy.config.tls","l":"TrustOptions"},{"p":"io.kroxylicious.proxy.config.tls","l":"TrustProvider"},{"p":"io.kroxylicious.proxy.config.tls","l":"TrustProviderVisitor"},{"p":"io.kroxylicious.proxy.config.tls","l":"TrustStore"},{"p":"io.kroxylicious.proxy.filter","l":"TxnOffsetCommitRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"TxnOffsetCommitResponseFilter"},{"p":"io.kroxylicious.proxy.authentication","l":"Unique"},{"p":"io.kroxylicious.kms.service","l":"UnknownAliasException"},{"p":"io.kroxylicious.kms.service","l":"UnknownKeyException"},{"p":"io.kroxylicious.proxy.plugin","l":"UnknownPluginInstanceException"},{"p":"io.kroxylicious.proxy.filter","l":"UnregisterBrokerRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"UnregisterBrokerResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"UpdateFeaturesRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"UpdateFeaturesResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"UpdateRaftVoterRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"UpdateRaftVoterResponseFilter"},{"p":"io.kroxylicious.proxy.authentication","l":"User"},{"p":"io.kroxylicious.proxy.authentication","l":"UserFactory"},{"p":"io.kroxylicious.proxy.filter","l":"VoteRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"VoteResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"WriteShareGroupStateRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"WriteShareGroupStateResponseFilter"},{"p":"io.kroxylicious.proxy.filter","l":"WriteTxnMarkersRequestFilter"},{"p":"io.kroxylicious.proxy.filter","l":"WriteTxnMarkersResponseFilter"}];updateSearchResults(); \ No newline at end of file diff --git a/download/0.20.0/index.md b/download/0.20.0/index.md new file mode 100644 index 0000000..9b9d975 --- /dev/null +++ b/download/0.20.0/index.md @@ -0,0 +1,3 @@ +--- +layout: download-release +---