Commit 845ed41

mo khan <mo.khan@gmail.com>
2020-01-28 23:50:05
Fix bug in redirecting to relative paths tag: v0.3.2
1 parent 043879b
lib/net/hippie/client.rb
@@ -27,11 +27,12 @@ module Net
       end
 
       def execute(uri, request, limit: follow_redirects, &block)
-        response = http_for(uri).request(request)
+        http = http_for(uri)
+        response = http.request(request)
         if limit.positive? && response.is_a?(Net::HTTPRedirection)
-          location = response['location']
-          request = request_for(Net::HTTP::Get, location)
-          execute(location, request, limit: limit - 1, &block)
+          url = build_url_for(http, response['location'])
+          request = request_for(Net::HTTP::Get, url)
+          execute(url, request, limit: limit - 1, &block)
         else
           block_given? ? yield(request, response) : response
         end
@@ -86,7 +87,7 @@ module Net
         raise error if attempt == max
 
         delay = ((2**attempt) * 0.1) + Random.rand(0.05) # delay + jitter
-        warn("`#{error.message}` Retry: #{attempt + 1}/#{max} Delay: #{delay}s")
+        logger.warn("`#{error.message}` #{attempt + 1}/#{max} Delay: #{delay}s")
         sleep delay
       end
 
@@ -121,14 +122,16 @@ module Net
         http.key = private_key
       end
 
-      def warn(message)
-        logger.warn(message)
-      end
-
       def run(uri, http_method, headers, body, &block)
         request = request_for(http_method, uri, headers: headers, body: body)
         execute(uri, request, &block)
       end
+
+      def build_url_for(http, path)
+        return path if path.start_with?('http')
+
+        "#{http.use_ssl? ? 'https' : 'http'}://#{http.address}#{path}"
+      end
     end
   end
 end
lib/net/hippie/version.rb
@@ -2,6 +2,6 @@
 
 module Net
   module Hippie
-    VERSION = '0.3.1'
+    VERSION = '0.3.2'
   end
 end
