Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 694A1200C64 for ; Fri, 28 Apr 2017 17:37:06 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 67CD2160BA3; Fri, 28 Apr 2017 15:37:06 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 3B323160B8C for ; Fri, 28 Apr 2017 17:37:05 +0200 (CEST) Received: (qmail 71789 invoked by uid 500); 28 Apr 2017 15:37:03 -0000 Mailing-List: contact users-help@httpd.apache.org; run by ezmlm Precedence: bulk Reply-To: users@httpd.apache.org list-help: list-unsubscribe: List-Post: List-Id: Delivered-To: mailing list users@httpd.apache.org Received: (qmail 71779 invoked by uid 99); 28 Apr 2017 15:37:03 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd2-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 28 Apr 2017 15:37:03 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd2-us-west.apache.org (ASF Mail Server at spamd2-us-west.apache.org) with ESMTP id 7591E1A077B for ; Fri, 28 Apr 2017 15:37:03 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd2-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -0.397 X-Spam-Level: X-Spam-Status: No, score=-0.397 tagged_above=-999 required=6.31 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_MESSAGE=2, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-2.796, RCVD_IN_SORBS_SPAM=0.5, SPF_PASS=-0.001] autolearn=disabled Authentication-Results: spamd2-us-west.apache.org (amavisd-new); dkim=pass (2048-bit key) header.d=googlemail.com Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd2-us-west.apache.org [10.40.0.9]) (amavisd-new, port 10024) with ESMTP id HCxia6FaCH8C for ; Fri, 28 Apr 2017 15:37:01 +0000 (UTC) Received: from mail-qk0-f172.google.com (mail-qk0-f172.google.com [209.85.220.172]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with ESMTPS id 3C97D5F405 for ; Fri, 28 Apr 2017 15:37:00 +0000 (UTC) Received: by mail-qk0-f172.google.com with SMTP id h123so55810018qke.0 for ; Fri, 28 Apr 2017 08:37:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to; bh=1/Kirm3pdXLsX7LWIpsvA2HRzc9xvXN6SqeIbTkwNEw=; b=UaTi/jZ5blCftKC28YkBpZP2SMFiHfYWIKprEx/cz7sLr2dv2p6RyWfa9ey+Ywl55J SPY838SmJVTEIj5zR/mgy4UTcPumKH6p7ryYIOKyFflXzYhozCLlZ39V5DvXbYWKTVT0 fLSX5C6y91YQfoRr4qPeWZ95eHfO5xzoxgm2mSUy+uH0hP/xCXZvFGSAhoCLbRqc/P0y d8imWqITJAkWyroBm+t8gzUBZAC73SDBL1/7VxjONCC+c+1IQRb4BrRFCUiW2bb8CpyH 94fYc/ynA7bL8ouWDAUl59MFqA9nsXLNA8HvwOQeCDiVpi+qxOoQBv+/aHmSRn/MGW5A gxIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to; bh=1/Kirm3pdXLsX7LWIpsvA2HRzc9xvXN6SqeIbTkwNEw=; b=qvZF11RW0HnfhJ2IsYADD9QnVeQ4nuLLbJqX8CwkWMVZDCA6DgSk4NgmIVUq2WQdE4 QBxYclJSwMg4LP34DYa7Ec+r5ptCN5iY6ljRelFnGBIdgMNjwZnl8o5h8ylvmZmYKuOD go6exRHh08qILRjG8F0JrQ1XrkpzzT2siev/0VGZDJ36pJL3IWxnn1r7GeCT+tu0borx u7UTKUjsJUKp4SzgObRC4bGEteHbSGkzDL2qjeiE3340lYhQwGtszkzWSkVoI4cCst6/ 8BO+M87vg8d23H27eTfNob9S4lL9zSEotDhxRPBQDaGWfMcWfQnniC5q/bL3f4eBq1x/ I4WQ== X-Gm-Message-State: AN3rC/4sS64O9oiznkm8RMpsY6sMcJ7ciTk+Tzb9VjAcMrswHBUJCxT6 ISHwr4DzRrABRbsGrKxgSGm2ooB8nQ== X-Received: by 10.55.135.132 with SMTP id j126mr518173qkd.266.1493393818986; Fri, 28 Apr 2017 08:36:58 -0700 (PDT) MIME-Version: 1.0 Received: by 10.237.46.131 with HTTP; Fri, 28 Apr 2017 08:36:58 -0700 (PDT) In-Reply-To: References: From: Markus Gausling Date: Fri, 28 Apr 2017 17:36:58 +0200 Message-ID: To: users@httpd.apache.org Content-Type: multipart/alternative; boundary=94eb2c07631e172eb9054e3bd847 Subject: Re: [users@httpd] Apache as HTTP Proxy: GZIP compression handling configuration question archived-at: Fri, 28 Apr 2017 15:37:06 -0000 --94eb2c07631e172eb9054e3bd847 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable I am not sure exactly how I can configure that, i.e. when I used the following: RequestHeader set Accept-Encoding gzip SetOutputFilter INFLATE SetOutputFilter DEFLATE How would Apache know that the content when going to the backend shall be compressed while the content provided to the clients shall be decompressed? Forward Proxy Use Case: Client Forward Proxy Backend | | | | HTTP POST | | | ( =E2=80=8BBody =E2=80=8B uncompressed) | | |--------------------->| | | | HTTP POST | | | Content-Encoding: gzip | | | Accept-Encoding: gzip | | |--------------------------------->| | | | | | 200 OK | | | (Resp. body might be compressed) | | |<---------------------------------| | | | | 200 OK | | | (Body uncompressed) | | |<---------------------| | | | | The GET requests for Forward Proxy and Reverse Proxy are similar. Proxy adds "Accept-Encoding: gzip" header to =E2=80=8B each=E2=80=8B client request. If content =E2=80=8B =E2=80=8B from Backend comes compressed it will be decompressed and returned with =E2=80=8B =E2=80=8B correct header type to client: Client Reverse Proxy Backend | | | | HTTP GET | | | ( =E2=80=8BBody =E2=80=8B uncompressed) | | |--------------------->| | | | HTTP GET | | | Accept-Encoding: gzip | | |--------------------------------->| | | | | | 200 OK | | | =E2=80=8B =E2=80=8B Content-Encoding: gzip =E2=80=8B =E2=80=8B | | |<---------------------------------| | | | | 200 OK | | | (Body uncompressed) | | |<---------------------| | | | | 2017-04-28 15:57 GMT+02:00 Luca Toscano : > Hi Markus, > > 2017-04-26 12:21 GMT+02:00 Markus Gausling > : > >> Hello, >> >> I am using Apache (2.4.10) as an HTTP Proxy with two virtual hosts >> listening >> on different ports: >> - Forward Proxy >> - Reverse Proxy >> >> Depending on the use case applications either use the Forward Proxy or t= he >> Reverse Proxy. >> >> Now I want to make sure that for both virtual hosts the proxy does >> handles >> content compression (using gzip). Basically there are two use cases that >> need to be configured: >> - Use Case 1 - Request compressed content and decompress received conten= t >> - Use Case 2 - Compress outgoing traffic (HTTP POST) >> >> This is to ensure that applications using any of the two HTTP Proxies do >> not >> need to handle content inflation/deflation (besides other things the >> proxies are configured to do). >> The applications are basically simple libcurl programms that shall be >> kept as >> simple as possible, which is the reason of this exercise. >> >> Use Case 1 works fine when I add the "Accept-Encoding: gzip" header to >> each >> outgoing request and when I inflate received content. This is achieved b= y >> adding the following to the Virtual Host section of each proxy: >> >> >> RequestHeader set Accept-Encoding gzip >> SetOutputFilter INFLATE >> >> >> My problem is that I am not able to configure the Virtual Hosts so that >> each >> HTTP POST request from an application (with uncompressed body) gets >> deflated >> in the HTTP Proxy before being sent to the Web Server. >> >> So my questions are: >> - Is this supported by mod_deflate anyway? >> - How would I need to configure mod_deflate for this? >> - Do I need to handle the Forward and the Reverse Proxy separately or is >> the >> configuration the same? >> > > I am probably missing something important but I'd have just used > SetOutputFilter DEFLATE for your use cases. My assumption is that the > reverse proxy can handle request compression and does not pass any > (compressed) requests to the backend as they are, because it shouldn't > assume anything about the backend (like being able to handle compression)= . > The HTTP POST outgoing traffic should be deflated with the SetOutputFilte= r > directive as every response returned by the proxy (or maybe a subset of > them, depending on the config). > > Luca > > --94eb2c07631e172eb9054e3bd847 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSxtb25vc3Bh Y2UiPkkgYW0gbm90IHN1cmUgZXhhY3RseSBob3cgSSBjYW4gY29uZmlndXJlIHRoYXQsIGkuZS4g d2hlbiBJIHVzZWQgdGhlIGZvbGxvd2luZzo8YnI+PGJyPiZsdDtJZk1vZHVsZSBtb2RfZGVmbGF0 ZS5jJmd0Ozxicj7CoMKgwqDCoCBSZXF1ZXN0SGVhZGVyIHNldCBBY2NlcHQtRW5jb2RpbmcgZ3pp cDxicj7CoMKgwqDCoCBTZXRPdXRwdXRGaWx0ZXIgSU5GTEFURTxicj48YnI+wqDCoMKgwqAgU2V0 T3V0cHV0RmlsdGVyIERFRkxBVEU8YnI+Jmx0Oy9JZk1vZHVsZSZndDs8YnI+PGJyPkhvdyB3b3Vs ZCBBcGFjaGUga25vdyB0aGF0IHRoZSBjb250ZW50IHdoZW4gZ29pbmcgdG8gdGhlIGJhY2tlbmQg c2hhbGwgYmUgPGJyPmNvbXByZXNzZWQgd2hpbGUgdGhlIGNvbnRlbnQgcHJvdmlkZWQgdG8gdGhl IGNsaWVudHMgc2hhbGwgYmUgZGVjb21wcmVzc2VkPzxicj48YnI+Rm9yd2FyZCBQcm94eSBVc2Ug Q2FzZTo8YnI+PGJyPkNsaWVudMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRm9yd2FyZCBQ cm94ecKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBCYWNrZW5kPGJy PsKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA8L3NwYW4+ PHdicj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlLG1vbm9zcGFjZSI+wqDCoMKg wqAgfDxicj7CoCB8wqDCoCBIVFRQIFBPU1TCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA8L3NwYW4+PHdi cj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlLG1vbm9zcGFjZSI+wqDCoMKgwqAg fDxicj7CoCB8wqAgKDxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSxtb25vc3BhY2U7 ZGlzcGxheTppbmxpbmUiIGNsYXNzPSJnbWFpbF9kZWZhdWx0Ij7igItCb2R5IOKAizwvZGl2PnVu Y29tcHJlc3NlZCkgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqA8L3NwYW4+PHdicj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3Nw YWNlLG1vbm9zcGFjZSI+wqDCoMKgwqAgfDxicj7CoCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tJmd0 O3zCoMKgwqDCoMKgwqA8L3NwYW4+PHdicj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3Nw YWNlLG1vbm9zcGFjZSI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHw8YnI+wqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB8wqAgSFRUUCBQT1NUwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgfDxicj7CoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHzCoCBDb250ZW50LUVuY29kaW5nOiBnemlwwqDCoMKgwqDCoMKgwqDCoMKgIHw8YnI+wqAg fMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqAgQWNjZXB0LUVu Y29kaW5nOiBnemlwwqDCoMKgwqDCoMKgwqDCoMKgwqAgfDxicj7CoCB8wqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LTwvc3Bhbj48d2JyPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UsbW9ub3NwYWNl Ij4tLS0tJmd0O3w8YnI+wqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoDwvc3Bhbj48d2JyPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UsbW9u b3NwYWNlIj7CoMKgwqDCoCB8PGJyPsKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgfMKgIDIwMCBPS8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHw8YnI+wqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB8IChSZXNwLiBib2R5IG1pZ2h0IGJlIGNvbXByZXNzZWQpIHw8YnI+wqAgfMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8Jmx0Oy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS08L3NwYW4+PHdicj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6bW9u b3NwYWNlLG1vbm9zcGFjZSI+LS0tLS18PGJyPsKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqA8L3NwYW4+PHdicj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6 bW9ub3NwYWNlLG1vbm9zcGFjZSI+wqDCoMKgwqAgfDxicj7CoCB8wqAgMjAwIE9LwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqA8L3NwYW4+PHdicj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6 bW9ub3NwYWNlLG1vbm9zcGFjZSI+wqDCoMKgwqAgfDxicj7CoCB8IChCb2R5IHVuY29tcHJlc3Nl ZCnCoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoDwvc3Bhbj48d2JyPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UsbW9u b3NwYWNlIj7CoMKgwqDCoCB8PGJyPsKgIHwmbHQ7LS0tLS0tLS0tLS0tLS0tLS0tLS0tfMKgwqDC oMKgwqDCoDwvc3Bhbj48d2JyPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2UsbW9u b3NwYWNlIj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfDxicj7CoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgPC9zcGFuPjx3YnI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSxtb25vc3Bh Y2UiPsKgwqDCoMKgIHw8YnI+wqAgPGJyPsKgIDxicj48YnI+VGhlIEdFVCByZXF1ZXN0cyBmb3Ig Rm9yd2FyZCBQcm94eSBhbmQgUmV2ZXJzZSBQcm94eSBhcmUgc2ltaWxhci48YnI+UHJveHkgYWRk cyAmcXVvdDtBY2NlcHQtRW5jb2Rpbmc6IGd6aXAmcXVvdDsgaGVhZGVyIHRvPGRpdiBzdHlsZT0i Zm9udC1mYW1pbHk6bW9ub3NwYWNlLG1vbm9zcGFjZTtkaXNwbGF5OmlubGluZSIgY2xhc3M9Imdt YWlsX2RlZmF1bHQiPuKAiyBlYWNo4oCLPC9kaXY+IGNsaWVudCByZXF1ZXN0LiBJZiA8YnI+Y29u dGVudDxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSxtb25vc3BhY2U7ZGlzcGxheTpp bmxpbmUiIGNsYXNzPSJnbWFpbF9kZWZhdWx0Ij7igIsg4oCLPC9kaXY+ZnJvbSBCYWNrZW5kIGNv bWVzIGNvbXByZXNzZWQgaXQgd2lsbCBiZSBkZWNvbXByZXNzZWQgYW5kIDxicj5yZXR1cm5lZCB3 aXRoPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlLG1vbm9zcGFjZTtkaXNwbGF5Omlu bGluZSIgY2xhc3M9ImdtYWlsX2RlZmF1bHQiPuKAiyDigIs8L2Rpdj5jb3JyZWN0IGhlYWRlciB0 eXBlIHRvIGNsaWVudDo8YnI+PGJyPkNsaWVudMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg UmV2ZXJzZSBQcm94ecKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBC YWNrZW5kPGJyPsKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg fMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqA8L3NwYW4+PHdicj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlLG1vbm9zcGFj ZSI+wqDCoMKgwqAgfDxicj7CoCB8wqDCoCBIVFRQIEdFVMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg PC9zcGFuPjx3YnI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSxtb25vc3BhY2Ui PsKgwqDCoMKgIHw8YnI+wqAgfMKgICg8ZGl2IHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2Us bW9ub3NwYWNlO2Rpc3BsYXk6aW5saW5lIiBjbGFzcz0iZ21haWxfZGVmYXVsdCI+4oCLQm9keSDi gIs8L2Rpdj51bmNvbXByZXNzZWQpIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgPC9zcGFuPjx3YnI+PHNwYW4gc3R5bGU9ImZvbnQtZmFt aWx5Om1vbm9zcGFjZSxtb25vc3BhY2UiPsKgwqDCoMKgIHw8YnI+wqAgfC0tLS0tLS0tLS0tLS0t LS0tLS0tLSZndDt8wqDCoMKgwqDCoMKgPC9zcGFuPjx3YnI+PHNwYW4gc3R5bGU9ImZvbnQtZmFt aWx5Om1vbm9zcGFjZSxtb25vc3BhY2UiPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8PGJyPsKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgfMKgIEhUVFAgR0VUwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB8PGJyPsKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgfMKgIEFjY2VwdC1FbmNvZGluZzogZ3ppcMKgwqDCoMKgwqDCoMKgwqDC oMKgIHw8YnI+wqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8 LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3NwYW4+PHdicj48c3BhbiBzdHlsZT0iZm9u dC1mYW1pbHk6bW9ub3NwYWNlLG1vbm9zcGFjZSI+LS0tLSZndDt8PGJyPsKgIHzCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA8L3NwYW4+PHdicj48c3BhbiBzdHls ZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlLG1vbm9zcGFjZSI+wqDCoMKgwqAgfDxicj7CoCB8wqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoCAyMDAgT0vCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8PGJyPsKgIHzCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfCA8ZGl2IHN0eWxlPSJmb250 LWZhbWlseTptb25vc3BhY2UsbW9ub3NwYWNlO2Rpc3BsYXk6aW5saW5lIiBjbGFzcz0iZ21haWxf ZGVmYXVsdCI+4oCLIOKAizwvZGl2PkNvbnRlbnQtRW5jb2Rpbmc6IGd6aXA8ZGl2IHN0eWxlPSJm b250LWZhbWlseTptb25vc3BhY2UsbW9ub3NwYWNlO2Rpc3BsYXk6aW5saW5lIiBjbGFzcz0iZ21h aWxfZGVmYXVsdCI+4oCLwqAg4oCLPC9kaXY+wqDCoMKgwqDCoMKgwqAgfDxicj7CoCB8wqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwmbHQ7LS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLTwvc3Bhbj48d2JyPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25vc3Bh Y2UsbW9ub3NwYWNlIj4tLS0tLXw8YnI+wqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoDwvc3Bhbj48d2JyPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25v c3BhY2UsbW9ub3NwYWNlIj7CoMKgwqDCoCB8PGJyPsKgIHzCoCAyMDAgT0vCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoDwvc3Bhbj48d2JyPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTptb25v c3BhY2UsbW9ub3NwYWNlIj7CoMKgwqDCoCB8PGJyPsKgIHwgKEJvZHkgdW5jb21wcmVzc2VkKcKg IHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgPC9zcGFuPjx3YnI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSxtb25vc3Bh Y2UiPsKgwqDCoMKgIHw8YnI+wqAgfCZsdDstLS0tLS0tLS0tLS0tLS0tLS0tLS18wqDCoMKgwqDC oMKgPC9zcGFuPjx3YnI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5Om1vbm9zcGFjZSxtb25vc3Bh Y2UiPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB8PGJyPsKgIHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA8 L3NwYW4+PHdicj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6bW9ub3NwYWNlLG1vbm9zcGFjZSI+ wqDCoMKgwqAgfDwvc3Bhbj48YnI+wqAgPGJyPjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj48YnI+ PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPjIwMTctMDQtMjggMTU6NTcgR01UKzAyOjAwIEx1Y2Eg VG9zY2FubyA8c3BhbiBkaXI9Imx0ciI+Jmx0OzxhIGhyZWY9Im1haWx0bzp0b3NjYW5vLmx1Y2FA Z21haWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+dG9zY2Fuby5sdWNhQGdtYWlsLmNvbTwvYT4mZ3Q7 PC9zcGFuPjo8YnI+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2lu OjBweCAwcHggMHB4IDAuOGV4O2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2IoMjA0LDIwNCwyMDQp O3BhZGRpbmctbGVmdDoxZXgiPjxkaXYgZGlyPSJsdHIiPkhpIE1hcmt1cyw8YnI+PGRpdiBjbGFz cz0iZ21haWxfZXh0cmEiPjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+PGRpdj48ZGl2IGNs YXNzPSJtXzM1NzIzMTcwMTc5MzUwMjQ0NTRnbWFpbC1oNSI+MjAxNy0wNC0yNiAxMjoyMSBHTVQr MDI6MDAgTWFya3VzIEdhdXNsaW5nIDxzcGFuIGRpcj0ibHRyIj4mbHQ7PGEgaHJlZj0ibWFpbHRv Om1hcmt1c2dhdXNsaW5nQGdvb2dsZW1haWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+bWFya3VzZ2F1 c2xpbmdAZ29vZ2xlbWFpbC5jb208L2E+PHdicj4mZ3Q7PC9zcGFuPjo8YnI+PGJsb2NrcXVvdGUg Y2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjBweCAwcHggMHB4IDAuOGV4O2JvcmRl ci1sZWZ0OjFweCBzb2xpZCByZ2IoMjA0LDIwNCwyMDQpO3BhZGRpbmctbGVmdDoxZXgiPjxkaXYg ZGlyPSJsdHIiPkhlbGxvLDxicj48YnI+SSBhbSB1c2luZyBBcGFjaGUgKDIuNC4xMCkgYXMgYW4g SFRUUCBQcm94eSB3aXRoIHR3byB2aXJ0dWFsIGhvc3RzIGxpc3RlbmluZyA8YnI+b24gZGlmZmVy ZW50IHBvcnRzOjxicj4tIEZvcndhcmQgUHJveHk8YnI+LSBSZXZlcnNlIFByb3h5PGJyPjxicj5E ZXBlbmRpbmcgb24gdGhlIHVzZSBjYXNlIGFwcGxpY2F0aW9ucyBlaXRoZXIgdXNlIHRoZSBGb3J3 YXJkIFByb3h5IG9yIHRoZTxicj5SZXZlcnNlIFByb3h5Ljxicj48YnI+Tm93IEkgd2FudCB0byBt YWtlIHN1cmUgdGhhdCBmb3IgYm90aCB2aXJ0dWFsIGhvc3RzIHRoZSBwcm94eSBkb2VzIGhhbmRs ZXMgPGJyPmNvbnRlbnQgY29tcHJlc3Npb24gKHVzaW5nIGd6aXApLiBCYXNpY2FsbHkgdGhlcmUg YXJlIHR3byB1c2UgY2FzZXMgdGhhdCA8YnI+bmVlZCB0byBiZSBjb25maWd1cmVkOjxicj4tIFVz ZSBDYXNlIDEgLSBSZXF1ZXN0IGNvbXByZXNzZWQgY29udGVudCBhbmQgZGVjb21wcmVzcyByZWNl aXZlZCBjb250ZW50PGJyPi0gVXNlIENhc2UgMiAtIENvbXByZXNzIG91dGdvaW5nIHRyYWZmaWMg KEhUVFAgUE9TVCk8YnI+PGJyPlRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgYXBwbGljYXRpb25zIHVz aW5nIGFueSBvZiB0aGUgdHdvIEhUVFAgUHJveGllcyBkbyBub3Q8YnI+bmVlZCB0byBoYW5kbGUg Y29udGVudCBpbmZsYXRpb24vZGVmbGF0aW9uIChiZXNpZGVzIG90aGVyIHRoaW5ncyB0aGUgPGJy PnByb3hpZXMgYXJlIGNvbmZpZ3VyZWQgdG8gZG8pLiA8YnI+VGhlIGFwcGxpY2F0aW9ucyBhcmUg YmFzaWNhbGx5IHNpbXBsZSBsaWJjdXJsIHByb2dyYW1tcyB0aGF0IHNoYWxsIGJlIGtlcHQgYXM8 YnI+c2ltcGxlIGFzIHBvc3NpYmxlLCB3aGljaCBpcyB0aGUgcmVhc29uIG9mIHRoaXMgZXhlcmNp c2UuPGJyPjxicj5Vc2UgQ2FzZSAxIHdvcmtzIGZpbmUgd2hlbiBJIGFkZCB0aGUgJnF1b3Q7QWNj ZXB0LUVuY29kaW5nOiBnemlwJnF1b3Q7IGhlYWRlciB0byBlYWNoIDxicj5vdXRnb2luZyByZXF1 ZXN0IGFuZCB3aGVuIEkgaW5mbGF0ZSByZWNlaXZlZCBjb250ZW50LiBUaGlzIGlzIGFjaGlldmVk IGJ5IDxicj5hZGRpbmcgdGhlIGZvbGxvd2luZyB0byB0aGUgVmlydHVhbCBIb3N0IHNlY3Rpb24g b2YgZWFjaCBwcm94eTo8YnI+PGJyPiZsdDtJZk1vZHVsZSBtb2RfZGVmbGF0ZS5jJmd0Ozxicj7C oMKgwqAgUmVxdWVzdEhlYWRlciBzZXQgQWNjZXB0LUVuY29kaW5nIGd6aXA8YnI+wqDCoMKgIFNl dE91dHB1dEZpbHRlciBJTkZMQVRFPGJyPiZsdDsvSWZNb2R1bGUmZ3Q7PGJyPjxicj5NeSBwcm9i bGVtIGlzIHRoYXQgSSBhbSBub3QgYWJsZSB0byBjb25maWd1cmUgdGhlIFZpcnR1YWwgSG9zdHMg c28gdGhhdCBlYWNoPGJyPkhUVFAgUE9TVCByZXF1ZXN0IGZyb20gYW4gYXBwbGljYXRpb24gKHdp dGggdW5jb21wcmVzc2VkIGJvZHkpIGdldHMgZGVmbGF0ZWQ8YnI+aW4gdGhlIEhUVFAgUHJveHkg YmVmb3JlIGJlaW5nIHNlbnQgdG8gdGhlIFdlYiBTZXJ2ZXIuPGJyPjxicj5TbyBteSBxdWVzdGlv bnMgYXJlOjxicj4tIElzIHRoaXMgc3VwcG9ydGVkIGJ5IG1vZF9kZWZsYXRlIGFueXdheT88YnI+ LSBIb3cgd291bGQgSSBuZWVkIHRvIGNvbmZpZ3VyZSBtb2RfZGVmbGF0ZSBmb3IgdGhpcz88YnI+ LSBEbyBJIG5lZWQgdG8gaGFuZGxlIHRoZSBGb3J3YXJkIGFuZCB0aGUgUmV2ZXJzZSBQcm94eSBz ZXBhcmF0ZWx5IG9yIGlzIHRoZSA8YnI+wqBjb25maWd1cmF0aW9uIHRoZSBzYW1lPzwvZGl2Pjwv YmxvY2txdW90ZT48ZGl2Pjxicj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2PkkgYW0gcHJvYmFibHkg bWlzc2luZyBzb21ldGhpbmcgaW1wb3J0YW50IGJ1dCBJJiMzOTtkIGhhdmUganVzdCB1c2VkIFNl dE91dHB1dEZpbHRlciBERUZMQVRFIGZvciB5b3VyIHVzZSBjYXNlcy4gTXkgYXNzdW1wdGlvbiBp cyB0aGF0IHRoZSByZXZlcnNlIHByb3h5IGNhbiBoYW5kbGUgcmVxdWVzdCBjb21wcmVzc2lvbiBh bmQgZG9lcyBub3QgcGFzcyBhbnkgKGNvbXByZXNzZWQpIHJlcXVlc3RzIHRvIHRoZSBiYWNrZW5k IGFzIHRoZXkgYXJlLCBiZWNhdXNlIGl0IHNob3VsZG4mIzM5O3QgYXNzdW1lIGFueXRoaW5nIGFi b3V0IHRoZSBiYWNrZW5kIChsaWtlIGJlaW5nIGFibGUgdG8gaGFuZGxlIGNvbXByZXNzaW9uKS4g VGhlIEhUVFAgUE9TVCBvdXRnb2luZyB0cmFmZmljIHNob3VsZCBiZSBkZWZsYXRlZCB3aXRoIHRo ZSBTZXRPdXRwdXRGaWx0ZXIgZGlyZWN0aXZlIGFzIGV2ZXJ5IHJlc3BvbnNlIHJldHVybmVkIGJ5 IHRoZSBwcm94eSAob3IgbWF5YmUgYSBzdWJzZXQgb2YgdGhlbSwgZGVwZW5kaW5nIG9uIHRoZSBj b25maWcpLjwvZGl2PjxzcGFuIGNsYXNzPSJtXzM1NzIzMTcwMTc5MzUwMjQ0NTRnbWFpbC1IT0Vu WmIiPjxmb250IGNvbG9yPSIjODg4ODg4Ij48ZGl2Pjxicj48L2Rpdj48ZGl2Pkx1Y2HCoDwvZGl2 PjwvZm9udD48L3NwYW4+PC9kaXY+PGJyPjwvZGl2PjwvZGl2Pg0KPC9ibG9ja3F1b3RlPjwvZGl2 Pjxicj48L2Rpdj48L2Rpdj4NCg== --94eb2c07631e172eb9054e3bd847--