From 90de041c20f184154c342d60512154c5d05feb69 Mon Sep 17 00:00:00 2001 From: Misty Stanley-Jones Date: Fri, 12 Dec 2014 15:44:16 +1000 Subject: [PATCH] HBASE-12677 Update replication docs to clarify terminology --- .../apache/hadoop/hbase/replication/package.html | 2 +- src/main/docbkx/ops_mgt.xml | 782 ++++++++++++--------- .../resources/images/hbase_replication_diagram.jpg | Bin 0 -> 52298 bytes 3 files changed, 448 insertions(+), 336 deletions(-) create mode 100644 src/main/site/resources/images/hbase_replication_diagram.jpg diff --git a/hbase-server/src/main/javadoc/org/apache/hadoop/hbase/replication/package.html b/hbase-server/src/main/javadoc/org/apache/hadoop/hbase/replication/package.html index ea4a2af..2f2e24a 100644 --- a/hbase-server/src/main/javadoc/org/apache/hadoop/hbase/replication/package.html +++ b/hbase-server/src/main/javadoc/org/apache/hadoop/hbase/replication/package.html @@ -99,7 +99,7 @@ to another.
  • Run the following command in the master's shell while it's running
    add_peer 'ID' 'CLUSTER_KEY'
    - The ID must be a short integer. To compose the CLUSTER_KEY, use the following template: + The ID is a string, which must not contain a hyphen. To compose the CLUSTER_KEY, use the following template:
    hbase.zookeeper.quorum:hbase.zookeeper.property.clientPort:zookeeper.znode.parent
    This will show you the help to setup the replication stream between both clusters. If both clusters use the same Zookeeper cluster, you have diff --git a/src/main/docbkx/ops_mgt.xml b/src/main/docbkx/ops_mgt.xml index 0af8f02..3e38ff7 100644 --- a/src/main/docbkx/ops_mgt.xml +++ b/src/main/docbkx/ops_mgt.xml @@ -1490,306 +1490,360 @@ $ for i in `cat conf/regionservers|sort`; do ./bin/graceful_stop.sh --restart -- This information was previously available at Cluster Replication. - HBase provides a replication mechanism to copy data between HBase - clusters. Replication can be used as a disaster recovery solution and as a mechanism for high - availability. You can also use replication to separate web-facing operations from back-end - jobs such as MapReduce. - - In terms of architecture, HBase replication is master-push. This takes advantage of the - fact that each region server has its own write-ahead log (WAL). One master cluster can - replicate to any number of slave clusters, and each region server replicates its own stream of - edits. For more information on the different properties of master/slave replication and other - types of replication, see the article How - Google Serves Data From Multiple Datacenters. - - Replication is asynchronous, allowing clusters to be geographically distant or to have - some gaps in availability. This also means that data between master and slave clusters will - not be instantly consistent. Rows inserted on the master are not immediately available or - consistent with rows on the slave clusters. rows inserted on the master cluster won’t be - available at the same time on the slave clusters. The goal is eventual consistency. - - The replication format used in this design is conceptually the same as the statement-based - replication design used by MySQL. Instead of SQL statements, entire - WALEdits (consisting of multiple cell inserts coming from Put and Delete operations on the - clients) are replicated in order to maintain atomicity. - + HBase provides a cluster replication mechanism which allows you to keep one cluster's + state synchronized with that of another cluster, using the write-ahead log (WAL) of the source + cluster to propagate the changes. Some use cases for cluster replication include: + + Backup and disaster recovery + Data aggregation + Geographic data distribution + Online data ingestion combined with offline data analytics + + Replication is enabled at the granularity of the column family. Before enabling + replication for a column family, create the table and all column families to be replicated, on + the destination cluster. + Cluster replication uses a source-push methodology. An HBase cluster can be a source (also + called master or active, meaning that it is the originator of new data), a destination (also + called slave or passive, meaning that it receives data via replication), or can fulfill both + roles at once. Replication is asynchronous, and the goal of replication is eventual + consistency. When the source receives an edit to a column family with replication enabled, + that edit is propagated to all destination clusters using the WAL for that for that column + family on the RegionServer managing the relevant region. + When data is replicated from one cluster to another, the original source of the data is + tracked via a cluster ID which is part of the metadata. In HBase 0.96 and newer (HBASE-7709), all + clusters which have already consumed the data are also tracked. This prevents replication + loops. The WALs for each region server must be kept in HDFS as long as they are needed to replicate data to any slave cluster. Each region server reads from the oldest log it needs to - replicate and keeps track of the current position inside ZooKeeper to simplify failure - recovery. That position, as well as the queue of WALs to process, may be different for every - slave cluster. - - The clusters participating in replication can be of different sizes. The master - cluster relies on randomization to attempt to balance the stream of replication on the slave clusters - - HBase supports master/master and cyclic replication as well as replication to multiple - slaves. - + replicate and keeps track of its progress processing WALs inside ZooKeeper to simplify failure + recovery. The position marker which indicates a slave cluster's progress, as well as the queue + of WALs to process, may be different for every slave cluster. + The clusters participating in replication can be of different sizes. The master cluster + relies on randomization to attempt to balance the stream of replication on the slave clusters. + It is expected that the slave cluster has storage capacity to hold the replicated data, as + well as any data it is responsible for ingesting. If a slave cluster does run out of room, or + is inaccessible for other reasons, it throws an error and the master retains the WAL and + retries the replication at intervals. + + Terminology Changes + Previously, terms such as master-master, + master-slave, and cyclical were used to + describe replication relationships in HBase. These terms added confusion, and have been + abandoned in favor of discussions about cluster topologies appropriate for different + scenarios. + + + Cluster Topologies + + A central source cluster might propagate changes out to multiple destination clusters, + for failover or due to geographic distribution. + + + A source cluster might push changes to a destination cluster, which might also push + its own changes back to the original cluster. + + Many different low-latency clusters might push changes to one centralized cluster for + backup or resource-intensive data analytics jobs. The processed data might then be + replicated back to the low-latency clusters. + + + Multiple levels of replication may be chained together to suit your organization's needs. + The following diagram shows a hypothetical scenario. Use the arrows to follow the data + paths.
    - Replication Architecture Overview + Example of a Complex Cluster Replication Configuration - - - - - Illustration of the replication architecture in HBase, as described in the prior - text. - + + + At the top of the diagram, the San Jose and Tokyo clusters, shown in red, + replicate changes to each other, and each also replicates changes to a User Data and a + Payment Data cluster. + Each cluster in the second row, shown in blue, replicates its changes to the All Data + Backup 1 cluster, shown in grey. The All Data Backup 1 cluster replicates changes to the + All Data Backup 2 cluster (also shown in grey), as well as the Data Analysis cluster + (shown in green). All Data Backup 2 also propagates any of its own changes back to All + Data Backup 1. + The Data Analysis cluster runs MapReduce jobs on its data, and then pushes the + processed data back to the San Jose and Tokyo clusters. +
    - - Enabling and Configuring Replication - See the - API documentation for replication for information on enabling and configuring - replication. - + HBase replication borrows many concepts from the statement-based replication design used by MySQL. Instead of SQL + statements, entire WALEdits (consisting of multiple cell inserts coming from Put and Delete + operations on the clients) are replicated in order to maintain atomicity.
    - Life of a WAL Edit - A single WAL edit goes through several steps in order to be replicated to a slave - cluster. - - - When the slave responds correctly: - - A HBase client uses a Put or Delete operation to manipulate data in HBase. - - - The region server writes the request to the WAL in a way that would allow it to be - replayed if it were not written successfully. - - - If the changed cell corresponds to a column family that is scoped for replication, - the edit is added to the queue for replication. - - - In a separate thread, the edit is read from the log, as part of a batch process. - Only the KeyValues that are eligible for replication are kept. Replicable KeyValues are - part of a column family whose schema is scoped GLOBAL, are not part of a catalog such as - hbase:meta, and did not originate from the target slave cluster, in the - case of cyclic replication. - - - The edit is tagged with the master's UUID and added to a buffer. When the buffer is - filled, or the reader reaches the end of the file, the buffer is sent to a random region - server on the slave cluster. - - - The region server reads the edits sequentially and separates them into buffers, one - buffer per table. After all edits are read, each buffer is flushed using HTable, HBase's normal client. The master's UUID is preserved in the edits - they are applied, in order to allow for cyclic replication. - - - In the master, the offset for the WAL that is currently being replicated is - registered in ZooKeeper. - - - - When the slave does not respond: - - The first three steps, where the edit is inserted, are identical. - + Configuring Cluster Replication + The following is a simplified procedure for configuring cluster replication. It may not + cover every edge case. For more information, see the API documentation for replication. + - Again in a separate thread, the region server reads, filters, and edits the log - edits in the same way as above. The slave region server does not answer the RPC - call. + Configure and start the source and destination clusters. Create tables with the same + names and column families on both the source and destination clusters, so that the + destination cluster knows where to store data it will receive. All hosts in the source + and destination clusters should be reachable to each other. - The master sleeps and tries again a configurable number of times. + On the source cluster, enable replication by setting hbase.replication + to true in hbase-site.xml. - If the slave region server is still not available, the master selects a new subset - of region server to replicate to, and tries again to send the buffer of edits. + On the source cluster, in HBase Shell, add the destination cluster as a peer, using + the add_peer command. The syntax is as follows: + hbase< add_peer 'ID' 'CLUSTER_KEY' + The ID is a string (prior to HBASE-11367, it + was a short integer), which must not contain a hyphen (see HBASE-11394). To + compose the CLUSTER_KEY, use the following template: + hbase.zookeeper.quorum:hbase.zookeeper.property.clientPort:zookeeper.znode.parent + If both clusters use the same ZooKeeper cluster, you must use a different + zookeeper.znode.parent, because they cannot write in the same folder. - Meanwhile, the WALs are rolled and stored in a queue in ZooKeeper. Logs that are - archived by their region server, by moving them from the region - server's log directory to a central log directory, will update their paths in the - in-memory queue of the replicating thread. + On the source cluster, configure each column family to be replicated by setting its + REPLICATION_SCOPE to 1, using commands such as the following in HBase Shell. + hbase> disable 'example_table' +hbase> alter 'example_table', {NAME => 'example_family', REPLICATION_SCOPE => '1'} +hbase> enable 'example_table' + You can verify that replication is taking place by examining the logs on the + source cluster for messages such as the following. + Considering 1 rs, with ratio 0.1 +Getting 1 rs from peer cluster # 0 +Choosing peer 10.10.1.49:62020 + - When the slave cluster is finally available, the buffer is applied in the same way - as during normal processing. The master region server will then replicate the backlog of - logs that accumulated during the outage. + To verify the validity of replicated data, you can use the included + VerifyReplication MapReduce job on the source cluster, providing it with + the ID of the replication peer and table name to verify. Other options are possible, + such as a time range or specific families to verify. + The command has the following form: + hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication [--starttime=timestamp1] [--stoptime=timestamp [--families=comma separated list of families] <peerId><tablename> + The VerifyReplication command prints out GOODROWS + and BADROWS counters to indicate rows that did and did not replicate + correctly. - - - - Spreading Queue Failover Load - When replication is active, a subset of RegionServers in the source cluster are - responsible for shipping edits to the sink. This function must be failed over like all - other RegionServer functions should a process or node crash. The following configuration - settings are recommended for maintaining an even distribution of replication activity - over the remaining live servers in the source cluster: Set - replication.source.maxretriesmultiplier to - 300 (5 minutes), and - replication.sleep.before.failover to - 30000 (30 seconds) in the source cluster site configuration. - - - - - Preserving Tags During Replication - By default, the codec used for replication between clusters strips tags, such as - cell-level ACLs, from cells. To prevent the tags from being stripped, you can use a - different codec which does not strip them. Configure - hbase.replication.rpc.codec to use - org.apache.hadoop.hbase.codec.KeyValueCodecWithTags, on both the - source and sink RegionServers involved in the replication. This option was introduced in - HBASE-10322. - +
    - Replication Internals - - - Replication State in ZooKeeper + Detailed Information About Cluster Replication + +
    + Replication Architecture Overview + + + + + + Illustration of the replication architecture in HBase, as described in the prior + text. + + +
    + + +
    + Life of a WAL Edit + A single WAL edit goes through several steps in order to be replicated to a slave + cluster. + + + When the slave responds correctly: - HBase replication maintains its state in ZooKeeper. By default, the state is - contained in the base node /hbase/replication. This node contains - two child nodes, the Peers znode and the RS znode. - - Replication may be disrupted and data loss may occur if you delete the - replication tree (/hbase/replication/) from ZooKeeper. This is - despite the information about invariants at . Follow progress on this issue at HBASE-10295. - + An HBase client uses a Put or Delete operation to manipulate data in HBase. + + + The region server writes the request to the WAL in a way allows it to be replayed + if it is not written successfully. + + + If the changed cell corresponds to a column family that is scoped for replication, + the edit is added to the queue for replication. + + + In a separate thread, the edit is read from the log, as part of a batch process. + Only the KeyValues that are eligible for replication are kept. Replicable KeyValues + are part of a column family whose schema is scoped GLOBAL, are not part of a catalog + such as hbase:meta, did not originate from the target slave cluster, and + have not already been consumed by the target slave cluster. + + + The edit is tagged with the master's UUID and added to a buffer. When the buffer + is filled, or the reader reaches the end of the file, the buffer is sent to a random + region server on the slave cluster. + + + The region server reads the edits sequentially and separates them into buffers, + one buffer per table. After all edits are read, each buffer is flushed using HTable, HBase's normal client. The master's UUID and the UUIDs of slaves + which have already consumed the data are preserved in the edits they are applied, in + order to prevent replication loops. + + + In the master, the offset for the WAL that is currently being replicated is + registered in ZooKeeper. + + + + When the slave does not respond: + + The first three steps, where the edit is inserted, are identical. + + + Again in a separate thread, the region server reads, filters, and edits the log + edits in the same way as above. The slave region server does not answer the RPC + call. + + + The master sleeps and tries again a configurable number of times. + + + If the slave region server is still not available, the master selects a new subset + of region server to replicate to, and tries again to send the buffer of edits. + + + Meanwhile, the WALs are rolled and stored in a queue in ZooKeeper. Logs that are + archived by their region server, by moving them from the + region server's log directory to a central log directory, will update their paths in + the in-memory queue of the replicating thread. + + + When the slave cluster is finally available, the buffer is applied in the same way + as during normal processing. The master region server will then replicate the backlog + of logs that accumulated during the outage. + + + + + Spreading Queue Failover Load + When replication is active, a subset of region servers in the source cluster is + responsible for shipping edits to the sink. This responsibility must be failed over like + all other region server functions should a process or node crash. The following + configuration settings are recommended for maintaining an even distribution of + replication activity over the remaining live servers in the source cluster: + + + + Set replication.source.maxretriesmultiplier to + 300. + + + Set replication.source.sleepforretries to 1 (1 + second). This value, combined with the value of + replication.source.maxretriesmultiplier, causes the retry cycle to last + about 5 minutes. - - - The Peers Znode - The peers znode is stored in - /hbase/replication/peers by default. It consists of a list of - all peer replication clusters, along with the status of each of them. The value of - each peer is its cluster key, which is provided in the HBase Shell. The cluster key - contains a list of ZooKeeper nodes in the cluster's quorum, the client port for the - ZooKeeper quorum, and the base znode for HBase in HDFS on that cluster. - + Set replication.sleep.before.failover to 30000 (30 + seconds) in the source cluster site configuration. + + + + + Preserving Tags During Replication + By default, the codec used for replication between clusters strips tags, such as + cell-level ACLs, from cells. To prevent the tags from being stripped, you can use a + different codec which does not strip them. Configure + hbase.replication.rpc.codec to use + org.apache.hadoop.hbase.codec.KeyValueCodecWithTags, on both the + source and sink RegionServers involved in the replication. This option was introduced in + HBASE-10322. + +
    + +
    + Replication Internals + + + Replication State in ZooKeeper + + HBase replication maintains its state in ZooKeeper. By default, the state is + contained in the base node /hbase/replication. This node + contains two child nodes, the Peers znode and the RS + znode. + + Replication may be disrupted and data loss may occur if you delete the + replication tree (/hbase/replication/) from ZooKeeper. This + is despite the information about invariants at . Follow progress on this issue at HBASE-10295. + + + + + The Peers Znode + + The peers znode is stored in + /hbase/replication/peers by default. It consists of a list of + all peer replication clusters, along with the status of each of them. The value of + each peer is its cluster key, which is provided in the HBase Shell. The cluster key + contains a list of ZooKeeper nodes in the cluster's quorum, the client port for the + ZooKeeper quorum, and the base znode for HBase in HDFS on that cluster. + /hbase/replication/peers /1 [Value: zk1.host.com,zk2.host.com,zk3.host.com:2181:/hbase] /2 [Value: zk5.host.com,zk6.host.com,zk7.host.com:2181:/hbase] - - Each peer has a child znode which indicates whether or not replication is enabled - on that cluster. These peer-state znodes do not contain any child znodes, but only - contain a Boolean value. This value is read and maintained by the - ReplicationPeer.PeerStateTracker class. - + + Each peer has a child znode which indicates whether or not replication is + enabled on that cluster. These peer-state znodes do not contain any child znodes, + but only contain a Boolean value. This value is read and maintained by the + ReplicationPeer.PeerStateTracker class. + /hbase/replication/peers /1/peer-state [Value: ENABLED] /2/peer-state [Value: DISABLED] - - - - - The RS Znode - - The rs znode contains a list of WAL logs which need to be replicated. - This list is divided into a set of queues organized by region server and the peer - cluster the region server is shipping the logs to. The rs znode has one child znode - for each region server in the cluster. The child znode name is the region server's - hostname, client port, and start code. This list includes both live and dead region - servers. - + + + + + The RS Znode + + The rs znode contains a list of WAL logs which need to be + replicated. This list is divided into a set of queues organized by region server and + the peer cluster the region server is shipping the logs to. The rs znode has one + child znode for each region server in the cluster. The child znode name is the + region server's hostname, client port, and start code. This list includes both live + and dead region servers. + /hbase/replication/rs /hostname.example.org,6020,1234 /hostname2.example.org,6020,2856 - - Each rs znode contains a list of WAL replication queues, one queue - for each peer cluster it replicates to. These queues are represented by child znodes - named by the cluster ID of the peer cluster they represent. - + + Each rs znode contains a list of WAL replication queues, one queue + for each peer cluster it replicates to. These queues are represented by child znodes + named by the cluster ID of the peer cluster they represent. + /hbase/replication/rs /hostname.example.org,6020,1234 /1 /2 - - Each queue has one child znode for each WAL log that still needs to be replicated. - the value of these child znodes is the last position that was replicated. This - position is updated each time a WAL log is replicated. - + + Each queue has one child znode for each WAL log that still needs to be + replicated. the value of these child znodes is the last position that was + replicated. This position is updated each time a WAL log is replicated. + /hbase/replication/rs /hostname.example.org,6020,1234 /1 23522342.23422 [VALUE: 254] 12340993.22342 [VALUE: 0] - - - - -
    -
    - Replication Configuration Options - - - - - Option - Description - Default - - - - - zookeeper.znode.parent - The name of the base ZooKeeper znode used for HBase - /hbase - - - zookeeper.znode.replication - The name of the base znode used for replication - replication - - - zookeeper.znode.replication.peers - The name of the peer znode - peers - - - zookeeper.znode.replication.peers.state - The name of peer-state znode - peer-state - - - zookeeper.znode.replication.rs - The name of the rs znode - rs - - - hbase.replication - Whether replication is enabled or disabled on a given cluster - false - - - eplication.sleep.before.failover - How many milliseconds a worker should sleep before attempting to replicate - a dead region server's WAL queues. - - - - replication.executor.workers - The number of region servers a given region server should attempt to - failover simultaneously. - 1 - - - - -
    - -
    - Replication Implementation Details - + + + + +
    +
    Choosing Region Servers to Replicate To When a master cluster region server initiates a replication source to a slave cluster, it first connects to the slave's ZooKeeper ensemble using the provided cluster key . It @@ -1802,17 +1856,16 @@ $ for i in `cat conf/regionservers|sort`; do ./bin/graceful_stop.sh --restart -- high, and this method works for clusters of any size. For example, a master cluster of 10 machines replicating to a slave cluster of 5 machines with a ratio of 10% causes the master cluster region servers to choose one machine each at random. - - A ZooKeeper watcher is placed on the - ${zookeeper.znode.parent}/rs node of the - slave cluster by each of the master cluster's region servers. This watch is used to monitor - changes in the composition of the slave cluster. When nodes are removed from the slave - cluster, or if nodes go down or come back up, the master cluster's region servers will - respond by selecting a new pool of slave region servers to replicate to. + A ZooKeeper watcher is placed on the + ${zookeeper.znode.parent}/rs node of + the slave cluster by each of the master cluster's region servers. This watch is used to + monitor changes in the composition of the slave cluster. When nodes are removed from the + slave cluster, or if nodes go down or come back up, the master cluster's region servers + will respond by selecting a new pool of slave region servers to replicate to. +
    - +
    Keeping Track of Logs - Each master cluster region server has its own znode in the replication znodes hierarchy. It contains one znode per peer cluster (if 5 slave clusters, 5 znodes are created), and each of these contain a queue of WALs to process. Each of these queues will @@ -1820,26 +1873,26 @@ $ for i in `cat conf/regionservers|sort`; do ./bin/graceful_stop.sh --restart -- one slave cluster becomes unavailable for some time, the WALs should not be deleted, so they need to stay in the queue while the others are processed. See for an example. - - When a source is instantiated, it contains the current WAL that the region server is - writing to. During log rolling, the new file is added to the queue of each slave cluster's - znode just before it is made available. This ensures that all the sources are aware that a - new log exists before the region server is able to append edits into it, but this operations - is now more expensive. The queue items are discarded when the replication thread cannot read - more entries from a file (because it reached the end of the last block) and there are other - files in the queue. This means that if a source is up to date and replicates from the log - that the region server writes to, reading up to the "end" of the current file will not - delete the item in the queue. - A log can be archived if it is no longer used or if the number of logs exceeds - hbase.regionserver.maxlogs because the insertion rate is faster than regions - are flushed. When a log is archived, the source threads are notified that the path for that - log changed. If a particular source has already finished with an archived log, it will just - ignore the message. If the log is in the queue, the path will be updated in memory. If the - log is currently being replicated, the change will be done atomically so that the reader - doesn't attempt to open the file when has already been moved. Because moving a file is a - NameNode operation , if the reader is currently reading the log, it won't generate any - exception. - + When a source is instantiated, it contains the current WAL that the region server is + writing to. During log rolling, the new file is added to the queue of each slave cluster's + znode just before it is made available. This ensures that all the sources are aware that a + new log exists before the region server is able to append edits into it, but this + operations is now more expensive. The queue items are discarded when the replication + thread cannot read more entries from a file (because it reached the end of the last block) + and there are other files in the queue. This means that if a source is up to date and + replicates from the log that the region server writes to, reading up to the "end" of the + current file will not delete the item in the queue. + A log can be archived if it is no longer used or if the number of logs exceeds + hbase.regionserver.maxlogs because the insertion rate is faster than + regions are flushed. When a log is archived, the source threads are notified that the path + for that log changed. If a particular source has already finished with an archived log, it + will just ignore the message. If the log is in the queue, the path will be updated in + memory. If the log is currently being replicated, the change will be done atomically so + that the reader doesn't attempt to open the file when has already been moved. Because + moving a file is a NameNode operation , if the reader is currently reading the log, it + won't generate any exception. +
    +
    Reading, Filtering and Sending Edits By default, a source attempts to read from a WAL and ship log entries to a sink as quickly as possible. Speed is limited by the filtering of log entries Only KeyValues that @@ -1848,16 +1901,17 @@ $ for i in `cat conf/regionservers|sort`; do ./bin/graceful_stop.sh --restart -- MB by default. With this configuration, a master cluster region server with three slaves would use at most 192 MB to store data to replicate. This does not account for the data which was filtered but not garbage collected. - - Once the maximum size of edits has been buffered or the reader reaces the end of the - WAL, the source thread stops reading and chooses at random a sink to replicate to (from the - list that was generated by keeping only a subset of slave region servers). It directly - issues a RPC to the chosen region server and waits for the method to return. If the RPC was - successful, the source determines whether the current file has been emptied or it contains - more data which needs to be read. If the file has been emptied, the source deletes the znode - in the queue. Otherwise, it registers the new offset in the log's znode. If the RPC threw an - exception, the source will retry 10 times before trying to find a different sink. - + Once the maximum size of edits has been buffered or the reader reaces the end of the + WAL, the source thread stops reading and chooses at random a sink to replicate to (from + the list that was generated by keeping only a subset of slave region servers). It directly + issues a RPC to the chosen region server and waits for the method to return. If the RPC + was successful, the source determines whether the current file has been emptied or it + contains more data which needs to be read. If the file has been emptied, the source + deletes the znode in the queue. Otherwise, it registers the new offset in the log's znode. + If the RPC threw an exception, the source will retry 10 times before trying to find a + different sink. +
    +
    Cleaning Logs If replication is not enabled, the master's log-cleaning thread deletes old logs using a configured TTL. This TTL-based method does not work well with replication, because @@ -1866,33 +1920,32 @@ $ for i in `cat conf/regionservers|sort`; do ./bin/graceful_stop.sh --restart -- until it finds the log, while caching queues it has found. If the log is not found in any queues, the log will be deleted. The next time the cleaning process needs to look for a log, it starts by using its cached list. - - +
    +
    Region Server Failover When no region servers are failing, keeping track of the logs in ZooKeeper adds no value. Unfortunately, region servers do fail, and since ZooKeeper is highly available, it is useful for managing the transfer of the queues in the event of a failure. - - Each of the master cluster region servers keeps a watcher on every other region server, - in order to be notified when one dies (just as the master does). When a failure happens, - they all race to create a znode called lock inside the dead region - server's znode that contains its queues. The region server that creates it successfully then - transfers all the queues to its own znode, one at a time since ZooKeeper does not support - renaming queues. After queues are all transferred, they are deleted from the old location. - The znodes that were recovered are renamed with the ID of the slave cluster appended with - the name of the dead server. - Next, the master cluster region server creates one new source thread per copied queue, - and each of the source threads follows the read/filter/ship pattern. The main difference is - that those queues will never receive new data, since they do not belong to their new region - server. When the reader hits the end of the last log, the queue's znode is deleted and the - master cluster region server closes that replication source. - Given a master cluster with 3 region servers replicating to a single slave with id - 2, the following hierarchy represents what the znodes layout could be - at some point in time. The region servers' znodes all contain a peers - znode which contains a single queue. The znode names in the queues represent the actual file - names on HDFS in the form - address,port.timestamp. - + Each of the master cluster region servers keeps a watcher on every other region + server, in order to be notified when one dies (just as the master does). When a failure + happens, they all race to create a znode called lock inside the dead + region server's znode that contains its queues. The region server that creates it + successfully then transfers all the queues to its own znode, one at a time since ZooKeeper + does not support renaming queues. After queues are all transferred, they are deleted from + the old location. The znodes that were recovered are renamed with the ID of the slave + cluster appended with the name of the dead server. + Next, the master cluster region server creates one new source thread per copied queue, + and each of the source threads follows the read/filter/ship pattern. The main difference + is that those queues will never receive new data, since they do not belong to their new + region server. When the reader hits the end of the last log, the queue's znode is deleted + and the master cluster region server closes that replication source. + Given a master cluster with 3 region servers replicating to a single slave with id + 2, the following hierarchy represents what the znodes layout could be + at some point in time. The region servers' znodes all contain a peers + znode which contains a single queue. The znode names in the queues represent the actual + file names on HDFS in the form + address,port.timestamp. + /hbase/replication/rs/ 1.1.1.1,60020,123456780/ 2/ @@ -1907,11 +1960,11 @@ $ for i in `cat conf/regionservers|sort`; do ./bin/graceful_stop.sh --restart -- 2/ 1.1.1.3,60020.1280 (Contains a position) - Assume that 1.1.1.2 loses its ZooKeeper session. The survivors will race to create a - lock, and, arbitrarily, 1.1.1.3 wins. It will then start transferring all the queues to its - local peers znode by appending the name of the dead server. Right before 1.1.1.3 is able to - clean up the old znodes, the layout will look like the following: - + Assume that 1.1.1.2 loses its ZooKeeper session. The survivors will race to create a + lock, and, arbitrarily, 1.1.1.3 wins. It will then start transferring all the queues to + its local peers znode by appending the name of the dead server. Right before 1.1.1.3 is + able to clean up the old znodes, the layout will look like the following: + /hbase/replication/rs/ 1.1.1.1,60020,123456780/ 2/ @@ -1932,11 +1985,11 @@ $ for i in `cat conf/regionservers|sort`; do ./bin/graceful_stop.sh --restart -- 1.1.1.2,60020.1248 1.1.1.2,60020.1312 - Some time later, but before 1.1.1.3 is able to finish replicating the last WAL from - 1.1.1.2, it dies too. Some new logs were also created in the normal queues. The last region - server will then try to lock 1.1.1.3's znode and will begin transferring all the queues. The - new layout will be: - + Some time later, but before 1.1.1.3 is able to finish replicating the last WAL from + 1.1.1.2, it dies too. Some new logs were also created in the normal queues. The last + region server will then try to lock 1.1.1.3's znode and will begin transferring all the + queues. The new layout will be: + /hbase/replication/rs/ 1.1.1.1,60020,123456780/ 2/ @@ -1957,11 +2010,12 @@ $ for i in `cat conf/regionservers|sort`; do ./bin/graceful_stop.sh --restart -- 2-1.1.1.2,60020,123456790/ 1.1.1.2,60020.1312 (Contains a position) - - Replication Metrics - The following metrics are exposed at the global region server level and (since HBase - 0.95) at the peer level: - +
    +
    +
    + Replication Metrics + The following metrics are exposed at the global region server level and (since HBase + 0.95) at the peer level: source.sizeOfLogQueue @@ -1989,7 +2043,65 @@ $ for i in `cat conf/regionservers|sort`; do ./bin/graceful_stop.sh --restart -- - +
    +
    + Replication Configuration Options + + + + + Option + Description + Default + + + + + zookeeper.znode.parent + The name of the base ZooKeeper znode used for HBase + /hbase + + + zookeeper.znode.replication + The name of the base znode used for replication + replication + + + zookeeper.znode.replication.peers + The name of the peer znode + peers + + + zookeeper.znode.replication.peers.state + The name of peer-state znode + peer-state + + + zookeeper.znode.replication.rs + The name of the rs znode + rs + + + hbase.replication + Whether replication is enabled or disabled on a given + cluster + false + + + eplication.sleep.before.failover + How many milliseconds a worker should sleep before attempting to replicate + a dead region server's WAL queues. + + + + replication.executor.workers + The number of region servers a given region server should attempt to + failover simultaneously. + 1 + + + +
    7x;JVYxX5#WY1d4E|bKNBo&I7glyT#$TC`xtqGwN6N)5F_DCjsDOn?A z&mLy1!)(8=?ya|b?|bk2{@y=+pWm06IrDsA(mfVnxK0000Bzyx6e=s^eq(1CBfzrzp^76BN)w*!DRMD!=@0FnP! z{}^|G;rBiu&hHmE3Wy8X9u54Ye+a(5LtxuOx*xsisvpw-gss8*0Br%#I^pIM=o8@P z<14XWWiOz0*wmb18#{P?hh@Hl+&y9m{b-NFyu21ndI5+IW`_GxQqD66S}?EiWFmk986baIhU{<9MQ&kz1G ztzYJ$bkgObi@%FEIFvQ0W$xatpt!xA-2>fyyd~Vd|4zdH<72S-Dl-n^@YhZij*+8d%(|ZsG?|*;)!y6qM{7M(#?kcg} zY*3Pc0(z-=HE$N(_FBcK3y4wL|uKn+j_Gz0H}4&W0o2#f-gz&wBl)&UY| zoS7k<5I)FG2oxd%QG}>Lv>^HrBgiqxNyu5qd59~-8xjNwgItHiLy{pGkZec+q!>~K zse``>X0c`QX1T_a#`2V< zmZghjnuWy5%__sH!)n3m%o@UqW_`q3&Dzd7$x345VUuG!$ab2|gY7EYUAE_JO>AG- zR@m9uCE2yvE!o}KBiZk=zhHmMKE}Su!ONk*VaRcgBZ%V`M?S|Jj((06PEJl)&O@BG zoPnITI14x%IEOijJNR~}>@eNoyaTo4{*H_N3fvcXEifubFDNT$DtJi{ zEm$JhE4U>jCS)MwA`~n1T&PQELs(S!kg$tzoG@1SlknC~iJe9}J$EMUtlT*y!XTm` zVkr_Vk|ok4@=cUqR9DnVG)}ZcbYK_VE`?nucZKfC-SuJDnwYp4T+CPOo>+s}H*rDn zL*gFdcf@POXQ6yheW*M14ipESlMs+FkhmmqSE5k@zkAnilifkPvv+^oO_G$8w356g ziIp6ZVw2L6x+rx=s$L2&4V5;R4wEjF9*|*`(UNhKNtbDn*^rf!wULdHt(2XS6P7cT zyCPR8_eGvl9wzT6pCjM1hiQ-29?w0QdpZ>86x0>m6z(guE7B=yD7q_VDt0O{DrqZu zE9EHlDRU?rC|_1CR31|iR5_+{O{G$0QB_*iRy9erMU}c&eeb2ckM<7kd{*aEH&>5QuUDsNXlnRtJlB}jl-4}2 z`9QNzi(l)6R)W@BZAR_G+9>TB?M)pGoj{!uoh4mmT~FPox-)umdMX7rHyhGCldkj1bo*672-h0^paQWd4Lmk6#!#79h zkHC+_9rUUzA8j<_ zFgs!%N&MxP$ElD7)7s<-B{K4)EEyCpjOT66KRr)&v~bLE zT)SX;;lTyGlc7_()4cN`=R3}`E(cwbU8XM{yqJ7(#`U0UitDT!%q`9Bo4cWVhC9K- z!~^58;c4NS?@7C4a|!Fk;&tAu%A42Q)4S0}+z08?>8t1)?K|qH9Lf;t6j~p)JM3!M zShzuWb_68iLPR}E3UvcD83~Vka+U3>=he1rd#@#5TfJ^`z50gOjmR4lQShk3=pE7i z(S0$xF_@bSH{EZ3jNKo5FP0kT9M>AZH$E+%oZytunz%3VZX)g0#akcI8tAOsOt-yn z_a?!To+R@mUrC-wF;A(uBXKA0&T1+m^p4aY6OY+?=>G6?Haxo`M>Z!dmnrvh?$jgeM=g)F9v9?^ z~q%$nXd8#gz!7_{Kt9(-H#PUl@! zt5$2}dyV%MAJjjTx2d<4f7JL`(XQG4vO~M0x>K*SwhPu(*L|eBxyQ8U{ioxfI(w~p zKlh#M8~yD3d8YqTKVjhV0BJDt3*(o#A?~5H;a$TyBYQ@$qZ*^H$BvAB7(X>WIN>xg z|25z%dGf{-=TzD>bh=s(K{uckgB7TX-R2Wc}3;Rs_OcN#-`?$x9?iJx_dtL_I>Uj7#pAX zIyp5xGdo9EURhmR-ym*oZPNwr)P5uDCuM)4iwC5Oj)8%mfq9!Q2wm_t;XDkCyZ15i z8dx$r`teDsU1i}voRnQ$$11h|BwpZxehp17a$-+HyJa3ZB0WJD8_+kmCaKF)qpC z#JsbUV{6shhg{h+SWI**>4e8f%`1XWl%7ruMz-%rP0u6d?uGpxf~|*W0M;+7Ch##0 zxWTu6T@Mr2dx(VeR*Km9N^b2T*F$+Mh6ao=P#)5NnZh$5s0pP3vX(S}MRkFl1{hg4 z&;ZsaG+`M76qaaU5};#IfeOP=K~n>eK=WSqzpz8FxLcorqY0~bHEl|+$Ig6 za-#<1sBu~Mz-Qiq?OU)h7D^6orobIRJcin+|A|m;Jsw2(_z{S39}O50fsL_Ia#1r+ zW}!qg4E5{@<_>qIQm~o<871mKmf0X@RKvog_F7=seMh!l$9AXFGoMi>7wL zR!^ z(Ff#*B8F9L1EJJ7coYhMy9T6U0g8{OcGG}WOY$C&!BI;zK=ldz44dLKICCQ!-~ru| zr}BY>>2H9uT}9RJBUz$4jqzwI&&CM3<0n%Ss6D7v%dp)bj-YLx95{fgS0|kW2|I!h zrt%ELfK8_%tBe9GG=MCHD%Yg&TQGr>69tuG1r8@mVaj0?epMzYDJ2L>b({Gy1vttB zwI#350o#z9gONM8nXs{7K?4kFz;zh@b`NSZ`zOPolmbxw!tstYpb8H5oVteo#x;PU z#^9JxV{+g?%hcZ(My>naGvs^EQ((`@HRxvqH~}tka3BS6pw~Z;z5rQ(+7hb~MlIU( zz^T)2)W+}62I5_*d?IL&Tk^k8^&4V)C{=K%{o6w=qQCiUH*kR@rL94!_CHwlc?2AY za~K>*#REpJ$|XV9^JzeKWnBz)asj@r62G%)9sZqA#C0yp`z>%JtgY$O`vfCJRV5QqE7T%_i zbGv8j?>#?$?|B}ilNFr)na*|CK$bqLoV?R-fs*;8VT)2?F?k4j$Pxj|G+fVnv3cwI z=#ZN#{(0dO_h$`*8k&(%toTHcCRMPd$zG0XjJ{socoTQUi_fxaO*nnz(uPJb$H8PK zACLmJIJ_rxz-jbDx}SU2?mp4Ft%SB>Kb(fc)vjOzZgX4J$Tv0q3b2qp$zsR?8^kB(Bkd z-(kqU-|n+rYX_XZU(0mSXVO`ApiAxa=40X3oebCR>{FQLI7WfsqcZ{Br;zp^v}`2QchtZH8r_bkY~=qZ|bRi1hI9sgVD z#GZAR^9JJ0H6p0~mbxvyE)OW{niza6bH3QWn&G{8*5Yx~6thg(7Z+NV_Fi??*76O3 z8gw3lYC}cCT#0VSP`ovIdY;)WG+-Z&19Ur=Vqvd?bN8F>c{A7RfBZuTx3S{qu$>cF zX7Z6vzD5VuPep5q2Qzcj4)yPAeV}(Ty8*5sF0RQohdj?2lsZmTCo1M5ub)GSAq`Kw z#3K^p6vUj&**II_8>(cJ)orAhV8KWqt295Wv?{UUmfI zfAni#Kj^zo@VpvbkA}^iucQH8X4T~AWzXq=ql@ZZUn9!vLV|Se>WBCQZ$VFk20LgJ zwnaCKBeHYR06sWbE`pv0JX8VQL?md_2b#f2&Kx_S}(gTyKVJcCy6JmS&-!%{(ug&_QAi7hfoYT5ON^g z!+?S|*~+K#VIef2LkM()Z_c2I8L%;3Jd^?n93eBt(12KMYE6b-hJLvOwdGOxDUkHO zNYIY6=h1*sB^cQpiq9l+Q6sB;sB{f9ps}xY*j(HkYI_^y)TIv^{2TMX%o0sJPW}TK zo|8VZXjycT39NYbuWUK07d(2%zgpu#ez9OD-N8EcB!t4|&xupsP?Bq$LMOPQ(?{H^ zlb6Myr!$%dOdq*BFEi}@_@ql)X^^AIM*8+c4g%stUp*)ui^)NJ@Hyz(-gBr~naAOs z2%8%zfjJ{i_-|Wx91{vzzTIb&&#C5;md}X;{?m(yS#KirPspr0O*nnKYXCi-PQ3nQZX*DF*(78}Z0~RtP+(Xn?&L#$n zv_Xq~Z=F4kWHDb{+AQ4`I+^j$LjRSW--YfOGk;P){dciP(EX}KpxFPQW`7nt4ubks z>N@`@^^r*2AB6q~ivBG0r8kJ5stF4HkGlI8p$Ctu{$VZrQF(t`3-I1Y(9f&rrzlW4 zh5n_Sxm3P(`m1*XUnvGJNb^Xm6|9*`vCY9RJmMMnbxDv2Bt2xIB>_{{&V{^gRTcXF z9^(h5kR7u!c4qgyI)`wv{ZfpvbN-$Ko>LZ|N1fLF@V8fW(9{PiinG;Qb35?y;Ymad zS93!?>wW#ER7WFz>wFeVBYxmdFUa+A6gx7Yxten+s>Uv_u5ec8T1c>9<-SE|u#lCTgCnytUZ1s2S(xa)|JLS7c#sp|jcxX>Mbd(GJGj2Eg^( z?w*rNoL}akrPDXdMq+HgE!&f|`&4+l8!~QubTF5kbCB#($&6K|$D}o1l)fJCs#}vH z*K^zCHB$_=$Z=vgGz@y-xO@m3B z_fs^Wc@tWO7oh>?X+R}r#&z>_h!yI6{^M7z^ZZBczeGOdNVYh{ToeKy_}sSqWVx`j z91{)YCTr)ZRAPy)mfg=pp}4HxGZUiK-WN{@9V|`g6pVpDk(UuNs*to^U*2p-h7&eyUjQo~|{?iMZfx@5oGz4oHqkhDazs;`% zw_>}{M0vHvDq=Ww>U$HW6`R}!L#w8LjhL=8qw*DyX@JJ>TztG-*slM)`S+63b2VpOV^=#cH_hymkmux1DG&wbSaX{_=e{G|%u#w}XT($4-mw~Ru1G9TSryF1_= z=*oZ%{8Uk!xdpYEO&UQ~Z!`{I-n7RqjC&?}49pB6eGsNKebE*fM`B%c#f_i}B~Jjq zR}6gu_?EHh8|pqgh(XiD&?m^)HTMs}TjdKhVBI{kr0gp5XX<$sjRNUuZO1ZKEnz`~ z2$^pzeh|w`)*)U#0OcDpQnDO+|K#-t!H6rVm#>M%e`FnCtzT`{dTL2_#Z#IwV{n4d zHC%bn2xEglEyiD+Il42Md4$jW(i2k`t)Xbq_EWbMyMx>-?t2m{$L|q3>n=t5mzb8q%z;LPYbrp3i8azP-r%rZlxSnHwqPZ!0r~EtKn9X~6zHatT|m38Nmw z?g^LtxUwao*(<2%k>luQq2B5nSeengb;>U{-&pc4^76Gv`Mmb6RUmxHQo!fmAj=N~ z_Y2kEK6glNrKY`%l4G&|a$8}k&oP(MKFO;2b@-@rDjG7>%Qi0>yxM3BAO&sPyF zvpV4)($bbgPTHI6x$oK+a#xqTB6#oD%UDd!9zww3?l2zah9xKxPUX#1wW#r&7raGy z_B9#~)$=}FvFenvkWx1xh?tmqg_^+e5E~jr)N3E-BTKl7=R{0Xa}6)W6>{G?&w5sh zg(dv8*)EO*9kqPn{?`keu%0t>$fxBY*-TZZQy0sRTMpWbr409mU%B^k?W+-`?u3@TbjHzbPDUJl zsSIOW7xv#j^|)wZBf=Jy)TXDef%ly%@qSmEj^LYG8@X?;6v~+YZEdVbfdt1NFC8Vd z8Tc$@d(r@2+5BBlr^$ zNTi<5*udPlUHUDp3~SdtyetzZTeOZi2*A&4(Z{t2D0rz@%;OJoq}@_bOKH?x8Q7XD zzY><7oir(;mustUFK+LLIUHU|(xG(3cOR|t z@hvRHhqtDLQ7JnvoBgG?l;mr!QB5*`@F;W3h%hpxq1vbc>2$o~Vf2|G&MV`+b*i@T zz@RvdI}ha9-lQaprk)FkC8>}liB1I6X!=b(U4mi#7Ap1`6E2`w_54{|$#o6KjGZha zd_2uF{dU8z%|;R5_Tbsqkp!REFbh1%;-#CO89$E(=7~vqMa4Cyi!=bPmVMXz%l;{o z>09ONXH>VH^_Ab8wQG%BGYz=5j4C96DcHf;rvp$*p|#M2T)hw}OS|L#Y{3AAQeel0 z-*}@IP6IgI6W2;^(135L^kHg5ZyJEA&oB$Wqzq=_;^y=Y-zC1nXICS;kH9u~DrmsO z9kAUF$_|_H@5JGqyl6nnp6M~0`t|uy$}Sr4MSp|_+{{DO=Mk+@Q|4fD(;n>7cmj;y z>-&gyU=5x0%O zufXy&9`BC%ws>p*8)zmE5`s+{yx9S6^xo^sS zv%Flh)?Hn_ur=SDaDFxbk0N?<^#>3m_96{H{`Wl-r2z(aJ3+bHk<>6%1dE1~sH&%f zFzU6b+Q^(peJ}|gT}XMr^@W(2^Nu<>0Nw!ix;-?Yw4aovS)4*?2dP=*S6^l1hiqp} z)#cs zkQS^+&vm!>t?%JcMyGd_7;L5^B?aahNX&f}=30X{x|Kh{>Fu^C_Zr6;Qex6+Y0HxD z8Yd`fFeIYroE3V4xd~eC)40SO=8BK0$K9kts?t^t_wMe^8a`VzReqW0ox5nnVj%pD zi^MK3$CW(_2C$tW#yBIGPZZO}8^D+03T~wY+up8HYjJ?8SBpp@VHs$^+X_tk%EjPR z_#IDpYwmlj-d3q@E4B#bjNl;_QB~arI0hET8At6Lyox;wIG>I)JKi+ABd3#p5 z*k#Z$HA3qtu8-MEy4qw0)Xcy_hMn(|-=K#^A!R{rL7hd6t&@}Up)??AYyvNwzObh& zzI3XhFg>-d-i(2cpV>V+Ifj={>bzhG3MMothWlox3tUa1hbg3o6Vn- z0}_t5+;}^fa^2p(uMSN&i{M>rvmR$v0qZ!nn90)C@29HE@a^1!1XjpURi3n}wr+^} zL^3@nTA!?4Q z#?xlx@eC45q7#Gf{Uzjy}p_&F-$#Z{2;thP;ekEJ49e*Q2B<TXPt%;I0tumzoFM|x*~%C zy}N_^79A3_a*E^THuZS8r&F-litV!s{DTI89y=%!-NW+1OkdZMABR z^Ntakw44;_1b2+{2^$}l6wva$=u~+6A*iVbLJT}o04*=B)FuiwhKb+-4YJFHPQ*Kn z@+tM%%G7e*a%A*9Z|kuN37eI8;pT4wS_hVha+M1PB`p3p`1PQ6*B+t|!KrbC#qMio`6Q;vmTr~j*-F%>h100Zid82^ogTg# z*voCxS-yf>;LdN*fyYqy4~CVHwR>`LucQ(O)Zc1kryj0RW|QLAywxV<&i6a&gjrlsgCG3Xi;%)5o9(4|`V z!UH3z$jOv>~ zcad(ZZzXP1F2w%#k8GVKaU_K8C4kYv6Y|KGkt@QjuNm=zIEe3VG^FOPpk@U!!|x+p zuTnX}xu&zE!62)MDhr;M1c^)hDb@BPUG?iHWV4?XqOxH42DbLz225!`D;%{@z#T$) zKOQO|vY@)foM^z|66|#{)?-ttlS)OXzNHLavmwiNZ&ELP+)hD(4iDsr{`9BM|N5FU z=A^rw+JGvc6$j#@5|$KlO1Eg3_FZE(PJ5RNJEXE$zg8 z|AqsQQCRtDBizN2*!1Fr_Qy!niJk?@^S~L~MJDkZX1uqrTvOA=hQ=AC9Z1!-fy8vI zI2e$Q*oBv_M-cD3Cu~xMdsC=eC3kFckhaqcS;Ac^D;WKcLo{INNlyoTjm6l){-$A3 za0gZdpLQSk^l05?4`s&N$?Yqm=}g=Ttbd|WB>yIrgLuI!!a~!wYcvJk^MwWo=H`Cb z3ZFQ?+Sc?6)BHN8Hi9Sx?sKqw!?=uEHu_6L2pHz7lOp6kp|CrB$YfLi4UhuY z9GK>+9R&kOS%MH{hc$+%nnDAT6+h^qNNU8w2Az?pFtLZktoJ7f%<-znPBgCbGF)r! zVfDevG&P64blNSHH~TnNP4g>s8@FVbUm6Y2C1Ez9n&9%Y+F&N{)4YkB@h<~iWf+E> z1po8*b@Pakn>3&=p^_Q_s{$hvJPiQ#6yb|%;6uh!V-zjOLhoq6JO00XckWvt#%vM5 z@!DH9V9WZ@?KLsG6o)FoCQ_k9(UXMQd*h<^RtNT`2dBNuKkDMi@<6oWhH{;(Ju7qNisD=dJ|bQu6jvnJ~>x(`9x})&^XH90RTia~p^m{YDz-pw&jE zzjJLI`)`>h|7R}BQ{Q0+3D7@Ja*>O8!G{OcG3gG*+?%jX$yC$@A8uzKLhAEjV)qwl zgC-ODTLuNkvn{9<+%{KcV8!x-_=!d*YVI=Vg+a@cXn0;Qddj@eFxlm0YT?jMKFCCTD^8exCYGcyP32Ym&oU|@T+ zt!tc8{?MZ@b6a;79ObqS9CofOJH*&B{POmP(^(pCC0=>y<1 zJiMg6vKoF6^bm!C>Y?Kd4yZ`7DHnOQ+ec_6swn_P@3KN=3xnOKUO|Q)_4(K(bx8a% z0!Fl;aIL2kQ_ky8j>PCGJ_)y9RF8Khrwzf5Zqe1Ex^cmzQ^f1L!gK2~^ux)SaLbm- zDd@-Ta+f%HdRp(_I)xu~d34$?aV%LOU*NmWm+s%C@Z@W<1pq!pNW3E&ex3%1}k$s6i<9|)OHrl(CF1!6_-h99-n9txs^!LpIKIeB?y`&UOw~A zx&l90D*s9}W+=4Jx$Jn%rR29Yjh-`}p`oE>$RcIQGv}kMq!IzEBbHHC^pU_Qq$^VP zcdkNqTJ_{cwl*+`8!*)d5=GiZ&21WCfU4;kvgEsvhoF&7%M!!6Y7}F!pC6lg?bSXr z5q19_Q$zwblX`IQ3(`CghSoWDX#>IaHMRUef?z0`%fZY3xZaL4^#x+%@{?I#T=s*GFgGRk00b= z5P#X>R;?SPSm4oBlv#Fn&RXcsG3w0(Q-JT#uIV=@;?p%QQL;<=6hdgO-92A3FEK~3 zqO^-A)!rR1*F9){KwGP*R(tW1U`ONbAQn|5b?nAmb z`G<5hr16-BdDYmg9k1|BP48#>LUXIT*H{kipWTWojrH;#ZxknguXAI=m9 zETgZ}0B)bK(6NGCf=r2ftulVC!98Ow!8x_EXSdZwx0QF-ko|I%PVWsR`J&&7V-Xr* zcGpl*wF(uK>_E5vGLjo_LsKu|TG)b^a9Qve{A^&~<=cd`ijbBM?}edo13jS=@E}jg zHjY*?F%}mW$J?!N2A;Q)kura?f_`N;Jy#P?2vy`$HVw#1OTkWyvaO)|dl9hpaH5kY zc@4{_sZ%u)thQYfy#Np z=@wnPISvdmLF+pk7Y@817_bPz^S-&@r5XnewPo`03$vHIZ_1^tdnNbpo2T9qrVtQDHXku!xhMt) zB5HziEeR}2JoS#Lf&2{il+HLNzJdwHuLSUycR=* z;eLfZ7bO5S(;3FFHIj}ZGNz$=x|#jjqDiC%N<%p*<(<;da`{^;6NtP+^AUY{Q4it18kTL{GQy9Kir%-CMvUFdHIgO&p zFM}rVQ=-?)V|aI;6;f!m$m#fV#ou4PBVg2bXU%N-T~-Jr0L}?X6)E zZ3vEBaLqVCyC-M>&KG3lQLv!07KH;fJ)Dc0LELWzW-G5Gf_qsZ#37sZt#)u_5W%e# zaepIflgqLbN37niz?6T;^&d(N=~DmrULsc*euhl??boJVBfbVM&GWN-Zz|6oE7;?!4WpZ z-Sdg9g=09|IlFVYMoRwj&VhdAsdqp*Gl=KZFpmlh^+gwztOCIJ4wg#_N$2PU#9e*YNEF9<52^er+fIu%Cguy@;$>nTQ)9J zMM{$Q$4crX?FsP3EZCimU1X;CW8J&TUc(H#zOCBJGL{#2kKGz(x$Wo_C&O|xxAQch zST{)n;^xxb{zFMVby>*aHVWdUc0jC!)_S?Qi|QxRk=z-d`qh) z7nKGD`{dGK)%RYw(rx?WU+mexgSU(EUA$qgXh;hU&@1afQz@mYtJsIzMcw_L=*U`r zG&KYs0Hu(sQ&Eq>I(9I2LVu+c)Iv4g^+d8ThKWHqJyY+Mr4%&PrkC&9+qFj~%wpXNdF#9wNt63&TVR0u5h0 zVLRl^56a$IOk0Adn$6l=vQV=95~5Z`>aJ4|N_wKF( zbmn&0EYSYXO81gw9+PECFR0YYdYqU!>80hESMvJf(=Yz8j@_98)vRL7Cm{f4-M6>~ zGd4j6&v4w-5jXoviD_ff!pU0Lig@93;)Vu}Vr5EPfd_SLYP+RwX*r#7JdyN}?P)Fm zc?0Z-JT>!c)bSn0iV)jI?L8Z}j4|U_`Vc?lNL_bDc1}%ViS~$h|2J3f4hN&V4_1of zjzW-WuhZgy34L+myb&>VbV0K@gX?bEz%`ATi}opl7JS0f6`8PWZZg(!R#c℞Cze z{c|{ibFGqU?5Pb0CSpo3XYC^$cpfqO(2GI)D@wMJ>^^&DR0IW^FD4bv{&PX)cg+t) zU$a$0t+dWtg9~ELMvy8s+jAf{m_h$&ZP#a6OuMx9gTw~KtRo{fUwMTWK zLQM!qP#c}y_i2FhZ;J>@#z1TN-cjaJJa8HiZs0valG*+_$aZq+A8Om0se8jrF!c_+ z86$N*OxY8h4$B9*;N?nUsPgA2{voaTlDf!B`{P=YET3=n&qs(7`OJv!qlt2LI>*of zg792N=y^wRB1ZJWNju#NDHQx?LEfL05R(4fEyE@@(A=;gW9_K} zSO-y4k$%ENExArd_^Yv4!yXBe2p)G$UnN|qp%TYYgL?Xqz#NGk?{Jt}w1W3Y+}+dl zyrj`5d2uM$y2UOkRY=AUal~c?&5EXk3tuQbjB6$9Y?)L z6D?M2u}X#bN`yX-O-M~_pg1<)x;d{ekK{R zsN(H>#xYvHc{P?ZV;5j#9~1kBt{qo(4qWM0(zIbte4_f0q1 zju`)J&YFiQM(m&2FAX~&m$p02SQvuAG6 z7yhItHXd*Fx+~~@h_biirNqwGSI1fEti`OZGMX@OA5#B{V-9nAW^4E?Oo^BjK8?(O zQz)FV<VgEv_yazaHh3 zZ5;eEdnE{${>1i3+pbD3UmG?1!LlUy?wx}?Mo!!;T`!myjRZy!B`xTdCTM@lSj(-9 zQTuZqSH#i>9x>}aA5Aa}*gSSiam4K}X5oid+V(^j9rOjifXhU$#(bOzZs|vEmJ3i* zR~f;L2I&A9w`1)lZW@zN7xcek-{rfha zn7bTyfw)g@qukyBMw*Ae@}VUE*u#TWZCH6?%fuiyrj{@MWH-4u7!@S;;N($uI8RWB zSnD-S?xc#&+w4wy7hgNnYEfQFr>WkkcB*gM3?B)HR4II%88jaL4R6T*fMd7T(Y)mzPi9XL2*M)&}G8r}vA1qhh zB%(gzj!^4z$%TvXW|U{oB6U3?xjP zGohakpi;x%!pi4@QK2wX+!&G=LyaD6C#^VwVd;OK1p1o@thM$lbYM*v_ZstP1YZ+o z2o`>LO;a{sfEzno*dGy=ZNSsD6ggyeqGWw4F{#Bm^SZ9r)dej5$ z<*~~0?wnXn-WCs;hxF3PzB&&+fd_wo946utwUzKNRgssW>T4JbJtPF96-gU2(2Av7T35^Pftrx7t!fNF1`28RDY^_zSQDA-f4 zNc~&K^tF*U{PoUW_WNAth;9*lLoHupuEU8Bg&E)&S{X!fVs?;$NFafDBmOwWYQpY@k1YJR@5|C~Zb(PhkjGFKPbqo=C2egfs#Z2 zgEDyku4{j<4F4r*Gk;WuKNFVwC-p+y|0!|(!Qa#hb-t5owIM<6D;T1DqsacUxSO^Y zH+anblU4UYR$<#PKNq>z@5%#v0onuw((S(*jPY$7-3Cu0K6neP z*fe9}Z86u$hAw0F3bTPrYCR4Xe#O#vV#RV3rFfYPK6sxgsl-Pz%YvzZ_gsU?p-&QZC2u@Ef7Xj=z2o!!GhUiuHNIO2DNf1)ct}^M5fa|Itbzf__r~bjrVB|99K^ zPwfA}xW8xrcN72r-d^YSA$FFB&W9+ghFJvoG30u-$kb-dG;|b{OT-obgFgL#OAzRQ zYQwDDsY&kR@R~GzYtfg=$5hc{KCq24Lty-_pl`KZ|gK`ZA>(@*8H990aS3B4z)5#%BxdxeqT z5+NDRZF7U{O}vL16+RFSGfPtTRu8_HG1j9UC+d5Deb1&@sY#^ZTYA4bE$n4%yTxFa z`&fJ(r}w0ArU~!CeO?ZE<}r!qj_rBxihB28XQu1%8+o`QbBjM&q+b-4_}#67Uhs!y z`rQj+alf0+w|`ySf6=b*24g!K2>KpL{7p1qbN~}Cq{A3Dn<0o(xqlHY9nV;vcb~&x z>T@%^YjlQ#S=x818w zBJt)LXG#(pl3BDK_l{@w3Mhg+K0bSRWYL`OW#|=BK9B3!Qbz)m#ZVVD>U%KLJLC6&wS@Y4z{99J1Y} zzCsvJ3TarXCl}1v)Es=ONqx7SzoY>>^$|Bm=)lxhK{J7?vu59O)QO*|9I)C4dy58m zHI3jg#}Hcyb>L5}HU!pX!lFp-&zGXAPj1ccMa`DN$8@c(>O z;=i6Wy7teH32fab@jM^7v2_#_`^(IeB z$`m>{1~;sKYzs{NV?S8D`kt%OM|rOfXR(NHrBerOrt^~!Ik-wmAAMHnIxh_v^dNG* zUB`Yxx}b^;r#DMizHLzE5UTHlhmG9b2AFckIUU*$ckLz_t!JwlFodRRzLR3K`qC)> z?w~1sPY)GdenqpM#gAZDH{ERwMrEDv9ojrdMAOj)82^dPL=9H?zD5vAQ3?ll@+ zAwar`N|Eaw#`&A$sShyc_d7`Ten_zDDR5xX7Jo>jw{JGRwN4+b*`cXqg_v>XZTfj=ib8RVG&7l*6+vK-V3>6Pp{es4o-z#2jyWi zG_VAQ8w_m|Bcf!@uChY6#UOieF*6fn&y?cZ3ulLg*~3~>I9r$>GWc~B5}|bt+-2a8 z1h9a|z`>%)#ccPWryfNIJQgIXqixEg!2F@!C;!tMbw#)e_vID;*VyIB*EGQ56zp5o zivN(0Pv!y*VD2EgzRi7$EjdgX<-Pm*%KGFj=gV`?w@Q-L5Kdz-sR$* znn48LCw5>Fua~AegeKJ;ykod~Z~BgNH$38i|U+ItL$02zUN%nd{XHCPmms7Dv0p7 zHwT^fqHDr_%V>R*)5X7pdhN6a{`q9XAwxPG5FA5yri#q8*&LgpF_*_rGUY}lmLxfW zo0pTqhe7gT%2!>%xs&-dqd3mGnQjZjlGVUA3yfj4TmmOv&)2tx-ZxhE-tm=8_z9{6 zuwcxjuD!&JU-^7vAf(i!C)@xx+NHz47J+1m@X zeB?UlfuqF&9iSTlT;8qC0`#si2`%O8_NR6-TqZ!2&i543X*6(DB?qLb62jJQSoxjY z6>^GJKb=(;d=FstqW+39uR2Whl`>KV3Wttqn-pSi%uTv3(F`#*3d^h1*c6b@s3Jor z7*rCA;>nRFyW${yOdvM)joB_jKS$wzIPU!^C z%b|#OmiBsITW-Io?ieTZEG>8GQTzK(cc~D@#k*Xw>cv)%bJMkPzqLVz?jO{9h|2~Q zF>s*+Dis~XD!z@iyFr+5<(sTNHV3LlL7m#n?V%Z^%O@1+Jb+Nu&j!B{LFQaC(J%B+ z$VJkprzzRHvdl_|Y|v6wTWbZ*yzV|Gw{*w2@WFd)ZnS#LL9Ret$=QCOJLI)fb#t8x zpwxXjrVv!H8+}dS)0GriPY5OPar7F_hXtRdy%d@qo2kcgO-w{8_Oj2k)_K)3Hv{wdZ~Nj%08vxcjP)$cN- z6S&fCwv>HiY2TZBJOleX2V&uH8r+ZV11EBvE>y6I<}eY0J!IcDlP1}D`DX4eU;2!e zQyKo10^gl0#FL;~T}@uQWQZK%F!89aPd)}O0W$+IM8K68fZ&NalR(lAAiz0#MFc`T zoP4?iP~#+H3__zJCLyEQdlaEY$L zj3tVBz8(bPo0QAKOrWQL@{M9C(PNs$qubZqiDhE4TqcRmecwg7~X;lOqAwP~1@VuJvZYEt3?e))OSE*{3~{vH{NO4yLxKF^c|LT;s1hm;HT86S z1_k2d;6>O|Sy^2jpdb>qv&W+~z2Rr55D^sY24-?N1M>pYjOXMWm|buS=L&rOU@r2S z{$2V_bq4ud*BURCFxkcrG}?ihJ0Apg!e9nk7e=`U%HChH3B5I?SsD9uii=}oL&@XQ za`H+1mv|2!XR&lF-JQYZ5wRG_4q6c{I}?5*)mMHRZC%&R7+x09LF&n}-O?QQp!RcZT9-2JxfCEz4bV&2LA?Ov=jLlUs=s1=i+pvXcU zr;z=4KWP*N(H+X5@lEHU#bDcN$yd<325y^(mlLVUulb!Li&`8~PAbWMf)z9x@La&( zR7HI4F>`7sHjaGzx>TFF z3|5}s=1pr}g3amDPKqfjkF$xo4N!Uq2ds~SUjG_g5Ib%`GQW;+vvSfG$wL<0tmVJ7 z@+uA^>x^`|%JiQ10}Fq4OwWc}Pe$*qon*PQ|A%jdJMIIHwj=wd5A<>3wdhl$q`SBY zfM&o#6nb-LO=Ua-dn)z7&Yj^?i+iNa+LCND1{OtV#+(~(4D-{R9wu%(`(Ks zmWVM(_T(p@bUejW+_Yz0?y>Y^R|gg9dz?p#=siP?KU-eDct-h4Dt}yWdeie2Lg4Mv z;l^F6`)Uz7)@BR#$M$^6Jgne!2S@&ot!D&s6Cg#XW`nax5v~fI}x`8gCqP$Z!?=HEGDm*8M&=8{FYSC|pkZg%DNDm$8KGL(plfGnn+^{||r!ypHR61uZ^=X{Uaz^It^XpuGa(q#Zp6^V~nMC_`jJsea z0jwEc1*1VFZ`nXm73s%QCG(u6WcESQ1xJ<&BUqr0r`U&q_SV5%bEVJcE*(!va!FQr zTp|i|;9#1Z=*{fr2Qj**YXyov8IAaN-_nW_(;vxnryhv5lYwYk&93$Oe#C(UEt~;2wJkfjZ>sD)4%1lemcZ%N&-84dw~M`Yy+}~W zpCHdHvfy4y#zVv_2DLpPQ)VW3*Ki)Wh6E?zb#4=Sa)2(8&+}-VtgY9Cav&VwWN_pd z1;PO_hb1|^L%f${1D0Xeb{YA`w@YJW<=2`}{bjm-%BEOCNZJyagXk%fWJ#4)lF08e zrX(TaDCNJo$pR|yexJB14GFvgYttm^0!}D{smapN{&?)nm|3tNyHYe)Wx$E0b3z}= zTGpEEv&)<7k-@%aaPv`EG$Z)*iVFLyoKuN|I>FBzcdgku#KKek82Gn$z80amVaE;{ zl9_t5-MH@z)vGWUA6&IBw){~cDWhYi9-dvNJnC|KHg`HQVK3RfGS6RcJ}kydrE@~p z?bEtTU&Y&;HZhB=R`Lg3*#ThbzM77lHOayycJgrP zd6QdPJ|HsI;Y%}BzY|1r-6oEy+U((*IaAlj2lHR#Doy8#$ZG`h`s5`tm68nDy!sFg z-cpKNnP!bmgMoGN=-|qGP8n+1COXowd9P*@vGd9`*FNcj-cV{j&nk1FdrG3{+b*fX z2Y&i$=k8Tt=gU)7SrWQWRqC&MN?rZZ)FJ(q=b9Zhu!RN_R`j&^@x^`XE{xc=@a5_9 z+mY1|qIF7X^IwjflfSQK59h*z{YetuSWP$-=r^=7Suv3w{J=HOZc8IF2ioH`Py*@7 zaal@_m`Ga(yw7kS^)gK-6%Eg)uMWU6F@qa}lk-nu7k4#@J0I*%_sM z8{6KlPg;~{O8N5wg%<1Om-_ns@FOsUyGvhm4o3ZbI@_L~nX|GuVMb+v9_NbrYQQy7tEE=t z2)6a%a1<@)mI#nH9W`#t%_=YMfTHx6>n2YtG22d~gAI~p2R;`MR4U-=HiHG<8Z*d! zOmKgweQ}YE{qEIkxeWD_w3U3BMs`fZpr*lcgHNbd%lv{+j84l{Gv0*uTgMgOg+E($ z9iAE7P_o8N?3xp!9yw!gzP^Kh=Vxk)cYKZ)ZWd3pd~s@?vQx5zi^rSw36BC!EG!N7 z*pa%Ck@(Qg0ZgcRtKgu8@KI1%ur596lAl>OSEIjj*aIr8w=ziya!&WSmFf(o#3KaIsgF@qUZXh6DO}4`#6aGzGv;SF!Sop3YtZ{P}v)M zq9~W>ekiR-r|#;^l^OYZ_kAqywVc>R7)oVRc=3C$O9s1+dlYskG<=Sws2x%;w7Oe| z+!Ls#{|Wjo17HKvTA;{kAd6Q^x&-tunNDpSPy+2W`*&hDm7btIbO%z@>cL!xjFUjY zX%A1h06jq-y=*b@{|r6LPSeK$L(DnTJWkpv~#d(0-%EO$=D(#%-JH=3-)}U z5CwmvuI`ipc`a|l6{U;?f0GkgKGPAdx_F*mdegif^+TOs%1yl(Bs3@xw%C* z!1L>X-og!(_-|~B@XS6x-!kr@Xn_9oA= zC%~0>-Jlb>0oU@q=XLx#Dekgr#>X9J?2<cL+~T)n$s;@XUR0plN?Na z!&TFk7wfq;21PDQb7yL=@smd1;`>-+{AV-dA^j&MZquyv#n*7%SweSmj1~ zVSC#VuiG>z33Hjzl_~Cp8JrT$Io;HL(eLrC5SQFWvn%}EpJ1~t6dB71=AE`f1!Xqv zo); zh6F8YKVjw{gs+h&{Bxw@cTg+NZ7lj0Kt92g`vrtW$<%3P1sxJKYV^T|sLdaqhPFBO zg!Bbdv5Tv^+MM!CSf;HxaXj8{-51>Q=n*1q?9PxxRl~Dqq8ZjFE!Yh2()W`F-7f;~9Pmqo+sx5^V zeIIS}3h9>&=0W=W1f>@YwKzuuVKdxlCh5fC+GNAZ&Oy9|WPdS`#jcbY1cG(s%_jgp6L{H7SDOc}&Iu?W zCOhQVEc(Kaa%V-e_dQt-1TXKUw>$CW zouzqx0@Uc}c{W*%>ysWqA|6z6lV$k?MlJL?kgTN1D`RF^mME>H`&>j>x;haYL1 zm*!~RP1-KVr5(sAt2yrd{&Ld7KR)5Nm!hvhtlUO{MVbJMYy%cqJb>$pg1VDiR!V9T zF+V~5HoAxW#i)1KIdb!sMnygHFk`kW6F^>(z8_2h03}MS_$Zz11WXFir>wgNaB~9g ze%686MPQ4lk^9zw9a}Ug+7yg}<~%P4dhCO`wrm#?fP}VvO53Ko_^%p=ns^lSdMj*K z0v?(;!7$lO#*y7JX7&69G_9v117m_OdI5O6&n?+-yMZ-P$J+xP%_EGA%&rBTFaS>J zYEgoX>tC((&T@$J;P6Rr4w6#5BrSSpU#3jPgGuc8o2FMK?Jl4ne7Rmz#P&%JU&%YU z`LMKHeBhJSHA@%Bq){#SRj%$0ylxm=!qYYLiC2t3?SN3is?Fxru-`<3tb-mKLbWV+x6b6f`88zA9mSd-t9MN%&RrxI^@&@JQS9f^?l| zpUJUtAi8XCHjL1I-?NI&{qo1ATLfKhc4hl5@g4so^{tq11i9li_=FVW5|G#>$8}jO zSbz`Y!r|QA&1pc+^vD$t@D)q|vhD!93COzlKmQ}^&YUT{RYE`=x!I6^xY=3T+GrKD zz2+|IUJ+m@rBUR!=7znvlmqOxZAb%Ty=wq028bKaz%O~*M_t}KY`1*Ia4!)^oMARE zD}~D6n7>j&`LPjf%ij5iNCAa7jiNuK5wMFh@_!M|DcZ-#g7Af3B77uZkDMa?00mb3 zhj<#U7}lli2~7N9x|g7_WHsMR_+`Lyn*+VbzngA6m;Eo(tylLG^tqkD|vjroBZ^3?6j z{Z&5vU3;{_APDe5{oYWqZ+D_dVsq06i{8QhakDX>C`LwEMTwGd5NJVq?if?rRh)*Z zMS^ToN_byZcJgK6%14Qcibi9|-N7pwQw|-CceB3*FIWDQN_=uLyf) zV1{A#<9s?RD+sBjw&!011LgV?Y-|rIYC%>n1?vxup<@Qw@*LrdoIITa#hK!DUFoghpA$v1!kTX$J^t+pH1XL##xVqoUEyr(OmVE zPRfRDG^_CTA@bnYzlyE}zrB@rn9RR9MpqjC*)Ie+ZAMF2QD?iHbNcO^_4??u!Gfhp z^R+o2RmOLH?=R-=pci}(3zcU6*!eGWO2WUY$bX()R3CKYyX91qpE5rhAPF5=*#b^T z&&EiD<_FfD8VF-hdzKI=lIoV z0rc3R5)k%olT%fv5X%x^aC)XG44PWx7U9+?|s zQ*WcbI}foe&atHGGT(7^*LrUpA%Dkzh9yg5!4^nFyipeJXQ)GjEI)^fx;u|)IU(zJ z0a$4!@dH3(k+X0}0$hrjf&EEB6EoSjc|&6%Wn>t+M~h*5mLr zfP@_f6dg}0nMI>vW1j^;wa)$e`M~lN00_0*{YdU?Ky;Pt@<5NWU<}$j3`Bh}GkQ@U zz-(5pp@}xw;A`va$wA2pKZD zEd<~f+m3$x$7NnW{16PlO`X=2&`0SOp4jETtj!0YJ6ncKKY-r>fUpKzWHLZ^whSr0 zlCnjBcrmQ5YLE^P&U0iSA9HORb@wkTTL&^I$a{aeUz@+4ILz}0J}d8_8)5qxvM_pp z6bFKawUm)Z?l56J^d_3yw1iA@~l6D{`88qDh{oGsq09e{O za206!%IhL~4-G5@i9NY2>Q`xG^NN=GaLe?JMRzETItdeu|s z9%RNCj*ouDl}(%|%wu|c9^*dR4Q%dtucILCubcbp^!5MqZf8x9hko1LO~fDDOW6z9 zs=sdUZ-?*CCH&fMLiMj>{MY^Ec?+1)zwYmEXYbFm_}hLL;r?lVuWbWG?Z55sZzu0x zHvACvFZ)ZK4jAGW%#Z~{&IL>Xz5-Q z*Xzwhz$g3j#2p+7Wk2HS!=IpqRo`v!$Z*PUBKc|w2uuGalD{3Xznr<>Wb^>~FEYuX z4fqa!l}U8mB+2W2$|>JV+I3R6s#eM8w9z%0DruSx3?HSGW~l!VYJkb3WEX5g?woO| z<38tgI}@?=VrMP37JdcyVaQMER2tEqte?0%!tXhvvhYDELh6-kXLsi{0?WkE%EMN8u?X#zGlr06tIXS%YkUUasCn#gdib;&{Ul_;pJx zng$c0;h0%aT0;Nz5@SUR=NBwXzSYB;sNo@Wy;0(eJm**q>#ws5F9h}IXQ(_r;ek59 zKi{2ytFTagh<^yP3fqAq<4=&vsULVQ6{=(v_cZ1Wi>lo%HVy5P?SUe=;u)3Y2B>T#7RQ-?fn#g>NJHEa)2Gw%CHLo_T`4XZYuUt z`8u6BxV)ih*RwWK%zmNlRB0-Ytgw0-mQ|~B!S@^cK4@5@X1io%Q-$7nHl5xe zpTY(GGOrX1IRK zl?1rm{%#0;zZ8UnkMJAK@?!`GrYH-{*f!-OX_jGacl=UdcFhTd>}6GkeIOg|D+^S7~Y1E{!JHJMmZ(rA$$iv43Gfoe1%a@i$LV@cgm>N zmgzATeunoxBprqbMq);qomCi)4|Nx9q3Qv&1z=IIyAdivvKvwz3@S`Lrr*97#B>Z~ z0FLBs@nfU1RqvGd_Jv-a-rK6DCNnuvU z#>1WDcuVK6%aWp1IcZK(y=8T2&VKFf-XIG8p&;LmLBo8KlrFbDu8C4DdakDcT@-%VvobHIJSb@G0n7+*y}MTB+W6EiKYsM4|A$h1HM z>hrJtgvR0H2wX-Zm=>T)y?vlkcxI%FPuFK!xJ1Iv@M*Ja%cJvjhaX%TqTMf-M1@?v zncMVe5lv4PhFM}2ER2mr_6@4iV$F5c`p;bdYNUABBPD-6_2HhYdKc|S8~Jmt*LV{C zX$aBplmygoNKQBd)C}a9_QcuYYGK?qZbgB)43m04PXHT{M6@h5Cv2wd%?XFDkSJ!% z`LMEng;4G%rj3y$4&1H$ub<|zfu-)Fa4nqH+`2-o*Jll(PwSrnkxW`c{w?|O-c z`I9eqR|wtN6k3r98=WhSR{XAzS02L!^rmwDA67-7#gk%mzx=f@@5M8IQzPqp6xp@ zY-xEZoRQ>l|MFhy%;NGE(tm;i@P-_wxFzcf#t~2KFY%Z4qcrO+mJMB`8`s+CCtj?t zQ{(*3KBw|h{@WBCzytlq&lbvf%9#^M)1n4oDwwTqd}Fm-Rk)7hXXC5cA_lT zclVF46RhXH8}P^7x&Yc{V1X6XtDNW-SJIoIyFi86Ga&|+2KD$T* z=+t?`SF6Mr{6<3cByMZEA6*+?h-WPTAKZMj-Db-jD9*)mJMXxx>NNEAeq<_Ygrr6s z$W+53&W@BMJ#sjmzql{Vh}`D%n41Spqb|00ban}Fw({&k-$jWlyv_m=B=y-d-u;T~d|G~jm+uLCv3V@%; zuoHc1s*IS59ZkW|7zfPs36?lQ>SX#Z8-!`O8z$YgdS+m*Hel}BI;wHa+VCgecI$tj*F{%&)okoXo*GlU zhYO4T1FIuKq!uZPt;sbiVOVb04IBkqbwtC@B;JKK@{CbTuRK52=I!@&>Gd(R1pio2obm+sueWu z!J90RD0#|uKYf^0%|s9-&nJLWbmj}(7%y0#qdr;(Eu=Ld2)pu*4#U3m-13t7#P=bu z*(KX(Y4^_a<1PiNd}nwQ-tFmZyWQ*G?vOR<%Y6}H)6024GmK$hTL6@h(b%J?o>~I~ z>f>jwvuq(ryx=pwRERW^SR{gt$f{zEYu`H2FSXdLmpay7qs0*!XGjm?x-MeR$_m=E;drl&|)Ut{nuUjTR*p9 z5FC!1FF;HSLpg~mBe|9OQ=COZQa>zzf{fi}`2@z_0GwuR8i`b06yscnJr*-+phra8 z1~1ugxO_UXq&{BQGu^@9`vm4rio22687)rax9`$rPwPQ+C}M6^UW> zAGZ~3QYAUFtblh^?46j{1@xalf}yGDKYb8TX^YA|#~Q zSuss#yEBWCu+TL&R(+@}@o>pLb1i#QbCrehtaZXW9EdC0%a97sfDQ5|vkzmsu&1nna=+f2 z+6=p5=cEs+_ev>M^mEGLy;ryjo=2g&_;`=ix2}=diS;v74JHfC4Uv7<)s01!I2|t~ zwmZse49r90_U}H22LJ_@aKeXJYY=S=mLZ~AM$s)WBz$RTJHC`DAn9 zdWEN54p;`}Q7*0d3!`F5=@3;HdDF0{*y1^6wLE9#}X@ zO@!PD((HK=%rw#4JMOM_R`Uvr#fws zCAx9u>Ib&Mj;GF3ys>$ced+q+wqBAH(KDSSiK|;=Wn)@q^I&T6%v@&UmmW+-sL<}} zeFr(YoHz^0d}VnpGxQ^6C2*EQ&c9-no4Nb#8%Q6xzW_ViqLB7)r<~zG@Id^#Zh6W^ zk_XOx6gmh*`VgE<8kqs#e=plozc^frW%k}-n~!#Xtj-VWYv;1_X5U!{N82O)RV2*5 zpdE1w*!9F@Mtnr4K_3(Qiz>^9Z7NAGYCVci%oo2AsH6Q5`BHOY&8#bo#5wH*e!`~0 zijPY;fl4=@Y4>v*lf66^nGvX=P7&1~sD3o8<|BP#=pJ${g^5fFFE4xFo( z=BB;wqVAsMc|z&(SHTCqXGlRj;pFUK*6LM}dU983Kcn6|sQ+T9fT+M=#MM2oobUJA zn4J!Y-7bB#XHc;3)dd40jyuW;q95Q=((%@1(u`LT9GFki z9}?r6vl$Ri>L?xd+PlYe!5=|;?=t~q^mp|bDx8Q%gjb4Aff>eO8BHedIn-lqs1uad ziaaDR!Kqmld8dOv7UZ4&7)=FwQM9!XOcr;r5Ev3yqQG73r1Lh*dsCaaysH=)lB%h) z*~M=qJ6=fXA-VuUOZ3(QB1CMfPk!ReV4z2 z_^XZFO1-ZWx>zT6`>5cJqH$FRbM2Swn-}ztDLPm`yFbD5fO_7s(|B|+^G~9&Bk1M7 z{R*6)pXi)0ttc}%dEUU2-~DuO=r7NPUQ1b+tQQBMLVIJ+u3 z-ZY!?j(dFLTX=!Q(anJ$I8Gy&eY@is9iYr2g5A~J>TROPz-MQh-Lf3zbt0@4(v&$A z8B)#W(9Y+MJ7vS-32)rXC}yLY_jMcSJISBXFQTg&r7D&KvLJk#-^(ya?f1F(`Tl5f*Y(FjzBW?NR^W7}_-o&`KNcExKPUm?ES6L$w{(OAwdPrBfW= zgfc-*L}T2S=IMTgFDQi9{%%<1Z6R}q#Qv3hhmjt4_27g@RE4KDuRjZV>JY7?*{ey; z`*TDc#eWzo_3u>Pujf!HBpn>Wpu1?aD;PqF`h=Sdc1n}9=WwgB{Olk;p8E;;PK@&$ z+ZzVSjKqR({-}?D?zlko!N1nRM`l1?7p956bZhP z;(zrf|Kw~dgGDYimZ4tvBTc59-)?v}K^o57`h)Q0GW83IRG#E+fK&N2jYbwf{6@U0Q8Y*Z zhVSaqFN=i1*4Au!RXt;RE<_o|OK)52^-CRyn$#`m^iSzzDgH=i|NQ2J7GIQh`4y!z zHE%SWudxoq_FsK-o&ER=-neSt!;~VLHL%72na-iFa=)bB+rKY0?!Jjm4zJplRMr>E zHrA4ctMUhZ_0m3+e`gMc&tQ?nGN4E+g`mvXP=erQRZ+|1y^bc&+tN)+P;Wl#G+TVb z4wOrKQzI+wQb`Ipi=vqiaP+X0j>WazAr!h1}wp8?V30}j2quBvSsV3k3;`x!`;a~mp&si20#!G`S%N+iA z3}%#1Mww4JESkmRR$To5E58%KF7LtqO{N$azrB z)}Cn=jwni)W_Udm1M?fg$~JLpLs(&T!|?@b;mzq!Mw?DA6}Ou*ye`U37gY>@+0%4W zXOV{j2z`TWW-PmT+4_rV8CCZ753`uFK;RQqAToO*>N_JJs2+!^M=%p78)P8N)p8o( z(QN*$Z799k`NU?mr|<&p`nmG{E1oGlX7ZPxQFn=;Z{CB-+auWEs(9*qWw?~p11G0% z(uEODK3MM}+wSeXGixt`EQRgaF1gU&EpG@vnP~MW@1-&y7ThR)3NBex=;&qq%uVzj zMpRKJKYVOi!N2vYWpRma!Vj*B_Zl3eUWM}_O8Jn$YH4B%?{W&y4Z8_0ekC5df~1b( z=kj{lW?!gg_D3&@KEO>rsVm(U4@x;%sXWD*g=W0%?2HAoE@yttbil-jl!t1mB{uN&^|W``B_PD0WXE40^xyFKNP{{$S70zK1 zWG6k>_NuJ1^lsVdD&xp2-{fu1)87Wc&=J6j7vNUiD(q?p9W=E!CL1stFQQi!={R~S zxNdXBhbw&bqb23LZo9$IHKbcX~Pe{9?C;7#xW*_IN ztJra~iJG0Lz`I)DBlA3`pfBSF_nT6!`AnA;4!do8q!QSI!t+@iMgb=NlqW{Vm2^dv zPOMgQlYsrDboIb;h9v=og%Sfba}D!;?G_)Gv$HoVZltj;0%u&G*P=p)^)W?_F-a5; zZS*cx(m1$wQayntd(eWRD5kUTqqSo6?K@@^nP!(ktLIJCC*AnnjFG+e-@dV^12og! zr%f*X$AkU*tw){4Z!{`H$xLiSQ(R;(w^LJ-l=oM`u@~d?r!-oeGt1BDT$$&5z-wG( z8TR695SAgB=Q1%pXM&_m5hT+jH_d2owF@cn>-d80wEhOL7;k~1Fk@m z=s~ysNni}K5wcUP<>vEj*RHZUmI6cH&3cKihck)?N7+h`oSk*MfrI+4v{InDm}R_`zId!mDVCG4v&09b5loDh(WSt-7H zPMYribixZ|p6k1D^RT_rQs~}xiNMw?;hHq%7b+m4VmeI6Aik-ZADz@#En5-Z=$te8 zZSN~HS5eh_;e!grr!%|vC@Lt@?Z9H!u!!Q1u-KG>b?U8a~vSah24u1Nuf4hx{;S4iD{BfYkG-j7uNsHEMa3 zaPbX3Cm>8j@%za8-#wnZ%e0DSPnC;i$3D+jm9h;ARWnqrza%|mSPL#53MBIqWox`r z8qp*1_4|eBv$^dC_d7nGeAo4)wKff1@a9Uz<{QUXaWct*)|cua61o6D6n6`WDQVjG zAA;ng*Uq}pfVr0ZOmkSxpWf!)Su5$_C-nMcFe!Z}^%a^yQSco{&bgR?MbSt%cD_aOiN^MIX7UG4Yp_4!2%fE#cn^^I0L&dBQ@T7v zMXX0aj*{aPw+XlF4YXa{#O7FBsGgH>tyu51AI5yvU8<3CwYlYJ2zn~P3mi(~JGi{$ zdmLXJ>-u?xhi#z9QN`Odv;A3Qi7ua|($%;()A2%Heh%9wemNq1iBEE{o(s-g&R+p` znA0DvqP;=FGkd=LL>j^;e2_nh57%a1h?jj`_?kLo=O9e}coehKWpeBHcWxSS%aShm zQd-s_2U<@gk>*1xaGGMzF!$w*fA-EI8p z4Gb;I_Zh#yFS9?7V&6bW*}6qkAotuuDtEbb_@PSFb&yB8v_KXT^-5|Z1X?5;BpqCR zVe$51%9l1&>@m(u(>G1Sbgr`GEWBkZVb%`xG=)@d{)m96U7{4c(fvY~W|06`ka2$w zi};MD@1rJ|rth`14t1XaZ-e?HOU|DG)F1W(NNoSp_pW3iJTyp&VR~hQg;;SfNV`{R znA8@QFlx`c0P;GDc3&F53%ILw?4``JXO7u9>6MkS=SyC3Xz@q+edY}>kmLb@tYQEs znsS*eaF}MEO}gynI=vBaGd9IAAbIjGo@p1U>l{>)_bkF)f`5jrO!&lH7&pO+2gos9 zSxfLTbv`uHW6$!3VUMTItrwYRTz1V7$2Go}a_3f%?wmht_t6a{UuiikbH>d~5#AH9l|vlNF|OgGUt-mtn$-(@u9%R!>UDWgUw`s#VOdIyCS z6`xpQ${->JgT?sEp4P4n&Nsu?Vfq&VxfUrNx)yw5s@H9id;zZ7KicFgKm4OSqT#Wy!|^wdru#%?ubSM{ zpslIwrS;5jd4+uXkrqf_d0fNAg#ZmZG)sf~cVaTsd5a5+LLT{@YgW5?jYXr|pyTWx z4$tq^yx$+G|BJa1|C3&&Z1t5TcHPBM*NwY2D%=XATPv@ny;>e*lva_f=oW7`U0HCE z#6y1thUz+{B5Go$!!od5m1Snu7%iYswfdAj@Z7h?tGrfjC%-9LvJiCFkSRo41~$vw z7r<0B@e)+MneHKh)B*B+ji{R{{t5a>C;(U-I)DzE=qErTwHA=9>ua_^Wg#&h7>+Wu z&^ZDi@+K2fnSov!wB$AL$4OkND0)#j8|XsVx)1P1CPJp4n*O}iAOh$46|s5S7rvHqu(p>d z0ofhhlA_qB0~Da&DET#}i_9P`PSyhW_NYn@sf$ubJoZph3^Ya2mVDrA6aN4FIzB_g zIJ|D{p31Rb5&1~%oMV6Co%l6f%vI-@@Sz35Ki#(yZ~=A0xLz|OG5$us^eH!^LW9D@ z3GYCLtIeJZ3<8s&Qg#1Wo3=;awQ8hy+Mpz~5^S>rkO81? z!pzM0mP{cy>{L$W4+!=?h2CM?;xxX+Y^Kzw#dJC0WE86eGZ!CSW8fVS%O;d0C9rTv ziy0!*7cr0_#wj?xNl7xBVPIvkFo3KgnbSk&*5}bO1N{9S!W;uF)ZefA<0iQ680G!*J@?+$&pR|-V-5qm%f{cmrF zJ>b$H0oOr34ovLZgbZTH2+w`scXTwK012rKfNX!A10WWnF98FX`~ei`rz8{LKn((r z(&m*duq=412Q8`o46=~wYlE}|3_=PZ?lmcULHnc7t_{c?$n+;C$fC_48t0bzYj9R~ ze9E?@1C*%H49;G=$OB-odw?kElIjl~Q46~%8DLy@$sbGK z53*!v%|2{e~QwD@QL<^AnH=`yn>qQrl_znEwP;uiUPB@I>(kMM&lV_SI7R2OBK zSiBp06FATEHj}`aXRhz*QM0kfi)H{W1KNw;j#k*=IP?MMo(IhQxqr2CzpUQ>I8EgD zxZ^)OQqChrX>AEF@J2h1z%9JPx&!dr8?H^R!DW5BcrNpxz8nq3oIta|k@lb_fU4+- zr3irf5D8jM^ZdM>wWJlMhDNd(&3N%ye=3 z%~koS#8rUN5^`dgn1l@oSTAm44ViB6f!>YN-La#3GeJYZK%Y1fTrGf@Qydl!@GxvDN2u=36Ak`lxr3o zh_ks?@nQTc?1w}98wB5t1Gl*e7F^Lr7)d7`W_TNhtr%GUR2VQXU}=2ud8k?D6N@zygD7|3b}O+*@2b(3uI8d$af4B`HR!`OZ^LAy2}@&G19PtCfP&rK~ge``P2p zjSOCCJX5y!?xl*pV2l}waNo2;pfZ(#ndQ+?teo_IOzLtB2JS}G&01pfnFVhbC%t z`7gi8p5fkq=#Gm2mt)1yjV204KTX1(1P+TP*&}w}7@CxV(`^`W!-EicX$ZyEL%zRj z`v!61i;Uf;Nw!E#%CP>tpxvU?FI}^6jh!OYOPT&pPHLvt*rGB5^ zkZ&dzp%ZKH@MH4xw3(068b45$hshV3n~_05eb7F{_9tQOE0w^+Y+RmR*14)A4R4PF z4q}y?Ll^C0vK-F60;_XbAfV7&*(~Dvmmo!~QAQwF>HpW=cR)3@ZEFXEVgZ9FAX1_N z;!zMAMFHZ$=ufVh3~w6?t*7uHyH zZPs;U3=S}E~xIl5B{H3g;W||?&-eoGrVTSRO=GoF)&r!=&0nsTe_fJ z3le@mkSppvp=(ylt(c1Bth~bV@g~WMO6GlcdLC~S~W#ESz*>IcEgtIt|diffhXX{QU@CLa%*m< zXkPYoHA*56(n^^jqXoK;n)(&mO#5CeFHkYatZ~>nJQ;n*_ltXi<7`VcUeL5@i8;v2 za2gn=UXZuDCdo>%-uOCh0P#{eUpeLIiFbr>R_IWT!IFzJ!rUGHrOTCY7gzmwJ!nD0 zVLgsBBJ#X7{Aa2OJm6^y<2tsc=ndBJXqh1xQ*e>6CK35ovywQ3V?|*gxG%&^+?0gd zH2RI=D05m)LgQXezC-8y)$8HBWx7Dj%z2+A1+~d4m}-d*<)wHtAMj)cf{6DtoS;$#J+NOGGDA8 z*u~K>B_>5j1ueccJJU+_ZLlVsDL|)%%G*)Ywe^q1R&d88KX977vr#Glp+~`Nn2yL} zAZd1_mYu!DE5|+)xYM_XN9Tw`?{&J3R|R%d0WFj+6(T`HJwWaU(d5vkUGDKphPAnO z&N}V>_{?!G%`andLc};^s*0PAEOl|Vc{-(Fn)K>Hh*3LN>dh@8E7uAXXH@yL=*pBc z7RK?pv-2mPx5ljPfyL`Ofi3(r6S#6ugZ)scc_cpjRtmh!;afi+rf7PPcY{jh8-7-~ zwdKcNbAH9WBD`vIhpkj#m*X$6KSnm&R1H`&6(hoX>kWG%dY00SDu^e8SX zx5q?H?psv|;$f4sh)ki8!u9QpK3@5O3A$VgTeREy?R~xI55rD#>LnK*C!O7kt1xhm z@pbETs|^V7Zg5fQ^MbVRCv z1JzAWUB*h#$1eTu$Bcr~yLJ*G>Jt8&@Qub0?xO7e@K<`*$k-FLN)N(#0weCah<~KL ztjCDQNaK7U+Ztt^J3Vp}`wuPaRYcbtltp)s?+gmPd~n)p_>rGDJ&gw~;H^Pl#!G*7 zK-j$Gxu|mTqhtS2h$Q;tSnS8p-Pvq@sjZ5;A;vr)q@|U}jf7&eC|1ep16N$vB#my` zzYrA-JF|sc5X8r)FSHkOs>Pa;q5-j5;aU%40U?)&P{?Z7k}~7PFfNEpjFc|z74;g| z4K8_>r9+!5%-u_NTBy=fY98K6<=!NY7*SMY#<2I84U^V3Ab=wGKq{2DVvJT`fB31` zfIbOQIhty*1MZ@qE^-XPY3+mCiIY1B>&XY%mHp9Lr zb^;jwcGjXSM%?@Bi*HcDN-h3X(u_@$CT7zfM%^A2hqRA)KT4|K(3I8x^`Z7o zv1<$bWi~sY^Q1XRY<)GgXK*O!LzBG$UBRzXFw4%gJI}@0!^OAIvkWiO8F<#&`6o|9 zp~q2s3N%Cx`9acPpD?`>=0$Xm8XOlkQ7@8m7!0!|4+F_gKGWtGa!rldaYBaIBi;p~0ac=tWtQCe~ zWhp#XvMBBLIYK(0gmPNI7+PNc^^*&}H@_;Sbme9@%R6FTDotO@xp+IqsG>pzW3-k_ zw9~s)H*)?hy{7H7>*iQ;PfyRM_kl2~zDl|pr_u|3FHi;c_&S?mJXC>_S>z7kdaL;&}vl6GR}QS zLFM&0!JfT=o*Hn?f24NLrl;w(E;ag|_A(U>gQLd}1&*|rxaBB(9$i#OK?#ht{Pc-F z126?KCY^CM;vHAB~sN4*8Qdvx>xzI36~jjhdF$7;JHJU17Z!uE;@L zcx3!I`_$&7!gnH3=ie|~@&*`0BU;(LuWm3t5Q5qweXG@OA%iO7a9Mlli`{-Hk(@hO z_nU4gox0VUbZjef4eWAckn&`144dEaefu(2lv;;bvyyFgM%l@bGhlNN{zr zI7DqpPXFUlZuxmlvinW_m|3kD)1L#rMV^hLGEn~Tc?}krrdI4nAf7Oalx-Z(+5rT* z>=67{fv!%}(OL}s0-%7K{tm$Y6&m%+5%*`&wm*>n>#`j>p-+BiGb9@vluNc@CpqTK zdwe8xqsav}L;As7xvS`(>*^bTDu&LqxJ{<6>^_%Qw29L~Fx7j-*YHz!#)`exX&)V@j<#HYynT5Syuu|Pr zLsold3By3&(u45dlx>Q-5N5dpz1mwVFQJ?1uT@U}HkLl~6T9XHel%e($X#WdI}@2fW1WGt1UM-AE+2NOUAIat)jC+0mq^9K8vyX56l z%`u@Co%vJ_d?-GLB^Ogq+BBl4L}KYCFp6)PTYp~3Soth^EQRS@cX*;4p+;%QcOYbv z2xO|RnkaA}*u^xLg>!R8ER-8_?dHl9Oxa7nnfX#Hf7*0*t^36$L{9mU>nEy9Mm;e} z&ta$|2cc8&utGcbe%kg7kSjPNfpiwIr?^(E#Xt_EP|l*k|zk*E6ICo^nHjS~GCwI)bxj8;cz5d2OFTE%3jqUQCp6PgZYW88t zo=A^Nt`UvW3{)le*^dt24Q!2`<3h@I`gX~LDfLNjjNCNIwhU)_?C67F<;Dg@tve;#knlci zjx+sof*R8^*2+CtN26FT#p4lAv}d!6`Kq@*Nd~dQdN^YL^lG(nai>iu{9@=(PUFP$ zIwSFMi4-#_uD70VXX`RwTIgoa2*ykc7C*e6GOihCyw}p{rUXq<%->H1zhqe&;(Iuk z>5Kcy98Sd?B(oh_DYD;j1d!sS zd7o_X2c3m|ag@K6f)FbJGIW)H*7v^gJ9Ob8hi-&BYAO&9Y+n|n!IFQp`ExLUTC#B~ zQ1pCutzvz9fm?8HW*8<;t^yVwf4}F{@Ksb<&@6E=f38Y+K8NCRgWV<@KZ>tb{D7vV z8-p)rq#yp6r?*p;NZ($1EzQorv#cVPZl<0(5O;HPI$h%8ilK{sW#?kp7dI8Lc}Ku1 ze81KiBd&4MLFu^Ca4hqF!a_Ug(!{=l{Voo^u~)Ihz&Xu6&akdFwvet2#vXZxwYYl9 zb$;nYNLPBfUDm)+3oV{~y?!5+D3x_1r|DAfs1JyH5VFq(nzAhH$n0dy#?EsWo$cjK zL`5uf&TfO~Bn<~Qd8^!6HYV+~KsQNtH8qw*Hy#!Q`MKh3+#TX>N<`~Rbh9%@U?TPg z=4LY~5?yi!G2Az?bA$s=4ge$G%i~;DBK0hx=7FxMMzQ4n+;3$~W-NSG>W(_|mgts& zu`=Dd!Lc&yxjdzoIyA2wyl26rv^#(p68Y%m$JNZf4eUE{=f5D$gO=MLG=EN-Q?3a8 z)ZH`~OuU&ILMlq-pY~T?JAS#GerjWQj&n!?nV+j+YXr09aX7CcG&R_o4i6nxvailZ z*STIipJFtwwj@*U;*-j?Y=)P*dEBdej9Nns-IHj6%mQiNs7y^*QD1IZQALxJ3p4BD zm!BF&c8{(m;I2j_caT`Q7b#oM^IbeYE4Ta}5WIU4pDYK3Vy<-&?TBLD`@1BzWUjq5t1FTA z^5%QF)GICXn3r%95uw}YWK6qL#W=0<{yieE=+9elpu zqhT8~DXKsuJlYo>B9{thY0xEW9}Naq8o!)&vCA(atJIF>ch3|0qxYMQJ#=?oxZAnM zIHK}y+Vrx;-d2|0i!ZmzMiUdWoyJV^&q{_oS$MKVBI%Xqcuc+Ks?^#(psRgO&|lSa zpbp-cFPuS@ZV$>gVbq`QDkbvvVT0|JWHS46N!?LBw|1EE&4?H~*X2|gzW*Gqpm4gq z$_{K1GrHtNt*>?-==#QFMqFf%&c#utjS_6Ya^fM8w4DoK2s>0cy)d2_jdX#BMwqt0 z5Z&qf+<2W$%(M#RZNFiSf6NX<0vl0-APu$_wrb3d*0M;oxJJ`rYuEeX{$@j6TwN1| zcWko+()7nh)E}oI{I4|ZU(Z7)h~y-jA*V_er;~&=#a`oag&1@Jj*qp2s|EwTHNc%R zM8?_HRhhqYntvYBeI*rhyJ&y3^1V<7h}*t_4>wSVBlZY#U>A@iX|uOWp0Kj1*K4-W z@fJYiaG)v*C=+Ik20$$Bif6%q=P4@tk2TP7>c98mx2FvlS1CSHl=FC6*oDrM+TJFF zD}B@QMhBLB=6g+#=Mr9<&T`uLX-o5e^50Q7iJ~>)gisTap!fIYzeDEbAm07!d={kk zKb(R8+b?bZxdR@kLVt&DmMdy%Pz$6yqvlYRRu+c1-Zz~dKA)V^KSPS@pI#k(_~Z;E z_*!7!(NH;=M&7Gm3hQ(&Asc=Wn{ zk8gBknKW;mN{ykTxUF+WY)r#t1)W~F>gHUoUv0DBq&M$ zT{&O&Ym(MH`ydU~+1JAM!Hu?khn%3G58$Q9RUqCYaQFHkLIDkzv++Bm&i0Qr?1mbg zEam>1-e*9VKw|5`7m$+kwm^@YB`~hx!&4W&W#ER+5m|tH?YG5W?)!iBw)t0lKfw8& z^3(5M>T+!qw%LnlJ1a34*7tIE>&~gT=S4q1^z7R=uanOwS2=@czUVR(&x%UrzI%~*KmOIl8)U5tQJsDYInFZ$Ke&TEF;iYCuh(%3N)@@2C-OP&fS z-}f?`xN&&NZ}*1Xut}pzXbo=Obr6R7dX65?PVznlJT||X92?iMK!4#s{9gr>{*xyF zeTM*RfRr9>fnC!ggqy0benkB?BqshH67!tl3DiHEaN^>~@TcWJ69)G8_w=Lp_oMp% zA;#=i0rZc@|1G}^&?Ekn=l_pA{_*D`w|N!-ys z5YCu)oTMNSPNO*qTQI}gn(y@Mw6`fz3@2D8;Qgxd3$G zg#oYK;Ez=oxLOyDTi~=dFF@c^(XzG-9G~-Uzb`|4V1K^B(fE2e8NKwLHptp_LXV*_ z+||BkQC~hH?cAyZo@+@V*ru?;?!bl%?YlLStW5Z0p(3xhZr;Y6LPKXdSQ2!>dIC4Q zEdhVOw3}`d;M$mXsO>=lI@YROYWv7+Vpv_#x$M&%A!d7%Gw$M9CoO<(q@G_4kSJ3` zRChtJVNo)Z(ET)bcYpeo`~K_^~=&%(=JqS6t9vapd|A zIKTdfqYXL%CwH^2$}ZvP@=sxdWifirk&I3m2FuHMl#6vl#iNa=wC1u_s7dWN6pLUgnqcsA1=ss)!X*{92Ni!IJZosu;j%Y{Oq6n7j~6xF*A3{K zHe#_pNnRJY07c9Q$wznrfOy2-Ob#Y{;y`0?aFzqmEWQ3VsL29vFQ7huRbj#c4O-Ls zx7=$rp2>xMwot1ufUKxikLT)d zg8=@_b$^YM3*XCWv*b>{@c-}&SpdHfG>bjKRKccsRe^z-watrV1E32~_&QS_@Y9Kt z{Z1lw4lxIX8E>>{aY@IJIWGLK9c--LcsKh*-Kqa#+>t6)0)sFT-%}}Io8+bPDxT|p zX~^QXuF{B|v%G%D7I!A3|LvoA&ju@>oCgf}h%C4F$xb<{@U+Lls=Y-WnPKX$uo(|^ z@7~_(8SqHwWnFoHdHlYDQ~As90ri`sw?-B=<{gMkGuCY@f$`e4*ObZc!Ngiug$KRz z6zCU9HZ0QmblbW0rk`>SjFWMSSX4GC&ol0QDDi>=xyA#%Jzi>T{2BlcA(!8JhtY7l zMV(cLu_*n{ypcC0>(%j6qSujuyahpo=ASaW)_W4Rq z!*^jSJ)QG2$gvekUV14pF5J<|Iybcw>^?kKuoT;*#PPrsaA^4&&% zRsJHc|5dtYRLrGxzdWiLf@(ZV*5oCffn2?qL!_g`z7v zD|$kJv;*j8Q&MyNYCO;b?GrARew*$%TbS6>h{NBOvM4I*GxbYen81@J;%DC2o0yJM z&f>qq6j@&*;g#IcD}peudX_{EA{wM@rP%JBJaXZ&L5t} z<5P~);_?S=)Z(xs8c($0XYw#jxLHv8?r({I^K+jCe(s1RXRV%EkY%y!E3vrG%=ZMt zkT?aF*~zjr7za}^{VRodj-{N&08A{OXCQhlQt%%ed5d1@t8th9BAx<`x^5GS;IFnG-hfwT?=KYE(O%qDq$?>7M>lt~9^g zBSW$@RK25RG^XIi!;P0pb(KXTAk{#E>>P#c1qDL+W(3)Fr32xaS z1m#rqwUOYMb~f}y;w<&(0>iGSofh6>Fk+dK2?1p>1^@}8ZTo??X>L0zSY#mqvcmid z`VI2y0m#}x=p6dXF?lqDf$NX~TYUAmgf<=4;#xq=&8(3&K&tDCU)#DwRG<7aQtQuN z1O0FE8vJMNLMJff*EU0_V69)>J&6s3t`>5J6GMHl}FF-b~0+;hEr*{Rz7kQEcEP^DIKC9;zS-+b<#pI(Tuh>)rpY<4()<7R)-g` z%um{%Cok70hb6x|$i+!RoL)~#=7$Uf;CF*fU(g&mz#a8loK6 zV({luC4cGnm9DD8b_3G1iC~t($Q3Fzpo>)z7vxrYBca*kN}RuAv;2p~djT>fqkgxK zb*j-Z!vXcd2+5H=554Z~Z-*Q2>YB{vweNKNsdVUk(TTw3?dq1-{mMlOfurD;zNdD{ zVK&U5HjxbI*9GZztAtS5IhpYi?Sb*Wk8kQ2Py7oG-F_zz7D_^-fWzR7?d|On- zs)x{UmK=@bN2olUBO5F&=V)Ywku9;!TW)aJB+zpsPW4j|71?!BpA%#Nk_{fF>G!r` zH@fZW;JmfDOF$yEsiFVgmcwPc>%GU*ettOIm~{i-tMx=PlhCiYFZbMU4Ito))$67% zg8kywDz3HAj+@0Jg#hKbied-(puK;H)&E!aGN7y?C`Y5gmmLJJbC>Rdb4|aTOAd zy=F+!{O4@S%V|zA(nTW0a!F^R@5a3HLrGO8=pP^&qlPtDU=%-<(grYTMIr;B^nX_Y zVP(wQArjWi!Tb=U*{~lZgH;0pwt^JfKh{9!V;VB%?Z3IOccI^>uJQpZEi??QcKET6df@)6R9=$Ba_5!+`qy2^PerXe`Ou?d(VFW9~Ss( literal 0 HcmV?d00001 -- 2.2.0