test/fixtures/follow_redirects_with_relative_paths.yml
@@ -0,0 +1,75 @@
+---
+http_interactions:
+- request:
+    method: get
+    uri: http://go.microsoft.com/fwlink/?LinkId=329770
+    headers:
+      Host:
+      - go.microsoft.com
+  response:
+    status:
+      code: 302
+      message: Moved Temporarily
+    headers:
+      Location:
+      - https://www.microsoft.com/net/dotnet_library_license.htm
+      Content-Length:
+      - '0'
+    http_version:
+  recorded_at: Tue, 28 Jan 2020 23:46:07 GMT
+- request:
+    method: get
+    uri: https://www.microsoft.com/net/dotnet_library_license.htm
+    headers:
+      Host:
+      - www.microsoft.com
+  response:
+    status:
+      code: 301
+      message: Moved Permanently
+    headers:
+      Content-Length:
+      - '0'
+      Location:
+      - https://dotnet.microsoft.com/dotnet_library_license.htm
+    http_version:
+  recorded_at: Tue, 28 Jan 2020 23:46:07 GMT
+- request:
+    method: get
+    uri: https://dotnet.microsoft.com/dotnet_library_license.htm
+    headers:
+      Host:
+      - dotnet.microsoft.com
+  response:
+    status:
+      code: 302
+      message: Found
+    headers:
+      Location:
+      - "/en/dotnet_library_license.htm"
+      Content-Length:
+      - '0'
+    http_version:
+  recorded_at: Tue, 28 Jan 2020 23:46:08 GMT
+- request:
+    method: get
+    uri: https://dotnet.microsoft.com/en/dotnet_library_license.htm
+    headers:
+      Host:
+      - dotnet.microsoft.com
+  response:
+    status:
+      code: 200
+      message: OK
+    headers:
+      Content-Length:
+      - '31538'
+      Content-Type:
+      - text/html
+    body:
+      encoding: ASCII-8BIT
+      string: !binary |-
+        PGh0bWw+DQoNCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+DQo8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxNSAoZmlsdGVyZWQpIj4NCjxzdHlsZT4NCjwhLS0NCiAvKiBGb250IERlZmluaXRpb25zICovDQogQGZvbnQtZmFjZQ0KCXtmb250LWZhbWlseTpXaW5nZGluZ3M7DQoJcGFub3NlLTE6NSAwIDAgMCAwIDAgMCAwIDAgMDt9DQpAZm9udC1mYWNlDQoJe2ZvbnQtZmFtaWx5OiJNUyBNaW5jaG8iOw0KCXBhbm9zZS0xOjIgMiA2IDkgNCAyIDUgOCAzIDQ7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWlseTpTaW1TdW47DQoJcGFub3NlLTE6MiAxIDYgMCAzIDEgMSAxIDEgMTt9DQpAZm9udC1mYWNlDQoJe2ZvbnQtZmFtaWx5OiJDYW1icmlhIE1hdGgiOw0KCXBhbm9zZS0xOjIgNCA1IDMgNSA0IDYgMyAyIDQ7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWlseTpDYWxpYnJpOw0KCXBhbm9zZS0xOjIgMTUgNSAyIDIgMiA0IDMgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6VGFob21hOw0KCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6IlRyZWJ1Y2hldCBNUyI7DQoJcGFub3NlLTE6MiAxMSA2IDMgMiAyIDIgMiAyIDQ7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWlseToiXEBNUyBNaW5jaG8iOw0KCXBhbm9zZS0xOjIgMiA2IDkgNCAyIDUgOCAzIDQ7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWlseToiXEBTaW1TdW4iOw0KCXBhbm9zZS0xOjIgMSA2IDAgMyAxIDEgMSAxIDE7fQ0KIC8qIFN0eWxlIERlZmluaXRpb25zICovDQogcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbA0KCXttYXJnaW4tdG9wOjYuMHB0Ow0KCW1hcmdpbi1yaWdodDowaW47DQoJbWFyZ2luLWJvdHRvbTo2LjBwdDsNCgltYXJnaW4tbGVmdDowaW47DQoJZm9udC1zaXplOjkuNXB0Ow0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7fQ0KaDENCgl7bXNvLXN0eWxlLWxpbms6IkhlYWRpbmcgMSBDaGFyIjsNCgltYXJnaW4tdG9wOjYuMHB0Ow0KCW1hcmdpbi1yaWdodDowaW47DQoJbWFyZ2luLWJvdHRvbTo2LjBwdDsNCgltYXJnaW4tbGVmdDoxNy44NXB0Ow0KCXRleHQtaW5kZW50Oi0xNy44NXB0Ow0KCWZvbnQtc2l6ZTo5LjVwdDsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmO30NCmgyDQoJe21zby1zdHlsZS1saW5rOiJIZWFkaW5nIDIgQ2hhciI7DQoJbWFyZ2luLXRvcDo2LjBwdDsNCgltYXJnaW4tcmlnaHQ6MGluOw0KCW1hcmdpbi1ib3R0b206Ni4wcHQ7DQoJbWFyZ2luLWxlZnQ6LjVpbjsNCgl0ZXh0LWluZGVudDotMTguMTVwdDsNCglmb250LXNpemU6OS41cHQ7DQoJZm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjt9DQpoMw0KCXttc28tc3R5bGUtbGluazoiSGVhZGluZyAzIENoYXIiOw0KCW1hcmdpbi10b3A6Ni4wcHQ7DQoJbWFyZ2luLXJpZ2h0OjBpbjsNCgltYXJnaW4tYm90dG9tOjYuMHB0Ow0KCW1hcmdpbi1sZWZ0OjUzLjg1cHQ7DQoJdGV4dC1pbmRlbnQ6LTE3Ljg1cHQ7DQoJZm9udC1zaXplOjkuNXB0Ow0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7DQoJZm9udC13ZWlnaHQ6bm9ybWFsO30NCmg0DQoJe21zby1zdHlsZS1saW5rOiJIZWFkaW5nIDQgQ2hhciI7DQoJbWFyZ2luLXRvcDo2LjBwdDsNCgltYXJnaW4tcmlnaHQ6MGluOw0KCW1hcmdpbi1ib3R0b206Ni4wcHQ7DQoJbWFyZ2luLWxlZnQ6NzEuNzVwdDsNCgl0ZXh0LWluZGVudDotMTcuOXB0Ow0KCWZvbnQtc2l6ZTo5LjVwdDsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmOw0KCWZvbnQtd2VpZ2h0Om5vcm1hbDt9DQpoNQ0KCXttc28tc3R5bGUtbGluazoiSGVhZGluZyA1IENoYXIiOw0KCW1hcmdpbi10b3A6Ni4wcHQ7DQoJbWFyZ2luLXJpZ2h0OjBpbjsNCgltYXJnaW4tYm90dG9tOjYuMHB0Ow0KCW1hcmdpbi1sZWZ0Ojg5LjZwdDsNCgl0ZXh0LWluZGVudDotMTcuODVwdDsNCglmb250LXNpemU6OS41cHQ7DQoJZm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjsNCglmb250LXdlaWdodDpub3JtYWw7fQ0KaDYNCgl7bXNvLXN0eWxlLWxpbms6IkhlYWRpbmcgNiBDaGFyIjsNCgltYXJnaW4tdG9wOjYuMHB0Ow0KCW1hcmdpbi1yaWdodDowaW47DQoJbWFyZ2luLWJvdHRvbTo2LjBwdDsNCgltYXJnaW4tbGVmdDoxMDcuNDVwdDsNCgl0ZXh0LWluZGVudDotMTcuODVwdDsNCglmb250LXNpemU6OS41cHQ7DQoJZm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjsNCglmb250LXdlaWdodDpub3JtYWw7fQ0KcC5Nc29IZWFkaW5nNywgbGkuTXNvSGVhZGluZzcsIGRpdi5Nc29IZWFkaW5nNw0KCXttc28tc3R5bGUtbGluazoiSGVhZGluZyA3IENoYXIiOw0KCW1hcmdpbi10b3A6Ni4wcHQ7DQoJbWFyZ2luLXJpZ2h0OjBpbjsNCgltYXJnaW4tYm90dG9tOjYuMHB0Ow0KCW1hcmdpbi1sZWZ0OjEyNS4zcHQ7DQoJdGV4dC1pbmRlbnQ6LTE3Ljg1cHQ7DQoJZm9udC1zaXplOjkuNXB0Ow0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7fQ0KcC5Nc29IZWFkaW5nOCwgbGkuTXNvSGVhZGluZzgsIGRpdi5Nc29IZWFkaW5nOA0KCXttc28tc3R5bGUtbGluazoiSGVhZGluZyA4IENoYXIiOw0KCW1hcmdpbi10b3A6Ni4wcHQ7DQoJbWFyZ2luLXJpZ2h0OjBpbjsNCgltYXJnaW4tYm90dG9tOjYuMHB0Ow0KCW1hcmdpbi1sZWZ0OjE0My4xNXB0Ow0KCXRleHQtaW5kZW50Oi0xNy44NXB0Ow0KCWZvbnQtc2l6ZTo5LjVwdDsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmO30NCnAuTXNvSGVhZGluZzksIGxpLk1zb0hlYWRpbmc5LCBkaXYuTXNvSGVhZGluZzkNCgl7bXNvLXN0eWxlLWxpbms6IkhlYWRpbmcgOSBDaGFyIjsNCgltYXJnaW4tdG9wOjYuMHB0Ow0KCW1hcmdpbi1yaWdodDowaW47DQoJbWFyZ2luLWJvdHRvbTo2LjBwdDsNCgltYXJnaW4tbGVmdDoxNjEuMDVwdDsNCgl0ZXh0LWluZGVudDotMTcuOXB0Ow0KCWZvbnQtc2l6ZTo5LjVwdDsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmO30NCnAuTXNvQ29tbWVudFRleHQsIGxpLk1zb0NvbW1lbnRUZXh0LCBkaXYuTXNvQ29tbWVudFRleHQNCgl7bXNvLXN0eWxlLWxpbms6IkNvbW1lbnQgVGV4dCBDaGFyIjsNCgltYXJnaW4tdG9wOjYuMHB0Ow0KCW1hcmdpbi1yaWdodDowaW47DQoJbWFyZ2luLWJvdHRvbTo2LjBwdDsNCgltYXJnaW4tbGVmdDowaW47DQoJZm9udC1zaXplOjEwLjBwdDsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmO30NCnAuTXNvSGVhZGVyLCBsaS5Nc29IZWFkZXIsIGRpdi5Nc29IZWFkZXINCgl7bXNvLXN0eWxlLWxpbms6IkhlYWRlciBDaGFyIjsNCgltYXJnaW46MGluOw0KCW1hcmdpbi1ib3R0b206LjAwMDFwdDsNCglmb250LXNpemU6OS41cHQ7DQoJZm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjt9DQpwLk1zb0Zvb3RlciwgbGkuTXNvRm9vdGVyLCBkaXYuTXNvRm9vdGVyDQoJe21zby1zdHlsZS1saW5rOiJGb290ZXIgQ2hhciI7DQoJbWFyZ2luOjBpbjsNCgltYXJnaW4tYm90dG9tOi4wMDAxcHQ7DQoJZm9udC1zaXplOjkuNXB0Ow0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7fQ0KYTpsaW5rLCBzcGFuLk1zb0h5cGVybGluaw0KCXtmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIixzZXJpZjsNCgljb2xvcjpibHVlOw0KCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KYTp2aXNpdGVkLCBzcGFuLk1zb0h5cGVybGlua0ZvbGxvd2VkDQoJe2NvbG9yOnB1cnBsZTsNCgl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30NCnAuTXNvUGxhaW5UZXh0LCBsaS5Nc29QbGFpblRleHQsIGRpdi5Nc29QbGFpblRleHQNCgl7bXNvLXN0eWxlLWxpbms6IlBsYWluIFRleHQgQ2hhciI7DQoJbWFyZ2luOjBpbjsNCgltYXJnaW4tYm90dG9tOi4wMDAxcHQ7DQoJZm9udC1zaXplOjExLjBwdDsNCglmb250LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1zZXJpZjt9DQpwLk1zb0NvbW1lbnRTdWJqZWN0LCBsaS5Nc29Db21tZW50U3ViamVjdCwgZGl2Lk1zb0NvbW1lbnRTdWJqZWN0DQoJe21zby1zdHlsZS1saW5rOiJDb21tZW50IFN1YmplY3QgQ2hhciI7DQoJbWFyZ2luLXRvcDo2LjBwdDsNCgltYXJnaW4tcmlnaHQ6MGluOw0KCW1hcmdpbi1ib3R0b206Ni4wcHQ7DQoJbWFyZ2luLWxlZnQ6MGluOw0KCWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjsNCglmb250LXdlaWdodDpib2xkO30NCnAuTXNvQWNldGF0ZSwgbGkuTXNvQWNldGF0ZSwgZGl2Lk1zb0FjZXRhdGUNCgl7bXNvLXN0eWxlLWxpbms6IkJhbGxvb24gVGV4dCBDaGFyIjsNCgltYXJnaW46MGluOw0KCW1hcmdpbi1ib3R0b206LjAwMDFwdDsNCglmb250LXNpemU6OC4wcHQ7DQoJZm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjt9DQpzcGFuLkhlYWRpbmcxQ2hhcg0KCXttc28tc3R5bGUtbmFtZToiSGVhZGluZyAxIENoYXIiOw0KCW1zby1zdHlsZS1saW5rOiJIZWFkaW5nIDEiOw0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7DQoJZm9udC13ZWlnaHQ6Ym9sZDt9DQpzcGFuLkhlYWRpbmcyQ2hhcg0KCXttc28tc3R5bGUtbmFtZToiSGVhZGluZyAyIENoYXIiOw0KCW1zby1zdHlsZS1saW5rOiJIZWFkaW5nIDIiOw0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7DQoJZm9udC13ZWlnaHQ6Ym9sZDt9DQpzcGFuLkhlYWRpbmczQ2hhcg0KCXttc28tc3R5bGUtbmFtZToiSGVhZGluZyAzIENoYXIiOw0KCW1zby1zdHlsZS1saW5rOiJIZWFkaW5nIDMiOw0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7fQ0Kc3Bhbi5IZWFkaW5nNENoYXINCgl7bXNvLXN0eWxlLW5hbWU6IkhlYWRpbmcgNCBDaGFyIjsNCgltc28tc3R5bGUtbGluazoiSGVhZGluZyA0IjsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmO30NCnNwYW4uSGVhZGluZzVDaGFyDQoJe21zby1zdHlsZS1uYW1lOiJIZWFkaW5nIDUgQ2hhciI7DQoJbXNvLXN0eWxlLWxpbms6IkhlYWRpbmcgNSI7DQoJZm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjt9DQpzcGFuLkhlYWRpbmc2Q2hhcg0KCXttc28tc3R5bGUtbmFtZToiSGVhZGluZyA2IENoYXIiOw0KCW1zby1zdHlsZS1saW5rOiJIZWFkaW5nIDYiOw0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7fQ0Kc3Bhbi5IZWFkaW5nN0NoYXINCgl7bXNvLXN0eWxlLW5hbWU6IkhlYWRpbmcgNyBDaGFyIjsNCgltc28tc3R5bGUtbGluazoiSGVhZGluZyA3IjsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmO30NCnNwYW4uSGVhZGluZzhDaGFyDQoJe21zby1zdHlsZS1uYW1lOiJIZWFkaW5nIDggQ2hhciI7DQoJbXNvLXN0eWxlLWxpbms6IkhlYWRpbmcgOCI7DQoJZm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjt9DQpzcGFuLkhlYWRpbmc5Q2hhcg0KCXttc28tc3R5bGUtbmFtZToiSGVhZGluZyA5IENoYXIiOw0KCW1zby1zdHlsZS1saW5rOiJIZWFkaW5nIDkiOw0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7fQ0KcC5Cb2R5MSwgbGkuQm9keTEsIGRpdi5Cb2R5MQ0KCXttc28tc3R5bGUtbmFtZToiQm9keSAxIjsNCgltYXJnaW4tdG9wOjYuMHB0Ow0KCW1hcmdpbi1yaWdodDowaW47DQoJbWFyZ2luLWJvdHRvbTo2LjBwdDsNCgltYXJnaW4tbGVmdDoxNy44NXB0Ow0KCWZvbnQtc2l6ZTo5LjVwdDsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmO30NCnAuQnVsbGV0MiwgbGkuQnVsbGV0MiwgZGl2LkJ1bGxldDINCgl7bXNvLXN0eWxlLW5hbWU6IkJ1bGxldCAyIjsNCgltYXJnaW4tdG9wOjYuMHB0Ow0KCW1hcmdpbi1yaWdodDowaW47DQoJbWFyZ2luLWJvdHRvbTo2LjBwdDsNCgltYXJnaW4tbGVmdDouNWluOw0KCXRleHQtaW5kZW50Oi0xOC4xNXB0Ow0KCWZvbnQtc2l6ZTo5LjVwdDsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmO30NCnAuQnVsbGV0MywgbGkuQnVsbGV0MywgZGl2LkJ1bGxldDMNCgl7bXNvLXN0eWxlLW5hbWU6IkJ1bGxldCAzIjsNCgltc28tc3R5bGUtbGluazoiQnVsbGV0IDMgQ2hhcjEiOw0KCW1hcmdpbi10b3A6Ni4wcHQ7DQoJbWFyZ2luLXJpZ2h0OjBpbjsNCgltYXJnaW4tYm90dG9tOjYuMHB0Ow0KCW1hcmdpbi1sZWZ0OjUzLjg1cHQ7DQoJdGV4dC1pbmRlbnQ6LTE3Ljg1cHQ7DQoJZm9udC1zaXplOjkuNXB0Ow0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7fQ0KcC5IZWFkaW5nRVVMQSwgbGkuSGVhZGluZ0VVTEEsIGRpdi5IZWFkaW5nRVVMQQ0KCXttc28tc3R5bGUtbmFtZToiSGVhZGluZyBFVUxBIjsNCgltYXJnaW4tdG9wOjYuMHB0Ow0KCW1hcmdpbi1yaWdodDowaW47DQoJbWFyZ2luLWJvdHRvbTo2LjBwdDsNCgltYXJnaW4tbGVmdDowaW47DQoJZm9udC1zaXplOjE0LjBwdDsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmOw0KCWZvbnQtd2VpZ2h0OmJvbGQ7fQ0KcC5IZWFkaW5nU29mdHdhcmVUaXRsZSwgbGkuSGVhZGluZ1NvZnR3YXJlVGl0bGUsIGRpdi5IZWFkaW5nU29mdHdhcmVUaXRsZQ0KCXttc28tc3R5bGUtbmFtZToiSGVhZGluZyBTb2Z0d2FyZSBUaXRsZSI7DQoJbWFyZ2luLXRvcDo2LjBwdDsNCgltYXJnaW4tcmlnaHQ6MGluOw0KCW1hcmdpbi1ib3R0b206Ni4wcHQ7DQoJbWFyZ2luLWxlZnQ6MGluOw0KCWJvcmRlcjpub25lOw0KCXBhZGRpbmc6MGluOw0KCWZvbnQtc2l6ZToxNC4wcHQ7DQoJZm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjsNCglmb250LXdlaWdodDpib2xkO30NCnAuUHJlYW1ibGUsIGxpLlByZWFtYmxlLCBkaXYuUHJlYW1ibGUNCgl7bXNvLXN0eWxlLW5hbWU6UHJlYW1ibGU7DQoJbWFyZ2luLXRvcDo2LjBwdDsNCgltYXJnaW4tcmlnaHQ6MGluOw0KCW1hcmdpbi1ib3R0b206Ni4wcHQ7DQoJbWFyZ2luLWxlZnQ6MGluOw0KCWZvbnQtc2l6ZTo5LjVwdDsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmOw0KCWZvbnQtd2VpZ2h0OmJvbGQ7fQ0KcC5QcmVhbWJsZUJvcmRlckFib3ZlLCBsaS5QcmVhbWJsZUJvcmRlckFib3ZlLCBkaXYuUHJlYW1ibGVCb3JkZXJBYm92ZQ0KCXttc28tc3R5bGUtbmFtZToiUHJlYW1ibGUgQm9yZGVyIEFib3ZlIjsNCgltYXJnaW4tdG9wOjYuMHB0Ow0KCW1hcmdpbi1yaWdodDowaW47DQoJbWFyZ2luLWJvdHRvbTo2LjBwdDsNCgltYXJnaW4tbGVmdDowaW47DQoJYm9yZGVyOm5vbmU7DQoJcGFkZGluZzowaW47DQoJZm9udC1zaXplOjkuNXB0Ow0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7DQoJZm9udC13ZWlnaHQ6Ym9sZDt9DQpwLkJvZHkwQm9sZCwgbGkuQm9keTBCb2xkLCBkaXYuQm9keTBCb2xkDQoJe21zby1zdHlsZS1uYW1lOiJCb2R5IDAgQm9sZCI7DQoJbWFyZ2luOjBpbjsNCgltYXJnaW4tYm90dG9tOi4wMDAxcHQ7DQoJZm9udC1zaXplOjkuNXB0Ow0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7DQoJZm9udC13ZWlnaHQ6Ym9sZDt9DQpwLkJvZHkwLCBsaS5Cb2R5MCwgZGl2LkJvZHkwDQoJe21zby1zdHlsZS1uYW1lOiJCb2R5IDAiOw0KCW1hcmdpbjowaW47DQoJbWFyZ2luLWJvdHRvbTouMDAwMXB0Ow0KCWZvbnQtc2l6ZTo5LjVwdDsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmO30NCnNwYW4uQmFsbG9vblRleHRDaGFyDQoJe21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQgQ2hhciI7DQoJbXNvLXN0eWxlLWxpbms6IkJhbGxvb24gVGV4dCI7DQoJZm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjt9DQpwLkJ1bGxldDEsIGxpLkJ1bGxldDEsIGRpdi5CdWxsZXQxDQoJe21zby1zdHlsZS1uYW1lOiJCdWxsZXQgMSI7DQoJbWFyZ2luLXRvcDo2LjBwdDsNCgltYXJnaW4tcmlnaHQ6MGluOw0KCW1hcmdpbi1ib3R0b206Ni4wcHQ7DQoJbWFyZ2luLWxlZnQ6MTcuODVwdDsNCgl0ZXh0LWluZGVudDotMTcuODVwdDsNCglmb250LXNpemU6OS41cHQ7DQoJZm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjt9DQpwLkJ1bGxldDQsIGxpLkJ1bGxldDQsIGRpdi5CdWxsZXQ0DQoJe21zby1zdHlsZS1uYW1lOiJCdWxsZXQgNCI7DQoJbWFyZ2luLXRvcDo2LjBwdDsNCgltYXJnaW4tcmlnaHQ6MGluOw0KCW1hcmdpbi1ib3R0b206Ni4wcHQ7DQoJbWFyZ2luLWxlZnQ6NzEuNzVwdDsNCgl0ZXh0LWluZGVudDotMTcuOXB0Ow0KCWZvbnQtc2l6ZTo5LjVwdDsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmO30NCnAuQnVsbGV0NSwgbGkuQnVsbGV0NSwgZGl2LkJ1bGxldDUNCgl7bXNvLXN0eWxlLW5hbWU6IkJ1bGxldCA1IjsNCgltYXJnaW4tdG9wOjYuMHB0Ow0KCW1hcmdpbi1yaWdodDowaW47DQoJbWFyZ2luLWJvdHRvbTo2LjBwdDsNCgltYXJnaW4tbGVmdDo4OS42cHQ7DQoJdGV4dC1pbmRlbnQ6LTE3Ljg1cHQ7DQoJZm9udC1zaXplOjkuNXB0Ow0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7fQ0KcC5IZWFkaW5nM0JvbGQsIGxpLkhlYWRpbmczQm9sZCwgZGl2LkhlYWRpbmczQm9sZA0KCXttc28tc3R5bGUtbmFtZToiSGVhZGluZyAzIEJvbGQiOw0KCW1zby1zdHlsZS1saW5rOiJIZWFkaW5nIDMgQm9sZCBDaGFyIjsNCgltYXJnaW4tdG9wOjYuMHB0Ow0KCW1hcmdpbi1yaWdodDowaW47DQoJbWFyZ2luLWJvdHRvbTo2LjBwdDsNCgltYXJnaW4tbGVmdDo1My44NXB0Ow0KCXRleHQtaW5kZW50Oi0xNy44NXB0Ow0KCWZvbnQtc2l6ZTo5LjVwdDsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmOw0KCWZvbnQtd2VpZ2h0OmJvbGQ7fQ0KcC5CdWxsZXQ0VW5kZXJsaW5lLCBsaS5CdWxsZXQ0VW5kZXJsaW5lLCBkaXYuQnVsbGV0NFVuZGVybGluZQ0KCXttc28tc3R5bGUtbmFtZToiQnVsbGV0IDQgVW5kZXJsaW5lIjsNCgltYXJnaW4tdG9wOjYuMHB0Ow0KCW1hcmdpbi1yaWdodDowaW47DQoJbWFyZ2luLWJvdHRvbTo2LjBwdDsNCgltYXJnaW4tbGVmdDo3MS43NXB0Ow0KCXRleHQtaW5kZW50Oi0xNy45cHQ7DQoJZm9udC1zaXplOjkuNXB0Ow0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQpzcGFuLkJvZHkyQ2hhcg0KCXttc28tc3R5bGUtbmFtZToiQm9keSAyIENoYXIiOw0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7fQ0Kc3Bhbi5Cb2R5M0NoYXINCgl7bXNvLXN0eWxlLW5hbWU6IkJvZHkgMyBDaGFyIjsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmO30NCnNwYW4uQ29tbWVudFRleHRDaGFyDQoJe21zby1zdHlsZS1uYW1lOiJDb21tZW50IFRleHQgQ2hhciI7DQoJbXNvLXN0eWxlLWxpbms6IkNvbW1lbnQgVGV4dCI7DQoJZm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjt9DQpzcGFuLkNvbW1lbnRTdWJqZWN0Q2hhcg0KCXttc28tc3R5bGUtbmFtZToiQ29tbWVudCBTdWJqZWN0IENoYXIiOw0KCW1zby1zdHlsZS1saW5rOiJDb21tZW50IFN1YmplY3QiOw0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7DQoJZm9udC13ZWlnaHQ6Ym9sZDt9DQpzcGFuLkJ1bGxldDNDaGFyMQ0KCXttc28tc3R5bGUtbmFtZToiQnVsbGV0IDMgQ2hhcjEiOw0KCW1zby1zdHlsZS1saW5rOiJCdWxsZXQgMyI7DQoJZm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjt9DQpwLkJ1bGxldDRVbmRlcmxpbmVkLCBsaS5CdWxsZXQ0VW5kZXJsaW5lZCwgZGl2LkJ1bGxldDRVbmRlcmxpbmVkDQoJe21zby1zdHlsZS1uYW1lOiJCdWxsZXQgNCBVbmRlcmxpbmVkIjsNCgltYXJnaW4tdG9wOjYuMHB0Ow0KCW1hcmdpbi1yaWdodDowaW47DQoJbWFyZ2luLWJvdHRvbTo2LjBwdDsNCgltYXJnaW4tbGVmdDoxNy44NXB0Ow0KCXRleHQtaW5kZW50Oi0xNy44NXB0Ow0KCWZvbnQtc2l6ZTo5LjVwdDsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmOw0KCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0Kc3Bhbi5IZWFkaW5nM0JvbGRDaGFyDQoJe21zby1zdHlsZS1uYW1lOiJIZWFkaW5nIDMgQm9sZCBDaGFyIjsNCgltc28tc3R5bGUtbGluazoiSGVhZGluZyAzIEJvbGQiOw0KCWZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7DQoJZm9udC13ZWlnaHQ6Ym9sZDt9DQpzcGFuLlBsYWluVGV4dENoYXINCgl7bXNvLXN0eWxlLW5hbWU6IlBsYWluIFRleHQgQ2hhciI7DQoJbXNvLXN0eWxlLWxpbms6IlBsYWluIFRleHQiOw0KCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlmO30NCnNwYW4uSGVhZGVyQ2hhcg0KCXttc28tc3R5bGUtbmFtZToiSGVhZGVyIENoYXIiOw0KCW1zby1zdHlsZS1saW5rOkhlYWRlcjsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmO30NCnNwYW4uRm9vdGVyQ2hhcg0KCXttc28tc3R5bGUtbmFtZToiRm9vdGVyIENoYXIiOw0KCW1zby1zdHlsZS1saW5rOkZvb3RlcjsNCglmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmO30NCnAuYnVsbGV0MzAsIGxpLmJ1bGxldDMwLCBkaXYuYnVsbGV0MzANCgl7bXNvLXN0eWxlLW5hbWU6YnVsbGV0MzsNCgltYXJnaW4tcmlnaHQ6MGluOw0KCW1hcmdpbi1sZWZ0OjBpbjsNCglmb250LXNpemU6MTIuMHB0Ow0KCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLHNlcmlmO30NCnAuYnVsbGV0NDAsIGxpLmJ1bGxldDQwLCBkaXYuYnVsbGV0NDANCgl7bXNvLXN0eWxlLW5hbWU6YnVsbGV0NDsNCgltYXJnaW4tcmlnaHQ6MGluOw0KCW1hcmdpbi1sZWZ0OjBpbjsNCglmb250LXNpemU6MTIuMHB0Ow0KCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLHNlcmlmO30NCi5Nc29DaHBEZWZhdWx0DQoJe2ZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlmO30NCi5Nc29QYXBEZWZhdWx0DQoJe21hcmdpbi1sZWZ0Oi4yNWluOw0KCXRleHQtaW5kZW50Oi0uMjVpbjt9DQogLyogUGFnZSBEZWZpbml0aW9ucyAqLw0KIEBwYWdlIFdvcmRTZWN0aW9uMQ0KCXtzaXplOjguNWluIDExLjBpbjsNCgltYXJnaW46MS4waW4gMS4waW4gMS4waW4gMS4waW47fQ0KZGl2LldvcmRTZWN0aW9uMQ0KCXtwYWdlOldvcmRTZWN0aW9uMTt9DQogLyogTGlzdCBEZWZpbml0aW9ucyAqLw0KIG9sDQoJe21hcmdpbi1ib3R0b206MGluO30NCnVsDQoJe21hcmdpbi1ib3R0b206MGluO30NCi0tPg0KPC9zdHlsZT4NCg0KPC9oZWFkPg0KDQo8Ym9keSBsYW5nPUVOLVVTIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+DQoNCjxkaXYgY2xhc3M9V29yZFNlY3Rpb24xPg0KDQo8cCBjbGFzcz1IZWFkaW5nRVVMQT48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+TUlDUk9TT0ZUIFNPRlRXQVJFIExJQ0VOU0UNClRFUk1TPC9zcGFuPjwvcD4NCg0KPGRpdiBzdHlsZT0nYm9yZGVyOm5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O3BhZGRpbmc6MGluIDBpbiAxLjBwdCAwaW4nPg0KDQo8cCBjbGFzcz1IZWFkaW5nU29mdHdhcmVUaXRsZT48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+TUlDUk9TT0ZUIC5ORVQNCkxJQlJBUlk8L3NwYW4+PC9wPg0KDQo8L2Rpdj4NCg0KPHAgY2xhc3M9UHJlYW1ibGU+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC13ZWlnaHQ6bm9ybWFsJz5UaGVzZQ0KbGljZW5zZSB0ZXJtcyBhcmUgYW4gYWdyZWVtZW50IGJldHdlZW4geW91IGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24gKG9yIGJhc2VkDQpvbiB3aGVyZSB5b3UgbGl2ZSwgb25lIG9mIGl0cyBhZmZpbGlhdGVzKS4gVGhleSBhcHBseSB0byB0aGUgc29mdHdhcmUgbmFtZWQNCmFib3ZlLiBUaGUgdGVybXMgYWxzbyBhcHBseSB0byBhbnkgTWljcm9zb2Z0IHNlcnZpY2VzIG9yIHVwZGF0ZXMgZm9yIHRoZQ0Kc29mdHdhcmUsIGV4Y2VwdCB0byB0aGUgZXh0ZW50IHRob3NlIGhhdmUgZGlmZmVyZW50IHRlcm1zLjwvc3Bhbj48L3A+DQoNCjxkaXYgc3R5bGU9J2JvcmRlcjpub25lO2JvcmRlci10b3A6c29saWQgd2luZG93dGV4dCAxLjBwdDtwYWRkaW5nOjEuMHB0IDBpbiAwaW4gMGluJz4NCg0KPHAgY2xhc3M9UHJlYW1ibGVCb3JkZXJBYm92ZT48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2UnPklmDQp5b3UgY29tcGx5IHdpdGggdGhlc2UgbGljZW5zZSB0ZXJtcywgeW91IGhhdmUgdGhlIHJpZ2h0cyBiZWxvdy48L3NwYW4+PC9wPg0KDQo8L2Rpdj4NCg0KPGgxIHN0eWxlPSdtYXJnaW4tdG9wOjYuMHB0O21hcmdpbi1yaWdodDowaW47bWFyZ2luLWJvdHRvbTowaW47bWFyZ2luLWxlZnQ6DQouMjVpbjttYXJnaW4tYm90dG9tOi4wMDAxcHQ7dGV4dC1pbmRlbnQ6LS4yNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS48c3Bhbg0Kc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PC9zcGFuPjxzcGFuDQpzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SU5TVEFMTEFUSU9OIEFORCBVU0UgUklHSFRTLiA8L3NwYW4+PC9oMT4NCg0KPHAgY2xhc3M9QnVsbGV0MyBzdHlsZT0nbWFyZ2luLXRvcDowaW47bWFyZ2luLXJpZ2h0OjBpbjttYXJnaW4tYm90dG9tOjYuMHB0Ow0KbWFyZ2luLWxlZnQ6LjI1aW47dGV4dC1pbmRlbnQ6MGluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+WW91IG1heQ0KaW5zdGFsbCBhbmQgdXNlIGFueSBudW1iZXIgb2YgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSA8L3NwYW4+PHNwYW4NCnN0eWxlPSdmb250LXNpemU6MTAuMHB0O2NvbG9yOmJsYWNrJz50byBkZXZlbG9wIGFuZCB0ZXN0IHlvdXIgYXBwbGljYXRpb25zLiZuYnNwOw0KPC9zcGFuPjwvcD4NCg0KPGgxPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsNCjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRISVJEIFBBUlRZIENPTVBPTkVOVFMuIDwvc3Bhbj48c3Bhbg0Kc3R5bGU9J2ZvbnQtd2VpZ2h0Om5vcm1hbCc+VGhlIHNvZnR3YXJlIG1heSBpbmNsdWRlIHRoaXJkIHBhcnR5IGNvbXBvbmVudHMgd2l0aA0Kc2VwYXJhdGUgbGVnYWwgbm90aWNlcyBvciBnb3Zlcm5lZCBieSBvdGhlciBhZ3JlZW1lbnRzLCBhcyBtYXkgYmUgZGVzY3JpYmVkIGluDQp0aGUgVGhpcmRQYXJ0eU5vdGljZXMgZmlsZShzKSA8L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC13ZWlnaHQ6DQpub3JtYWwnPmFjY29tcGFueWluZyB0aGUgc29mdHdhcmUuPC9zcGFuPjwvaDE+DQoNCjxoMT48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My48c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7DQo8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2NvbG9yOmJsYWNrJz5BRERJVElPTkFMIExJQ0VOU0lORw0KUkVRVUlSRU1FTlRTIEFORC9PUiBVU0UgUklHSFRTLjwvc3Bhbj48L2gxPg0KDQo8aDI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Y29sb3I6YmxhY2snPmEuPHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtjb2xvcjpibGFjayc+RElTVFJJQlVUQUJMRQ0KQ09ERS4mbmJzcDsgPC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2NvbG9yOmJsYWNrO2ZvbnQtd2VpZ2h0Om5vcm1hbCc+VDwvc3Bhbj48c3Bhbg0Kc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Y29sb3I6YmxhY2s7Zm9udC13ZWlnaHQ6bm9ybWFsJz5oZSBzb2Z0d2FyZSBpcw0KY29tcHJpc2VkIG9mIERpc3RyaWJ1dGFibGUgQ29kZS4gk0Rpc3RyaWJ1dGFibGUgQ29kZZQgaXMgY29kZSB0aGF0IHlvdSBhcmUNCnBlcm1pdHRlZCB0byBkaXN0cmlidXRlIGluIGFwcGxpY2F0aW9ucyB5b3UgZGV2ZWxvcCBpZiB5b3UgY29tcGx5IHdpdGggdGhlDQp0ZXJtcyBiZWxvdy48L3NwYW4+PC9oMj4NCg0KPGgzIHN0eWxlPSdtYXJnaW4tdG9wOjBpbjttYXJnaW4tcmlnaHQ6MGluO21hcmdpbi1ib3R0b206MGluO21hcmdpbi1sZWZ0OjUzLjg1cHQ7DQptYXJnaW4tYm90dG9tOi4wMDAxcHQnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2NvbG9yOmJsYWNrJz5pLjxzcGFuDQpzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48L3NwYW4+PC9iPjxiPjxzcGFuDQpzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtjb2xvcjpibGFjayc+UmlnaHQgdG8gVXNlIGFuZCBEaXN0cmlidXRlLiA8L3NwYW4+PC9iPjwvaDM+DQoNCjxwIGNsYXNzPWJ1bGxldDMwIHN0eWxlPSdtYXJnaW4tdG9wOjYuMHB0O21hcmdpbi1yaWdodDowaW47bWFyZ2luLWJvdHRvbTo2LjBwdDsNCm1hcmdpbi1sZWZ0OjEuMGluO3RleHQtaW5kZW50Oi0uMjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6DQpTeW1ib2w7Y29sb3I6YmxhY2snPrc8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQo8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7DQpjb2xvcjpibGFjayc+WW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3JtIG9mIHRoZSBzb2Z0d2FyZS48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1idWxsZXQzMCBzdHlsZT0nbWFyZ2luLXRvcDo2LjBwdDttYXJnaW4tcmlnaHQ6MGluO21hcmdpbi1ib3R0b206Ni4wcHQ7DQptYXJnaW4tbGVmdDoxLjBpbjt0ZXh0LWluZGVudDotLjI1aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5Og0KU3ltYm9sO2NvbG9yOmJsYWNrJz63PHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmOw0KY29sb3I6YmxhY2snPlRoaXJkIFBhcnR5IERpc3RyaWJ1dGlvbi4gWW91IG1heSBwZXJtaXQgZGlzdHJpYnV0b3JzIG9mIHlvdXIgYXBwbGljYXRpb25zDQp0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBEaXN0cmlidXRhYmxlIENvZGUgYXMgcGFydCBvZiB0aG9zZSBhcHBsaWNhdGlvbnMuPC9zcGFuPjwvcD4NCg0KPGgzIHN0eWxlPSdtYXJnaW4tdG9wOjBpbjttYXJnaW4tcmlnaHQ6MGluO21hcmdpbi1ib3R0b206MGluO21hcmdpbi1sZWZ0OjUzLjg1cHQ7DQptYXJnaW4tYm90dG9tOi4wMDAxcHQnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2NvbG9yOmJsYWNrJz5paS48c3Bhbg0Kc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PC9zcGFuPjwvYj48Yj48c3Bhbg0Kc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Y29sb3I6YmxhY2snPkRpc3RyaWJ1dGlvbiBSZXF1aXJlbWVudHMuIEZvciBhbnkNCkRpc3RyaWJ1dGFibGUgQ29kZSB5b3UgZGlzdHJpYnV0ZSwgeW91IG11c3Q8L3NwYW4+PC9iPjwvaDM+DQoNCjxwIGNsYXNzPWJ1bGxldDMwIHN0eWxlPSdtYXJnaW4tdG9wOjYuMHB0O21hcmdpbi1yaWdodDowaW47bWFyZ2luLWJvdHRvbTo2LjBwdDsNCm1hcmdpbi1sZWZ0OjEuMGluO3RleHQtaW5kZW50Oi0uMjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6DQpTeW1ib2w7Y29sb3I6YmxhY2snPrc8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQo8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7DQpjb2xvcjpibGFjayc+dXNlIHRoZSBEaXN0cmlidXRhYmxlIENvZGUgaW4geW91ciBhcHBsaWNhdGlvbnMgYW5kIG5vdCBhcyBhDQpzdGFuZGFsb25lIGRpc3RyaWJ1dGlvbjs8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1idWxsZXQzMCBzdHlsZT0nbWFyZ2luLXRvcDo2LjBwdDttYXJnaW4tcmlnaHQ6MGluO21hcmdpbi1ib3R0b206Ni4wcHQ7DQptYXJnaW4tbGVmdDoxLjBpbjt0ZXh0LWluZGVudDotLjI1aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5Og0KU3ltYm9sO2NvbG9yOmJsYWNrJz63PHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmOw0KY29sb3I6YmxhY2snPnJlcXVpcmUgZGlzdHJpYnV0b3JzIGFuZCBleHRlcm5hbCBlbmQgdXNlcnMgdG8gYWdyZWUgdG8gdGVybXMgdGhhdA0KcHJvdGVjdCBpdCBhdCBsZWFzdCBhcyBtdWNoIGFzIHRoaXMgYWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1idWxsZXQzMCBzdHlsZT0nbWFyZ2luLXRvcDo2LjBwdDttYXJnaW4tcmlnaHQ6MGluO21hcmdpbi1ib3R0b206Ni4wcHQ7DQptYXJnaW4tbGVmdDoxLjBpbjt0ZXh0LWluZGVudDotLjI1aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5Og0KU3ltYm9sO2NvbG9yOmJsYWNrJz63PHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiVGFob21hIixzYW5zLXNlcmlmOw0KY29sb3I6YmxhY2snPmluZGVtbmlmeSwgZGVmZW5kLCBhbmQgaG9sZCBoYXJtbGVzcyBNaWNyb3NvZnQgZnJvbSBhbnkgY2xhaW1zLA0KaW5jbHVkaW5nIGF0dG9ybmV5c5IgZmVlcywgcmVsYXRlZCB0byB0aGUgZGlzdHJpYnV0aW9uIG9yIHVzZSBvZiB5b3VyIGFwcGxpY2F0aW9ucywNCmV4Y2VwdCB0byB0aGUgZXh0ZW50IHRoYXQgYW55IGNsYWltIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgdW5tb2RpZmllZCBEaXN0cmlidXRhYmxlDQpDb2RlLjwvc3Bhbj48L3A+DQoNCjxoMyBzdHlsZT0nbWFyZ2luLXRvcDowaW47bWFyZ2luLXJpZ2h0OjBpbjttYXJnaW4tYm90dG9tOjBpbjttYXJnaW4tbGVmdDo1My44NXB0Ow0KbWFyZ2luLWJvdHRvbTouMDAwMXB0Jz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtjb2xvcjpibGFjayc+aWlpLjxzcGFuDQpzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48L3NwYW4+PC9iPjxiPjxzcGFuDQpzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtjb2xvcjpibGFjayc+RGlzdHJpYnV0aW9uIFJlc3RyaWN0aW9ucy4gWW91IG1heSBub3Q8L3NwYW4+PC9iPjwvaDM+DQoNCjxwIGNsYXNzPWJ1bGxldDMwIHN0eWxlPSdtYXJnaW4tdG9wOjYuMHB0O21hcmdpbi1yaWdodDowaW47bWFyZ2luLWJvdHRvbTo2LjBwdDsNCm1hcmdpbi1sZWZ0OjEuMGluO3RleHQtaW5kZW50Oi0uMjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6DQpTeW1ib2w7Y29sb3I6YmxhY2snPrc8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQo8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7DQpjb2xvcjpibGFjayc+dXNlIE1pY3Jvc29mdJJzIHRyYWRlbWFya3MgaW4geW91ciBhcHBsaWNhdGlvbnOSIG5hbWVzIG9yIGluIGEgd2F5DQp0aGF0IHN1Z2dlc3RzIHlvdXIgYXBwbGljYXRpb25zIGNvbWUgZnJvbSBvciBhcmUgZW5kb3JzZWQgYnkgTWljcm9zb2Z0OyBvcjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPWJ1bGxldDMwIHN0eWxlPSdtYXJnaW4tdG9wOjYuMHB0O21hcmdpbi1yaWdodDowaW47bWFyZ2luLWJvdHRvbTo2LjBwdDsNCm1hcmdpbi1sZWZ0OjEuMGluO3RleHQtaW5kZW50Oi0uMjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6DQpTeW1ib2w7Y29sb3I6YmxhY2snPrc8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQo8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJUYWhvbWEiLHNhbnMtc2VyaWY7DQpjb2xvcjpibGFjayc+bW9kaWZ5IG9yIGRpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlIG9mIGFueSBEaXN0cmlidXRhYmxlIENvZGUgc28NCnRoYXQgYW55IHBhcnQgb2YgaXQgYmVjb21lcyBzdWJqZWN0IHRvIGFuIEV4Y2x1ZGVkIExpY2Vuc2UuIEFuIJNFeGNsdWRlZA0KTGljZW5zZZQgaXMgb25lIHRoYXQgcmVxdWlyZXMsIGFzIGEgY29uZGl0aW9uIG9mIHVzZSwgbW9kaWZpY2F0aW9uIG9yDQpkaXN0cmlidXRpb24gb2YgY29kZSwgdGhhdCAoaSkgaXQgYmUgZGlzY2xvc2VkIG9yIGRpc3RyaWJ1dGVkIGluIHNvdXJjZSBjb2RlDQpmb3JtOyBvciAoaWkpIG90aGVycyBoYXZlIHRoZSByaWdodCB0byBtb2RpZnkgaXQuPC9zcGFuPjwvcD4NCg0KPGgxPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsNCjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkRBVEEuPC9zcGFuPjwvaDE+DQoNCjxoMj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YS48c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQo8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5EYXRhIENvbGxlY3Rpb24uIDwvc3Bhbj48c3Bhbg0Kc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC13ZWlnaHQ6bm9ybWFsJz5UaGUgc29mdHdhcmUgbWF5IGNvbGxlY3QNCmluZm9ybWF0aW9uIGFib3V0IHlvdSBhbmQgeW91ciB1c2Ugb2YgdGhlIHNvZnR3YXJlLCBhbmQgc2VuZCB0aGF0IHRvIE1pY3Jvc29mdC4NCk1pY3Jvc29mdCBtYXkgdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gcHJvdmlkZSBzZXJ2aWNlcyBhbmQgaW1wcm92ZSBvdXIgcHJvZHVjdHMNCmFuZCBzZXJ2aWNlcy6gIFlvdSBtYXkgb3B0LW91dCBvZiBtYW55IG9mIHRoZXNlIHNjZW5hcmlvcywgYnV0IG5vdCBhbGwsIGFzDQpkZXNjcmliZWQgaW4gdGhlIHNvZnR3YXJlIGRvY3VtZW50YXRpb24uoCBUaGVyZSBhcmUgYWxzbyBzPHNwYW4NCnN0eWxlPSdjb2xvcjpibGFjayc+b21lIGZlYXR1cmVzIGluIHRoZSBzb2Z0d2FyZSB0aGF0IG1heSBlbmFibGUgeW91IGFuZA0KTWljcm9zb2Z0IHRvIGNvbGxlY3QgZGF0YSBmcm9tIHVzZXJzIG9mIHlvdXIgYXBwbGljYXRpb25zLjwvc3Bhbj4gSWYgeW91IHVzZQ0KdGhlc2UgZmVhdHVyZXMsIHlvdSBtdXN0IGNvbXBseSB3aXRoIGFwcGxpY2FibGUgbGF3LCBpbmNsdWRpbmcgcHJvdmlkaW5nDQphcHByb3ByaWF0ZSBub3RpY2VzIHRvIHVzZXJzIG9mIHlvdXIgYXBwbGljYXRpb25zIHRvZ2V0aGVyIHdpdGggTWljcm9zb2Z0knMNCnByaXZhY3kgc3RhdGVtZW50LiBPdXIgcHJpdmFjeSBzdGF0ZW1lbnQgaXMgbG9jYXRlZCBhdCA8L3NwYW4+PGENCmhyZWY9Imh0dHBzOi8vZ28ubWljcm9zb2Z0LmNvbS9md2xpbmsvP0xpbmtJRD04MjQ3MDQiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6DQoxMC4wcHQ7Zm9udC13ZWlnaHQ6bm9ybWFsJz5odHRwczovL2dvLm1pY3Jvc29mdC5jb20vZndsaW5rLz9MaW5rSUQ9ODI0NzA0PC9zcGFuPjwvYT48c3Bhbg0Kc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC13ZWlnaHQ6bm9ybWFsJz4uIFlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCBkYXRhDQpjb2xsZWN0aW9uIGFuZCBpdHMgdXNlIGZyb20gdGhlIHNvZnR3YXJlIGRvY3VtZW50YXRpb24gYW5kIG91ciBwcml2YWN5DQpzdGF0ZW1lbnQuIFlvdXIgdXNlIG9mIHRoZSBzb2Z0d2FyZSBvcGVyYXRlcyBhcyB5b3VyIGNvbnNlbnQgdG8gdGhlc2UNCnByYWN0aWNlcy48L3NwYW4+PC9oMj4NCg0KPGgyPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iLjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsNCjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlByb2Nlc3Npbmcgb2YgUGVyc29uYWwgRGF0YS4gPC9zcGFuPjxzcGFuDQpzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LXdlaWdodDpub3JtYWwnPlRvIHRoZSBleHRlbnQgTWljcm9zb2Z0IGlzIGENCnByb2Nlc3NvciBvciBzdWJwcm9jZXNzb3Igb2YgcGVyc29uYWwgZGF0YSBpbiBjb25uZWN0aW9uIHdpdGggdGhlIHNvZnR3YXJlLA0KTWljcm9zb2Z0IG1ha2VzIHRoZSBjb21taXRtZW50cyBpbiB0aGUgRXVyb3BlYW4gVW5pb24gR2VuZXJhbCBEYXRhIFByb3RlY3Rpb24NClJlZ3VsYXRpb24gVGVybXMgb2YgdGhlIE9ubGluZSBTZXJ2aWNlcyBUZXJtcyB0byBhbGwgY3VzdG9tZXJzIGVmZmVjdGl2ZSBNYXkNCjI1LCAyMDE4LCBhdCA8L3NwYW4+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Ow0KZm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjtmb250LXdlaWdodDpub3JtYWwnPmh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2xlZ2FsL2dkcHI8L3NwYW4+PC9zcGFuPjxzcGFuDQpzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LXdlaWdodDpub3JtYWwnPi48L3NwYW4+PC9oMj4NCg0KPGgxPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsNCjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlJz5TY29wZSBvZg0KTGljZW5zZTwvc3Bhbj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ljwvc3Bhbj48c3BhbiBzdHlsZT0nZm9udC1zaXplOg0KMTAuMHB0O2ZvbnQtd2VpZ2h0Om5vcm1hbCc+IFRoZSBzb2Z0d2FyZSBpcyBsaWNlbnNlZCwgbm90IHNvbGQuIFRoaXMgYWdyZWVtZW50DQpvbmx5IGdpdmVzIHlvdSBzb21lIHJpZ2h0cyB0byB1c2UgdGhlIHNvZnR3YXJlLiBNaWNyb3NvZnQgcmVzZXJ2ZXMgYWxsIG90aGVyDQpyaWdodHMuIFVubGVzcyBhcHBsaWNhYmxlIGxhdyBnaXZlcyB5b3UgbW9yZSByaWdodHMgZGVzcGl0ZSB0aGlzIGxpbWl0YXRpb24sDQp5b3UgbWF5IHVzZSB0aGUgc29mdHdhcmUgb25seSBhcyBleHByZXNzbHkgcGVybWl0dGVkIGluIHRoaXMgYWdyZWVtZW50LiBJbg0KZG9pbmcgc28sIHlvdSBtdXN0IGNvbXBseSB3aXRoIGFueSB0ZWNobmljYWwgbGltaXRhdGlvbnMgaW4gdGhlIHNvZnR3YXJlIHRoYXQNCm9ubHkgYWxsb3cgeW91IHRvIHVzZSBpdCBpbiBjZXJ0YWluIHdheXMuIFlvdSBtYXkgbm90PC9zcGFuPjwvaDE+DQoNCjxwIGNsYXNzPUJ1bGxldDI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6U3ltYm9sJz63PHNwYW4NCnN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndvcmsgYXJvdW5kIGFueSB0ZWNobmljYWwNCmxpbWl0YXRpb25zIGluIHRoZSBzb2Z0d2FyZTwvc3Bhbj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ozwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPUJ1bGxldDI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6U3ltYm9sJz63PHNwYW4NCnN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPnJldmVyc2UgZW5naW5lZXIsIGRlY29tcGlsZSBvcg0KZGlzYXNzZW1ibGUgdGhlIHNvZnR3YXJlLCBvciBvdGhlcndpc2UgYXR0ZW1wdCB0byBkZXJpdmUgdGhlIHNvdXJjZSBjb2RlIGZvcg0KdGhlIHNvZnR3YXJlLCBleGNlcHQgYW5kIHRvIHRoZSBleHRlbnQgcmVxdWlyZWQgYnkgdGhpcmQgcGFydHkgbGljZW5zaW5nIHRlcm1zDQpnb3Zlcm5pbmcgdXNlIG9mIGNlcnRhaW4gb3BlbiBzb3VyY2UgY29tcG9uZW50cyB0aGF0IG1heSBiZSBpbmNsdWRlZCBpbiB0aGUNCnNvZnR3YXJlOzwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPUJ1bGxldDI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6U3ltYm9sJz63PHNwYW4NCnN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPnJlbW92ZSwgbWluaW1pemUsIGJsb2NrIG9yIG1vZGlmeQ0KYW55IG5vdGljZXMgb2YgTWljcm9zb2Z0IG9yIGl0cyBzdXBwbGllcnMgaW4gdGhlIHNvZnR3YXJlOyA8L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1CdWxsZXQyPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OlN5bWJvbCc+tzxzcGFuDQpzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQo8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz51c2UgdGhlIHNvZnR3YXJlIGluIGFueSB3YXkgdGhhdA0KaXMgYWdhaW5zdCB0aGUgbGF3OyBvcjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPUJ1bGxldDI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6U3ltYm9sJz63PHNwYW4NCnN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPnNoYXJlLCBwdWJsaXNoLCByZW50IG9yIGxlYXNlIHRoZQ0Kc29mdHdhcmUsIHByb3ZpZGUgdGhlIHNvZnR3YXJlIGFzIGEgc3RhbmQtYWxvbmUgb2ZmZXJpbmcgZm9yIG90aGVycyB0byB1c2UsIG9yDQp0cmFuc2ZlciB0aGUgc29mdHdhcmUgb3IgdGhpcyBhZ3JlZW1lbnQgdG8gYW55IHRoaXJkIHBhcnR5Ljwvc3Bhbj48L3A+DQoNCjxoMT48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6IlRhaG9tYSIsc2Fucy1zZXJpZjsNCmNvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjYuPHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOw0KPC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlJz5FeHBvcnQNClJlc3RyaWN0aW9uczwvc3Bhbj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ljwvc3Bhbj48c3Bhbg0Kc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC13ZWlnaHQ6bm9ybWFsJz4gPC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6DQoxMC4wcHQ7Zm9udC13ZWlnaHQ6bm9ybWFsJz5Zb3UgbXVzdCBjb21wbHkgd2l0aCBhbGwgZG9tZXN0aWMgYW5kIGludGVybmF0aW9uYWwNCmV4cG9ydCBsYXdzIGFuZCByZWd1bGF0aW9ucyB0aGF0IGFwcGx5IHRvIHRoZSBzb2Z0d2FyZSwgd2hpY2ggaW5jbHVkZQ0KcmVzdHJpY3Rpb25zIG9uIGRlc3RpbmF0aW9ucywgZW5kIHVzZXJzLCBhbmQgZW5kIHVzZS4gRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24NCm9uIGV4cG9ydCByZXN0cmljdGlvbnMsIHZpc2l0IHd3dy5taWNyb3NvZnQuY29tL2V4cG9ydGluZy48L3NwYW4+PHNwYW4NCmNsYXNzPU1zb0h5cGVybGluaz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LXdlaWdodDpub3JtYWwnPiA8L3NwYW4+PC9zcGFuPjxzcGFuDQpzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LXdlaWdodDpub3JtYWwnPqA8L3NwYW4+PC9oMT4NCg0KPGgxPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsNCjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlJz5TVVBQT1JUDQpTRVJWSUNFUy48L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiA8L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToNCjEwLjBwdDtmb250LXdlaWdodDpub3JtYWwnPkJlY2F1c2UgdGhpcyBzb2Z0d2FyZSBpcyCTYXMgaXMslCB3ZSBtYXkgbm90IHByb3ZpZGUNCnN1cHBvcnQgc2VydmljZXMgZm9yIGl0Ljwvc3Bhbj48L2gxPg0KDQo8aDE+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjguPHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOw0KPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2UnPkVudGlyZQ0KQWdyZWVtZW50Ljwvc3Bhbj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LXdlaWdodDpub3JtYWwnPiBUaGlzDQphZ3JlZW1lbnQsIGFuZCB0aGUgdGVybXMgZm9yIHN1cHBsZW1lbnRzLCB1cGRhdGVzLCBJbnRlcm5ldC1iYXNlZCBzZXJ2aWNlcyBhbmQNCnN1cHBvcnQgc2VydmljZXMgdGhhdCB5b3UgdXNlLCBhcmUgdGhlIGVudGlyZSBhZ3JlZW1lbnQgZm9yIHRoZSBzb2Z0d2FyZSBhbmQNCnN1cHBvcnQgc2VydmljZXMuPC9zcGFuPjwvaDE+DQoNCjxoMSBzdHlsZT0nbWFyZ2luLWxlZnQ6LjI1aW47dGV4dC1pbmRlbnQ6LS4yNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+OS48c3Bhbg0Kc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PC9zcGFuPjxzcGFuDQpzdHlsZT0nZm9udC1zaXplOjEwLjBwdDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2UnPkFwcGxpY2FibGUgTGF3PC9zcGFuPjxzcGFuDQpzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+LqAgPC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtd2VpZ2h0Og0Kbm9ybWFsJz5JZiB5b3UgYWNxdWlyZWQgdGhlIHNvZnR3YXJlIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBXYXNoaW5ndG9uIGxhdw0KYXBwbGllcyB0byBpbnRlcnByZXRhdGlvbiBvZiBhbmQgY2xhaW1zIGZvciBicmVhY2ggb2YgdGhpcyBhZ3JlZW1lbnQsIGFuZCB0aGUNCmxhd3Mgb2YgdGhlIHN0YXRlIHdoZXJlIHlvdSBsaXZlIGFwcGx5IHRvIGFsbCBvdGhlciBjbGFpbXMuIElmIHlvdSBhY3F1aXJlZCB0aGUNCnNvZnR3YXJlIGluIGFueSBvdGhlciBjb3VudHJ5LCBpdHMgbGF3cyBhcHBseS48L3NwYW4+PC9oMT4NCg0KPGgxIHN0eWxlPSdtYXJnaW4tbGVmdDouMjVpbjt0ZXh0LWluZGVudDotLjI1aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xMC48c3Bhbg0Kc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6DQoxMC4wcHQnPkNPTlNVTUVSIFJJR0hUUzsgUkVHSU9OQUwgVkFSSUFUSU9OUy4gPC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6DQoxMC4wcHQ7Zm9udC13ZWlnaHQ6bm9ybWFsJz5UaGlzIGFncmVlbWVudCBkZXNjcmliZXMgY2VydGFpbiBsZWdhbCByaWdodHMuIFlvdQ0KbWF5IGhhdmUgb3RoZXIgcmlnaHRzLCBpbmNsdWRpbmcgY29uc3VtZXIgcmlnaHRzLCB1bmRlciB0aGUgbGF3cyBvZiB5b3VyIHN0YXRlDQpvciBjb3VudHJ5LiBTZXBhcmF0ZSBhbmQgYXBhcnQgZnJvbSB5b3VyIHJlbGF0aW9uc2hpcCB3aXRoIE1pY3Jvc29mdCwgeW91IG1heQ0KYWxzbyBoYXZlIHJpZ2h0cyB3aXRoIHJlc3BlY3QgdG8gdGhlIHBhcnR5IGZyb20gd2hpY2ggeW91IGFjcXVpcmVkIHRoZQ0Kc29mdHdhcmUuIFRoaXMgYWdyZWVtZW50IGRvZXMgbm90IGNoYW5nZSB0aG9zZSBvdGhlciByaWdodHMgaWYgdGhlIGxhd3Mgb2YgeW91cg0Kc3RhdGUgb3IgY291bnRyeSBkbyBub3QgcGVybWl0IGl0IHRvIGRvIHNvLiBGb3IgZXhhbXBsZSwgaWYgeW91IGFjcXVpcmVkIHRoZQ0Kc29mdHdhcmUgaW4gb25lIG9mIHRoZSBiZWxvdyByZWdpb25zLCBvciBtYW5kYXRvcnkgY291bnRyeSBsYXcgYXBwbGllcywgdGhlbg0KdGhlIGZvbGxvd2luZyBwcm92aXNpb25zIGFwcGx5IHRvIHlvdTo8L3NwYW4+PC9oMT4NCg0KPGgyIHN0eWxlPSdtYXJnaW4tbGVmdDozNS44NXB0O3RleHQtaW5kZW50Oi0uMjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpPHNwYW4NCnN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjwvc3Bhbj48c3Bhbg0Kc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkF1c3RyYWxpYS4gPC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Ow0KZm9udC13ZWlnaHQ6bm9ybWFsJz5Zb3UgaGF2ZSBzdGF0dXRvcnkgZ3VhcmFudGVlcyB1bmRlciB0aGUgQXVzdHJhbGlhbiBDb25zdW1lcg0KTGF3IGFuZCBub3RoaW5nIGluIHRoaXMgYWdyZWVtZW50IGlzIGludGVuZGVkIHRvIGFmZmVjdCB0aG9zZSByaWdodHMuPC9zcGFuPjwvaDI+DQoNCjxoMiBzdHlsZT0nbWFyZ2luLWxlZnQ6MzUuODVwdDt0ZXh0LWluZGVudDotLjI1aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKTxzcGFuDQpzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48L3NwYW4+PHNwYW4NCnN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5DYW5hZGEuIDwvc3Bhbj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsNCmZvbnQtd2VpZ2h0Om5vcm1hbCc+SWYgeW91IGFjcXVpcmVkIHRoaXMgc29mdHdhcmUgaW4gQ2FuYWRhLCB5b3UgbWF5IHN0b3ANCnJlY2VpdmluZyB1cGRhdGVzIGJ5IHR1cm5pbmcgb2ZmIHRoZSBhdXRvbWF0aWMgdXBkYXRlIGZlYXR1cmUsIGRpc2Nvbm5lY3RpbmcNCnlvdXIgZGV2aWNlIGZyb20gdGhlIEludGVybmV0IChpZiBhbmQgd2hlbiB5b3UgcmUtY29ubmVjdCB0byB0aGUgSW50ZXJuZXQsDQpob3dldmVyLCB0aGUgc29mdHdhcmUgd2lsbCByZXN1bWUgY2hlY2tpbmcgZm9yIGFuZCBpbnN0YWxsaW5nIHVwZGF0ZXMpLCBvciB1bmluc3RhbGxpbmcNCnRoZSBzb2Z0d2FyZS4gVGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiwgaWYgYW55LCBtYXkgYWxzbyBzcGVjaWZ5IGhvdyB0byB0dXJuDQpvZmYgdXBkYXRlcyBmb3IgeW91ciBzcGVjaWZpYyBkZXZpY2Ugb3Igc29mdHdhcmUuPC9zcGFuPjwvaDI+DQoNCjxoMiBzdHlsZT0nbWFyZ2luLWxlZnQ6MzUuODVwdDt0ZXh0LWluZGVudDotLjI1aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKTxzcGFuDQpzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48L3NwYW4+PHNwYW4NCnN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5HZXJtYW55IGFuZCBBdXN0cmlhPC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Ow0KZm9udC13ZWlnaHQ6bm9ybWFsJz4uPC9zcGFuPjwvaDI+DQoNCjxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzUuODVwdCc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPihpKTwvc3Bhbj48L2I+PHNwYW4NCnN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz6goKCgoKCgIDxiPldhcnJhbnR5PC9iPi4gVGhlIHNvZnR3YXJlIHdpbGwgcGVyZm9ybQ0Kc3Vic3RhbnRpYWxseSBhcyBkZXNjcmliZWQgaW4gYW55IE1pY3Jvc29mdCBtYXRlcmlhbHMgdGhhdCBhY2NvbXBhbnkgaXQuDQpIb3dldmVyLCBNaWNyb3NvZnQgZ2l2ZXMgbm8gY29udHJhY3R1YWwgZ3VhcmFudGVlIGluIHJlbGF0aW9uIHRvIHRoZSBzb2Z0d2FyZS48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0OjM1Ljg1cHQnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4oaWkpPC9zcGFuPjwvYj48c3Bhbg0Kc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPqCgoKCgoCA8Yj5MaW1pdGF0aW9uIG9mIExpYWJpbGl0eTwvYj4uIEluIGNhc2Ugb2YNCmludGVudGlvbmFsIGNvbmR1Y3QsIGdyb3NzIG5lZ2xpZ2VuY2UsIGNsYWltcyBiYXNlZCBvbiB0aGUgUHJvZHVjdCBMaWFiaWxpdHkNCkFjdCwgYXMgd2VsbCBhcyBpbiBjYXNlIG9mIGRlYXRoIG9yIHBlcnNvbmFsIG9yIHBoeXNpY2FsIGluanVyeSwgTWljcm9zb2Z0IGlzDQpsaWFibGUgYWNjb3JkaW5nIHRvIHRoZSBzdGF0dXRvcnkgbGF3Ljwvc3Bhbj48L3A+DQoNCjxoMSBzdHlsZT0nbWFyZ2luLWxlZnQ6MjIuNXB0O3RleHQtaW5kZW50OjBpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7DQpmb250LXdlaWdodDpub3JtYWwnPlN1YmplY3QgdG8gdGhlIGZvcmVnb2luZyBjbGF1c2UgKGlpKSwgTWljcm9zb2Z0IHdpbGwgb25seQ0KYmUgbGlhYmxlIGZvciBzbGlnaHQgbmVnbGlnZW5jZSBpZiBNaWNyb3NvZnQgaXMgaW4gYnJlYWNoIG9mIHN1Y2ggbWF0ZXJpYWwNCmNvbnRyYWN0dWFsIG9ibGlnYXRpb25zLCB0aGUgZnVsZmlsbG1lbnQgb2Ygd2hpY2ggZmFjaWxpdGF0ZSB0aGUgZHVlDQpwZXJmb3JtYW5jZSBvZiB0aGlzIGFncmVlbWVudCwgdGhlIGJyZWFjaCBvZiB3aGljaCB3b3VsZCBlbmRhbmdlciB0aGUgcHVycG9zZQ0Kb2YgdGhpcyBhZ3JlZW1lbnQgYW5kIHRoZSBjb21wbGlhbmNlIHdpdGggd2hpY2ggYSBwYXJ0eSBtYXkgY29uc3RhbnRseSB0cnVzdCBpbg0KKHNvLWNhbGxlZCAmcXVvdDtjYXJkaW5hbCBvYmxpZ2F0aW9ucyZxdW90OykuIEluIG90aGVyIGNhc2VzIG9mIHNsaWdodCBuZWdsaWdlbmNlLA0KTWljcm9zb2Z0IHdpbGwgbm90IGJlIGxpYWJsZSBmb3Igc2xpZ2h0IG5lZ2xpZ2VuY2U8L3NwYW4+PC9oMT4NCg0KPGgxPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZSc+MTEuPHNwYW4NCnN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4gPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0nZm9udC1zaXplOg0KMTAuMHB0O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZSc+RGlzY2xhaW1lciBvZiBXYXJyYW50eS48L3NwYW4+PHNwYW4NCnN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4gVEhFIFNPRlRXQVJFIElTIExJQ0VOU0VEIJNBUy1JUy6UIFlPVSBCRUFSIFRIRSBSSVNLDQpPRiBVU0lORyBJVC4gTUlDUk9TT0ZUIEdJVkVTIE5PIEVYUFJFU1MgV0FSUkFOVElFUywgR1VBUkFOVEVFUyBPUiBDT05ESVRJT05TLg0KVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgVU5ERVIgWU9VUiBMT0NBTCBMQVdTLCBNSUNST1NPRlQgRVhDTFVERVMgVEhFIElNUExJRUQNCldBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQNCk5PTi1JTkZSSU5HRU1FTlQuIDwvc3Bhbj48L2gxPg0KDQo8aDE+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEyLjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4NCjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlJz5MaW1pdGF0aW9uDQpvbiBhbmQgRXhjbHVzaW9uIG9mIFJlbWVkaWVzIGFuZCBEYW1hZ2VzLiA8L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPllPVQ0KQ0FOIFJFQ09WRVIgRlJPTSBNSUNST1NPRlQgQU5EIElUUyBTVVBQTElFUlMgT05MWSBESVJFQ1QgREFNQUdFUyBVUCBUTyBVLlMuDQokNS4wMC4gWU9VIENBTk5PVCBSRUNPVkVSIEFOWSBPVEhFUiBEQU1BR0VTLCBJTkNMVURJTkcgQ09OU0VRVUVOVElBTCwgTE9TVA0KUFJPRklUUywgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgSU5DSURFTlRBTCBEQU1BR0VTLjwvc3Bhbj48L2gxPg0KDQo8cCBjbGFzcz1Cb2R5MT48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBsaW1pdGF0aW9uIGFwcGxpZXMgdG8gKGEpDQphbnl0aGluZyByZWxhdGVkIHRvIHRoZSBzb2Z0d2FyZSwgc2VydmljZXMsIGNvbnRlbnQgKGluY2x1ZGluZyBjb2RlKSBvbiB0aGlyZA0KcGFydHkgSW50ZXJuZXQgc2l0ZXMsIG9yIHRoaXJkIHBhcnR5IGFwcGxpY2F0aW9uczsgYW5kIChiKSBjbGFpbXMgZm9yIGJyZWFjaCBvZg0KY29udHJhY3QsIGJyZWFjaCBvZiB3YXJyYW50eSwgZ3VhcmFudGVlIG9yIGNvbmRpdGlvbiwgc3RyaWN0IGxpYWJpbGl0eSwNCm5lZ2xpZ2VuY2UsIG9yIG90aGVyIHRvcnQgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcuPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouMjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkl0DQphbHNvIGFwcGxpZXMgZXZlbiBpZiBNaWNyb3NvZnQga25ldyBvciBzaG91bGQgaGF2ZSBrbm93biBhYm91dCB0aGUgcG9zc2liaWxpdHkNCm9mIHRoZSBkYW1hZ2VzLiBUaGUgYWJvdmUgbGltaXRhdGlvbiBvciBleGNsdXNpb24gbWF5IG5vdCBhcHBseSB0byB5b3UgYmVjYXVzZQ0KeW91ciBzdGF0ZSBvciBjb3VudHJ5IG1heSBub3QgYWxsb3cgdGhlIGV4Y2x1c2lvbiBvciBsaW1pdGF0aW9uIG9mIGluY2lkZW50YWwsDQpjb25zZXF1ZW50aWFsIG9yIG90aGVyIGRhbWFnZXMuPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mbmJzcDs8L3NwYW4+PC9wPg0KDQo8L2Rpdj4NCg0KPC9ib2R5Pg0KDQo8L2h0bWw+DQo=
+    http_version:
+  recorded_at: Tue, 28 Jan 2020 23:46:08 GMT
+recorded_with: VCR 4.0.0
test/net/client_test.rb
@@ -56,6 +56,16 @@ class ClientTest < Minitest::Test
     end
   end
 
+  def test_follow_redirects_with_relative_paths
+    VCR.use_cassette('follow_redirects_with_relative_paths') do
+      subject.follow_redirects = 10
+      response = subject.get("http://go.microsoft.com/fwlink/?LinkId=329770")
+      refute_nil response
+      assert_kind_of Net::HTTPOK, response
+      assert response.body
+    end
+  end
+
   def test_get_with_redirects
     url = 'https://www.example.org/'
     n = 10
CHANGELOG.md
@@ -1,4 +1,4 @@
-Version 0.3.1
+Version 0.3.2
 
 # Changelog
 All notable changes to this project will be documented in this file.
@@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ## [Unreleased]
 - nil
 
+## [0.3.2] - 2020-01-28
+### Fixed
+- Follow relative path redirects
+
 ## [0.3.1] - 2020-01-14
 ### Fixed
 - Parse location header in response then follow redirect.
@@ -50,7 +54,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - with\_retry.https://www.mokhan.ca/%F0%9F%92%8E/2018/11/10/net-hippie-0-2-0.html
 - authorization header helpers
 
-[Unreleased]: https://github.com/mokhan/net-hippie/compare/v0.3.1...HEAD
+[Unreleased]: https://github.com/mokhan/net-hippie/compare/v0.3.2...HEAD
+[0.3.2]: https://github.com/mokhan/net-hippie/compare/v0.3.1...v0.3.2
 [0.3.1]: https://github.com/mokhan/net-hippie/compare/v0.3.0...v0.3.1
 [0.3.0]: https://github.com/mokhan/net-hippie/compare/v0.2.7...v0.3.0
 [0.2.7]: https://github.com/mokhan/net-hippie/compare/v0.2.6...v0.2.7